blob: 3016d6c44888b6bf6cbdbbe89cf18b6c17de8cc8 [file] [log] [blame]
################################################################################################
# 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')
v32a_l1 = via3.space(0.26.um, euclidian).polygons(0.001)
v32a_l1.output('V3.2', 'V3.2 : min. via3 spacing : 0.26µm')
v32a_l1.forget
v3p3a_cond = metal3.drc(width <= 0.34.um).with_length(0.28.um,nil,both).edges.interacting(metal3.corners(90))
v3p3a_m = metal3.edges.interacting(v3p3a_cond)
# Rule V3.3a : Min. Metal3 enclose Via3 [Metal3 with width <0.34um, Protrusion >=0.28um] is 0.06
v3p3a_l1 = v3p3a_m.enclosing(via3.edges,0.06.um,square).polygons(0.001).or(via3.not_outside(metal3).not(metal3))
v3p3a_l1.output('V3.3a','V3.3a: Min. Metal3 enclose Via3 [Metal3 with width <0.34um, Protrusion >=0.28um] is 0.06')
v3p3a_cond.forget
v3p3a_m.forget
v3p3a_l1.forget
v3p3a_l1.forget
# rule V3.3d is not a DRC check
v3p3c_ed_s1 = via3.drc(enclosed(metal3, projection) <= 0.01.um).polygons(0.001)
v3p3c_ed_s2 = via3.drc(0.01.um < enclosed(metal3, projection) < 0.04.um)
# Rule V3.3c : Min. Metal3 enclose Via3 by sides (a, b, c, d) is (0.01,0.06,0.01,0.06) or (0.04,0.04,0.04,0.04)
v3p3c_l1 = metal3.enclosing(via3,0.06.um,projection).polygons(0.001).interacting(v3p3c_ed_s1).not(v3p3c_ed_s1)
v3p3c_l2 = metal3.edges.enclosing(v3p3c_ed_s2,0.04.um).polygons(0.001)
v3p3c_l3 = (v3p3c_l1.or(v3p3c_l2)).or(via3.not_outside(metal3).not(metal3))
v3p3c_l3.output('V3.3c','V3.3c : Min. Metal3 enclose Via3 by sides (a, b, c, d) is (0.01,0.06,0.01,0.06) or (0.04,0.04,0.04,0.04)')
v3p3c_ed_s1.forget
v3p3c_ed_s2.forget
v3p3c_l1.forget
v3p3c_l2.forget
v3p3c_l3.forget
v3p4a_cond = (metal4.drc(width <= 0.34.um).with_length(0.28.um,nil,both).edges.interacting(metal4.corners(90)))
v3p4a_m = metal4.edges.interacting(v3p4a_cond)
# Rule V3.4a : Min. Metal4 enclose Via3 [Metal4 with width <0.34um, Protrusion >=0.28um] is 0.06
v3p4a_l1 = v3p4a_m.enclosing(via3.edges,0.06.um,square).polygons(0.001).or(via3.not_outside(metal4).not(metal4))
v3p4a_l1.output('V3.4a','V3.4a : Min. Metal4 enclose Via3 [Metal4 with width <0.34um, Protrusion >=0.28um] is 0.06 ')
v3p4a_cond.forget
v3p4a_m.forget
v3p4a_l1.forget
v3p4b_ed_s1 = via3.drc(enclosed(metal4, projection) <= 0.01.um).polygons(0.001)
v3p4b_ed_s2 = via3.drc(0.01.um < enclosed(metal4, projection) < 0.04.um)
# Rule V3.4b : Min. Metal4 enclose Via3 by sides (a, b, c, d) is (0.01,0.06,0.01,0.06) or (0.04,0.04,0.04,0.04)
v3p4b_l1 = metal4.enclosing(via3,0.06.um,projection).polygons(0.001).interacting(v3p4b_ed_s1).not(v3p4b_ed_s1)
v3p4b_l2 = metal4.edges.enclosing(v3p4b_ed_s2,0.04.um).polygons(0.001)
v3p4b_l3 = (v3p4b_l1.or(v3p4b_l2)).or(via3.not_outside(metal4).not(metal4))
v3p4b_l3.output('V3.4b','V3.4b : Min. Metal4 enclose Via3 by sides (a, b, c, d) is (0.01,0.06,0.01,0.06) or (0.04,0.04,0.04,0.04)')
v3p4b_ed_s1.forget
v3p4b_ed_s2.forget
v3p4b_l1.forget
v3p4b_l2.forget
v3p4b_l3.forget
# rule V3.4c is not a DRC check
end #METAL_LEVEL
end #BEOL