| ################################################################################################ |
| # 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 BEOL |
| |
| #==================================================== |
| #-------------------- TOP Metal---------------------- |
| #==================================================== |
| |
| # Rule TM.1a : Min Passivation Opening is 40µm |
| logger.info('Executing rule TM.1a') |
| tm1a_l1 = pad.extents.width(40.0.um).polygons(0.001) |
| tm1a_l1.output('TM.1a','TM.1a : Min Passivation Opening is 40µm') |
| tm1a_l1.forget |
| |
| # Rule TM.2a : Min UBM Opening (defined by the layers UBMPArray) is 60µm |
| logger.info('Executing rule TM.2a') |
| tm2a_l1 = ubmparray.extents.width(60.um) |
| tm2a_l1.output('TM.2a','TM.2a : Min UBM Opening (defined by the layers UBMPArray) is 60µm') |
| tm2a_l1.forget |
| |
| # Rule TM.3a : Min Bump Pad is 72µm |
| logger.info('Executing rule TM.3a') |
| tm3a_l1 = top_metal.extents.width(72.um) |
| tm3a_l1.output('TM.3a','TM.3a : Min Bump Pad is 72µm') |
| tm3a_l1.forget |
| |
| # Rule TM.4 : Space from centre of bump pad (pad mask) to Die Edge (Outer edge of GUARD_RING_MK marking) is 90µm |
| logger.info('Executing rule TM.4') |
| tm4_l1 = pad.middle.separation(guard_ring_mk,90.um) |
| tm4_l1.output('TM.4','TM.4 : Space from centre of bump pad (pad mask) to Die Edge (Outer edge of GUARD_RING_MK marking) is 90µm') |
| tm4_l1.forget |
| |
| # Rule TM.5 : Min allowable bump pitch is 148 µm |
| logger.info('Executing rule TM.5') |
| tm5_l1 = pad.middle.space(148.um).polygons(0.001) |
| tm5_l1.output('TM.5','TM.5: Min allowable bump pitch is 148 µm ') |
| tm5_l1.forget |
| |
| ubm = ubmpperi.or(ubmparray.or(ubmeplate)) |
| # Rule TM.6 : Pad without UBM layers is not allowed except the Pad under PROBE_MK marking. |
| logger.info('Executing rule TM.6') |
| tm6_l1 = pad.not_interacting(ubm).not(probe_mk) |
| tm6_l1.output('TM.6','TM.6 : Pad without UBM layers is not allowed except the Pad under PROBE_MK marking.') |
| tm6_l1.forget |
| |
| # Rule TM.7 : Shape of the Pad shall be at least octagonal (or more closer to circular) except the Pad under PROBE_MK marking. |
| logger.info('Executing rule TM.7') |
| tm7_l1 = pad.drc(primary.edges.count < 8).not(probe_mk) |
| tm7_l1.output('TM.7','TM.7 : Shape of the Pad shall be at least octagonal (or more closer to circular) except the Pad under PROBE_MK marking.') |
| tm7_l1.forget |
| |
| # Rule TM.8 : Space from edge of top via to the edge of UBM opening is 2.0 µm |
| logger.info('Executing rule TM.8') |
| tm8_l1 = ubm.extents.separation(top_via,2.0.um).polygons(0.001) |
| tm8_l1.output('TM.8','TM.8 : Space from edge of top via to the edge of UBM opening is 2.0 µm') |
| tm8_l1.forget |
| |
| # Rule TM.9 : Partially overlap of top via with passivation opening is not allowed |
| logger.info('Executing rule TM.9') |
| tm9_l1 = top_via.not_inside(pad).not_outside(pad) |
| tm9_l1.output('TM.9','TM.9 : Partially overlap of top via with passivation opening is not allowed') |
| tm9_l1.forget |
| |
| # Rule TM.10 : Space from edge of top via to the edge of passivation opening is 2.0 µm |
| logger.info('Executing rule TM.10') |
| tm10_l1 = pad.enclosing(top_via,2.0.um) |
| tm10_l1.output('TM.10','TM.10 : Space from edge of top via to the edge of passivation opening is 2.0 µm') |
| tm10_l1.forget |
| |
| end #BEOL |