################################################################################################
# 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))