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

    # 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.enclosing(metal2_slot,10.0.um).polygons(0.001)
    mslot5_m2_l2 = metal2_slot.not_inside(metal2)
    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

    # Rule MSLOT.7_M2 : Minimum space from via2 to metal2 slot is 0.2 um
    logger.info('Executing rule MSLOT.7_M2')
    mslot7_m2 = via2.separation(metal2_slot,0.2.um).polygons(0.001).or(via2.not_outside(metal2_slot))
    mslot7_m2.output('MSLOT.7_M2','MSLOT.7_M2 : Minimum space from via2 to metal2 slot is 0.2 um') 
    mslot7_m2.forget

    # Rule MSLOT.8_M2 : Minimum space from via1 to metal2 slot is 0.2 um
    logger.info('Executing rule MSLOT.8_M2')
    mslot8_m2 = via1.separation(metal2_slot,0.2.um).polygons(0.001).or(via1.not_outside(metal2_slot))
    mslot8_m2.output('MSLOT.8_M2','MSLOT.8_M2 : Minimum space from via1 to metal2 slot is 0.2 um')
    mslot8_m2.forget

    if MIM_OPTION == 'A' 

    # Rule MSLOT.9b_OptionA : No slotting allowed for MIM bottom plate directly under FuseTop , Minimum distance to FuseTop is 5.0 um
    mslot9b_mimA_l1 = metal2_slot.or(metal2.holes).interacting(fusetop)
    mslot9b_mimA_l2 = metal2_slot.separation(fusetop,5.0.um).polygons(0.001)
    mslot9b_mimA = mslot9b_mimA_l1.or(mslot9b_mimA_l2)
    mslot9b_mimA.output('MSLOT.9b_OptionA','MSLOT.9b_OptionA : No slotting allowed for MIM bottom plate directly under FuseTop , Minimum distance to FuseTop is 5.0 um')
    mslot9b_mimA_l1.forget
    mslot9b_mimA_l2.forget
    mslot9b_mimA.forget

    end

    # Rule MSLOT.10_M2 : Slot mark layer (metal2 slot) on the metal2 hole are not allowed
    logger.info('Executing rule MSLOT.10_M2')
    mslot10_m2 = metal2_slot.interacting(metal2.holes)
    mslot10_m2.output('MSLOT.10_M2','MSLOT.10_M2 : Slot mark layer (metal2 slot) on the metal2 hole are not allowed')
    mslot10_m2.forget    

end #BEOL
