################################################################################################
# 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 == '4LM' || METAL_LEVEL == '5LM' || METAL_LEVEL == '6LM'    
        #====================================================
        #----------------- Metal4 Slotting ------------------
        #====================================================

        metal4_slot = metal4.holes 

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

        # Rule MSLOT.2_M4  : Minimum metal4 slot width (slot layers) is 2.0 um
        logger.info('Executing rule MSLOT.2_M4')
        mslot2_m4 = metal4_slot.width(2.0.um).polygons(0.001)
        mslot2_m4.output('MSLOT.2_M4','MSLOT.2_M4  : Minimum metal4 slot width (slot layers): 2.0 um') 
        mslot2_m4.forget

        # Rule MSLOT.3a_M4 : Minimum metal4 Slot length (slot mark layers) is 10.0 um
        logger.info('Executing rule MSLOT.3a_M4')
        mslot3a_m4 = metal4_slot.with_bbox_max(nil,10.um)
        mslot3a_m4.output('MSLOT.3a_M4','MSLOT.3a_M4 : Minimum metal4 Slot length (slot mark layers): 10.0 um ')
        mslot3a_m4.forget

        # Rule MSLOT.3b_M4 : Maximum  metal4 Slot length (slot mark layers) is 250 um
        logger.info('Executing rule MSLOT.3b_M4')
        mslot3b_m4 = metal4_slot.with_bbox_max(250.001,nil)
        mslot3b_m4.output('MSLOT.3b_M4','MSLOT.3b_M4 : Maximum Slot length (slot mark layers): 250.0 um')
        mslot3b_m4.forget

        # Rule MSLOT.4a_M4 : Minimum metal4 Slot space (slot mark layers) is 10 um
        logger.info('Executing rule MSLOT.4a_M4')
        mslot4a_m4 = metal4_slot.space(10.um).polygons(0.001)
        mslot4a_m4.output('MSLOT.4a_M4','MSLOT.4a_M4 : Minimum metal4 Slot space (slot mark layers): 10.0 um')
        mslot4a_m4.forget

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

        # Rule MSLOT.5_M4 : Minimum metal4 slot (slot mark layers) to metal4 edge spacing is 10 um 
        logger.info('Executing rule MSLOT.5_M4')
        mslot5_m4_l1 = metal4.or(metal4_slot).enclosing(metal4_slot,10.0.um).polygons(0.001)
        mslot5_m4_l2 = metal4.or(metal4_slot).not_inside(metal4.extents)
        mslot5_m4 = mslot5_m4_l1.or(mslot5_m4_l2)
        mslot5_m4.output('MSLOT.5_M4','MSLOT.5_M4 : Minimum metal4 slot (slot mark layers) to metal4 edge spacing is 10 um')
        mslot5_m4_l1.forget
        mslot5_m4_l2.forget
        mslot5_m4.forget 
    end #METAL_LEVEL
end #BEOL
