aboutsummaryrefslogtreecommitdiffstats
path: root/passes/sat/async2sync.cc
diff options
context:
space:
mode:
authorMarcelina Koƛcielnicka <mwk@0x04.net>2020-07-19 03:25:30 +0200
committerMarcelina Koƛcielnicka <mwk@0x04.net>2020-07-24 11:22:31 +0200
commitbd959d5d9ee1c0eda1921b737ba0c09dd8b2d62f (patch)
tree0b05e1352685d7d2bce1417d52e63aec1f02a97f /passes/sat/async2sync.cc
parentc9251eb26b131c0d6d21d152a9a40fc162703b64 (diff)
downloadyosys-bd959d5d9ee1c0eda1921b737ba0c09dd8b2d62f.tar.gz
yosys-bd959d5d9ee1c0eda1921b737ba0c09dd8b2d62f.tar.bz2
yosys-bd959d5d9ee1c0eda1921b737ba0c09dd8b2d62f.zip
async2sync: Refactor to use FfInitVals.
Diffstat (limited to 'passes/sat/async2sync.cc')
-rw-r--r--passes/sat/async2sync.cc64
1 files changed, 11 insertions, 53 deletions
diff --git a/passes/sat/async2sync.cc b/passes/sat/async2sync.cc
index 6fc480925..970469fa0 100644
--- a/passes/sat/async2sync.cc
+++ b/passes/sat/async2sync.cc
@@ -19,6 +19,7 @@
#include "kernel/yosys.h"
#include "kernel/sigtools.h"
+#include "kernel/ffinit.h"
USING_YOSYS_NAMESPACE
PRIVATE_NAMESPACE_BEGIN
@@ -62,19 +63,7 @@ struct Async2syncPass : public Pass {
for (auto module : design->selected_modules())
{
SigMap sigmap(module);
- dict<SigBit, State> initbits;
- pool<SigBit> del_initbits;
-
- for (auto wire : module->wires())
- if (wire->attributes.count(ID::init) > 0)
- {
- Const initval = wire->attributes.at(ID::init);
- SigSpec initsig = sigmap(wire);
-
- for (int i = 0; i < GetSize(initval) && i < GetSize(initsig); i++)
- if (initval[i] == State::S0 || initval[i] == State::S1)
- initbits[initsig[i]] = initval[i];
- }
+ FfInitVals initvals(&sigmap, module);
for (auto cell : vector<Cell*>(module->selected_cells()))
{
@@ -93,16 +82,12 @@ struct Async2syncPass : public Pass {
log_id(module), log_id(cell), log_id(cell->type),
log_signal(sig_arst), log_signal(sig_d), log_signal(sig_q));
- Const init_val;
- for (int i = 0; i < GetSize(sig_q); i++) {
- SigBit bit = sigmap(sig_q[i]);
- init_val.bits.push_back(initbits.count(bit) ? initbits.at(bit) : State::Sx);
- del_initbits.insert(bit);
- }
+ Const init_val = initvals(sig_q);
+ initvals.remove_init(sig_q);
Wire *new_d = module->addWire(NEW_ID, GetSize(sig_d));
Wire *new_q = module->addWire(NEW_ID, GetSize(sig_q));
- new_q->attributes[ID::init] = init_val;
+ initvals.set_init(new_q, init_val);
if (arst_pol) {
module->addMux(NEW_ID, sig_d, arst_val, sig_arst, new_d);
@@ -137,16 +122,12 @@ struct Async2syncPass : public Pass {
log_id(module), log_id(cell), log_id(cell->type),
log_signal(sig_set), log_signal(sig_clr), log_signal(sig_d), log_signal(sig_q));
- Const init_val;
- for (int i = 0; i < GetSize(sig_q); i++) {
- SigBit bit = sigmap(sig_q[i]);
- init_val.bits.push_back(initbits.count(bit) ? initbits.at(bit) : State::Sx);
- del_initbits.insert(bit);
- }
+ Const init_val = initvals(sig_q);
+ initvals.remove_init(sig_q);
Wire *new_d = module->addWire(NEW_ID, GetSize(sig_d));
Wire *new_q = module->addWire(NEW_ID, GetSize(sig_q));
- new_q->attributes[ID::init] = init_val;
+ initvals.set_init(new_q, init_val);
if (!set_pol)
sig_set = module->Not(NEW_ID, sig_set);
@@ -182,15 +163,11 @@ struct Async2syncPass : public Pass {
log_id(module), log_id(cell), log_id(cell->type),
log_signal(sig_en), log_signal(sig_d), log_signal(sig_q));
- Const init_val;
- for (int i = 0; i < GetSize(sig_q); i++) {
- SigBit bit = sigmap(sig_q[i]);
- init_val.bits.push_back(initbits.count(bit) ? initbits.at(bit) : State::Sx);
- del_initbits.insert(bit);
- }
+ Const init_val = initvals(sig_q);
+ initvals.remove_init(sig_q);
Wire *new_q = module->addWire(NEW_ID, GetSize(sig_q));
- new_q->attributes[ID::init] = init_val;
+ initvals.set_init(new_q, init_val);
if (en_pol) {
module->addMux(NEW_ID, new_q, sig_d, sig_en, sig_q);
@@ -206,25 +183,6 @@ struct Async2syncPass : public Pass {
continue;
}
}
-
- for (auto wire : module->wires())
- if (wire->attributes.count(ID::init) > 0)
- {
- bool delete_initattr = true;
- Const initval = wire->attributes.at(ID::init);
- SigSpec initsig = sigmap(wire);
-
- for (int i = 0; i < GetSize(initval) && i < GetSize(initsig); i++)
- if (del_initbits.count(initsig[i]) > 0)
- initval[i] = State::Sx;
- else if (initval[i] != State::Sx)
- delete_initattr = false;
-
- if (delete_initattr)
- wire->attributes.erase(ID::init);
- else
- wire->attributes.at(ID::init) = initval;
- }
}
}
} Async2syncPass;