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

    #================================================
    #---------------------NPLUS----------------------
    #================================================

    # Rule NP.1: min. nplus width is 0.4µm
    logger.info('Executing rule NP.1')
    np1_l1  = nplus.width(0.4.um, euclidian).polygons(0.001)
    np1_l1.output('NP.1', 'NP.1 : min. nplus width : 0.4µm')
    np1_l1.forget

    # Rule NP.2: min. nplus spacing is 0.4µm
    logger.info('Executing rule NP.2')
    np2_l1  = nplus.space(0.4.um, euclidian).polygons(0.001)
    np2_l1.output('NP.2', 'NP.2 : min. nplus spacing : 0.4µm')
    np2_l1.forget

    # Rule NP.3a: Space to PCOMP for PCOMP: (1) Inside Nwell (2) Outside LVPWELL but inside DNWELL. is 0.16µm
    logger.info('Executing rule NP.3a')
    np3a_l1  = nplus.separation((pcomp.inside(nwell)).or(pcomp.outside(lvpwell).inside(dnwell)), 0.16.um, euclidian).polygons(0.001)
    np3a_l1.output('NP.3a', 'NP.3a : Space to PCOMP for PCOMP: (1) Inside Nwell (2) Outside LVPWELL but inside DNWELL. : 0.16µm')
    np3a_l1.forget

    np_3bi_extend = lvpwell.inside(dnwell).sized(-0.429.um)
    np_3bi = pcomp.edges.and(lvpwell.inside(dnwell).not(np_3bi_extend))
    # Rule NP.3bi: Space to PCOMP: For Inside DNWELL, inside LVPWELL:(i) For PCOMP enclose by LVPWELL < 0.43um. is 0.16µm
    logger.info('Executing rule NP.3bi')
    np3bi_l1  = nplus.not_outside(lvpwell).inside(dnwell).edges.separation(np_3bi, 0.16.um, euclidian).polygons(0.001)
    np3bi_l1.output('NP.3bi', 'NP.3bi : Space to PCOMP: For Inside DNWELL, inside LVPWELL:(i) For PCOMP enclose by LVPWELL < 0.43um. : 0.16µm')
    np3bi_l1.forget

    np_3bi_extend.forget

    np_3bi.forget

    np_3bii_extend = lvpwell.inside(dnwell).sized(-0.429.um)
    np_3bii = pcomp.edges.and(np_3bii_extend)
    # Rule NP.3bii: Space to PCOMP: For Inside DNWELL, inside LVPWELL:(ii) For PCOMP enclose by LVPWELL >= 0.43um. is 0.08µm
    logger.info('Executing rule NP.3bii')
    np3bii_l1  = nplus.not_outside(lvpwell).inside(dnwell).edges.separation(np_3bii, 0.08.um, euclidian).polygons(0.001)
    np3bii_l1.output('NP.3bii', 'NP.3bii : Space to PCOMP: For Inside DNWELL, inside LVPWELL:(ii) For PCOMP enclose by LVPWELL >= 0.43um. : 0.08µm')
    np3bii_l1.forget

    np_3bii_extend.forget

    np_3bii.forget

    np_3ci = pcomp.edges.and(nwell.outside(dnwell).sized(0.429.um))
    # Rule NP.3ci: Space to PCOMP: For Outside DNWELL:(i) For PCOMP space to Nwell < 0.43um. is 0.16µm
    logger.info('Executing rule NP.3ci')
    np3ci_l1 = nplus.outside(dnwell).edges.separation(np_3ci, 0.16.um, euclidian).polygons
    np3ci_l1.output('NP.3ci', 'NP.3ci : Space to PCOMP: For Outside DNWELL:(i) For PCOMP space to Nwell < 0.43um. : 0.16µm')
    np3ci_l1.forget

    np_3ci.forget

    np_3cii = pcomp.edges.not(nwell.outside(dnwell).sized(0.429.um))
    # Rule NP.3cii: Space to PCOMP: For Outside DNWELL:(ii) For PCOMP space to Nwell >= 0.43um. is 0.08µm
    logger.info('Executing rule NP.3cii')
    np3cii_l1 = nplus.outside(dnwell).edges.separation(np_3cii, 0.08.um, euclidian).polygons
    np3cii_l1.output('NP.3cii', 'NP.3cii : Space to PCOMP: For Outside DNWELL:(ii) For PCOMP space to Nwell >= 0.43um. : 0.08µm')
    np3cii_l1.forget

    np_3cii.forget

    # Rule NP.3d: Min/max Nplus overlap of Pplus is 0um.
    logger.info('Executing rule NP.3d')
    np3d_l1 = nplus.not_outside(pplus)
    np3d_l1.output('NP.3d', 'NP.3d : Min/max Nplus overlap of Pplus is 0um.')
    np3d_l1.forget

    # Rule NP.3e: Space to related PCOMP edge adjacent to a butting edge.
    logger.info('Executing rule NP.3e')
    np3e_l1 = nplus.not_outside(pcomp)
    np3e_l1.output('NP.3e', 'NP.3e : Space to related PCOMP edge adjacent to a butting edge.')
    np3e_l1.forget

    # Rule NP.4a: Space to related P-channel gate at a butting edge parallel to gate. is 0.32µm
    logger.info('Executing rule NP.4a')
    np4a_l1 = nplus.edges.and(pcomp.edges).separation(pgate.edges, 0.32.um, projection).polygons(0.001)
    np4a_l1.output('NP.4a', 'NP.4a : Space to related P-channel gate at a butting edge parallel to gate. : 0.32µm')
    np4a_l1.forget

    np_4b_poly = poly2.edges.interacting(pgate.edges.not(pcomp.edges)).centers(0, 0.99).and(pgate.sized(0.32.um))
    # Rule NP.4b: Within 0.32um of channel, space to P-channel gate extension perpendicular to the direction of Poly2 is 0.22um.
    logger.info('Executing rule NP.4b')
    np4b_l1 = nplus.interacting(nplus.edges.separation(np_4b_poly, 0.22.um, projection).polygons(0.001))
    np4b_l1.output('NP.4b', 'NP.4b : Within 0.32um of channel, space to P-channel gate extension perpendicular to the direction of Poly2 is 0.22um.')
    np4b_l1.forget

    np_4b_poly.forget

    # Rule NP.5a: Overlap of N-channel gate. is 0.23µm
    logger.info('Executing rule NP.5a')
    np5a_l1 = nplus.enclosing(ngate, 0.23.um, euclidian).polygons(0.001)
    np5a_l2 = ngate.not_outside(nplus).not(nplus)
    np5a_l  = np5a_l1.or(np5a_l2)
    np5a_l.output('NP.5a', 'NP.5a : Overlap of N-channel gate. : 0.23µm')
    np5a_l1.forget
    np5a_l2.forget
    np5a_l.forget

    # Rule NP.5b: Extension beyond COMP for the COMP (1) inside LVPWELL (2) outside Nwell and DNWELL. is 0.16µm
    logger.info('Executing rule NP.5b')
    np5b_l1 = nplus.not_outside(lvpwell).or(nplus.outside(nwell).outside(dnwell)).edges.not(pplus).enclosing(comp.edges, 0.16.um, euclidian).polygons(0.001)
    np5b_l1.output('NP.5b', 'NP.5b : Extension beyond COMP for the COMP (1) inside LVPWELL (2) outside Nwell and DNWELL. : 0.16µm')
    np5b_l1.forget

    np_5ci_background = nplus.not_inside(lvpwell).inside(dnwell).edges
    np_5ci_foreground = ncomp.not_inside(lvpwell).inside(dnwell).edges.not(pplus.edges).and(lvpwell.inside(dnwell).sized(0.429.um))
    # Rule NP.5ci: Extension beyond COMP: For Inside DNWELL: (i)For Nplus < 0.43um from LVPWELL edge for Nwell or DNWELL tap inside DNWELL. is 0.16µm
    logger.info('Executing rule NP.5ci')
    np5ci_l1 = np_5ci_background.enclosing(np_5ci_foreground, 0.16.um, projection).polygons(0.001)
    np5ci_l1.output('NP.5ci', 'NP.5ci : Extension beyond COMP: For Inside DNWELL: (i)For Nplus < 0.43um from LVPWELL edge for Nwell or DNWELL tap inside DNWELL. : 0.16µm')
    np5ci_l1.forget

    np_5ci_background.forget

    np_5ci_foreground.forget

    np_5cii_background = nplus.not_inside(lvpwell).inside(dnwell).edges
    np_5cii_foreground = ncomp.not_inside(lvpwell).inside(dnwell).edges.not(pplus.edges).not(lvpwell.inside(dnwell).sized(0.429.um))
    # Rule NP.5cii: Extension beyond COMP: For Inside DNWELL: (ii) For Nplus >= 0.43um from LVPWELL edge for Nwell or DNWELL tap inside DNWELL. is 0.02µm
    logger.info('Executing rule NP.5cii')
    np5cii_l1 = np_5cii_background.enclosing(np_5cii_foreground, 0.02.um, projection).polygons(0.001)
    np5cii_l1.output('NP.5cii', 'NP.5cii : Extension beyond COMP: For Inside DNWELL: (ii) For Nplus >= 0.43um from LVPWELL edge for Nwell or DNWELL tap inside DNWELL. : 0.02µm')
    np5cii_l1.forget

    np_5cii_background.forget

    np_5cii_foreground.forget

    np_5di_background = nplus.not_outside(nwell).outside(dnwell).edges
    np_5di_extend     = nwell.outside(dnwell).not(nwell.outside(dnwell).sized(-0.429.um))
    np_5di_foreground = ncomp.not_outside(nwell).outside(dnwell).edges.not(pplus.edges).and(np_5di_extend)
    # Rule NP.5di: Extension beyond COMP: For Outside DNWELL, inside Nwell: (i) For Nwell overlap of Nplus < 0.43um. is 0.16µm
    logger.info('Executing rule NP.5di')
    np5di_l1 = np_5di_background.enclosing(np_5di_foreground, 0.16.um, projection).polygons(0.001)
    np5di_l1.output('NP.5di', 'NP.5di : Extension beyond COMP: For Outside DNWELL, inside Nwell: (i) For Nwell overlap of Nplus < 0.43um. : 0.16µm')
    np5di_l1.forget

    np_5di_background.forget

    np_5di_extend.forget

    np_5di_foreground.forget

    np_5dii_background = nplus.not_outside(nwell).outside(dnwell).edges.not(pplus.edges)
    np_5dii_extend     = nwell.outside(dnwell).sized(-0.429.um)
    np_5dii_foreground = ncomp.not_outside(nwell).outside(dnwell).edges.not(pplus.edges).and(np_5dii_extend)
    # Rule NP.5dii: Extension beyond COMP: For Outside DNWELL, inside Nwell: (ii) For Nwell overlap of Nplus >= 0.43um. is 0.02µm
    logger.info('Executing rule NP.5dii')
    np5dii_l1 = np_5dii_background.enclosing(np_5dii_foreground, 0.02.um, euclidian).polygons(0.001)
    np5dii_l1.output('NP.5dii', 'NP.5dii : Extension beyond COMP: For Outside DNWELL, inside Nwell: (ii) For Nwell overlap of Nplus >= 0.43um. : 0.02µm')
    np5dii_l1.forget

    np_5dii_background.forget

    np_5dii_extend.forget

    np_5dii_foreground.forget

    # Rule NP.6: Overlap with NCOMP butted to PCOMP. is 0.22µm
    logger.info('Executing rule NP.6')
    np6_l1 = comp.interacting(nplus).enclosing(pcomp.interacting(nplus), 0.22.um, projection).polygons
    np6_l1.output('NP.6', 'NP.6 : Overlap with NCOMP butted to PCOMP. : 0.22µm')
    np6_l1.forget

    # Rule NP.7: Space to unrelated unsalicided Poly2. is 0.18µm
    logger.info('Executing rule NP.7')
    np7_l1  = nplus.separation(poly2.and(sab), 0.18.um, euclidian).polygons(0.001)
    np7_l1.output('NP.7', 'NP.7 : Space to unrelated unsalicided Poly2. : 0.18µm')
    np7_l1.forget

    # Rule NP.8a: Minimum Nplus area (um2). is 0.35µm²
    logger.info('Executing rule NP.8a')
    np8a_l1  = nplus.with_area(nil, 0.35.um)
    np8a_l1.output('NP.8a', 'NP.8a : Minimum Nplus area (um2). : 0.35µm²')
    np8a_l1.forget

    # Rule NP.8b: Min. Nplus hole area is 0.35µm²
    logger.info('Executing rule NP.8b')
    np8b_l1  = nplus.holes.with_area(nil, 0.35.um)
    np8b_l1.output('NP.8b', 'NP.8b : Min. Nplus hole area : 0.35µm²')
    np8b_l1.forget

    # Rule NP.9: Overlap of unsalicided Poly2. is 0.18µm
    logger.info('Executing rule NP.9')
    np9_l1 = nplus.enclosing(poly2.and(sab), 0.18.um, euclidian).polygons(0.001)
    np9_l2 = poly2.and(sab).not_outside(nplus).not(nplus)
    np9_l  = np9_l1.or(np9_l2)
    np9_l.output('NP.9', 'NP.9 : Overlap of unsalicided Poly2. : 0.18µm')
    np9_l1.forget
    np9_l2.forget
    np9_l.forget

    # Rule NP.10: Overlap of unsalicided COMP. is 0.18µm
    logger.info('Executing rule NP.10')
    np10_l1 = nplus.enclosing(comp.and(sab), 0.18.um, euclidian).polygons(0.001)
    np10_l1.output('NP.10', 'NP.10 : Overlap of unsalicided COMP. : 0.18µm')
    np10_l1.forget

    np_11_in_dnwell = nplus.interacting(nplus.edges.and(pcomp.edges).and(lvpwell.inside(dnwell).not(lvpwell.inside(dnwell).sized(-0.429.um))))
    np_11_out_dnwell = nplus.interacting(nplus.edges.and(pcomp.edges).and(nwell.outside(dnwell).sized(0.429.um)))
    # Rule NP.11: Butting Nplus and PCOMP is forbidden within 0.43um of Nwell edge (for outside DNWELL) and of LVPWELL edge (for inside DNWELL case).
    logger.info('Executing rule NP.11')
    np11_l1 = np_11_in_dnwell.or(np_11_out_dnwell)
    np11_l1.output('NP.11', 'NP.11 : Butting Nplus and PCOMP is forbidden within 0.43um of Nwell edge (for outside DNWELL) and of LVPWELL edge (for inside DNWELL case).')
    np11_l1.forget

    np_11_in_dnwell.forget

    np_11_out_dnwell.forget

    # Rule NP.12: Overlap with P-channel poly2 gate extension is forbidden within 0.32um of P-channel gate.
    logger.info('Executing rule NP.12')
    np12_l1 = nplus.interacting(nplus.edges.separation(pgate.edges.and(pcomp.edges), 0.32.um, euclidian).polygons(0.001))
    np12_l1.output('NP.12', 'NP.12 : Overlap with P-channel poly2 gate extension is forbidden within 0.32um of P-channel gate.')
    np12_l1.forget


end #FEOL
