Corrects an error in the verilog where an `endif is followed by text not within a comment in the sky130_fd_sc_hd verilog library.
diff --git a/VERSION b/VERSION index 03dfe29..fa8ad76 100644 --- a/VERSION +++ b/VERSION
@@ -1 +1 @@ -1.0.364 +1.0.365
diff --git a/sky130/Makefile.in b/sky130/Makefile.in index 727de74..a0cfd35 100644 --- a/sky130/Makefile.in +++ b/sky130/Makefile.in
@@ -1407,6 +1407,7 @@ rename=primitives filter=custom/scripts/inc_verilog.py \ sort=../common/sort_pdkfiles.py \ -verilog %l/latest/cells/*/*.*.v \ + filter=custom/scripts/fix_verilog.py \ -verilog %l/latest/cells/*/*.v exclude=*.*.v,primitives.v \ compile-only filter=custom/scripts/inc_verilog.py \ sort=../common/sort_pdkfiles.py \
diff --git a/sky130/custom/scripts/fix_verilog.py b/sky130/custom/scripts/fix_verilog.py new file mode 100755 index 0000000..90162f0 --- /dev/null +++ b/sky130/custom/scripts/fix_verilog.py
@@ -0,0 +1,91 @@ +#!/usr/bin/env python3 +# +# fix_verilog --- +# +# The script catches an error in the lpflow_bleeder cell where a +# comment is missing after an `endif. +# +# 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: + vtext = inFile.read() + vlines = vtext.splitlines() + except: + print('fix_verilog.py: failed to open ' + inname + ' for reading.', file=sys.stderr) + return 1 + + # Check if input file is a base cell or strength-specific cell, and + # check if it has a "specify" block file. To enable this, change + # dospecify from False to True. + dospecify = False + + # Process input with regexp + + fixedlines = [] + modified = False + endifrex = re.compile('[ \t]*`endif[ \t]+SKY') + + for line in vlines: + ematch = endifrex.match(line) + if ematch: + fixedlines.append(line.replace('endif SKY', 'endif // SKY')) + 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_verilog.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)