Skip to content

Commit

Permalink
Merge pull request google#35 from mabrains/modifying_vias
Browse files Browse the repository at this point in the history
modifying via1->via5
  • Loading branch information
atorkmabrains authored Dec 11, 2022
2 parents 55b9e8e + 6064358 commit 8352d2e
Show file tree
Hide file tree
Showing 5 changed files with 234 additions and 202 deletions.
6 changes: 5 additions & 1 deletion rules/klayout/drc/rule_decks/via1.drc
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,9 @@ if BEOL

logger.info("Executing rule V1.4c")
via1_4c_cond_metal = metal2.enclosing(via1, 0.04.um, projection).edges.interacting(via1)
via1_4c_check = via1.interacting(via1_4c_cond_metal).edges.not(via1_4c_cond_metal)
via1_4c_check_space = via1.interacting(via1_4c_cond_metal).edges
via1_4c_check_corner = via1_4c_cond_metal.extended_in(0.002.um)
via1_4c_check = via1_4c_check_space.interacting(via1_4c_check_corner).not(via1_4c_cond_metal)
via1_cond_corner = via1_4c_cond_metal.width(0.002.um, angle_limit(135)).polygons
via1_4c_check_ext = via1_4c_check.extended_out(0.06.um - 1.dbu)
bad_ext = via1_4c_check_ext.interacting(via1_4c_check_ext.not(metal2))
Expand All @@ -126,5 +128,7 @@ if BEOL
via1_4c_check_ext.forget
via1_4c_check.forget
via1_4c_cond_metal.forget
via1_4c_check_space.forget
via1_4c_check_corner.forget

end #BEOL
67 changes: 37 additions & 30 deletions rules/klayout/drc/rule_decks/via2.drc
Original file line number Diff line number Diff line change
Expand Up @@ -19,32 +19,32 @@ if BEOL
#----------------------via2----------------------
#================================================

# Rule V2.1: Min/max Via1 size . is 0.26µm
# 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 Via1 size . : 0.26µm")
v21_l1.forget
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.2a: min. via2 spacing is 0.26µm
logger.info("Executing rule V2.2a")
v22a_l1 = via2.space(0.26.um, euclidian)
v22a_l1.output("V2.2a", "V2.2a : min. via2 spacing : 0.26µm")
v22a_l1.forget
V22a_l1 = via2.space(0.26.um, euclidian)
V22a_l1.output("V2.2a", "V2.2a : min. via2 spacing : 0.26µm")
V22a_l1.forget


# Rule V2.2b: Via1 Space in 4x4 or larger via2 array is 0.36µm
# Rule V2.2b: via2 Space in 4x4 or larger via2 array is 0.36µm
logger.info("Executing rule V2.2b")
poss_4_4_via2 = via2.sized(0.18, "square_limit").merged.sized(-0.18, "square_limit")
via2_4x4_loc = poss_4_4_via2.not_interacting(poss_4_4_via2.edges.with_length(nil, 2.115))
selected_via2 = via2.interacting(via2_4x4_loc)
via2b_l1 = selected_via2.space(0.36.um, euclidian)
via2b_l1.output("V2.2b", "V2.2b : Via1 Space in 4x4 or larger via2 array : 0.36µm")
via2b_l1.output("V2.2b", "V2.2b : via2 Space in 4x4 or larger via2 array : 0.36µm")
via2b_l1.forget
poss_4_4_via2.forget
via2_4x4_loc.forget
selected_via2.forget

# Rule V2.3a: metal2 overlap of via4.
# Rule V2.3a: metal2 overlap of via2.
logger.info("Executing rule V2.3a")
v23a_l1 = via2.not(metal2)
v23a_l2 = metal2.enclosing(via2, 0.01.um, euclidian).polygons(0.001)
Expand All @@ -53,23 +53,26 @@ if BEOL
v23a_l1.forget
v23a_l2.forget
v23a_l.forget


# rule V2.3b is not a DRC check
# Rule V2.3c: metal2 (< 0.34um) end-of-line overlap. is 0.06µm
logger.info("Executing rule V2.3c")
v2p3c_cond = metal2.width(0.34.um + 1.dbu).with_length(0.28.um,nil,both)
v2p3c_eol = metal2.edges.with_length(nil, 0.34.um).interacting(v2p3c_cond.first_edges).interacting(v2p3c_cond.second_edges).not(v2p3c_cond.first_edges).not(v2p3c_cond.second_edges)
v2p3c_eol_extended_in = v2p3c_eol.extended_in(0.06.um - 2.dbu)
v2p3c_l1 = via2.interacting(v2p3c_eol_extended_in)
v2p3c_l1.output("V2.3c", "V2.3c : metal2 (< 0.34um) end-of-line overlap. : 0.06µm")
v2p3c_l1.forget
v2p3c_cond.forget
v2p3c_eol.forget
v2p3c_eol_extended_in.forget
V2p3c_cond = metal2.width(0.34.um + 1.dbu).with_length(0.28.um,nil,both)
V2p3c_eol = metal2.edges.with_length(nil, 0.34.um).interacting(V2p3c_cond.first_edges).interacting(V2p3c_cond.second_edges).not(V2p3c_cond.first_edges).not(V2p3c_cond.second_edges)
V2p3c_eol_extended_in = V2p3c_eol.extended_in(0.06.um - 2.dbu)
V2p3c_l1 = via2.interacting(V2p3c_eol_extended_in)
V2p3c_l1.output("V2.3c", "V2.3c : metal2 (< 0.34um) end-of-line overlap. : 0.06µm")
V2p3c_l1.forget
V2p3c_cond.forget
V2p3c_eol.forget
V2p3c_eol_extended_in.forget

logger.info("Executing rule V2.3d")
via2_3d_cond_metal = metal2.enclosing(via2, 0.04.um, projection).edges.interacting(via2)
via2_3d_check = via2.interacting(via2_3d_cond_metal).edges.not(via2_3d_cond_metal)
via2_3d_check_space = via2.interacting(via2_3d_cond_metal).edges
via2_3d_check_corner = via2_3d_cond_metal.extended_in(0.002.um)
via2_3d_check = via2_3d_check_space.interacting(via2_3d_check_corner).not(via2_3d_cond_metal)
via2_cond_corner = via2_3d_cond_metal.width(0.002.um, angle_limit(135)).polygons
via2_3d_check_ext = via2_3d_check.extended_out(0.06.um - 1.dbu)
bad_ext = via2_3d_check_ext.interacting(via2_3d_check_ext.not(metal2))
Expand Down Expand Up @@ -100,19 +103,21 @@ if BEOL

# Rule V2.4b: metal3 (< 0.34um) end-of-line overlap. is 0.06µm
logger.info("Executing rule V2.4b")
v2p4b_cond = metal3.width(0.34.um + 1.dbu).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)
v2p4b_eol_extended_in = v2p4b_eol.extended_in(0.06.um - 2.dbu)
v2p4b_l1 = via2.interacting(v2p4b_eol_extended_in)
v2p4b_l1.output("V2.4b", "V2.4b : metal3 (< 0.34um) end-of-line overlap. : 0.06µm")
v2p4b_l1.forget
v2p4b_cond.forget
v2p4b_eol.forget
v2p4b_eol_extended_in.forget
V2p4b_cond = metal3.width(0.34.um + 1.dbu).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)
V2p4b_eol_extended_in = V2p4b_eol.extended_in(0.06.um - 2.dbu)
V2p4b_l1 = via2.interacting(V2p4b_eol_extended_in)
V2p4b_l1.output("V2.4b", "V2.4b : metal3 (< 0.34um) end-of-line overlap. : 0.06µm")
V2p4b_l1.forget
V2p4b_cond.forget
V2p4b_eol.forget
V2p4b_eol_extended_in.forget

logger.info("Executing rule V2.4c")
via2_4c_cond_metal = metal3.enclosing(via2, 0.04.um, projection).edges.interacting(via2)
via2_4c_check = via2.interacting(via2_4c_cond_metal).edges.not(via2_4c_cond_metal)
via2_4c_check_space = via2.interacting(via2_4c_cond_metal).edges
via2_4c_check_corner = via2_4c_cond_metal.extended_in(0.002.um)
via2_4c_check = via2_4c_check_space.interacting(via2_4c_check_corner).not(via2_4c_cond_metal)
via2_cond_corner = via2_4c_cond_metal.width(0.002.um, angle_limit(135)).polygons
via2_4c_check_ext = via2_4c_check.extended_out(0.06.um - 1.dbu)
bad_ext = via2_4c_check_ext.interacting(via2_4c_check_ext.not(metal3))
Expand All @@ -128,5 +133,7 @@ if BEOL
via2_4c_check_ext.forget
via2_4c_check.forget
via2_4c_cond_metal.forget
via2_4c_check_space.forget
via2_4c_check_corner.forget

end #BEOL
81 changes: 44 additions & 37 deletions rules/klayout/drc/rule_decks/via3.drc
Original file line number Diff line number Diff line change
Expand Up @@ -19,57 +19,60 @@ if BEOL
#----------------------via3----------------------
#================================================

# Rule V3.1: Min/max Via1 size . is 0.26µm
# 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 Via1 size . : 0.26µm")
v31_l1.forget
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.2a: min. via3 spacing is 0.26µm
logger.info("Executing rule V3.2a")
v32a_l1 = via3.space(0.26.um, euclidian)
v32a_l1.output("V3.2a", "V3.2a : min. via3 spacing : 0.26µm")
v32a_l1.forget
V32a_l1 = via3.space(0.26.um, euclidian)
V32a_l1.output("V3.2a", "V3.2a : min. via3 spacing : 0.26µm")
V32a_l1.forget


# Rule V3.2b: Via1 Space in 4x4 or larger via3 array is 0.36µm
# Rule V3.2b: via3 Space in 4x4 or larger via3 array is 0.36µm
logger.info("Executing rule V3.2b")
poss_4_4_via3 = via3.sized(0.18, "square_limit").merged.sized(-0.18, "square_limit")
via3_4x4_loc = poss_4_4_via3.not_interacting(poss_4_4_via3.edges.with_length(nil, 2.115))
selected_via3 = via3.interacting(via3_4x4_loc)
via3b_l1 = selected_via3.space(0.36.um, euclidian)
via3b_l1.output("V3.2b", "V3.2b : Via1 Space in 4x4 or larger via3 array : 0.36µm")
via3b_l1.output("V3.2b", "V3.2b : via3 Space in 4x4 or larger via3 array : 0.36µm")
via3b_l1.forget
poss_4_4_via3.forget
via3_4x4_loc.forget
selected_via3.forget

# Rule V3.3a: metal3 overlap of via4.
# Rule V3.3a: metal3 overlap of via3.
logger.info("Executing rule V3.3a")
v33a_l1 = via3.not(metal3)
v33a_l2 = metal3.enclosing(via3, 0.01.um, euclidian).polygons(0.001)
v33a_l = v33a_l1.or(v33a_l2)
v33a_l1.output("V3.3a", "V3.3a : metal3 overlap of via3 >= 0.01")
v33a_l1.forget
v33a_l2.forget
v33a_l.forget
V33a_l1 = via3.not(metal3)
V33a_l2 = metal3.enclosing(via3, 0.01.um, euclidian).polygons(0.001)
V33a_l = V33a_l1.or(V33a_l2)
V33a_l1.output("V3.3a", "V3.3a : metal3 overlap of via3 >= 0.01")
V33a_l1.forget
V33a_l2.forget
V33a_l.forget


# rule V3.3b is not a DRC check
# Rule V3.3c: metal3 (< 0.34um) end-of-line overlap. is 0.06µm
logger.info("Executing rule V3.3c")
v3p3c_cond = metal3.width(0.34.um + 1.dbu).with_length(0.28.um,nil,both)
v3p3c_eol = metal3.edges.with_length(nil, 0.34.um).interacting(v3p3c_cond.first_edges).interacting(v3p3c_cond.second_edges).not(v3p3c_cond.first_edges).not(v3p3c_cond.second_edges)
v3p3c_eol_extended_in = v3p3c_eol.extended_in(0.06.um - 2.dbu)
v3p3c_l1 = via3.interacting(v3p3c_eol_extended_in)
v3p3c_l1.output("V3.3c", "V3.3c : metal3 (< 0.34um) end-of-line overlap. : 0.06µm")
v3p3c_l1.forget
v3p3c_cond.forget
v3p3c_eol.forget
v3p3c_eol_extended_in.forget
V3p3c_cond = metal3.width(0.34.um + 1.dbu).with_length(0.28.um,nil,both)
V3p3c_eol = metal3.edges.with_length(nil, 0.34.um).interacting(V3p3c_cond.first_edges).interacting(V3p3c_cond.second_edges).not(V3p3c_cond.first_edges).not(V3p3c_cond.second_edges)
V3p3c_eol_extended_in = V3p3c_eol.extended_in(0.06.um - 2.dbu)
V3p3c_l1 = via3.interacting(V3p3c_eol_extended_in)
V3p3c_l1.output("V3.3c", "V3.3c : metal3 (< 0.34um) end-of-line overlap. : 0.06µm")
V3p3c_l1.forget
V3p3c_cond.forget
V3p3c_eol.forget
V3p3c_eol_extended_in.forget

logger.info("Executing rule V3.3d")
via3_3d_cond_metal = metal3.enclosing(via3, 0.04.um, projection).edges.interacting(via3)
via3_3d_check = via3.interacting(via3_3d_cond_metal).edges.not(via3_3d_cond_metal)
via3_3d_check_space = via3.interacting(via3_3d_cond_metal).edges
via3_3d_check_corner = via3_3d_cond_metal.extended_in(0.002.um)
via3_3d_check = via3_3d_check_space.interacting(via3_3d_check_corner).not(via3_3d_cond_metal)
via3_cond_corner = via3_3d_cond_metal.width(0.002.um, angle_limit(135)).polygons
via3_3d_check_ext = via3_3d_check.extended_out(0.06.um - 1.dbu)
bad_ext = via3_3d_check_ext.interacting(via3_3d_check_ext.not(metal3))
Expand Down Expand Up @@ -100,19 +103,21 @@ if BEOL

# Rule V3.4b: metal4 (< 0.34um) end-of-line overlap. is 0.06µm
logger.info("Executing rule V3.4b")
v3p4b_cond = metal4.width(0.34.um + 1.dbu).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)
v3p4b_eol_extended_in = v3p4b_eol.extended_in(0.06.um - 2.dbu)
v3p4b_l1 = via3.interacting(v3p4b_eol_extended_in)
v3p4b_l1.output("V3.4b", "V3.4b : metal4 (< 0.34um) end-of-line overlap. : 0.06µm")
v3p4b_l1.forget
v3p4b_cond.forget
v3p4b_eol.forget
v3p4b_eol_extended_in.forget
V3p4b_cond = metal4.width(0.34.um + 1.dbu).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)
V3p4b_eol_extended_in = V3p4b_eol.extended_in(0.06.um - 2.dbu)
V3p4b_l1 = via3.interacting(V3p4b_eol_extended_in)
V3p4b_l1.output("V3.4b", "V3.4b : metal4 (< 0.34um) end-of-line overlap. : 0.06µm")
V3p4b_l1.forget
V3p4b_cond.forget
V3p4b_eol.forget
V3p4b_eol_extended_in.forget

logger.info("Executing rule V3.4c")
via3_4c_cond_metal = metal4.enclosing(via3, 0.04.um, projection).edges.interacting(via3)
via3_4c_check = via3.interacting(via3_4c_cond_metal).edges.not(via3_4c_cond_metal)
via3_4c_check_space = via3.interacting(via3_4c_cond_metal).edges
via3_4c_check_corner = via3_4c_cond_metal.extended_in(0.002.um)
via3_4c_check = via3_4c_check_space.interacting(via3_4c_check_corner).not(via3_4c_cond_metal)
via3_cond_corner = via3_4c_cond_metal.width(0.002.um, angle_limit(135)).polygons
via3_4c_check_ext = via3_4c_check.extended_out(0.06.um - 1.dbu)
bad_ext = via3_4c_check_ext.interacting(via3_4c_check_ext.not(metal4))
Expand All @@ -128,5 +133,7 @@ if BEOL
via3_4c_check_ext.forget
via3_4c_check.forget
via3_4c_cond_metal.forget
via3_4c_check_space.forget
via3_4c_check_corner.forget

end #BEOL
79 changes: 43 additions & 36 deletions rules/klayout/drc/rule_decks/via4.drc
Original file line number Diff line number Diff line change
Expand Up @@ -19,57 +19,60 @@ if BEOL
#----------------------via4----------------------
#================================================

# Rule V4.1: Min/max Via1 size . is 0.26µm
# Rule V4.1: Min/max via4 size . is 0.26µm
logger.info("Executing rule V4.1")
v41_l1 = via4.edges.without_length(0.26.um).extended(0, 0, 0.001, 0.001)
v41_l1.output("V4.1", "V4.1 : Min/max Via1 size . : 0.26µm")
v41_l1.forget
V41_l1 = via4.edges.without_length(0.26.um).extended(0, 0, 0.001, 0.001)
V41_l1.output("V4.1", "V4.1 : Min/max via4 size . : 0.26µm")
V41_l1.forget

# Rule V4.2a: min. via4 spacing is 0.26µm
logger.info("Executing rule V4.2a")
v42a_l1 = via4.space(0.26.um, euclidian)
v42a_l1.output("V4.2a", "V4.2a : min. via4 spacing : 0.26µm")
v42a_l1.forget
V42a_l1 = via4.space(0.26.um, euclidian)
V42a_l1.output("V4.2a", "V4.2a : min. via4 spacing : 0.26µm")
V42a_l1.forget


# Rule V4.2b: Via1 Space in 4x4 or larger via4 array is 0.36µm
# Rule V4.2b: via4 Space in 4x4 or larger via4 array is 0.36µm
logger.info("Executing rule V4.2b")
poss_4_4_via4 = via4.sized(0.18, "square_limit").merged.sized(-0.18, "square_limit")
via4_4x4_loc = poss_4_4_via4.not_interacting(poss_4_4_via4.edges.with_length(nil, 2.115))
selected_via4 = via4.interacting(via4_4x4_loc)
via4b_l1 = selected_via4.space(0.36.um, euclidian)
via4b_l1.output("V4.2b", "V4.2b : Via1 Space in 4x4 or larger via4 array : 0.36µm")
via4b_l1.output("V4.2b", "V4.2b : via4 Space in 4x4 or larger via4 array : 0.36µm")
via4b_l1.forget
poss_4_4_via4.forget
via4_4x4_loc.forget
selected_via4.forget

# Rule V4.3a: metal4 overlap of via4.
logger.info("Executing rule V4.3a")
v43a_l1 = via4.not(metal4)
v43a_l2 = metal4.enclosing(via4, 0.01.um, euclidian).polygons(0.001)
v43a_l = v43a_l1.or(v43a_l2)
v43a_l1.output("V4.3a", "V4.3a : metal4 overlap of via4 >= 0.01")
v43a_l1.forget
v43a_l2.forget
v43a_l.forget
V43a_l1 = via4.not(metal4)
V43a_l2 = metal4.enclosing(via4, 0.01.um, euclidian).polygons(0.001)
V43a_l = V43a_l1.or(V43a_l2)
V43a_l1.output("V4.3a", "V4.3a : metal4 overlap of via4 >= 0.01")
V43a_l1.forget
V43a_l2.forget
V43a_l.forget


# rule V4.3b is not a DRC check
# Rule V4.3c: metal4 (< 0.34um) end-of-line overlap. is 0.06µm
logger.info("Executing rule V4.3c")
v4p3c_cond = metal4.width(0.34.um + 1.dbu).with_length(0.28.um,nil,both)
v4p3c_eol = metal4.edges.with_length(nil, 0.34.um).interacting(v4p3c_cond.first_edges).interacting(v4p3c_cond.second_edges).not(v4p3c_cond.first_edges).not(v4p3c_cond.second_edges)
v4p3c_eol_extended_in = v4p3c_eol.extended_in(0.06.um - 2.dbu)
v4p3c_l1 = via4.interacting(v4p3c_eol_extended_in)
v4p3c_l1.output("V4.3c", "V4.3c : metal4 (< 0.34um) end-of-line overlap. : 0.06µm")
v4p3c_l1.forget
v4p3c_cond.forget
v4p3c_eol.forget
v4p3c_eol_extended_in.forget
V4p3c_cond = metal4.width(0.34.um + 1.dbu).with_length(0.28.um,nil,both)
V4p3c_eol = metal4.edges.with_length(nil, 0.34.um).interacting(V4p3c_cond.first_edges).interacting(V4p3c_cond.second_edges).not(V4p3c_cond.first_edges).not(V4p3c_cond.second_edges)
V4p3c_eol_extended_in = V4p3c_eol.extended_in(0.06.um - 2.dbu)
V4p3c_l1 = via4.interacting(V4p3c_eol_extended_in)
V4p3c_l1.output("V4.3c", "V4.3c : metal4 (< 0.34um) end-of-line overlap. : 0.06µm")
V4p3c_l1.forget
V4p3c_cond.forget
V4p3c_eol.forget
V4p3c_eol_extended_in.forget

logger.info("Executing rule V4.3d")
via4_3d_cond_metal = metal4.enclosing(via4, 0.04.um, projection).edges.interacting(via4)
via4_3d_check = via4.interacting(via4_3d_cond_metal).edges.not(via4_3d_cond_metal)
via4_3d_check_space = via4.interacting(via4_3d_cond_metal).edges
via4_3d_check_corner = via4_3d_cond_metal.extended_in(0.002.um)
via4_3d_check = via4_3d_check_space.interacting(via4_3d_check_corner).not(via4_3d_cond_metal)
via4_cond_corner = via4_3d_cond_metal.width(0.002.um, angle_limit(135)).polygons
via4_3d_check_ext = via4_3d_check.extended_out(0.06.um - 1.dbu)
bad_ext = via4_3d_check_ext.interacting(via4_3d_check_ext.not(metal4))
Expand Down Expand Up @@ -100,19 +103,21 @@ if BEOL

# Rule V4.4b: metal5 (< 0.34um) end-of-line overlap. is 0.06µm
logger.info("Executing rule V4.4b")
v4p4b_cond = metal5.width(0.34.um + 1.dbu).with_length(0.28.um,nil,both)
v4p4b_eol = metal5.edges.with_length(nil, 0.34.um).interacting(v4p4b_cond.first_edges).interacting(v4p4b_cond.second_edges).not(v4p4b_cond.first_edges).not(v4p4b_cond.second_edges)
v4p4b_eol_extended_in = v4p4b_eol.extended_in(0.06.um - 2.dbu)
v4p4b_l1 = via4.interacting(v4p4b_eol_extended_in)
v4p4b_l1.output("V4.4b", "V4.4b : metal5 (< 0.34um) end-of-line overlap. : 0.06µm")
v4p4b_l1.forget
v4p4b_cond.forget
v4p4b_eol.forget
v4p4b_eol_extended_in.forget
V4p4b_cond = metal5.width(0.34.um + 1.dbu).with_length(0.28.um,nil,both)
V4p4b_eol = metal5.edges.with_length(nil, 0.34.um).interacting(V4p4b_cond.first_edges).interacting(V4p4b_cond.second_edges).not(V4p4b_cond.first_edges).not(V4p4b_cond.second_edges)
V4p4b_eol_extended_in = V4p4b_eol.extended_in(0.06.um - 2.dbu)
V4p4b_l1 = via4.interacting(V4p4b_eol_extended_in)
V4p4b_l1.output("V4.4b", "V4.4b : metal5 (< 0.34um) end-of-line overlap. : 0.06µm")
V4p4b_l1.forget
V4p4b_cond.forget
V4p4b_eol.forget
V4p4b_eol_extended_in.forget

logger.info("Executing rule V4.4c")
via4_4c_cond_metal = metal5.enclosing(via4, 0.04.um, projection).edges.interacting(via4)
via4_4c_check = via4.interacting(via4_4c_cond_metal).edges.not(via4_4c_cond_metal)
via4_4c_check_space = via4.interacting(via4_4c_cond_metal).edges
via4_4c_check_corner = via4_4c_cond_metal.extended_in(0.002.um)
via4_4c_check = via4_4c_check_space.interacting(via4_4c_check_corner).not(via4_4c_cond_metal)
via4_cond_corner = via4_4c_cond_metal.width(0.002.um, angle_limit(135)).polygons
via4_4c_check_ext = via4_4c_check.extended_out(0.06.um - 1.dbu)
bad_ext = via4_4c_check_ext.interacting(via4_4c_check_ext.not(metal5))
Expand All @@ -128,5 +133,7 @@ if BEOL
via4_4c_check_ext.forget
via4_4c_check.forget
via4_4c_cond_metal.forget
via4_4c_check_space.forget
via4_4c_check_corner.forget

end #BEOL
Loading

0 comments on commit 8352d2e

Please sign in to comment.