diff options
author | whitequark <whitequark@whitequark.org> | 2020-12-02 23:35:54 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-02 23:35:54 +0000 |
commit | 98f7b435b0b7bdf9f2beb0ee9cc561afb39a619c (patch) | |
tree | 9eab3cb2f4156d555750daf1c5a8c8fb1873252f /backends/cxxrtl/cxxrtl_backend.cc | |
parent | 90724ea9e7bc5872dd8412521399221722756c4e (diff) | |
parent | 5beab5bc17f9fa1f2340b491e073cfb973ad2e2b (diff) | |
download | yosys-98f7b435b0b7bdf9f2beb0ee9cc561afb39a619c.tar.gz yosys-98f7b435b0b7bdf9f2beb0ee9cc561afb39a619c.tar.bz2 yosys-98f7b435b0b7bdf9f2beb0ee9cc561afb39a619c.zip |
Merge pull request #2466 from whitequark/cxxrtl-reset
cxxrtl: provide a way to perform unobtrusive power-on reset
Diffstat (limited to 'backends/cxxrtl/cxxrtl_backend.cc')
-rw-r--r-- | backends/cxxrtl/cxxrtl_backend.cc | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/backends/cxxrtl/cxxrtl_backend.cc b/backends/cxxrtl/cxxrtl_backend.cc index a48ea5b23..aab415720 100644 --- a/backends/cxxrtl/cxxrtl_backend.cc +++ b/backends/cxxrtl/cxxrtl_backend.cc @@ -1869,6 +1869,46 @@ struct CxxrtlWorker { } if (has_cells) f << "\n"; + f << indent << mangle(module) << "() {}\n"; + if (has_cells) { + f << indent << mangle(module) << "(adopt, " << mangle(module) << " other) :\n"; + bool first = true; + for (auto cell : module->cells()) { + if (is_internal_cell(cell->type)) + continue; + if (first) { + first = false; + } else { + f << ",\n"; + } + RTLIL::Module *cell_module = module->design->module(cell->type); + if (cell_module->get_bool_attribute(ID(cxxrtl_blackbox))) { + f << indent << " " << mangle(cell) << "(std::move(other." << mangle(cell) << "))"; + } else { + f << indent << " " << mangle(cell) << "(adopt {}, std::move(other." << mangle(cell) << "))"; + } + } + f << " {\n"; + inc_indent(); + for (auto cell : module->cells()) { + if (is_internal_cell(cell->type)) + continue; + RTLIL::Module *cell_module = module->design->module(cell->type); + if (cell_module->get_bool_attribute(ID(cxxrtl_blackbox))) + f << indent << mangle(cell) << "->reset();\n"; + } + dec_indent(); + f << indent << "}\n"; + } else { + f << indent << mangle(module) << "(adopt, " << mangle(module) << " other) {}\n"; + } + f << "\n"; + f << indent << "void reset() override {\n"; + inc_indent(); + f << indent << "*this = " << mangle(module) << "(adopt {}, std::move(*this));\n"; + dec_indent(); + f << indent << "}\n"; + f << "\n"; f << indent << "bool eval() override;\n"; f << indent << "bool commit() override;\n"; if (debug_info) |