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

end #BEOL
