blob: 948b17cf16eb2f419316180bf987b95416a2bc11 [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.
################################################################################################
if FEOL
#================================================
#----------------------COMP----------------------
#================================================
# Rule FATAL.ERROR: Nplus can’t overlap with pplus
logger.info('Executing rule FATAL.ERROR')
fatalerror_l1 = nplus.and(pplus)
fatalerror_l1.output('FATAL.ERROR', "FATAL.ERROR : Nplus can't overlap with pplus")
fatalerror_l1.forget
# Rule DF.1a_LV: Min. COMP Width. is 0.22µm
logger.info('Executing rule DF.1a_LV')
df1a_l1 = comp.outside(sramcore).width(0.22.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate_2)
df1a_l1.output('DF.1a_LV', 'DF.1a_LV : Min. COMP Width. : 0.22µm')
df1a_l1.forget
# Rule DF.1a_MV: Min. COMP Width. is 0.3µm
logger.info('Executing rule DF.1a_MV')
df1a_l1 = comp.outside(sramcore).width(0.3.um, euclidian).polygons(0.001).not_interacting(dualgate).overlapping(dualgate_2)
df1a_l1.output('DF.1a_MV', 'DF.1a_MV : Min. COMP Width. : 0.3µm')
df1a_l1.forget
# rule DF.1b_LV is not a DRC check
# rule DF.1b_MV is not a DRC check
df_2a = comp.not(poly2).edges.and(tgate.edges)
# Rule DF.2a_LV: Min Channel Width. is 0.22µm
logger.info('Executing rule DF.2a_LV')
df2a_l1 = df_2a.with_length(nil,0.22.um).extended(0, 0, 0.001, 0.001).not_interacting(v5_xtor).not_interacting(dualgate_2)
df2a_l1.output('DF.2a_LV', 'DF.2a_LV : Min Channel Width. : 0.22µm')
df2a_l1.forget
# Rule DF.2a_MV: Min Channel Width. is 0.3µm
logger.info('Executing rule DF.2a_MV')
df2a_l1 = df_2a.with_length(nil,0.3.um).extended(0, 0, 0.001, 0.001).not_interacting(dualgate).overlapping(dualgate_2)
df2a_l1.output('DF.2a_MV', 'DF.2a_MV : Min Channel Width. : 0.3µm')
df2a_l1.forget
df_2a.forget
df_2b = comp.drc(width <= 100.um).polygons(0.001).not_inside(mos_cap_mk)
# Rule DF.2b_LV: Max. COMP width for all cases except those used for capacitors, marked by ‘CAP_MK’ layer.
logger.info('Executing rule DF.2b_LV')
df2b_l1 = comp.not_inside(cap_mk).not_interacting(df_2b).not_interacting(v5_xtor).not_interacting(dualgate_2)
df2b_l1.output('DF.2b_LV', 'DF.2b_LV : Max. COMP width for all cases except those used for capacitors, marked by ‘CAP_MK’ layer.')
df2b_l1.forget
# Rule DF.2b_MV: Max. COMP width for all cases except those used for capacitors, marked by ‘CAP_MK’ layer.
logger.info('Executing rule DF.2b_MV')
df2b_l1 = comp.not_inside(cap_mk).not_interacting(df_2b).not_interacting(dualgate).overlapping(dualgate_2)
df2b_l1.output('DF.2b_MV', 'DF.2b_MV : Max. COMP width for all cases except those used for capacitors, marked by ‘CAP_MK’ layer.')
df2b_l1.forget
df_2b.forget
# Rule DF.3a_LV: Min. COMP Space P-substrate tap (PCOMP outside NWELL and DNWELL) can be butted for different voltage devices as the potential is same. is 0.28µm
logger.info('Executing rule DF.3a_LV')
df3a_l1 = comp.outside(sramcore).not(otp_mk).space(0.28.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate_2)
df3a_l1.output('DF.3a_LV', 'DF.3a_LV : Min. COMP Space P-substrate tap (PCOMP outside NWELL and DNWELL) can be butted for different voltage devices as the potential is same. : 0.28µm')
df3a_l1.forget
# Rule DF.3a_MV: Min. COMP Space P-substrate tap (PCOMP outside NWELL and DNWELL) can be butted for different voltage devices as the potential is same. is 0.36µm
logger.info('Executing rule DF.3a_MV')
df3a_l1 = comp.outside(sramcore).not(otp_mk).space(0.36.um, euclidian).polygons(0.001).not_interacting(dualgate).overlapping(dualgate_2)
df3a_l1.output('DF.3a_MV', 'DF.3a_MV : Min. COMP Space P-substrate tap (PCOMP outside NWELL and DNWELL) can be butted for different voltage devices as the potential is same. : 0.36µm')
df3a_l1.forget
df_3b_same_well = ncomp.outside(sramcore).inside(nwell).not_outside(pcomp.inside(nwell)).or(ncomp.inside(lvpwell).not_outside(pcomp.inside(lvpwell)))
df_3b_moscap = ncomp.outside(sramcore).inside(nwell).interacting(pcomp.inside(nwell)).or(ncomp.inside(lvpwell).interacting(pcomp.inside(lvpwell))).inside(mos_cap_mk)
# Rule DF.3b_LV: Min./Max. NCOMP Space to PCOMP in the same well for butted COMP (MOSCAP butting is not allowed).
logger.info('Executing rule DF.3b_LV')
df3b_l1 = df_3b_same_well.or(df_3b_moscap).not_interacting(v5_xtor).not_interacting(dualgate_2)
df3b_l1.output('DF.3b_LV', 'DF.3b_LV : Min./Max. NCOMP Space to PCOMP in the same well for butted COMP (MOSCAP butting is not allowed).')
df3b_l1.forget
# Rule DF.3b_MV: Min./Max. NCOMP Space to PCOMP in the same well for butted COMP(MOSCAP butting is not allowed).
logger.info('Executing rule DF.3b_MV')
df3b_l1 = df_3b_same_well.or(df_3b_moscap).not_interacting(dualgate).overlapping(dualgate_2)
df3b_l1.output('DF.3b_MV', 'DF.3b_MV : Min./Max. NCOMP Space to PCOMP in the same well for butted COMP(MOSCAP butting is not allowed).')
df3b_l1.forget
df_3b_same_well.forget
df_3b_moscap.forget
# Rule DF.3c_LV: Min. COMP Space in BJT area (area marked by DRC_BJT layer). is 0.32µm
logger.info('Executing rule DF.3c_LV')
df3c_l1 = comp.inside(drc_bjt).space(0.32.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate_2)
df3c_l1.output('DF.3c_LV', 'DF.3c_LV : Min. COMP Space in BJT area (area marked by DRC_BJT layer). : 0.32µm')
df3c_l1.forget
# Rule DF.3c_MV: Min. COMP Space in BJT area (area marked by DRC_BJT layer). is 0.32µm
logger.info('Executing rule DF.3c_MV')
df3c_l1 = comp.inside(drc_bjt).space(0.32.um, euclidian).polygons(0.001).not_interacting(dualgate).overlapping(dualgate_2)
df3c_l1.output('DF.3c_MV', 'DF.3c_MV : Min. COMP Space in BJT area (area marked by DRC_BJT layer). : 0.32µm')
df3c_l1.forget
ntap_dnwell = ncomp.not_interacting(tgate).inside(dnwell)
# Rule DF.4a_LV: Min. (LVPWELL Space to NCOMP well tap) inside DNWELL. is 0.12µm
logger.info('Executing rule DF.4a_LV')
df4a_l1 = ntap_dnwell.separation(lvpwell.inside(dnwell), 0.12.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate_2)
df4a_l1.output('DF.4a_LV', 'DF.4a_LV : Min. (LVPWELL Space to NCOMP well tap) inside DNWELL. : 0.12µm')
df4a_l1.forget
# Rule DF.4a_MV: Min. (LVPWELL Space to NCOMP well tap) inside DNWELL. is 0.16µm
logger.info('Executing rule DF.4a_MV')
df4a_l1 = ntap_dnwell.separation(lvpwell.inside(dnwell), 0.16.um, euclidian).polygons(0.001).not_interacting(dualgate).overlapping(dualgate_2)
df4a_l1.output('DF.4a_MV', 'DF.4a_MV : Min. (LVPWELL Space to NCOMP well tap) inside DNWELL. : 0.16µm')
df4a_l1.forget
# Rule DF.4b_LV: Min. DNWELL overlap of NCOMP well tap. is 0.62µm
logger.info('Executing rule DF.4b_LV')
df4b_l1 = dnwell.enclosing(ncomp.not_interacting(tgate), 0.62.um, euclidian).polygons(0.001)
df4b_l2 = ncomp.not_interacting(tgate).not_outside(dnwell).not(dnwell)
df4b_l = df4b_l1.or(df4b_l2).not_interacting(v5_xtor).not_interacting(dualgate_2)
df4b_l.output('DF.4b_LV', 'DF.4b_LV : Min. DNWELL overlap of NCOMP well tap. : 0.62µm')
df4b_l1.forget
df4b_l2.forget
df4b_l.forget
# Rule DF.4b_MV: Min. DNWELL overlap of NCOMP well tap. is 0.66µm
logger.info('Executing rule DF.4b_MV')
df4b_l1 = dnwell.enclosing(ncomp.not_interacting(tgate), 0.66.um, euclidian).polygons(0.001)
df4b_l2 = ncomp.not_interacting(tgate).not_outside(dnwell).not(dnwell)
df4b_l = df4b_l1.or(df4b_l2).not_interacting(dualgate).overlapping(dualgate_2)
df4b_l.output('DF.4b_MV', 'DF.4b_MV : Min. DNWELL overlap of NCOMP well tap. : 0.66µm')
df4b_l1.forget
df4b_l2.forget
df4b_l.forget
ntap_dnwell.forget
nwell_n_dnwell = nwell.outside(dnwell)
# Rule DF.4c_LV: Min. (Nwell overlap of PCOMP) outside DNWELL. is 0.43µm
logger.info('Executing rule DF.4c_LV')
df4c_l1 = nwell_n_dnwell.outside(sramcore).enclosing(pcomp.outside(dnwell), 0.43.um, euclidian).polygons(0.001)
df4c_l2 = pcomp.outside(dnwell).not_outside(nwell_n_dnwell.outside(sramcore)).not(nwell_n_dnwell.outside(sramcore))
df4c_l = df4c_l1.or(df4c_l2).not_interacting(v5_xtor).not_interacting(dualgate_2)
df4c_l.output('DF.4c_LV', 'DF.4c_LV : Min. (Nwell overlap of PCOMP) outside DNWELL. : 0.43µm')
df4c_l1.forget
df4c_l2.forget
df4c_l.forget
# Rule DF.4c_MV: Min. (Nwell overlap of PCOMP) outside DNWELL. is 0.6µm
logger.info('Executing rule DF.4c_MV')
df4c_l1 = nwell_n_dnwell.outside(sramcore).enclosing(pcomp.outside(dnwell), 0.6.um, euclidian).polygons(0.001)
df4c_l2 = pcomp.outside(dnwell).not_outside(nwell_n_dnwell.outside(sramcore)).not(nwell_n_dnwell.outside(sramcore))
df4c_l = df4c_l1.or(df4c_l2).not_interacting(dualgate).overlapping(dualgate_2)
df4c_l.output('DF.4c_MV', 'DF.4c_MV : Min. (Nwell overlap of PCOMP) outside DNWELL. : 0.6µm')
df4c_l1.forget
df4c_l2.forget
df4c_l.forget
# Rule DF.4d_LV: Min. (Nwell overlap of NCOMP) outside DNWELL. is 0.12µm
logger.info('Executing rule DF.4d_LV')
df4d_l1 = nwell_n_dnwell.enclosing(ncomp.outside(dnwell), 0.12.um, euclidian).polygons(0.001)
df4d_l2 = ncomp.outside(dnwell).not_outside(nwell_n_dnwell).not(nwell_n_dnwell)
df4d_l = df4d_l1.or(df4d_l2).not_interacting(v5_xtor).not_interacting(dualgate_2)
df4d_l.output('DF.4d_LV', 'DF.4d_LV : Min. (Nwell overlap of NCOMP) outside DNWELL. : 0.12µm')
df4d_l1.forget
df4d_l2.forget
df4d_l.forget
# Rule DF.4d_MV: Min. (Nwell overlap of NCOMP) outside DNWELL. is 0.16µm
logger.info('Executing rule DF.4d_MV')
df4d_l1 = nwell_n_dnwell.enclosing(ncomp.outside(dnwell), 0.16.um, euclidian).polygons(0.001)
df4d_l2 = ncomp.outside(dnwell).not_outside(nwell_n_dnwell).not(nwell_n_dnwell)
df4d_l = df4d_l1.or(df4d_l2).not_interacting(dualgate).overlapping(dualgate_2)
df4d_l.output('DF.4d_MV', 'DF.4d_MV : Min. (Nwell overlap of NCOMP) outside DNWELL. : 0.16µm')
df4d_l1.forget
df4d_l2.forget
df4d_l.forget
nwell_n_dnwell.forget
# Rule DF.4e_LV: Min. DNWELL overlap of PCOMP. is 0.93µm
logger.info('Executing rule DF.4e_LV')
df4e_l1 = dnwell.enclosing(pcomp, 0.93.um, euclidian).polygons(0.001)
df4e_l2 = pcomp.not_outside(dnwell).not(dnwell)
df4e_l = df4e_l1.or(df4e_l2).not_interacting(v5_xtor).not_interacting(dualgate_2)
df4e_l.output('DF.4e_LV', 'DF.4e_LV : Min. DNWELL overlap of PCOMP. : 0.93µm')
df4e_l1.forget
df4e_l2.forget
df4e_l.forget
# Rule DF.4e_MV: Min. DNWELL overlap of PCOMP. is 1.1µm
logger.info('Executing rule DF.4e_MV')
df4e_l1 = dnwell.enclosing(pcomp, 1.1.um, euclidian).polygons(0.001)
df4e_l2 = pcomp.not_outside(dnwell).not(dnwell)
df4e_l = df4e_l1.or(df4e_l2).not_interacting(dualgate).overlapping(dualgate_2)
df4e_l.output('DF.4e_MV', 'DF.4e_MV : Min. DNWELL overlap of PCOMP. : 1.1µm')
df4e_l1.forget
df4e_l2.forget
df4e_l.forget
pwell_dnwell = lvpwell.inside(dnwell)
# Rule DF.5_LV: Min. (LVPWELL overlap of PCOMP well tap) inside DNWELL. is 0.12µm
logger.info('Executing rule DF.5_LV')
df5_l1 = pwell_dnwell.enclosing(pcomp.outside(nwell), 0.12.um, euclidian).polygons(0.001)
df5_l2 = pcomp.outside(nwell).not_outside(pwell_dnwell).not(pwell_dnwell)
df5_l = df5_l1.or(df5_l2).not_interacting(v5_xtor).not_interacting(dualgate_2)
df5_l.output('DF.5_LV', 'DF.5_LV : Min. (LVPWELL overlap of PCOMP well tap) inside DNWELL. : 0.12µm')
df5_l1.forget
df5_l2.forget
df5_l.forget
# Rule DF.5_MV: Min. (LVPWELL overlap of PCOMP well tap) inside DNWELL. is 0.16µm
logger.info('Executing rule DF.5_MV')
df5_l1 = pwell_dnwell.enclosing(pcomp.outside(nwell), 0.16.um, euclidian).polygons(0.001)
df5_l2 = pcomp.outside(nwell).not_outside(pwell_dnwell).not(pwell_dnwell)
df5_l = df5_l1.or(df5_l2).not_interacting(dualgate).overlapping(dualgate_2)
df5_l.output('DF.5_MV', 'DF.5_MV : Min. (LVPWELL overlap of PCOMP well tap) inside DNWELL. : 0.16µm')
df5_l1.forget
df5_l2.forget
df5_l.forget
# Rule DF.6_LV: Min. COMP extend beyond gate (it also means source/drain overhang). is 0.24µm
logger.info('Executing rule DF.6_LV')
df6_l1 = comp.not(otp_mk).outside(sramcore).enclosing(poly2, 0.24.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate_2)
df6_l1.output('DF.6_LV', 'DF.6_LV : Min. COMP extend beyond gate (it also means source/drain overhang). : 0.24µm')
df6_l1.forget
# Rule DF.6_MV: Min. COMP extend beyond gate (it also means source/drain overhang). is 0.4µm
logger.info('Executing rule DF.6_MV')
df6_l1 = comp.not(otp_mk).outside(sramcore).enclosing(poly2, 0.4.um, euclidian).polygons(0.001).not_interacting(dualgate).overlapping(dualgate_2)
df6_l1.output('DF.6_MV', 'DF.6_MV : Min. COMP extend beyond gate (it also means source/drain overhang). : 0.4µm')
df6_l1.forget
# Rule DF.7_LV: Min. (LVPWELL Spacer to PCOMP) inside DNWELL. is 0.43µm
logger.info('Executing rule DF.7_LV')
df7_l1 = pcomp.inside(dnwell).outside(sramcore).separation(pwell_dnwell, 0.43.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate_2)
df7_l1.output('DF.7_LV', 'DF.7_LV : Min. (LVPWELL Spacer to PCOMP) inside DNWELL. : 0.43µm')
df7_l1.forget
# Rule DF.7_MV: Min. (LVPWELL Spacer to PCOMP) inside DNWELL. is 0.6µm
logger.info('Executing rule DF.7_MV')
df7_l1 = pcomp.inside(dnwell).outside(sramcore).separation(pwell_dnwell, 0.6.um, euclidian).polygons(0.001).not_interacting(dualgate).overlapping(dualgate_2)
df7_l1.output('DF.7_MV', 'DF.7_MV : Min. (LVPWELL Spacer to PCOMP) inside DNWELL. : 0.6µm')
df7_l1.forget
# Rule DF.8_LV: Min. (LVPWELL overlap of NCOMP) Inside DNWELL. is 0.43µm
logger.info('Executing rule DF.8_LV')
df8_l1 = pwell_dnwell.enclosing(ncomp.inside(dnwell), 0.43.um, euclidian).polygons(0.001)
df8_l2 = ncomp.inside(dnwell).not_outside(pwell_dnwell).not(pwell_dnwell)
df8_l = df8_l1.or(df8_l2).not_interacting(v5_xtor).not_interacting(dualgate_2)
df8_l.output('DF.8_LV', 'DF.8_LV : Min. (LVPWELL overlap of NCOMP) Inside DNWELL. : 0.43µm')
df8_l1.forget
df8_l2.forget
df8_l.forget
# Rule DF.8_MV: Min. (LVPWELL overlap of NCOMP) Inside DNWELL. is 0.6µm
logger.info('Executing rule DF.8_MV')
df8_l1 = pwell_dnwell.outside(sramcore).enclosing(ncomp.inside(dnwell), 0.6.um, euclidian).polygons(0.001)
df8_l2 = ncomp.inside(dnwell).not_outside(pwell_dnwell.outside(sramcore)).not(pwell_dnwell.outside(sramcore))
df8_l = df8_l1.or(df8_l2).not_interacting(dualgate).overlapping(dualgate_2)
df8_l.output('DF.8_MV', 'DF.8_MV : Min. (LVPWELL overlap of NCOMP) Inside DNWELL. : 0.6µm')
df8_l1.forget
df8_l2.forget
df8_l.forget
pwell_dnwell.forget
# Rule DF.9_LV: Min. COMP area (um2). is 0.2025µm²
logger.info('Executing rule DF.9_LV')
df9_l1 = comp.not(otp_mk).with_area(nil, 0.2025.um).not_interacting(v5_xtor).not_interacting(dualgate_2)
df9_l1.output('DF.9_LV', 'DF.9_LV : Min. COMP area (um2). : 0.2025µm²')
df9_l1.forget
# Rule DF.9_MV: Min. COMP area (um2). is 0.2025µm²
logger.info('Executing rule DF.9_MV')
df9_l1 = comp.not(otp_mk).with_area(nil, 0.2025.um).not_interacting(dualgate).overlapping(dualgate_2)
df9_l1.output('DF.9_MV', 'DF.9_MV : Min. COMP area (um2). : 0.2025µm²')
df9_l1.forget
# Rule DF.10_LV: Min. field area (um2). is 0.26µm²
logger.info('Executing rule DF.10_LV')
df10_l1 = comp.holes.not(comp).with_area(nil, 0.26.um).not_interacting(v5_xtor).not_interacting(dualgate_2)
df10_l1.output('DF.10_LV', 'DF.10_LV : Min. field area (um2). : 0.26µm²')
df10_l1.forget
# Rule DF.10_MV: Min. field area (um2). is 0.26µm²
logger.info('Executing rule DF.10_MV')
df10_l1 = comp.holes.not(comp).with_area(nil, 0.26.um).not_interacting(dualgate).overlapping(dualgate_2)
df10_l1.output('DF.10_MV', 'DF.10_MV : Min. field area (um2). : 0.26µm²')
df10_l1.forget
comp_butt = comp.interacting(ncomp.interacting(pcomp).outside(pcomp))
# Rule DF.11_LV: Min. Length of butting COMP edge. is 0.3µm
logger.info('Executing rule DF.11_LV')
df11_l1 = comp_butt.width(0.3.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate_2)
df11_l1.output('DF.11_LV', 'DF.11_LV : Min. Length of butting COMP edge. : 0.3µm')
df11_l1.forget
# Rule DF.11_MV: Min. Length of butting COMP edge. is 0.3µm
logger.info('Executing rule DF.11_MV')
df11_l1 = comp_butt.width(0.3.um, euclidian).polygons(0.001).not_interacting(dualgate).overlapping(dualgate_2)
df11_l1.output('DF.11_MV', 'DF.11_MV : Min. Length of butting COMP edge. : 0.3µm')
df11_l1.forget
comp_butt.forget
# Rule DF.12_LV: COMP not covered by Nplus or Pplus is forbidden (except those COMP under marking).
logger.info('Executing rule DF.12_LV')
df12_l1 = comp.not(nplus.or(pplus)).not_interacting(v5_xtor).not_interacting(dualgate_2)
df12_l1.output('DF.12_LV', 'DF.12_LV : COMP not covered by Nplus or Pplus is forbidden (except those COMP under marking).')
df12_l1.forget
# Rule DF.12_MV: COMP not covered by Nplus or Pplus is forbidden (except those COMP under marking).
logger.info('Executing rule DF.12_MV')
df12_l1 = comp.not(nplus.or(pplus)).not_interacting(dualgate).overlapping(dualgate_2)
df12_l1.output('DF.12_MV', 'DF.12_MV : COMP not covered by Nplus or Pplus is forbidden (except those COMP under marking).')
df12_l1.forget
# rule DF.15a_LV is not a DRC check
# rule DF.15a_MV is not a DRC check
# rule DF.15b_LV is not a DRC check
# rule DF.15b_MV is not a DRC check
ncomp_df16 = ncomp.outside(nwell).outside(dnwell)
# Rule DF.16_LV: Min. space from (Nwell outside DNWELL) to (NCOMP outside Nwell and DNWELL). is 0.43µm
logger.info('Executing rule DF.16_LV')
df16_l1 = ncomp_df16.outside(sramcore).separation(nwell.outside(dnwell), 0.43.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate_2)
df16_l1.output('DF.16_LV', 'DF.16_LV : Min. space from (Nwell outside DNWELL) to (NCOMP outside Nwell and DNWELL). : 0.43µm')
df16_l1.forget
# Rule DF.16_MV: Min. space from (Nwell outside DNWELL) to (NCOMP outside Nwell and DNWELL). is 0.6µm
logger.info('Executing rule DF.16_MV')
df16_l1 = ncomp_df16.outside(sramcore).separation(nwell.outside(dnwell), 0.6.um, euclidian).polygons(0.001).not_interacting(dualgate).overlapping(dualgate_2)
df16_l1.output('DF.16_MV', 'DF.16_MV : Min. space from (Nwell outside DNWELL) to (NCOMP outside Nwell and DNWELL). : 0.6µm')
df16_l1.forget
pcomp_df17 = pcomp.outside(nwell).outside(dnwell)
# Rule DF.17_LV: Min. space from (Nwell Outside DNWELL) to (PCOMP outside Nwell and DNWELL). is 0.12µm
logger.info('Executing rule DF.17_LV')
df17_l1 = pcomp_df17.separation(nwell.outside(dnwell), 0.12.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate_2)
df17_l1.output('DF.17_LV', 'DF.17_LV : Min. space from (Nwell Outside DNWELL) to (PCOMP outside Nwell and DNWELL). : 0.12µm')
df17_l1.forget
# Rule DF.17_MV: Min. space from (Nwell Outside DNWELL) to (PCOMP outside Nwell and DNWELL). is 0.16µm
logger.info('Executing rule DF.17_MV')
df17_l1 = pcomp_df17.separation(nwell.outside(dnwell), 0.16.um, euclidian).polygons(0.001).not_interacting(dualgate).overlapping(dualgate_2)
df17_l1.output('DF.17_MV', 'DF.17_MV : Min. space from (Nwell Outside DNWELL) to (PCOMP outside Nwell and DNWELL). : 0.16µm')
df17_l1.forget
# Rule DF.18_LV: Min. DNWELL space to (PCOMP outside Nwell and DNWELL). is 2.5µm
logger.info('Executing rule DF.18_LV')
df18_l1 = pcomp_df17.separation(dnwell, 2.5.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate_2)
df18_l1.output('DF.18_LV', 'DF.18_LV : Min. DNWELL space to (PCOMP outside Nwell and DNWELL). : 2.5µm')
df18_l1.forget
# Rule DF.18_MV: Min. DNWELL space to (PCOMP outside Nwell and DNWELL). is 2.5µm
logger.info('Executing rule DF.18_MV')
df18_l1 = pcomp_df17.separation(dnwell, 2.5.um, euclidian).polygons(0.001).not_interacting(dualgate).overlapping(dualgate_2)
df18_l1.output('DF.18_MV', 'DF.18_MV : Min. DNWELL space to (PCOMP outside Nwell and DNWELL). : 2.5µm')
df18_l1.forget
pcomp_df17.forget
ncomp_df16.forget
end #FEOL