use DFS to recursively search and expand includes in a single pass

This commit is contained in:
Brandon Whitchurch
2024-06-13 09:13:05 -07:00
parent feeab6b93b
commit e4e49ef898

View File

@@ -61,25 +61,22 @@ def find_include(file_name, inc_dirs):
return None
def process(in_fname, out_fname, inc_dirs=None):
def process_helper(in_fname, out_f, inc_dirs, replaced_includes):
"""
Replace include directives in a file with the full include file.
Args:
in_fname (str): input file name
out_fname (str): output file name
inc_dirs (list): list of directories to search for includes
Helper function to DFS through include files and replace includes.
"""
replaced_includes = set()
print(f"DFS state: {replaced_includes}")
include_regex = re.compile(r"^ *`include +\"(.*)\"")
# slurp the input file.
# this avoids having a bunch of fds open during recursion
with open(in_fname, "r", encoding="utf-8") as in_file:
with open(out_fname, "w", encoding="utf-8") as out_file:
# for each include found, search through all dirs
# and replace if found, error if not
for num, line in enumerate(in_file, 1):
match = re.match(r"^ *`include +\"(.*)\"", line)
lines = in_file.readlines()
for num, line in enumerate(lines, 1):
match = re.match(include_regex, line)
if not match or match.group(1) == "uvm_macros.svh":
# copy the line as is
out_file.write(line)
out_f.write(line)
continue
if match.group(1) in replaced_includes:
print_info("Skipping duplicate include")
@@ -90,9 +87,22 @@ def process(in_fname, out_fname, inc_dirs=None):
)
# search for include and replace
inc_file_name = find_include(match.group(1), inc_dirs)
with open(inc_file_name, "r", encoding="utf-8") as inc_file:
out_file.writelines(inc_file)
replaced_includes.add(match.group(1))
process_helper(inc_file_name, out_f, inc_dirs, replaced_includes)
def process(in_fname, out_fname, inc_dirs=None):
"""
Replace include directives in a file with the full include file.
Args:
in_fname (str): input file name
out_fname (str): output file name
inc_dirs (list): list of directories to search for includes
"""
replaced_includes = set()
with open(out_fname, "w", encoding="utf-8") as out_file:
process_helper(in_fname, out_file, inc_dirs, replaced_includes)
def main():