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

#==================================
# ------ MOSCAP DERIVATIONS -------
#==================================

logger.info('Starting MOSCAP DERIVATIONS')

# nmoscap_1p8 capacitor
nmos_gate_1p8 = ngate.not(dualgate).outside(dnwell).interacting(mos_cap_mk).not(nwell).not(sab).not(esd)
                    .not(polyfuse).not_interacting(cap_mk).not_interacting(diode_mk).not(nat)
                    .not(v5_xtor).not(drc_bjt).not(lvs_bjt).not(fhres).not(fusewindow_d)
                    .not(piscap).not_interacting(mim_l_mk).not(fusetop).not(dv2).not(resistor)

# nmoscap_1p8_dw capacitor
nmos_gate_1p8_dw = ngate.not(dualgate).inside(dnwell).interacting(mos_cap_mk).not(nwell).not(sab).not(esd)
                    .not(polyfuse).not_interacting(cap_mk).not_interacting(diode_mk).not(nat)
                    .not(v5_xtor).not(drc_bjt).not(lvs_bjt).not(fhres).not(fusewindow_d)
                    .not(piscap).not_interacting(mim_l_mk).not(fusetop).not(dv2).not(resistor)

# pmoscap_1p8 capacitor
pmos_gate_1p8 = pgate.not(dualgate).outside(dnwell).interacting(mos_cap_mk).and(nwell).not(sab).not(esd)
                    .not(polyfuse).not_interacting(cap_mk).not_interacting(diode_mk).not(nat)
                    .not(v5_xtor).not(drc_bjt).not(lvs_bjt).not(fhres).not(fusewindow_d)
                    .not(piscap).not_interacting(mim_l_mk).not(fusetop).not(dv2).not(resistor)

# pmoscap_1p8_dw capacitor
pmos_gate_1p8_dw = pgate.not(dualgate).inside(dnwell).interacting(mos_cap_mk).not(sab).not(esd)
                    .not(polyfuse).not_interacting(cap_mk).not_interacting(diode_mk).not(nat)
                    .not(v5_xtor).not(drc_bjt).not(lvs_bjt).not(fhres).not(fusewindow_d)
                    .not(piscap).not_interacting(mim_l_mk).not(fusetop).not(dv2).not(resistor)

# nmoscap_6p0 capacitor
nmoscap_6p0_g = ngate.not(dualgate).outside(dnwell).interacting(mos_cap_mk).not(nwell).and(dv2).not(esd)
                    .not(polyfuse).not_interacting(cap_mk).not_interacting(diode_mk).not(nat)
                    .not(v5_xtor).not(drc_bjt).not(lvs_bjt).not(fhres).not(fusewindow_d)
                    .not(piscap).not_interacting(mim_l_mk).not(fusetop).not(sab).not(resistor)

# nmoscap_6p0_dw capacitor
nmoscap_6p0_dw_g = ngate.not(dualgate).inside(dnwell).interacting(mos_cap_mk).not(nwell).and(dv2).not(esd)
                    .not(polyfuse).not_interacting(cap_mk).not_interacting(diode_mk).not(nat)
                    .not(v5_xtor).not(drc_bjt).not(lvs_bjt).not(fhres).not(fusewindow_d)
                    .not(piscap).not_interacting(mim_l_mk).not(fusetop).not(sab).not(resistor)

# pmoscap_6p0 capacitor
pmoscap_6p0_g = pgate.not(dualgate).outside(dnwell).interacting(mos_cap_mk).and(nwell).and(dv2).not(esd)
                    .not(polyfuse).not_interacting(cap_mk).not_interacting(diode_mk).not(nat)
                    .not(v5_xtor).not(drc_bjt).not(lvs_bjt).not(fhres).not(fusewindow_d)
                    .not(piscap).not_interacting(mim_l_mk).not(fusetop).not(sab).not(resistor)

# pmoscap_6p0_dw capacitor
pmoscap_6p0_dw_g = pgate.not(dualgate).inside(dnwell).interacting(mos_cap_mk).and(dv2).not(esd)
                    .not(polyfuse).not_interacting(cap_mk).not_interacting(diode_mk).not(nat)
                    .not(v5_xtor).not(drc_bjt).not(lvs_bjt).not(fhres).not(fusewindow_d)
                    .not(piscap).not_interacting(mim_l_mk).not(fusetop).not(sab).not(resistor)

# nmoscap_1p8_nwell capacitor
nmoscap_1p8_nwell_g = ngate.not(dualgate).outside(dnwell).interacting(mos_cap_mk).and(nwell).not(sab)
                        .not(polyfuse).not_interacting(cap_mk).not_interacting(diode_mk).not(nat)
                        .not(v5_xtor).not(drc_bjt).not(lvs_bjt).not(fhres).not(fusewindow_d).not(esd)
                        .not(piscap).not_interacting(mim_l_mk).not(fusetop).not(dv2).not(resistor)

# nmoscap_1p8_dnwell capacitor
nmoscap_1p8_dnwell_g = ngate.not(dualgate).inside(dnwell).interacting(mos_cap_mk).and(nwell).not(sab)
                        .not(polyfuse).not_interacting(cap_mk).not_interacting(diode_mk).not(nat)
                        .not(v5_xtor).not(drc_bjt).not(lvs_bjt).not(fhres).not(fusewindow_d).not(esd)
                        .not(piscap).not_interacting(mim_l_mk).not(fusetop).not(dv2).not(resistor)

# nmoscap_6p0_nwell capacitor
nmoscap_6p0_nwell_g = ngate.not(dualgate).outside(dnwell).interacting(mos_cap_mk).and(nwell).and(dv2)
                        .not(polyfuse).not_interacting(cap_mk).not_interacting(diode_mk).not(nat)
                        .not(v5_xtor).not(drc_bjt).not(lvs_bjt).not(fhres).not(fusewindow_d).not(esd)
                        .not(piscap).not_interacting(mim_l_mk).not(fusetop).not(sab).not(resistor)

# nmoscap_6p0_dnwell capacitor
nmoscap_6p0_dnwell_g = ngate.not(dualgate).inside(dnwell).interacting(mos_cap_mk).and(nwell).and(dv2)
                        .not(polyfuse).not_interacting(cap_mk).not_interacting(diode_mk).not(nat)
                        .not(v5_xtor).not(drc_bjt).not(lvs_bjt).not(fhres).not(fusewindow_d).not(esd)
                        .not(piscap).not_interacting(mim_l_mk).not(fusetop).not(sab).not(resistor)
