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

    #====================================================
    #----------------- Metal2 Slotting ------------------
    #====================================================

    metal2_slot = metal2.holes 

    # Rule MSLOT.1_M2 : Maximum metal2 width without slotting 
    logger.info('Executing rule MSLOT.1_M2') 
    mslot1_m2 = metal2.not(metal2.width(30.001.um).polygons(0.001)).not_interacting(metal2_slot)
    mslot1_m2.output('MSLOT.1_M2','MSLOT.1_M2 : Maximum metal2 width without slotting ')
    mslot1_m2.forget 

    # Rule MSLOT.2_M2  : Minimum metal2 slot width (slot layers)
    logger.info('Executing rule MSLOT.2_M2')
    mslot2_m2 = metal2_slot.width(2.0.um).polygons(0.001)
    mslot2_m2.output('MSLOT.2_M2','MSLOT.2_M2  : Minimum metal2 slot width (slot layers)') 
    mslot2_m2.forget

    # Rule MSLOT.3a_M2 : Minimum metal2 Slot length (slot mark layers) 
    logger.info('Executing rule MSLOT.3a_M2')
    mslot3a_m2 = metal2_slot.with_bbox_max(nil,10.um)
    mslot3a_m2.output('MSLOT.3a_M2','MSLOT.3a_M2 : Minimum metal2 Slot length (slot mark layers) ')
    mslot3a_m2.forget

    # Rule MSLOT.3b_M2 : Maximum  metal2 Slot length (slot mark layers) is 250 um
    logger.info('Executing rule MSLOT.3b_M2')
    mslot3b_m2 = metal2_slot.with_bbox_max(250.001,nil)
    mslot3b_m2.output('MSLOT.3b_M2','MSLOT.3b_M2 : Maximum Slot length (slot mark layers) is 250 um')
    mslot3b_m2.forget

    # Rule MSLOT.4a_M2 : Minimum metal2 Slot space (slot mark layers) is 10 um
    logger.info('Executing rule MSLOT.4a_M2')
    mslot4a_m2 = metal2_slot.space(10.um).polygons(0.001)
    mslot4a_m2.output('MSLOT.4a_M2','MSLOT.4a_M2 : Minimum metal2 Slot space (slot mark layers) is 10 um')
    mslot4a_m2.forget

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

    # Rule MSLOT.5_M2 : Minimum metal2 slot (slot mark layers) to metal2 edge spacing is 10 um 
    logger.info('Executing rule MSLOT.5_M2')
    mslot5_m2_l1 = metal2.or(metal2_slot).enclosing(metal2_slot,10.0.um).polygons(0.001)
    mslot5_m2_l2 = metal2.or(metal2_slot).not_inside(metal2.extents)
    mslot5_m2 = mslot5_m2_l1.or(mslot5_m2_l2)
    mslot5_m2.output('MSLOT.5_M2','MSLOT.5_M2 : Minimum metal2 slot (slot mark layers) to metal2 edge spacing is 10 um')
    mslot5_m2_l1.forget
    mslot5_m2_l2.forget
    mslot5_m2.forget

end #BEOL
