################################################################################################
# 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')
        v22_l1  = via2.space(0.26.um, euclidian).polygons(0.001)
        v22_l1.output('V2.2', 'V2.2 : min. via2 spacing : 0.26µm')
        v22_l1.forget 

        # Rule V2.3a: metal2  overlap of via2.
        logger.info('Executing rule V2.3a')
        v23b_l1 = metal2.enclosing(via2, 0.01.um, euclidian).polygons(0.001).or(via2.not(metal2))
        v23b_l1.output('V2.3a', 'V2.3a : metal2  overlap of via2.')
        v23b_l1.forget

        v2p3b_cond = metal2.drc( width <= 0.34.um).with_length(0.28.um,nil,both)
        v2p3b_eol = metal2.edges.with_length(nil, 0.34.um).interacting(v2p3b_cond.first_edges).interacting(v2p3b_cond.second_edges).not(v2p3b_cond.first_edges).not(v2p3b_cond.second_edges)
        # Rule V2.3b: metal2 (< 0.34um) end-of-line overlap. is 0.06µm
        logger.info('Executing rule V2.3b')
        v23b_l1 = v2p3b_eol.enclosing(via2.edges,0.06.um, projection).polygons(0.001)
        v23b_l1.output('V2.3b', 'V2.3b : metal2 (< 0.34um) end-of-line overlap. : 0.06µm')
        v23b_l1.forget

        v2p3b_cond.forget

        v2p3b_eol.forget

        v2_3c_1 = via2.edges.interacting(via2.drc(enclosed(metal2, projection) < 0.04.um).edges.centers(0, 0.5))
        v2_3c_2 = via2.edges.interacting(via2.drc(0.04.um <= enclosed(metal2, projection) < 0.06.um).centers(0, 0.5))
        v2_3c_3 = v2_3c_1.extended(0, 0, 0, 0.001, joined).corners(90)
        # Rule V2.3c: If metal2 overlap via2 by < 0.04um on one side, adjacent metal2 edges overlap. is 0.06µm
        logger.info('Executing rule V2.3c')
        v23c_l1 = v2_3c_2.not_in(v2_3c_1).interacting(v2_3c_1).or(v2_3c_1.interacting(v2_3c_3)).enclosed(metal2.edges, 0.06.um).polygons(0.001)
        v23c_l1.output('V2.3c', 'V2.3c : If metal2 overlap via2 by < 0.04um on one side, adjacent metal2 edges overlap. : 0.06µm')
        v23c_l1.forget

        v2_3c_1.forget

        v2_3c_2.forget

        v2_3c_3.forget

        # rule V2.3d is not a DRC check

        # Rule V2.4a: metal3 overlap of via2. is 0.01um
        logger.info('Executing rule V2.4a')
        v2_4a_l1 = metal3.enclosing(via2, 0.01.um, euclidian).polygons(0.001)
        v2_4a_l2 = via2.interacting(metal3).not(metal3)
        v2_4a_l = v2_4a_l1.join(v2_4a_l2)        
        v2_4a_l.output('V2.4a', 'V2.4a : metal3 overlap of via2. : 0.01um')
        v2_4a_l1.forget
        v2_4a_l2.forget
        v2_4a_l.forget

        v2p4b_cond = metal3.drc( width <= 0.34.um).with_length(0.28.um,nil,both)
        v2p4b_eol = metal3.edges.with_length(nil, 0.34.um).interacting(v2p4b_cond.first_edges).interacting(v2p4b_cond.second_edges).not(v2p4b_cond.first_edges).not(v2p4b_cond.second_edges)
        # Rule V2.4b: metal3 (< 0.34um) end-of-line overlap. is 0.06µm
        logger.info('Executing rule V2.4b')
        v24b_l1 = v2p4b_eol.enclosing(via2.edges,0.06.um, projection).polygons(0.001)
        v24b_l1.output('V2.4b', 'V2.4b : metal3 (< 0.34um) end-of-line overlap. : 0.06µm')
        v24b_l1.forget

        v2p4b_cond.forget

        v2p4b_eol.forget

        v2_4c_1 = via2.edges.interacting(via2.drc(enclosed(metal3, projection) < 0.04.um).edges.centers(0, 0.5))
        v2_4c_2 = via2.edges.interacting(via2.drc(0.04.um <= enclosed(metal3, projection) < 0.06.um).centers(0, 0.5))
        v2_4c_3 = v2_4c_1.extended(0, 0, 0, 0.001, joined).corners(90)
        # Rule V2.4c: If metal3 overlap via2 by < 0.04um on one side, adjacent metal3 edges overlap. is 0.06µm
        logger.info('Executing rule V2.4c')
        v24c_l1 = v2_4c_2.not_in(v2_4c_1).interacting(v2_4c_1).or(v2_4c_1.interacting(v2_4c_3)).enclosed(metal3.edges, 0.06.um).polygons(0.001)
        v24c_l1.output('V2.4c', 'V2.4c : If metal3 overlap via2 by < 0.04um on one side, adjacent metal3 edges overlap. : 0.06µm')
        v24c_l1.forget

        v2_4c_1.forget

        v2_4c_2.forget

        v2_4c_3.forget

        # rule V2.4d is not a DRC check

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