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

    # 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.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 #MIM_OPTION
        
end #BEOL    