################################################################################################
# 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')

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

#======================
# --- DIODE EXCLUDE ---
#======================

diode_exclude = resistor.join(esd).join(sab).join(fusewindow_d)
                        .join(polyfuse).join(piscap).join(v5_xtor)
                        .join(drc_bjt).join(nat).join(fhres).join(dni)
                        .join(mos_cap_mk).join(mvpsd).join(elmd_mk)
                        .join(elmd2_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(hvpolyrs)

diode_nd2ps_pd2nw_exclude = diode_exclude.join(poly2).join(pwhv)
                                         .join(schottky_diode).join(zener).join(res_mk)
                                         .join(mvsd).join(hvnddd).join(hvpddd)
                                         .join(ldmos_xtor)                          
#=====================
# --- NP 1P8 DIODE ---
#=====================

diode_nd2ps_01v8_exclude = diode_nd2ps_pd2nw_exclude.join(nwell).join(pplus).join(dualgate2_d)
diode_nd2ps_01v8 = ncomp.and(diode_mk).not_interacting(diode_nd2ps_01v8_exclude)

# diode_nd2ps_01v8: Model for 1.8V N+/Psub diode (outside DNWELL) [np_1p8]
diode_nd2ps_01v8_terminal_n = diode_nd2ps_01v8.not(dnwell)

# diode_nd2ps_01v8_dn: Model for 1.8V N+/Psub diode (inside DNWELL) [np_1p8_dw]
diode_nd2ps_01v8_dn_terminal_n = diode_nd2ps_01v8.and(dnwell)

#=====================
# --- PN 1P8 DIODE ---
#=====================

diode_pd2nw_01v8_exclude = diode_nd2ps_pd2nw_exclude.join(lvpwell).join(nplus).join(dualgate2_d)                                           
diode_pd2nw_01v8 = pcomp.and(diode_mk).not_interacting(diode_pd2nw_01v8_exclude)

# diode_pd2nw_01v8: Model for 1.8V P+/Nwell diode (outside DNWELL) [pn_1p8]
diode_pd2nw_01v8_terminal_p = diode_pd2nw_01v8.not(dnwell)

# diode_pd2nw_01v8_dn: Model for 1.8V P+/Nwell diode (inside DNWELL) [pn_1p8_dw]
diode_pd2nw_01v8_dn_terminal_p = diode_pd2nw_01v8.and(dnwell)

#=====================
# --- NP 6P0 DIODE ---
#=====================

diode_nd2ps_06v0_exclude = diode_nd2ps_pd2nw_exclude.join(nwell).join(pplus)
diode_nd2ps_06v0 = ncomp.and(diode_mk).and(dualgate2_d).not_interacting(diode_nd2ps_06v0_exclude)

# diode_nd2ps_06v0: Model for 6V N+/Pwell diode (outside DNWELL) [np_6p0]
diode_nd2ps_06v0_terminal_n = diode_nd2ps_06v0.not(dnwell)

# diode_nd2ps_06v0_dn: Model for 6V N+/Psub diode (inside DNWELL) [np_6p0_dw]
diode_nd2ps_06v0_dn_terminal_n = diode_nd2ps_06v0.and(dnwell)

#=====================
# --- PN 6P0 DIODE ---
#=====================

diode_pd2nw_06v0_exclude = diode_nd2ps_pd2nw_exclude.join(lvpwell).join(nplus)
diode_pd2nw_06v0 = pcomp.and(diode_mk).and(dualgate2_d).not_interacting(diode_pd2nw_06v0_exclude)

# diode_pd2nw_06v0: Model for 6V P+/Nwell diode (outside DNWELL) [pn_6p0]
diode_pd2nw_06v0_terminal_p = diode_pd2nw_06v0.not(dnwell)

# diode_pd2nw_06v0_dn: Model for 6V P+/Nwell diode (inside DNWELL) [pn_6p0_dw]
diode_pd2nw_06v0_dn_terminal_p = diode_pd2nw_06v0.and(dnwell)

#======================
# --- NWP 6P0 DIODE ---
#======================

diode_nw2ps_06v0_exclude = diode_nd2ps_pd2nw_exclude.join(dnwell).join(lvpwell)

# diode_nw2ps_06v0: Model for Nwell/Psub diode (applicable for both 1.8V/6V) [nwp_6p0]
diode_nw2ps_06v0_terminal_p = pcomp.and(diode_mk).not(diode_nw2ps_06v0_exclude)
diode_nw2ps_06v0_terminal_n = diode_mk.covering(nwell.covering(ncomp)).not_interacting(diode_nw2ps_06v0_exclude)

#====================
# --- DNWPW DIODE ---
#====================

diode_pw2dw_exclude = diode_nd2ps_pd2nw_exclude.join(nwell).join(nplus)

# diode_pw2dw: Model for LVPWELL/DNWELL diode (applicable for both 1.8V/6V) [dnwpw]
diode_pw2dw_terminal_p = lvpwell.interacting(pcomp).and(well_diode_mk).not_interacting(diode_pw2dw_exclude)

#====================
# --- DNWPS DIODE ---
#====================

# diode_dw2ps: Model for DNWELL/Psub diode(1.8V/6V) [dnwps]
diode_dw2ps_terminal_p_ = ptap.extents.covering(ncomp)
diode_dw2ps_exclude = diode_exclude.join(nwell).join(lvpwell)
                                   .join(poly2).join(pwhv).join(schottky_diode)
                                   .join(zener).join(mvsd).join(hvnddd)
                                   .join(hvpddd).join(ldmos_xtor)

diode_dw2ps_terminal_p = diode_dw2ps_terminal_p_.interacting(dnwell).interacting(well_diode_mk)
                                                .not_interacting(diode_dw2ps_exclude)

#=================
# --- SC DIODE ---
#=================

diode_sc_exclude = diode_exclude.join(lvpwell).join(poly2)
                                .join(pplus).join(zener).join(res_mk)
                                .join(hvnddd).join(hvpddd).join(ldmos_xtor)
                                
# diode_sc: Model for schottky diode [sc_diode]
diode_sc_terminal_n = ncomp.and(dnwell).and(schottky_diode).not_interacting(diode_sc_exclude)
diode_sc_terminal_p = metal1.and(dnwell).not_interacting(diode_sc_terminal_n).not_interacting(diode_sc_exclude)
