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

    #======================================================
    #----------------- MetalTop Slotting ------------------
    #======================================================

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

    # Rule MSLOT.2_MT  : Minimum metaltop slot width (slot layers)
    logger.info('Executing rule MSLOT.2_MT')
    mslot2_mt = top_metal_slot.width(2.0.um).polygons(0.001)
    mslot2_mt.output('MSLOT.2_MT','MSLOT.2_MT  : Minimum metaltop slot width (slot layers)') 
    mslot2_mt.forget

    # Rule MSLOT.3a_MT : Minimum metaltop Slot length (slot mark layers) 
    logger.info('Executing rule MSLOT.3a_MT')
    mslot3a_mt = top_metal_slot.with_bbox_max(nil,10.um)
    mslot3a_mt.output('MSLOT.3a_MT','MSLOT.3a_MT : Minimum metaltop Slot length (slot mark layers) ')
    mslot3a_mt.forget

    # Rule MSLOT.3b_MT : Maximum  metaltop Slot length (slot mark layers) is 250 um
    logger.info('Executing rule MSLOT.3b_MT')
    mslot3b_mt = top_metal_slot.with_bbox_max(250.001,nil)
    mslot3b_mt.output('MSLOT.3b_MT','MSLOT.3b_MT : Maximum Slot length (slot mark layers) is 250 um')
    mslot3b_mt.forget

    # Rule MSLOT.4a_MT : Minimum metaltop Slot space (slot mark layers) is 10 um
    logger.info('Executing rule MSLOT.4a_MT')
    mslot4a_mt = top_metal_slot.space(10.um).polygons(0.001)
    mslot4a_mt.output('MSLOT.4a_MT','MSLOT.4a_MT : Minimum metaltop Slot space (slot mark layers) is 10 um')
    mslot4a_mt.forget

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

    # Rule MSLOT.5_MT : Minimum metaltop slot (slot mark layers) to metaltop edge spacing is 10 um 
    logger.info('Executing rule MSLOT.5_MT')
    mslot5_mt_l1 = top_metal.enclosing(top_metal_slot,10.0.um).polygons(0.001)
    mslot5_mt_l2 = top_metal_slot.not_inside(top_metal)
    mslot5_mt = mslot5_mt_l1.or(mslot5_mt_l2)
    mslot5_mt.output('MSLOT.5_MT','MSLOT.5_MT : Minimum metaltop slot (slot mark layers) to metaltop edge spacing is 10 um')
    mslot5_mt_l1.forget
    mslot5_mt_l2.forget
    mslot5_mt.forget

    # Rule MSLOT.7_MT : Minimum space from metal_shield_via to top_metal slot is 0.2 um
    logger.info('Executing rule MSLOT.7_TM')
    mslot7_tm = metal_shield_via.separation(top_metal_slot,0.2.um).polygons(0.001).or(metal_shield_via.not_outside(top_metal_slot))
    mslot7_tm.output('MSLOT.7_MT','MSLOT.7_MT : Minimum space from metal_shield_via to top_metal slot is 0.2 um') 
    mslot7_tm.forget

    # Rule MSLOT.8_MT : Minimum space from via(n-1) to metaltop slot is 0.2 um
    logger.info('Executing rule MSLOT.8_MT')
    mslot8_mt = top_via.separation(top_metal_slot,0.2.um).polygons(0.001).or(top_via.not_outside(top_metal_slot))
    mslot8_mt.output('MSLOT.8_MT','MSLOT.8_MT : Minimum space from via(n-1) to metaltop slot is 0.2 um')
    mslot8_mt.forget

    if MIM_OPTION == 'B'     
        # Rule MSLOT.9b_OptionB : No slotting allowed for MIM bottom plate directly under FuseTop , Minimum distance to FuseTop is 5.0 um
        mslot9b_mimB_l1 = topmin1_metal_slot.or(topmin1_metal.holes).interacting(fusetop)
        mslot9b_mimB_l2 = topmin1_metal_slot.separation(fusetop,5.0.um).polygons(0.001)
        mslot9b_mimB = mslot9b_mimB_l1.or(mslot9b_mimB_l2)
        mslot9b_mimB.output('MSLOT.9b_OptionB','MSLOT.9b_OptionB : No slotting allowed for MIM bottom plate directly under FuseTop , Minimum distance to FuseTop is 5.0 um')
        mslot9b_mimB_l1.forget
        mslot9b_mimB_l2.forget
        mslot9b_mimB.forget

        # Rule MSLOT.9d_OptionB : Metaltop slots are not allowed to interact with top_via in FuseTop area 
        logger.info('Executing rule MSLOT.9d_OptionB')
        mslot9d_l1 = top_metal_slot.interacting(top_via).interacting(fusetop)
        mslot9d_l1.output('MSLOT.9d_OptionB','MSLOT.9d_OptionB : Metaltop slots are not allowed to interact with top_via in FuseTop area ') 
        mslot9d_l1.forget        
    end 

    if TANRES_OPTION == 'A'     
        # Rule MSLOT.9b_TANRES_OptionA : No slotting allowed for Bottom plate directly under FuseTop , Minimum distance to FuseTop is 5.0 um
        mslot9b_tanA_l1 = topmin1_metal_slot.or(topmin1_metal.holes).interacting(fusetop)
        mslot9b_tanA_l2 = topmin1_metal_slot.separation(fusetop,5.0.um).polygons(0.001)
        mslot9b_tanA = mslot9b_tanA_l1.or(mslot9b_tanA_l2)
        mslot9b_tanA.output('MSLOT.9b_TANRES_OptionA','MSLOT.9b_TANRES_OptionA : No slotting allowed for Bottom plate directly under FuseTop , Minimum distance to FuseTop is 5.0 um')
        mslot9b_tanA_l1.forget
        mslot9b_tanA_l2.forget
        mslot9b_tanA.forget 

        # Rule MSLOT.9d_TANRES_OptionA : top_metal slots are not allowed to interact with top_via in FuseTop area
        logger.info('Executing rule MSLOT.9d_TANRES_OptionA')
        mslot9d_l1 = top_metal_slot.interacting(top_via).interacting(fusetop)
        mslot9d_l1.output('MSLOT.9d_TANRES_OptionA','MSLOT.9d_TANRES_OptionA : top_metal slots are not allowed to interact with top_via in FuseTop area ') 
        mslot9d_l1.forget                
    end 

    # Rule MSLOT.10_MT : Slot mark layer (metaltop slot) on the metaltop hole are not allowed
    logger.info('Executing rule MSLOT.10_MT')
    mslot10_mt = top_metal_slot.interacting(top_metal.holes)
    mslot10_mt.output('MSLOT.10_MT','MSLOT.10_MT : Slot mark layer (metaltop slot) on the metaltop hole are not allowed')
    mslot10_mt.forget

end #BEOL
