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

#================================
# ----- DIODE DERIVATIONS -------
#================================

logger.info('Starting DIODE DERIVATIONS')

#================================
# ---- LV DIODE DERIVATIONS ----
#================================

# diode_np_1p8 (Model for 1.8V N+/Pwell diode outside DNWell)
diode_np_1p8_terminal_n = ncomp.outside(dnwell).outside(nwell).not(v5_xtor).not(dualgate).interacting(diode_mk).not(dv2)
                                .not(lvs_bjt).not(drc_bjt).not(sab).not(esd).not(resistor).not(fusetop).not(polyfuse)
                                .not_interacting(cap_mk).not(nat).outside(fhres).not(fusewindow_d)
                                .not(piscap).not_interacting(mos_cap_mk).not_interacting(mim_l_mk).not(res_mk)

# diode_np_1p8_dw (Model for 1.8V N+/Pwell diode inside DNWell)
diode_np_1p8_dw_terminal_n = ncomp.inside(dnwell).outside(nwell).not(v5_xtor).not(dualgate).interacting(diode_mk).not(dv2)
                                .not(lvs_bjt).not(drc_bjt).not(sab).not(esd).not(resistor).not(fusetop).not(polyfuse)
                                .not_interacting(cap_mk).not(nat).outside(fhres).not(fusewindow_d)
                                .not(piscap).not_interacting(mos_cap_mk).not_interacting(mim_l_mk).not(res_mk)

# diode_pn_1p8 (Model for 1.8V P+/Nwell diode outside DNWell)
diode_pn_1p8_terminal_p = pcomp.outside(dnwell).inside(nwell).not(v5_xtor).not(dualgate).interacting(diode_mk).not(dv2)
                                .not(lvs_bjt).not(drc_bjt).not(sab).not(esd).not(resistor).not(fusetop).not(polyfuse)
                                .not_interacting(cap_mk).not(nat).outside(fhres).not(fusewindow_d)
                                .not(piscap).not_interacting(mos_cap_mk).not_interacting(mim_l_mk).not(res_mk)

# diode_pn_1p8_dw (Model for 1.8V P+/Nwell diode inside DNWell)
diode_pn_1p8_dw_terminal_p = pcomp.inside(dnwell).inside(nwell).not(v5_xtor).not(dualgate).interacting(diode_mk).not(dv2)
                                .not(lvs_bjt).not(drc_bjt).not(sab).not(esd).not(resistor).not(fusetop).not(polyfuse)
                                .not_interacting(cap_mk).not(nat).outside(fhres).not(fusewindow_d)
                                .not(piscap).not_interacting(mos_cap_mk).not_interacting(mim_l_mk).not(res_mk)


#================================
# ---- MV DIODE DERIVATIONS ----
#================================

# diode_np_3p3 (Model for 3.3V N+/Pwell diode outside DNwell)
diode_np_3p3_terminal_n = ncomp.outside(dnwell).outside(nwell).not(v5_xtor).inside(dualgate).interacting(diode_mk).not(dv2)
                                .not(lvs_bjt).not(drc_bjt).not(sab).not(esd).not(resistor).not(fusetop).not(polyfuse)
                                .not_interacting(cap_mk).not(nat).outside(fhres).not(fusewindow_d)
                                .not(piscap).not_interacting(mos_cap_mk).not_interacting(mim_l_mk).not(res_mk)

# diode_pn_3p3 (Model for 3.3V P+/Nwell diode outside DNwell)
diode_pn_3p3_terminal_p = pcomp.outside(dnwell).inside(nwell).not(v5_xtor).inside(dualgate).interacting(diode_mk).not(dv2)
                                .not(lvs_bjt).not(drc_bjt).not(sab).not(esd).not(resistor).not(fusetop).not(polyfuse)
                                .not_interacting(cap_mk).not(nat).outside(fhres).not(fusewindow_d)
                                .not(piscap).not_interacting(mos_cap_mk).not_interacting(mim_l_mk).not(res_mk)

# diode_np_3p3_dw (Model for 3.3V N+/Pwell diode inside DNwell)
diode_np_3p3_dw_terminal_n = ncomp.inside(dnwell).outside(nwell).not(v5_xtor).inside(dualgate).interacting(diode_mk).not(dv2)
                                .not(lvs_bjt).not(drc_bjt).not(sab).not(esd).not(resistor).not(fusetop).not(polyfuse)
                                .not_interacting(cap_mk).not(nat).outside(fhres).not(fusewindow_d)
                                .not(piscap).not_interacting(mos_cap_mk).not_interacting(mim_l_mk).not(res_mk)

# diode_pn_3p3_dw (Model for 3.3V P+/Nwell diode inside DNwell)
diode_pn_3p3_dw_terminal_p = pcomp.inside(dnwell).inside(nwell).not(v5_xtor).inside(dualgate).interacting(diode_mk).not(dv2)
                                .not(lvs_bjt).not(drc_bjt).not(sab).not(esd).not(resistor).not(fusetop).not(polyfuse)
                                .not_interacting(cap_mk).not(nat).outside(fhres).not(fusewindow_d)
                                .not(piscap).not_interacting(mos_cap_mk).not_interacting(mim_l_mk).not(res_mk)
                                
# diode_np_6p0 (Model for 6V N+/Pwell diode outside Dnwell)
diode_np_6p0_terminal_n = ncomp.outside(dnwell).outside(nwell).not(v5_xtor).not(dualgate).interacting(diode_mk).inside(dv2)
                                .not(lvs_bjt).not(drc_bjt).not(sab).not(esd).not(resistor).not(fusetop).not(polyfuse)
                                .not_interacting(cap_mk).not(nat).outside(fhres).not(fusewindow_d)
                                .not(piscap).not_interacting(mos_cap_mk).not_interacting(mim_l_mk).not(res_mk)

# diode_pn_6p0 (Model for 6V P+/Nwell diode outside DNwell)
diode_pn_6p0_terminal_p = pcomp.outside(dnwell).inside(nwell).not(v5_xtor).not(dualgate).interacting(diode_mk).inside(dv2)
                                .not(lvs_bjt).not(drc_bjt).not(sab).not(esd).not(resistor).not(fusetop).not(polyfuse)
                                .not_interacting(cap_mk).not(nat).outside(fhres).not(fusewindow_d)
                                .not(piscap).not_interacting(mos_cap_mk).not_interacting(mim_l_mk).not(res_mk)

# diode_np_6p0_dw (Model for 6V N+/Pwell diode inside DNwell)
diode_np_6p0_dw_terminal_n = ncomp.inside(dnwell).outside(nwell).not(v5_xtor).not(dualgate).interacting(diode_mk).inside(dv2)
                                .not(lvs_bjt).not(drc_bjt).not(sab).not(esd).not(resistor).not(fusetop).not(polyfuse)
                                .not_interacting(cap_mk).not(nat).outside(fhres).not(fusewindow_d)
                                .not(piscap).not_interacting(mos_cap_mk).not_interacting(mim_l_mk).not(res_mk)

# diode_pn_6p0_dw (Model for 6V P+/Nwell diode inside DNwell)
diode_pn_6p0_dw_terminal_p = pcomp.inside(dnwell).inside(nwell).not(v5_xtor).not(dualgate).interacting(diode_mk).inside(dv2)
                                .not(lvs_bjt).not(drc_bjt).not(sab).not(esd).not(resistor).not(fusetop).not(polyfuse)
                                .not_interacting(cap_mk).not(nat).outside(fhres).not(fusewindow_d)
                                .not(piscap).not_interacting(mos_cap_mk).not_interacting(mim_l_mk).not(res_mk)
