Added script to fix the issue with incorrect device names for the parasitic diode and shorting resistor in the skywater-pdk digital standard cell repositories.
diff --git a/VERSION b/VERSION index ad18496..15bcce9 100644 --- a/VERSION +++ b/VERSION
@@ -1 +1 @@ -1.0.160 +1.0.161
diff --git a/sky130/Makefile.in b/sky130/Makefile.in index 9b821e2..3aecb93 100644 --- a/sky130/Makefile.in +++ b/sky130/Makefile.in
@@ -827,6 +827,7 @@ -techlef %l/latest/tech/*.tlef \ -spice %l/latest/cells/*/*.spice compile-only \ sort=custom/scripts/sort_pdkfiles.py \ + filter=custom/scripts/fix_device_models.py \ -cdl %l/latest/cells/*/*.cdl ignore=topography compile-only \ sort=custom/scripts/sort_pdkfiles.py \ -lef %l/latest/cells/*/*.magic.lef compile-only \
diff --git a/sky130/custom/scripts/fix_device_models.py b/sky130/custom/scripts/fix_device_models.py new file mode 100755 index 0000000..90a8434 --- /dev/null +++ b/sky130/custom/scripts/fix_device_models.py
@@ -0,0 +1,97 @@ +#!/usr/bin/env python3 +# +# fix_device_models --- +# +# This script fixes the issue where devices in the digital libraries did +# not get the proper name conversion; specifically, the "conb" cell has +# resistor type "short" which should be "sky130_fd_pr__res_generic_po", +# and the pw2nd device model name is missing the suffix "_05v5". +# +# This script is a filter to be run by setting the name of this script as +# the value to "filter=" for the model install in the sky130 Makefile. + +import re +import os +import sys + +def filter(inname, outname): + + # Read input + try: + with open(inname, 'r') as inFile: + stext = inFile.read() + slines = stext.splitlines() + except: + print('fix_device_models.py: failed to open ' + fnmIn + ' for reading.', file=sys.stderr) + return 1 + + # Process input with regexp + + fixedlines = [] + modified = False + + dioderex = re.compile('.*[ \t]+sky130_fd_pr__diode_pw2nd[ \t]+') + shortrex = re.compile('.*[ \t]+short[ \t]+') + + for line in slines: + + # Check for incorrect diode reference + dmatch = dioderex.match(line) + # Check for incorrect resistor reference + smatch = shortrex.match(line) + if dmatch: + fixedlines.append(re.sub('pw2nd', 'pw2nd_05v5', line)) + modified = True + elif smatch: + fixedlines.append(re.sub('short', 'sky130_fd_pr__res_generic_po', line)) + modified = True + else: + fixedlines.append(line) + + # Write output + if outname == None: + for i in fixedlines: + print(i) + else: + # If the output is a symbolic link but no modifications have been made, + # then leave it alone. If it was modified, then remove the symbolic + # link before writing. + if os.path.islink(outname): + if not modified: + return 0 + else: + os.unlink(outname) + try: + with open(outname, 'w') as outFile: + for i in fixedlines: + print(i, file=outFile) + except: + print('fix_device_models.py: failed to open ' + outname + ' for writing.', file=sys.stderr) + return 1 + + +if __name__ == '__main__': + + # This script expects to get one or two arguments. One argument is + # mandatory and is the input file. The other argument is optional and + # is the output file. The output file and input file may be the same + # name, in which case the original input is overwritten. + + options = [] + arguments = [] + for item in sys.argv[1:]: + if item.find('-', 0) == 0: + options.append(item[1:]) + else: + arguments.append(item) + + if len(arguments) > 0: + infilename = arguments[0] + + if len(arguments) > 1: + outfilename = arguments[1] + else: + outfilename = None + + result = filter(infilename, outfilename) + sys.exit(result)