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

        metal5_slot = metal5.holes 

        # Rule MSLOT.1_M5 : Maximum metal5 width without slotting is 30.0um
        logger.info('Executing rule MSLOT.1_M5') 
        mslot1_m5 = metal5.not(metal5.width(30.001.um).polygons(0.001))
        mslot1_m5.output('MSLOT.1_M5','MSLOT.1_M5 : Maximum metal5 width without slotting: 30.0 um')
        mslot1_m5.forget

        # Rule MSLOT.2_M5  : Minimum metal5 slot width (slot layers) is 2.0 um
        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): 2.0 um') 
        mslot2_m5.forget

        # Rule MSLOT.3a_M5 : Minimum metal5 Slot length (slot mark layers) is 10.0um
        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): 10.0 um')
        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): 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): 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.um).polygons(0.001))
            mslot4b_m5.output('MSLOT.4b_M5','MSLOT.4b_M5 : Maximum metal5 Slot space (slot mark layers): 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.or(metal5_slot).enclosing(metal5_slot,10.0.um).polygons(0.001)
        mslot5_m5_l2 = metal5.or(metal5_slot).not_inside(metal5.extents)
        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: 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: 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: 0.2 um')
        mslot8_m5.forget
    end # METAL_LEVEL
end #BEOL    