################################################################################################
# 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).polygons(0.001)
    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 or metal_shield_via to the edge of UBM opening is 2.0 µm')
    tm8_l1.forget 

end #BEOL
