soc/add_sdcard: add with_emulator parameter to use SDCard emulator (from Google Proje...
[litex.git] / litex / tools / litex_read_verilog.py
1 #!/usr/bin/env python3
2
3 # This file is Copyright (c) 2018-2019 Florent Kermarrec <florent@enjoy-digital.fr>
4 # License: BSD
5
6 import os
7 import sys
8 import json
9
10 from litex.build import tools
11
12 def main():
13 if len(sys.argv) < 2:
14 print("usage: litex_read_verilog verilog_file [module]")
15 exit(1)
16
17 verilog_file = sys.argv[1]
18 json_file = verilog_file + ".json"
19 module = None if len(sys.argv) < 3 else sys.argv[2]
20
21 # use yosys to convert verilog to json
22 yosys_v2j = "\n".join([
23 "read_verilog -sv {}".format(verilog_file),
24 "write_json {}.json".format(verilog_file)
25 ])
26 tools.write_to_file("yosys_v2j.ys", yosys_v2j)
27 os.system("yosys -q yosys_v2j.ys")
28
29 # load json and convert to migen module
30 f = open(json_file, "r")
31 j = json.load(f)
32
33 # create list of modules
34 modules = [module] if module is not None else j["modules"].keys()
35
36 # create migen definitions
37 for module in modules:
38 migen_def = []
39 migen_def.append("class {}(Module):".format(module))
40 migen_def.append(" "*4 + "def __init__(self):")
41 for name, info in j["modules"][module]["ports"].items():
42 length = "" if len(info["bits"]) == 1 else len(info["bits"])
43 migen_def.append(" " * 8 + "self.{} = Signal({})".format(name, length))
44 migen_def.append("")
45 migen_def.append(" "*8 + "# # #")
46 migen_def.append("")
47 migen_def.append(" "*8 + "self.specials += Instance(\"{}\",".format(module))
48 for name, info in j["modules"][module]["ports"].items():
49 io_prefix = {
50 "input": "i",
51 "output": "o",
52 "inout": "io"
53 }[info["direction"]]
54 migen_def.append(" "*12 + "{}_{}=self.{},".format(io_prefix, name, name))
55 migen_def.append(" "*8 + ")")
56 migen_def.append("")
57 print("\n".join(migen_def))
58
59 # keep things clean after us
60 os.system("rm yosys_v2j.ys")
61 os.system("rm " + json_file)
62
63
64 if __name__ == "__main__":
65 main()