aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorMarcelina Koƛcielnicka <mwk@0x04.net>2020-07-24 17:01:26 +0200
committerMarcelina Koƛcielnicka <mwk@0x04.net>2020-07-30 20:22:03 +0200
commit4a05cad7f8a6ee57292e5360eb06305e13fc308b (patch)
tree4db43827dc141b4f916f3fd20d595b63da9d1ffc /kernel
parentaf6623ebb86e796dfe4c122f03890e0788399af0 (diff)
downloadyosys-4a05cad7f8a6ee57292e5360eb06305e13fc308b.tar.gz
yosys-4a05cad7f8a6ee57292e5360eb06305e13fc308b.tar.bz2
yosys-4a05cad7f8a6ee57292e5360eb06305e13fc308b.zip
async2sync: Support all FF types.
Diffstat (limited to 'kernel')
-rw-r--r--kernel/ff.h46
1 files changed, 46 insertions, 0 deletions
diff --git a/kernel/ff.h b/kernel/ff.h
index 8dc83eb49..0aecbaa2a 100644
--- a/kernel/ff.h
+++ b/kernel/ff.h
@@ -323,6 +323,52 @@ struct FfData {
return res;
}
+ void unmap_ce(Module *module) {
+ if (!has_en)
+ return;
+ log_assert(has_clk);
+ if (has_srst && ce_over_srst)
+ unmap_srst(module);
+
+ if (!is_fine) {
+ if (pol_en)
+ sig_d = module->Mux(NEW_ID, sig_q, sig_d, sig_en);
+ else
+ sig_d = module->Mux(NEW_ID, sig_d, sig_q, sig_en);
+ } else {
+ if (pol_en)
+ sig_d = module->MuxGate(NEW_ID, sig_q, sig_d, sig_en);
+ else
+ sig_d = module->MuxGate(NEW_ID, sig_d, sig_q, sig_en);
+ }
+ has_en = false;
+ }
+
+ void unmap_srst(Module *module) {
+ if (!has_srst)
+ return;
+ if (has_en && !ce_over_srst)
+ unmap_ce(module);
+
+ if (!is_fine) {
+ if (pol_srst)
+ sig_d = module->Mux(NEW_ID, sig_d, val_srst, sig_srst);
+ else
+ sig_d = module->Mux(NEW_ID, val_srst, sig_d, sig_srst);
+ } else {
+ if (pol_srst)
+ sig_d = module->MuxGate(NEW_ID, sig_d, val_srst[0], sig_srst);
+ else
+ sig_d = module->MuxGate(NEW_ID, val_srst[0], sig_d, sig_srst);
+ }
+ has_srst = false;
+ }
+
+ void unmap_ce_srst(Module *module) {
+ unmap_ce(module);
+ unmap_srst(module);
+ }
+
Cell *emit(Module *module, IdString name) {
if (!width)
return nullptr;