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