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

#================================
# ---- Varactor DERIVATIONS ----
#================================

logger.info('Starting VARACTOR DERIVATIONS')

var_exclude = v5_xtor.join(fusetop).join(polyfuse)
                     .join(dualgate).join(lvs_bjt).join(drc_bjt)
                     .join(sab).join(esd).join(resistor)
                     .join(res_mk).join(cap_mk).join(nat)
                     .join(fhres).join(fusewindow_d).join(diode_mk)
                     .join(piscap).join(mos_cap_mk).join(mim_l_mk)

var_pcomp = pcomp.and(nwell).and(lvs_rf).not(var_exclude)            
var_ngate = nplus.and(tgate).and(nwell).and(lvs_rf).not(var_exclude)

# pn_varactor_1p8
pn_varactor_1p8_tp = var_pcomp.not(dnwell).not(dv2)

# pn_varactor_1p8_dw
pn_varactor_1p8_dw_tp = var_pcomp.and(dnwell).not(dv2)

# pn_varactor_6p0
pn_varactor_6p0_tp = var_pcomp.not(dnwell).and(dv2)

# pn_varactor_6p0_dw
pn_varactor_6p0_dw_tp = var_pcomp.and(dnwell).and(dv2)
        
# mos_varactor_1p8
mos_varactor_1p8_g = var_ngate.not(dnwell).not(dv2)

# mos_varactor_1p8_dw
mos_varactor_1p8_dw_g = var_ngate.and(dnwell).not(dv2)

# mos_varactor_6p0
mos_varactor_6p0_g = var_ngate.not(dnwell).and(dv2)

# mos_varactor_6p0_dw
mos_varactor_6p0_dw_g = var_ngate.and(dnwell).and(dv2)
