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

    #================================================
    #----------------------SAB-----------------------
    #================================================ 

    # Rule SB.1: min. sab width is 0.43µm
    logger.info('Executing rule SB.1')
    sb1_l1  = sab.width(0.43.um, euclidian).polygons(0.001)
    sb1_l1.output('SB.1', 'SB.1 : min. sab width : 0.43µm')
    sb1_l1.forget 

    # Rule SB.2: min. sab spacing is 0.43µm
    logger.info('Executing rule SB.2')
    sb2_l1  = sab.space(0.43.um, euclidian).polygons(0.001)
    sb2_l1.output('SB.2', 'SB.2 : min. sab spacing : 0.43µm')
    sb2_l1.forget 

    # Rule SB.3: Space from salicide block to unrelated COMP. is 0.22µm
    logger.info('Executing rule SB.3')
    sb3_l1  = sab.outside(comp).separation(comp.outside(sab), 0.22.um, euclidian).polygons(0.001)
    sb3_l1.output('SB.3', 'SB.3 : Space from salicide block to unrelated COMP. : 0.22µm')
    sb3_l1.forget 

    # Rule SB.4: Space from salicide block to contact.
    logger.info('Executing rule SB.4')
    sb4_l1 = sab.separation(contact, 0.22.um, euclidian).polygons(0.001).or(sab.and(contact))
    sb4_l1.output('SB.4', 'SB.4 : Space from salicide block to contact.')
    sb4_l1.forget

    # Rule SB.5a: Space from salicide block to unrelated Poly2 on field. is 0.3µm
    logger.info('Executing rule SB.5a')
    sb5a_l1  = sab.outside(poly2.not(comp)).separation(poly2.not(comp).outside(sab), 0.3.um, euclidian).polygons(0.001)
    sb5a_l1.output('SB.5a', 'SB.5a : Space from salicide block to unrelated Poly2 on field. : 0.3µm')
    sb5a_l1.forget 

    # Rule SB.5b: Space from salicide block to unrelated Poly2 on COMP. is 0.4µm
    logger.info('Executing rule SB.5b')
    sb5b_l1  = sab.outside(tgate).separation(tgate.outside(sab), 0.4.um, euclidian).polygons(0.001)
    sb5b_l1.output('SB.5b', 'SB.5b : Space from salicide block to unrelated Poly2 on COMP. : 0.4µm')
    sb5b_l1.forget 

    # Rule SB.6: Salicide block extension beyond related COMP. is 0.22µm
    logger.info('Executing rule SB.6')
    sb6_l1 = sab.enclosing(comp, 0.22.um, euclidian).polygons(0.001)
    sb6_l1.output('SB.6', 'SB.6 : Salicide block extension beyond related COMP. : 0.22µm')
    sb6_l1.forget

    # Rule SB.7: COMP extension beyond related salicide block. is 0.22µm
    logger.info('Executing rule SB.7')
    sb7_l1 = comp.enclosing(sab, 0.22.um, euclidian).polygons
    sb7_l1.output('SB.7', 'SB.7 : COMP extension beyond related salicide block. : 0.22µm')
    sb7_l1.forget

    # Rule SB.8: Non-salicided contacts are forbidden.
    logger.info('Executing rule SB.8')
    sb8_l1 = contact.inside(sab)
    sb8_l1.output('SB.8', 'SB.8 : Non-salicided contacts are forbidden.')
    sb8_l1.forget

    # Rule SB.9: Salicide block extension beyond unsalicided Poly2. is 0.22µm
    logger.info('Executing rule SB.9')
    sb9_l1 = sab.enclosing(poly2.and(sab), 0.22.um, euclidian).polygons
    sb9_l1.output('SB.9', 'SB.9 : Salicide block extension beyond unsalicided Poly2. : 0.22µm')
    sb9_l1.forget

    # Rule SB.10: Poly2 extension beyond related salicide block. is 0.22µm
    logger.info('Executing rule SB.10')
    sb10_l1 = poly2.enclosing(sab, 0.22.um, euclidian).polygons(0.001)
    sb10_l1.output('SB.10', 'SB.10 : Poly2 extension beyond related salicide block. : 0.22µm')
    sb10_l1.forget

    # Rule SB.11: Overlap with COMP. is 0.22µm
    logger.info('Executing rule SB.11')
    sb11_l1 = sab.overlap(comp, 0.22.um, euclidian).polygons
    sb11_l1.output('SB.11', 'SB.11 : Overlap with COMP. : 0.22µm')
    sb11_l1.forget

    # Rule SB.12: Overlap with Poly2. is 0.22µm
    logger.info('Executing rule SB.12')
    sb12_l1 = sab.overlap(poly2, 0.22.um, euclidian).polygons
    sb12_l1.output('SB.12', 'SB.12 : Overlap with Poly2. : 0.22µm')
    sb12_l1.forget

    # Rule SB.13: Min. area (um2). is 2µm²
    logger.info('Executing rule SB.13')
    sb13_l1  = sab.with_area(nil, 2.um)
    sb13_l1.output('SB.13', 'SB.13 : Min. area (um2). : 2µm²')
    sb13_l1.forget 

    # Rule SB.14a: Space from unsalicided Nplus Poly2 to unsalicided Pplus Poly2. (Unsalicided Nplus Poly2 must not fall within a square of 0.56um x 0.56um at unsalicided Pplus Poly2 corners). is 0.56µm
    logger.info('Executing rule SB.14a')
    sb14a_l1 = poly2.and(nplus).and(sab).separation(poly2.and(pplus).and(sab), 0.56.um, square).polygons
    sb14a_l1.output('SB.14a', 'SB.14a : Space from unsalicided Nplus Poly2 to unsalicided Pplus Poly2. (Unsalicided Nplus Poly2 must not fall within a square of 0.56um x 0.56um at unsalicided Pplus Poly2 corners). : 0.56µm')
    sb14a_l1.forget

    # Rule SB.14b: Space from unsalicided Nplus Poly2 to P-channel gate. (Unsalicided Nplus Poly2 must not fall within a square of 0.56um x 0.56um at P-channel gate corners). is 0.56µm
    logger.info('Executing rule SB.14b')
    sb14b_l1 = poly2.and(nplus).and(sab).separation(pgate, 0.56.um, square).polygons
    sb14b_l1.output('SB.14b', 'SB.14b : Space from unsalicided Nplus Poly2 to P-channel gate. (Unsalicided Nplus Poly2 must not fall within a square of 0.56um x 0.56um at P-channel gate corners). : 0.56µm')
    sb14b_l1.forget

    # Rule SB.15a: Space from unsalicided Poly2 to unrelated Nplus/Pplus. is 0.18µm
    logger.info('Executing rule SB.15a')
    sb15a_l1  = poly2.and(sab).separation(nplus.or(pplus), 0.18.um, euclidian).polygons(0.001)
    sb15a_l1.output('SB.15a', 'SB.15a : Space from unsalicided Poly2 to unrelated Nplus/Pplus. : 0.18µm')
    sb15a_l1.forget 

    sb_15b_1 = poly2.interacting(nplus.or(pplus)).and(sab).edges.not(poly2.edges.and(sab)).separation(nplus.or(pplus).edges, 0.32.um, projection).polygons(0.001)
    sb_15b_2 = poly2.interacting(nplus.or(pplus)).and(sab).separation(nplus.or(pplus), 0.32.um, projection).polygons(0.001)
    # Rule SB.15b: Space from unsalicided Poly2 to unrelated Nplus/Pplus along Poly2 line. is 0.32µm
    logger.info('Executing rule SB.15b')
    sb15b_l1 = sb_15b_1.and(sb_15b_2)
    sb15b_l1.output('SB.15b', 'SB.15b : Space from unsalicided Poly2 to unrelated Nplus/Pplus along Poly2 line. : 0.32µm')
    sb15b_l1.forget

    sb_15b_1.forget

    sb_15b_2.forget


end #FEOL
