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

    #====================================================
    #----------------- Metal1 Slotting ------------------
    #====================================================

    metal1_slot = metal1.holes 

    # Rule MSLOT.1_M1 : Maximum metal1 width without slotting 
    logger.info('Executing rule MSLOT.1_M1') 
    mslot1_m1 = metal1.not(metal1.width(30.001.um).polygons(0.001)).not_interacting(metal1_slot)
    mslot1_m1.output('MSLOT.1_M1','MSLOT.1_M1 : Maximum metal1 width without slotting ')
    mslot1_m1.forget 

    # Rule MSLOT.2_M1  : Minimum metal1 slot width (slot layers)
    logger.info('Executing rule MSLOT.2_M1')
    mslot2_m1 = metal1_slot.width(2.0.um).polygons(0.001)
    mslot2_m1.output('MSLOT.2_M1','MSLOT.2_M1  : Minimum metal1 slot width (slot layers)') 
    mslot2_m1.forget

    # Rule MSLOT.3a_M1 : Minimum  metal1 Slot length (slot mark layers) 
    logger.info('Executing rule MSLOT.3a_M1')
    mslot3a_m1 = metal1_slot.with_bbox_max(nil,10.um)
    mslot3a_m1.output('MSLOT.3a_M1','MSLOT.3a_M1 : Minimum Slot length (slot mark layers) ')
    mslot3a_m1.forget

    # Rule MSLOT.3b_M1 : Maximum  metal1 Slot length (slot mark layers) is 250 um
    logger.info('Executing rule MSLOT.3b_M1')
    mslot3b_m1 = metal1_slot.with_bbox_max(250.001,nil)
    mslot3b_m1.output('MSLOT.3b_M1','MSLOT.3b_M1 : Maximum Slot length (slot mark layers) is 250 um')
    mslot3b_m1.forget

    # Rule MSLOT.4a_M1 : Minimum metal1 Slot space (slot mark layers) is 10 um
    logger.info('Executing rule MSLOT.4a_M1')
    mslot4a_m1 = metal1_slot.space(10.um).polygons(0.001)
    mslot4a_m1.output('MSLOT.4a_M1','MSLOT.4a_M1 : Minimum metal1 Slot space (slot mark layers) is 10 um')
    mslot4a_m1.forget

    if metal1_slot.count() > 1 
        # Rule MSLOT.4b_M1 : Maximum metal1 Slot space (slot mark layers) is 30 um
        logger.info('Executing rule MSLOT.4b_M1')
        mslot4b_m1 = metal1_slot.not_interacting(metal1_slot.space(30.um).polygons(0.001))
        mslot4b_m1.output('MSLOT.4b_M1','MSLOT.4b_M1 : Maximum metal1 Slot space (slot mark layers) is 30µm')
        mslot4b_m1.forget
    end 

    # Rule MSLOT.5_M1 : Minimum metal1 slot (slot mark layers) to metal1 edge spacing is 10 um 
    logger.info('Executing rule MSLOT.5_M1')
    mslot5_m1_l1 = metal1.or(metal1_slot).enclosing(metal1_slot,10.0.um).polygons(0.001)
    mslot5_m1_l2 = metal1.or(metal1_slot).not_inside(metal1.extents)
    mslot5_m1 = mslot5_m1_l1.or(mslot5_m1_l2)
    mslot5_m1.output('MSLOT.5_M1','MSLOT.5_M1 : Minimum metal1 slot (slot mark layers) to metal1 edge spacing is 10 um')
    mslot5_m1_l1.forget
    mslot5_m1_l2.forget
    mslot5_m1.forget

    # Rule MSLOT.7_M1 : Minimum space from via1 to metal1 slot is 0.2 um
    logger.info('Executing rule MSLOT.7_M1')
    mslot7_m1 = via1.separation(metal1_slot,0.2.um).polygons(0.001).or(via1.not_outside(metal1_slot))
    mslot7_m1.output('MSLOT.7_M1','MSLOT.7_M1 : Minimum space from via1 to metal1 slot is 0.2 um') 
    mslot7_m1.forget

    # Rule MSLOT.8_M1 : Minimum space from contact to metal1 slot is 0.2 um
    logger.info('Executing rule MSLOT.8_M1')
    mslot8_m1 = contact.separation(metal1_slot,0.2.um).polygons(0.001).or(contact.not_outside(metal1_slot))
    mslot8_m1.output('MSLOT.8_M1','MSLOT.8_M1 : Minimum space from contact to metal1 slot is 0.2 um')
    mslot8_m1.forget

end #BEOL    