Skip to content

Commit 547b3e4

Browse files
committed
functional backend: make Memory in the C++ simulation library read-only again
1 parent a468cf3 commit 547b3e4

File tree

2 files changed

+17
-5
lines changed

2 files changed

+17
-5
lines changed

backends/functional/cxx.cc

+15-2
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,14 @@ template<class NodePrinter> struct CxxPrintVisitor : public FunctionalIR::Abstra
156156
void memory_write(Node, Node mem, Node addr, Node data) override { print("{}.write({}, {})", mem, addr, data); }
157157
};
158158

159+
bool equal_def(RTLIL::Const const &a, RTLIL::Const const &b) {
160+
if(a.size() != b.size()) return false;
161+
for(int i = 0; i < a.size(); i++)
162+
if((a[i] == State::S1) != (b[i] == State::S1))
163+
return false;
164+
return true;
165+
}
166+
159167
struct CxxModule {
160168
FunctionalIR ir;
161169
CxxStruct input_struct, output_struct, state_struct;
@@ -193,11 +201,16 @@ struct CxxModule {
193201
if (sort.is_signal())
194202
f.print("\tstate.{} = {};\n", state_struct[name], cxx_const(ir.get_initial_state_signal(name)));
195203
else if (sort.is_memory()) {
204+
f.print("\t{{\n");
205+
f.print("\t\tstd::array<Signal<{}>, {}> mem;\n", sort.data_width(), 1<<sort.addr_width());
196206
const auto &contents = ir.get_initial_state_memory(name);
197-
f.print("\tstate.{}.fill({});\n", state_struct[name], cxx_const(contents.default_value()));
207+
f.print("\t\tmem.fill({});\n", cxx_const(contents.default_value()));
198208
for(auto range : contents)
199209
for(auto addr = range.base(); addr < range.limit(); addr++)
200-
f.print("\tstate.{}[{}] = {};\n", state_struct[name], addr, cxx_const(range[addr]));
210+
if(!equal_def(range[addr], contents.default_value()))
211+
f.print("\t\tmem[{}] = {};\n", addr, cxx_const(range[addr]));
212+
f.print("\t\tstate.{} = mem;\n", state_struct[name]);
213+
f.print("\t}}\n");
201214
}
202215
}
203216
f.print("}}\n\n");

backends/functional/cxx_runtime/sim.h

+2-3
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,8 @@ template<size_t a, size_t d>
400400
class Memory {
401401
std::array<Signal<d>, 1<<a> _contents;
402402
public:
403+
Memory() {}
404+
Memory(std::array<Signal<d>, 1<<a> const &contents) : _contents(contents) {}
403405
Signal<d> read(Signal<a> addr) const
404406
{
405407
return _contents[addr.template as_numeric<size_t>()];
@@ -410,9 +412,6 @@ class Memory {
410412
ret._contents[addr.template as_numeric<size_t>()] = data;
411413
return ret;
412414
}
413-
// mutating methods for initializing a state
414-
void fill(Signal<d> data) { _contents.fill(data); }
415-
Signal<d> &operator[](Signal<a> addr) { return _contents[addr.template as_numeric<size_t>()]; }
416415
};
417416

418417
#endif

0 commit comments

Comments
 (0)