| ################################################################################################ |
| # 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') |
| |
| |
| #============================ |
| # ------ BJT EXCLUDE -------- |
| #============================ |
| |
| bjt_exclude = sab.join(esd).join(resistor) |
| .join(fusetop).join(polyfuse).join(cap_mk) |
| .join(diode_mk).join(nat).join(v5_xtor) |
| .join(fhres).join(fusewindow_d).join(piscap) |
| .join(mos_cap_mk).join(mim_l_mk).join(res_mk) |
| |
| # ======================================== |
| # ---- VNPN (isolated collector) (5V) ---- |
| # ======================================== |
| logger.info('Starting VNPN (5V) layers DERIVATIONS') |
| |
| ncomp_dn = ncomp.and(dnwell) |
| ncomp_dn_pw = ncomp_dn.and(lvpwell) |
| pcomp_dn_pw = pcomp.and(dnwell).and(lvpwell) |
| |
| # VNPN (5V) general nodes DERIVATIONS |
| vnpn_5v_e = ncomp_dn_pw.and(lvs_bjt).and(drc_bjt).and(dv2).not(dualgate).not(bjt_exclude) |
| vnpn_5v_b = pcomp_dn_pw.and(drc_bjt).and(dv2).not(dualgate).not(bjt_exclude) |
| vnpn_5v_c = ncomp_dn.not(lvs_bjt).and(drc_bjt).and(dv2).not(dualgate).not(bjt_exclude) |
| |
| # vnpn_0p54x16 nodes DERIVATIONS |
| npn_00p54x16p00_e = vnpn_5v_e.with_area(8.um, 9.um).interacting(vnpn_5v_e.edges.with_length(15.5.um, 16.5.um)) |
| npn_00p54x16p00_b = vnpn_5v_b.interacting(vnpn_5v_b.extents.interacting(npn_00p54x16p00_e)) |
| npn_00p54x16p00_c = vnpn_5v_c.interacting(vnpn_5v_c.extents.interacting(npn_00p54x16p00_e)) |
| |
| # vnpn_0p54x8 nodes DERIVATIONS |
| npn_00p54x08p00_e = vnpn_5v_e.with_area(4.um, 5.um).interacting(vnpn_5v_e.edges.with_length(7.5.um, 8.5.um)) |
| npn_00p54x08p00_b = vnpn_5v_b.interacting(vnpn_5v_b.extents.interacting(npn_00p54x08p00_e)) |
| npn_00p54x08p00_c = vnpn_5v_c.interacting(vnpn_5v_c.extents.interacting(npn_00p54x08p00_e)) |
| |
| # vnpn_0p54x2 nodes DERIVATIONS |
| npn_00p54x02p00_e = vnpn_5v_e.with_area(0.8.um, 1.5.um).interacting(vnpn_5v_e.edges.with_length(1.8.um, 2.2.um)) |
| npn_00p54x02p00_b = vnpn_5v_b.interacting(vnpn_5v_b.extents.interacting(npn_00p54x02p00_e)) |
| npn_00p54x02p00_c = vnpn_5v_c.interacting(vnpn_5v_c.extents.interacting(npn_00p54x02p00_e)) |
| |
| # vnpn_5x5 nodes DERIVATIONS |
| npn_05p00x05p00_e = vnpn_5v_e.with_area(24.5.um, 25.5.um).interacting(vnpn_5v_e.edges.with_length(4.8.um, 5.2.um)) |
| npn_05p00x05p00_b = vnpn_5v_b.interacting(vnpn_5v_b.extents.interacting(npn_05p00x05p00_e)) |
| npn_05p00x05p00_c = vnpn_5v_c.interacting(vnpn_5v_c.extents.interacting(npn_05p00x05p00_e)) |
| |
| # =========================================== |
| # ---- VNPN (isolated collector) (3.3V) ---- |
| # =========================================== |
| logger.info('Starting VNPN (3.3V) layers DERIVATIONS') |
| |
| # VNPN (3.3V) general nodes DERIVATIONS |
| vnpn_e = ncomp_dn_pw.and(lvs_bjt).and(drc_bjt).not(dv2).and(dualgate).not(bjt_exclude) |
| vnpn_b = pcomp_dn_pw.and(drc_bjt).not(dv2).and(dualgate).not(bjt_exclude) |
| vnpn_c = ncomp_dn.not(lvs_bjt).and(drc_bjt).not(dv2).and(dualgate).not(bjt_exclude) |
| |
| # vnpn_0p54x16_3p3 nodes DERIVATIONS |
| npn_00p54x16p00_e_3p3 = vnpn_e.with_area(8.um, 9.um).interacting(vnpn_e.edges.with_length(15.5.um, 16.5.um)) |
| npn_00p54x16p00_b_3p3 = vnpn_b.interacting(vnpn_b.extents.interacting(npn_00p54x16p00_e_3p3)) |
| npn_00p54x16p00_c_3p3 = vnpn_c.interacting(vnpn_c.extents.interacting(npn_00p54x16p00_e_3p3)) |
| |
| # vnpn_0p54x8_3p3 nodes DERIVATIONS |
| npn_00p54x08p00_e_3p3 = vnpn_e.with_area(4.um, 5.um).interacting(vnpn_e.edges.with_length(7.5.um, 8.5.um)) |
| npn_00p54x08p00_b_3p3 = vnpn_b.interacting(vnpn_b.extents.interacting(npn_00p54x08p00_e_3p3)) |
| npn_00p54x08p00_c_3p3 = vnpn_c.interacting(vnpn_c.extents.interacting(npn_00p54x08p00_e_3p3)) |
| |
| # vnpn_0p54x2_3p3 nodes DERIVATIONS |
| npn_00p54x02p00_e_3p3 = vnpn_e.with_area(0.8.um, 1.5.um).interacting(vnpn_e.edges.with_length(1.8.um, 2.2.um)) |
| npn_00p54x02p00_b_3p3 = vnpn_b.interacting(vnpn_b.extents.interacting(npn_00p54x02p00_e_3p3)) |
| npn_00p54x02p00_c_3p3 = vnpn_c.interacting(vnpn_c.extents.interacting(npn_00p54x02p00_e_3p3)) |
| |
| # vnpn_5x5_3p3 nodes DERIVATIONS |
| npn_05p00x05p00_e_3p3 = 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_3p3 = vnpn_b.interacting(vnpn_b.extents.interacting(npn_05p00x05p00_e_3p3)) |
| npn_05p00x05p00_c_3p3 = vnpn_c.interacting(vnpn_c.extents.interacting(npn_05p00x05p00_e_3p3)) |
| |
| # ======================================== |
| # ---- VPNP (Psub as collector) (6V) ---- |
| # ======================================== |
| logger.info('Starting VPNP (6V) layers DERIVATIONS') |
| |
| vpnp_e = pcomp.and(nwell).not(lvpwell).not(dnwell).and(lvs_bjt).and(drc_bjt).and(dv2).not(dualgate).not(bjt_exclude) |
| vpnp_b = ncomp.and(nwell).not(lvpwell).not(dnwell).and(drc_bjt).and(dv2).not(dualgate).not(bjt_exclude) |
| vpnp_c = ptap.not(lvs_bjt).not(lvpwell).and(drc_bjt).and(dv2).not(dualgate).not(bjt_exclude) |
| |
| # vpnp_6p0_10x10 nodes DERIVATIONS |
| pnp_10p00x10p00_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_b = vpnp_b.interacting(vpnp_b.extents.interacting(pnp_10p00x10p00_e)) |
| pnp_10p00x10p00_c = vpnp_c.interacting(vpnp_c.extents.interacting(pnp_10p00x10p00_e)) |
| |
| # vpnp_6p0_5x5 nodes DERIVATIONS |
| pnp_05p00x05p00_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_b = vpnp_b.interacting(vpnp_b.extents.interacting(pnp_05p00x05p00_e)) |
| pnp_05p00x05p00_c = vpnp_c.interacting(vpnp_c.extents.interacting(pnp_05p00x05p00_e)) |
| |
| # vpnp_6p0_0p42x20 nodes DERIVATIONS |
| pnp_00p42x20p00_e = vpnp_e.with_area(8.um, 9.um).interacting(vpnp_e.edges.with_length(19.8.um, 20.2.um)) |
| pnp_00p42x20p00_b = vpnp_b.interacting(vpnp_b.extents.interacting(pnp_00p42x20p00_e)) |
| pnp_00p42x20p00_c = vpnp_c.interacting(vpnp_c.extents.interacting(pnp_00p42x20p00_e)) |
| |
| # vpnp_6p0_0p42x10 nodes DERIVATIONS |
| pnp_00p42x10p00_e = vpnp_e.with_area(4.um, 4.5.um).interacting(vpnp_e.edges.with_length(9.8.um, 10.2.um)) |
| pnp_00p42x10p00_b = vpnp_b.interacting(vpnp_b.extents.interacting(pnp_00p42x10p00_e)) |
| pnp_00p42x10p00_c = vpnp_c.interacting(vpnp_c.extents.interacting(pnp_00p42x10p00_e)) |
| |
| # vpnp_6p0_0p42x5 nodes DERIVATIONS |
| pnp_00p42x05p00_e = vpnp_e.with_area(2.um, 2.2.um).interacting(vpnp_e.edges.with_length(4.8.um, 5.2.um)) |
| pnp_00p42x05p00_b = vpnp_b.interacting(vpnp_b.extents.interacting(pnp_00p42x05p00_e)) |
| pnp_00p42x05p00_c = vpnp_c.interacting(vpnp_c.extents.interacting(pnp_00p42x05p00_e)) |