################################################################################################
# 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_00p46x1p2 nodes DERIVATIONS
pnp_00p46x1p2_e = vpnp_e.with_area(0.5.um, 0.6.um).interacting(vpnp_e.edges.with_length(1.um, 1.4.um))
pnp_00p46x1p2_b = vpnp_b.interacting(vpnp_b.extents.interacting(pnp_00p46x1p2_e))
pnp_00p46x1p2_c = vpnp_c.interacting(vpnp_c.extents.interacting(pnp_00p46x1p2_e))

# pnp_1p2x2p5 nodes DERIVATIONS
pnp_1p2x2p5_e = vpnp_e.with_area(2.5.um, 3.5.um).interacting(vpnp_e.edges.with_length(2.3.um, 2.7.um))
pnp_1p2x2p5_b = vpnp_b.interacting(vpnp_b.extents.interacting(pnp_1p2x2p5_e))
pnp_1p2x2p5_c = vpnp_c.interacting(vpnp_c.extents.interacting(pnp_1p2x2p5_e))

# pnp_05p00x00p42 nodes DERIVATIONS
pnp_05p00x00p42_e = vpnp_e.with_area(2.um, 2.2.um).interacting(vpnp_e.edges.with_length(4.8.um, 5.2.um))
pnp_05p00x00p42_b = vpnp_b.interacting(vpnp_b.extents.interacting(pnp_05p00x00p42_e))
pnp_05p00x00p42_c = vpnp_c.interacting(vpnp_c.extents.interacting(pnp_05p00x00p42_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))

