| ################################################################################################ |
| # Copyright 2023 GlobalFoundries PDK Authors |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # https://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| ################################################################################################ |
| |
| #================================ |
| # ---- RESISTOR EXTRACTIONS ----- |
| #================================ |
| |
| logger.info('Starting RESISTOR EXTRACTION') |
| |
| #==================== |
| # ---- Diff RES ---- |
| #==================== |
| |
| # nplus_u (3-terminal unsalicided n+ diffusion resistor (outside DNWELL)) |
| logger.info('Extracting nplus_u device') |
| extract_devices(resistor_with_bulk('nplus_u', 60, BResistor), { 'R' => nplus_u_layer, 'C' => nplus_cont, 'W' => sub }) |
| |
| # nplus_u_dw (3-terminal unsalicided n+ diffusion resistor (inside DNWELL)) |
| logger.info('Extracting nplus_u_dw device') |
| extract_devices(resistor_with_bulk('nplus_u_dw', 60, BResistor), |
| { 'R' => nplus_u_dw_layer, 'C' => nplus_cont, 'W' => lvpwell_con }) |
| |
| # pplus_u (3-terminal unsalicided P+ diffusion resistor (outside DNWELL)) |
| logger.info('Extracting pplus_u device') |
| extract_devices(resistor_with_bulk('pplus_u', 185, BResistor), |
| { 'R' => pplus_u_layer, 'C' => pplus_cont, 'W' => nwell_con }) |
| |
| # pplus_u_dw (3-terminal unsalicided P+ diffusion resistor (inside DNWELL)) |
| logger.info('Extracting pplus_u_dw device') |
| extract_devices(resistor_with_bulk('pplus_u_dw', 185, BResistor), |
| { 'R' => pplus_u_dw_layer, 'C' => pplus_dw_cont, 'W' => dnwell }) |
| |
| # nplus_s (3-terminal salicided N+ diffusion resistor (outside DNWELL)) |
| logger.info('Extracting nplus_s device') |
| extract_devices(resistor_with_bulk('nplus_s', 6.3, BResistor), { 'R' => nplus_s_layer, 'C' => nplus_cont, 'W' => sub }) |
| |
| # nplus_s_dw (3-terminal salicided N+ diffusion resistor (inside DNWELL)) |
| logger.info('Extracting nplus_s_dw device') |
| extract_devices(resistor_with_bulk('nplus_s_dw', 6.3, BResistor), |
| { 'R' => nplus_s_dw_layer, 'C' => nplus_cont, 'W' => lvpwell_con }) |
| |
| # pplus_s (3-terminal salicided P+ diffusion resistor (outside DNWELL)) |
| logger.info('Extracting pplus_s device') |
| extract_devices(resistor_with_bulk('pplus_s', 7, BResistor), |
| { 'R' => pplus_s_layer, 'C' => pplus_cont, 'W' => nwell_con }) |
| |
| # pplus_s_dw (3-terminal salicided P+ diffusion resistor (inside DNWELL)) |
| logger.info('Extracting pplus_s_dw device') |
| extract_devices(resistor_with_bulk('pplus_s_dw', 7, BResistor), |
| { 'R' => pplus_s_dw_layer, 'C' => pplus_dw_cont, 'W' => dnwell }) |
| |
| #==================== |
| # ---- PWELL RES ---- |
| #==================== |
| |
| # pwell (3-terminal low voltage pwell resistor for 1.8V/6V process (inside DNWELL only)) |
| logger.info('Extracting PWELL device') |
| extract_devices(resistor_with_bulk('pwell', 1000, BResistor), |
| { 'R' => pwell_res, 'C' => lvpwell_con, 'W' => dnwell }) |
| |
| |
| |
| #==================== |
| # ---- POLY RES ---- |
| #==================== |
| |
| # npolyf_u (3-terminal unsalicided n+ poly resistor (outside DNWELL)) |
| logger.info('Extracting npolyf_u device') |
| extract_devices(resistor_with_bulk('npolyf_u', 310, BResistor), |
| { 'R' => npolyf_u_layer, 'C' => poly2_con, 'W' => sub }) |
| |
| # npolyf_u_dw (3-terminal unsalicided n+ poly resistor (inside DNWELL)) |
| logger.info('Extracting npolyf_u_dw device') |
| extract_devices(resistor_with_bulk('npolyf_u_dw', 310, BResistor), |
| { 'R' => npolyf_u_dw_layer, 'C' => poly2_con, 'W' => dnwell }) |
| |
| # ppolyf_u (3-terminal unsalicided p+ poly resistor (outside DNWELL)) |
| logger.info('Extracting ppolyf_u device') |
| extract_devices(resistor_with_bulk('ppolyf_u', 350, BResistor), |
| { 'R' => ppolyf_u_layer, 'C' => poly2_con, 'W' => sub }) |
| |
| # ppolyf_u_dw (3-terminal unsalicided p+ poly resistor (inside DNWELL)) |
| logger.info('Extracting ppolyf_u_dw device') |
| extract_devices(resistor_with_bulk('ppolyf_u_dw', 350, BResistor), |
| { 'R' => ppolyf_u_dw_layer, 'C' => poly2_con, 'W' => dnwell }) |
| |
| # npolyf_s (3-terminal salicided n+ poly resistor (outside DNWELL)) |
| logger.info('Extracting npolyf_s device') |
| extract_devices(resistor_with_bulk('npolyf_s', 6.8, BResistor), |
| { 'R' => npolyf_s_layer, 'C' => poly2_con, 'W' => sub }) |
| |
| # npolyf_s_dw (3-terminal salicided n+ poly resistor (inside DNWELL)) |
| logger.info('Extracting npolyf_s_dw device') |
| extract_devices(resistor_with_bulk('npolyf_s_dw', 6.8, BResistor), |
| { 'R' => npolyf_s_dw_layer, 'C' => poly2_con, 'W' => dnwell }) |
| |
| # ppolyf_s (3-terminal salicided p+ poly resistor (outside DNWELL)) |
| logger.info('Extracting ppolyf_s device') |
| extract_devices(resistor_with_bulk('ppolyf_s', 7.3, BResistor), |
| { 'R' => ppolyf_s_layer, 'C' => poly2_con, 'W' => sub }) |
| |
| # ppolyf_s_dw (3-terminal salicided p+ poly resistor (inside DNWELL)) |
| logger.info('Extracting ppolyf_s_dw device') |
| extract_devices(resistor_with_bulk('ppolyf_s_dw', 7.3, BResistor), |
| { 'R' => ppolyf_s_dw_layer, 'C' => poly2_con, 'W' => dnwell }) |
| |
| |
| #======================== |
| # ---- POLY High RES ---- |
| #======================== |
| |
| case POLY_RES |
| when '1k' |
| |
| # ppolyf_u_1k (3-terminal 1k high-Rs p+ poly resistor on field oxide (outside DNWELL)) |
| logger.info('Extracting ppolyf_u_1k device') |
| extract_devices(resistor_with_bulk('ppolyf_u_1k', 1000, BResistor), |
| { 'R' => ppolyf_u_1k_layer, 'C' => poly2_con, 'W' => sub }) |
| |
| # ppolyf_u_1k_dw (3-terminal 1k high-Rs p+ poly resistor on field oxide (inside DNWELL)) |
| logger.info('Extracting ppolyf_u_1k_dw device') |
| extract_devices(resistor_with_bulk('ppolyf_u_1k_dw', 1000, BResistor), |
| { 'R' => ppolyf_u_1k_dw_layer, 'C' => poly2_con, 'W' => dnwell }) |
| |
| |
| when '2k' |
| |
| # ppolyf_u_2k (3-terminal 2k high-Rs p+ poly resistor on field oxide (outside DNWELL)) |
| logger.info('Extracting ppolyf_u_2k device') |
| extract_devices(resistor_with_bulk('ppolyf_u_2k', 2000, BResistor), |
| { 'R' => ppolyf_u_2k_layer, 'C' => poly2_con, 'W' => sub }) |
| |
| # ppolyf_u_2k_dw (3-terminal 2k high-Rs p+ poly resistor on field oxide (inside DNWELL)) |
| logger.info('Extracting ppolyf_u_2k_dw device') |
| extract_devices(resistor_with_bulk('ppolyf_u_2k_dw', 2000, BResistor), |
| { 'R' => ppolyf_u_2k_dw_layer, 'C' => poly2_con, 'W' => dnwell }) |
| |
| end |
| #============================= |
| # ---- POLY Free High RES ---- |
| #============================= |
| |
| # ppolyf_u_fhr_16p0_lv (3-terminal free high-Rs p+ poly res. On field oxide (LV/MV area outside DNWELL)) |
| logger.info('Extracting ppolyf_u_fhr_16p0_lv device') |
| extract_devices(resistor_with_bulk('ppolyf_u_fhr_16p0_lv', 6000, BResistor), |
| { 'R' => ppolyf_u_fhr_16p0_lv_layer, 'C' => poly2_con, 'W' => sub }) |
| |
| # ppolyf_u_fhr_16p0_lv_dw (3-terminal free high-Rs p+ poly res. On field oxide (LV/MV area inside DNWELL)) |
| logger.info('Extracting ppolyf_u_fhr_16p0_lv_dw device') |
| extract_devices(resistor_with_bulk('ppolyf_u_fhr_16p0_lv_dw', 6000, BResistor), |
| { 'R' => ppolyf_u_fhr_16p0_lv_dw_layer, 'C' => poly2_con, 'W' => dnwell }) |