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

    if METAL_LEVEL == '3LM' || METAL_LEVEL == '4LM' || METAL_LEVEL == '5LM' || METAL_LEVEL == '6LM'    
        #================================================
        #---------------------METAL3---------------------
        #================================================

        # Rule M3.1: min. metal3 width is 0.28µm
        logger.info('Executing rule M3.1')
        m31_l1  = metal3.width(0.28.um, euclidian).polygons(0.001)
        m31_l1.output('M3.1', 'M3.1 : min. metal3 width : 0.28µm')
        m31_l1.forget

        # Rule M3.2a: min. metal3 spacing is 0.28µm
        logger.info('Executing rule M3.2a')
        m32a_l1  = metal3.space(0.28.um, euclidian).polygons(0.001)
        m32a_l1.output('M3.2a', 'M3.2a : min. metal3 spacing : 0.28µm')
        m32a_l1.forget

        # Rule M3.2b: Space to wide Metal3 (length & width > 10um) is 0.3µm
        logger.info('Executing rule M3.2b')
        m32b_l1  = metal3.separation(metal3.not_interacting(metal3.edges.with_length(nil, 10.um)), 0.3.um, euclidian).polygons(0.001)
        m32b_l1.output('M3.2b', 'M3.2b : Space to wide Metal3 (length & width > 10um) : 0.3µm')
        m32b_l1.forget

        # Rule M3.3: Minimum metal3 area is 0.1444µm²
        logger.info('Executing rule M3.3')
        m33_l1  = metal3.with_area(nil, 0.1444.um)
        m33_l1.output('M3.3', 'M3.3 : Minimum metal3 area : 0.1444µm²')
        m33_l1.forget
    end #METAL_LEVEL
end #BEOL
