Corrected a problem with scripts overwriting temp files during
parallel builds, resolved by using python3's tempfile package.
Also: Redid the parasitic capacitance definitions to resolve
issues around computing parasitic capacitance to deep nwell
structures (mostly), in combination with some changes in magic to
automatically handle the short version of the "defaultareacap" and
"defaultperimeter" statements in the tech file, to incorporate
information about the handling of isolated substrate regions.
diff --git a/VERSION b/VERSION
index 3dbd46e..c7119f1 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.0.288
+1.0.289
diff --git a/sky130/custom/scripts/add_bipolar_ids.py b/sky130/custom/scripts/add_bipolar_ids.py
index 872af9b..611cc71 100755
--- a/sky130/custom/scripts/add_bipolar_ids.py
+++ b/sky130/custom/scripts/add_bipolar_ids.py
@@ -10,6 +10,7 @@
import os
import re
import sys
+import tempfile
options = []
arguments = []
@@ -50,7 +51,6 @@
for idx, device in enumerate(devlist):
infile_name = magpath + '/' + device + '.mag'
- outfile_name = magpath + '/' + device + '_temp.mag'
if not os.path.exists(infile_name):
print('Error: Cannot find file ' + infile_name)
@@ -61,7 +61,8 @@
type = typelist[idx]
is_baserect = False
infile = open(infile_name, 'r')
- outfile = open(outfile_name, 'w')
+ handle, outfile_name = tempfile.mkstemp()
+ outfile = os.fdopen(handle, 'w')
line_number = 0
replaced_something = False
diff --git a/sky130/custom/scripts/fix_spice_includes.py b/sky130/custom/scripts/fix_spice_includes.py
index f70079b..8469057 100755
--- a/sky130/custom/scripts/fix_spice_includes.py
+++ b/sky130/custom/scripts/fix_spice_includes.py
@@ -11,6 +11,7 @@
import os
import re
import sys
+import tempfile
newdevs = []
newdevs.append('sky130_fd_pr__pnp_05v5_W3p40L3p40')
@@ -38,10 +39,10 @@
filepath = os.path.split(infile_name)[0]
filename = os.path.split(infile_name)[1]
fileroot = os.path.split(filename)[0]
- outfile_name = os.path.join(filepath, fileroot + '_temp')
infile = open(infile_name, 'r')
- outfile = open(outfile_name, 'w')
+ handle, outfile_name = tempfile.mkstemp()
+ outfile = os.fdopen(handle, 'w')
line_number = 0
replaced_something = False
diff --git a/sky130/custom/scripts/mismatch_params.py b/sky130/custom/scripts/mismatch_params.py
index af84ddc..c8a8fef 100755
--- a/sky130/custom/scripts/mismatch_params.py
+++ b/sky130/custom/scripts/mismatch_params.py
@@ -9,6 +9,7 @@
import os
import re
import sys
+import tempfile
mm_switch_param = 'MC_MM_SWITCH'
@@ -95,10 +96,10 @@
filepath = os.path.split(infile_name)[0]
filename = os.path.split(infile_name)[1]
fileroot = os.path.splitext(filename)[0]
- outfile_name = os.path.join(filepath, fileroot + '_temp')
infile = open(infile_name, 'r')
- outfile = open(outfile_name, 'w')
+ handle, outfile_name = tempfile.mkstemp()
+ outfile = os.fdopen(handle, 'w')
state = 'before_mismatch'
line_number = 0
diff --git a/sky130/custom/scripts/montecarlo_hack.py b/sky130/custom/scripts/montecarlo_hack.py
index f2486ce..81a47aa 100755
--- a/sky130/custom/scripts/montecarlo_hack.py
+++ b/sky130/custom/scripts/montecarlo_hack.py
@@ -11,6 +11,7 @@
import os
import re
import sys
+import tempfile
searchpath = ['sky130A/libs.tech/ngspice/parameters/critical.spice',
'sky130A/libs.tech/ngspice/parameters/montecarlo.spice']
@@ -54,10 +55,10 @@
filepath = os.path.split(infile_name)[0]
filename = os.path.split(infile_name)[1]
fileroot = os.path.splitext(filename)[0]
- outfile_name = os.path.join(filepath, fileroot + '_temp')
infile = open(infile_name, 'r')
- outfile = open(outfile_name, 'w')
+ handle, outfile_name = tempfile.mkstemp()
+ outfile = osfdopen(handle, 'w')
line_number = 0
replaced_something = False
diff --git a/sky130/custom/scripts/process_params.py b/sky130/custom/scripts/process_params.py
index d255c41..657a635 100755
--- a/sky130/custom/scripts/process_params.py
+++ b/sky130/custom/scripts/process_params.py
@@ -9,6 +9,7 @@
import os
import re
import sys
+import tempfile
pr_switch_param = 'MC_PR_SWITCH'
@@ -86,10 +87,10 @@
filepath = os.path.split(infile_name)[0]
filename = os.path.split(infile_name)[1]
fileroot = os.path.splitext(filename)[0]
- outfile_name = os.path.join(filepath, fileroot + '_temp')
infile = open(infile_name, 'r')
- outfile = open(outfile_name, 'w')
+ handle, outfile_name = tempfile.mkstemp()
+ outfile = os.fdopen(handle, 'w')
state = 'before_process'
line_number = 0
diff --git a/sky130/custom/scripts/sp_to_spice.py b/sky130/custom/scripts/sp_to_spice.py
index 3c9ed3c..b97e7d5 100755
--- a/sky130/custom/scripts/sp_to_spice.py
+++ b/sky130/custom/scripts/sp_to_spice.py
@@ -54,14 +54,14 @@
tokens = newline.split()
if tokens[1] == filebits[0]: # top subckt
bus_start = 2
- last_base = base_rex.match(tokens[2])[1]
+ last_base = base_rex.match(tokens[2]).group(1)
i = 3
while i < len(tokens):
base_match = base_rex.match(tokens[i]) # always matches one base net
- if last_base != base_match[1]:
+ if last_base != base_match.group(1):
tokens[bus_start:i] = tokens[i-1:bus_start-1:-1] # reverse the bus indices
bus_start = i
- last_base = base_match[1]
+ last_base = base_match.group(1)
i += 1
tokens[bus_start:i] = tokens[i-1:bus_start-1:-1]
newline = " ".join(tokens)
diff --git a/sky130/custom/scripts/xyce_hack.py b/sky130/custom/scripts/xyce_hack.py
index ecedb7d..6fcc914 100755
--- a/sky130/custom/scripts/xyce_hack.py
+++ b/sky130/custom/scripts/xyce_hack.py
@@ -12,6 +12,7 @@
import os
import re
import sys
+import tempfile
if len(sys.argv) <= 1:
print('Usage: xyce_hack.py <path_to_file>')
@@ -23,10 +24,10 @@
filepath = os.path.split(infile_name)[0]
filename = os.path.split(infile_name)[1]
fileroot = os.path.splitext(filename)[0]
- outfile_name = os.path.join(filepath, fileroot + '_temp')
infile = open(infile_name, 'r')
- outfile = open(outfile_name, 'w')
+ handle, outfile_name = tempfile.mkstemp()
+ outfile = os.fdopen(handle, 'w')
line_number = 0
replaced_something = False
diff --git a/sky130/custom/scripts/xyce_hack2.py b/sky130/custom/scripts/xyce_hack2.py
index 9308dad..9442ad5 100755
--- a/sky130/custom/scripts/xyce_hack2.py
+++ b/sky130/custom/scripts/xyce_hack2.py
@@ -10,6 +10,7 @@
import os
import re
import sys
+import tempfile
plist = ["ldif", "hdif", "rd", "rs", "rsc", "rdc", "nqsmod"]
regexps = []
@@ -26,10 +27,10 @@
filepath = os.path.split(infile_name)[0]
filename = os.path.split(infile_name)[1]
fileroot = os.path.splitext(filename)[0]
- outfile_name = os.path.join(filepath, fileroot + '_temp')
infile = open(infile_name, 'r')
- outfile = open(outfile_name, 'w')
+ handle, outfile_name = tempfile.mkstemp()
+ outfile = os.fdopen(handle, 'w')
line_number = 0
replaced_something = False
diff --git a/sky130/magic/sky130.tech b/sky130/magic/sky130.tech
index 86140a8..304b4e4 100644
--- a/sky130/magic/sky130.tech
+++ b/sky130/magic/sky130.tech
@@ -467,7 +467,7 @@
psub pwell
- obstypes obswell,obsactive,obsli,obsmcon,obsm1,obsm2,obsm3,obsm4,obsm5,obsmrdl,obscomment
+ obstypes obswell,mvobsactive,obsactive,obsli,obsmcon,obsm1,obsm2,obsm3,obsm4,obsm5,obsmrdl,obscomment
idtypes res0p35,res0p69,res1p41,res2p85,res5p73,pnp0p68,pnp3p40,npn1p00,npn2p00,npn11p0
blocktypes fillblock,fillblock4
@@ -5405,8 +5405,7 @@
#n-well
# NOTE: This value not found in PEX files
-defaultareacap nwell well 120
-defaultoverlap nwell well isosub dwell 120
+defaultareacap nwell well dnwell dwell 120
#n-active
# Rely on device models to capture *ndiff area cap
@@ -5426,19 +5425,17 @@
# defaultareacap allpolynonfet active 106
# defaultperimeter allpolynonfet active 57
- defaultsidewall *poly active 22.6
- defaultoverlap *poly active dnwell,isosub dwell 55.27
- defaultareacap *poly active nwell,obswell,pwell well 106.13
- defaultperimeter *poly active nwell,obswell,pwell well 55.27
- defaultsideoverlap *poly active nwell,obswell,pwell well 55.27
+ defaultsidewall *poly active 22.6
+ defaultareacap *poly active 106.13
+ defaultperimeter *poly active 55.27
+ defaultsideoverlap *poly active nwell,pwell well 55.27
#locali
- defaultsidewall allli locali 32.51
- defaultoverlap allli locali dnwell,isosub dwell 36.99
- defaultareacap allli locali nwell,obswell,pwell well 36.99
- defaultperimeter allli locali nwell,obswell,pwell well 40.70
- defaultoverlap allli locali nwell,obswell,pwell well 36.99
- defaultsideoverlap allli locali nwell,obswell,pwell well 40.70
+ defaultsidewall allli locali 32.51
+ defaultareacap allli locali 36.99
+ defaultperimeter allli locali 40.70
+ defaultoverlap allli locali nwell,pwell well 36.99
+ defaultsideoverlap allli locali nwell,pwell well 40.70
#locali->diff
defaultoverlap allli locali allactivenonfet active 36.99
@@ -5450,12 +5447,11 @@
defaultsideoverlap *poly active allli locali 25.14
#metal1
- defaultsidewall allm1 metal1 44.74
- defaultoverlap allm1 metal1 dnwell,isosub dwell 25.78
- defaultareacap allm1 metal1 nwell,obswell,pwell well 25.78
- defaultperimeter allm1 metal1 nwell,obswell,pwell well 40.57
- defaultoverlap allm1 metal1 nwell,obswell,pwell well 25.78
- defaultsideoverlap allm1 metal1 nwell,obswell,pwell well 40.57
+ defaultsidewall allm1 metal1 44.74
+ defaultareacap allm1 metal1 25.78
+ defaultperimeter allm1 metal1 40.57
+ defaultoverlap allm1 metal1 nwell,pwell well 25.78
+ defaultsideoverlap allm1 metal1 nwell,pwell well 40.57
#metal1->diff
defaultoverlap allm1 metal1 allactivenonfet active 25.78
@@ -5478,11 +5474,10 @@
# For ReRAM, all parasitics account for the additional 0.295um between
# metal1 and metal2
- defaultoverlap allm2 metal2 dnwell,isosub dwell 14.77
- defaultareacap allm2 metal2 nwell,obswell,pwell well 14.77
- defaultperimeter allm2 metal2 nwell,obswell,pwell well 32.92
- defaultoverlap allm2 metal2 nwell,obswell,pwell well 14.77
- defaultsideoverlap allm2 metal2 nwell,obswell,pwell well 32.92
+ defaultareacap allm2 metal2 14.77
+ defaultperimeter allm2 metal2 32.92
+ defaultoverlap allm2 metal2 nwell,pwell well 14.77
+ defaultsideoverlap allm2 metal2 nwell,pwell well 32.92
#metal2->diff
defaultoverlap allm2 metal2 allactivenonfet active 14.77
@@ -5504,11 +5499,10 @@
defaultsideoverlap allm1 metal1 allm2 metal2 23.03
#else (!RERAM)
- defaultoverlap allm2 metal2 dnwell,isosub dwell 16.94
- defaultareacap allm2 metal2 nwell,obswell,pwell well 16.94
- defaultperimeter allm2 metal2 nwell,obswell,pwell well 37.76
- defaultoverlap allm2 metal2 nwell,obswell,pwell well 16.94
- defaultsideoverlap allm2 metal2 nwell,obswell,pwell well 37.76
+ defaultareacap allm2 metal2 16.94
+ defaultperimeter allm2 metal2 37.76
+ defaultoverlap allm2 metal2 nwell,pwell well 16.94
+ defaultsideoverlap allm2 metal2 nwell,pwell well 37.76
#metal2->diff
defaultoverlap allm2 metal2 allactivenonfet active 16.94
@@ -5535,11 +5529,10 @@
defaultsidewall allm3 metal3 63.15
#ifdef RERAM
- defaultoverlap allm3 metal3 dnwell,isosub dwell 11.19
- defaultareacap allm3 metal3 nwell,obswell,pwell well 11.19
- defaultperimeter allm3 metal3 nwell,obswell,pwell well 37.07
- defaultoverlap allm3 metal3 nwell,obswell,pwell well 11.19
- defaultsideoverlap allm3 metal3 nwell,obswell,pwell well 37.07
+ defaultareacap allm3 metal3 11.19
+ defaultperimeter allm3 metal3 37.07
+ defaultoverlap allm3 metal3 nwell,pwell well 11.19
+ defaultsideoverlap allm3 metal3 nwell,pwell well 37.07
#metal3->diff
defaultoverlap allm3 metal3 allactive active 11.19
@@ -5561,11 +5554,10 @@
defaultsideoverlap allm1 metal1 allm3 metal3 20.83
#else (!RERAM)
- defaultoverlap allm3 metal3 dnwell,isosub dwell 12.37
- defaultareacap allm3 metal3 nwell,obswell,pwell well 12.37
- defaultperimeter allm3 metal3 nwell,obswell,pwell well 40.99
- defaultoverlap allm3 metal3 nwell,obswell,pwell well 12.37
- defaultsideoverlap allm3 metal3 nwell,obswell,pwell well 40.99
+ defaultareacap allm3 metal3 12.37
+ defaultperimeter allm3 metal3 40.99
+ defaultoverlap allm3 metal3 nwell,pwell well 12.37
+ defaultsideoverlap allm3 metal3 nwell,pwell well 40.99
#metal3->diff
defaultoverlap allm3 metal3 allactive active 12.37
@@ -5595,14 +5587,12 @@
#ifdef METAL5
#metal4
- defaultsidewall allm4 metal4 67.33
+ defaultsidewall allm4 metal4 67.33
#ifdef RERAM
-# defaultareacap alltopm metal4 well 7.84
- defaultoverlap allm4 metal4 dnwell,isosub dwell 7.84
- areacap allm4/m4 7.84
- defaultperimeter allm4 metal4 nwell,obswell,pwell well 34.17
- defaultoverlap allm4 metal4 nwell,obswell,pwell well 7.84
- defaultsideoverlap allm4 metal4 nwell,obswell,pwell well 34.17
+ defaultareacap allm4 metal4 7.84
+ defaultperimeter allm4 metal4 34.17
+ defaultoverlap allm4 metal4 nwell,pwell well 7.84
+ defaultsideoverlap allm4 metal4 nwell,pwell well 34.17
#metal4->diff
defaultoverlap allm4 metal4 allactivenonfet active 7.84
@@ -5624,12 +5614,10 @@
defaultsideoverlap allm1 metal1 allm4 metal4 14.54
#else (!RERAM)
-# defaultareacap alltopm metal4 well 8.42
- defaultoverlap allm4 metal4 dnwell,isosub dwell 8.42
- areacap allm4/m4 8.42
- defaultperimeter allm4 metal4 nwell,obswell,pwell well 36.68
- defaultoverlap allm4 metal4 nwell,obswell,pwell well 8.42
- defaultsideoverlap allm4 metal4 nwell,obswell,pwell well 36.68
+ defaultareacap allm4 metal4 8.42
+ defaultperimeter allm4 metal4 36.68
+ defaultoverlap allm4 metal4 nwell,pwell well 8.42
+ defaultsideoverlap allm4 metal4 nwell,pwell well 36.68
#metal4->diff
defaultoverlap allm4 metal4 allactivenonfet active 8.42
@@ -5663,14 +5651,12 @@
defaultsideoverlap allm3 metal3 allm4 metal4 42.64
#metal5
- defaultsidewall allm5 metal5 127.06
+ defaultsidewall allm5 metal5 127.06
#ifdef RERAM
-# defaultareacap allm5 metal5 well 5.99
- defaultoverlap allm5 metal5 dnwell,isosub dwell 5.99
- areacap allm5/m5 5.99
- defaultoverlap allm5 metal5 nwell,obswell,pwell well 5.99
- defaultperimeter allm5 metal5 nwell,obswell,pwell well 36.83
- defaultsideoverlap allm5 metal5 nwell,obswell,pwell well 36.83
+ defaultareacap allm5 metal5 5.99
+ defaultoverlap allm5 metal5 5.99
+ defaultperimeter allm5 metal5 nwell,pwell well 36.83
+ defaultsideoverlap allm5 metal5 nwell,pwell well 36.83
#metal5->diff
defaultoverlap allm5 metal5 allactivenonfet active 5.99
@@ -5692,12 +5678,10 @@
defaultsideoverlap allm1 metal1 allm5 metal5 11.12
#else (!RERAM)
-# defaultareacap allm5 metal5 well 6.32
- defaultoverlap allm5 metal5 dnwell,isosub dwell 6.32
- areacap allm5/m5 6.32
- defaultoverlap allm5 metal5 nwell,obswell,pwell well 6.32
- defaultperimeter allm5 metal5 nwell,obswell,pwell well 38.85
- defaultsideoverlap allm5 metal5 nwell,obswell,pwell well 38.85
+ defaultareacap allm5 metal5 6.32
+ defaultperimeter allm5 metal5 38.85
+ defaultoverlap allm5 metal5 nwell,pwell well 6.32
+ defaultsideoverlap allm5 metal5 nwell,pwell well 38.85
#metal5->diff
defaultoverlap allm5 metal5 allactivenonfet active 6.32