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

    if METAL_LEVEL == '5LM' || METAL_LEVEL == '6LM'    
        #====================================================
        #----------------- Metal5 Slotting ------------------
        #====================================================

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

        # Rule MSLOT.2_M5  : Minimum metal5 slot width (slot layers)
        logger.info('Executing rule MSLOT.2_M5')
        mslot2_m5 = metal5_slot.width(2.0.um).polygons(0.001)
        mslot2_m5.output('MSLOT.2_M5','MSLOT.2_M5  : Minimum metal5 slot width (slot layers)') 
        mslot2_m5.forget

        # Rule MSLOT.3a_M5 : Minimum metal5 Slot length (slot mark layers) 
        logger.info('Executing rule MSLOT.3a_M5')
        mslot3a_m5 = metal5_slot.with_bbox_max(nil,10.um)
        mslot3a_m5.output('MSLOT.3a_M5','MSLOT.3a_M5 : Minimum metal5 Slot length (slot mark layers) ')
        mslot3a_m5.forget

        # Rule MSLOT.3b_M5 : Maximum  metal5 Slot length (slot mark layers) is 250 um
        logger.info('Executing rule MSLOT.3b_M5')
        mslot3b_m5 = metal5_slot.with_bbox_max(250.001,nil)
        mslot3b_m5.output('MSLOT.3b_M5','MSLOT.3b_M5 : Maximum Slot length (slot mark layers) is 250 um')
        mslot3b_m5.forget

        # Rule MSLOT.4a_M5 : Minimum metal5 Slot space (slot mark layers) is 10 um
        logger.info('Executing rule MSLOT.4a_M5')
        mslot4a_m5 = metal5_slot.space(10.um).polygons(0.001)
        mslot4a_m5.output('MSLOT.4a_M5','MSLOT.4a_M5 : Minimum metal5 Slot space (slot mark layers) is 10 um')
        mslot4a_m5.forget

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

        # Rule MSLOT.5_M5 : Minimum metal5 slot (slot mark layers) to metal5 edge spacing is 10 um 
        logger.info('Executing rule MSLOT.5_M5')
        mslot5_m5_l1 = metal5.enclosing(metal5_slot,10.0.um).polygons(0.001)
        mslot5_m5_l2 = metal5_slot.not_inside(metal5)
        mslot5_m5 = mslot5_m5_l1.or(mslot5_m5_l2)
        mslot5_m5.output('MSLOT.5_M5','MSLOT.5_M5 : Minimum metal5 slot (slot mark layers) to metal5 edge spacing is 10 um')
        mslot5_m5_l1.forget
        mslot5_m5_l2.forget
        mslot5_m5.forget

        if METAL_LEVEL == '6LM'    
            # Rule MSLOT.7_M5 : Minimum space from via5 to metal5 slot is 0.2 um
            logger.info('Executing rule MSLOT.7_M5')
            mslot7_m5 = via5.separation(metal5_slot,0.2.um).polygons(0.001).or(via5.not_outside(metal5_slot))
            mslot7_m5.output('MSLOT.7_M5','MSLOT.7_M5 : Minimum space from via5 to metal5 slot is 0.2 um') 
            mslot7_m5.forget
        end #METAL_LEVEL

        # Rule MSLOT.8_M5 : Minimum space from via4 to metal5 slot is 0.2 um
        logger.info('Executing rule MSLOT.8_M5')
        mslot8_m5 = via4.separation(metal5_slot,0.2.um).polygons(0.001).or(via4.not_outside(metal5_slot))
        mslot8_m5.output('MSLOT.8_M5','MSLOT.8_M5 : Minimum space from via4 to metal5 slot is 0.2 um')
        mslot8_m5.forget

        # Rule MSLOT.10_M5 : Slot mark layer (metal5 slot) on the metal5 hole are not allowed
        logger.info('Executing rule MSLOT.10_M5')
        mslot10_m5 = metal5_slot.interacting(metal5.holes)
        mslot10_m5.output('MSLOT.10_M5','MSLOT.10_M5 : Slot mark layer (metal5 slot) on the metal5 hole are not allowed')
        mslot10_m5.forget
    end #METAL_LEVEL

end #BEOL
