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

#================================
# ---- MOS-SAB DERIVATIONS ------
#================================

logger.info('Starting MOS SAB DERIVATIONS')

mos_sab_exclude = resistor.join(esd).join(dni)
                          .join(pwhv).join(fusewindow_d).join(polyfuse)
                          .join(schottky_diode).join(piscap).join(zener)
                          .join(res_mk).join(drc_bjt).join(nat)
                          .join(fhres).join(mos_cap_mk).join(mvsd)
                          .join(mvpsd).join(elmd_mk).join(lvs_rf)
                          .join(lvs_source).join(mk_35v).join(lvs_35v)
                          .join(esd_hbm_mk).join(mos_mk_type1).join(swfet_mk)
                          .join(hvnddd).join(hvpddd).join(hvpolyrs)
                          .join(ldmos_xtor)

sab_ngate_lv_base = nplus.and(tgate).not(v5_xtor).not(dualgate2_d).interacting(elmd2_mk)
sab_ngate_5v_base = nplus.and(tgate).and(v5_xtor).and(dualgate2_d).interacting(elmd2_mk)
sab_ngate_6v_base = nplus.and(tgate).not(v5_xtor).and(dualgate2_d).interacting(elmd2_mk)

sab_ngate_lv_n_dw = sab_ngate_lv_base.not(dnwell).not(lvpwell)
sab_ngate_5v_n_dw = sab_ngate_5v_base.not(dnwell).not(lvpwell)
sab_ngate_6v_n_dw = sab_ngate_6v_base.not(dnwell).not(lvpwell)

sab_ngate_lv_dw = sab_ngate_lv_base.and(ngate_dn)
sab_ngate_5v_dw = sab_ngate_5v_base.and(ngate_dn)
sab_ngate_6v_dw = sab_ngate_6v_base.and(ngate_dn)

# ==============
# ---- NMOS ----
# ==============

logger.info('Starting NMOS SAB DERIVATIONS')

# nmos_1p8_sab: 1.8V ESD NMOS transistor outside DNWELL
ngate_sab_1p8v = sab_ngate_lv_n_dw.interacting(sab).not(mos_sab_exclude)

# nmos_1p8_dw_sab: 1.8V ESD NMOS transistor INSIDE DNWELL
ngate_dw_sab_1p8v = sab_ngate_lv_dw.interacting(sab).not(mos_sab_exclude)

# nmos_5p0_sab: 5V ESD NMOS transistor outside DNWELL
ngate_sab_5v = sab_ngate_5v_n_dw.interacting(sab).not(mos_sab_exclude)

# nmos_5p0_dw_sab: 5V ESD NMOS transistor inside DNWELL
ngate_dw_sab_5v = sab_ngate_5v_dw.interacting(sab).not(mos_sab_exclude)

# nmos_6p0_sab: 6V ESD NMOS transistor outside DNWELL
ngate_sab_6v = sab_ngate_6v_n_dw.interacting(sab).not(mos_sab_exclude)

# nmos_6p0_dw_sab: 6V ESD NMOS transistor inside DNWELL
ngate_dw_sab_6v = sab_ngate_6v_dw.interacting(sab).not(mos_sab_exclude)
