| ############################################################################################### |
| # 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 |
| |
| #================================================ |
| #----------------P+ POLY RESISTOR---------------- |
| #================================================ |
| |
| pres_poly = poly2.and(pplus).interacting(sab).interacting(res_mk).not_interacting(resistor) |
| # Rule PRES.1: Minimum width of Poly2 resistor. is 0.8µm |
| logger.info('Executing rule PRES.1') |
| pres1_l1 = pres_poly.width(0.8.um, euclidian).polygons(0.001) |
| pres1_l1.output('PRES.1', 'PRES.1 : Minimum width of Poly2 resistor. : 0.8µm') |
| pres1_l1.forget |
| |
| # Rule PRES.2: Minimum space between Poly2 resistors. is 0.4µm |
| logger.info('Executing rule PRES.2') |
| pres2_l1 = pres_poly.isolated(0.4.um, euclidian).polygons(0.001) |
| pres2_l1.output('PRES.2', 'PRES.2 : Minimum space between Poly2 resistors. : 0.4µm') |
| pres2_l1.forget |
| |
| # Rule PRES.3: Minimum space from Poly2 resistor to COMP. |
| logger.info('Executing rule PRES.3') |
| pres3_l1 = pres_poly.separation(comp, 0.6.um, euclidian).polygons(0.001).or(comp.not_outside(pres_poly)) |
| pres3_l1.output('PRES.3', 'PRES.3 : Minimum space from Poly2 resistor to COMP.') |
| pres3_l1.forget |
| |
| # Rule PRES.4: Minimum space from Poly2 resistor to unrelated Poly2. is 0.6µm |
| logger.info('Executing rule PRES.4') |
| pres4_l1 = pres_poly.separation(poly2.not_interacting(sab), 0.6.um, euclidian).polygons(0.001) |
| pres4_l1.output('PRES.4', 'PRES.4 : Minimum space from Poly2 resistor to unrelated Poly2. : 0.6µm') |
| pres4_l1.forget |
| |
| # Rule PRES.5: Minimum Plus implant overlap of Poly2 resistor. is 0.3µm |
| logger.info('Executing rule PRES.5') |
| pres5_l1 = pplus.enclosing(pres_poly, 0.3.um, euclidian).polygons(0.001) |
| pres5_l2 = pres_poly.not_outside(pplus).not(pplus) |
| pres5_l = pres5_l1.or(pres5_l2) |
| pres5_l.output('PRES.5', 'PRES.5 : Minimum Plus implant overlap of Poly2 resistor. : 0.3µm') |
| pres5_l1.forget |
| pres5_l2.forget |
| pres5_l.forget |
| |
| # Rule PRES.6: Minimum salicide block overlap of Poly2 resistor in width direction. is 0.3µm |
| logger.info('Executing rule PRES.6') |
| pres6_l1 = sab.enclosing(pres_poly,0.3.um).polygons(0.001) |
| pres6_l1.output('PRES.6', 'PRES.6 : Minimum salicide block overlap of Poly2 resistor in width direction. : 0.3µm') |
| pres6_l1.forget |
| |
| # Rule PRES.7: Space from salicide block to contact on Poly2 resistor. |
| logger.info('Executing rule PRES.7') |
| pres7_l1 = contact.inside(pres_poly).separation(sab,0.22.um).polygons(0.001).or(contact.inside(pres_poly).interacting(sab)) |
| pres7_l1.output('PRES.7', 'PRES.7 : Space from salicide block to contact on Poly2 resistor.') |
| pres7_l1.forget |
| |
| end #FEOL |