3 from collections
import OrderedDict
4 from importlib
import import_module
, resources
7 from nmigen
.build
import *
10 __all__
= ["CXXRTLPlatform"]
13 class CXXRTLPlatform(TemplatedPlatform
):
18 Resource("clk", 0, Pins("clk", dir="i"), Clock(5e6
)),
19 Resource("rst", 0, Pins("rst", dir="i")),
22 toolchain
= None # selected when creating platform
25 **TemplatedPlatform
.build_script_templates
,
32 {% for file in platform.iter_files(".v") -%}
33 read_verilog {{get_override("read_verilog_opts")|options}} {{file}}
35 {% for file in platform.iter_files(".sv") -%}
36 read_verilog {{get_override("read_verilog_opts")|options}} {{file}}
38 {% for file in platform.iter_files(".il") -%}
41 read_ilang {{name}}.il
42 delete w:$verilog_initial_trigger
43 {{get_override("script_after_read")|default("# (script_after_read placeholder)")}}
44 write_cxxrtl {{get_override("write_cxxrtl_opts")|options}} -header {{name}}.cc
49 CPPFLAGS = -Ilambdasoc.sim/include -include {{name}}.h -MMD \
50 -I{{get_override("yosys_include_dir")|default("/usr/local/share/yosys/include")}} \
51 {{get_override("additional_cpp_flags")|default("# (additional_cpp_flags placeholder)")}}
52 CXXFLAGS = {{get_override("cxx_flags")|default("-std=c++14 -Wall -O3 -mtune=native")}}
53 LDFLAGS = {{get_override("ld_flags")|default("# (ld_flags placeholder)")}}
54 LDLIBS = {{get_override("ld_libs")|default("# (ld_libs placeholder)")}}
57 {% for file in platform.iter_files(".cc") %}
70 {% set tab = ""|indent(width="\t", first=True) -%}
72 {% for file in platform.iter_files(".v", ".sv", ".il") %}
73 {{name}}.cc {{name}}.h: {{file}}
75 {{name}}.cc {{name}}.h: {{name}}.ys {{name}}.il
76 {{tab}}$(YOSYS) -s {{name}}.ys
78 {{name}}_driver.o: CPPFLAGS += -DCXXRTL_TOP='cxxrtl_design::p_{{name}}'
82 {{name}}_driver: $(OBJS)
85 {{tab}}rm -f {{name}}.cc {{name}}.h
86 {{tab}}rm -f $(OBJS) $(DEPS)
87 {{tab}}rm -f {{name}}_driver
93 _gcc_required_tools
= [
98 _gcc_command_templates
= [
100 YOSYS={{invoke_tool("yosys")}}
101 CXX={{invoke_tool("g++")}}
102 {{invoke_tool("make")}} -f {{name}}.mk
108 _clang_required_tools
= [
113 _clang_command_templates
= [
115 YOSYS={{invoke_tool("yosys")}}
116 CXX={{invoke_tool("clang++")}}
117 {{invoke_tool("make")}} -f {{name}}.mk
121 def __init__(self
, *, toolchain
="clang"):
124 assert toolchain
in ("gcc", "clang")
125 self
.toolchain
= toolchain
128 def required_tools(self
):
129 if self
.toolchain
== "gcc":
130 return self
._gcc
_required
_tools
131 if self
.toolchain
== "clang":
132 return self
._clang
_required
_tools
136 def command_templates(self
):
137 if self
.toolchain
== "gcc":
138 return self
._gcc
_command
_templates
139 if self
.toolchain
== "clang":
140 return self
._clang
_command
_templates
143 def create_missing_domain(self
, name
):
146 clk_i
= self
.request(self
.default_clk
).i
147 rst_i
= self
.request(self
.default_rst
).i
148 m
.domains
.sync
= ClockDomain("sync")
150 ClockSignal("sync").eq(clk_i
),
151 ResetSignal("sync").eq(rst_i
),
155 def toolchain_prepare(self
, fragment
, name
="top", blackboxes
=None, **kwargs
):
156 if blackboxes
is None:
157 blackboxes
= OrderedDict()
159 def get_cxxrtl_src(package
):
160 cxxrtl_src
= OrderedDict()
161 assert hasattr(package
, "cxxrtl_src_files")
162 for module
, subdirs
, src_file
in package
.cxxrtl_src_files
:
163 src_contents
= resources
.read_text(module
, src_file
)
164 src_path
= "/".join((package
.__name
__, *subdirs
, src_file
))
165 cxxrtl_src
[src_path
] = src_contents
169 f
"{name}_driver.cc": resources
.read_text(__package__
, "top_driver.cc"),
170 **get_cxxrtl_src(sys
.modules
[__package__
]),
173 for blackbox_name
, driver_name
in blackboxes
.items():
174 blackbox
= import_module(blackbox_name
)
175 blackbox_contents
= resources
.read_text(blackbox
, "blackbox.v")
176 blackbox_path
= f
"{blackbox_name}/blackbox.v"
177 self
.add_file(blackbox_path
, blackbox_contents
)
179 driver
= import_module(f
"{blackbox_name}.drivers.{driver_name}")
180 cxxrtl_src
.update(get_cxxrtl_src(driver
))
182 for cxxrtl_src_path
, cxxrtl_src_contents
in cxxrtl_src
.items():
183 self
.add_file(cxxrtl_src_path
, cxxrtl_src_contents
)
185 return super().toolchain_prepare(fragment
, name
=name
, **kwargs
)