################################################################################################
# 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 or metal_shield_via to the edge of UBM opening is 2.0 µm
    logger.info('Executing rule TM.8')
    tm8_l1 = ubm.extents.separation(top_via.or(metal_shield_via),2.0.um).polygons(0.001)
    tm8_l1.output('TM.8','TM.8 : Space from edge of top via or metal_shield_via to the edge of UBM opening is 2.0 µm')
    tm8_l1.forget 
    
    # Rule TM.9 : Partially overlap of top via or metal_shield_via with passivation opening is not allowed
    logger.info('Executing rule TM.9')
    tm9_l1 = top_via.or(metal_shield_via).not_inside(pad).not_outside(pad)
    tm9_l1.output('TM.9','TM.9 : Partially overlap of top via or metal_shield_via with passivation opening is not allowed')
    tm9_l1.forget
    
    # Rule TM.10 : Space from edge of top via or metal_shield_via to the edge of passivation opening is 2.0 µm
    logger.info('Executing rule TM.10')
    tm10_l1 = pad.enclosing(top_via.or(metal_shield_via),2.0.um)
    tm10_l1.output('TM.10','TM.10 : Space from edge of top via or metal_shield_via to the edge of passivation opening is 2.0 µm')
    tm10_l1.forget

end #BEOL
