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

#==================================
# ------ PISCAP DERIVATIONS -------
#==================================

logger.info('Starting PISCAP DERIVATIONS')

piscap_exclude_layers = mos_cap_mk.or(sab).or(esd).or(polyfuse).or(cap_mk).or(diode_mk).or(nat)
                            .or(v5_xtor).or(drc_bjt).or(lvs_bjt).or(fhres)
                            .or(fusewindow_d).or(lvs_rf).or(fusetop).or(resistor)

# pis_1p8 (1.8V PIS capacitor (outside DNWELL))
pis_1p8_gate = ngate.and(piscap).interacting(mim_l_mk).inside(nwell).not(dnwell)
                        .not(dualgate).not(dv2).not(piscap_exclude_layers)

# pis_1p8_dw (1.8V PIS capacitor (inside DNWEL)
pis_1p8_dw_gate = ngate.and(piscap).interacting(mim_l_mk).inside(nwell).inside(dnwell)
                        .not(dualgate).not(dv2).not(piscap_exclude_layers)

# pis_6p0 (6V PIS capacitor (outside DNWELL))
pis_6p0_gate = ngate.and(piscap).interacting(mim_l_mk).inside(nwell).not(dnwell)
                        .and(dv2).not(piscap_exclude_layers)

# pis_6p0_dw (6V PIS capacitor (inside DNWEL)
pis_6p0_dw_gate = ngate.and(piscap).interacting(mim_l_mk).inside(nwell).inside(dnwell)
                            .and(dv2).not(piscap_exclude_layers)