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

    #======================================================
    #----------------- Metaltop Slotting ------------------
    #======================================================

    top_metal_slot = top_metal.holes 

    # Rule MSLOT.1_MT : Maximum metaltop width without slotting is 30 um
    logger.info('Executing rule MSLOT.1_MT') 
    mslot1_mt = top_metal.not(top_metal.width(30.001.um).polygons(0.001))
    mslot1_mt.output('MSLOT.1_MT','MSLOT.1_MT : Maximum metaltop width without slotting : 30 um')
    mslot1_mt.forget

    # Rule MSLOT.2_MT  : Minimum metaltop slot width (slot layers) is 2.0 um
    logger.info('Executing rule MSLOT.2_MT')
    mslot2_mt = top_metal_slot.width(2.0.um).polygons(0.001)
    mslot2_mt.output('MSLOT.2_MT','MSLOT.2_MT  : Minimum metaltop slot width (slot layers): 2.0 um') 
    mslot2_mt.forget

    # Rule MSLOT.3a_MT : Minimum metaltop Slot length (slot mark layers) is 10 um
    logger.info('Executing rule MSLOT.3a_MT')
    mslot3a_mt = top_metal_slot.with_bbox_max(nil,10.um)
    mslot3a_mt.output('MSLOT.3a_MT','MSLOT.3a_MT : Minimum metaltop Slot length (slot mark layers): 10 um ')
    mslot3a_mt.forget

    # Rule MSLOT.3b_MT : Maximum  metaltop Slot length (slot mark layers) is 250 um
    logger.info('Executing rule MSLOT.3b_MT')
    mslot3b_mt = top_metal_slot.with_bbox_max(250.001,nil)
    mslot3b_mt.output('MSLOT.3b_MT','MSLOT.3b_MT : Maximum Slot length (slot mark layers): 250 um')
    mslot3b_mt.forget

    # Rule MSLOT.4a_MT : Minimum metaltop Slot space (slot mark layers) is 10 um
    logger.info('Executing rule MSLOT.4a_MT')
    mslot4a_mt = top_metal_slot.space(10.um).polygons(0.001)
    mslot4a_mt.output('MSLOT.4a_MT','MSLOT.4a_MT : Minimum metaltop Slot space (slot mark layers): 10 um')
    mslot4a_mt.forget

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

    # Rule MSLOT.5_MT : Minimum metaltop slot (slot mark layers) to metaltop edge spacing is 10 um 
    logger.info('Executing rule MSLOT.5_MT')
    mslot5_mt_l1 = top_metal.or(top_metal_slot).enclosing(top_metal_slot,10.0.um).polygons(0.001)
    mslot5_mt_l2 = top_metal.or(top_metal_slot).not_inside(top_metal.extents)
    mslot5_mt = mslot5_mt_l1.or(mslot5_mt_l2)
    mslot5_mt.output('MSLOT.5_MT','MSLOT.5_MT : Minimum metaltop slot (slot mark layers) to metaltop edge spacing is 10 um')
    mslot5_mt_l1.forget
    mslot5_mt_l2.forget
    mslot5_mt.forget

end #BEOL
