################################################################################################
# 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