| ################################################################################################ |
| # 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') |
| |
| # vnpn general nodes DERIVATIONS |
| nwell_dnwell = nwell.and(dnwell) |
| vnpn_e = ncomp.and(nwell_dnwell).and(lvs_bjt).not(dualgate) |
| .not(res_mk).not(nat).not(sab).not(poly2).not(res_mk_type1).not(resistor) |
| |
| vnpn_b = pcomp.and(nwell_dnwell).and(lvs_bjt).not(dualgate) |
| .not(res_mk).not(nat).not(sab).not(poly2).not(res_mk_type1).not(resistor) |
| |
| vnpn_c = ncomp.and(dnwell).not(nwell).and(lvs_bjt).not(dualgate) |
| .not(res_mk).not(nat).not(sab).not(poly2).not(res_mk_type1).not(resistor) |
| |
| |
| # 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_02p00x02p00 nodes DERIVATIONS |
| npn_02p00x02p00_e = vnpn_e.with_area(3.5.um, 4.5.um).interacting(vnpn_e.edges.with_length(1.8.um, 2.2.um)) |
| npn_02p00x02p00_b = vnpn_b.interacting(vnpn_b.extents.interacting(npn_02p00x02p00_e)) |
| npn_02p00x02p00_c = vnpn_c.interacting(vnpn_c.extents.interacting(npn_02p00x02p00_e)) |
| |
| #=============== |
| # ---- vpnp ---- |
| # ============== |
| logger.info('Starting vpnp layers DERIVATIONS') |
| |
| # vpnp general nodes DERIVATIONS |
| vpnp_e = pcomp.inside(nwell).outside(dnwell).interacting(lvs_bjt).not(dualgate) |
| .not(res_mk).not(nat).not(sab).not(poly2).not(res_mk_type1).not(resistor) |
| |
| vpnp_b = ncomp.and(nwell).outside(dnwell).inside(lvs_bjt).not(dualgate) |
| .not(res_mk).not(nat).not(sab).not(poly2).not(res_mk_type1).not(resistor) |
| |
| vpnp_c = ptap.inside(lvs_bjt).not(dualgate) |
| .not(nat).not(sab).not(poly2).not(res_mk_type1).not(resistor) |
| |
| |
| # pnp_00p46x00p46 nodes DERIVATIONS |
| pnp_00p46x00p46_e = vpnp_e.with_area(0.18.um, 0.26.um).interacting(vpnp_e.edges.with_length(0.4.um, 0.5.um)) |
| pnp_00p46x00p46_b = vpnp_b.interacting(vpnp_b.extents.interacting(pnp_00p46x00p46_e)) |
| pnp_00p46x00p46_c = vpnp_c.interacting(vpnp_c.extents.interacting(pnp_00p46x00p46_e)) |
| |
| # pnp_00p46x01p20 nodes DERIVATIONS |
| pnp_00p46x01p20_e = vpnp_e.with_area(0.5.um, 0.6.um).interacting(vpnp_e.edges.with_length(1.um, 1.4.um)) |
| pnp_00p46x01p20_b = vpnp_b.interacting(vpnp_b.extents.interacting(pnp_00p46x01p20_e)) |
| pnp_00p46x01p20_c = vpnp_c.interacting(vpnp_c.extents.interacting(pnp_00p46x01p20_e)) |
| |
| # pnp_01p20x02p50 nodes DERIVATIONS |
| pnp_01p20x02p50_e = vpnp_e.with_area(2.5.um, 3.5.um).interacting(vpnp_e.edges.with_length(2.3.um, 2.7.um)) |
| pnp_01p20x02p50_b = vpnp_b.interacting(vpnp_b.extents.interacting(pnp_01p20x02p50_e)) |
| pnp_01p20x02p50_c = vpnp_c.interacting(vpnp_c.extents.interacting(pnp_01p20x02p50_e)) |
| |
| # pnp_10p00x10p00 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)) |
| |
| # pnp_05p00x05p00 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)) |
| |