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

    #==========================================================
    #----------------- Metal Shield Slotting ------------------
    #==========================================================

    # Rule MSLOT.1_MS : Maximum metal shield width without slotting ((Exclude Top Metal layer overlapping with TANRES_MK))
    logger.info('Executing rule MSLOT.1_MS') 
    mslot1_ms = metal_shield.not(metal_shield.width(30.001.um).polygons(0.001)).not_interacting(metal_shield_slot).not(top_metal.interacting(tanres_mk))
    mslot1_ms.output('MSLOT.1_MS','MSLOT.1_MS : Maximum metaltop width without slotting ((Exclude Top Metal layer overlapping with TANRES_MK))')
    mslot1_ms.forget

    # Rule MSLOT.2_MS  : Minimum metal_shield slot width (slot layers)
    logger.info('Executing rule MSLOT.2_MS')
    mslot2_ms = metal_shield_slot.width(2.0.um).polygons(0.001)
    mslot2_ms.output('MSLOT.2_MS','MSLOT.2_MS  : Minimum metal_shield slot width (slot layers)') 
    mslot2_ms.forget

    # Rule MSLOT.3a_MS : Minimum metal_shield Slot length (slot mark layers) 
    logger.info('Executing rule MSLOT.3a_MS')
    mslot3a_ms = metal_shield_slot.with_bbox_max(nil,10.um)
    mslot3a_ms.output('MSLOT.3a_MS','MSLOT.3a_MS : Minimum metal_shield Slot length (slot mark layers) ')
    mslot3a_ms.forget

    # Rule MSLOT.3b_MS : Maximum  metal_shield Slot length (slot mark layers) is 250 um
    logger.info('Executing rule MSLOT.3b_MS')
    mslot3b_ms = metal_shield_slot.with_bbox_max(250.001,nil)
    mslot3b_ms.output('MSLOT.3b_MS','MSLOT.3b_MS : Maximum Slot length (slot mark layers) is 250 um')
    mslot3b_ms.forget

    # Rule MSLOT.4a_MS : Minimum metal_shield Slot space (slot mark layers) is 10 um
    logger.info('Executing rule MSLOT.4a_MS')
    mslot4a_ms = metal_shield_slot.space(10.um).polygons(0.001)
    mslot4a_ms.output('MSLOT.4a_MS','MSLOT.4a_MS : Minimum metal_shield Slot space (slot mark layers) is 10 um')
    mslot4a_ms.forget

    if metal_shield_slot.count() > 1 
        # Rule MSLOT.4b_MS : Maximum metal_shield Slot space (slot mark layers) is 30 um
        logger.info('Executing rule MSLOT.4b_MS')
        mslot4b_ms = metal_shield_slot.not_interacting(metal_shield_slot.space(30.001.um).polygons(0.001))
        mslot4b_ms.output('MSLOT.4b_MS','MSLOT.4b_MS : Maximum metal_shield Slot space (slot mark layers) is 30µm')
        mslot4b_ms.forget
    end 

    # Rule MSLOT.5_MS : Minimum metal_shield slot (slot mark layers) to metal_shield edge spacing is 10 um 
    logger.info('Executing rule MSLOT.5_MS')
    mslot5_ms_l1 = metal_shield.enclosing(metal_shield_slot,10.0.um).polygons(0.001)
    mslot5_ms_l2 = metal_shield_slot.not_inside(metal_shield)
    mslot5_ms = mslot5_ms_l1.or(mslot5_ms_l2)
    mslot5_ms.output('MSLOT.5_MS','MSLOT.5_MS : Minimum metal_shield slot (slot mark layers) to metal_shield edge spacing is 10 um')
    mslot5_ms_l1.forget
    mslot5_ms_l2.forget
    mslot5_ms.forget

    # Rule MSLOT.8_MS : Minimum space from metal_shield_via to metal_shield slot is 0.2 um
    logger.info('Executing rule MSLOT.8_MS')
    mslot8_ms = metal_shield_via.separation(metal_shield_slot,0.2.um).polygons(0.001).or(metal_shield_via.not_outside(metal_shield_slot))
    mslot8_ms.output('MSLOT.8_MS','MSLOT.8_MS : Minimum space from metal_shield_via to metal_shield slot is 0.2 um')
    mslot8_ms.forget

    # Rule MSLOT.9a : No slotting allowed for Top Metal or METAL_SHIELD area directly under the Pad , Minimum distance to pad is 5.0 um 
    logger.info('Executing rule MSLOT.9a')
    mslot9a_l1 = top_metal_slot.or(metal_shield_slot).interacting(pad)
    mslot9a_l2 = top_metal_slot.or(metal_shield_slot).separation(pad,5.0.um).polygons(0.001)
    mslot9a_l3 = top_metal.holes.or(metal_shield.holes).interacting(pad)
    mslot9a_l = mslot9a_l1.or(mslot9a_l2.or(mslot9a_l3))
    mslot9a_l.output('MSLOT.9a','MSLOT.9a : No slotting allowed for Top Metal or METAL_SHIELD area directly under the Pad , Minimum distance to pad is 5.0 um ')
    mslot9a_l.forget
    mslot9a_l1.forget
    mslot9a_l2.forget
    mslot9a_l3.forget

    if TANRES_OPTION == 'B'     
        # Rule MSLOT.9b_TANRES_OptionB : No slotting allowed for Bottom plate directly under TANRES , Minimum distance to TANRES is 5.0 um
        mslot9b_tanB_l1 = top_metal_slot.or(top_metal.holes).interacting(tanres)
        mslot9b_tanB_l2 = top_metal_slot.separation(tanres,5.0.um).polygons(0.001)
        mslot9b_tanB = mslot9b_tanB_l1.or(mslot9b_tanB_l2)
        mslot9b_tanB.output('MSLOT.9b_TANRES_OptionB','MSLOT.9b_TANRES_OptionB : No slotting allowed for Bottom plate directly under TANRES , Minimum distance to TANRES is 5.0 um')
        mslot9b_tanB_l1.forget
        mslot9b_tanB_l2.forget
        mslot9b_tanB.forget 

        # Rule MSLOT.9d_TANRES_OptionB : metal_shield slots are not allowed to interact with metal_shield_via in TANRES area
        logger.info('Executing rule MSLOT.9d_TANRES_OptionB')
        mslot9d_l1 = metal_shield_slot.interacting(metal_shield_via).interacting(tanres_mk)
        mslot9d_l1.output('MSLOT.9d_TANRES_OptionB','MSLOT.9d_TANRES_OptionB : metal_shield slots are not allowed to interact with metal_shield_via in TANRES area ') 
        mslot9d_l1.forget        
    end 

    mslot9c_sl = top_metal_slot.or(topmin1_metal_slot.interacting(metal_shield))
    mslot9c_hl = top_metal.holes.or(topmin1_metal.holes.interacting(metal_shield))
    # Rule MSLOT.9c :No slotting allowed for the following cases : Without metal shielding, Top Metal1 directly under FuseWindow_D With metal shielding, Top Metal1 and Top Metal–12 directly under FuseWindow_D
    logger.info('Executing rule MSLOT.9c') 
    mslot9c_l1 =  mslot9c_sl.or(mslot9c_hl).interacting(fusewindow_d)
    mslot9c_l2 = mslot9c_sl.or(mslot9c_hl).separation(fusewindow_d,5.0.um).polygons(0.001)
    mslot9c_l = mslot9c_l1.or(mslot9c_l2)
    mslot9c_l.output('MSLOT.9c','MSLOT.9c :No slotting allowed for the following cases : Without metal shielding, Top Metal1 directly under FuseWindow_D With metal shielding, Top Metal1 and Top Metal–12 directly under FuseWindow_D')
    mslot9c_l1.forget 
    mslot9c_l2.forget 
    mslot9c_l.forget 

    ubm = ubmpperi.or(ubmparray.or(ubmeplate))
    # Rule MSLOT.9e : No slotting allowed for Top Metal or METAL_SHIELD area directly under UMB layers
    logger.info('Executing rule MSLOT.9e')
    mslot9e_l1 = top_metal_slot.or(metal_shield_slot.or(top_metal.holes.or(metal_shield.holes))).interacting(ubm)
    mslot9e_l2 = top_metal_slot.or(metal_shield_slot.or(top_metal.holes.or(metal_shield.holes))).separation(ubm,5.0.um).polygons(0.001)
    mslot9e_l = mslot9e_l1.or(mslot9e_l2)
    mslot9e_l.output('MSLOT.9e','MSLOT.9e : No slotting allowed for Top Metal or METAL_SHIELD area directly under UMB layers')
    mslot9e_l1.forget
    mslot9e_l2.forget
    mslot9e_l.forget

    # Rule MSLOT.10_MS : Slot mark layer (metal_shield slot) on the metal_shield hole are not allowed
    logger.info('Executing rule MSLOT.10_MS')
    mslot10_ms = metal_shield_slot.interacting(metal_shield.holes)
    mslot10_ms.output('MSLOT.10_MS','MSLOT.10_MS : Slot mark layer (metal_shield slot) on the metal_shield hole are not allowed')
    mslot10_ms.forget

end #BEOL
