################################################################################################
# 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.0um 
        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.0um') 
        mslot2_m4.forget

        # Rule MSLOT.3a_M4 : Minimum metal4 Slot length (slot mark layers) is 10.0um
        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.0um')
        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 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 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.um).polygons(0.001))
            mslot4b_m4.output('MSLOT.4b_M4','MSLOT.4b_M4 : Maximum metal4 Slot space (slot mark layers): 30µ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: 10 um')
        mslot5_m4_l1.forget
        mslot5_m4_l2.forget
        mslot5_m4.forget

        if METAL_LEVEL == '5LM' || METAL_LEVEL == '6LM'        
            # Rule MSLOT.7_M4 : Minimum space from via4 to metal4 slot is 0.2 um
            logger.info('Executing rule MSLOT.7_M4')
            mslot7_m4 = via4.separation(metal4_slot,0.2.um).polygons(0.001).or(via4.not_outside(metal4_slot))
            mslot7_m4.output('MSLOT.7_M4','MSLOT.7_M4 : Minimum space from via4 to metal4 slot: 0.2 um') 
            mslot7_m4.forget
        end # METAL_LEVEL

        # Rule MSLOT.8_M4 : Minimum space from via3 to metal4 slot is 0.2 um
        logger.info('Executing rule MSLOT.8_M4')
        mslot8_m4 = via3.separation(metal4_slot,0.2.um).polygons(0.001).or(via3.not_outside(metal4_slot))
        mslot8_m4.output('MSLOT.8_M4','MSLOT.8_M4 : Minimum space from via3 to metal4 slot: 0.2 um')
        mslot8_m4.forget    
    end # METAL_LEVEL
end #BEOL    