blob: 746a06f86385faced7d8fe9dfa9bbce84bbc07a5 [file] [log] [blame]
#!/usr/bin/env python3
#
# Remove timing information from a verilog file, which is everything between
# the keywords "specify" and "endspecify".
#
# Filter a verilog file to remove any backslash continuation lines, which
# iverilog does not parse. If targetroot is a directory, then find and
# process all files in the path of targetroot. If any file to be processed
# is unmodified (has no backslash continuation lines), then ignore it. If
# any file is a symbolic link and gets modified, then remove the symbolic
# link before overwriting with the modified file.
#
import stat
import sys
import os
import re
def makeuserwritable(filepath):
if os.path.exists(filepath):
st = os.stat(filepath)
os.chmod(filepath, st.st_mode | stat.S_IWUSR)
def remove_specify(vfile, outfile):
modified = False
with open(vfile, 'r') as ifile:
vtext = ifile.read()
if outfile == None:
outfile = vfile
# Remove backslash-followed-by-newline and absorb initial whitespace. It
# is unclear what initial whitespace means in this context, as the use-
# case that has been seen seems to work under the assumption that leading
# whitespace is ignored up to the amount used by the last indentation.
vlines = re.sub('\\\\\n[ \t]*', '', vtext)
specrex = re.compile('\n[ \t]*specify[ \t\n]+')
endspecrex = re.compile('\n[ \t]*endspecify')
smatch = specrex.search(vlines)
while smatch:
specstart = smatch.start()
specpos = smatch.end()
ematch = endspecrex.search(vlines[specpos:])
specend = ematch.end()
vtemp = vlines[0:specstart + 1] + vlines[specpos + specend + 1:]
vlines = vtemp
smatch = specrex.search(vlines)
if vlines != vtext:
# File contents have been modified, so if this file was a symbolic
# link, then remove it. Otherwise, overwrite the file with the
# modified contents.
if outfile == vfile:
if os.path.islink(vfile):
os.unlink(vfile)
if os.path.exists(outfile):
makeuserwritable(outfile)
with open(outfile, 'w') as ofile:
ofile.write(vlines)
elif outfile != vfile:
if os.path.exists(outfile):
makeuserwritable(outfile)
with open(outfile, 'w') as ofile:
ofile.write(vlines)
# If called as main, run remove_specify
if __name__ == '__main__':
# Divide up command line into options and arguments
options = []
arguments = []
for item in sys.argv[1:]:
if item.find('-', 0) == 0:
options.append(item)
else:
arguments.append(item)
# Need one argument: path to verilog netlist
# If two arguments, then 2nd argument is the output file.
if len(arguments) == 2:
netlist_path = arguments[0]
output_path = arguments[1]
remove_specify(netlist_path, output_path)
elif len(arguments) != 1:
print("Usage: remove_spcify.py <file_path> [<output_path>]")
elif len(arguments) == 1:
netlist_path = arguments[0]
remove_specify(netlist_path, None)