@@ -156,6 +156,14 @@ template<class NodePrinter> struct CxxPrintVisitor : public FunctionalIR::Abstra
156
156
void memory_write (Node, Node mem, Node addr, Node data) override { print (" {}.write({}, {})" , mem, addr, data); }
157
157
};
158
158
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
+
159
167
struct CxxModule {
160
168
FunctionalIR ir;
161
169
CxxStruct input_struct, output_struct, state_struct;
@@ -193,11 +201,16 @@ struct CxxModule {
193
201
if (sort.is_signal ())
194
202
f.print (" \t state.{} = {};\n " , state_struct[name], cxx_const (ir.get_initial_state_signal (name)));
195
203
else if (sort.is_memory ()) {
204
+ f.print (" \t {{\n " );
205
+ f.print (" \t\t std::array<Signal<{}>, {}> mem;\n " , sort.data_width (), 1 <<sort.addr_width ());
196
206
const auto &contents = ir.get_initial_state_memory (name);
197
- f.print (" \t state.{}. fill({});\n " , state_struct[name] , cxx_const (contents.default_value ()));
207
+ f.print (" \t\t mem. fill({});\n " , cxx_const (contents.default_value ()));
198
208
for (auto range : contents)
199
209
for (auto addr = range.base (); addr < range.limit (); addr++)
200
- f.print (" \t state.{}[{}] = {};\n " , state_struct[name], addr, cxx_const (range[addr]));
210
+ if (!equal_def (range[addr], contents.default_value ()))
211
+ f.print (" \t\t mem[{}] = {};\n " , addr, cxx_const (range[addr]));
212
+ f.print (" \t\t state.{} = mem;\n " , state_struct[name]);
213
+ f.print (" \t }}\n " );
201
214
}
202
215
}
203
216
f.print (" }}\n\n " );
0 commit comments