################################################################################################
# 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 30um.
        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.um')
        mslot1_m5.forget

        # Rule MSLOT.2_M5  : Minimum metal5 slot width (slot layers) is 2.0um
        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.um
        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): 10um ')
        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.001.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
    end #METAL_LEVEL
end #BEOL
