diff options
author | whitequark <whitequark@whitequark.org> | 2020-04-17 09:43:13 +0000 |
---|---|---|
committer | whitequark <whitequark@whitequark.org> | 2020-04-17 09:43:13 +0000 |
commit | e7ad209b15490c512049310643fdf137a4be1687 (patch) | |
tree | 0f425c53f2eec0387b78d920b00d75b727d7d841 | |
parent | 115fc261e60ebcd0456e26aac452942137db1ca9 (diff) | |
download | yosys-e7ad209b15490c512049310643fdf137a4be1687.tar.gz yosys-e7ad209b15490c512049310643fdf137a4be1687.tar.bz2 yosys-e7ad209b15490c512049310643fdf137a4be1687.zip |
cxxrtl: correctly handle `sync always` rules.
Fixes #1948.
-rw-r--r-- | backends/cxxrtl/cxxrtl.cc | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/backends/cxxrtl/cxxrtl.cc b/backends/cxxrtl/cxxrtl.cc index e4fa430f3..b210b9e7f 100644 --- a/backends/cxxrtl/cxxrtl.cc +++ b/backends/cxxrtl/cxxrtl.cc @@ -1076,24 +1076,34 @@ struct CxxrtlWorker { log_assert(proc->root_case.attributes.empty()); dump_case_rule(&proc->root_case); for (auto sync : proc->syncs) { - RTLIL::SigBit sync_bit = sync->signal[0]; - sync_bit = sigmaps[sync_bit.wire->module](sync_bit); + RTLIL::SigBit sync_bit; + if (!sync->signal.empty()) { + sync_bit = sync->signal[0]; + sync_bit = sigmaps[sync_bit.wire->module](sync_bit); + } pool<std::string> events; switch (sync->type) { case RTLIL::STp: + log_assert(sync_bit.wire != nullptr); events.insert("posedge_" + mangle(sync_bit)); break; case RTLIL::STn: + log_assert(sync_bit.wire != nullptr); events.insert("negedge_" + mangle(sync_bit)); + break; case RTLIL::STe: + log_assert(sync_bit.wire != nullptr); events.insert("posedge_" + mangle(sync_bit)); events.insert("negedge_" + mangle(sync_bit)); break; + case RTLIL::STa: + events.insert("true"); + break; + case RTLIL::ST0: case RTLIL::ST1: - case RTLIL::STa: case RTLIL::STg: case RTLIL::STi: log_assert(false); |