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