prjpeppercorn/tools/extract_constids.py

70 lines
2.1 KiB
Python

import argparse
import sys
import os
import die
consts = set()
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('-yosys', dest='yosys', type=str,
help="Yosys share directory", default="/usr/local/share/yosys")
parser.add_argument('-o', '--outfile', dest='outfile', type=argparse.FileType('w'),
help="output HTML file")
def export_name(name,fout):
if name not in consts and "[" not in name:
print(f"X({name})", file=fout)
consts.add(name)
else:
print(f"//X({name})", file=fout)
def parse_line(item,fout):
line = item.strip().split()
if len(line)==0:
return
if line[0] == "module":
name = line[1].split("(")[0]
print(f"// primitive {name}", file=fout)
export_name(name, fout)
elif line[0] == "parameter":
name = line[1]
if name.startswith("["):
name = line[2]
export_name(name, fout)
elif line[0] in ["input", "output" ,"inout"]:
items = " ".join(line[1:]).strip().split(",")
for it in items:
if "=" in it:
it = it[:it.find("=")].strip()
name = it.split(" ")[-1].strip()
if len(name)>0:
export_name(name, fout)
elif line[0].startswith("endmodule"):
print(file=fout)
def main(argv):
args = parser.parse_args(argv[1:])
fout = args.outfile
print("// autogenerated items", file=fout)
with open(os.path.join(args.yosys, "gatemate", "cells_sim.v"), "r") as f:
for item in f:
parse_line(item,fout)
with open(os.path.join(args.yosys, "gatemate", "cells_bb.v"), "r") as f:
for item in f:
parse_line(item,fout)
for name,v in die.PRIMITIVES_PINS.items():
print(f"// hardware primitive {name}", file=fout)
export_name(name, fout)
print(f"// {name} pins", file=fout)
for pin in v:
export_name(pin.name, fout)
print(file=fout)
print("// end of autogenerated items", file=fout)
print(file=fout)
if __name__ == "__main__":
main(sys.argv)