| ################################################################################################ |
| # 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. |
| ################################################################################################ |
| |
| #================================ |
| # ------ BJT DERIVATIONS -------- |
| #================================ |
| |
| logger.info('Starting BJT DERIVATIONS') |
| |
| # ============== |
| # ---- vnpn ---- |
| # ============== |
| logger.info('Starting vnpn layers DERIVATIONS') |
| |
| bjt_exclude_layers = resistor.or(esd).or(sab).or(dni).or(pwhv).or(fusewindow_d).or(polyfuse) |
| .or(schottky_diode).or(zener).or(piscap).or(res_mk).or(diode_mk) |
| .or(v5_xtor).or(nat).or(fhres).or(mos_cap_mk).or(mvsd).or(mvpsd) |
| .or(elmd_mk).or(elmd2_mk).or(lvs_rf).or(lvs_source).or(mk_35v) |
| .or(lvs_35v).or(well_diode_mk).or(esd_hbm_mk).or(mos_mk_type1) |
| .or(swfet_mk).or(mom_mk).or(hvnddd).or(hvpddd).or(hvpolyrs).or(ldmos_xtor) |
| |
| # vnpn general nodes DERIVATIONS |
| vnpn_e = ncomp.interacting(lvs_bjt).and(dnwell).and(dualgate2_d).not(bjt_exclude_layers) |
| vnpn_b = pcomp.and(drc_bjt).and(lvpwell).and(dnwell).and(dualgate2_d).not(bjt_exclude_layers) |
| vnpn_c = ncomp.and(drc_bjt).not(lvs_bjt).and(dnwell).and(dualgate2_d).not(bjt_exclude_layers) |
| |
| # npn_05p00x05p00 nodes DERIVATIONS |
| npn_05p00x05p00_e = vnpn_e.with_area(24.5.um, 25.5.um).interacting(vnpn_e.edges.with_length(4.8.um, 5.2.um)) |
| npn_05p00x05p00_b = vnpn_b.interacting(vnpn_b.extents.interacting(npn_05p00x05p00_e)) |
| npn_05p00x05p00_c = vnpn_c.interacting(vnpn_c.extents.interacting(npn_05p00x05p00_e)) |
| |
| # npn_00p54x16p00 nodes DERIVATIONS |
| npn_00p54x16p00_e = vnpn_e.with_area(8.um, 9.um).interacting(vnpn_e.edges.with_length(15.5.um, 16.5.um)) |
| npn_00p54x16p00_b = vnpn_b.interacting(vnpn_b.extents.interacting(npn_00p54x16p00_e)) |
| npn_00p54x16p00_c = vnpn_c.interacting(vnpn_c.extents.interacting(npn_00p54x16p00_e)) |
| |
| # npn_00p54x08p00 nodes DERIVATIONS |
| npn_00p54x08p00_e = vnpn_e.with_area(4.um, 5.um).interacting(vnpn_e.edges.with_length(7.5.um, 8.5.um)) |
| npn_00p54x08p00_b = vnpn_b.interacting(vnpn_b.extents.interacting(npn_00p54x08p00_e)) |
| npn_00p54x08p00_c = vnpn_c.interacting(vnpn_c.extents.interacting(npn_00p54x08p00_e)) |
| |
| # npn_00p54x04p00 nodes DERIVATIONS |
| npn_00p54x04p00_e = vnpn_e.with_area(1.5.um, 2.5.um).interacting(vnpn_e.edges.with_length(3.8.um, 4.2.um)) |
| npn_00p54x04p00_b = vnpn_b.interacting(vnpn_b.extents.interacting(npn_00p54x04p00_e)) |
| npn_00p54x04p00_c = vnpn_c.interacting(vnpn_c.extents.interacting(npn_00p54x04p00_e)) |
| |
| # ============== |
| # ---- vpnp ---- |
| # ============== |
| logger.info('Starting vpnp layers DERIVATIONS') |
| |
| # vpnp general nodes DERIVATIONS |
| vpnp_e = pcomp.and(nwell).interacting(lvs_bjt).not(dnwell).and(dualgate2_d).not(bjt_exclude_layers) |
| vpnp_b = ncomp.and(nwell).and(drc_bjt).not(dnwell).and(dualgate2_d).not(bjt_exclude_layers) |
| vpnp_c = ptap.not(lvs_bjt).and(drc_bjt).not(dnwell).and(dualgate2_d).not(bjt_exclude_layers) |
| |
| # pnp_10p00x10p00_06v0 nodes DERIVATIONS |
| pnp_10p00x10p00_06v0_e = vpnp_e.with_area(99.5.um, 100.5.um).interacting(vpnp_e.edges.with_length(9.8.um, 10.2.um)) |
| pnp_10p00x10p00_06v0_b = vpnp_b.interacting(vpnp_b.extents.interacting(pnp_10p00x10p00_06v0_e)) |
| pnp_10p00x10p00_06v0_c = vpnp_c.interacting(vpnp_c.extents.interacting(pnp_10p00x10p00_06v0_e)) |
| |
| # pnp_05p00x05p00_06v0 nodes DERIVATIONS |
| pnp_05p00x05p00_06v0_e = vpnp_e.with_area(24.5.um, 25.5.um).interacting(vpnp_e.edges.with_length(4.8.um, 5.2.um)) |
| pnp_05p00x05p00_06v0_b = vpnp_b.interacting(vpnp_b.extents.interacting(pnp_05p00x05p00_06v0_e)) |
| pnp_05p00x05p00_06v0_c = vpnp_c.interacting(vpnp_c.extents.interacting(pnp_05p00x05p00_06v0_e)) |
| |
| # pnp_00p42x20p00_06v0 nodes DERIVATIONS |
| pnp_00p42x20p00_06v0_e = vpnp_e.with_area(8.um, 8.8.um).interacting(vpnp_e.edges.with_length(19.8.um, 20.2.um)) |
| pnp_00p42x20p00_06v0_b = vpnp_b.interacting(vpnp_b.extents.interacting(pnp_00p42x20p00_06v0_e)) |
| pnp_00p42x20p00_06v0_c = vpnp_c.interacting(vpnp_c.extents.interacting(pnp_00p42x20p00_06v0_e)) |
| |
| # pnp_00p42x10p00_06v0 nodes DERIVATIONS |
| pnp_00p42x10p00_06v0_e = vpnp_e.with_area(4.um, 4.5.um).interacting(vpnp_e.edges.with_length(9.8.um, 10.2.um)) |
| pnp_00p42x10p00_06v0_b = vpnp_b.interacting(vpnp_b.extents.interacting(pnp_00p42x10p00_06v0_e)) |
| pnp_00p42x10p00_06v0_c = vpnp_c.interacting(vpnp_c.extents.interacting(pnp_00p42x10p00_06v0_e)) |
| |
| # pnp_00p42x05p00_06v0 nodes DERIVATIONS |
| pnp_00p42x05p00_06v0_e = vpnp_e.with_area(2.um, 2.2.um).interacting(vpnp_e.edges.with_length(4.8.um, 5.2.um)) |
| pnp_00p42x05p00_06v0_b = vpnp_b.interacting(vpnp_b.extents.interacting(pnp_00p42x05p00_06v0_e)) |
| pnp_00p42x05p00_06v0_c = vpnp_c.interacting(vpnp_c.extents.interacting(pnp_00p42x05p00_06v0_e)) |