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