Added code to the process_params.py script to catch about a dozen
or so parameter names in parameters/critical.spice that shadow
device names. ngspice does a search-and-replace for parameters
so these will destroy the simulation. They are not even used in
the models as far as I could discover, so just removing them
seems to be the right approach.
diff --git a/sky130/custom/scripts/process_params.py b/sky130/custom/scripts/process_params.py
index ca0f95a..64647c4 100755
--- a/sky130/custom/scripts/process_params.py
+++ b/sky130/custom/scripts/process_params.py
@@ -25,6 +25,17 @@
filelist = []
+# Manual hack---flag all parameters that have the same name as devices.
+# These parameters are unused and must be deleted.
+
+excludelist = ['sky130_fd_pr__nfet_20v0_nvt', 'sky130_fd_pr__nfet_20v0_nvt_iso',
+ 'sky130_fd_pr__nfet_20v0', 'sky130_fd_pr__nfet_20v0_iso',
+ 'sky130_fd_pr__nfet_20v0_zvt', 'sky130_fd_pr__pfet_20v0',
+ 'sky130_fd_pr__nfet_01v8_lvt', 'sky130_fd_pr__special_nfet_pass_lvt',
+ 'sky130_fd_pr__nfet_g5v0d16v0', 'sky130_fd_pr__pfet_01v8_mvt',
+ 'sky130_fd_pr__pnp_05v5_W0p68L0p68', 'sky130_fd_pr__pfet_01v8',
+ 'sky130_fd_pr__pfet_g5v0d16v0']
+
#--------------------------------------------------------------------
# Step 1. Gather variables
#--------------------------------------------------------------------
@@ -57,12 +68,27 @@
if 'vary' in tokens:
if ('dist=gauss' in tokens) or ('gauss' in tokens):
process_param = tokens[2]
- std_dev = float(tokens[-1].split('=')[-1])
- replacement = ' + {}*AGAUSS(0,{!s},1)'.format(pr_switch_param, std_dev)
+ # Issue: There are improper parameters that
+ # shadow device names. They are not used and
+ # should be detected and elminated.
+ if (process_param in excludelist):
+ print('Found parameter ' + process_param + ' that shadows a device name.')
+ replacement = ''
+ else:
+ std_dev = float(tokens[-1].split('=')[-1])
+ replacement = ' + {}*AGAUSS(0,{!s},1)'.format(pr_switch_param, std_dev)
process_params.append((process_param, replacement))
infile.close()
+# Sort the process parameters so that names that are subsets of other
+# names appear later in the list.
+
+def getKey(item):
+ return item[0]
+
+process_params.sort(reverse=True, key=getKey)
+
print('')
print('Process parameters found:')
for (process_param, addendum) in process_params:
@@ -98,10 +124,13 @@
if pmatch:
newline = line
for (param, replacement) in process_params:
- if param in newline:
- newline = newline.strip('\n') + replacement + '\n'
+ if ' ' + param + ' ' in newline:
replaced_something = True
- print(" Line {}: Found process parameter '{}' and appended '{}'.".format(line_number, param, replacement))
+ if replacement == '':
+ newline = '** ' + newline
+ else:
+ newline = newline.strip('\n') + replacement + '\n'
+ print(" Line {}: Found process parameter '{}' and appended '{}'.".format(line_number, param, replacement))
outfile.write(newline)
else:
outfile.write(line)