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)