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

        metal3_slot = metal3.holes 

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

        # Rule MSLOT.2_M3  : Minimum metal3 slot width (slot layers) is 2.0 um
        logger.info('Executing rule MSLOT.2_M3')
        mslot2_m3 = metal3_slot.width(2.0.um).polygons(0.001)
        mslot2_m3.output('MSLOT.2_M3','MSLOT.2_M3  : Minimum metal3 slot width (slot layers): 2.0 um') 
        mslot2_m3.forget

        # Rule MSLOT.3a_M3 : Minimum metal3 Slot length (slot mark layers)  is 10.0 um
        logger.info('Executing rule MSLOT.3a_M3')
        mslot3a_m3 = metal3_slot.with_bbox_max(nil,10.um)
        mslot3a_m3.output('MSLOT.3a_M3','MSLOT.3a_M3 : Minimum metal3 Slot length (slot mark layers): 10.0 um ')
        mslot3a_m3.forget

        # Rule MSLOT.3b_M3 : Maximum  metal3 Slot length (slot mark layers) is 250 um
        logger.info('Executing rule MSLOT.3b_M3')
        mslot3b_m3 = metal3_slot.with_bbox_max(250.001,nil)
        mslot3b_m3.output('MSLOT.3b_M3','MSLOT.3b_M3 : Maximum Slot length (slot mark layers): 250.0 um')
        mslot3b_m3.forget

        # Rule MSLOT.4a_M3 : Minimum metal3 Slot space (slot mark layers) is 10 um
        logger.info('Executing rule MSLOT.4a_M3')
        mslot4a_m3 = metal3_slot.space(10.um).polygons(0.001)
        mslot4a_m3.output('MSLOT.4a_M3','MSLOT.4a_M3 : Minimum metal3 Slot space (slot mark layers): 10.0 um')
        mslot4a_m3.forget

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

        # Rule MSLOT.5_M3 : Minimum metal3 slot (slot mark layers) to metal3 edge spacing is 10 um 
        logger.info('Executing rule MSLOT.5_M3')
        mslot5_m3_l1 = metal3.or(metal3_slot).enclosing(metal3_slot,10.0.um).polygons(0.001)
        mslot5_m3_l2 = metal3.or(metal3_slot).not_inside(metal3.extents)
        mslot5_m3 = mslot5_m3_l1.or(mslot5_m3_l2)
        mslot5_m3.output('MSLOT.5_M3','MSLOT.5_M3 : Minimum metal3 slot (slot mark layers) to metal3 edge spacing is 10 um')
        mslot5_m3_l1.forget
        mslot5_m3_l2.forget
        mslot5_m3.forget
    end #METAL_LEVEL
end #BEOL
