| ################################################################################################ |
| # 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 |
| |
| #================================================ |
| #-------------------DUALGATE_2------------------- |
| #================================================ |
| |
| # Rule DV2.1: Min. DV2 enclose DNWELL. is 0.5µm |
| logger.info('Executing rule DV2.1') |
| dv21_l1 = dualgate_2.enclosing(dnwell, 0.5.um, euclidian).polygons(0.001) |
| dv21_l2 = dnwell.not_outside(dualgate_2).not(dualgate_2) |
| dv21_l = dv21_l1.or(dv21_l2) |
| dv21_l.output('DV2.1', 'DV2.1 : Min. Dualgate enclose DNWELL. : 0.5µm') |
| dv21_l1.forget |
| dv21_l2.forget |
| dv21_l.forget |
| |
| # Rule DV2.2: Min. DV2 Space. Merge if Space is less than this design rule. is 0.44µm |
| logger.info('Executing rule DV2.2') |
| dv22_l1 = dualgate_2.space(0.44.um, euclidian).polygons(0.001) |
| dv22_l1.output('DV2.2', 'DV2.2 : Min. Dualgate Space. Merge if Space is less than this design rule. : 0.44µm') |
| dv22_l1.forget |
| |
| # Rule DV2.3: Min. DV2 to COMP space [unrelated]. is 0.24µm |
| logger.info('Executing rule DV2.3') |
| dv23_l1 = dualgate_2.separation(comp.outside(dualgate_2), 0.24.um, euclidian).polygons(0.001) |
| dv23_l1.output('DV2.3', 'DV2.3 : Min. Dualgate to COMP space [unrelated]. : 0.24µm') |
| dv23_l1.forget |
| |
| # rule DV2.4 is not a DRC check |
| |
| # Rule DV2.5: Min. DV2 width. is 0.7µm |
| logger.info('Executing rule DV2.5') |
| dv25_l1 = dualgate_2.width(0.7.um, euclidian).polygons(0.001) |
| dv25_l1.output('DV2.5', 'DV2.5 : Min. Dualgate width. : 0.7µm') |
| dv25_l1.forget |
| |
| # Rule DV2.6: Min. DV2 enclose COMP is 0.24µm |
| logger.info('Executing rule DV2.6') |
| dv26_l1 = dualgate_2.enclosing(comp, 0.24.um, euclidian).polygons(0.001) |
| dv26_l2 = comp.not_outside(dualgate_2).not(dualgate_2) |
| dv26_l = dv26_l1.or(dv26_l2) |
| dv26_l.output('DV2.6', 'DV2.6 : Min. Dualgate enclose COMP : 0.24µm') |
| dv26_l1.forget |
| dv26_l2.forget |
| dv26_l.forget |
| |
| # Rule DV2.7: COMP can not be partially overlapped by DV2. |
| logger.info('Executing rule DV2.7') |
| dv27_l1 = dualgate_2.not_outside(comp).not(dualgate_2.covering(comp)) |
| dv27_l1.output('DV2.7', 'DV2.7 : COMP can not be partially overlapped by DV2.') |
| dv27_l1.forget |
| |
| |
| # Rule DV2.8: Min DV2 Overlap of MV (5/6V) transistor gate is 0.4µm |
| logger.info('Executing rule DV2.8') |
| dv28_l1 = dualgate_2.enclosing(tgate, 0.4.um, euclidian).polygons(0.001) |
| dv28_l2 = tgate.not_outside(dualgate_2).not(dualgate_2) |
| dv28_l = dv28_l1.or(dv28_l2) |
| dv28_l.output('DV2.8', 'DV2.8 : Min Dualgate Overlap of MV (5/6V) transistor gate : 0.4µm') |
| dv28_l1.forget |
| dv28_l2.forget |
| dv28_l.forget |
| |
| # Rule DV2.9 : Min Space to Dualgate is 1.0µm |
| logger.info('Executing rule DV2.9') |
| dv29_l1 = dualgate_2.separation(dualgate,1.0.um).polygons(0.001) |
| dv29_l1.output('DV2.9','DV2.9 : Min Space to Dualgate is 1.0µm') |
| dv29_l1.forget |
| |
| # Rule DV2.10: 1.8V,3.3V and 5V/6V PMOS cannot be sitting inside same NWELL. |
| logger.info('Executing rule DV2.10') |
| dv210_l1 = nwell.covering(pgate.and(dualgate_2)).covering(pgate.not_inside(v5_xtor).not_inside(dualgate_2).not_inside(dualgate)) |
| dv210_l1.output('DV2.10', 'DV2.10 : 1.8V,3.3V and 5V/6V PMOS cannot be sitting inside same NWELL.') |
| dv210_l1.forget |
| |
| end #FEOL |