################################################################################################
# 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 == '4LM' || METAL_LEVEL == '5LM' || METAL_LEVEL == '6LM'    
        #================================================
        #----------------------VIA3----------------------
        #================================================ 

        # Rule V3.1: Min/max Via3 size . is 0.26µm
        logger.info('Executing rule V3.1')
        v31_l1 = via3.edges.without_length(0.26.um).extended(0, 0, 0.001, 0.001)
        v31_l1.output('V3.1', 'V3.1 : Min/max Via3 size . : 0.26µm')
        v31_l1.forget

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

        # Rule V3.3a: metal3  overlap of via3.
        logger.info('Executing rule V3.3a')
        v33b_l1 = metal3.enclosing(via3, 0.01.um, euclidian).polygons(0.001).or(via3.not(metal3))
        v33b_l1.output('V3.3a', 'V3.3a : metal3  overlap of via3.')
        v33b_l1.forget

        v3p3b_cond = metal3.drc( width <= 0.34.um).with_length(0.28.um,nil,both)
        v3p3b_eol = metal3.edges.with_length(nil, 0.34.um).interacting(v3p3b_cond.first_edges).interacting(v3p3b_cond.second_edges).not(v3p3b_cond.first_edges).not(v3p3b_cond.second_edges)
        # Rule V3.3b: metal3 (< 0.34um) end-of-line overlap. is 0.06µm
        logger.info('Executing rule V3.3b')
        v33b_l1 = v3p3b_eol.enclosing(via3.edges,0.06.um, projection).polygons(0.001)
        v33b_l1.output('V3.3b', 'V3.3b : metal3 (< 0.34um) end-of-line overlap. : 0.06µm')
        v33b_l1.forget

        v3p3b_cond.forget

        v3p3b_eol.forget

        v3_3c_1 = via3.edges.interacting(via3.drc(enclosed(metal3, projection) < 0.04.um).edges.centers(0, 0.5))
        v3_3c_2 = via3.edges.interacting(via3.drc(0.04.um <= enclosed(metal3, projection) < 0.06.um).centers(0, 0.5))
        v3_3c_3 = v3_3c_1.extended(0, 0, 0, 0.001, joined).corners(90)
        # Rule V3.3c: If metal3 overlap via3 by < 0.04um on one side, adjacent metal3 edges overlap. is 0.06µm
        logger.info('Executing rule V3.3c')
        v33c_l1 = v3_3c_2.not(v3_3c_1).interacting(v3_3c_1).or(v3_3c_1.interacting(v3_3c_3)).enclosed(metal3.edges, 0.06.um).polygons(0.001)
        v33c_l1.output('V3.3c', 'V3.3c : If metal3 overlap via3 by < 0.04um on one side, adjacent metal3 edges overlap. : 0.06µm')
        v33c_l1.forget

        v3_3c_1.forget

        v3_3c_2.forget

        v3_3c_3.forget

        # rule V3.3d is not a DRC check

        # Rule V3.4a: metal4 overlap of via3. is 0.01um
        logger.info('Executing rule V3.4a')
        v3_4a_l1 = metal4.enclosing(via3, 0.01.um, euclidian).polygons(0.001)
        v3_4a_l2 = via3.interacting(metal4).not(metal4)
        v3_4a_l = v3_4a_l1.join(v3_4a_l2)          
        v3_4a_l.output('V3.4a', 'V3.4a : metal4 overlap of via3.: 0.01um')
        v3_4a_l1.forget
        v3_4a_l2.forget
        v3_4a_l.forget

        v3p4b_cond = metal4.drc( width <= 0.34.um).with_length(0.28.um,nil,both)
        v3p4b_eol = metal4.edges.with_length(nil, 0.34.um).interacting(v3p4b_cond.first_edges).interacting(v3p4b_cond.second_edges).not(v3p4b_cond.first_edges).not(v3p4b_cond.second_edges)
        # Rule V3.4b: metal4 (< 0.34um) end-of-line overlap. is 0.06µm
        logger.info('Executing rule V3.4b')
        v34b_l1 = v3p4b_eol.enclosing(via3.edges,0.06.um, projection).polygons(0.001)
        v34b_l1.output('V3.4b', 'V3.4b : metal4 (< 0.34um) end-of-line overlap. : 0.06µm')
        v34b_l1.forget

        v3p4b_cond.forget

        v3p4b_eol.forget

        v3_4c_1 = via3.edges.interacting(via3.drc(enclosed(metal4, projection) < 0.04.um).edges.centers(0, 0.5))
        v3_4c_2 = via3.edges.interacting(via3.drc(0.04.um <= enclosed(metal4, projection) < 0.06.um).centers(0, 0.5))
        v3_4c_3 = v3_4c_1.extended(0, 0, 0, 0.001, joined).corners(90)
        # Rule V3.4c: If metal4 overlap via3 by < 0.04um on one side, adjacent metal4 edges overlap. is 0.06µm
        logger.info('Executing rule V3.4c')
        v34c_l1 = v3_4c_2.not_in(v3_4c_1).interacting(v3_4c_1).or(v3_4c_1.interacting(v3_4c_3)).enclosed(metal4.edges, 0.06.um).polygons(0.001)
        v34c_l1.output('V3.4c', 'V3.4c : If metal4 overlap via3 by < 0.04um on one side, adjacent metal4 edges overlap. : 0.06µm')
        v34c_l1.forget

        v3_4c_1.forget

        v3_4c_2.forget

        v3_4c_3.forget

        # rule V3.4d is not a DRC check

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