| |
| ################################################################################################ |
| # 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 DERIVATIONS ----- |
| #================================ |
| |
| logger.info('Starting RESISTOR DERIVATIONS') |
| |
| #==================== |
| # ---- Diff RES ---- |
| #==================== |
| |
| # general diffusion contacts derivations |
| nplus_cont = ncomp.outside(nwell).not_interacting(ngate).interacting(res_mk).not(res_mk).not_interacting(diode_mk) |
| .not(esd).not(resistor).not(polyfuse).not_interacting(cap_mk).not(fusewindow_d) |
| .not(polyfuse).not(drc_bjt).not(lvs_bjt).outside(fhres).not(fusetop).not(pplus) |
| .not(piscap).not_interacting(mos_cap_mk).not_interacting(mim_l_mk).not(nat).not(v5_xtor) |
| |
| pplus_cont = pcomp.inside(nwell).not_interacting(pgate).interacting(res_mk).not(res_mk).not_interacting(diode_mk) |
| .not(esd).not(resistor).not(polyfuse).not_interacting(cap_mk).not(fusewindow_d) |
| .not(polyfuse).not(drc_bjt).not(lvs_bjt).outside(fhres).not(fusetop) |
| .not(piscap).not_interacting(mos_cap_mk).not_interacting(mim_l_mk).not(nat).not(v5_xtor) |
| |
| pplus_dw_cont = pcomp.not(lvpwell).and(dnwell).not_interacting(pgate).interacting(res_mk).not(res_mk) |
| .not(esd).not(resistor).not(polyfuse).not_interacting(cap_mk).not(fusewindow_d) |
| .not(polyfuse).not(drc_bjt).not(lvs_bjt).outside(fhres).not(fusetop).not_interacting(diode_mk) |
| .not(piscap).not_interacting(mos_cap_mk).not_interacting(mim_l_mk).not(nat).not(v5_xtor) |
| |
| |
| # nplus_u (3-terminal unsalicided n+ diffusion resistor (outside DNWELL)) |
| nplus_u_layer = ncomp.and(lvpwell).and(sab).and(res_mk).not(dnwell).not(nat).interacting(nplus_cont) |
| |
| # nplus_u_dw (3-terminal unsalicided n+ diffusion resistor (inside DNWELL)) |
| nplus_u_dw_layer = ncomp.and(lvpwell).and(sab).and(res_mk).and(dnwell).not(nat).interacting(nplus_cont) |
| |
| # pplus_u (3-terminal unsalicided P+ diffusion resistor (outside DNWELL)) |
| pplus_u_layer = pcomp.and(nwell).and(sab).and(res_mk).not(dnwell).outside(lvpwell).not(nat).interacting(pplus_cont) |
| |
| # pplus_u_dw (3-terminal unsalicided P+ diffusion resistor (inside DNWELL)) |
| pplus_u_dw_layer = pcomp.and(sab).and(res_mk).and(dnwell).interacting(pplus_dw_cont) |
| |
| # nplus_s (3-terminal salicided N+ diffusion resistor (outside DNWELL)) |
| nplus_s_layer = ncomp.and(lvpwell).and(res_mk).not_interacting(sab).not(dnwell).interacting(nplus_cont) |
| |
| # nplus_s_dw (3-terminal salicided N+ diffusion resistor (inside DNWELL)) |
| nplus_s_dw_layer = ncomp.and(lvpwell).and(res_mk).and(dnwell).not_interacting(sab).interacting(nplus_cont) |
| |
| # pplus_s (3-terminal salicided P+ diffusion resistor (outside DNWELL)) |
| pplus_s_layer = pcomp.and(nwell).and(res_mk).not_interacting(sab).not(dnwell).interacting(nplus_cont) |
| |
| # pplus_s_dw (3-terminal salicided P+ diffusion resistor (inside DNWELL)) |
| pplus_s_dw_layer = pcomp.not_interacting(sab).and(res_mk).and(dnwell).not_interacting(sab) |
| |
| |
| #==================== |
| # ---- PWELL RES ---- |
| #==================== |
| |
| # pwell (3-terminal low voltage pwell resistor for 1.8V/6V process (inside DNWELL only)) |
| pwell_res = lvpwell.and(res_mk).and(dnwell).not_covering(comp).not(poly2).outside(lvs_rf) |
| .not(esd).not_interacting(resistor).not(polyfuse).not_interacting(cap_mk).not(fusewindow_d) |
| .not(polyfuse).not(drc_bjt).not(lvs_bjt).outside(fhres).not(fusetop).not_interacting(diode_mk) |
| .not(piscap).not_interacting(mos_cap_mk).not_interacting(mim_l_mk).not(nat).not(v5_xtor) |
| |
| |
| #==================== |
| # ---- POLY RES ---- |
| #==================== |
| |
| # npolyf_u (3-terminal unsalicided n+ poly resistor (outside DNWELL)) |
| npolyf_u_layer = nplus.and(poly2).and(sab).and(res_mk).not(dnwell).outside(comp) |
| .not(esd).not_interacting(resistor).not(polyfuse).not_interacting(cap_mk).not(fusewindow_d) |
| .not(polyfuse).not(drc_bjt).not(lvs_bjt).outside(fhres).not(fusetop).not_interacting(diode_mk) |
| .not(piscap).not_interacting(mos_cap_mk).not_interacting(mim_l_mk).not(nat).not(v5_xtor) |
| |
| # npolyf_u_dw (3-terminal unsalicided n+ poly resistor (inside DNWELL)) |
| npolyf_u_dw_layer = nplus.and(poly2).and(sab).and(res_mk).and(dnwell).outside(comp) |
| .not(esd).not_interacting(resistor).not(polyfuse).not_interacting(cap_mk).not(fusewindow_d) |
| .not(polyfuse).not(drc_bjt).not(lvs_bjt).outside(fhres).not(fusetop).not_interacting(diode_mk) |
| .not(piscap).not_interacting(mos_cap_mk).not_interacting(mim_l_mk).not(nat).not(v5_xtor) |
| |
| # ppolyf_u (3-terminal unsalicided p+ poly resistor (outside DNWELL)) |
| ppolyf_u_layer = pplus.and(poly2).and(sab).and(res_mk).not(dnwell).outside(comp) |
| .not(esd).not_interacting(resistor).not(polyfuse).not_interacting(cap_mk).not(fusewindow_d) |
| .not(polyfuse).not(drc_bjt).not(lvs_bjt).outside(fhres).not(fusetop).not_interacting(diode_mk) |
| .not(piscap).not_interacting(mos_cap_mk).not_interacting(mim_l_mk).not(nat).not(v5_xtor) |
| |
| # ppolyf_u_dw (3-terminal unsalicided p+ poly resistor (inside DNWELL)) |
| ppolyf_u_dw_layer = pplus.and(poly2).and(sab).and(res_mk).and(dnwell).outside(comp) |
| .not(esd).not_interacting(resistor).not(polyfuse).not_interacting(cap_mk).not(fusewindow_d) |
| .not(polyfuse).not(drc_bjt).not(lvs_bjt).outside(fhres).not(fusetop).not_interacting(diode_mk) |
| .not(piscap).not_interacting(mos_cap_mk).not_interacting(mim_l_mk).not(nat).not(v5_xtor) |
| |
| # npolyf_s (3-terminal salicided n+ poly resistor (outside DNWELL)) |
| npolyf_s_layer = nplus.and(poly2).not_interacting(sab).and(res_mk).not(dnwell).outside(comp) |
| .not(esd).not_interacting(resistor).not(polyfuse).not_interacting(cap_mk).not(fusewindow_d) |
| .not(polyfuse).not(drc_bjt).not(lvs_bjt).outside(fhres).not(fusetop).not_interacting(diode_mk) |
| .not(piscap).not_interacting(mos_cap_mk).not_interacting(mim_l_mk).not(nat).not(v5_xtor) |
| |
| # npolyf_s_dw (3-terminal salicided n+ poly resistor (inside DNWELL)) |
| npolyf_s_dw_layer = nplus.and(poly2).not_interacting(sab).and(res_mk).and(dnwell).outside(comp) |
| .not(esd).not_interacting(resistor).not(polyfuse).not_interacting(cap_mk).not(fusewindow_d) |
| .not(polyfuse).not(drc_bjt).not(lvs_bjt).outside(fhres).not(fusetop).not_interacting(diode_mk) |
| .not(piscap).not_interacting(mos_cap_mk).not_interacting(mim_l_mk).not(nat).not(v5_xtor) |
| |
| # ppolyf_s (3-terminal salicided p+ poly resistor (outside DNWELL)) |
| ppolyf_s_layer = pplus.and(poly2).not_interacting(sab).and(res_mk).not(dnwell).outside(comp) |
| .not(esd).not_interacting(resistor).not(polyfuse).not_interacting(cap_mk).not(fusewindow_d) |
| .not(polyfuse).not(drc_bjt).not(lvs_bjt).outside(fhres).not(fusetop).not_interacting(diode_mk) |
| .not(piscap).not_interacting(mos_cap_mk).not_interacting(mim_l_mk).not(nat).not(v5_xtor) |
| |
| # ppolyf_s_dw (3-terminal salicided p+ poly resistor (inside DNWELL)) |
| ppolyf_s_dw_layer = pplus.and(poly2).not_interacting(sab).and(res_mk).and(dnwell).outside(comp) |
| .not(esd).not_interacting(resistor).not(polyfuse).not_interacting(cap_mk).not(fusewindow_d) |
| .not(polyfuse).not(drc_bjt).not(lvs_bjt).outside(fhres).not(fusetop).not_interacting(diode_mk) |
| .not(piscap).not_interacting(mos_cap_mk).not_interacting(mim_l_mk).not(nat).not(v5_xtor) |
| |
| |
| #======================== |
| # ---- POLY High RES ---- |
| #======================== |
| |
| # general derivations for High RES POLY |
| poly_hr_layer = pplus.and(poly2).and(sab).and(res_mk).not(dnwell).outside(comp) |
| .not(esd).and(resistor).not(polyfuse).not_interacting(cap_mk).not(fusewindow_d) |
| .not(polyfuse).not(drc_bjt).not(lvs_bjt).outside(fhres).not(fusetop).not_interacting(diode_mk) |
| .not(piscap).not_interacting(mos_cap_mk).not_interacting(mim_l_mk).not(nat).not(v5_xtor) |
| |
| poly_hr_dw_layer = pplus.and(poly2).and(sab).and(res_mk).and(dnwell).outside(comp) |
| .not(esd).and(resistor).not(polyfuse).not_interacting(cap_mk).not(fusewindow_d) |
| .not(polyfuse).not(drc_bjt).not(lvs_bjt).outside(fhres).not(fusetop).not_interacting(diode_mk) |
| .not(piscap).not_interacting(mos_cap_mk).not_interacting(mim_l_mk).not(nat).not(v5_xtor) |
| |
| case POLY_RES |
| when '1k' |
| |
| # ppolyf_u_1k (3-terminal 1k high-Rs p+ poly resistor on field oxide (outside DNWELL)) |
| ppolyf_u_1k_layer = poly_hr_layer |
| |
| # ppolyf_u_1k_dw (3-terminal 1k high-Rs p+ poly resistor on field oxide (inside DNWELL)) |
| ppolyf_u_1k_dw_layer = poly_hr_dw_layer |
| |
| when '2k' |
| |
| # ppolyf_u_2k (3-terminal 2k high-Rs p+ poly resistor on field oxide (outside DNWELL)) |
| ppolyf_u_2k_layer = poly_hr_layer |
| |
| # ppolyf_u_2k_dw (3-terminal 2k high-Rs p+ poly resistor on field oxide (inside DNWELL)) |
| ppolyf_u_2k_dw_layer = poly_hr_dw_layer |
| |
| 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)) |
| ppolyf_u_fhr_16p0_lv_layer = pplus.and(poly2).and(sab).and(res_mk).not(dnwell).and(fhres).not_interacting(diode_mk) |
| .not(esd).not(resistor).not(polyfuse).not_interacting(cap_mk).not(fusewindow_d) |
| .not(polyfuse).not(drc_bjt).not(lvs_bjt).outside(comp).not(fusetop) |
| .not(piscap).not_interacting(mos_cap_mk).not_interacting(mim_l_mk).not(nat).not(v5_xtor) |
| |
| # ppolyf_u_fhr_16p0_lv_dw (3-terminal free high-Rs p+ poly res. On field oxide (LV/MV area inside DNWELL)) |
| ppolyf_u_fhr_16p0_lv_dw_layer = pplus.and(poly2).and(sab).and(res_mk).and(dnwell).and(fhres).not_interacting(diode_mk) |
| .not(esd).not(resistor).not(polyfuse).not_interacting(cap_mk).not(fusewindow_d) |
| .not(polyfuse).not(drc_bjt).not(lvs_bjt).outside(comp).not(fusetop) |
| .not(piscap).not_interacting(mos_cap_mk).not_interacting(mim_l_mk).not(nat).not(v5_xtor) |
| |
| |
| |