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

        # Rule V2.1: Min/max Via2 size . is 0.26µm
        logger.info('Executing rule V2.1')
        v21_l1 = via2.edges.without_length(0.26.um).extended(0, 0, 0.001, 0.001)
        v21_l1.output('V2.1', 'V2.1 : Min/max Via2 size . : 0.26µm')
        v21_l1.forget

        # Rule V2.2: min. via2 spacing is 0.26µm
        logger.info('Executing rule V2.2')
        v22a_l1  = via2.space(0.26.um, euclidian).polygons(0.001)
        v22a_l1.output('V2.2', 'V2.2 : min. via2 spacing : 0.26µm')
        v22a_l1.forget

        v2p3a_cond = metal2.drc(width <= 0.34.um).with_length(0.28.um,nil,both).edges.interacting(metal2.corners(90))
        v2p3a_m = metal2.edges.interacting(v2p3a_cond)
        # Rule V2.3a : Min. Metal2 enclose Via2 [Metal2 with width <0.34um, Protrusion >=0.28um] is 0.06
        v2p3a_l1 = v2p3a_m.enclosing(via2.edges,0.06.um,square).polygons(0.001).or(via2.not_outside(metal2).not(metal2))
        v2p3a_l1.output('V2.3a','V2.3a: Min. Metal2 enclose Via2 [Metal2 with width <0.34um, Protrusion >=0.28um] is 0.06')

        v2p3a_cond.forget
        v2p3a_m.forget
        v2p3a_l1.forget
        v2p3a_l1.forget


        # rule V2.3d is not a DRC check

        v2p3c_ed_s1 = via2.drc(enclosed(metal2, projection) <= 0.01.um).polygons(0.001)
        v2p3c_ed_s2 = via2.drc(0.01.um < enclosed(metal2, projection) < 0.04.um)
        # Rule V2.3c : Min. Metal2 enclose Via2 by sides (a, b, c, d) is (0.01,0.06,0.01,0.06) or (0.04,0.04,0.04,0.04)
        v2p3c_l1 = metal2.enclosing(via2,0.06.um,projection).polygons(0.001).interacting(v2p3c_ed_s1).not(v2p3c_ed_s1)
        v2p3c_l2 = metal2.edges.enclosing(v2p3c_ed_s2,0.04.um).polygons(0.001)
        v2p3c_l3 = (v2p3c_l1.or(v2p3c_l2)).or(via2.not_outside(metal2).not(metal2))
        v2p3c_l3.output('V2.3c','V2.3c : Min. Metal2 enclose Via2 by sides (a, b, c, d) is (0.01,0.06,0.01,0.06) or (0.04,0.04,0.04,0.04)')

        v2p3c_ed_s1.forget
        v2p3c_ed_s2.forget
        v2p3c_l1.forget
        v2p3c_l2.forget
        v2p3c_l3.forget

        v2p4a_cond = (metal3.drc(width <= 0.34.um).with_length(0.28.um,nil,both).edges.interacting(metal3.corners(90)))
        v2p4a_m = metal3.edges.interacting(v2p4a_cond)
        # Rule V2.4a : Min. Metal3 enclose Via2 [Metal3 with width <0.34um, Protrusion >=0.28um] is 0.06 
        v2p4a_l1 = v2p4a_m.enclosing(via2.edges,0.06.um,square).polygons(0.001).or(via2.not_outside(metal3).not(metal3))
        v2p4a_l1.output('V2.4a','V2.4a : Min. Metal3 enclose Via2 [Metal3 with width <0.34um, Protrusion >=0.28um] is 0.06 ')

        v2p4a_cond.forget
        v2p4a_m.forget
        v2p4a_l1.forget

        v2p4b_ed_s1 = via2.drc(enclosed(metal3, projection) <= 0.01.um).polygons(0.001)
        v2p4b_ed_s2 = via2.drc(0.01.um < enclosed(metal3, projection) < 0.04.um)
        # Rule V2.4b : Min. Metal3 enclose Via2 by sides (a, b, c, d) is (0.01,0.06,0.01,0.06) or (0.04,0.04,0.04,0.04)
        v2p4b_l1 = metal3.enclosing(via2,0.06.um,projection).polygons(0.001).interacting(v2p4b_ed_s1).not(v2p4b_ed_s1)
        v2p4b_l2 = metal3.edges.enclosing(v2p4b_ed_s2,0.04.um).polygons(0.001)
        v2p4b_l3 = (v2p4b_l1.or(v2p4b_l2)).or(via2.not_outside(metal3).not(metal3))
        v2p4b_l3.output('V2.4b','V2.4b : Min. Metal3 enclose Via2 by sides (a, b, c, d) is (0.01,0.06,0.01,0.06) or (0.04,0.04,0.04,0.04)')

        v2p4b_ed_s1.forget
        v2p4b_ed_s2.forget
        v2p4b_l1.forget
        v2p4b_l2.forget
        v2p4b_l3.forget

        # rule V2.4c is not a DRC check
    end #METAL_LEVEL
end #BEOL
