Added processing to the SRAM core device model files to remove parameters that are both unnecessary/unused and incompatible with Xyce.
diff --git a/VERSION b/VERSION index 0bc56ce..8e8f9d4 100644 --- a/VERSION +++ b/VERSION
@@ -1 +1 @@ -1.0.212 +1.0.213
diff --git a/sky130/Makefile.in b/sky130/Makefile.in index d08e32d..8af2b50 100644 --- a/sky130/Makefile.in +++ b/sky130/Makefile.in
@@ -881,6 +881,17 @@ ./custom/scripts/xyce_hack.py \ ${STAGING_PATH}/${SKY130A}/libs.ref/${PR_SPICE}/sky130_fd_pr__res_iso_pw.model.spice \ 2>&1 | tee -a ${SKY130A}_make.log || true + # Custom: Remove ACM model parameters from BSIM3 devices + ./custom/scripts/xyce_hack2.py \ + ${STAGING_PATH}/${SKY130A}/libs.ref/${PR_SPICE}/sky130_fd_pr__special_nfet_pass.pm3.spice \ + 2>&1 | tee -a ${SKY130A}_make.log || true + ./custom/scripts/xyce_hack2.py \ + ${STAGING_PATH}/${SKY130A}/libs.ref/${PR_SPICE}/sky130_fd_pr__special_pfet_pass.pm3.spice \ + 2>&1 | tee -a ${SKY130A}_make.log || true + ./custom/scripts/xyce_hack2.py \ + ${STAGING_PATH}/${SKY130A}/libs.ref/${PR_SPICE}/sky130_fd_pr__special_nfet_latch.pm3.spice \ + 2>&1 | tee -a ${SKY130A}_make.log || true + # Custom: Make corrections/additions so sky130.lib.spice ./custom/scripts/build_lib_spice.py \ ${STAGING_PATH}/${SKY130A}/libs.tech/ngspice/sky130.lib.spice \
diff --git a/sky130/custom/scripts/xyce_hack2.py b/sky130/custom/scripts/xyce_hack2.py new file mode 100755 index 0000000..5d8f1a0 --- /dev/null +++ b/sky130/custom/scripts/xyce_hack2.py
@@ -0,0 +1,59 @@ +#!/usr/bin/env python3 +# +#-------------------------------------------------------------------- +# Workaround for the problem that xyce does not ignore ACM model +# parameters passed to bsim3 models, and throws an error. These +# parameters have no known effect on simulation and therefore +# should be removed. +#-------------------------------------------------------------------- + +import os +import re +import sys + +plist = ["ldif", "hdif", "rd", "rs", "rsc", "rdc", "nqsmod"] +regexps = [] +for parm in plist: + regexps.append(re.compile('^\+[ \t]*' + parm + '[ \t]*=[ \t]*0.0', re.IGNORECASE)) + +if len(sys.argv) <= 1: + print('Usage: xyce_hack2.py <path_to_file>') + sys.exit(1) + +else: + infile_name = sys.argv[1] + + filepath = os.path.split(infile_name)[0] + outfile_name = os.path.join(filepath, 'temp') + + infile = open(infile_name, 'r') + outfile = open(outfile_name, 'w') + + line_number = 0 + replaced_something = False + for line in infile: + line_number += 1 + + for rex in regexps: + rmatch = rex.match(line) + if rmatch: + # If a match is found, comment out the line. + replaced_something = True + break + + if rmatch: + newline = re.sub('^\+', '* +', line) + else: + newline = line + + outfile.write(newline) + + infile.close() + outfile.close() + if replaced_something: + print("Something was replaced in '{}'".format(infile_name)) + os.rename(outfile_name, infile_name) + else: + print("Nothing was replaced in '{}'.".format(infile_name)) + os.remove(outfile_name) +