blob: 91e01afae734598631e3a6835d2f7b860cc7c7d4 [file] [log] [blame]
################################################################################################
# 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))