| ################################################################################################ |
| # 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 |
| |
| #================================================ |
| #--------------------dualgate2_d----------------- |
| #================================================ |
| |
| |
| # Rule DV2.2: Min. dualgate2_d Space. Merge if Space is less than this design rule. is 0.44µm |
| logger.info('Executing rule DV2.2') |
| dv2_l1 = dualgate2_d.space(0.44.um, euclidian).polygons(0.001) |
| dv2_l1.output('DV2.2', 'DV2.2 : Min. dualgate2_d Space. Merge if Space is less than this design rule. : 0.44µm') |
| dv2_l1.forget |
| |
| # Rule DV2.3: Min. dualgate2_d to COMP space [unrelated]. is 0.24µm |
| logger.info('Executing rule DV2.3') |
| dv3_l1 = dualgate2_d.separation(comp.outside(dualgate2_d), 0.24.um, euclidian).polygons(0.001) |
| dv3_l1.output('DV2.3', 'DV2.3 : Min. dualgate2_d to COMP space [unrelated]. : 0.24µm') |
| dv3_l1.forget |
| |
| |
| # Rule DV2.5: Min. dualgate2_d width. is 0.7µm |
| logger.info('Executing rule DV2.5') |
| dv5_l1 = dualgate2_d.width(0.7.um, euclidian).polygons(0.001) |
| dv5_l1.output('DV2.5', 'DV2.5 : Min. dualgate2_d width. : 0.7µm') |
| dv5_l1.forget |
| |
| comp_dv = comp.not(pcomp.outside(nwell)) |
| # Rule DV2.6: Min. dualgate2_d enclose COMP (except substrate tap). is 0.24µm |
| logger.info('Executing rule DV2.6') |
| dv6_l1 = dualgate2_d.enclosing(comp_dv, 0.24.um, euclidian).polygons(0.001) |
| dv6_l2 = comp_dv.not_outside(dualgate2_d).not(dualgate2_d) |
| dv6_l = dv6_l1.or(dv6_l2) |
| dv6_l.output('DV2.6', 'DV2.6 : Min. dualgate2_d enclose COMP (except substrate tap). : 0.24µm') |
| dv6_l1.forget |
| dv6_l2.forget |
| dv6_l.forget |
| |
| # Rule DV2.7: COMP (except substrate tap) can not be partially overlapped by dualgate2_d. |
| logger.info('Executing rule DV2.7') |
| dv7_l1 = dualgate2_d.not_outside(comp_dv).not(dualgate2_d.covering(comp_dv)) |
| dv7_l1.output('DV2.7', 'DV2.7 : COMP (except substrate tap) can not be partially overlapped by dualgate2_d.') |
| dv7_l1.forget |
| |
| comp_dv.forget |
| |
| # Rule DV2.8: Min dualgate2_d enclose gate (Poly2 AND COMP). is 0.4µm |
| logger.info('Executing rule DV2.8') |
| dv8_l1 = dualgate2_d.enclosing(tgate, 0.4.um, euclidian).polygons(0.001) |
| dv8_l2 = tgate.not_outside(dualgate2_d).not(dualgate2_d) |
| dv8_l = dv8_l1.or(dv8_l2) |
| dv8_l.output('DV2.8', 'DV2.8 : Min dualgate2_d enclose gate (Poly2 AND COMP). : 0.4µm') |
| dv8_l1.forget |
| dv8_l2.forget |
| dv8_l.forget |
| |
| end #FEOL |