blob: 4ce6104e6e9c7cae505ad482de770cd0e9d5646d [file] [log] [blame]
################################################################################################
# Copyright 2022 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.
################################################################################################
#==================================
# ------ MOSFET DERIVATIONS -------
#==================================
logger.info('Starting MOSFET DERIVATIONS')
# general derivations used in MOS devices
nsd_sab = nsd.and(sab)
mos_exclude_layers = resistor.or(esd).or(pwhv).or(fusewindow_d).or(polyfuse)
.or(schottky_diode).or(zener).or(piscap).or(res_mk)
.or(fhres).or(mos_cap_mk).or(mvsd).or(mvpsd)
.or(lvs_rf).or(lvs_source).or(mk_35v)
.or(lvs_35v).or(esd_hbm_mk).or(hvpolyrs)
.or(swfet_mk).or(hvnddd).or(hvpddd)
# =======================
# ---- LV MOS Devices ----
# =======================
logger.info('Starting LV MOS layers DERIVATIONS')
# LV NMOS transistor outside DNWELL
nmos_1p8_g = ngate.not(dnwell).not(v5_xtor).not(dualgate2_d).not(ldmos_xtor).not(mos_mk_type1)
.not(mos_exclude_layers).not(sab).not(nwell).not(nat).not_interacting(dni)
.not_interacting(elmd2_mk).not_interacting(elmd_mk)
# LV NMOS transistor inside DNWELL
nmos_1p8_dw_g = ngate.and(dnwell).and(lvpwell).not(v5_xtor).not(dualgate2_d).not(ldmos_xtor)
.not(mos_exclude_layers).not(sab).not(nwell).not(nat).not(mos_mk_type1)
.not_interacting(elmd2_mk).not_interacting(elmd_mk).not_interacting(dni)
# LV NAT NMOS transistor outside DNWELL
nmos_1p8_nat_g = ngate.not(dnwell).and(nat).not(v5_xtor).not(dualgate2_d).not(ldmos_xtor)
.not(mos_exclude_layers).not(sab).not(nwell).not(lvpwell).not(mos_mk_type1)
.not_interacting(elmd2_mk).not_interacting(elmd_mk).not_interacting(dni)
# LV NMOS with drain sab outside DNWELL
nmos_1p8_sab_g = ngate.not(dnwell).interacting(elmd2_mk).interacting(sab).not(dualgate2_d)
.not(mos_exclude_layers).not(nwell).not(nat).not(v5_xtor).not(mos_mk_type1)
.not_interacting(elmd_mk).not(ldmos_xtor).not_interacting(dni)
# LV NMOS with drain sab inside DNWELL
nmos_1p8_dw_sab_g = ngate.and(dnwell).interacting(elmd2_mk).interacting(sab).and(lvpwell)
.not(mos_exclude_layers).not(nwell).not(nat).not(v5_xtor).not(dualgate2_d)
.not_interacting(elmd_mk).not(mos_mk_type1).not(ldmos_xtor).not_interacting(dni)
# LV PMOS transistor outside DNWELL
pmos_1p8_g = pgate.not(dnwell).and(nwell).not(v5_xtor).not(dualgate2_d).not(ldmos_xtor)
.not(mos_exclude_layers).not(sab).not(nat).not(lvpwell).not(mos_mk_type1)
.not_interacting(elmd2_mk).not_interacting(elmd_mk).not_interacting(dni)
# LV PMOS transistor inside DNWELL
pmos_1p8_dw_g = pgate.and(dnwell).not(v5_xtor).not(dualgate2_d).not(ldmos_xtor).not(lvpwell)
.not(mos_exclude_layers).not(sab).not(nat).not(mos_mk_type1).not_interacting(dni)
.not_interacting(elmd2_mk).not_interacting(elmd_mk)
# ========================
# ---- MV MOS Devices ----
# ========================
logger.info('Starting MV MOS layers DERIVATIONS')
# 5V NMOS transistor outside DNWELL
nmos_5p0_g = ngate.not(dnwell).and(v5_xtor).and(dualgate2_d).not(ldmos_xtor).not(mos_mk_type1)
.not(mos_exclude_layers).not(sab).not(nwell).not(nat).not_interacting(dni)
.not_interacting(elmd2_mk).not_interacting(elmd_mk)
# 5V NMOS transistor inside DNWELL
nmos_5p0_dw_g = ngate.and(dnwell).and(lvpwell).and(v5_xtor).and(dualgate2_d).not(ldmos_xtor)
.not(mos_exclude_layers).not(sab).not(nwell).not(nat).not(mos_mk_type1)
.not_interacting(elmd2_mk).not_interacting(elmd_mk).not_interacting(dni)
# 5V PMOS transistor outside DNWELL
pmos_5p0_g = pgate.not(dnwell).and(nwell).and(v5_xtor).and(dualgate2_d).not(ldmos_xtor)
.not(mos_exclude_layers).not(sab).not(nat).not(lvpwell).not(mos_mk_type1)
.not_interacting(elmd2_mk).not_interacting(elmd_mk).not_interacting(dni)
# 5V PMOS transistor inside DNWELL
pmos_5p0_dw_g = pgate.and(dnwell).and(v5_xtor).and(dualgate2_d).not(ldmos_xtor).not(lvpwell)
.not(mos_exclude_layers).not(sab).not(nat).not(mos_mk_type1)
.not_interacting(elmd2_mk).not_interacting(elmd_mk).not_interacting(dni)
# 6V NMOS transistor outside DNWELL
nmos_6p0_g = ngate.not(dnwell).not(v5_xtor).and(dualgate2_d).not(ldmos_xtor).not(mos_mk_type1)
.not(mos_exclude_layers).not(sab).not(nwell).not(nat)
.not_interacting(elmd2_mk).not_interacting(elmd_mk).not_interacting(dni)
# 6V NMOS transistor inside DNWELL
nmos_6p0_dw_g = ngate.and(dnwell).and(lvpwell).not(v5_xtor).and(dualgate2_d).not(ldmos_xtor)
.not(mos_exclude_layers).not(sab).not(nwell).not(nat).not(mos_mk_type1)
.not_interacting(elmd2_mk).not_interacting(elmd_mk).not_interacting(dni)
# 6V PMOS transistor outside DNWELL
pmos_6p0_g = pgate.not(dnwell).and(nwell).not(v5_xtor).and(dualgate2_d).not(ldmos_xtor)
.not(mos_exclude_layers).not(sab).not(nat).not(lvpwell).not(mos_mk_type1)
.not_interacting(elmd2_mk).not_interacting(elmd_mk).not_interacting(dni)
# 6V PMOS transistor inside DNWELL
pmos_6p0_dw_g = pgate.and(dnwell).not(v5_xtor).and(dualgate2_d).not(ldmos_xtor).not(lvpwell)
.not(mos_exclude_layers).not(sab).not(nat).not(mos_mk_type1)
.not_interacting(elmd2_mk).not_interacting(elmd_mk).not_interacting(dni)
# 6V NAT NMOS transistor outside DNWELL
nmos_6p0_nat_g = ngate.not(dnwell).and(nat).not(v5_xtor).and(dualgate2_d).not(ldmos_xtor)
.not(mos_exclude_layers).not(sab).not(nwell).not(lvpwell).not(mos_mk_type1)
.not_interacting(elmd2_mk).not_interacting(elmd_mk).not_interacting(dni)
# 6V NAT PMOS transistor inside DNWELL
pmos_6p0_nat_dw_g = pgate.and(dnwell).not(v5_xtor).and(dualgate2_d).and(nat).not(ldmos_xtor)
.not(mos_exclude_layers).not(sab).not(lvpwell).not(mos_mk_type1)
.not_interacting(elmd2_mk).not_interacting(elmd_mk).not_interacting(dni)
# 6V Extended LDD NMOS
nmos_eldd_g = ngate.and(dnwell).and(lvpwell).not(v5_xtor).and(dualgate2_d).interacting(elmd_mk)
.not(mos_exclude_layers).interacting(sab).not(nwell).not(nat).not(mos_mk_type1)
.not_interacting(elmd2_mk).not(ldmos_xtor).not_interacting(dni)
# 6V DDD MV NMOS
nmos_ddd_g = ngate.and(dnwell).and(lvpwell).not(v5_xtor).and(dualgate2_d).interacting(dni)
.not(mos_exclude_layers).interacting(sab).not(nwell).not(nat).not(mos_mk_type1)
.not_interacting(elmd2_mk).not_interacting(elmd_mk).not(ldmos_xtor)
# 6V NMOS with drain sab outside DNWELL
nmos_6p0_sab_g = ngate.not(dnwell).not(nwell).not(v5_xtor).and(dualgate2_d).not_interacting(elmd_mk)
.not(mos_exclude_layers).interacting(sab).not(nwell).not(nat).not(mos_mk_type1)
.not_interacting(elmd2_mk).not(ldmos_xtor).not_interacting(dni)
# 6V NMOS with drain sab inside DNWELL
nmos_6p0_dw_sab_g = ngate.and(dnwell).and(lvpwell).not(v5_xtor).and(dualgate2_d).not_interacting(elmd_mk)
.not(mos_exclude_layers).interacting(sab).not(nwell).not(nat).not(mos_mk_type1)
.not_interacting(elmd2_mk).not(ldmos_xtor).not_interacting(dni)
# 5V NMOS with drain sab outside DNWELL
nmos_5p0_sab_g = ngate.not(dnwell).not(nwell).and(v5_xtor).and(dualgate2_d).not_interacting(elmd_mk)
.not(mos_exclude_layers).interacting(sab).not(nwell).not(nat).not(mos_mk_type1)
.not_interacting(elmd2_mk).not(ldmos_xtor).not_interacting(dni)
# 5V NMOS with drain sab inside DNWELL
nmos_5p0_dw_sab_g = ngate.and(dnwell).and(lvpwell).and(v5_xtor).and(dualgate2_d).not_interacting(elmd_mk)
.not(mos_exclude_layers).interacting(sab).not(nwell).not(nat).not(mos_mk_type1)
.not_interacting(elmd2_mk).not(ldmos_xtor).not_interacting(dni)
# 4.2V Hybrid NMOS inside DNWELL
nmos_4p2_dw_g = ngate.and(dnwell).and(lvpwell).not(v5_xtor).and(dualgate2_d).interacting(mos_mk_type4)
.interacting(mos_source_type1).not_interacting(dni).not_interacting(elmd_mk)
.not(mos_exclude_layers).not_interacting(sab).not(nwell).not(mos_mk_type1)
.not_interacting(elmd2_mk).not(ldmos_xtor).not(nat)
# 4.2V Hybrid PMOS inside DNWELL
pmos_4p2_dw_g = pgate.and(dnwell).not(v5_xtor).and(dualgate2_d).interacting(mos_mk_type4)
.interacting(mos_source_type1).not_interacting(dni).not_interacting(elmd_mk)
.not(mos_exclude_layers).not_interacting(sab).not(nwell).not(mos_mk_type1)
.not_interacting(elmd2_mk).not(ldmos_xtor).not(nat)
# 4.2V Hybrid SAB NMOS inside DNWELL
nmos_4p2_dw_sab_g = ngate.and(dnwell).and(lvpwell).not(v5_xtor).and(dualgate2_d).interacting(mos_mk_type4)
.interacting(mos_source_type1).not_interacting(dni).not_interacting(elmd_mk)
.not(mos_exclude_layers).interacting(sab).not(nwell).not(mos_mk_type1)
.not_interacting(elmd2_mk).not(ldmos_xtor).not(nat)