################################################################################################
# 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.width(0.22.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate2_d)
    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.not_inside(mvsd).not_inside(mvpsd).width(0.3.um, euclidian).polygons(0.001).overlapping(dualgate2_d)
    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(dualgate2_d)
    df2a_l1.output('DF.2a_LV', 'DF.2a_LV : Min Channel Width. : nil,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).overlapping(dualgate2_d)
    df2a_l1.output('DF.2a_MV', 'DF.2a_MV : Min Channel Width. : nil,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 ‘MOS_CAP_MK’ layer is 100um.
    logger.info('Executing rule DF.2b_LV')
    df2b_l1 = comp.not_inside(mos_cap_mk).not_interacting(df_2b).not_interacting(v5_xtor).not_interacting(dualgate2_d)
    df2b_l1.output('DF.2b_LV', 'DF.2b_LV : Max. COMP width for all cases except those used for capacitors, marked by ‘MOS_CAP_MK’ layer 100um.')
    df2b_l1.forget

    # Rule DF.2b_MV: Max. COMP width for all cases except those used for capacitors, marked by ‘MOS_CAP_MK’ layer is 100um.
    logger.info('Executing rule DF.2b_MV')
    df2b_l1 = comp.not_inside(mos_cap_mk).not_interacting(df_2b).overlapping(dualgate2_d)
    df2b_l1.output('DF.2b_MV', 'DF.2b_MV : Max. COMP width for all cases except those used for capacitors, marked by ‘MOS_CAP_MK’ layer 100um.')
    df2b_l1.forget
    df_2b.forget

    # Rule DF.3a_LV: Min. COMP Space is 0.28µm
    logger.info('Executing rule DF.3a_LV')
    df3a_l1  = comp.not(otp_mk).space(0.28.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate2_d)
    df3a_l1.output('DF.3a_LV', 'DF.3a_LV : Min. COMP Space is : 0.28µm')
    df3a_l1.forget

    # Rule DF.3a_MV: Min. COMP Space is 0.36µm
    logger.info('Executing rule DF.3a_MV')
    df3a_l1  = comp.not(otp_mk).space(0.36.um, euclidian).polygons(0.001).overlapping(dualgate2_d)
    df3a_l1.output('DF.3a_MV', 'DF.3a_MV : Min. COMP Space is : 0.36µm')
    df3a_l1.forget

    df_3b_same_well = ncomp.inside(nwell).not_outside(pcomp.inside(nwell)).or(ncomp.inside(lvpwell).not_outside(pcomp.inside(lvpwell)))
    df_3b_moscap = ncomp.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(dualgate2_d)
    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).overlapping(dualgate2_d)
    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(dualgate2_d)
    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).overlapping(dualgate2_d)
    df3c_l1.output('DF.3c_MV', 'DF.3c_MV : Min. COMP Space in BJT area (area marked by DRC_BJT layer) is 0.32µm.')
    df3c_l1.forget

    # Rule DF.3d_LV: Min. COMP Space in schottky_diode area (area marked by schottky_diode layer) is 0.28µm.
    logger.info('Executing rule DF.3d_LV')
    df3d_l1  = comp.inside(schottky_diode).space(0.28.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate2_d)
    df3d_l1.output('DF.3d_LV', 'DF.3d_LV : Min. COMP Space in schottky_diode (area marked by schottky_diode layer). : 0.28µm')
    df3d_l1.forget

    # Rule DF.3d_MV: Min. COMP Space in schottky_diode area (area marked by schottky_diode layer) is 0.28µm.
    logger.info('Executing rule DF.3d_MV')
    df3d_l1  = comp.inside(schottky_diode).space(0.28.um, euclidian).polygons(0.001).overlapping(dualgate2_d)
    df3d_l1.output('DF.3d_MV', 'DF.3d_MV : Min. COMP Space in schottky_diode area (area marked by schottky_diode layer) is 0.28µm.')
    df3d_l1.forget

    # Rule DF.3e_LV is not there 

    # Rule DF.3e_MV: Min. COMP Space in ZENER Diode area (area marked by ZENER layer) is 0.32µm.
    logger.info('Executing rule DF.3e_MV')
    df3e_l1  = comp.inside(zener).space(0.32.um, euclidian).polygons(0.001).overlapping(dualgate2_d)
    df3e_l1.output('DF.3e_MV', 'DF.3e_MV : Min. COMP Space in ZENER Diode area (area marked by ZENER layer) is 0.32µm.')
    df3e_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(dualgate2_d)
    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).overlapping(dualgate2_d)
    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(dualgate2_d)
    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 enclose  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).overlapping(dualgate2_d)
    df4b_l.output('DF.4b_MV', 'DF.4b_MV : Min. DNWELL enclose 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(dualgate2_d)
    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).overlapping(dualgate2_d)
    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(dualgate2_d)
    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).overlapping(dualgate2_d)
    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(dualgate2_d)
    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).overlapping(dualgate2_d)
    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 enclose 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(dualgate2_d)
    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).overlapping(dualgate2_d)
    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).enclosing(poly2, 0.24.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate2_d)
    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).not_inside(mvpsd).not_inside(mvsd).outside(sramcore).enclosing(poly2, 0.4.um, euclidian).polygons(0.001).overlapping(dualgate2_d)
    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).separation(pwell_dnwell, 0.43.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate2_d)
    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).overlapping(dualgate2_d)
    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 enclose 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(dualgate2_d)
    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).overlapping(dualgate2_d)
    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(dualgate2_d)
    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).overlapping(dualgate2_d)
    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(dualgate2_d)
    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).overlapping(dualgate2_d)
    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(dualgate2_d)
    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).overlapping(dualgate2_d)
    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_interacting(schottky_diode).not_inside(nplus.or(pplus)).not_interacting(v5_xtor).not_interacting(dualgate2_d)
    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_interacting(schottky_diode).not_inside(nplus.or(pplus)).overlapping(dualgate2_d)
    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

    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(dualgate2_d)
    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).overlapping(dualgate2_d)
    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(dualgate2_d)
    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).overlapping(dualgate2_d)
    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(dualgate2_d)
    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).overlapping(dualgate2_d)
    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

    # Rule DF.19_LV: Min. DNWELL space to (NCOMP outside Nwell and DNWELL). is 3.2µm
    logger.info('Executing rule DF.19_LV')
    df19_l1  = ncomp_df16.separation(dnwell, 3.2.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate2_d)
    df19_l1.output('DF.19_LV', 'DF.19_LV : Min. DNWELL space to (NCOMP outside Nwell and DNWELL). : 3.2µm')
    df19_l1.forget

    # Rule DF.19_MV: Min. DNWELL space to (NCOMP outside Nwell and DNWELL). is 3.28µm
    logger.info('Executing rule DF.19_MV')
    df19_l1  = ncomp_df16.separation(dnwell, 3.28.um, euclidian).polygons(0.001).overlapping(dualgate2_d)
    df19_l1.output('DF.19_MV', 'DF.19_MV : Min. DNWELL space to (NCOMP outside Nwell and DNWELL). : 3.28µm')
    df19_l1.forget

    ncomp_df16.forget

end #FEOL
