Cleanup trailing whitespace in DRC files.
Signed-off-by: Tim 'mithro' Ansell <tansell@google.com>
diff --git a/rules/klayout/drc/rule_decks/10v_ldnmos.drc b/rules/klayout/drc/rule_decks/10v_ldnmos.drc
index e008dbc..2d2a76f 100644
--- a/rules/klayout/drc/rule_decks/10v_ldnmos.drc
+++ b/rules/klayout/drc/rule_decks/10v_ldnmos.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -117,7 +117,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -126,12 +126,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -198,41 +198,41 @@
#================================================
#-------------------10V LDNMOS-------------------
-#================================================
+#================================================
# Rule MDN.1: Min MVSD width (for litho purpose). is 1µm
logger.info("Executing rule MDN.1")
mdn1_l1 = mvsd.width(1.um, euclidian).polygons(0.001)
mdn1_l1.output("MDN.1", "MDN.1 : Min MVSD width (for litho purpose). : 1µm")
-mdn1_l1.forget
+mdn1_l1.forget
if CONNECTIVITY_RULES
-logger.info("CONNECTIVITY_RULES section")
+logger.info("CONNECTIVITY_RULES section")
-connected_mdn_2a, unconnected_mdn_2b = conn_space(mvsd, 1, 2, euclidian)
+connected_mdn_2a, unconnected_mdn_2b = conn_space(mvsd, 1, 2, euclidian)
# Rule MDN.2a: Min MVSD space [Same Potential]. is 1µm
logger.info("Executing rule MDN.2a")
mdn2a_l1 = connected_mdn_2a
mdn2a_l1.output("MDN.2a", "MDN.2a : Min MVSD space [Same Potential]. : 1µm")
-mdn2a_l1.forget
+mdn2a_l1.forget
# Rule MDN.2b: Min MVSD space [Diff Potential]. is 2µm
logger.info("Executing rule MDN.2b")
mdn2b_l1 = unconnected_mdn_2b
mdn2b_l1.output("MDN.2b", "MDN.2b : Min MVSD space [Diff Potential]. : 2µm")
-mdn2b_l1.forget
+mdn2b_l1.forget
else
-logger.info("CONNECTIVITY_RULES disabled section")
+logger.info("CONNECTIVITY_RULES disabled section")
# Rule MDN.2b: Min MVSD space [Diff Potential]. is 2µm
logger.info("Executing rule MDN.2b")
mdn2b_l1 = mvsd.space(2.um, euclidian).polygons(0.001)
mdn2b_l1.output("MDN.2b", "MDN.2b : Min MVSD space [Diff Potential]. : 2µm")
-mdn2b_l1.forget
+mdn2b_l1.forget
-end #CONNECTIVITY_RULES
+end #CONNECTIVITY_RULES
gate_mdn = poly2.and(comp).inside(ldmos_xtor).inside(dualgate)
# Rule MDN.3a: Min transistor channel length. is 0.6µm
@@ -253,7 +253,7 @@
logger.info("Executing rule MDN.4a")
mdn4a_l1 = gate_mdn.edges.not(mvsd).interacting(mvsd).width(4.um, euclidian).polygons(0.001)
mdn4a_l1.output("MDN.4a", "MDN.4a : Min transistor channel width. : 4µm")
-mdn4a_l1.forget
+mdn4a_l1.forget
# Rule MDN.4b: Max transistor channel width.
logger.info("Executing rule MDN.4b")
@@ -274,7 +274,7 @@
logger.info("Executing rule MDN.5aii")
mdn5aii_l1 = pcomp.interacting(ncomp).inside(ldmos_xtor).inside(dualgate).not(nplus).separation(mvsd, 0.92.um, euclidian).polygons(0.001)
mdn5aii_l1.output("MDN.5aii", "MDN.5aii : Min PCOMP (Pplus AND COMP) space to LDNMOS Drain MVSD (source and body tap butted). PCOMP (Pplus AND COMP) intercept with LDNMOS Drain MVSD is not allowed. : 0.92µm")
-mdn5aii_l1.forget
+mdn5aii_l1.forget
ncomp_mdn5b = ncomp.inside(ldmos_xtor).inside(dualgate)
pcomp_mdn5b = pcomp.inside(ldmos_xtor).inside(dualgate)
@@ -286,7 +286,7 @@
ncomp_mdn5b.forget
pcomp_mdn5b.forget
-mdn_5c_ncompsd = ncomp.inside(ldmos_xtor).inside(dualgate).interacting(mvsd).sized(0.36.um).sized(-0.36.um).extents
+mdn_5c_ncompsd = ncomp.inside(ldmos_xtor).inside(dualgate).interacting(mvsd).sized(0.36.um).sized(-0.36.um).extents
mdn_5c_error = mdn_5c_ncompsd.edges.centers(0, 0.99).not_interacting(mdn_5c_ncompsd.drc(separation(pcomp, euclidian) <= 15.um).polygons(0.001))
# Rule MDN.5c: Maximum distance of the nearest edge of the substrate tab from NCOMP edge. is 15µm
logger.info("Executing rule MDN.5c")
@@ -321,9 +321,9 @@
mdn7a_l1.forget
if CONNECTIVITY_RULES
-logger.info("CONNECTIVITY_RULES section")
+logger.info("CONNECTIVITY_RULES section")
-connected_mdn_8a, unconnected_mdn_8b = conn_separation(mvsd, nwell, 1, 2, euclidian)
+connected_mdn_8a, unconnected_mdn_8b = conn_separation(mvsd, nwell, 1, 2, euclidian)
# Rule MDN.8a: Min LDNMOS drain MVSD space to any other equal potential Nwell space.
logger.info("Executing rule MDN.8a")
@@ -338,7 +338,7 @@
mdn8b_l1.forget
else
-logger.info("CONNECTIVITY_RULES disabled section")
+logger.info("CONNECTIVITY_RULES disabled section")
# Rule MDN.8b: Min LDNMOS drain MVSD space to any other different potential Nwell space.
logger.info("Executing rule MDN.8b")
@@ -346,13 +346,13 @@
mdn8b_l1.output("MDN.8b", "MDN.8b : Min LDNMOS drain MVSD space to any other different potential Nwell space.")
mdn8b_l1.forget
-end #CONNECTIVITY_RULES
+end #CONNECTIVITY_RULES
# Rule MDN.9: Min LDNMOS drain MVSD space to NCOMP (Nplus AND COMP) outside LDNMOS drain MVSD. is 4µm
logger.info("Executing rule MDN.9")
mdn9_l1 = mvsd.inside(dualgate).inside(ldmos_xtor).separation(ncomp.not_interacting(mvsd), 4.um, euclidian).polygons(0.001)
mdn9_l1.output("MDN.9", "MDN.9 : Min LDNMOS drain MVSD space to NCOMP (Nplus AND COMP) outside LDNMOS drain MVSD. : 4µm")
-mdn9_l1.forget
+mdn9_l1.forget
# rule MDN.10 is not a DRC check
@@ -361,7 +361,7 @@
logger.info("Executing rule MDN.10a")
mdn10a_l1 = poly_mdn10.width(1.2.um, euclidian).polygons(0.001)
mdn10a_l1.output("MDN.10a", "MDN.10a : Min LDNMOS POLY2 width. : 1.2µm")
-mdn10a_l1.forget
+mdn10a_l1.forget
# Rule MDN.10b: Min POLY2 extension beyond COMP in the width direction of the transistor (other than the LDNMOS drain direction). is 0.4µm
logger.info("Executing rule MDN.10b")
@@ -405,7 +405,7 @@
logger.info("Executing rule MDN.10eii")
mdn10eii_l1 = poly_mdn10.separation(pcomp.not(nplus).interacting(ncomp.not(pplus)), 0.32.um, euclidian).polygons(0.001)
mdn10eii_l1.output("MDN.10eii", "MDN.10eii : Min POLY2 space to Psub tap (source and body tap butted). : 0.32µm")
-mdn10eii_l1.forget
+mdn10eii_l1.forget
# Rule MDN.10f: Poly2 interconnect in HV region (LDMOS_XTOR marked region) not allowed. Also, any Poly2 interconnect with poly2 to substrate potential greater than 6V is not allowed.
logger.info("Executing rule MDN.10f")
@@ -486,7 +486,7 @@
logger.info("Executing rule MDN.15a")
mdn15a_l1 = comp.inside(mvsd).inside(dualgate).inside(ldmos_xtor).width(0.22.um, euclidian).polygons(0.001)
mdn15a_l1.output("MDN.15a", "MDN.15a : Min LDNMOS drain COMP width. : 0.22µm")
-mdn15a_l1.forget
+mdn15a_l1.forget
# Rule MDN.15b: Min LDNMOS drain COMP enclose contact. is 0µm
logger.info("Executing rule MDN.15b")
diff --git a/rules/klayout/drc/rule_decks/10v_ldpmos.drc b/rules/klayout/drc/rule_decks/10v_ldpmos.drc
index c9a1ac4..c09453d 100644
--- a/rules/klayout/drc/rule_decks/10v_ldpmos.drc
+++ b/rules/klayout/drc/rule_decks/10v_ldpmos.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -118,7 +118,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -127,12 +127,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -224,7 +224,7 @@
connect(metal5, via5)
connect(via5, metaltop)
-end #CONNECTIVITY_RULES
+end #CONNECTIVITY_RULES
#================================================
#------------ PRE-DEFINED FUNCTIONS -------------
@@ -250,7 +250,7 @@
end
end
unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
- return connected_output, unconnected_output
+ return connected_output, unconnected_output
end
def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
@@ -279,10 +279,10 @@
if CONNECTIVITY_RULES
logger.info("Connectivity rules enabled, Netlist object will be generated.")
netlist
-end #CONNECTIVITY_RULES
+end #CONNECTIVITY_RULES
# === LAYOUT EXTENT ===
-CHIP = extent.sized(0.0)
+CHIP = extent.sized(0.0)
logger.info("Total area of the design is #{CHIP.area()} um^2.")
@@ -290,7 +290,7 @@
#================================================
#-------------------10V LDPMOS-------------------
-#================================================
+#================================================
mdp_source = (pcomp).interacting(poly2.and(dualgate).and(ldmos_xtor).and(mvpsd)).not(poly2)
ldpmos = poly2.and(pcomp).and(dualgate).not(mvpsd).inside(ldmos_xtor)
@@ -312,7 +312,7 @@
logger.info("Executing rule MDP.2")
mdp2_l1 = poly2.and(comp).inside(ldmos_xtor).inside(dualgate).edges.not(mvpsd).interacting(mvpsd).width(4.um, euclidian).polygons(0.001)
mdp2_l1.output("MDP.2", "MDP.2 : Minimum transistor channel width. : 4µm")
-mdp2_l1.forget
+mdp2_l1.forget
mdp3_1 = ldpmos.or(mvpsd).or(mdp_source).not_interacting(ncomp.holes).inside(dualgate).inside(ldmos_xtor)
mdp3_2 = ncomp.holes.not_interacting(ncomp.interacting(mdp_source)).not_interacting(mvpsd,1,1).inside(dualgate).inside(ldmos_xtor)
@@ -344,7 +344,7 @@
logger.info("Executing rule MDP.3b")
mdp3b_l1 = ncomp_mdp3b.not(poly2).not(mvpsd).separation(pcomp_mdp3b.not(poly2).not(mvpsd), 0.4.um, euclidian).polygons(0.001)
mdp3b_l1.output("MDP.3b", "MDP.3b : Min NCOMP (Nplus AND COMP) space to PCOMP in DNWELL (Pplus AND COMP AND DNWELL). Use butted source and DNWELL contacts otherwise and that is best for Latch-up immunity as well. : 0.4µm")
-mdp3b_l1.forget
+mdp3b_l1.forget
ncomp_mdp3b.forget
pcomp_mdp3b.forget
@@ -372,7 +372,7 @@
logger.info("Executing rule MDP.4a")
mdp4a_l1 = pcomp.inside(ldmos_xtor).inside(dualgate).separation(dnwell.inside(ldmos_xtor).inside(dualgate), 2.5.um, euclidian).polygons(0.001)
mdp4a_l1.output("MDP.4a", "MDP.4a : Min PCOMP (Pplus AND COMP) space to DNWELL. : 2.5µm")
-mdp4a_l1.forget
+mdp4a_l1.forget
mdp4b_dnwell_edges = dnwell.inside(ldmos_xtor).inside(dualgate).edges.centers(0, 0.99)
mdp4b_not_error = dnwell.drc(separation(pcomp.inside(ldmos_xtor.interacting(mvpsd)).inside(dualgate).not_interacting(mvpsd), euclidian) <= 15.um).polygons(0.001)
@@ -416,19 +416,19 @@
logger.info("Executing rule MDP.7")
mdp7_l1 = ldmos_xtor.separation(nwell.outside(ldmos_xtor), 2.um, euclidian).polygons(0.001)
mdp7_l1.output("MDP.7", "MDP.7 : Minimum LDMOS_XTOR layer space to Nwell outside LDMOS_XTOR. : 2µm")
-mdp7_l1.forget
+mdp7_l1.forget
# Rule MDP.8: Minimum LDMOS_XTOR layer space to NCOMP outside LDMOS_XTOR. is 1.5µm
logger.info("Executing rule MDP.8")
mdp8_l1 = ldmos_xtor.separation(ncomp.outside(ldmos_xtor), 1.5.um, euclidian).polygons(0.001)
mdp8_l1.output("MDP.8", "MDP.8 : Minimum LDMOS_XTOR layer space to NCOMP outside LDMOS_XTOR. : 1.5µm")
-mdp8_l1.forget
+mdp8_l1.forget
# Rule MDP.9a: Min LDPMOS POLY2 width. is 1.2µm
logger.info("Executing rule MDP.9a")
mdp9a_l1 = poly2.inside(dnwell.and(dualgate).and(ldmos_xtor)).width(1.2.um, euclidian).polygons(0.001)
mdp9a_l1.output("MDP.9a", "MDP.9a : Min LDPMOS POLY2 width. : 1.2µm")
-mdp9a_l1.forget
+mdp9a_l1.forget
mdp9b_1 = poly2.inside(dnwell.and(dualgate).and(ldmos_xtor)).edges.interacting(mvpsd).not(mvpsd).enclosing(comp.edges,0.4.um).edges
mdp9b_2 = poly2.inside(dnwell.and(dualgate).and(ldmos_xtor)).edges.interacting(mvpsd).not(mvpsd).interacting(pcomp)
@@ -490,32 +490,32 @@
mdp10_l1.forget
if CONNECTIVITY_RULES
-logger.info("CONNECTIVITY_RULES section")
+logger.info("CONNECTIVITY_RULES section")
-connected_mdp_10b, unconnected_mdp_10a = conn_space(mvpsd, 1, 2, euclidian)
+connected_mdp_10b, unconnected_mdp_10a = conn_space(mvpsd, 1, 2, euclidian)
# Rule MDP.10a: Min MVPSD space within LDMOS_XTOR marking [diff potential]. is 2µm
logger.info("Executing rule MDP.10a")
mdp10a_l1 = unconnected_mdp_10a
mdp10a_l1.output("MDP.10a", "MDP.10a : Min MVPSD space within LDMOS_XTOR marking [diff potential]. : 2µm")
-mdp10a_l1.forget
+mdp10a_l1.forget
# Rule MDP.10b: Min MVPSD space [same potential]. Merge if space less than 1um. is 1µm
logger.info("Executing rule MDP.10b")
mdp10b_l1 = connected_mdp_10b
mdp10b_l1.output("MDP.10b", "MDP.10b : Min MVPSD space [same potential]. Merge if space less than 1um. : 1µm")
-mdp10b_l1.forget
+mdp10b_l1.forget
else
-logger.info("CONNECTIVITY_RULES disabled section")
+logger.info("CONNECTIVITY_RULES disabled section")
# Rule MDP.10a: Min MVPSD space within LDMOS_XTOR marking [diff potential]. is 2µm
logger.info("Executing rule MDP.10a")
mdp10a_l1 = mvpsd.space(2.um, euclidian).polygons(0.001)
mdp10a_l1.output("MDP.10a", "MDP.10a : Min MVPSD space within LDMOS_XTOR marking [diff potential]. : 2µm")
-mdp10a_l1.forget
+mdp10a_l1.forget
-end #CONNECTIVITY_RULES
+end #CONNECTIVITY_RULES
# Rule MDP.11: Min MVPSD enclosing PCOMP in the drain (MVPSD AND COMP NOT POLY2) direction and in the direction along the transistor width.
logger.info("Executing rule MDP.11")
@@ -561,13 +561,13 @@
logger.info("Executing rule MDP.15")
mdp15_l1 = dnwell.separation(dnwell.covering(mvpsd).inside(dualgate).inside(ldmos_xtor), 6.um, euclidian).polygons(0.001)
mdp15_l1.output("MDP.15", "MDP.15 : Min DNWELL enclosing MVPSD to any DNWELL spacing. : 6µm")
-mdp15_l1.forget
+mdp15_l1.forget
# Rule MDP.16a: Min LDPMOS drain COMP width. is 0.22µm
logger.info("Executing rule MDP.16a")
mdp16a_l1 = comp.inside(mvpsd).inside(dualgate).inside(ldmos_xtor).width(0.22.um, euclidian).polygons(0.001)
mdp16a_l1.output("MDP.16a", "MDP.16a : Min LDPMOS drain COMP width. : 0.22µm")
-mdp16a_l1.forget
+mdp16a_l1.forget
# Rule MDP.16b: Min LDPMOS drain COMP enclose contact. is 0µm
logger.info("Executing rule MDP.16b")
diff --git a/rules/klayout/drc/rule_decks/3.3v_sram.drc b/rules/klayout/drc/rule_decks/3.3v_sram.drc
index 19a496d..52cb68b 100644
--- a/rules/klayout/drc/rule_decks/3.3v_sram.drc
+++ b/rules/klayout/drc/rule_decks/3.3v_sram.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -116,7 +116,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -125,12 +125,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -197,7 +197,7 @@
#================================================
#-------------------3.3V SRAM--------------------
-#================================================
+#================================================
# Rule S.DF.4c_LV: Min. (Nwell overlap of PCOMP) outside DNWELL. is 0.4µm
logger.info("Executing rule S.DF.4c_LV")
@@ -213,7 +213,7 @@
logger.info("Executing rule S.DF.16_LV")
sdf16_l1 = ncomp.outside(nwell).outside(dnwell).inside(sramcore).separation(nwell.outside(dnwell).inside(sramcore), 0.4.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
sdf16_l1.output("S.DF.16_LV", "S.DF.16_LV : Min. space from (Nwell outside DNWELL) to (NCOMP outside Nwell and DNWELL). : 0.4µm")
-sdf16_l1.forget
+sdf16_l1.forget
# Rule S.CO.3_LV: Poly2 overlap of contact. is 0.04µm
logger.info("Executing rule S.CO.3_LV")
@@ -245,7 +245,7 @@
logger.info("Executing rule S.M1.1_LV")
sm11_l1 = metal1.and(sramcore).width(0.22.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
sm11_l1.output("S.M1.1_LV", "S.M1.1_LV : min. metal1 width : 0.22µm")
-sm11_l1.forget
+sm11_l1.forget
exec_end_time = Time.now
diff --git a/rules/klayout/drc/rule_decks/5v_sram.drc b/rules/klayout/drc/rule_decks/5v_sram.drc
index db61f7a..cad6d54 100644
--- a/rules/klayout/drc/rule_decks/5v_sram.drc
+++ b/rules/klayout/drc/rule_decks/5v_sram.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -116,7 +116,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -125,12 +125,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -197,7 +197,7 @@
#================================================
#--------------------5V SRAM---------------------
-#================================================
+#================================================
# Rule S.DF.4c_MV: Min. (Nwell overlap of PCOMP) outside DNWELL. is 0.45µm
logger.info("Executing rule S.DF.4c_MV")
@@ -219,7 +219,7 @@
logger.info("Executing rule S.DF.7_MV")
sdf7_l1 = pcomp.inside(dnwell).inside(sramcore).separation(lvpwell.inside(dnwell).inside(sramcore), 0.45.um, euclidian).polygons(0.001).overlapping(v5_xtor).overlapping(dualgate)
sdf7_l1.output("S.DF.7_MV", "S.DF.7_MV : Min. (LVPWELL Spacer to PCOMP) inside DNWELL. : 0.45µm")
-sdf7_l1.forget
+sdf7_l1.forget
# Rule S.DF.8_MV: Min. (LVPWELL overlap of NCOMP) Inside DNWELL. is 0.45µm
logger.info("Executing rule S.DF.8_MV")
@@ -235,19 +235,19 @@
logger.info("Executing rule S.DF.16_MV")
sdf16_l1 = ncomp.outside(nwell).outside(dnwell).inside(sramcore).separation(nwell.outside(dnwell).inside(sramcore), 0.45.um, euclidian).polygons(0.001).overlapping(v5_xtor).overlapping(dualgate)
sdf16_l1.output("S.DF.16_MV", "S.DF.16_MV : Min. space from (Nwell outside DNWELL) to (NCOMP outside Nwell and DNWELL). : 0.45µm")
-sdf16_l1.forget
+sdf16_l1.forget
# Rule S.PL.5a_MV: Space from field Poly2 to unrelated COMP Spacer from field Poly2 to Guard-ring. is 0.12µm
logger.info("Executing rule S.PL.5a_MV")
spl5a_l1 = poly2.inside(sramcore).separation(comp.inside(sramcore), 0.12.um, euclidian).polygons(0.001).overlapping(v5_xtor).overlapping(dualgate)
spl5a_l1.output("S.PL.5a_MV", "S.PL.5a_MV : Space from field Poly2 to unrelated COMP Spacer from field Poly2 to Guard-ring. : 0.12µm")
-spl5a_l1.forget
+spl5a_l1.forget
# Rule S.PL.5b_MV: Space from field Poly2 to related COMP. is 0.12µm
logger.info("Executing rule S.PL.5b_MV")
spl5b_l1 = poly2.inside(sramcore).separation(comp.inside(sramcore), 0.12.um, euclidian).polygons(0.001).overlapping(v5_xtor).overlapping(dualgate)
spl5b_l1.output("S.PL.5b_MV", "S.PL.5b_MV : Space from field Poly2 to related COMP. : 0.12µm")
-spl5b_l1.forget
+spl5b_l1.forget
# Rule S.CO.4_MV: COMP overlap of contact. is 0.04µm
logger.info("Executing rule S.CO.4_MV")
diff --git a/rules/klayout/drc/rule_decks/comp.drc b/rules/klayout/drc/rule_decks/comp.drc
index 0f9cba1..080bb31 100644
--- a/rules/klayout/drc/rule_decks/comp.drc
+++ b/rules/klayout/drc/rule_decks/comp.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -125,7 +125,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -134,12 +134,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -206,7 +206,7 @@
#================================================
#----------------------COMP----------------------
-#================================================
+#================================================
if FEOL
@@ -222,13 +222,13 @@
logger.info("Executing rule DF.1a_3.3V")
df1a_l1 = comp.width(0.22.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
df1a_l1.output("DF.1a_3.3V", "DF.1a_3.3V : Min. COMP Width. : 0.22µm")
-df1a_l1.forget
+df1a_l1.forget
# Rule DF.1a_5V: Min. COMP Width. is 0.3µm
logger.info("Executing rule DF.1a_5V")
df1a_l1 = comp.not_inside(mvsd).not_inside(mvpsd).width(0.3.um, euclidian).polygons(0.001).overlapping(dualgate)
df1a_l1.output("DF.1a_5V", "DF.1a_5V : Min. COMP Width. : 0.3µm")
-df1a_l1.forget
+df1a_l1.forget
# rule DF.1b_3.3V is not a DRC check
@@ -238,13 +238,13 @@
logger.info("Executing rule DF.1c_3.3V")
df1c_l1 = comp.and(mos_cap_mk).width(1.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
df1c_l1.output("DF.1c_3.3V", "DF.1c_3.3V : Min. COMP Width for MOSCAP. : 1µm")
-df1c_l1.forget
+df1c_l1.forget
# Rule DF.1c_5V: Min. COMP Width for MOSCAP. is 1µm
logger.info("Executing rule DF.1c_5V")
df1c_l1 = comp.and(mos_cap_mk).width(1.um, euclidian).polygons(0.001).overlapping(dualgate)
df1c_l1.output("DF.1c_5V", "DF.1c_5V : Min. COMP Width for MOSCAP. : 1µm")
-df1c_l1.forget
+df1c_l1.forget
df_2a = comp.not(poly2).edges.and(tgate.edges)
# Rule DF.2a_3.3V: Min Channel Width. is nil,0.22µm
@@ -278,13 +278,13 @@
logger.info("Executing rule DF.3a_3.3V")
df3a_l1 = comp.not(otp_mk).space(0.28.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
df3a_l1.output("DF.3a_3.3V", "DF.3a_3.3V : Min. COMP Space P-substrate tap (PCOMP outside NWELL and DNWELL) can be butted for different voltage devices as the potential is same. : 0.28µm")
-df3a_l1.forget
+df3a_l1.forget
# Rule DF.3a_5V: Min. COMP Space P-substrate tap (PCOMP outside NWELL and DNWELL) can be butted for different voltage devices as the potential is same. is 0.36µm
logger.info("Executing rule DF.3a_5V")
df3a_l1 = comp.not(otp_mk).space(0.36.um, euclidian).polygons(0.001).overlapping(dualgate)
df3a_l1.output("DF.3a_5V", "DF.3a_5V : Min. COMP Space P-substrate tap (PCOMP outside NWELL and DNWELL) can be butted for different voltage devices as the potential is same. : 0.36µm")
-df3a_l1.forget
+df3a_l1.forget
df_3b_same_well = ncomp.inside(nwell).not_outside(pcomp.inside(nwell)).or(ncomp.inside(lvpwell).not_outside(pcomp.inside(lvpwell)))
df_3b_moscap = ncomp.inside(nwell).interacting(pcomp.inside(nwell)).or(ncomp.inside(lvpwell).interacting(pcomp.inside(lvpwell))).inside(mos_cap_mk)
@@ -306,7 +306,7 @@
logger.info("Executing rule DF.3c_3.3V")
df3c_l1 = comp.inside(drc_bjt).space(0.32.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
df3c_l1.output("DF.3c_3.3V", "DF.3c_3.3V : Min. COMP Space in BJT area (area marked by DRC_BJT layer). : 0.32µm")
-df3c_l1.forget
+df3c_l1.forget
# Rule DF.3c_5V: Min. COMP Space in BJT area (area marked by DRC_BJT layer) hasn’t been assessed.
logger.info("Executing rule DF.3c_5V")
@@ -319,13 +319,13 @@
logger.info("Executing rule DF.4a_3.3V")
df4a_l1 = ntap_dnwell.separation(lvpwell.inside(dnwell), 0.12.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
df4a_l1.output("DF.4a_3.3V", "DF.4a_3.3V : Min. (LVPWELL Space to NCOMP well tap) inside DNWELL. : 0.12µm")
-df4a_l1.forget
+df4a_l1.forget
# Rule DF.4a_5V: Min. (LVPWELL Space to NCOMP well tap) inside DNWELL. is 0.16µm
logger.info("Executing rule DF.4a_5V")
df4a_l1 = ntap_dnwell.separation(lvpwell.inside(dnwell), 0.16.um, euclidian).polygons(0.001).overlapping(dualgate)
df4a_l1.output("DF.4a_5V", "DF.4a_5V : Min. (LVPWELL Space to NCOMP well tap) inside DNWELL. : 0.16µm")
-df4a_l1.forget
+df4a_l1.forget
# Rule DF.4b_3.3V: Min. DNWELL overlap of NCOMP well tap. is 0.62µm
logger.info("Executing rule DF.4b_3.3V")
@@ -447,13 +447,13 @@
logger.info("Executing rule DF.7_3.3V")
df7_l1 = pcomp.inside(dnwell).separation(pwell_dnwell, 0.43.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
df7_l1.output("DF.7_3.3V", "DF.7_3.3V : Min. (LVPWELL Spacer to PCOMP) inside DNWELL. : 0.43µm")
-df7_l1.forget
+df7_l1.forget
# Rule DF.7_5V: Min. (LVPWELL Spacer to PCOMP) inside DNWELL. is 0.6µm
logger.info("Executing rule DF.7_5V")
df7_l1 = pcomp.inside(dnwell).outside(sramcore).separation(pwell_dnwell, 0.6.um, euclidian).polygons(0.001).overlapping(dualgate)
df7_l1.output("DF.7_5V", "DF.7_5V : Min. (LVPWELL Spacer to PCOMP) inside DNWELL. : 0.6µm")
-df7_l1.forget
+df7_l1.forget
# Rule DF.8_3.3V: Min. (LVPWELL overlap of NCOMP) Inside DNWELL. is 0.43µm
logger.info("Executing rule DF.8_3.3V")
@@ -480,34 +480,34 @@
logger.info("Executing rule DF.9_3.3V")
df9_l1 = comp.not(otp_mk).with_area(nil, 0.2025.um).not_interacting(v5_xtor).not_interacting(dualgate)
df9_l1.output("DF.9_3.3V", "DF.9_3.3V : Min. COMP area (um2). : 0.2025µm²")
-df9_l1.forget
+df9_l1.forget
# Rule DF.9_5V: Min. COMP area (um2). is 0.2025µm²
logger.info("Executing rule DF.9_5V")
df9_l1 = comp.not(otp_mk).with_area(nil, 0.2025.um).overlapping(dualgate)
df9_l1.output("DF.9_5V", "DF.9_5V : Min. COMP area (um2). : 0.2025µm²")
-df9_l1.forget
+df9_l1.forget
# Rule DF.10_3.3V: Min. field area (um2). is 0.26µm²
logger.info("Executing rule DF.10_3.3V")
df10_l1 = comp.holes.not(comp).with_area(nil, 0.26.um).not_interacting(v5_xtor).not_interacting(dualgate)
df10_l1.output("DF.10_3.3V", "DF.10_3.3V : Min. field area (um2). : 0.26µm²")
-df10_l1.forget
+df10_l1.forget
# Rule DF.10_5V: Min. field area (um2). is 0.26µm²
logger.info("Executing rule DF.10_5V")
df10_l1 = comp.holes.not(comp).with_area(nil, 0.26.um).overlapping(dualgate)
df10_l1.output("DF.10_5V", "DF.10_5V : Min. field area (um2). : 0.26µm²")
-df10_l1.forget
+df10_l1.forget
comp_butt = comp.interacting(ncomp.interacting(pcomp).outside(pcomp))
# Rule DF.11_3.3V: Min. Length of butting COMP edge. is 0.3µm
logger.info("Executing rule DF.11_3.3V")
df11_l1 = comp_butt.width(0.3.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
df11_l1.output("DF.11_3.3V", "DF.11_3.3V : Min. Length of butting COMP edge. : 0.3µm")
-df11_l1.forget
+df11_l1.forget
# Rule DF.11_5V: Min. Length of butting COMP edge. is 0.3µm
logger.info("Executing rule DF.11_5V")
df11_l1 = comp_butt.width(0.3.um, euclidian).polygons(0.001).overlapping(dualgate)
df11_l1.output("DF.11_5V", "DF.11_5V : Min. Length of butting COMP edge. : 0.3µm")
-df11_l1.forget
+df11_l1.forget
comp_butt.forget
# Rule DF.12_3.3V: COMP not covered by Nplus or Pplus is forbidden (except those COMP under marking).
@@ -563,51 +563,51 @@
logger.info("Executing rule DF.16_3.3V")
df16_l1 = ncomp_df16.not_inside(ymtp_mk).outside(sramcore).separation(nwell.outside(dnwell).not_inside(ymtp_mk), 0.43.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
df16_l1.output("DF.16_3.3V", "DF.16_3.3V : Min. space from (Nwell outside DNWELL) to (NCOMP outside Nwell and DNWELL). : 0.43µm")
-df16_l1.forget
+df16_l1.forget
# Rule DF.16_5V: Min. space from (Nwell outside DNWELL) to (NCOMP outside Nwell and DNWELL). is 0.6µm
logger.info("Executing rule DF.16_5V")
df16_l1 = ncomp_df16.not_inside(ymtp_mk).outside(sramcore).separation(nwell.outside(dnwell).not_inside(ymtp_mk), 0.6.um, euclidian).polygons(0.001).overlapping(dualgate)
df16_l1.output("DF.16_5V", "DF.16_5V : Min. space from (Nwell outside DNWELL) to (NCOMP outside Nwell and DNWELL). : 0.6µm")
-df16_l1.forget
+df16_l1.forget
pcomp_df17 = pcomp.outside(nwell).outside(dnwell)
# Rule DF.17_3.3V: Min. space from (Nwell Outside DNWELL) to (PCOMP outside Nwell and DNWELL). is 0.12µm
logger.info("Executing rule DF.17_3.3V")
df17_l1 = pcomp_df17.separation(nwell.outside(dnwell), 0.12.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
df17_l1.output("DF.17_3.3V", "DF.17_3.3V : Min. space from (Nwell Outside DNWELL) to (PCOMP outside Nwell and DNWELL). : 0.12µm")
-df17_l1.forget
+df17_l1.forget
# Rule DF.17_5V: Min. space from (Nwell Outside DNWELL) to (PCOMP outside Nwell and DNWELL). is 0.16µm
logger.info("Executing rule DF.17_5V")
df17_l1 = pcomp_df17.separation(nwell.outside(dnwell), 0.16.um, euclidian).polygons(0.001).overlapping(dualgate)
df17_l1.output("DF.17_5V", "DF.17_5V : Min. space from (Nwell Outside DNWELL) to (PCOMP outside Nwell and DNWELL). : 0.16µm")
-df17_l1.forget
+df17_l1.forget
# Rule DF.18_3.3V: Min. DNWELL space to (PCOMP outside Nwell and DNWELL). is 2.5µm
logger.info("Executing rule DF.18_3.3V")
df18_l1 = pcomp_df17.separation(dnwell, 2.5.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
df18_l1.output("DF.18_3.3V", "DF.18_3.3V : Min. DNWELL space to (PCOMP outside Nwell and DNWELL). : 2.5µm")
-df18_l1.forget
+df18_l1.forget
# Rule DF.18_5V: Min. DNWELL space to (PCOMP outside Nwell and DNWELL). is 2.5µm
logger.info("Executing rule DF.18_5V")
df18_l1 = pcomp_df17.separation(dnwell, 2.5.um, euclidian).polygons(0.001).overlapping(dualgate)
df18_l1.output("DF.18_5V", "DF.18_5V : Min. DNWELL space to (PCOMP outside Nwell and DNWELL). : 2.5µm")
-df18_l1.forget
+df18_l1.forget
pcomp_df17.forget
# Rule DF.19_3.3V: Min. DNWELL space to (NCOMP outside Nwell and DNWELL). is 3.2µm
logger.info("Executing rule DF.19_3.3V")
df19_l1 = ncomp_df16.separation(dnwell, 3.2.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
df19_l1.output("DF.19_3.3V", "DF.19_3.3V : Min. DNWELL space to (NCOMP outside Nwell and DNWELL). : 3.2µm")
-df19_l1.forget
+df19_l1.forget
# Rule DF.19_5V: Min. DNWELL space to (NCOMP outside Nwell and DNWELL). is 3.28µm
logger.info("Executing rule DF.19_5V")
df19_l1 = ncomp_df16.separation(dnwell, 3.28.um, euclidian).polygons(0.001).overlapping(dualgate)
df19_l1.output("DF.19_5V", "DF.19_5V : Min. DNWELL space to (NCOMP outside Nwell and DNWELL). : 3.28µm")
-df19_l1.forget
+df19_l1.forget
ncomp_df16.forget
diff --git a/rules/klayout/drc/rule_decks/contact.drc b/rules/klayout/drc/rule_decks/contact.drc
index 0c126a3..8142221 100644
--- a/rules/klayout/drc/rule_decks/contact.drc
+++ b/rules/klayout/drc/rule_decks/contact.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -117,7 +117,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -126,12 +126,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -198,7 +198,7 @@
#================================================
#--------------------CONTACT---------------------
-#================================================
+#================================================
if FEOL
@@ -214,7 +214,7 @@
logger.info("Executing rule CO.2a")
co2a_l1 = contact.space(0.25.um, euclidian).polygons(0.001)
co2a_l1.output("CO.2a", "CO.2a : min. contact spacing : 0.25µm")
-co2a_l1.forget
+co2a_l1.forget
merged_co1 = contact.sized(0.18.um).sized(-0.18.um).with_bbox_min(1.63.um , nil).extents.inside(metal1)
contact_mask = merged_co1.size(1).not(contact).with_holes(16, nil)
@@ -223,7 +223,7 @@
logger.info("Executing rule CO.2b")
co2b_l1 = selected_co1.space(0.28.um, euclidian).polygons(0.001)
co2b_l1.output("CO.2b", "CO.2b : Space in 4x4 or larger contact array. : 0.28µm")
-co2b_l1.forget
+co2b_l1.forget
merged_co1.forget
contact_mask.forget
@@ -306,13 +306,13 @@
logger.info("Executing rule CO.7")
co7_l1 = contact.not_outside(comp).not(otp_mk).separation(tgate.not(otp_mk), 0.15.um, euclidian).polygons(0.001)
co7_l1.output("CO.7", "CO.7 : Space from COMP contact to Poly2 on COMP. : 0.15µm")
-co7_l1.forget
+co7_l1.forget
# Rule CO.8: Space from Poly2 contact to COMP. is 0.17µm
logger.info("Executing rule CO.8")
co8_l1 = contact.not_outside(poly2).separation(comp, 0.17.um, euclidian).polygons(0.001)
co8_l1.output("CO.8", "CO.8 : Space from Poly2 contact to COMP. : 0.17µm")
-co8_l1.forget
+co8_l1.forget
# Rule CO.9: Contact on NCOMP to PCOMP butting edge is forbidden (contact must not straddle butting edge).
logger.info("Executing rule CO.9")
@@ -332,10 +332,10 @@
co11_l1.output("CO.11", "CO.11 : Contact on field oxide is forbidden.")
co11_l1.forget
-end #FEOL
+end #FEOL
if BEOL
-logger.info("BEOL section")
+logger.info("BEOL section")
end #FEOL
diff --git a/rules/klayout/drc/rule_decks/dnwell.drc b/rules/klayout/drc/rule_decks/dnwell.drc
index 5ca48e0..c989465 100644
--- a/rules/klayout/drc/rule_decks/dnwell.drc
+++ b/rules/klayout/drc/rule_decks/dnwell.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -115,7 +115,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -124,12 +124,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -221,7 +221,7 @@
connect(metal5, via5)
connect(via5, metaltop)
-end #CONNECTIVITY_RULES
+end #CONNECTIVITY_RULES
#================================================
#------------ PRE-DEFINED FUNCTIONS -------------
@@ -247,7 +247,7 @@
end
end
unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
- return connected_output, unconnected_output
+ return connected_output, unconnected_output
end
def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
@@ -276,10 +276,10 @@
if CONNECTIVITY_RULES
logger.info("Connectivity rules enabled, Netlist object will be generated.")
netlist
-end #CONNECTIVITY_RULES
+end #CONNECTIVITY_RULES
# === LAYOUT EXTENT ===
-CHIP = extent.sized(0.0)
+CHIP = extent.sized(0.0)
logger.info("Total area of the design is #{CHIP.area()} um^2.")
@@ -287,7 +287,7 @@
#================================================
#---------------------DNWELL---------------------
-#================================================
+#================================================
if FEOL
@@ -297,35 +297,35 @@
logger.info("Executing rule DN.1")
dn1_l1 = dnwell.width(1.7.um, euclidian).polygons(0.001)
dn1_l1.output("DN.1", "DN.1 : Min. DNWELL Width : 1.7µm")
-dn1_l1.forget
+dn1_l1.forget
if CONNECTIVITY_RULES
-logger.info("CONNECTIVITY_RULES section")
+logger.info("CONNECTIVITY_RULES section")
-connected_dnwell, unconnected_dnwell = conn_space(dnwell, 2.5, 5.42, euclidian)
+connected_dnwell, unconnected_dnwell = conn_space(dnwell, 2.5, 5.42, euclidian)
# Rule DN.2a: Min. DNWELL Space (Equi-potential), Merge if the space is less than is 2.5µm
logger.info("Executing rule DN.2a")
dn2a_l1 = connected_dnwell
dn2a_l1.output("DN.2a", "DN.2a : Min. DNWELL Space (Equi-potential), Merge if the space is less than : 2.5µm")
-dn2a_l1.forget
+dn2a_l1.forget
# Rule DN.2b: Min. DNWELL Space (Different potential) is 5.42µm
logger.info("Executing rule DN.2b")
dn2b_l1 = unconnected_dnwell
dn2b_l1.output("DN.2b", "DN.2b : Min. DNWELL Space (Different potential) : 5.42µm")
-dn2b_l1.forget
+dn2b_l1.forget
else
-logger.info("CONNECTIVITY_RULES disabled section")
+logger.info("CONNECTIVITY_RULES disabled section")
# Rule DN.2b_: Min. DNWELL Space (Different potential) is 5.42µm
logger.info("Executing rule DN.2b_")
dn2b_l1 = dnwell.isolated(5.42.um, euclidian).polygons(0.001)
dn2b_l1.output("DN.2b_", "DN.2b_ : Min. DNWELL Space (Different potential) : 5.42µm")
-dn2b_l1.forget
+dn2b_l1.forget
-end #CONNECTIVITY_RULES
+end #CONNECTIVITY_RULES
dn3_1 = dnwell.not_inside(pcomp.holes.not(pcomp).interacting(dnwell, 1..1).extents)
dn3_2 = dnwell.inside((pcomp.holes.not(pcomp).covering(nat.or(ncomp).or(nwell).not_interacting(dnwell))))
diff --git a/rules/klayout/drc/rule_decks/drc_bjt.drc b/rules/klayout/drc/rule_decks/drc_bjt.drc
index 1100840..4c77867 100644
--- a/rules/klayout/drc/rule_decks/drc_bjt.drc
+++ b/rules/klayout/drc/rule_decks/drc_bjt.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -114,7 +114,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -123,12 +123,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -195,7 +195,7 @@
#================================================
#--------------------DRC_BJT---------------------
-#================================================
+#================================================
# Rule BJT.1: Min. DRC_BJT overlap of DNWELL for NPN BJT.
logger.info("Executing rule BJT.1")
@@ -213,7 +213,7 @@
logger.info("Executing rule BJT.3")
bjt3_l1 = comp.outside(drc_bjt).separation(drc_bjt, 0.1.um, euclidian).polygons(0.001)
bjt3_l1.output("BJT.3", "BJT.3 : Minimum space of DRC_BJT layer to unrelated COMP. : 0.1µm")
-bjt3_l1.forget
+bjt3_l1.forget
exec_end_time = Time.now
diff --git a/rules/klayout/drc/rule_decks/dualgate.drc b/rules/klayout/drc/rule_decks/dualgate.drc
index 064c91c..5cba8db 100644
--- a/rules/klayout/drc/rule_decks/dualgate.drc
+++ b/rules/klayout/drc/rule_decks/dualgate.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -113,7 +113,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -122,12 +122,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -194,7 +194,7 @@
#================================================
#--------------------DUALGATE--------------------
-#================================================
+#================================================
if FEOL
@@ -214,13 +214,13 @@
logger.info("Executing rule DV.2")
dv2_l1 = dualgate.space(0.44.um, euclidian).polygons(0.001)
dv2_l1.output("DV.2", "DV.2 : Min. Dualgate Space. Merge if Space is less than this design rule. : 0.44µm")
-dv2_l1.forget
+dv2_l1.forget
# Rule DV.3: Min. Dualgate to COMP space [unrelated]. is 0.24µm
logger.info("Executing rule DV.3")
dv3_l1 = dualgate.separation(comp.outside(dualgate), 0.24.um, euclidian).polygons(0.001)
dv3_l1.output("DV.3", "DV.3 : Min. Dualgate to COMP space [unrelated]. : 0.24µm")
-dv3_l1.forget
+dv3_l1.forget
# rule DV.4 is not a DRC check
@@ -228,7 +228,7 @@
logger.info("Executing rule DV.5")
dv5_l1 = dualgate.width(0.7.um, euclidian).polygons(0.001)
dv5_l1.output("DV.5", "DV.5 : Min. Dualgate width. : 0.7µm")
-dv5_l1.forget
+dv5_l1.forget
comp_dv = comp.not(pcomp.outside(nwell))
# Rule DV.6: Min. Dualgate enclose COMP (except substrate tap). is 0.24µm
diff --git a/rules/klayout/drc/rule_decks/dummy_exclude_layers.drc b/rules/klayout/drc/rule_decks/dummy_exclude_layers.drc
index b057a84..0858f56 100644
--- a/rules/klayout/drc/rule_decks/dummy_exclude_layers.drc
+++ b/rules/klayout/drc/rule_decks/dummy_exclude_layers.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -113,7 +113,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -122,12 +122,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -194,7 +194,7 @@
#================================================
#--------------DUMMY EXCLUDE LAYERS--------------
-#================================================
+#================================================
# rule DE.1 is not a DRC check
@@ -202,7 +202,7 @@
logger.info("Executing rule DE.2")
de2_l1 = ndmy.or(pmndmy).width(0.8.um, euclidian).polygons(0.001)
de2_l1.output("DE.2", "DE.2 : Minimum NDMY or PMNDMY size (x or y dimension in um). : 0.8µm")
-de2_l1.forget
+de2_l1.forget
de3_ndmy_area = ndmy.with_area(15000.um, nil)
# Rule DE.3: If size greater than 15000 um2 then two sides should not be greater than (um).
@@ -216,7 +216,7 @@
logger.info("Executing rule DE.4")
de4_l1 = ndmy.space(20.um, euclidian).polygons(0.001)
de4_l1.output("DE.4", "DE.4 : Minimum NDMY to NDMY space (Merge if space is less). : 20µm")
-de4_l1.forget
+de4_l1.forget
exec_end_time = Time.now
diff --git a/rules/klayout/drc/rule_decks/efuse.drc b/rules/klayout/drc/rule_decks/efuse.drc
index 421a281..237c5a7 100644
--- a/rules/klayout/drc/rule_decks/efuse.drc
+++ b/rules/klayout/drc/rule_decks/efuse.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -120,7 +120,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -129,12 +129,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -201,7 +201,7 @@
#================================================
#---------------------EFUSE----------------------
-#================================================
+#================================================
# Rule EF.01: Min. (Poly2 butt PLFUSE) within EFUSE_MK and Pplus.
logger.info("Executing rule EF.01")
@@ -283,13 +283,13 @@
logger.info("Executing rule EF.10")
ef10_l1 = cathode.space(0.26.um, euclidian).polygons(0.001)
ef10_l1.output("EF.10", "EF.10 : Min. Cathode Poly2 to Poly2 space. : 0.26µm")
-ef10_l1.forget
+ef10_l1.forget
# Rule EF.11: Min. Anode Poly2 to Poly2 space. is 0.26µm
logger.info("Executing rule EF.11")
ef11_l1 = anode.space(0.26.um, euclidian).polygons(0.001)
ef11_l1.output("EF.11", "EF.11 : Min. Anode Poly2 to Poly2 space. : 0.26µm")
-ef11_l1.forget
+ef11_l1.forget
cont_ef = contact.and(plfuse.inside(efuse_mk))
# Rule EF.12: Min. Space of Cathode Contact to PLFUSE end.
@@ -333,7 +333,7 @@
logger.info("Executing rule EF.17")
ef17_l1 = efuse_mk.space(0.26.um, euclidian).polygons(0.001)
ef17_l1.output("EF.17", "EF.17 : Min. Space of EFUSE_MK to EFUSE_MK. : 0.26µm")
-ef17_l1.forget
+ef17_l1.forget
# Rule EF.18: PLFUSE must sit on field oxide (NOT COMP), no cross with any COMP, Nplus, Pplus, ESD, SAB, Resistor, Metal1, Metal2.
logger.info("Executing rule EF.18")
@@ -351,7 +351,7 @@
logger.info("Executing rule EF.20")
ef20_l1 = plfuse.separation(comp.or(nplus).or(esd).or(sab).or(resistor), 2.73.um, euclidian).polygons(0.001)
ef20_l1.output("EF.20", "EF.20 : Min. PLFUSE space to COMP, Nplus, Pplus, Resistor, ESD, SAB. : 2.73µm")
-ef20_l1.forget
+ef20_l1.forget
ef_21_fuse = poly2.interacting(plfuse).inside(efuse_mk.and(pplus)).extents.edges
ef_21_anode = anode.edges.not_interacting(anode.edges.interacting(plfuse))
diff --git a/rules/klayout/drc/rule_decks/esd.drc b/rules/klayout/drc/rule_decks/esd.drc
index bbd2533..2744944 100644
--- a/rules/klayout/drc/rule_decks/esd.drc
+++ b/rules/klayout/drc/rule_decks/esd.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -113,7 +113,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -122,12 +122,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -194,7 +194,7 @@
#================================================
#----------------------ESD-----------------------
-#================================================
+#================================================
if FEOL
@@ -204,19 +204,19 @@
logger.info("Executing rule ESD.1")
esd1_l1 = esd.width(0.6.um, euclidian).polygons(0.001)
esd1_l1.output("ESD.1", "ESD.1 : Minimum width of an ESD implant area. : 0.6µm")
-esd1_l1.forget
+esd1_l1.forget
# Rule ESD.2: Minimum space between two ESD implant areas. (Merge if the space is less than 0.6um). is 0.6µm
logger.info("Executing rule ESD.2")
esd2_l1 = esd.space(0.6.um, euclidian).polygons(0.001)
esd2_l1.output("ESD.2", "ESD.2 : Minimum space between two ESD implant areas. (Merge if the space is less than 0.6um). : 0.6µm")
-esd2_l1.forget
+esd2_l1.forget
# Rule ESD.3a: Minimum space to NCOMP. is 0.6µm
logger.info("Executing rule ESD.3a")
esd3a_l1 = esd.separation(ncomp, 0.6.um, euclidian).polygons(0.001)
esd3a_l1.output("ESD.3a", "ESD.3a : Minimum space to NCOMP. : 0.6µm")
-esd3a_l1.forget
+esd3a_l1.forget
# Rule ESD.3b: Min/max space to a butted PCOMP.
logger.info("Executing rule ESD.3b")
@@ -234,18 +234,18 @@
logger.info("Executing rule ESD.4b")
esd4b_l1 = esd.overlap(comp, 0.45.um, euclidian).polygons(0.001)
esd4b_l1.output("ESD.4b", "ESD.4b : Minimum overlap of an ESD implant edge to a COMP. : 0.45µm")
-esd4b_l1.forget
+esd4b_l1.forget
# Rule ESD.5a: Minimum ESD area (um2). is 0.49µm²
logger.info("Executing rule ESD.5a")
esd5a_l1 = esd.with_area(nil, 0.49.um)
esd5a_l1.output("ESD.5a", "ESD.5a : Minimum ESD area (um2). : 0.49µm²")
-esd5a_l1.forget
+esd5a_l1.forget
# Rule ESD.5b: Minimum field area enclosed by ESD implant (um2). is 0.49µm²
logger.info("Executing rule ESD.5b")
esd5b_l1 = esd.holes.with_area(nil, 0.49.um)
esd5b_l1.output("ESD.5b", "ESD.5b : Minimum field area enclosed by ESD implant (um2). : 0.49µm²")
-esd5b_l1.forget
+esd5b_l1.forget
# Rule ESD.6: Extension perpendicular to Poly2 gate. is 0.45µm
logger.info("Executing rule ESD.6")
esd6_l1 = esd.edges.enclosing(poly2.edges.interacting(tgate.edges), 0.45.um, projection).polygons(0.001)
@@ -268,7 +268,7 @@
logger.info("Executing rule ESD.pl")
esdpl_l1 = poly2.interacting(esd).edges.and(tgate.edges).width(0.8.um, euclidian).polygons(0.001).overlapping(dualgate)
esdpl_l1.output("ESD.pl", "ESD.pl : Minimum gate length of 5V/6V gate NMOS. : 0.8µm")
-esdpl_l1.forget
+esdpl_l1.forget
# Rule ESD.9: ESD implant layer must be overlapped by Dualgate layer (as ESD implant option is only for 5V/6V devices).
logger.info("Executing rule ESD.9")
diff --git a/rules/klayout/drc/rule_decks/geometry_rules.drc b/rules/klayout/drc/rule_decks/geometry_rules.drc
index 8203007..535feea 100644
--- a/rules/klayout/drc/rule_decks/geometry_rules.drc
+++ b/rules/klayout/drc/rule_decks/geometry_rules.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -217,7 +217,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -226,12 +226,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -298,436 +298,436 @@
#================================================
#-----------------GEOMETRY RULES-----------------
-#================================================
+#================================================
if OFFGRID
-logger.info("OFFGRID-ANGLES section")
+logger.info("OFFGRID-ANGLES section")
logger.info("Executing rule comp_OFFGRID")
comp.ongrid(0.005).output("comp_OFFGRID", "OFFGRID : OFFGRID vertex on comp")
-comp.with_angle(0 .. 45).output("comp_angle", "ACUTE : non 45 degree angle comp")
+comp.with_angle(0 .. 45).output("comp_angle", "ACUTE : non 45 degree angle comp")
logger.info("Executing rule dnwell_OFFGRID")
dnwell.ongrid(0.005).output("dnwell_OFFGRID", "OFFGRID : OFFGRID vertex on dnwell")
-dnwell.with_angle(0 .. 45).output("dnwell_angle", "ACUTE : non 45 degree angle dnwell")
+dnwell.with_angle(0 .. 45).output("dnwell_angle", "ACUTE : non 45 degree angle dnwell")
logger.info("Executing rule nwell_OFFGRID")
nwell.ongrid(0.005).output("nwell_OFFGRID", "OFFGRID : OFFGRID vertex on nwell")
-nwell.with_angle(0 .. 45).output("nwell_angle", "ACUTE : non 45 degree angle nwell")
+nwell.with_angle(0 .. 45).output("nwell_angle", "ACUTE : non 45 degree angle nwell")
logger.info("Executing rule lvpwell_OFFGRID")
lvpwell.ongrid(0.005).output("lvpwell_OFFGRID", "OFFGRID : OFFGRID vertex on lvpwell")
-lvpwell.with_angle(0 .. 45).output("lvpwell_angle", "ACUTE : non 45 degree angle lvpwell")
+lvpwell.with_angle(0 .. 45).output("lvpwell_angle", "ACUTE : non 45 degree angle lvpwell")
logger.info("Executing rule dualgate_OFFGRID")
dualgate.ongrid(0.005).output("dualgate_OFFGRID", "OFFGRID : OFFGRID vertex on dualgate")
-dualgate.with_angle(0 .. 45).output("dualgate_angle", "ACUTE : non 45 degree angle dualgate")
+dualgate.with_angle(0 .. 45).output("dualgate_angle", "ACUTE : non 45 degree angle dualgate")
logger.info("Executing rule poly2_OFFGRID")
poly2.ongrid(0.005).output("poly2_OFFGRID", "OFFGRID : OFFGRID vertex on poly2")
-poly2.with_angle(0 .. 45).output("poly2_angle", "ACUTE : non 45 degree angle poly2")
+poly2.with_angle(0 .. 45).output("poly2_angle", "ACUTE : non 45 degree angle poly2")
logger.info("Executing rule nplus_OFFGRID")
nplus.ongrid(0.005).output("nplus_OFFGRID", "OFFGRID : OFFGRID vertex on nplus")
-nplus.with_angle(0 .. 45).output("nplus_angle", "ACUTE : non 45 degree angle nplus")
+nplus.with_angle(0 .. 45).output("nplus_angle", "ACUTE : non 45 degree angle nplus")
logger.info("Executing rule pplus_OFFGRID")
pplus.ongrid(0.005).output("pplus_OFFGRID", "OFFGRID : OFFGRID vertex on pplus")
-pplus.with_angle(0 .. 45).output("pplus_angle", "ACUTE : non 45 degree angle pplus")
+pplus.with_angle(0 .. 45).output("pplus_angle", "ACUTE : non 45 degree angle pplus")
logger.info("Executing rule sab_OFFGRID")
sab.ongrid(0.005).output("sab_OFFGRID", "OFFGRID : OFFGRID vertex on sab")
-sab.with_angle(0 .. 45).output("sab_angle", "ACUTE : non 45 degree angle sab")
+sab.with_angle(0 .. 45).output("sab_angle", "ACUTE : non 45 degree angle sab")
logger.info("Executing rule esd_OFFGRID")
esd.ongrid(0.005).output("esd_OFFGRID", "OFFGRID : OFFGRID vertex on esd")
-esd.with_angle(0 .. 45).output("esd_angle", "ACUTE : non 45 degree angle esd")
+esd.with_angle(0 .. 45).output("esd_angle", "ACUTE : non 45 degree angle esd")
logger.info("Executing rule contact_OFFGRID")
contact.ongrid(0.005).output("contact_OFFGRID", "OFFGRID : OFFGRID vertex on contact")
-contact.with_angle(0 .. 45).output("contact_angle", "ACUTE : non 45 degree angle contact")
+contact.with_angle(0 .. 45).output("contact_angle", "ACUTE : non 45 degree angle contact")
logger.info("Executing rule metal1_OFFGRID")
metal1.ongrid(0.005).output("metal1_OFFGRID", "OFFGRID : OFFGRID vertex on metal1")
-metal1.with_angle(0 .. 45).output("metal1_angle", "ACUTE : non 45 degree angle metal1")
+metal1.with_angle(0 .. 45).output("metal1_angle", "ACUTE : non 45 degree angle metal1")
logger.info("Executing rule via1_OFFGRID")
via1.ongrid(0.005).output("via1_OFFGRID", "OFFGRID : OFFGRID vertex on via1")
-via1.with_angle(0 .. 45).output("via1_angle", "ACUTE : non 45 degree angle via1")
+via1.with_angle(0 .. 45).output("via1_angle", "ACUTE : non 45 degree angle via1")
logger.info("Executing rule metal2_OFFGRID")
metal2.ongrid(0.005).output("metal2_OFFGRID", "OFFGRID : OFFGRID vertex on metal2")
-metal2.with_angle(0 .. 45).output("metal2_angle", "ACUTE : non 45 degree angle metal2")
+metal2.with_angle(0 .. 45).output("metal2_angle", "ACUTE : non 45 degree angle metal2")
logger.info("Executing rule via2_OFFGRID")
via2.ongrid(0.005).output("via2_OFFGRID", "OFFGRID : OFFGRID vertex on via2")
-via2.with_angle(0 .. 45).output("via2_angle", "ACUTE : non 45 degree angle via2")
+via2.with_angle(0 .. 45).output("via2_angle", "ACUTE : non 45 degree angle via2")
logger.info("Executing rule metal3_OFFGRID")
metal3.ongrid(0.005).output("metal3_OFFGRID", "OFFGRID : OFFGRID vertex on metal3")
-metal3.with_angle(0 .. 45).output("metal3_angle", "ACUTE : non 45 degree angle metal3")
+metal3.with_angle(0 .. 45).output("metal3_angle", "ACUTE : non 45 degree angle metal3")
logger.info("Executing rule via3_OFFGRID")
via3.ongrid(0.005).output("via3_OFFGRID", "OFFGRID : OFFGRID vertex on via3")
-via3.with_angle(0 .. 45).output("via3_angle", "ACUTE : non 45 degree angle via3")
+via3.with_angle(0 .. 45).output("via3_angle", "ACUTE : non 45 degree angle via3")
logger.info("Executing rule metal4_OFFGRID")
metal4.ongrid(0.005).output("metal4_OFFGRID", "OFFGRID : OFFGRID vertex on metal4")
-metal4.with_angle(0 .. 45).output("metal4_angle", "ACUTE : non 45 degree angle metal4")
+metal4.with_angle(0 .. 45).output("metal4_angle", "ACUTE : non 45 degree angle metal4")
logger.info("Executing rule via4_OFFGRID")
via4.ongrid(0.005).output("via4_OFFGRID", "OFFGRID : OFFGRID vertex on via4")
-via4.with_angle(0 .. 45).output("via4_angle", "ACUTE : non 45 degree angle via4")
+via4.with_angle(0 .. 45).output("via4_angle", "ACUTE : non 45 degree angle via4")
logger.info("Executing rule metal5_OFFGRID")
metal5.ongrid(0.005).output("metal5_OFFGRID", "OFFGRID : OFFGRID vertex on metal5")
-metal5.with_angle(0 .. 45).output("metal5_angle", "ACUTE : non 45 degree angle metal5")
+metal5.with_angle(0 .. 45).output("metal5_angle", "ACUTE : non 45 degree angle metal5")
logger.info("Executing rule via5_OFFGRID")
via5.ongrid(0.005).output("via5_OFFGRID", "OFFGRID : OFFGRID vertex on via5")
-via5.with_angle(0 .. 45).output("via5_angle", "ACUTE : non 45 degree angle via5")
+via5.with_angle(0 .. 45).output("via5_angle", "ACUTE : non 45 degree angle via5")
logger.info("Executing rule metaltop_OFFGRID")
metaltop.ongrid(0.005).output("metaltop_OFFGRID", "OFFGRID : OFFGRID vertex on metaltop")
-metaltop.with_angle(0 .. 45).output("metaltop_angle", "ACUTE : non 45 degree angle metaltop")
+metaltop.with_angle(0 .. 45).output("metaltop_angle", "ACUTE : non 45 degree angle metaltop")
logger.info("Executing rule pad_OFFGRID")
pad.ongrid(0.005).output("pad_OFFGRID", "OFFGRID : OFFGRID vertex on pad")
-pad.with_angle(0 .. 45).output("pad_angle", "ACUTE : non 45 degree angle pad")
+pad.with_angle(0 .. 45).output("pad_angle", "ACUTE : non 45 degree angle pad")
logger.info("Executing rule resistor_OFFGRID")
resistor.ongrid(0.005).output("resistor_OFFGRID", "OFFGRID : OFFGRID vertex on resistor")
-resistor.with_angle(0 .. 45).output("resistor_angle", "ACUTE : non 45 degree angle resistor")
+resistor.with_angle(0 .. 45).output("resistor_angle", "ACUTE : non 45 degree angle resistor")
logger.info("Executing rule fhres_OFFGRID")
fhres.ongrid(0.005).output("fhres_OFFGRID", "OFFGRID : OFFGRID vertex on fhres")
-fhres.with_angle(0 .. 45).output("fhres_angle", "ACUTE : non 45 degree angle fhres")
+fhres.with_angle(0 .. 45).output("fhres_angle", "ACUTE : non 45 degree angle fhres")
logger.info("Executing rule fusetop_OFFGRID")
fusetop.ongrid(0.005).output("fusetop_OFFGRID", "OFFGRID : OFFGRID vertex on fusetop")
-fusetop.with_angle(0 .. 45).output("fusetop_angle", "ACUTE : non 45 degree angle fusetop")
+fusetop.with_angle(0 .. 45).output("fusetop_angle", "ACUTE : non 45 degree angle fusetop")
logger.info("Executing rule fusewindow_d_OFFGRID")
fusewindow_d.ongrid(0.005).output("fusewindow_d_OFFGRID", "OFFGRID : OFFGRID vertex on fusewindow_d")
-fusewindow_d.with_angle(0 .. 45).output("fusewindow_d_angle", "ACUTE : non 45 degree angle fusewindow_d")
+fusewindow_d.with_angle(0 .. 45).output("fusewindow_d_angle", "ACUTE : non 45 degree angle fusewindow_d")
logger.info("Executing rule polyfuse_OFFGRID")
polyfuse.ongrid(0.005).output("polyfuse_OFFGRID", "OFFGRID : OFFGRID vertex on polyfuse")
-polyfuse.with_angle(0 .. 45).output("polyfuse_angle", "ACUTE : non 45 degree angle polyfuse")
+polyfuse.with_angle(0 .. 45).output("polyfuse_angle", "ACUTE : non 45 degree angle polyfuse")
logger.info("Executing rule mvsd_OFFGRID")
mvsd.ongrid(0.005).output("mvsd_OFFGRID", "OFFGRID : OFFGRID vertex on mvsd")
-mvsd.with_angle(0 .. 45).output("mvsd_angle", "ACUTE : non 45 degree angle mvsd")
+mvsd.with_angle(0 .. 45).output("mvsd_angle", "ACUTE : non 45 degree angle mvsd")
logger.info("Executing rule mvpsd_OFFGRID")
mvpsd.ongrid(0.005).output("mvpsd_OFFGRID", "OFFGRID : OFFGRID vertex on mvpsd")
-mvpsd.with_angle(0 .. 45).output("mvpsd_angle", "ACUTE : non 45 degree angle mvpsd")
+mvpsd.with_angle(0 .. 45).output("mvpsd_angle", "ACUTE : non 45 degree angle mvpsd")
logger.info("Executing rule nat_OFFGRID")
nat.ongrid(0.005).output("nat_OFFGRID", "OFFGRID : OFFGRID vertex on nat")
-nat.with_angle(0 .. 45).output("nat_angle", "ACUTE : non 45 degree angle nat")
+nat.with_angle(0 .. 45).output("nat_angle", "ACUTE : non 45 degree angle nat")
logger.info("Executing rule comp_dummy_OFFGRID")
comp_dummy.ongrid(0.005).output("comp_dummy_OFFGRID", "OFFGRID : OFFGRID vertex on comp_dummy")
-comp_dummy.with_angle(0 .. 45).output("comp_dummy_angle", "ACUTE : non 45 degree angle comp_dummy")
+comp_dummy.with_angle(0 .. 45).output("comp_dummy_angle", "ACUTE : non 45 degree angle comp_dummy")
logger.info("Executing rule poly2_dummy_OFFGRID")
poly2_dummy.ongrid(0.005).output("poly2_dummy_OFFGRID", "OFFGRID : OFFGRID vertex on poly2_dummy")
-poly2_dummy.with_angle(0 .. 45).output("poly2_dummy_angle", "ACUTE : non 45 degree angle poly2_dummy")
+poly2_dummy.with_angle(0 .. 45).output("poly2_dummy_angle", "ACUTE : non 45 degree angle poly2_dummy")
logger.info("Executing rule metal1_dummy_OFFGRID")
metal1_dummy.ongrid(0.005).output("metal1_dummy_OFFGRID", "OFFGRID : OFFGRID vertex on metal1_dummy")
-metal1_dummy.with_angle(0 .. 45).output("metal1_dummy_angle", "ACUTE : non 45 degree angle metal1_dummy")
+metal1_dummy.with_angle(0 .. 45).output("metal1_dummy_angle", "ACUTE : non 45 degree angle metal1_dummy")
logger.info("Executing rule metal2_dummy_OFFGRID")
metal2_dummy.ongrid(0.005).output("metal2_dummy_OFFGRID", "OFFGRID : OFFGRID vertex on metal2_dummy")
-metal2_dummy.with_angle(0 .. 45).output("metal2_dummy_angle", "ACUTE : non 45 degree angle metal2_dummy")
+metal2_dummy.with_angle(0 .. 45).output("metal2_dummy_angle", "ACUTE : non 45 degree angle metal2_dummy")
logger.info("Executing rule metal3_dummy_OFFGRID")
metal3_dummy.ongrid(0.005).output("metal3_dummy_OFFGRID", "OFFGRID : OFFGRID vertex on metal3_dummy")
-metal3_dummy.with_angle(0 .. 45).output("metal3_dummy_angle", "ACUTE : non 45 degree angle metal3_dummy")
+metal3_dummy.with_angle(0 .. 45).output("metal3_dummy_angle", "ACUTE : non 45 degree angle metal3_dummy")
logger.info("Executing rule metal4_dummy_OFFGRID")
metal4_dummy.ongrid(0.005).output("metal4_dummy_OFFGRID", "OFFGRID : OFFGRID vertex on metal4_dummy")
-metal4_dummy.with_angle(0 .. 45).output("metal4_dummy_angle", "ACUTE : non 45 degree angle metal4_dummy")
+metal4_dummy.with_angle(0 .. 45).output("metal4_dummy_angle", "ACUTE : non 45 degree angle metal4_dummy")
logger.info("Executing rule metal5_dummy_OFFGRID")
metal5_dummy.ongrid(0.005).output("metal5_dummy_OFFGRID", "OFFGRID : OFFGRID vertex on metal5_dummy")
-metal5_dummy.with_angle(0 .. 45).output("metal5_dummy_angle", "ACUTE : non 45 degree angle metal5_dummy")
+metal5_dummy.with_angle(0 .. 45).output("metal5_dummy_angle", "ACUTE : non 45 degree angle metal5_dummy")
logger.info("Executing rule metaltop_dummy_OFFGRID")
metaltop_dummy.ongrid(0.005).output("metaltop_dummy_OFFGRID", "OFFGRID : OFFGRID vertex on metaltop_dummy")
-metaltop_dummy.with_angle(0 .. 45).output("metaltop_dummy_angle", "ACUTE : non 45 degree angle metaltop_dummy")
+metaltop_dummy.with_angle(0 .. 45).output("metaltop_dummy_angle", "ACUTE : non 45 degree angle metaltop_dummy")
logger.info("Executing rule comp_label_OFFGRID")
comp_label.ongrid(0.005).output("comp_label_OFFGRID", "OFFGRID : OFFGRID vertex on comp_label")
-comp_label.with_angle(0 .. 45).output("comp_label_angle", "ACUTE : non 45 degree angle comp_label")
+comp_label.with_angle(0 .. 45).output("comp_label_angle", "ACUTE : non 45 degree angle comp_label")
logger.info("Executing rule poly2_label_OFFGRID")
poly2_label.ongrid(0.005).output("poly2_label_OFFGRID", "OFFGRID : OFFGRID vertex on poly2_label")
-poly2_label.with_angle(0 .. 45).output("poly2_label_angle", "ACUTE : non 45 degree angle poly2_label")
+poly2_label.with_angle(0 .. 45).output("poly2_label_angle", "ACUTE : non 45 degree angle poly2_label")
logger.info("Executing rule metal1_label_OFFGRID")
metal1_label.ongrid(0.005).output("metal1_label_OFFGRID", "OFFGRID : OFFGRID vertex on metal1_label")
-metal1_label.with_angle(0 .. 45).output("metal1_label_angle", "ACUTE : non 45 degree angle metal1_label")
+metal1_label.with_angle(0 .. 45).output("metal1_label_angle", "ACUTE : non 45 degree angle metal1_label")
logger.info("Executing rule metal2_label_OFFGRID")
metal2_label.ongrid(0.005).output("metal2_label_OFFGRID", "OFFGRID : OFFGRID vertex on metal2_label")
-metal2_label.with_angle(0 .. 45).output("metal2_label_angle", "ACUTE : non 45 degree angle metal2_label")
+metal2_label.with_angle(0 .. 45).output("metal2_label_angle", "ACUTE : non 45 degree angle metal2_label")
logger.info("Executing rule metal3_label_OFFGRID")
metal3_label.ongrid(0.005).output("metal3_label_OFFGRID", "OFFGRID : OFFGRID vertex on metal3_label")
-metal3_label.with_angle(0 .. 45).output("metal3_label_angle", "ACUTE : non 45 degree angle metal3_label")
+metal3_label.with_angle(0 .. 45).output("metal3_label_angle", "ACUTE : non 45 degree angle metal3_label")
logger.info("Executing rule metal4_label_OFFGRID")
metal4_label.ongrid(0.005).output("metal4_label_OFFGRID", "OFFGRID : OFFGRID vertex on metal4_label")
-metal4_label.with_angle(0 .. 45).output("metal4_label_angle", "ACUTE : non 45 degree angle metal4_label")
+metal4_label.with_angle(0 .. 45).output("metal4_label_angle", "ACUTE : non 45 degree angle metal4_label")
logger.info("Executing rule metal5_label_OFFGRID")
metal5_label.ongrid(0.005).output("metal5_label_OFFGRID", "OFFGRID : OFFGRID vertex on metal5_label")
-metal5_label.with_angle(0 .. 45).output("metal5_label_angle", "ACUTE : non 45 degree angle metal5_label")
+metal5_label.with_angle(0 .. 45).output("metal5_label_angle", "ACUTE : non 45 degree angle metal5_label")
logger.info("Executing rule metaltop_label_OFFGRID")
metaltop_label.ongrid(0.005).output("metaltop_label_OFFGRID", "OFFGRID : OFFGRID vertex on metaltop_label")
-metaltop_label.with_angle(0 .. 45).output("metaltop_label_angle", "ACUTE : non 45 degree angle metaltop_label")
+metaltop_label.with_angle(0 .. 45).output("metaltop_label_angle", "ACUTE : non 45 degree angle metaltop_label")
logger.info("Executing rule metal1_slot_OFFGRID")
metal1_slot.ongrid(0.005).output("metal1_slot_OFFGRID", "OFFGRID : OFFGRID vertex on metal1_slot")
-metal1_slot.with_angle(0 .. 45).output("metal1_slot_angle", "ACUTE : non 45 degree angle metal1_slot")
+metal1_slot.with_angle(0 .. 45).output("metal1_slot_angle", "ACUTE : non 45 degree angle metal1_slot")
logger.info("Executing rule metal2_slot_OFFGRID")
metal2_slot.ongrid(0.005).output("metal2_slot_OFFGRID", "OFFGRID : OFFGRID vertex on metal2_slot")
-metal2_slot.with_angle(0 .. 45).output("metal2_slot_angle", "ACUTE : non 45 degree angle metal2_slot")
+metal2_slot.with_angle(0 .. 45).output("metal2_slot_angle", "ACUTE : non 45 degree angle metal2_slot")
logger.info("Executing rule metal3_slot_OFFGRID")
metal3_slot.ongrid(0.005).output("metal3_slot_OFFGRID", "OFFGRID : OFFGRID vertex on metal3_slot")
-metal3_slot.with_angle(0 .. 45).output("metal3_slot_angle", "ACUTE : non 45 degree angle metal3_slot")
+metal3_slot.with_angle(0 .. 45).output("metal3_slot_angle", "ACUTE : non 45 degree angle metal3_slot")
logger.info("Executing rule metal4_slot_OFFGRID")
metal4_slot.ongrid(0.005).output("metal4_slot_OFFGRID", "OFFGRID : OFFGRID vertex on metal4_slot")
-metal4_slot.with_angle(0 .. 45).output("metal4_slot_angle", "ACUTE : non 45 degree angle metal4_slot")
+metal4_slot.with_angle(0 .. 45).output("metal4_slot_angle", "ACUTE : non 45 degree angle metal4_slot")
logger.info("Executing rule metal5_slot_OFFGRID")
metal5_slot.ongrid(0.005).output("metal5_slot_OFFGRID", "OFFGRID : OFFGRID vertex on metal5_slot")
-metal5_slot.with_angle(0 .. 45).output("metal5_slot_angle", "ACUTE : non 45 degree angle metal5_slot")
+metal5_slot.with_angle(0 .. 45).output("metal5_slot_angle", "ACUTE : non 45 degree angle metal5_slot")
logger.info("Executing rule metaltop_slot_OFFGRID")
metaltop_slot.ongrid(0.005).output("metaltop_slot_OFFGRID", "OFFGRID : OFFGRID vertex on metaltop_slot")
-metaltop_slot.with_angle(0 .. 45).output("metaltop_slot_angle", "ACUTE : non 45 degree angle metaltop_slot")
+metaltop_slot.with_angle(0 .. 45).output("metaltop_slot_angle", "ACUTE : non 45 degree angle metaltop_slot")
logger.info("Executing rule ubmpperi_OFFGRID")
ubmpperi.ongrid(0.005).output("ubmpperi_OFFGRID", "OFFGRID : OFFGRID vertex on ubmpperi")
-ubmpperi.with_angle(0 .. 45).output("ubmpperi_angle", "ACUTE : non 45 degree angle ubmpperi")
+ubmpperi.with_angle(0 .. 45).output("ubmpperi_angle", "ACUTE : non 45 degree angle ubmpperi")
logger.info("Executing rule ubmparray_OFFGRID")
ubmparray.ongrid(0.005).output("ubmparray_OFFGRID", "OFFGRID : OFFGRID vertex on ubmparray")
-ubmparray.with_angle(0 .. 45).output("ubmparray_angle", "ACUTE : non 45 degree angle ubmparray")
+ubmparray.with_angle(0 .. 45).output("ubmparray_angle", "ACUTE : non 45 degree angle ubmparray")
logger.info("Executing rule ubmeplate_OFFGRID")
ubmeplate.ongrid(0.005).output("ubmeplate_OFFGRID", "OFFGRID : OFFGRID vertex on ubmeplate")
-ubmeplate.with_angle(0 .. 45).output("ubmeplate_angle", "ACUTE : non 45 degree angle ubmeplate")
+ubmeplate.with_angle(0 .. 45).output("ubmeplate_angle", "ACUTE : non 45 degree angle ubmeplate")
logger.info("Executing rule schottky_diode_OFFGRID")
schottky_diode.ongrid(0.005).output("schottky_diode_OFFGRID", "OFFGRID : OFFGRID vertex on schottky_diode")
-schottky_diode.with_angle(0 .. 45).output("schottky_diode_angle", "ACUTE : non 45 degree angle schottky_diode")
+schottky_diode.with_angle(0 .. 45).output("schottky_diode_angle", "ACUTE : non 45 degree angle schottky_diode")
logger.info("Executing rule zener_OFFGRID")
zener.ongrid(0.005).output("zener_OFFGRID", "OFFGRID : OFFGRID vertex on zener")
-zener.with_angle(0 .. 45).output("zener_angle", "ACUTE : non 45 degree angle zener")
+zener.with_angle(0 .. 45).output("zener_angle", "ACUTE : non 45 degree angle zener")
logger.info("Executing rule res_mk_OFFGRID")
res_mk.ongrid(0.005).output("res_mk_OFFGRID", "OFFGRID : OFFGRID vertex on res_mk")
-res_mk.with_angle(0 .. 45).output("res_mk_angle", "ACUTE : non 45 degree angle res_mk")
+res_mk.with_angle(0 .. 45).output("res_mk_angle", "ACUTE : non 45 degree angle res_mk")
logger.info("Executing rule opc_drc_OFFGRID")
opc_drc.ongrid(0.005).output("opc_drc_OFFGRID", "OFFGRID : OFFGRID vertex on opc_drc")
-opc_drc.with_angle(0 .. 45).output("opc_drc_angle", "ACUTE : non 45 degree angle opc_drc")
+opc_drc.with_angle(0 .. 45).output("opc_drc_angle", "ACUTE : non 45 degree angle opc_drc")
logger.info("Executing rule ndmy_OFFGRID")
ndmy.ongrid(0.005).output("ndmy_OFFGRID", "OFFGRID : OFFGRID vertex on ndmy")
-ndmy.with_angle(0 .. 45).output("ndmy_angle", "ACUTE : non 45 degree angle ndmy")
+ndmy.with_angle(0 .. 45).output("ndmy_angle", "ACUTE : non 45 degree angle ndmy")
logger.info("Executing rule pmndmy_OFFGRID")
pmndmy.ongrid(0.005).output("pmndmy_OFFGRID", "OFFGRID : OFFGRID vertex on pmndmy")
-pmndmy.with_angle(0 .. 45).output("pmndmy_angle", "ACUTE : non 45 degree angle pmndmy")
+pmndmy.with_angle(0 .. 45).output("pmndmy_angle", "ACUTE : non 45 degree angle pmndmy")
logger.info("Executing rule v5_xtor_OFFGRID")
v5_xtor.ongrid(0.005).output("v5_xtor_OFFGRID", "OFFGRID : OFFGRID vertex on v5_xtor")
-v5_xtor.with_angle(0 .. 45).output("v5_xtor_angle", "ACUTE : non 45 degree angle v5_xtor")
+v5_xtor.with_angle(0 .. 45).output("v5_xtor_angle", "ACUTE : non 45 degree angle v5_xtor")
logger.info("Executing rule cap_mk_OFFGRID")
cap_mk.ongrid(0.005).output("cap_mk_OFFGRID", "OFFGRID : OFFGRID vertex on cap_mk")
-cap_mk.with_angle(0 .. 45).output("cap_mk_angle", "ACUTE : non 45 degree angle cap_mk")
+cap_mk.with_angle(0 .. 45).output("cap_mk_angle", "ACUTE : non 45 degree angle cap_mk")
logger.info("Executing rule mos_cap_mk_OFFGRID")
mos_cap_mk.ongrid(0.005).output("mos_cap_mk_OFFGRID", "OFFGRID : OFFGRID vertex on mos_cap_mk")
-mos_cap_mk.with_angle(0 .. 45).output("mos_cap_mk_angle", "ACUTE : non 45 degree angle mos_cap_mk")
+mos_cap_mk.with_angle(0 .. 45).output("mos_cap_mk_angle", "ACUTE : non 45 degree angle mos_cap_mk")
logger.info("Executing rule ind_mk_OFFGRID")
ind_mk.ongrid(0.005).output("ind_mk_OFFGRID", "OFFGRID : OFFGRID vertex on ind_mk")
-ind_mk.with_angle(0 .. 45).output("ind_mk_angle", "ACUTE : non 45 degree angle ind_mk")
+ind_mk.with_angle(0 .. 45).output("ind_mk_angle", "ACUTE : non 45 degree angle ind_mk")
logger.info("Executing rule diode_mk_OFFGRID")
diode_mk.ongrid(0.005).output("diode_mk_OFFGRID", "OFFGRID : OFFGRID vertex on diode_mk")
-diode_mk.with_angle(0 .. 45).output("diode_mk_angle", "ACUTE : non 45 degree angle diode_mk")
+diode_mk.with_angle(0 .. 45).output("diode_mk_angle", "ACUTE : non 45 degree angle diode_mk")
logger.info("Executing rule drc_bjt_OFFGRID")
drc_bjt.ongrid(0.005).output("drc_bjt_OFFGRID", "OFFGRID : OFFGRID vertex on drc_bjt")
-drc_bjt.with_angle(0 .. 45).output("drc_bjt_angle", "ACUTE : non 45 degree angle drc_bjt")
+drc_bjt.with_angle(0 .. 45).output("drc_bjt_angle", "ACUTE : non 45 degree angle drc_bjt")
logger.info("Executing rule lvs_bjt_OFFGRID")
lvs_bjt.ongrid(0.005).output("lvs_bjt_OFFGRID", "OFFGRID : OFFGRID vertex on lvs_bjt")
-lvs_bjt.with_angle(0 .. 45).output("lvs_bjt_angle", "ACUTE : non 45 degree angle lvs_bjt")
+lvs_bjt.with_angle(0 .. 45).output("lvs_bjt_angle", "ACUTE : non 45 degree angle lvs_bjt")
logger.info("Executing rule mim_l_mk_OFFGRID")
mim_l_mk.ongrid(0.005).output("mim_l_mk_OFFGRID", "OFFGRID : OFFGRID vertex on mim_l_mk")
-mim_l_mk.with_angle(0 .. 45).output("mim_l_mk_angle", "ACUTE : non 45 degree angle mim_l_mk")
+mim_l_mk.with_angle(0 .. 45).output("mim_l_mk_angle", "ACUTE : non 45 degree angle mim_l_mk")
logger.info("Executing rule latchup_mk_OFFGRID")
latchup_mk.ongrid(0.005).output("latchup_mk_OFFGRID", "OFFGRID : OFFGRID vertex on latchup_mk")
-latchup_mk.with_angle(0 .. 45).output("latchup_mk_angle", "ACUTE : non 45 degree angle latchup_mk")
+latchup_mk.with_angle(0 .. 45).output("latchup_mk_angle", "ACUTE : non 45 degree angle latchup_mk")
logger.info("Executing rule guard_ring_mk_OFFGRID")
guard_ring_mk.ongrid(0.005).output("guard_ring_mk_OFFGRID", "OFFGRID : OFFGRID vertex on guard_ring_mk")
-guard_ring_mk.with_angle(0 .. 45).output("guard_ring_mk_angle", "ACUTE : non 45 degree angle guard_ring_mk")
+guard_ring_mk.with_angle(0 .. 45).output("guard_ring_mk_angle", "ACUTE : non 45 degree angle guard_ring_mk")
logger.info("Executing rule otp_mk_OFFGRID")
otp_mk.ongrid(0.005).output("otp_mk_OFFGRID", "OFFGRID : OFFGRID vertex on otp_mk")
-otp_mk.with_angle(0 .. 45).output("otp_mk_angle", "ACUTE : non 45 degree angle otp_mk")
+otp_mk.with_angle(0 .. 45).output("otp_mk_angle", "ACUTE : non 45 degree angle otp_mk")
logger.info("Executing rule mtpmark_OFFGRID")
mtpmark.ongrid(0.005).output("mtpmark_OFFGRID", "OFFGRID : OFFGRID vertex on mtpmark")
-mtpmark.with_angle(0 .. 45).output("mtpmark_angle", "ACUTE : non 45 degree angle mtpmark")
+mtpmark.with_angle(0 .. 45).output("mtpmark_angle", "ACUTE : non 45 degree angle mtpmark")
logger.info("Executing rule neo_ee_mk_OFFGRID")
neo_ee_mk.ongrid(0.005).output("neo_ee_mk_OFFGRID", "OFFGRID : OFFGRID vertex on neo_ee_mk")
-neo_ee_mk.with_angle(0 .. 45).output("neo_ee_mk_angle", "ACUTE : non 45 degree angle neo_ee_mk")
+neo_ee_mk.with_angle(0 .. 45).output("neo_ee_mk_angle", "ACUTE : non 45 degree angle neo_ee_mk")
logger.info("Executing rule sramcore_OFFGRID")
sramcore.ongrid(0.005).output("sramcore_OFFGRID", "OFFGRID : OFFGRID vertex on sramcore")
-sramcore.with_angle(0 .. 45).output("sramcore_angle", "ACUTE : non 45 degree angle sramcore")
+sramcore.with_angle(0 .. 45).output("sramcore_angle", "ACUTE : non 45 degree angle sramcore")
logger.info("Executing rule lvs_rf_OFFGRID")
lvs_rf.ongrid(0.005).output("lvs_rf_OFFGRID", "OFFGRID : OFFGRID vertex on lvs_rf")
-lvs_rf.with_angle(0 .. 45).output("lvs_rf_angle", "ACUTE : non 45 degree angle lvs_rf")
+lvs_rf.with_angle(0 .. 45).output("lvs_rf_angle", "ACUTE : non 45 degree angle lvs_rf")
logger.info("Executing rule lvs_drain_OFFGRID")
lvs_drain.ongrid(0.005).output("lvs_drain_OFFGRID", "OFFGRID : OFFGRID vertex on lvs_drain")
-lvs_drain.with_angle(0 .. 45).output("lvs_drain_angle", "ACUTE : non 45 degree angle lvs_drain")
+lvs_drain.with_angle(0 .. 45).output("lvs_drain_angle", "ACUTE : non 45 degree angle lvs_drain")
logger.info("Executing rule ind_mk_OFFGRID")
ind_mk.ongrid(0.005).output("ind_mk_OFFGRID", "OFFGRID : OFFGRID vertex on ind_mk")
-ind_mk.with_angle(0 .. 45).output("ind_mk_angle", "ACUTE : non 45 degree angle ind_mk")
+ind_mk.with_angle(0 .. 45).output("ind_mk_angle", "ACUTE : non 45 degree angle ind_mk")
logger.info("Executing rule hvpolyrs_OFFGRID")
hvpolyrs.ongrid(0.005).output("hvpolyrs_OFFGRID", "OFFGRID : OFFGRID vertex on hvpolyrs")
-hvpolyrs.with_angle(0 .. 45).output("hvpolyrs_angle", "ACUTE : non 45 degree angle hvpolyrs")
+hvpolyrs.with_angle(0 .. 45).output("hvpolyrs_angle", "ACUTE : non 45 degree angle hvpolyrs")
logger.info("Executing rule lvs_io_OFFGRID")
lvs_io.ongrid(0.005).output("lvs_io_OFFGRID", "OFFGRID : OFFGRID vertex on lvs_io")
-lvs_io.with_angle(0 .. 45).output("lvs_io_angle", "ACUTE : non 45 degree angle lvs_io")
+lvs_io.with_angle(0 .. 45).output("lvs_io_angle", "ACUTE : non 45 degree angle lvs_io")
logger.info("Executing rule probe_mk_OFFGRID")
probe_mk.ongrid(0.005).output("probe_mk_OFFGRID", "OFFGRID : OFFGRID vertex on probe_mk")
-probe_mk.with_angle(0 .. 45).output("probe_mk_angle", "ACUTE : non 45 degree angle probe_mk")
+probe_mk.with_angle(0 .. 45).output("probe_mk_angle", "ACUTE : non 45 degree angle probe_mk")
logger.info("Executing rule esd_mk_OFFGRID")
esd_mk.ongrid(0.005).output("esd_mk_OFFGRID", "OFFGRID : OFFGRID vertex on esd_mk")
-esd_mk.with_angle(0 .. 45).output("esd_mk_angle", "ACUTE : non 45 degree angle esd_mk")
+esd_mk.with_angle(0 .. 45).output("esd_mk_angle", "ACUTE : non 45 degree angle esd_mk")
logger.info("Executing rule lvs_source_OFFGRID")
lvs_source.ongrid(0.005).output("lvs_source_OFFGRID", "OFFGRID : OFFGRID vertex on lvs_source")
-lvs_source.with_angle(0 .. 45).output("lvs_source_angle", "ACUTE : non 45 degree angle lvs_source")
+lvs_source.with_angle(0 .. 45).output("lvs_source_angle", "ACUTE : non 45 degree angle lvs_source")
logger.info("Executing rule well_diode_mk_OFFGRID")
well_diode_mk.ongrid(0.005).output("well_diode_mk_OFFGRID", "OFFGRID : OFFGRID vertex on well_diode_mk")
-well_diode_mk.with_angle(0 .. 45).output("well_diode_mk_angle", "ACUTE : non 45 degree angle well_diode_mk")
+well_diode_mk.with_angle(0 .. 45).output("well_diode_mk_angle", "ACUTE : non 45 degree angle well_diode_mk")
logger.info("Executing rule ldmos_xtor_OFFGRID")
ldmos_xtor.ongrid(0.005).output("ldmos_xtor_OFFGRID", "OFFGRID : OFFGRID vertex on ldmos_xtor")
-ldmos_xtor.with_angle(0 .. 45).output("ldmos_xtor_angle", "ACUTE : non 45 degree angle ldmos_xtor")
+ldmos_xtor.with_angle(0 .. 45).output("ldmos_xtor_angle", "ACUTE : non 45 degree angle ldmos_xtor")
logger.info("Executing rule plfuse_OFFGRID")
plfuse.ongrid(0.005).output("plfuse_OFFGRID", "OFFGRID : OFFGRID vertex on plfuse")
-plfuse.with_angle(0 .. 45).output("plfuse_angle", "ACUTE : non 45 degree angle plfuse")
+plfuse.with_angle(0 .. 45).output("plfuse_angle", "ACUTE : non 45 degree angle plfuse")
logger.info("Executing rule efuse_mk_OFFGRID")
efuse_mk.ongrid(0.005).output("efuse_mk_OFFGRID", "OFFGRID : OFFGRID vertex on efuse_mk")
-efuse_mk.with_angle(0 .. 45).output("efuse_mk_angle", "ACUTE : non 45 degree angle efuse_mk")
+efuse_mk.with_angle(0 .. 45).output("efuse_mk_angle", "ACUTE : non 45 degree angle efuse_mk")
logger.info("Executing rule mcell_feol_mk_OFFGRID")
mcell_feol_mk.ongrid(0.005).output("mcell_feol_mk_OFFGRID", "OFFGRID : OFFGRID vertex on mcell_feol_mk")
-mcell_feol_mk.with_angle(0 .. 45).output("mcell_feol_mk_angle", "ACUTE : non 45 degree angle mcell_feol_mk")
+mcell_feol_mk.with_angle(0 .. 45).output("mcell_feol_mk_angle", "ACUTE : non 45 degree angle mcell_feol_mk")
logger.info("Executing rule ymtp_mk_OFFGRID")
ymtp_mk.ongrid(0.005).output("ymtp_mk_OFFGRID", "OFFGRID : OFFGRID vertex on ymtp_mk")
-ymtp_mk.with_angle(0 .. 45).output("ymtp_mk_angle", "ACUTE : non 45 degree angle ymtp_mk")
+ymtp_mk.with_angle(0 .. 45).output("ymtp_mk_angle", "ACUTE : non 45 degree angle ymtp_mk")
logger.info("Executing rule dev_wf_mk_OFFGRID")
dev_wf_mk.ongrid(0.005).output("dev_wf_mk_OFFGRID", "OFFGRID : OFFGRID vertex on dev_wf_mk")
-dev_wf_mk.with_angle(0 .. 45).output("dev_wf_mk_angle", "ACUTE : non 45 degree angle dev_wf_mk")
+dev_wf_mk.with_angle(0 .. 45).output("dev_wf_mk_angle", "ACUTE : non 45 degree angle dev_wf_mk")
logger.info("Executing rule metal1_blk_OFFGRID")
metal1_blk.ongrid(0.005).output("metal1_blk_OFFGRID", "OFFGRID : OFFGRID vertex on metal1_blk")
-metal1_blk.with_angle(0 .. 45).output("metal1_blk_angle", "ACUTE : non 45 degree angle metal1_blk")
+metal1_blk.with_angle(0 .. 45).output("metal1_blk_angle", "ACUTE : non 45 degree angle metal1_blk")
logger.info("Executing rule metal2_blk_OFFGRID")
metal2_blk.ongrid(0.005).output("metal2_blk_OFFGRID", "OFFGRID : OFFGRID vertex on metal2_blk")
-metal2_blk.with_angle(0 .. 45).output("metal2_blk_angle", "ACUTE : non 45 degree angle metal2_blk")
+metal2_blk.with_angle(0 .. 45).output("metal2_blk_angle", "ACUTE : non 45 degree angle metal2_blk")
logger.info("Executing rule metal3_blk_OFFGRID")
metal3_blk.ongrid(0.005).output("metal3_blk_OFFGRID", "OFFGRID : OFFGRID vertex on metal3_blk")
-metal3_blk.with_angle(0 .. 45).output("metal3_blk_angle", "ACUTE : non 45 degree angle metal3_blk")
+metal3_blk.with_angle(0 .. 45).output("metal3_blk_angle", "ACUTE : non 45 degree angle metal3_blk")
logger.info("Executing rule metal4_blk_OFFGRID")
metal4_blk.ongrid(0.005).output("metal4_blk_OFFGRID", "OFFGRID : OFFGRID vertex on metal4_blk")
-metal4_blk.with_angle(0 .. 45).output("metal4_blk_angle", "ACUTE : non 45 degree angle metal4_blk")
+metal4_blk.with_angle(0 .. 45).output("metal4_blk_angle", "ACUTE : non 45 degree angle metal4_blk")
logger.info("Executing rule metal5_blk_OFFGRID")
metal5_blk.ongrid(0.005).output("metal5_blk_OFFGRID", "OFFGRID : OFFGRID vertex on metal5_blk")
-metal5_blk.with_angle(0 .. 45).output("metal5_blk_angle", "ACUTE : non 45 degree angle metal5_blk")
+metal5_blk.with_angle(0 .. 45).output("metal5_blk_angle", "ACUTE : non 45 degree angle metal5_blk")
logger.info("Executing rule metalt_blk_OFFGRID")
metalt_blk.ongrid(0.005).output("metalt_blk_OFFGRID", "OFFGRID : OFFGRID vertex on metalt_blk")
-metalt_blk.with_angle(0 .. 45).output("metalt_blk_angle", "ACUTE : non 45 degree angle metalt_blk")
+metalt_blk.with_angle(0 .. 45).output("metalt_blk_angle", "ACUTE : non 45 degree angle metalt_blk")
logger.info("Executing rule pr_bndry_OFFGRID")
pr_bndry.ongrid(0.005).output("pr_bndry_OFFGRID", "OFFGRID : OFFGRID vertex on pr_bndry")
-pr_bndry.with_angle(0 .. 45).output("pr_bndry_angle", "ACUTE : non 45 degree angle pr_bndry")
+pr_bndry.with_angle(0 .. 45).output("pr_bndry_angle", "ACUTE : non 45 degree angle pr_bndry")
logger.info("Executing rule mdiode_OFFGRID")
mdiode.ongrid(0.005).output("mdiode_OFFGRID", "OFFGRID : OFFGRID vertex on mdiode")
-mdiode.with_angle(0 .. 45).output("mdiode_angle", "ACUTE : non 45 degree angle mdiode")
+mdiode.with_angle(0 .. 45).output("mdiode_angle", "ACUTE : non 45 degree angle mdiode")
logger.info("Executing rule metal1_res_OFFGRID")
metal1_res.ongrid(0.005).output("metal1_res_OFFGRID", "OFFGRID : OFFGRID vertex on metal1_res")
-metal1_res.with_angle(0 .. 45).output("metal1_res_angle", "ACUTE : non 45 degree angle metal1_res")
+metal1_res.with_angle(0 .. 45).output("metal1_res_angle", "ACUTE : non 45 degree angle metal1_res")
logger.info("Executing rule metal2_res_OFFGRID")
metal2_res.ongrid(0.005).output("metal2_res_OFFGRID", "OFFGRID : OFFGRID vertex on metal2_res")
-metal2_res.with_angle(0 .. 45).output("metal2_res_angle", "ACUTE : non 45 degree angle metal2_res")
+metal2_res.with_angle(0 .. 45).output("metal2_res_angle", "ACUTE : non 45 degree angle metal2_res")
logger.info("Executing rule metal3_res_OFFGRID")
metal3_res.ongrid(0.005).output("metal3_res_OFFGRID", "OFFGRID : OFFGRID vertex on metal3_res")
-metal3_res.with_angle(0 .. 45).output("metal3_res_angle", "ACUTE : non 45 degree angle metal3_res")
+metal3_res.with_angle(0 .. 45).output("metal3_res_angle", "ACUTE : non 45 degree angle metal3_res")
logger.info("Executing rule metal4_res_OFFGRID")
metal4_res.ongrid(0.005).output("metal4_res_OFFGRID", "OFFGRID : OFFGRID vertex on metal4_res")
-metal4_res.with_angle(0 .. 45).output("metal4_res_angle", "ACUTE : non 45 degree angle metal4_res")
+metal4_res.with_angle(0 .. 45).output("metal4_res_angle", "ACUTE : non 45 degree angle metal4_res")
logger.info("Executing rule metal5_res_OFFGRID")
metal5_res.ongrid(0.005).output("metal5_res_OFFGRID", "OFFGRID : OFFGRID vertex on metal5_res")
-metal5_res.with_angle(0 .. 45).output("metal5_res_angle", "ACUTE : non 45 degree angle metal5_res")
+metal5_res.with_angle(0 .. 45).output("metal5_res_angle", "ACUTE : non 45 degree angle metal5_res")
logger.info("Executing rule metal6_res_OFFGRID")
metal6_res.ongrid(0.005).output("metal6_res_OFFGRID", "OFFGRID : OFFGRID vertex on metal6_res")
-metal6_res.with_angle(0 .. 45).output("metal6_res_angle", "ACUTE : non 45 degree angle metal6_res")
+metal6_res.with_angle(0 .. 45).output("metal6_res_angle", "ACUTE : non 45 degree angle metal6_res")
logger.info("Executing rule border_OFFGRID")
border.ongrid(0.005).output("border_OFFGRID", "OFFGRID : OFFGRID vertex on border")
-border.with_angle(0 .. 45).output("border_angle", "ACUTE : non 45 degree angle border")
+border.with_angle(0 .. 45).output("border_angle", "ACUTE : non 45 degree angle border")
-end #OFFGRID-ANGLES
+end #OFFGRID-ANGLES
exec_end_time = Time.now
diff --git a/rules/klayout/drc/rule_decks/h_poly_resistor.drc b/rules/klayout/drc/rule_decks/h_poly_resistor.drc
index 87a7877..4a689db 100644
--- a/rules/klayout/drc/rule_decks/h_poly_resistor.drc
+++ b/rules/klayout/drc/rule_decks/h_poly_resistor.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -115,7 +115,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -124,12 +124,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -196,7 +196,7 @@
#================================================
#----------------H POLY RESISTOR-----------------
-#================================================
+#================================================
hres_poly = poly2.interacting(pplus).interacting(sab).interacting(res_mk).interacting(resistor)
hres1_poly = poly2.interacting(pplus).interacting(sab).interacting(res_mk)
@@ -204,19 +204,19 @@
logger.info("Executing rule HRES.1")
hres1_l1 = resistor.interacting(hres1_poly).space(0.4.um, euclidian).polygons(0.001)
hres1_l1.output("HRES.1", "HRES.1 : Minimum space. Note : Merge if the spacing is less than 0.4 um. : 0.4µm")
-hres1_l1.forget
+hres1_l1.forget
# Rule HRES.2: Minimum width of Poly2 resistor. is 1µm
logger.info("Executing rule HRES.2")
hres2_l1 = hres_poly.width(1.um, euclidian).polygons(0.001)
hres2_l1.output("HRES.2", "HRES.2 : Minimum width of Poly2 resistor. : 1µm")
-hres2_l1.forget
+hres2_l1.forget
# Rule HRES.3: Minimum space between Poly2 resistors. is 0.4µm
logger.info("Executing rule HRES.3")
hres3_l1 = hres_poly.space(0.4.um, euclidian).polygons(0.001)
hres3_l1.output("HRES.3", "HRES.3 : Minimum space between Poly2 resistors. : 0.4µm")
-hres3_l1.forget
+hres3_l1.forget
# Rule HRES.4: Minimum RESISTOR overlap of Poly2 resistor. is 0.4µm
logger.info("Executing rule HRES.4")
@@ -232,7 +232,7 @@
logger.info("Executing rule HRES.5")
hres5_l1 = resistor.interacting(hres1_poly).separation(poly2.not_interacting(sab), 0.3.um, euclidian).polygons(0.001)
hres5_l1.output("HRES.5", "HRES.5 : Minimum RESISTOR space to unrelated Poly2. : 0.3µm")
-hres5_l1.forget
+hres5_l1.forget
# Rule HRES.6: Minimum RESISTOR space to COMP.
logger.info("Executing rule HRES.6")
@@ -284,7 +284,7 @@
# rule HRES.11 is not a DRC check
mk_hres12a = res_mk.edges.not(poly2.not(pplus).and(sab).edges).inside_part(poly2)
-# Rule HRES.12a: P type Poly2 resistor (high sheet rho) shall be covered by RES_MK marking. RES_MK length shall be coincide with resistor length (Defined by Pplus space) and width covering the width of Poly2.
+# Rule HRES.12a: P type Poly2 resistor (high sheet rho) shall be covered by RES_MK marking. RES_MK length shall be coincide with resistor length (Defined by Pplus space) and width covering the width of Poly2.
logger.info("Executing rule HRES.12a")
hres12a_l1 = res_mk.interacting(resistor).interacting(mk_hres12a)
hres12a_l1.output("HRES.12a", "HRES.12a : P type Poly2 resistor (high sheet rho) shall be covered by RES_MK marking. RES_MK length shall be coincide with resistor length (Defined by Pplus space) and width covering the width of Poly2. ")
diff --git a/rules/klayout/drc/rule_decks/lvpwell.drc b/rules/klayout/drc/rule_decks/lvpwell.drc
index 3ac662b..14cedda 100644
--- a/rules/klayout/drc/rule_decks/lvpwell.drc
+++ b/rules/klayout/drc/rule_decks/lvpwell.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -116,7 +116,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -125,12 +125,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -222,7 +222,7 @@
connect(metal5, via5)
connect(via5, metaltop)
-end #CONNECTIVITY_RULES
+end #CONNECTIVITY_RULES
#================================================
#------------ PRE-DEFINED FUNCTIONS -------------
@@ -248,7 +248,7 @@
end
end
unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
- return connected_output, unconnected_output
+ return connected_output, unconnected_output
end
def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
@@ -277,10 +277,10 @@
if CONNECTIVITY_RULES
logger.info("Connectivity rules enabled, Netlist object will be generated.")
netlist
-end #CONNECTIVITY_RULES
+end #CONNECTIVITY_RULES
# === LAYOUT EXTENT ===
-CHIP = extent.sized(0.0)
+CHIP = extent.sized(0.0)
logger.info("Total area of the design is #{CHIP.area()} um^2.")
@@ -288,7 +288,7 @@
#================================================
#--------------------LVPWELL---------------------
-#================================================
+#================================================
if FEOL
@@ -298,61 +298,61 @@
logger.info("Executing rule LPW.1_3.3V")
lpw1_l1 = lvpwell.width(0.6.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
lpw1_l1.output("LPW.1_3.3V", "LPW.1_3.3V : Min. LVPWELL Width. : 0.6µm")
-lpw1_l1.forget
+lpw1_l1.forget
# Rule LPW.1_5V: Min. LVPWELL Width. is 0.74µm
logger.info("Executing rule LPW.1_5V")
lpw1_l1 = lvpwell.width(0.74.um, euclidian).polygons(0.001).overlapping(dualgate)
lpw1_l1.output("LPW.1_5V", "LPW.1_5V : Min. LVPWELL Width. : 0.74µm")
-lpw1_l1.forget
+lpw1_l1.forget
if CONNECTIVITY_RULES
-logger.info("CONNECTIVITY_RULES section")
+logger.info("CONNECTIVITY_RULES section")
-connected_lvpwell_3p3v, unconnected_lvpwell_3p3v = conn_space(lvpwell, 0.86, 1.4, euclidian)
+connected_lvpwell_3p3v, unconnected_lvpwell_3p3v = conn_space(lvpwell, 0.86, 1.4, euclidian)
-connected_lvpwell_5p0v, unconnected_lvpwell_5p0v = conn_space(lvpwell, 0.86, 1.7, euclidian)
+connected_lvpwell_5p0v, unconnected_lvpwell_5p0v = conn_space(lvpwell, 0.86, 1.7, euclidian)
# Rule LPW.2a_3.3V: Min. LVPWELL to LVWELL Space (Inside DNWELL) [Different potential]. is 1.4µm
logger.info("Executing rule LPW.2a_3.3V")
lpw2a_l1 = unconnected_lvpwell_3p3v.not_interacting(v5_xtor).not_interacting(dualgate)
lpw2a_l1.output("LPW.2a_3.3V", "LPW.2a_3.3V : Min. LVPWELL to LVWELL Space (Inside DNWELL) [Different potential]. : 1.4µm")
-lpw2a_l1.forget
+lpw2a_l1.forget
# Rule LPW.2a_5V: Min. LVPWELL to LVPWELL Space (Inside DNWELL) [Different potential]. is 1.7µm
logger.info("Executing rule LPW.2a_5V")
lpw2a_l1 = unconnected_lvpwell_5p0v.overlapping(dualgate)
lpw2a_l1.output("LPW.2a_5V", "LPW.2a_5V : Min. LVPWELL to LVPWELL Space (Inside DNWELL) [Different potential]. : 1.7µm")
-lpw2a_l1.forget
+lpw2a_l1.forget
# Rule LPW.2b_3.3V: Min. LVPWELL to LVPWELL Space [Equi potential]. is 0.86µm
logger.info("Executing rule LPW.2b_3.3V")
lpw2b_l1 = connected_lvpwell_3p3v.not_interacting(v5_xtor).not_interacting(dualgate)
lpw2b_l1.output("LPW.2b_3.3V", "LPW.2b_3.3V : Min. LVPWELL to LVPWELL Space [Equi potential]. : 0.86µm")
-lpw2b_l1.forget
+lpw2b_l1.forget
# Rule LPW.2b_5V: Min. LVPWELL to LVPWELL Space [Equi potential]. is 0.86µm
logger.info("Executing rule LPW.2b_5V")
lpw2b_l1 = connected_lvpwell_5p0v.overlapping(dualgate)
lpw2b_l1.output("LPW.2b_5V", "LPW.2b_5V : Min. LVPWELL to LVPWELL Space [Equi potential]. : 0.86µm")
-lpw2b_l1.forget
+lpw2b_l1.forget
else
-logger.info("CONNECTIVITY_RULES disabled section")
+logger.info("CONNECTIVITY_RULES disabled section")
# Rule LPW.2a_3.3V_: Min. LVPWELL to LVWELL Space (Inside DNWELL) [Different potential]. is 1.4µm
logger.info("Executing rule LPW.2a_3.3V_")
lpw2a_l1 = lvpwell.isolated(1.4.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
lpw2a_l1.output("LPW.2a_3.3V_", "LPW.2a_3.3V_ : Min. LVPWELL to LVWELL Space (Inside DNWELL) [Different potential]. : 1.4µm")
-lpw2a_l1.forget
+lpw2a_l1.forget
# Rule LPW.2a_5V_: Min. LVPWELL to LVPWELL Space (Inside DNWELL) [Different potential]. is 1.7µm
logger.info("Executing rule LPW.2a_5V_")
lpw2a_l1 = lvpwell.isolated(1.7.um, euclidian).polygons(0.001).overlapping(dualgate)
lpw2a_l1.output("LPW.2a_5V_", "LPW.2a_5V_ : Min. LVPWELL to LVPWELL Space (Inside DNWELL) [Different potential]. : 1.7µm")
-lpw2a_l1.forget
+lpw2a_l1.forget
-end #CONNECTIVITY_RULES
+end #CONNECTIVITY_RULES
# Rule LPW.3_3.3V: Min. DNWELL enclose LVPWELL. is 2.5µm
logger.info("Executing rule LPW.3_3.3V")
@@ -394,7 +394,7 @@
logger.info("Executing rule LPW.11")
lpw11_l1 = lvpwell.outside(dnwell).separation(dnwell, 1.5.um, euclidian).polygons(0.001)
lpw11_l1.output("LPW.11", "LPW.11 : Min. (LVPWELL outside DNWELL) space to DNWELL. : 1.5µm")
-lpw11_l1.forget
+lpw11_l1.forget
# Rule LPW.12: LVPWELL cannot overlap with Nwell.
logger.info("Executing rule LPW.12")
diff --git a/rules/klayout/drc/rule_decks/lvs_bjt.drc b/rules/klayout/drc/rule_decks/lvs_bjt.drc
index cc7c9dd..6cf8f16 100644
--- a/rules/klayout/drc/rule_decks/lvs_bjt.drc
+++ b/rules/klayout/drc/rule_decks/lvs_bjt.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -114,7 +114,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -123,12 +123,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -195,7 +195,7 @@
#================================================
#--------------------LVS_BJT---------------------
-#================================================
+#================================================
vnpn_e = ncomp.interacting(lvs_bjt).inside(dnwell)
vpnp_e = pcomp.inside(nwell).interacting(lvs_bjt)
diff --git a/rules/klayout/drc/rule_decks/mcell.drc b/rules/klayout/drc/rule_decks/mcell.drc
index 55b99db..7224f76 100644
--- a/rules/klayout/drc/rule_decks/mcell.drc
+++ b/rules/klayout/drc/rule_decks/mcell.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -112,7 +112,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -121,12 +121,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -193,30 +193,30 @@
#================================================
#---------------------MCELL----------------------
-#================================================
+#================================================
# Rule MC.1: min. mcell width is 0.4µm
logger.info("Executing rule MC.1")
mc1_l1 = mcell_feol_mk.width(0.4.um, euclidian).polygons(0.001)
mc1_l1.output("MC.1", "MC.1 : min. mcell width : 0.4µm")
-mc1_l1.forget
+mc1_l1.forget
# Rule MC.2: min. mcell spacing is 0.4µm
logger.info("Executing rule MC.2")
mc2_l1 = mcell_feol_mk.space(0.4.um, euclidian).polygons(0.001)
mc2_l1.output("MC.2", "MC.2 : min. mcell spacing : 0.4µm")
-mc2_l1.forget
+mc2_l1.forget
# Rule MC.3: Minimum Mcell area is 0.35µm²
logger.info("Executing rule MC.3")
mc3_l1 = mcell_feol_mk.with_area(nil, 0.35.um)
mc3_l1.output("MC.3", "MC.3 : Minimum Mcell area : 0.35µm²")
-mc3_l1.forget
+mc3_l1.forget
# Rule MC.4: Minimum area enclosed by Mcell is 0.35µm²
logger.info("Executing rule MC.4")
mc4_l1 = mcell_feol_mk.holes.with_area(nil, 0.35.um)
mc4_l1.output("MC.4", "MC.4 : Minimum area enclosed by Mcell : 0.35µm²")
-mc4_l1.forget
+mc4_l1.forget
exec_end_time = Time.now
run_time = exec_end_time - exec_start_time
diff --git a/rules/klayout/drc/rule_decks/metal1.drc b/rules/klayout/drc/rule_decks/metal1.drc
index 5c515b8..a1cfa6a 100644
--- a/rules/klayout/drc/rule_decks/metal1.drc
+++ b/rules/klayout/drc/rule_decks/metal1.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -113,7 +113,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -122,12 +122,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -194,7 +194,7 @@
#================================================
#---------------------METAL1---------------------
-#================================================
+#================================================
if BEOL
@@ -204,25 +204,25 @@
logger.info("Executing rule M1.1")
m11_l1 = metal1.not(sramcore).width(0.23.um, euclidian).polygons(0.001)
m11_l1.output("M1.1", "M1.1 : min. metal1 width : 0.23µm")
-m11_l1.forget
+m11_l1.forget
# Rule M1.2a: min. metal1 spacing is 0.23µm
logger.info("Executing rule M1.2a")
m12a_l1 = metal1.space(0.23.um, euclidian).polygons(0.001)
m12a_l1.output("M1.2a", "M1.2a : min. metal1 spacing : 0.23µm")
-m12a_l1.forget
+m12a_l1.forget
# Rule M1.2b: Space to wide Metal1 (length & width > 10um) is 0.3µm
logger.info("Executing rule M1.2b")
m12b_l1 = metal1.separation(metal1.not_interacting(metal1.edges.with_length(nil, 10.um)), 0.3.um, euclidian).polygons(0.001)
m12b_l1.output("M1.2b", "M1.2b : Space to wide Metal1 (length & width > 10um) : 0.3µm")
-m12b_l1.forget
+m12b_l1.forget
# Rule M1.3: Minimum Metal1 area is 0.1444µm²
logger.info("Executing rule M1.3")
m13_l1 = metal1.with_area(nil, 0.1444.um)
m13_l1.output("M1.3", "M1.3 : Minimum Metal1 area : 0.1444µm²")
-m13_l1.forget
+m13_l1.forget
end #BEOL
diff --git a/rules/klayout/drc/rule_decks/metal2.drc b/rules/klayout/drc/rule_decks/metal2.drc
index 32d6cd6..d600d95 100644
--- a/rules/klayout/drc/rule_decks/metal2.drc
+++ b/rules/klayout/drc/rule_decks/metal2.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -112,7 +112,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -121,12 +121,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -193,7 +193,7 @@
#================================================
#---------------------METAL2---------------------
-#================================================
+#================================================
if BEOL
@@ -203,25 +203,25 @@
logger.info("Executing rule M2.1")
m21_l1 = metal2.width(0.28.um, euclidian).polygons(0.001)
m21_l1.output("M2.1", "M2.1 : min. metal2 width : 0.28µm")
-m21_l1.forget
+m21_l1.forget
# Rule M2.2a: min. metal2 spacing is 0.28µm
logger.info("Executing rule M2.2a")
m22a_l1 = metal2.space(0.28.um, euclidian).polygons(0.001)
m22a_l1.output("M2.2a", "M2.2a : min. metal2 spacing : 0.28µm")
-m22a_l1.forget
+m22a_l1.forget
# Rule M2.2b: Space to wide Metal2 (length & width > 10um) is 0.3µm
logger.info("Executing rule M2.2b")
m22b_l1 = metal2.separation(metal2.not_interacting(metal2.edges.with_length(nil, 10.um)), 0.3.um, euclidian).polygons(0.001)
m22b_l1.output("M2.2b", "M2.2b : Space to wide Metal2 (length & width > 10um) : 0.3µm")
-m22b_l1.forget
+m22b_l1.forget
# Rule M2.3: Minimum metal2 area is 0.1444µm²
logger.info("Executing rule M2.3")
m23_l1 = metal2.with_area(nil, 0.1444.um)
m23_l1.output("M2.3", "M2.3 : Minimum metal2 area : 0.1444µm²")
-m23_l1.forget
+m23_l1.forget
end #BEOL
diff --git a/rules/klayout/drc/rule_decks/metal3.drc b/rules/klayout/drc/rule_decks/metal3.drc
index b5a4219..edee0f0 100644
--- a/rules/klayout/drc/rule_decks/metal3.drc
+++ b/rules/klayout/drc/rule_decks/metal3.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -112,7 +112,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -121,12 +121,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -193,7 +193,7 @@
#================================================
#---------------------METAL3---------------------
-#================================================
+#================================================
if BEOL
@@ -203,25 +203,25 @@
logger.info("Executing rule M3.1")
m31_l1 = metal3.width(0.28.um, euclidian).polygons(0.001)
m31_l1.output("M3.1", "M3.1 : min. metal3 width : 0.28µm")
-m31_l1.forget
+m31_l1.forget
# Rule M3.2a: min. metal3 spacing is 0.28µm
logger.info("Executing rule M3.2a")
m32a_l1 = metal3.space(0.28.um, euclidian).polygons(0.001)
m32a_l1.output("M3.2a", "M3.2a : min. metal3 spacing : 0.28µm")
-m32a_l1.forget
+m32a_l1.forget
# Rule M3.2b: Space to wide Metal3 (length & width > 10um) is 0.3µm
logger.info("Executing rule M3.2b")
m32b_l1 = metal3.separation(metal3.not_interacting(metal3.edges.with_length(nil, 10.um)), 0.3.um, euclidian).polygons(0.001)
m32b_l1.output("M3.2b", "M3.2b : Space to wide Metal3 (length & width > 10um) : 0.3µm")
-m32b_l1.forget
+m32b_l1.forget
# Rule M3.3: Minimum metal3 area is 0.1444µm²
logger.info("Executing rule M3.3")
m33_l1 = metal3.with_area(nil, 0.1444.um)
m33_l1.output("M3.3", "M3.3 : Minimum metal3 area : 0.1444µm²")
-m33_l1.forget
+m33_l1.forget
end #BEOL
diff --git a/rules/klayout/drc/rule_decks/metal4.drc b/rules/klayout/drc/rule_decks/metal4.drc
index 4db92c4..a638157 100644
--- a/rules/klayout/drc/rule_decks/metal4.drc
+++ b/rules/klayout/drc/rule_decks/metal4.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -112,7 +112,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -121,12 +121,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -193,7 +193,7 @@
#================================================
#---------------------METAL4---------------------
-#================================================
+#================================================
if BEOL
@@ -203,25 +203,25 @@
logger.info("Executing rule M4.1")
m41_l1 = metal4.width(0.28.um, euclidian).polygons(0.001)
m41_l1.output("M4.1", "M4.1 : min. metal4 width : 0.28µm")
-m41_l1.forget
+m41_l1.forget
# Rule M4.2a: min. metal4 spacing is 0.28µm
logger.info("Executing rule M4.2a")
m42a_l1 = metal4.space(0.28.um, euclidian).polygons(0.001)
m42a_l1.output("M4.2a", "M4.2a : min. metal4 spacing : 0.28µm")
-m42a_l1.forget
+m42a_l1.forget
# Rule M4.2b: Space to wide Metal4 (length & width > 10um) is 0.3µm
logger.info("Executing rule M4.2b")
m42b_l1 = metal4.separation(metal4.not_interacting(metal4.edges.with_length(nil, 10.um)), 0.3.um, euclidian).polygons(0.001)
m42b_l1.output("M4.2b", "M4.2b : Space to wide Metal4 (length & width > 10um) : 0.3µm")
-m42b_l1.forget
+m42b_l1.forget
# Rule M4.3: Minimum metal4 area is 0.1444µm²
logger.info("Executing rule M4.3")
m43_l1 = metal4.with_area(nil, 0.1444.um)
m43_l1.output("M4.3", "M4.3 : Minimum metal4 area : 0.1444µm²")
-m43_l1.forget
+m43_l1.forget
end #BEOL
diff --git a/rules/klayout/drc/rule_decks/metal5.drc b/rules/klayout/drc/rule_decks/metal5.drc
index 4960e06..2b99920 100644
--- a/rules/klayout/drc/rule_decks/metal5.drc
+++ b/rules/klayout/drc/rule_decks/metal5.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -112,7 +112,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -121,12 +121,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -193,7 +193,7 @@
#================================================
#---------------------METAL5---------------------
-#================================================
+#================================================
if BEOL
@@ -203,25 +203,25 @@
logger.info("Executing rule M5.1")
m51_l1 = metal5.width(0.28.um, euclidian).polygons(0.001)
m51_l1.output("M5.1", "M5.1 : min. metal5 width : 0.28µm")
-m51_l1.forget
+m51_l1.forget
# Rule M5.2a: min. metal5 spacing is 0.28µm
logger.info("Executing rule M5.2a")
m52a_l1 = metal5.space(0.28.um, euclidian).polygons(0.001)
m52a_l1.output("M5.2a", "M5.2a : min. metal5 spacing : 0.28µm")
-m52a_l1.forget
+m52a_l1.forget
# Rule M5.2b: Space to wide Metal5 (length & width > 10um) is 0.3µm
logger.info("Executing rule M5.2b")
m52b_l1 = metal5.separation(metal5.not_interacting(metal5.edges.with_length(nil, 10.um)), 0.3.um, euclidian).polygons(0.001)
m52b_l1.output("M5.2b", "M5.2b : Space to wide Metal5 (length & width > 10um) : 0.3µm")
-m52b_l1.forget
+m52b_l1.forget
# Rule M5.3: Minimum metal5 area is 0.1444µm²
logger.info("Executing rule M5.3")
m53_l1 = metal5.with_area(nil, 0.1444.um)
m53_l1.output("M5.3", "M5.3 : Minimum metal5 area : 0.1444µm²")
-m53_l1.forget
+m53_l1.forget
end #BEOL
diff --git a/rules/klayout/drc/rule_decks/metaltop.drc b/rules/klayout/drc/rule_decks/metaltop.drc
index b46285b..49a33db 100644
--- a/rules/klayout/drc/rule_decks/metaltop.drc
+++ b/rules/klayout/drc/rule_decks/metaltop.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -114,7 +114,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -123,12 +123,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -204,7 +204,7 @@
via5 = polygons(82 , 0 )
metaltop = polygons(53 , 0 )
top_via = via5
- topmin1_via = via4
+ topmin1_via = via4
top_metal = metaltop
topmin1_metal = metal5
elsif METAL_LEVEL == "5LM"
@@ -213,7 +213,7 @@
via4 = polygons(41 , 0 )
metal5 = polygons(81 , 0 )
top_via = via4
- topmin1_via = via3
+ topmin1_via = via3
top_metal = metal5
topmin1_metal = metal4
elsif METAL_LEVEL == "4LM"
@@ -222,7 +222,7 @@
via3 = polygons(40 , 0 )
metal4 = polygons(46 , 0 )
top_via = via3
- topmin1_via = via2
+ topmin1_via = via2
top_metal = metal4
topmin1_metal = metal3
elsif METAL_LEVEL == "3LM"
@@ -247,84 +247,84 @@
#================================================
#--------------------METALTOP--------------------
-#================================================
+#================================================
if BEOL
logger.info("BEOL section")
if METAL_TOP == "6K"
-logger.info("MetalTop thickness 6k section")
+logger.info("MetalTop thickness 6k section")
# Rule MT.1: min. metaltop width is 0.36µm
logger.info("Executing rule MT.1")
mt1_l1 = metaltop.width(0.36.um, euclidian).polygons(0.001)
mt1_l1.output("MT.1", "MT.1 : min. metaltop width : 0.36µm")
-mt1_l1.forget
+mt1_l1.forget
# Rule MT.2a: min. metaltop spacing is 0.38µm
logger.info("Executing rule MT.2a")
mt2a_l1 = metaltop.space(0.38.um, euclidian).polygons(0.001)
mt2a_l1.output("MT.2a", "MT.2a : min. metaltop spacing : 0.38µm")
-mt2a_l1.forget
+mt2a_l1.forget
# Rule MT.4: Minimum MetalTop area is 0.5625µm²
logger.info("Executing rule MT.4")
mt4_l1 = metaltop.with_area(nil, 0.5625.um)
mt4_l1.output("MT.4", "MT.4 : Minimum MetalTop area : 0.5625µm²")
-mt4_l1.forget
+mt4_l1.forget
elsif METAL_TOP == "9K"
-logger.info("MetalTop thickness 9k/11k section")
+logger.info("MetalTop thickness 9k/11k section")
# Rule MT.1: min. metaltop width is 0.44µm
logger.info("Executing rule MT.1")
mt1_l1 = metaltop.width(0.44.um, euclidian).polygons(0.001)
mt1_l1.output("MT.1", "MT.1 : min. metaltop width : 0.44µm")
-mt1_l1.forget
+mt1_l1.forget
# Rule MT.2a: min. metaltop spacing is 0.46µm
logger.info("Executing rule MT.2a")
mt2a_l1 = metaltop.space(0.46.um, euclidian).polygons(0.001)
mt2a_l1.output("MT.2a", "MT.2a : min. metaltop spacing : 0.46µm")
-mt2a_l1.forget
+mt2a_l1.forget
# Rule MT.4: Minimum MetalTop area is 0.5625µm²
logger.info("Executing rule MT.4")
mt4_l1 = metaltop.with_area(nil, 0.5625.um)
mt4_l1.output("MT.4", "MT.4 : Minimum MetalTop area : 0.5625µm²")
-mt4_l1.forget
+mt4_l1.forget
elsif METAL_TOP == "30K"
-logger.info("MetalTop thickness 30K section")
+logger.info("MetalTop thickness 30K section")
# Rule MT30.1a: Min. thick MetalTop width. is 1.8µm
logger.info("Executing rule MT30.1a")
mt301a_l1 = metaltop.width(1.8.um, euclidian).polygons(0.001)
mt301a_l1.output("MT30.1a", "MT30.1a : Min. thick MetalTop width. : 1.8µm")
-mt301a_l1.forget
+mt301a_l1.forget
# Rule MT30.1b: Min width for >1000um long metal line (based on metal edge). is 2.2µm
logger.info("Executing rule MT30.1b")
mt301b_l1 = metaltop.interacting(metaltop.edges.with_length(1000.um, nil)).width(2.2.um, euclidian).polygons(0.001)
mt301b_l1.output("MT30.1b", "MT30.1b : Min width for >1000um long metal line (based on metal edge). : 2.2µm")
-mt301b_l1.forget
+mt301b_l1.forget
# Rule MT30.2: Min. thick MetalTop space. is 1.8µm
logger.info("Executing rule MT30.2")
mt302_l1 = metaltop.space(1.8.um, euclidian).polygons(0.001)
mt302_l1.output("MT30.2", "MT30.2 : Min. thick MetalTop space. : 1.8µm")
-mt302_l1.forget
+mt302_l1.forget
# Rule MT30.3: The separation of two corners should satisfy the minimum spacing. is 1.8µm
logger.info("Executing rule MT30.3")
mt303_l1 = metaltop.space(1.8.um, euclidian).polygons(0.001)
mt303_l1.output("MT30.3", "MT30.3 : The separation of two corners should satisfy the minimum spacing. : 1.8µm")
-mt303_l1.forget
+mt303_l1.forget
# Rule MT30.4: The separation of single metal line from a any degree metal line should satisfy the minimum spacing. is 1.8µm
logger.info("Executing rule MT30.4")
mt304_l1 = metaltop.space(1.8.um, euclidian).polygons(0.001)
mt304_l1.output("MT30.4", "MT30.4 : The separation of single metal line from a any degree metal line should satisfy the minimum spacing. : 1.8µm")
-mt304_l1.forget
+mt304_l1.forget
# Rule MT30.5: Minimum thick MetalTop enclose underlying via (for example: via5 for 6LM case) [Outside Not Allowed].
logger.info("Executing rule MT30.5")
@@ -356,9 +356,9 @@
mt30p8_via.forget
mt30p8_mask.forget
mt30p8_slct_via.forget
-end #METAL_TOP
+end #METAL_TOP
-end #BEOL
+end #BEOL
exec_end_time = Time.now
diff --git a/rules/klayout/drc/rule_decks/mim_capacitor_option_a_.drc b/rules/klayout/drc/rule_decks/mim_capacitor_option_a_.drc
index 61182c2..a81f022 100644
--- a/rules/klayout/drc/rule_decks/mim_capacitor_option_a_.drc
+++ b/rules/klayout/drc/rule_decks/mim_capacitor_option_a_.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -116,7 +116,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -125,12 +125,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -197,10 +197,10 @@
#================================================
#------------MIM CAPACITOR OPTION A -------------
-#================================================
+#================================================
if MIM_OPTION == "A"
-logger.info("MIM Capacitor Option A section")
+logger.info("MIM Capacitor Option A section")
mim_virtual = fusetop.sized(1.06.um).and(metal2.interacting(fusetop))
# Rule MIM.1: Minimum MiM bottom plate spacing to the bottom plate metal (whether adjacent MiM or routing metal). is 1.2µm
@@ -240,13 +240,13 @@
logger.info("Executing rule MIM.5")
mim5_l1 = fusetop.separation(via2.interacting(metal2), 0.4.um, euclidian).polygons(0.001)
mim5_l1.output("MIM.5", "MIM.5 : Minimum spacing between top plate and the Via2 connecting to the bottom plate. : 0.4µm")
-mim5_l1.forget
+mim5_l1.forget
# Rule MIM.6: Minimum spacing between unrelated top plates. is 0.6µm
logger.info("Executing rule MIM.6")
mim6_l1 = fusetop.space(0.6.um, euclidian).polygons(0.001)
mim6_l1.output("MIM.6", "MIM.6 : Minimum spacing between unrelated top plates. : 0.6µm")
-mim6_l1.forget
+mim6_l1.forget
# Rule MIM.7: Min FuseTop enclosure by CAP_MK.
logger.info("Executing rule MIM.7")
@@ -258,7 +258,7 @@
logger.info("Executing rule MIM.8a")
mim8a_l1 = fusetop.with_area(nil, 25.um)
mim8a_l1.output("MIM.8a", "MIM.8a : Minimum MIM cap area (defined by FuseTop area) (um2). : 25µm²")
-mim8a_l1.forget
+mim8a_l1.forget
# Rule MIM.8b: Maximum single MIM Cap area (Use multiple MIM caps in parallel connection if bigger capacitors are required) (um2). is 10000µm
logger.info("Executing rule MIM.8b")
mim8b_l1 = fusetop.with_area(10000.um,nil).not_in(fusetop.with_area(10000.um))
@@ -269,7 +269,7 @@
logger.info("Executing rule MIM.9")
mim9_l1 = via2.inside(fusetop).space(0.5.um, euclidian).polygons(0.001)
mim9_l1.output("MIM.9", "MIM.9 : Min. via spacing for sea of via on MIM top plate. : 0.5µm")
-mim9_l1.forget
+mim9_l1.forget
# Rule MIM.10: (a) There cannot be any Via1 touching MIM bottom plate Metal2. (b) MIM bottom plate Metal2 can only be connected through the higher Via (Via2).
logger.info("Executing rule MIM.10")
@@ -294,7 +294,7 @@
logger.info("Executing rule MIM.11")
mim11_l1 = mim11_large_metal2_violation
mim11_l1.output("MIM.11", "MIM.11 : Bottom plate of multiple MIM caps can be shared (for common nodes) as long as total MIM area with that single common plate does not exceed MIM.8b rule. : -µm")
-mim11_l1.forget
+mim11_l1.forget
mim11_large_metal2.forget
mim11_large_metal2_violation.forget
diff --git a/rules/klayout/drc/rule_decks/mim_capacitor_option_b.drc b/rules/klayout/drc/rule_decks/mim_capacitor_option_b.drc
index eaea93d..7f3be6f 100644
--- a/rules/klayout/drc/rule_decks/mim_capacitor_option_b.drc
+++ b/rules/klayout/drc/rule_decks/mim_capacitor_option_b.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -113,7 +113,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -122,12 +122,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -203,7 +203,7 @@
via5 = polygons(82 , 0 )
metaltop = polygons(53 , 0 )
top_via = via5
- topmin1_via = via4
+ topmin1_via = via4
top_metal = metaltop
topmin1_metal = metal5
elsif METAL_LEVEL == "5LM"
@@ -212,7 +212,7 @@
via4 = polygons(41 , 0 )
metal5 = polygons(81 , 0 )
top_via = via4
- topmin1_via = via3
+ topmin1_via = via3
top_metal = metal5
topmin1_metal = metal4
elsif METAL_LEVEL == "4LM"
@@ -221,7 +221,7 @@
via3 = polygons(40 , 0 )
metal4 = polygons(46 , 0 )
top_via = via3
- topmin1_via = via2
+ topmin1_via = via2
top_metal = metal4
topmin1_metal = metal3
elsif METAL_LEVEL == "3LM"
@@ -246,10 +246,10 @@
#================================================
#-------------MIM CAPACITOR OPTION B-------------
-#================================================
+#================================================
if MIM_OPTION == "B"
-logger.info("mim11_metal2_polygon_layer.interacting(fuse_in_polygon) section")
+logger.info("mim11_metal2_polygon_layer.interacting(fuse_in_polygon) section")
mimtm_virtual = fusetop.sized(1.06.um).and(topmin1_metal.interacting(fusetop))
# Rule MIMTM.1: Minimum MiM bottom plate spacing to the bottom plate metal (whether adjacent MiM or routing metal). is 1.2µm
@@ -289,13 +289,13 @@
logger.info("Executing rule MIMTM.5")
mimtm5_l1 = fusetop.separation(top_via.interacting(topmin1_metal), 0.4.um, euclidian).polygons(0.001)
mimtm5_l1.output("MIMTM.5", "MIMTM.5 : Minimum spacing between top plate and the Vian-1 connecting to the bottom plate. : 0.4µm")
-mimtm5_l1.forget
+mimtm5_l1.forget
# Rule MIMTM.6: Minimum spacing between unrelated top plates. is 0.6µm
logger.info("Executing rule MIMTM.6")
mimtm6_l1 = fusetop.space(0.6.um, euclidian).polygons(0.001)
mimtm6_l1.output("MIMTM.6", "MIMTM.6 : Minimum spacing between unrelated top plates. : 0.6µm")
-mimtm6_l1.forget
+mimtm6_l1.forget
# Rule MIMTM.7: Min FuseTop enclosure by CAP_MK.
logger.info("Executing rule MIMTM.7")
@@ -307,7 +307,7 @@
logger.info("Executing rule MIMTM.8a")
mimtm8a_l1 = fusetop.with_area(nil, 25.um)
mimtm8a_l1.output("MIMTM.8a", "MIMTM.8a : Minimum MIM cap area (defined by FuseTop area) (um2). : 25µm²")
-mimtm8a_l1.forget
+mimtm8a_l1.forget
# Rule MIMTM.8b: Maximum single MIM Cap area (Use multiple MIM caps in parallel connection if bigger capacitors are required) (um2). is 10000µm
logger.info("Executing rule MIMTM.8b")
mimtm8b_l1 = fusetop.with_area(10000.um,nil).not_in(fusetop.with_area(10000.um))
@@ -318,7 +318,7 @@
logger.info("Executing rule MIMTM.9")
mimtm9_l1 = top_via.inside(fusetop).space(0.5.um, euclidian).polygons(0.001)
mimtm9_l1.output("MIMTM.9", "MIMTM.9 : Min. Via (Vian-1) spacing for sea of Via on MIM top plate. : 0.5µm")
-mimtm9_l1.forget
+mimtm9_l1.forget
# Rule MIMTM.10: (a) There cannot be any Vian-2 touching MIM bottom plate Metaln-1. (b) MIM bottom plate Metaln-1 can only be connected through the higher Via (Vian-1).
logger.info("Executing rule MIMTM.10")
@@ -343,16 +343,16 @@
logger.info("Executing rule MIMTM.11")
mimtm11_l1 = mimtm11_large_topmin1_metal_violation
mimtm11_l1.output("MIMTM.11", "MIMTM.11 : Bottom plate of multiple MIM caps can be shared (for common nodes) as long as total MIM area with that single common plate does not exceed MIMTM.8b rule. : -µm")
-mimtm11_l1.forget
+mimtm11_l1.forget
mimtm11_large_topmin1_metal.forget
mimtm11_large_topmin1_metal_violation.forget
# rule MIMTM.12 is not a DRC check
else
-logger.info("MIM Capacitor Option B not Selected")
+logger.info("MIM Capacitor Option B not Selected")
-end #MIM_OPTION
+end #MIM_OPTION
exec_end_time = Time.now
diff --git a/rules/klayout/drc/rule_decks/n+_poly_resistor.drc b/rules/klayout/drc/rule_decks/n+_poly_resistor.drc
index 7ca5411..e7d6c74 100644
--- a/rules/klayout/drc/rule_decks/n+_poly_resistor.drc
+++ b/rules/klayout/drc/rule_decks/n+_poly_resistor.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -115,7 +115,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -124,12 +124,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -196,20 +196,20 @@
#================================================
#----------------N+ POLY RESISTOR----------------
-#================================================
+#================================================
lres_poly = poly2.and(nplus).interacting(sab).interacting(res_mk)
# Rule LRES.1: Minimum width of Poly2 resistor. is 0.8µm
logger.info("Executing rule LRES.1")
lres1_l1 = lres_poly.width(0.8.um, euclidian).polygons(0.001)
lres1_l1.output("LRES.1", "LRES.1 : Minimum width of Poly2 resistor. : 0.8µm")
-lres1_l1.forget
+lres1_l1.forget
# Rule LRES.2: Minimum space between Poly2 resistors. is 0.4µm
logger.info("Executing rule LRES.2")
lres2_l1 = lres_poly.isolated(0.4.um, euclidian).polygons(0.001)
lres2_l1.output("LRES.2", "LRES.2 : Minimum space between Poly2 resistors. : 0.4µm")
-lres2_l1.forget
+lres2_l1.forget
# Rule LRES.3: Minimum space from Poly2 resistor to COMP.
logger.info("Executing rule LRES.3")
@@ -221,7 +221,7 @@
logger.info("Executing rule LRES.4")
lres4_l1 = lres_poly.separation(poly2.not_interacting(sab), 0.6.um, euclidian).polygons(0.001)
lres4_l1.output("LRES.4", "LRES.4 : Minimum space from Poly2 resistor to unrelated Poly2. : 0.6µm")
-lres4_l1.forget
+lres4_l1.forget
# Rule LRES.5: Minimum Nplus implant overlap of Poly2 resistor. is 0.3µm
logger.info("Executing rule LRES.5")
@@ -250,7 +250,7 @@
# rule LRES.8 is not a DRC check
mk_lres9 = res_mk.edges.not(poly2.and(nplus).and(sab).edges).inside_part(poly2)
-# Rule LRES.9a: Nplus Poly2 resistor shall be covered by RES_MK marking. RES_MK length shall be coincide with resistor length (Defined by SAB length) and width covering the width of Poly2.
+# Rule LRES.9a: Nplus Poly2 resistor shall be covered by RES_MK marking. RES_MK length shall be coincide with resistor length (Defined by SAB length) and width covering the width of Poly2.
logger.info("Executing rule LRES.9a")
lres9a_l1 = res_mk.interacting(lres_poly).interacting(mk_lres9)
lres9a_l1.output("LRES.9a", "LRES.9a : Nplus Poly2 resistor shall be covered by RES_MK marking. RES_MK length shall be coincide with resistor length (Defined by SAB length) and width covering the width of Poly2. ")
diff --git a/rules/klayout/drc/rule_decks/native_vt_nmos.drc b/rules/klayout/drc/rule_decks/native_vt_nmos.drc
index 42af250..3861943 100644
--- a/rules/klayout/drc/rule_decks/native_vt_nmos.drc
+++ b/rules/klayout/drc/rule_decks/native_vt_nmos.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -113,7 +113,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -122,12 +122,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -202,7 +202,7 @@
#================================================
#-----------------NATIVE VT NMOS-----------------
-#================================================
+#================================================
# Rule NAT.1: Min. NAT Overlap of COMP of Native Vt NMOS. is 2µm
logger.info("Executing rule NAT.1")
@@ -214,30 +214,30 @@
logger.info("Executing rule NAT.2")
nat2_l1 = nat.separation(comp.outside(nat), 0.3.um, euclidian).polygons(0.001)
nat2_l1.output("NAT.2", "NAT.2 : Space to unrelated COMP (outside NAT). : 0.3µm")
-nat2_l1.forget
+nat2_l1.forget
# Rule NAT.3: Space to NWell edge. is 0.5µm
logger.info("Executing rule NAT.3")
nat3_l1 = nat.separation(nwell, 0.5.um, euclidian).polygons(0.001)
nat3_l1.output("NAT.3", "NAT.3 : Space to NWell edge. : 0.5µm")
-nat3_l1.forget
+nat3_l1.forget
# Rule NAT.4: Minimum channel length for 3.3V Native Vt NMOS (For smaller L Ioff will be higher than Spec). is 1.8µm
logger.info("Executing rule NAT.4")
nat4_l1 = poly2.edges.and(ngate.edges).not(nwell).interacting(nat).width(1.8.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
nat4_l1.output("NAT.4", "NAT.4 : Minimum channel length for 3.3V Native Vt NMOS (For smaller L Ioff will be higher than Spec). : 1.8µm")
-nat4_l1.forget
+nat4_l1.forget
# Rule NAT.5: Minimum channel length for 6.0V Native Vt NMOS (For smaller L Ioff will be higher than Spec). is 1.8µm
logger.info("Executing rule NAT.5")
nat5_l1 = poly2.edges.and(ngate.edges).not(nwell).interacting(nat).width(1.8.um, euclidian).polygons(0.001).overlapping(dualgate)
nat5_l1.output("NAT.5", "NAT.5 : Minimum channel length for 6.0V Native Vt NMOS (For smaller L Ioff will be higher than Spec). : 1.8µm")
-nat5_l1.forget
+nat5_l1.forget
if CONNECTIVITY_RULES
-logger.info("CONNECTIVITY_RULES section")
+logger.info("CONNECTIVITY_RULES section")
-connected_nat, unconnected_nat = conn_space(natcompsd, 10, 10, transparent)
+connected_nat, unconnected_nat = conn_space(natcompsd, 10, 10, transparent)
# Rule NAT.6: Two or more COMPs if connected to different potential are not allowed under same NAT layer.
logger.info("Executing rule NAT.6")
@@ -245,14 +245,14 @@
nat6_l1.output("NAT.6", "NAT.6 : Two or more COMPs if connected to different potential are not allowed under same NAT layer.")
nat6_l1.forget
-end #CONNECTIVITY_RULES
+end #CONNECTIVITY_RULES
natcompsd.forget
# Rule NAT.7: Minimum NAT to NAT spacing. is 0.74µm
logger.info("Executing rule NAT.7")
nat7_l1 = nat.space(0.74.um, euclidian).polygons(0.001)
nat7_l1.output("NAT.7", "NAT.7 : Minimum NAT to NAT spacing. : 0.74µm")
-nat7_l1.forget
+nat7_l1.forget
# Rule NAT.8: Min. Dualgate overlap of NAT (for 5V/6V) native VT NMOS only.
logger.info("Executing rule NAT.8")
diff --git a/rules/klayout/drc/rule_decks/nplus.drc b/rules/klayout/drc/rule_decks/nplus.drc
index 8818293..e3126a8 100644
--- a/rules/klayout/drc/rule_decks/nplus.drc
+++ b/rules/klayout/drc/rule_decks/nplus.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -115,7 +115,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -124,12 +124,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -196,7 +196,7 @@
#================================================
#---------------------NPLUS----------------------
-#================================================
+#================================================
if FEOL
@@ -206,19 +206,19 @@
logger.info("Executing rule NP.1")
np1_l1 = nplus.width(0.4.um, euclidian).polygons(0.001)
np1_l1.output("NP.1", "NP.1 : min. nplus width : 0.4µm")
-np1_l1.forget
+np1_l1.forget
# Rule NP.2: min. nplus spacing is 0.4µm
logger.info("Executing rule NP.2")
np2_l1 = nplus.space(0.4.um, euclidian).polygons(0.001)
np2_l1.output("NP.2", "NP.2 : min. nplus spacing : 0.4µm")
-np2_l1.forget
+np2_l1.forget
# Rule NP.3a: Space to PCOMP for PCOMP: (1) Inside Nwell (2) Outside LVPWELL but inside DNWELL. is 0.16µm
logger.info("Executing rule NP.3a")
np3a_l1 = nplus.separation((pcomp.inside(nwell)).or(pcomp.outside(lvpwell).inside(dnwell)), 0.16.um, euclidian).polygons(0.001)
np3a_l1.output("NP.3a", "NP.3a : Space to PCOMP for PCOMP: (1) Inside Nwell (2) Outside LVPWELL but inside DNWELL. : 0.16µm")
-np3a_l1.forget
+np3a_l1.forget
np_3bi_extend = lvpwell.inside(dnwell).sized(-0.429.um)
np_3bi = pcomp.edges.and(lvpwell.inside(dnwell).not(np_3bi_extend))
@@ -226,7 +226,7 @@
logger.info("Executing rule NP.3bi")
np3bi_l1 = nplus.not_outside(lvpwell).inside(dnwell).edges.separation(np_3bi, 0.16.um, euclidian).polygons(0.001)
np3bi_l1.output("NP.3bi", "NP.3bi : Space to PCOMP: For Inside DNWELL, inside LVPWELL:(i) For PCOMP overlap by LVPWELL < 0.43um. : 0.16µm")
-np3bi_l1.forget
+np3bi_l1.forget
np_3bi_extend.forget
np_3bi.forget
@@ -236,7 +236,7 @@
logger.info("Executing rule NP.3bii")
np3bii_l1 = nplus.not_outside(lvpwell).inside(dnwell).edges.separation(np_3bii, 0.08.um, euclidian).polygons(0.001)
np3bii_l1.output("NP.3bii", "NP.3bii : Space to PCOMP: For Inside DNWELL, inside LVPWELL:(ii) For PCOMP overlap by LVPWELL >= 0.43um. : 0.08µm")
-np3bii_l1.forget
+np3bii_l1.forget
np_3bii_extend.forget
np_3bii.forget
@@ -352,18 +352,18 @@
logger.info("Executing rule NP.7")
np7_l1 = nplus.separation(poly2.and(sab), 0.18.um, euclidian).polygons(0.001)
np7_l1.output("NP.7", "NP.7 : Space to unrelated unsalicided Poly2. : 0.18µm")
-np7_l1.forget
+np7_l1.forget
# Rule NP.8a: Minimum Nplus area (um2). is 0.35µm²
logger.info("Executing rule NP.8a")
np8a_l1 = nplus.with_area(nil, 0.35.um)
np8a_l1.output("NP.8a", "NP.8a : Minimum Nplus area (um2). : 0.35µm²")
-np8a_l1.forget
+np8a_l1.forget
# Rule NP.8b: Minimum area enclosed by Nplus (um2). is 0.35µm²
logger.info("Executing rule NP.8b")
np8b_l1 = nplus.holes.with_area(nil, 0.35.um)
np8b_l1.output("NP.8b", "NP.8b : Minimum area enclosed by Nplus (um2). : 0.35µm²")
-np8b_l1.forget
+np8b_l1.forget
# Rule NP.9: Overlap of unsalicided Poly2. is 0.18µm
logger.info("Executing rule NP.9")
np9_l1 = nplus.enclosing(poly2.and(sab), 0.18.um, euclidian).polygons(0.001)
diff --git a/rules/klayout/drc/rule_decks/nwell.drc b/rules/klayout/drc/rule_decks/nwell.drc
index 22f917d..5c33f12 100644
--- a/rules/klayout/drc/rule_decks/nwell.drc
+++ b/rules/klayout/drc/rule_decks/nwell.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -117,7 +117,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -126,12 +126,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -223,7 +223,7 @@
connect(metal5, via5)
connect(via5, metaltop)
-end #CONNECTIVITY_RULES
+end #CONNECTIVITY_RULES
#================================================
#------------ PRE-DEFINED FUNCTIONS -------------
@@ -249,7 +249,7 @@
end
end
unconnected_output = unconnected_errors.polygons.or(singularity_errors.polygons(0.001))
- return connected_output, unconnected_output
+ return connected_output, unconnected_output
end
def conn_separation(layer1, layer2, conn_val,not_conn_val, mode)
@@ -278,10 +278,10 @@
if CONNECTIVITY_RULES
logger.info("Connectivity rules enabled, Netlist object will be generated.")
netlist
-end #CONNECTIVITY_RULES
+end #CONNECTIVITY_RULES
# === LAYOUT EXTENT ===
-CHIP = extent.sized(0.0)
+CHIP = extent.sized(0.0)
logger.info("Total area of the design is #{CHIP.area()} um^2.")
@@ -289,7 +289,7 @@
#================================================
#---------------------NWELL----------------------
-#================================================
+#================================================
if FEOL
@@ -299,86 +299,86 @@
logger.info("Executing rule NW.1a_3.3V")
nw1a_l1 = nwell.width(0.86.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
nw1a_l1.output("NW.1a_3.3V", "NW.1a_3.3V : Min. Nwell Width (This is only for litho purpose on the generated area). : 0.86µm")
-nw1a_l1.forget
+nw1a_l1.forget
# Rule NW.1a_5V: Min. Nwell Width (This is only for litho purpose on the generated area). is 0.86µm
logger.info("Executing rule NW.1a_5V")
nw1a_l1 = nwell.width(0.86.um, euclidian).polygons(0.001).overlapping(dualgate)
nw1a_l1.output("NW.1a_5V", "NW.1a_5V : Min. Nwell Width (This is only for litho purpose on the generated area). : 0.86µm")
-nw1a_l1.forget
+nw1a_l1.forget
nw_1b = nwell.outside(dnwell).and(res_mk).not(comp).not(poly2)
# Rule NW.1b_3.3V: Min. Nwell Width as a resistor (Outside DNWELL only). is 2µm
logger.info("Executing rule NW.1b_3.3V")
nw1b_l1 = nw_1b.width(2.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
nw1b_l1.output("NW.1b_3.3V", "NW.1b_3.3V : Min. Nwell Width as a resistor (Outside DNWELL only). : 2µm")
-nw1b_l1.forget
+nw1b_l1.forget
# Rule NW.1b_5V: Min. Nwell Width as a resistor (Outside DNWELL only). is 2µm
logger.info("Executing rule NW.1b_5V")
nw1b_l1 = nw_1b.width(2.um, euclidian).polygons(0.001).overlapping(dualgate)
nw1b_l1.output("NW.1b_5V", "NW.1b_5V : Min. Nwell Width as a resistor (Outside DNWELL only). : 2µm")
-nw1b_l1.forget
+nw1b_l1.forget
if CONNECTIVITY_RULES
-logger.info("CONNECTIVITY_RULES section")
+logger.info("CONNECTIVITY_RULES section")
-connected_nwell_3p3v, unconnected_nwell_3p3v = conn_space(nwell, 0.6, 1.4, euclidian)
+connected_nwell_3p3v, unconnected_nwell_3p3v = conn_space(nwell, 0.6, 1.4, euclidian)
-connected_nwell_5p0v, unconnected_nwell_5p0v = conn_space(nwell, 0.74, 1.7, euclidian)
+connected_nwell_5p0v, unconnected_nwell_5p0v = conn_space(nwell, 0.74, 1.7, euclidian)
# Rule NW.2a_3.3V: Min. Nwell Space (Outside DNWELL) [Equi-potential], Merge if the space is less than. is 0.6µm
logger.info("Executing rule NW.2a_3.3V")
nw2a_l1 = connected_nwell_3p3v.not_inside(ymtp_mk).not_interacting(v5_xtor).not_interacting(dualgate)
nw2a_l1.output("NW.2a_3.3V", "NW.2a_3.3V : Min. Nwell Space (Outside DNWELL) [Equi-potential], Merge if the space is less than. : 0.6µm")
-nw2a_l1.forget
+nw2a_l1.forget
# Rule NW.2a_5V: Min. Nwell Space (Outside DNWELL) [Equi-potential], Merge if the space is less than. is 0.74µm
logger.info("Executing rule NW.2a_5V")
nw2a_l1 = connected_nwell_5p0v.not_inside(ymtp_mk).overlapping(dualgate)
nw2a_l1.output("NW.2a_5V", "NW.2a_5V : Min. Nwell Space (Outside DNWELL) [Equi-potential], Merge if the space is less than. : 0.74µm")
-nw2a_l1.forget
+nw2a_l1.forget
# Rule NW.2b_3.3V: Min. Nwell Space (Outside DNWELL) [Different potential]. is 1.4µm
logger.info("Executing rule NW.2b_3.3V")
nw2b_l1 = unconnected_nwell_3p3v.not_interacting(v5_xtor).not_interacting(dualgate)
nw2b_l1.output("NW.2b_3.3V", "NW.2b_3.3V : Min. Nwell Space (Outside DNWELL) [Different potential]. : 1.4µm")
-nw2b_l1.forget
+nw2b_l1.forget
# Rule NW.2b_5V: Min. Nwell Space (Outside DNWELL) [Different potential]. is 1.7µm
logger.info("Executing rule NW.2b_5V")
nw2b_l1 = unconnected_nwell_5p0v.overlapping(dualgate)
nw2b_l1.output("NW.2b_5V", "NW.2b_5V : Min. Nwell Space (Outside DNWELL) [Different potential]. : 1.7µm")
-nw2b_l1.forget
+nw2b_l1.forget
else
-logger.info("CONNECTIVITY_RULES disabled section")
+logger.info("CONNECTIVITY_RULES disabled section")
# Rule NW.2b_3.3V_: Min. Nwell Space (Outside DNWELL) [Different potential]. is 1.4µm
logger.info("Executing rule NW.2b_3.3V_")
nw2b_l1 = nwell.isolated(1.4.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
nw2b_l1.output("NW.2b_3.3V_", "NW.2b_3.3V_ : Min. Nwell Space (Outside DNWELL) [Different potential]. : 1.4µm")
-nw2b_l1.forget
+nw2b_l1.forget
# Rule NW.2b_5V_: Min. Nwell Space (Outside DNWELL) [Different potential]. is 1.7µm
logger.info("Executing rule NW.2b_5V_")
nw2b_l1 = nwell.isolated(1.7.um, euclidian).polygons(0.001).overlapping(dualgate)
nw2b_l1.output("NW.2b_5V_", "NW.2b_5V_ : Min. Nwell Space (Outside DNWELL) [Different potential]. : 1.7µm")
-nw2b_l1.forget
+nw2b_l1.forget
-end #CONNECTIVITY_RULES
+end #CONNECTIVITY_RULES
# Rule NW.3_3.3V: Min. Nwell to DNWELL space. is 3.1µm
logger.info("Executing rule NW.3_3.3V")
nw3_l1 = nwell.separation(dnwell, 3.1.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
nw3_l1.output("NW.3_3.3V", "NW.3_3.3V : Min. Nwell to DNWELL space. : 3.1µm")
-nw3_l1.forget
+nw3_l1.forget
# Rule NW.3_5V: Min. Nwell to DNWELL space. is 3.1µm
logger.info("Executing rule NW.3_5V")
nw3_l1 = nwell.separation(dnwell, 3.1.um, euclidian).polygons(0.001).overlapping(dualgate)
nw3_l1.output("NW.3_5V", "NW.3_5V : Min. Nwell to DNWELL space. : 3.1µm")
-nw3_l1.forget
+nw3_l1.forget
# Rule NW.4_3.3V: Min. Nwell to LVPWELL space.
logger.info("Executing rule NW.4_3.3V")
diff --git a/rules/klayout/drc/rule_decks/otp_mk.drc b/rules/klayout/drc/rule_decks/otp_mk.drc
index 0e735a6..3ac5504 100644
--- a/rules/klayout/drc/rule_decks/otp_mk.drc
+++ b/rules/klayout/drc/rule_decks/otp_mk.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -114,7 +114,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -123,12 +123,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -195,13 +195,13 @@
#================================================
#---------------------OTP_MK---------------------
-#================================================
+#================================================
# Rule O.DF.3a: Min. COMP Space. P-substrate tap (PCOMP outside NWELL) can be butted for different voltage devices as the potential is same. is 0.24µm
logger.info("Executing rule O.DF.3a")
odf3a_l1 = comp.and(otp_mk).space(0.24.um, euclidian).polygons(0.001)
odf3a_l1.output("O.DF.3a", "O.DF.3a : Min. COMP Space. P-substrate tap (PCOMP outside NWELL) can be butted for different voltage devices as the potential is same. : 0.24µm")
-odf3a_l1.forget
+odf3a_l1.forget
# Rule O.DF.6: Min. COMP extend beyond poly2 (it also means source/drain overhang). is 0.22µm
logger.info("Executing rule O.DF.6")
@@ -213,18 +213,18 @@
logger.info("Executing rule O.DF.9")
odf9_l1 = comp.and(otp_mk).with_area(nil, 0.1444.um)
odf9_l1.output("O.DF.9", "O.DF.9 : Min. COMP area (um2). : 0.1444µm²")
-odf9_l1.forget
+odf9_l1.forget
# Rule O.PL.2: Min. poly2 width. is 0.22µm
logger.info("Executing rule O.PL.2")
opl2_l1 = poly2.edges.and(tgate.edges).and(otp_mk).width(0.22.um, euclidian).polygons(0.001)
opl2_l1.output("O.PL.2", "O.PL.2 : Min. poly2 width. : 0.22µm")
-opl2_l1.forget
+opl2_l1.forget
# Rule O.PL.3a: Min. poly2 Space on COMP. is 0.18µm
logger.info("Executing rule O.PL.3a")
opl3a_l1 = (tgate).or(poly2.not(comp)).and(otp_mk).space(0.18.um, euclidian).polygons(0.001)
opl3a_l1.output("O.PL.3a", "O.PL.3a : Min. poly2 Space on COMP. : 0.18µm")
-opl3a_l1.forget
+opl3a_l1.forget
# Rule O.PL.4: Min. extension beyond COMP to form Poly2 end cap. is 0.14µm
logger.info("Executing rule O.PL.4")
@@ -240,13 +240,13 @@
logger.info("Executing rule O.SB.2")
osb2_l1 = sab.and(otp_mk).space(0.28.um, euclidian).polygons(0.001)
osb2_l1.output("O.SB.2", "O.SB.2 : Min. salicide Block Space. : 0.28µm")
-osb2_l1.forget
+osb2_l1.forget
# Rule O.SB.3: Min. space from salicide block to unrelated COMP. is 0.09µm
logger.info("Executing rule O.SB.3")
osb3_l1 = sab.outside(comp).and(otp_mk).separation(comp.outside(sab), 0.09.um, euclidian).polygons(0.001)
osb3_l1.output("O.SB.3", "O.SB.3 : Min. space from salicide block to unrelated COMP. : 0.09µm")
-osb3_l1.forget
+osb3_l1.forget
# Rule O.SB.4: Min. space from salicide block to contact.
logger.info("Executing rule O.SB.4")
@@ -260,7 +260,7 @@
logger.info("Executing rule O.SB.5b_3.3V")
osb5b_l1 = sab.outside(tgate).and(otp_mk).separation(tgate.outside(sab), 0.1.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
osb5b_l1.output("O.SB.5b_3.3V", "O.SB.5b_3.3V : Min. space from salicide block to unrelated Poly2 on COMP. : 0.1µm")
-osb5b_l1.forget
+osb5b_l1.forget
# rule O.SB.5b_5V is not a DRC check
@@ -282,19 +282,19 @@
logger.info("Executing rule O.SB.13_3.3V")
osb13_l1 = sab.and(otp_mk).with_area(nil, 1.488.um).not_interacting(v5_xtor).not_interacting(dualgate)
osb13_l1.output("O.SB.13_3.3V", "O.SB.13_3.3V : Min. area of silicide block (um2). : 1.488µm²")
-osb13_l1.forget
+osb13_l1.forget
# Rule O.SB.13_5V: Min. area of silicide block (um2). is 2µm²
logger.info("Executing rule O.SB.13_5V")
osb13_l1 = sab.and(otp_mk).and(v5_xtor).with_area(nil, 2.um)
osb13_l1.output("O.SB.13_5V", "O.SB.13_5V : Min. area of silicide block (um2). : 2µm²")
-osb13_l1.forget
+osb13_l1.forget
# rule O.SB.15b is not a DRC check
# Rule O.CO.7: Min. space from COMP contact to Poly2 on COMP. is 0.13µm
logger.info("Executing rule O.CO.7")
oco7_l1 = contact.not_outside(comp).and(otp_mk).separation(tgate.and(otp_mk), 0.13.um, euclidian).polygons(0.001)
oco7_l1.output("O.CO.7", "O.CO.7 : Min. space from COMP contact to Poly2 on COMP. : 0.13µm")
-oco7_l1.forget
+oco7_l1.forget
# Rule O.PL.ORT: Orientation-restricted gates must have the gate width aligned along the X-axis (poly line running horizontally) in reference to wafer notch down. is 0µm
logger.info("Executing rule O.PL.ORT")
diff --git a/rules/klayout/drc/rule_decks/p+_poly_resistor.drc b/rules/klayout/drc/rule_decks/p+_poly_resistor.drc
index 12f971f..8c24e0b 100644
--- a/rules/klayout/drc/rule_decks/p+_poly_resistor.drc
+++ b/rules/klayout/drc/rule_decks/p+_poly_resistor.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -115,7 +115,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -124,12 +124,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -196,20 +196,20 @@
#================================================
#----------------P+ POLY RESISTOR----------------
-#================================================
+#================================================
pres_poly = poly2.and(pplus).interacting(sab).interacting(res_mk).not_interacting(resistor)
# Rule PRES.1: Minimum width of Poly2 resistor. is 0.8µm
logger.info("Executing rule PRES.1")
pres1_l1 = pres_poly.width(0.8.um, euclidian).polygons(0.001)
pres1_l1.output("PRES.1", "PRES.1 : Minimum width of Poly2 resistor. : 0.8µm")
-pres1_l1.forget
+pres1_l1.forget
# Rule PRES.2: Minimum space between Poly2 resistors. is 0.4µm
logger.info("Executing rule PRES.2")
pres2_l1 = pres_poly.isolated(0.4.um, euclidian).polygons(0.001)
pres2_l1.output("PRES.2", "PRES.2 : Minimum space between Poly2 resistors. : 0.4µm")
-pres2_l1.forget
+pres2_l1.forget
# Rule PRES.3: Minimum space from Poly2 resistor to COMP.
logger.info("Executing rule PRES.3")
@@ -221,7 +221,7 @@
logger.info("Executing rule PRES.4")
pres4_l1 = pres_poly.separation(poly2.not_interacting(sab), 0.6.um, euclidian).polygons(0.001)
pres4_l1.output("PRES.4", "PRES.4 : Minimum space from Poly2 resistor to unrelated Poly2. : 0.6µm")
-pres4_l1.forget
+pres4_l1.forget
# Rule PRES.5: Minimum Plus implant overlap of Poly2 resistor. is 0.3µm
logger.info("Executing rule PRES.5")
diff --git a/rules/klayout/drc/rule_decks/poly2.drc b/rules/klayout/drc/rule_decks/poly2.drc
index e3afbf0..f9015f1 100644
--- a/rules/klayout/drc/rule_decks/poly2.drc
+++ b/rules/klayout/drc/rule_decks/poly2.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -118,7 +118,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -127,12 +127,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -199,7 +199,7 @@
#================================================
#---------------------POLY2----------------------
-#================================================
+#================================================
if FEOL
@@ -209,31 +209,31 @@
logger.info("Executing rule PL.1_3.3V")
pl1_l1 = poly2.outside(plfuse).not(ymtp_mk).width(0.18.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
pl1_l1.output("PL.1_3.3V", "PL.1_3.3V : Interconnect Width (outside PLFUSE). : 0.18µm")
-pl1_l1.forget
+pl1_l1.forget
# Rule PL.1_5V: Interconnect Width (outside PLFUSE). is 0.2µm
logger.info("Executing rule PL.1_5V")
pl1_l1 = poly2.outside(plfuse).not(ymtp_mk).width(0.2.um, euclidian).polygons(0.001).overlapping(dualgate)
pl1_l1.output("PL.1_5V", "PL.1_5V : Interconnect Width (outside PLFUSE). : 0.2µm")
-pl1_l1.forget
+pl1_l1.forget
# Rule PL.1a_3.3V: Interconnect Width (inside PLFUSE). is 0.18µm
logger.info("Executing rule PL.1a_3.3V")
pl1a_l1 = poly2.inside(plfuse).width(0.18.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
pl1a_l1.output("PL.1a_3.3V", "PL.1a_3.3V : Interconnect Width (inside PLFUSE). : 0.18µm")
-pl1a_l1.forget
+pl1a_l1.forget
# Rule PL.1a_5V: Interconnect Width (inside PLFUSE). is 0.18µm
logger.info("Executing rule PL.1a_5V")
pl1a_l1 = poly2.inside(plfuse).width(0.18.um, euclidian).polygons(0.001).overlapping(dualgate)
pl1a_l1.output("PL.1a_5V", "PL.1a_5V : Interconnect Width (inside PLFUSE). : 0.18µm")
-pl1a_l1.forget
+pl1a_l1.forget
# Rule PL.2_3.3V: Gate Width (Channel Length). is 0.28µm
logger.info("Executing rule PL.2_3.3V")
pl2_l1 = poly2.edges.and(tgate.edges).not(otp_mk).not(ymtp_mk).width(0.28.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
pl2_l1.output("PL.2_3.3V", "PL.2_3.3V : Gate Width (Channel Length). : 0.28µm")
-pl2_l1.forget
+pl2_l1.forget
pl_2_5v_n = comp.not(poly2).edges.and(ngate.edges).and(v5_xtor).and(dualgate).space(0.6.um, euclidian).polygons
pl_2_5v_p = comp.not(poly2).edges.and(pgate.edges).and(v5_xtor).and(dualgate).space(0.5.um, euclidian).polygons
@@ -253,13 +253,13 @@
logger.info("Executing rule PL.3a_3.3V")
pl3a_l1 = (tgate).or(poly2.not(comp)).not(otp_mk).space(0.24.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
pl3a_l1.output("PL.3a_3.3V", "PL.3a_3.3V : Space on COMP/Field. : 0.24µm")
-pl3a_l1.forget
+pl3a_l1.forget
# Rule PL.3a_5V: Space on COMP/Field. is 0.24µm
logger.info("Executing rule PL.3a_5V")
pl3a_l1 = (tgate).or(poly2.not(comp)).not(otp_mk).space(0.24.um, euclidian).polygons(0.001).overlapping(dualgate)
pl3a_l1.output("PL.3a_5V", "PL.3a_5V : Space on COMP/Field. : 0.24µm")
-pl3a_l1.forget
+pl3a_l1.forget
# rule PL.3b_3.3V is not a DRC check
@@ -283,25 +283,25 @@
logger.info("Executing rule PL.5a_3.3V")
pl5a_l1 = poly_pl.separation(comp_pl, 0.1.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
pl5a_l1.output("PL.5a_3.3V", "PL.5a_3.3V : Space from field Poly2 to unrelated COMP Spacer from field Poly2 to Guard-ring. : 0.1µm")
-pl5a_l1.forget
+pl5a_l1.forget
# Rule PL.5a_5V: Space from field Poly2 to unrelated COMP Spacer from field Poly2 to Guard-ring. is 0.3µm
logger.info("Executing rule PL.5a_5V")
pl5a_l1 = poly_pl.outside(sramcore).separation(comp_pl, 0.3.um, euclidian).polygons(0.001).overlapping(dualgate)
pl5a_l1.output("PL.5a_5V", "PL.5a_5V : Space from field Poly2 to unrelated COMP Spacer from field Poly2 to Guard-ring. : 0.3µm")
-pl5a_l1.forget
+pl5a_l1.forget
# Rule PL.5b_3.3V: Space from field Poly2 to related COMP. is 0.1µm
logger.info("Executing rule PL.5b_3.3V")
pl5b_l1 = poly_pl.separation(comp_pl, 0.1.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
pl5b_l1.output("PL.5b_3.3V", "PL.5b_3.3V : Space from field Poly2 to related COMP. : 0.1µm")
-pl5b_l1.forget
+pl5b_l1.forget
# Rule PL.5b_5V: Space from field Poly2 to related COMP. is 0.3µm
logger.info("Executing rule PL.5b_5V")
pl5b_l1 = poly_pl.outside(sramcore).separation(comp_pl, 0.3.um, euclidian).polygons(0.001).overlapping(dualgate)
pl5b_l1.output("PL.5b_5V", "PL.5b_5V : Space from field Poly2 to related COMP. : 0.3µm")
-pl5b_l1.forget
+pl5b_l1.forget
poly_pl.forget
comp_pl.forget
@@ -318,13 +318,13 @@
logger.info("Executing rule PL.7_3.3V")
pl7_l1 = poly_45deg.width(0.3.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
pl7_l1.output("PL.7_3.3V", "PL.7_3.3V : 45 degree bent gate width : 0.3µm")
-pl7_l1.forget
+pl7_l1.forget
# Rule PL.7_5V: 45 degree bent gate width is 0.7µm
logger.info("Executing rule PL.7_5V")
pl7_l1 = poly_45deg.width(0.7.um, euclidian).polygons(0.001).overlapping(dualgate)
pl7_l1.output("PL.7_5V", "PL.7_5V : 45 degree bent gate width : 0.7µm")
-pl7_l1.forget
+pl7_l1.forget
poly_45deg.forget
# Rule PL.9: Poly2 inter connect connecting 3.3V and 5V areas (area inside and outside Dualgate) are not allowed. They shall be done though metal lines only.
diff --git a/rules/klayout/drc/rule_decks/pplus.drc b/rules/klayout/drc/rule_decks/pplus.drc
index a31a6ff..945aa59 100644
--- a/rules/klayout/drc/rule_decks/pplus.drc
+++ b/rules/klayout/drc/rule_decks/pplus.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -116,7 +116,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -125,12 +125,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -197,7 +197,7 @@
#================================================
#---------------------PPLUS----------------------
-#================================================
+#================================================
if FEOL
@@ -207,26 +207,26 @@
logger.info("Executing rule PP.1")
pp1_l1 = pplus.width(0.4.um, euclidian).polygons(0.001)
pp1_l1.output("PP.1", "PP.1 : min. pplus width : 0.4µm")
-pp1_l1.forget
+pp1_l1.forget
# Rule PP.2: min. pplus spacing is 0.4µm
logger.info("Executing rule PP.2")
pp2_l1 = pplus.space(0.4.um, euclidian).polygons(0.001)
pp2_l1.output("PP.2", "PP.2 : min. pplus spacing : 0.4µm")
-pp2_l1.forget
+pp2_l1.forget
# Rule PP.3a: Space to NCOMP for NCOMP (1) inside LVPWELL (2) outside NWELL and DNWELL. is 0.16µm
logger.info("Executing rule PP.3a")
pp3a_l1 = pplus.separation((ncomp.inside(lvpwell)).or(ncomp.outside(nwell).outside(dnwell)), 0.16.um, euclidian).polygons(0.001)
pp3a_l1.output("PP.3a", "PP.3a : Space to NCOMP for NCOMP (1) inside LVPWELL (2) outside NWELL and DNWELL. : 0.16µm")
-pp3a_l1.forget
+pp3a_l1.forget
pp_3bi = ncomp.edges.not(lvpwell.inside(dnwell).sized(0.429.um))
# Rule PP.3bi: Space to NCOMP: For Inside DNWELL. (i) NCOMP space to LVPWELL >= 0.43um. is 0.08µm
logger.info("Executing rule PP.3bi")
pp3bi_l1 = pplus.inside(dnwell).edges.separation(pp_3bi, 0.08.um, euclidian).polygons(0.001)
pp3bi_l1.output("PP.3bi", "PP.3bi : Space to NCOMP: For Inside DNWELL. (i) NCOMP space to LVPWELL >= 0.43um. : 0.08µm")
-pp3bi_l1.forget
+pp3bi_l1.forget
pp_3bi.forget
pp_3bii = ncomp.edges.and(lvpwell.inside(dnwell).sized(0.429.um))
@@ -234,7 +234,7 @@
logger.info("Executing rule PP.3bii")
pp3bii_l1 = pplus.inside(dnwell).edges.separation(pp_3bii, 0.16.um, euclidian).polygons(0.001)
pp3bii_l1.output("PP.3bii", "PP.3bii : Space to NCOMP: For Inside DNWELL. (ii) NCOMP space to LVPWELL < 0.43um. : 0.16µm")
-pp3bii_l1.forget
+pp3bii_l1.forget
pp_3bii.forget
pp_3ci_extend = nwell.outside(dnwell).sized(-0.429.um)
@@ -243,7 +243,7 @@
logger.info("Executing rule PP.3ci")
pp3ci_l1 = pplus.outside(dnwell).edges.separation(pp_3ci, 0.08.um, euclidian).polygons(0.001)
pp3ci_l1.output("PP.3ci", "PP.3ci : Space to NCOMP: For Outside DNWELL, inside Nwell: (i) NWELL Overlap of NCOMP >= 0.43um. : 0.08µm")
-pp3ci_l1.forget
+pp3ci_l1.forget
pp_3ci_extend.forget
pp_3ci.forget
@@ -253,7 +253,7 @@
logger.info("Executing rule PP.3cii")
pp3cii_l1 = pplus.outside(dnwell).edges.separation(pp_3cii, 0.16.um, euclidian).polygons(0.001)
pp3cii_l1.output("PP.3cii", "PP.3cii : Space to NCOMP: For Outside DNWELL, inside Nwell: (ii) NWELL Overlap of NCOMP 0.43um. : 0.16µm")
-pp3cii_l1.forget
+pp3cii_l1.forget
pp_3cii_extend.forget
pp_3cii.forget
@@ -353,18 +353,18 @@
logger.info("Executing rule PP.7")
pp7_l1 = pplus.separation(poly2.and(sab), 0.18.um, euclidian).polygons(0.001)
pp7_l1.output("PP.7", "PP.7 : Space to unrelated unsalicided Poly2. : 0.18µm")
-pp7_l1.forget
+pp7_l1.forget
# Rule PP.8a: Minimum Pplus area (um2). is 0.35µm²
logger.info("Executing rule PP.8a")
pp8a_l1 = pplus.with_area(nil, 0.35.um)
pp8a_l1.output("PP.8a", "PP.8a : Minimum Pplus area (um2). : 0.35µm²")
-pp8a_l1.forget
+pp8a_l1.forget
# Rule PP.8b: Minimum area enclosed by Pplus (um2). is 0.35µm²
logger.info("Executing rule PP.8b")
pp8b_l1 = pplus.holes.with_area(nil, 0.35.um)
pp8b_l1.output("PP.8b", "PP.8b : Minimum area enclosed by Pplus (um2). : 0.35µm²")
-pp8b_l1.forget
+pp8b_l1.forget
# Rule PP.9: Overlap of unsalicided Poly2. is 0.18µm
logger.info("Executing rule PP.9")
pp9_l1 = pplus.enclosing(poly2.not_interacting(resistor).and(sab), 0.18.um, euclidian).polygons(0.001)
diff --git a/rules/klayout/drc/rule_decks/sab.drc b/rules/klayout/drc/rule_decks/sab.drc
index e021b27..86e64f3 100644
--- a/rules/klayout/drc/rule_decks/sab.drc
+++ b/rules/klayout/drc/rule_decks/sab.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -118,7 +118,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -127,12 +127,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -199,7 +199,7 @@
#================================================
#----------------------SAB-----------------------
-#================================================
+#================================================
if FEOL
@@ -209,19 +209,19 @@
logger.info("Executing rule SB.1")
sb1_l1 = sab.width(0.42.um, euclidian).polygons(0.001)
sb1_l1.output("SB.1", "SB.1 : min. sab width : 0.42µm")
-sb1_l1.forget
+sb1_l1.forget
# Rule SB.2: min. sab spacing is 0.42µm
logger.info("Executing rule SB.2")
sb2_l1 = sab.outside(otp_mk).space(0.42.um, euclidian).polygons(0.001)
sb2_l1.output("SB.2", "SB.2 : min. sab spacing : 0.42µm")
-sb2_l1.forget
+sb2_l1.forget
# Rule SB.3: Space from salicide block to unrelated COMP. is 0.22µm
logger.info("Executing rule SB.3")
sb3_l1 = sab.outside(comp).outside(otp_mk).separation(comp.outside(sab), 0.22.um, euclidian).polygons(0.001)
sb3_l1.output("SB.3", "SB.3 : Space from salicide block to unrelated COMP. : 0.22µm")
-sb3_l1.forget
+sb3_l1.forget
# Rule SB.4: Space from salicide block to contact.
logger.info("Executing rule SB.4")
@@ -233,13 +233,13 @@
logger.info("Executing rule SB.5a")
sb5a_l1 = sab.outside(poly2.not(comp)).outside(otp_mk).separation(poly2.not(comp).outside(sab), 0.3.um, euclidian).polygons(0.001)
sb5a_l1.output("SB.5a", "SB.5a : Space from salicide block to unrelated Poly2 on field. : 0.3µm")
-sb5a_l1.forget
+sb5a_l1.forget
# Rule SB.5b: Space from salicide block to unrelated Poly2 on COMP. is 0.28µm
logger.info("Executing rule SB.5b")
sb5b_l1 = sab.outside(tgate).outside(otp_mk).separation(tgate.outside(sab), 0.28.um, euclidian).polygons(0.001)
sb5b_l1.output("SB.5b", "SB.5b : Space from salicide block to unrelated Poly2 on COMP. : 0.28µm")
-sb5b_l1.forget
+sb5b_l1.forget
# Rule SB.6: Salicide block extension beyond related COMP. is 0.22µm
logger.info("Executing rule SB.6")
@@ -287,7 +287,7 @@
logger.info("Executing rule SB.13")
sb13_l1 = sab.outside(otp_mk).with_area(nil, 2.um)
sb13_l1.output("SB.13", "SB.13 : Min. area (um2). : 2µm²")
-sb13_l1.forget
+sb13_l1.forget
# Rule SB.14a: Space from unsalicided Nplus Poly2 to unsalicided Pplus Poly2. (Unsalicided Nplus Poly2 must not fall within a square of 0.56um x 0.56um at unsalicided Pplus Poly2 corners). is 0.56µm
logger.info("Executing rule SB.14a")
sb14a_l1 = poly2.and(nplus).and(sab).separation(poly2.and(pplus).and(sab), 0.56.um, square).polygons
@@ -304,7 +304,7 @@
logger.info("Executing rule SB.15a")
sb15a_l1 = poly2.and(sab).separation(nplus.or(pplus), 0.18.um, euclidian).polygons(0.001)
sb15a_l1.output("SB.15a", "SB.15a : Space from unsalicided Poly2 to unrelated Nplus/Pplus. : 0.18µm")
-sb15a_l1.forget
+sb15a_l1.forget
sb_15b_1 = poly2.interacting(nplus.or(pplus)).and(sab).edges.not(poly2.edges.and(sab)).separation(nplus.or(pplus).edges, 0.32.um, projection).polygons(0.001)
sb_15b_2 = poly2.interacting(nplus.or(pplus)).and(sab).separation(nplus.or(pplus), 0.32.um, projection).polygons(0.001)
diff --git a/rules/klayout/drc/rule_decks/via1.drc b/rules/klayout/drc/rule_decks/via1.drc
index 30806d2..00f78ee 100644
--- a/rules/klayout/drc/rule_decks/via1.drc
+++ b/rules/klayout/drc/rule_decks/via1.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -114,7 +114,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -123,12 +123,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -195,7 +195,7 @@
#================================================
#----------------------VIA1----------------------
-#================================================
+#================================================
if BEOL
@@ -211,7 +211,7 @@
logger.info("Executing rule V1.2a")
v12a_l1 = via1.space(0.26.um, euclidian).polygons(0.001)
v12a_l1.output("V1.2a", "V1.2a : min. via1 spacing : 0.26µm")
-v12a_l1.forget
+v12a_l1.forget
merged_via1 = via1.sized(0.18.um).sized(-0.18.um).with_bbox_min(1.82.um , nil).extents.inside(metal1)
via1_mask = merged_via1.size(1).not(via1).with_holes(16, nil)
@@ -220,7 +220,7 @@
logger.info("Executing rule V1.2b")
v12b_l1 = selected_via1.space(0.36.um, euclidian).polygons(0.001)
v12b_l1.output("V1.2b", "V1.2b : Via1 Space in 4x4 or larger via1 array : 0.36µm")
-v12b_l1.forget
+v12b_l1.forget
merged_via1.forget
via1_mask.forget
diff --git a/rules/klayout/drc/rule_decks/via2.drc b/rules/klayout/drc/rule_decks/via2.drc
index 964d234..2daaf11 100644
--- a/rules/klayout/drc/rule_decks/via2.drc
+++ b/rules/klayout/drc/rule_decks/via2.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -114,7 +114,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -123,12 +123,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -195,7 +195,7 @@
#================================================
#----------------------VIA2----------------------
-#================================================
+#================================================
if BEOL
@@ -211,7 +211,7 @@
logger.info("Executing rule V2.2a")
v22a_l1 = via2.space(0.26.um, euclidian).polygons(0.001)
v22a_l1.output("V2.2a", "V2.2a : min. via2 spacing : 0.26µm")
-v22a_l1.forget
+v22a_l1.forget
merged_via2 = via2.sized(0.18.um).sized(-0.18.um).with_bbox_min(1.82.um , nil).extents.inside(metal2)
via2_mask = merged_via2.size(1).not(via2).with_holes(16, nil)
@@ -220,7 +220,7 @@
logger.info("Executing rule V2.2b")
v22b_l1 = selected_via2.space(0.36.um, euclidian).polygons(0.001)
v22b_l1.output("V2.2b", "V2.2b : Via2 Space in 4x4 or larger via2 array : 0.36µm")
-v22b_l1.forget
+v22b_l1.forget
merged_via2.forget
via2_mask.forget
diff --git a/rules/klayout/drc/rule_decks/via3.drc b/rules/klayout/drc/rule_decks/via3.drc
index 058b553..81d9604 100644
--- a/rules/klayout/drc/rule_decks/via3.drc
+++ b/rules/klayout/drc/rule_decks/via3.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -114,7 +114,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -123,12 +123,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -195,7 +195,7 @@
#================================================
#----------------------VIA3----------------------
-#================================================
+#================================================
if BEOL
@@ -211,7 +211,7 @@
logger.info("Executing rule V3.2a")
v32a_l1 = via3.space(0.26.um, euclidian).polygons(0.001)
v32a_l1.output("V3.2a", "V3.2a : min. via3 spacing : 0.26µm")
-v32a_l1.forget
+v32a_l1.forget
merged_via3 = via3.sized(0.18.um).sized(-0.18.um).with_bbox_min(1.82.um , nil).extents.inside(metal3)
via3_mask = merged_via3.size(1).not(via3).with_holes(16, nil)
@@ -220,7 +220,7 @@
logger.info("Executing rule V3.2b")
v32b_l1 = selected_via3.space(0.36.um, euclidian).polygons(0.001)
v32b_l1.output("V3.2b", "V3.2b : Via3 Space in 4x4 or larger via3 array : 0.36µm")
-v32b_l1.forget
+v32b_l1.forget
merged_via3.forget
via3_mask.forget
diff --git a/rules/klayout/drc/rule_decks/via4.drc b/rules/klayout/drc/rule_decks/via4.drc
index 93bfe4d..44cddb3 100644
--- a/rules/klayout/drc/rule_decks/via4.drc
+++ b/rules/klayout/drc/rule_decks/via4.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -114,7 +114,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -123,12 +123,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -195,7 +195,7 @@
#================================================
#----------------------VIA4----------------------
-#================================================
+#================================================
if BEOL
@@ -211,7 +211,7 @@
logger.info("Executing rule V4.2a")
v42a_l1 = via4.space(0.26.um, euclidian).polygons(0.001)
v42a_l1.output("V4.2a", "V4.2a : min. via4 spacing : 0.26µm")
-v42a_l1.forget
+v42a_l1.forget
merged_via4 = via4.sized(0.18.um).sized(-0.18.um).with_bbox_min(1.82.um , nil).extents.inside(metal4)
via4_mask = merged_via4.size(1).not(via4).with_holes(16, nil)
@@ -220,7 +220,7 @@
logger.info("Executing rule V4.2b")
v42b_l1 = selected_via4.space(0.36.um, euclidian).polygons(0.001)
v42b_l1.output("V4.2b", "V4.2b : Via4 Space in 4x4 or larger Vian array : 0.36µm")
-v42b_l1.forget
+v42b_l1.forget
merged_via4.forget
via4_mask.forget
diff --git a/rules/klayout/drc/rule_decks/via5.drc b/rules/klayout/drc/rule_decks/via5.drc
index 30d6373..6e950d1 100644
--- a/rules/klayout/drc/rule_decks/via5.drc
+++ b/rules/klayout/drc/rule_decks/via5.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -114,7 +114,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -123,12 +123,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -195,7 +195,7 @@
#================================================
#----------------------VIA5----------------------
-#================================================
+#================================================
if BEOL
@@ -211,7 +211,7 @@
logger.info("Executing rule V5.2a")
v52a_l1 = via5.space(0.26.um, euclidian).polygons(0.001)
v52a_l1.output("V5.2a", "V5.2a : min. via5 spacing : 0.26µm")
-v52a_l1.forget
+v52a_l1.forget
merged_via5 = via5.sized(0.18.um).sized(-0.18.um).with_bbox_min(1.82.um , nil).extents.inside(metal5)
via5_mask = merged_via5.size(1).not(via5).with_holes(16, nil)
@@ -220,7 +220,7 @@
logger.info("Executing rule V5.2b")
v52b_l1 = selected_via5.space(0.36.um, euclidian).polygons(0.001)
v52b_l1.output("V5.2b", "V5.2b : Via5 Space in 4x4 or larger via5 array : 0.36µm")
-v52b_l1.forget
+v52b_l1.forget
merged_via5.forget
via5_mask.forget
diff --git a/rules/klayout/drc/rule_decks/ymtp_mk.drc b/rules/klayout/drc/rule_decks/ymtp_mk.drc
index 350103b..96bb507 100644
--- a/rules/klayout/drc/rule_decks/ymtp_mk.drc
+++ b/rules/klayout/drc/rule_decks/ymtp_mk.drc
@@ -32,7 +32,7 @@
logger.info("Loading database to memory is complete.")
-if $report
+if $report
logger.info("GF180MCU Klayout DRC runset output at: %s" % [$report])
report("DRC Run Report at", $report)
else
@@ -49,29 +49,29 @@
end
# === TILING MODE ===
-if $run_mode == "tiling"
+if $run_mode == "tiling"
# use a tile size of 1mm - not used in deep mode-
# tiles(500.um)
# use a tile border of 10 micron:
# tile_borders(10.um)
tiles(1000)
- logger.info("Tiling mode is enabled.")
+ logger.info("Tiling mode is enabled.")
elsif $run_mode == "deep"
#=== HIER MODE ===
deep
- logger.info("deep mode is enabled.")
+ logger.info("deep mode is enabled.")
elsif $run_mode == "flat"
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
+ logger.info("flat mode is enabled.")
else
#=== FLAT MODE ===
flat
- logger.info("flat mode is enabled.")
-
+ logger.info("flat mode is enabled.")
+
end # run_mode
#================================================
@@ -116,7 +116,7 @@
end # FEOL
# BEOL
-if $beol == "false"
+if $beol == "false"
BEOL = $beol
logger.info("BEOL is disabled.")
else
@@ -125,12 +125,12 @@
end # BEOL
# connectivity rules
-if $conn_drc == "true"
+if $conn_drc == "true"
CONNECTIVITY_RULES = $conn_drc
- logger.info("connectivity rules are enabled.")
+ logger.info("connectivity rules are enabled.")
else
CONNECTIVITY_RULES = false
- logger.info("connectivity rules are disabled.")
+ logger.info("connectivity rules are disabled.")
end # connectivity rules
# METAL_TOP
@@ -197,19 +197,19 @@
#================================================
#--------------------YMTP_MK---------------------
-#================================================
+#================================================
# Rule Y.NW.2b_3.3V: Min. Nwell Space (Outside DNWELL, Inside YMTP_MK) [Different potential]. is 1µm
logger.info("Executing rule Y.NW.2b_3.3V")
ynw2b_l1 = nwell.outside(dnwell).inside(ymtp_mk).space(1.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
ynw2b_l1.output("Y.NW.2b_3.3V", "Y.NW.2b_3.3V : Min. Nwell Space (Outside DNWELL, Inside YMTP_MK) [Different potential]. : 1µm")
-ynw2b_l1.forget
+ynw2b_l1.forget
# Rule Y.NW.2b_5V: Min. Nwell Space (Outside DNWELL, Inside YMTP_MK) [Different potential]. is 1µm
logger.info("Executing rule Y.NW.2b_5V")
ynw2b_l1 = nwell.outside(dnwell).inside(ymtp_mk).space(1.um, euclidian).polygons(0.001).overlapping(dualgate)
ynw2b_l1.output("Y.NW.2b_5V", "Y.NW.2b_5V : Min. Nwell Space (Outside DNWELL, Inside YMTP_MK) [Different potential]. : 1µm")
-ynw2b_l1.forget
+ynw2b_l1.forget
# rule Y.DF.4d_3.3V is not a DRC check
@@ -225,19 +225,19 @@
logger.info("Executing rule Y.DF.16_3.3V")
ydf16_l1 = ncomp.outside(nwell).outside(dnwell).separation(nwell.outside(dnwell), 0.27.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
ydf16_l1.output("Y.DF.16_3.3V", "Y.DF.16_3.3V : Min. space from (Nwell outside DNWELL) to (unrelated NCOMP outside Nwell and DNWELL) (inside YMTP_MK). : 0.27µm")
-ydf16_l1.forget
+ydf16_l1.forget
# Rule Y.DF.16_5V: Min. space from (Nwell outside DNWELL) to (unrelated NCOMP outside Nwell and DNWELL) (inside YMTP_MK). is 0.23µm
logger.info("Executing rule Y.DF.16_5V")
ydf16_l1 = ncomp.outside(nwell).outside(dnwell).separation(nwell.outside(dnwell), 0.23.um, euclidian).polygons(0.001).overlapping(dualgate)
ydf16_l1.output("Y.DF.16_5V", "Y.DF.16_5V : Min. space from (Nwell outside DNWELL) to (unrelated NCOMP outside Nwell and DNWELL) (inside YMTP_MK). : 0.23µm")
-ydf16_l1.forget
+ydf16_l1.forget
# Rule Y.PL.1_3.3V: Interconnect Width (inside YMTP_MK). is 0.13µm
logger.info("Executing rule Y.PL.1_3.3V")
ypl1_l1 = poly2.outside(plfuse).and(ymtp_mk).width(0.13.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
ypl1_l1.output("Y.PL.1_3.3V", "Y.PL.1_3.3V : Interconnect Width (inside YMTP_MK). : 0.13µm")
-ypl1_l1.forget
+ypl1_l1.forget
# Rule Y.PL.1_5V: Interconnect Width (inside YMTP_MK). This rule is currently not applicable for 5V.
logger.info("Executing rule Y.PL.1_5V")
@@ -249,13 +249,13 @@
logger.info("Executing rule Y.PL.2_3.3V")
ypl2_l1 = poly2.edges.and(tgate.edges).not(otp_mk).and(ymtp_mk).width(0.13.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
ypl2_l1.output("Y.PL.2_3.3V", "Y.PL.2_3.3V : Gate Width (Channel Length) (inside YMTP_MK). : 0.13µm")
-ypl2_l1.forget
+ypl2_l1.forget
# Rule Y.PL.2_5V: Gate Width (Channel Length) (inside YMTP_MK). is 0.47µm
logger.info("Executing rule Y.PL.2_5V")
ypl2_l1 = poly2.edges.and(tgate.edges).not(otp_mk).and(ymtp_mk).width(0.47.um, euclidian).polygons(0.001).overlapping(dualgate)
ypl2_l1.output("Y.PL.2_5V", "Y.PL.2_5V : Gate Width (Channel Length) (inside YMTP_MK). : 0.47µm")
-ypl2_l1.forget
+ypl2_l1.forget
# Rule Y.PL.4_5V: Poly2 extension beyond COMP to form Poly2 end cap (inside YMTP_MK). is 0.16µm
logger.info("Executing rule Y.PL.4_5V")
@@ -267,25 +267,25 @@
logger.info("Executing rule Y.PL.5a_3.3V")
ypl5a_l1 = poly2.and(ymtp_mk).separation(comp.and(ymtp_mk), 0.04.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
ypl5a_l1.output("Y.PL.5a_3.3V", "Y.PL.5a_3.3V : Space from field Poly2 to unrelated COMP (inside YMTP_MK). Space from field Poly2 to Guard-ring (inside YMTP_MK). : 0.04µm")
-ypl5a_l1.forget
+ypl5a_l1.forget
# Rule Y.PL.5a_5V: Space from field Poly2 to unrelated COMP (inside YMTP_MK). Space from field Poly2 to Guard-ring (inside YMTP_MK). is 0.2µm
logger.info("Executing rule Y.PL.5a_5V")
ypl5a_l1 = poly2.and(ymtp_mk).separation(comp.and(ymtp_mk), 0.2.um, euclidian).polygons(0.001).overlapping(dualgate)
ypl5a_l1.output("Y.PL.5a_5V", "Y.PL.5a_5V : Space from field Poly2 to unrelated COMP (inside YMTP_MK). Space from field Poly2 to Guard-ring (inside YMTP_MK). : 0.2µm")
-ypl5a_l1.forget
+ypl5a_l1.forget
# Rule Y.PL.5b_3.3V: Space from field Poly2 to related COMP (inside YMTP_MK). is 0.04µm
logger.info("Executing rule Y.PL.5b_3.3V")
ypl5b_l1 = poly2.and(ymtp_mk).separation(comp.and(ymtp_mk), 0.04.um, euclidian).polygons(0.001).not_interacting(v5_xtor).not_interacting(dualgate)
ypl5b_l1.output("Y.PL.5b_3.3V", "Y.PL.5b_3.3V : Space from field Poly2 to related COMP (inside YMTP_MK). : 0.04µm")
-ypl5b_l1.forget
+ypl5b_l1.forget
# Rule Y.PL.5b_5V: Space from field Poly2 to related COMP (inside YMTP_MK). is 0.2µm
logger.info("Executing rule Y.PL.5b_5V")
ypl5b_l1 = poly2.and(ymtp_mk).separation(comp.and(ymtp_mk), 0.2.um, euclidian).polygons(0.001).overlapping(dualgate)
ypl5b_l1.output("Y.PL.5b_5V", "Y.PL.5b_5V : Space from field Poly2 to related COMP (inside YMTP_MK). : 0.2µm")
-ypl5b_l1.forget
+ypl5b_l1.forget
# rule Y.PL.6_3.3V is not a DRC check