假设有如下filelist(test.f):
`ifdef STUB_LPDDR
debug point0
`else
`ifndef FPGA
`ifdef HAPS
debug point1
`else
debug point2
`endif
debug point3
`ifndef LPDDR
debug point4
`else
debug point5
`endif
`else
`ifndef LPDDR
debug point6
`ifdef HAPS
debug point11
`else
debug point22
`endif
`else
debug point7
-f ${SOC_VV_DIR}/etc/flist/soc_tb.f
`endif
debug point8
`endif
`endif
可以看到为不同的场景,定义了不同的选项,可以使用下面的python脚本来打平整个filelist:
import os
import sys
def parse_file(file_path, defines):
lines = []
condition_stack = []
current_include = True
with open(file_path, 'r') as file:
for line in file:
stripped_line = line.strip()
if not stripped_line:
continue
stripped_line = os.path.expandvars(stripped_line)
#print("debug point line0", stripped_line)
if stripped_line.startswith('`ifdef'):
condition = stripped_line.split()[1]
condition_stack.append(current_include)
current_include = current_include and (condition in defines)
#print("debug point current_include0", current_include, condition in defines, condition, defines)
elif stripped_line.startswith('`ifndef'):
condition = stripped_line.split()[1]
condition_stack.append(current_include)
current_include = current_include and (condition not in defines)
#print("debug point current_include1", current_include)
elif stripped_line.startswith('`else'):
if condition_stack:
previous_include = condition_stack[-1]
current_include = previous_include and not current_include
elif stripped_line.startswith('`endif'):
if condition_stack:
current_include = condition_stack.pop()
elif stripped_line.startswith('-f'):
included_file = stripped_line.split()[1]
if current_include:
lines.extend(parse_file(included_file, defines))
else:
#print("debug point current_include3", current_include)
if current_include:
#print("debug point line1", stripped_line)
lines.append(stripped_line)
return lines
def main():
if '-f' not in sys.argv or '-o' not in sys.argv:
#print("Usage: python flatf.py -f <input_file> -o <output_file> -define <definitions>")
return
input_file = sys.argv[sys.argv.index('-f') + 1]
output_file = sys.argv[sys.argv.index('-o') + 1]
if '-define' in sys.argv:
define_index = sys.argv.index('-define') + 1
defines = set()
while define_index < len(sys.argv) and not sys.argv[define_index].startswith('-'):
defines.add(sys.argv[define_index])
define_index += 1
else:
defines = set()
#print("debug point defines", defines)
expanded_lines = parse_file(input_file, defines)
with open(output_file, 'w') as file:
for line in expanded_lines:
file.write(line + '\n')
if __name__ == "__main__":
main()
使用方法如下:-define必须放在最后
python3 test.py -f test.f -o output.f -define FPGA LPDDR HAPS