3 from .back
import rtlil
, verilog
, pysim
9 def main_parser(parser
=None):
11 parser
= argparse
.ArgumentParser()
13 p_action
= parser
.add_subparsers(dest
="action")
15 p_generate
= p_action
.add_parser("generate",
16 help="generate RTLIL or Verilog from the design")
17 p_generate
.add_argument("-t", "--type", dest
="generate_type",
18 metavar
="LANGUAGE", choices
=["il", "v"],
20 help="generate LANGUAGE (il for RTLIL, v for Verilog; default: %(default)s)")
21 p_generate
.add_argument("generate_file",
22 metavar
="FILE", type=argparse
.FileType("w"), nargs
="?",
23 help="write generated code to FILE")
25 p_simulate
= p_action
.add_parser(
26 "simulate", help="simulate the design")
27 p_simulate
.add_argument("-v", "--vcd-file",
28 metavar
="VCD-FILE", type=argparse
.FileType("w"),
29 help="write execution trace to VCD-FILE")
30 p_simulate
.add_argument("-w", "--gtkw-file",
31 metavar
="GTKW-FILE", type=argparse
.FileType("w"),
32 help="write GTKWave configuration to GTKW-FILE")
33 p_simulate
.add_argument("-p", "--period", dest
="sync_period",
34 metavar
="TIME", type=float, default
=1e-6,
35 help="set 'sync' clock domain period to TIME (default: %(default)s)")
36 p_simulate
.add_argument("-c", "--clocks", dest
="sync_clocks",
37 metavar
="COUNT", type=int, required
=True,
38 help="simulate for COUNT 'sync' clock periods")
43 def main_runner(parser
, args
, design
, platform
=None, name
="top", ports
=()):
44 if args
.action
== "generate":
45 fragment
= design
.get_fragment(platform
=platform
)
46 generate_type
= args
.generate_type
47 if generate_type
is None and args
.generate_file
:
48 if args
.generate_file
.name
.endswith(".v"):
50 if args
.generate_file
.name
.endswith(".il"):
52 if generate_type
is None:
53 parser
.error("specify file type explicitly with -t")
54 if generate_type
== "il":
55 output
= rtlil
.convert(fragment
, name
=name
, ports
=ports
)
56 if generate_type
== "v":
57 output
= verilog
.convert(fragment
, name
=name
, ports
=ports
)
58 if args
.generate_file
:
59 args
.generate_file
.write(output
)
63 if args
.action
== "simulate":
64 fragment
= design
.get_fragment(platform
=platform
)
65 with pysim
.Simulator(fragment
,
66 vcd_file
=args
.vcd_file
,
67 gtkw_file
=args
.gtkw_file
,
69 sim
.add_clock(args
.sync_period
)
70 sim
.run_until(args
.sync_period
* args
.sync_clocks
, run_passive
=True)
73 def main(*args
, **kwargs
):
74 parser
= main_parser()
75 main_runner(parser
, parser
.parse_args(), *args
, **kwargs
)