3
0
Fork 0
mirror of https://github.com/YosysHQ/yosys synced 2025-04-13 04:28:18 +00:00

Add "muxcover -freedecode"

Signed-off-by: Clifford Wolf <clifford@clifford.at>
This commit is contained in:
Clifford Wolf 2019-06-21 10:02:10 +02:00
parent 891ea6512e
commit 9286b6f013

View file

@ -57,6 +57,7 @@ struct MuxcoverWorker
bool use_mux8; bool use_mux8;
bool use_mux16; bool use_mux16;
bool nodecode; bool nodecode;
bool freedecode;
bool nopartial; bool nopartial;
int cost_mux2; int cost_mux2;
@ -70,6 +71,7 @@ struct MuxcoverWorker
use_mux8 = false; use_mux8 = false;
use_mux16 = false; use_mux16 = false;
nodecode = false; nodecode = false;
freedecode = false;
nopartial = false; nopartial = false;
cost_mux2 = COST_MUX2; cost_mux2 = COST_MUX2;
cost_mux4 = COST_MUX4; cost_mux4 = COST_MUX4;
@ -178,6 +180,9 @@ struct MuxcoverWorker
if (A == State::Sx || B == State::Sx) if (A == State::Sx || B == State::Sx)
return 0; return 0;
if (freedecode)
return 0;
return std::max((cost_mux2 / GetSize(std::get<1>(entry))) - 1, 1); return std::max((cost_mux2 / GetSize(std::get<1>(entry))) - 1, 1);
} }
@ -620,6 +625,9 @@ struct MuxcoverPass : public Pass {
log(" substitutions, but guarantees that the resulting circuit is not\n"); log(" substitutions, but guarantees that the resulting circuit is not\n");
log(" less efficient than the original circuit.\n"); log(" less efficient than the original circuit.\n");
log("\n"); log("\n");
log(" -freedecode\n");
log(" Do not count cost for generated decode logic\n");
log("\n");
log(" -nopartial\n"); log(" -nopartial\n");
log(" Do not consider mappings that use $_MUX<N>_ to select from less\n"); log(" Do not consider mappings that use $_MUX<N>_ to select from less\n");
log(" than <N> different signals.\n"); log(" than <N> different signals.\n");
@ -633,6 +641,7 @@ struct MuxcoverPass : public Pass {
bool use_mux8 = false; bool use_mux8 = false;
bool use_mux16 = false; bool use_mux16 = false;
bool nodecode = false; bool nodecode = false;
bool freedecode = false;
bool nopartial = false; bool nopartial = false;
int cost_mux4 = COST_MUX4; int cost_mux4 = COST_MUX4;
int cost_mux8 = COST_MUX8; int cost_mux8 = COST_MUX8;
@ -670,6 +679,10 @@ struct MuxcoverPass : public Pass {
nodecode = true; nodecode = true;
continue; continue;
} }
if (arg == "-freedecode") {
freedecode = true;
continue;
}
if (arg == "-nopartial") { if (arg == "-nopartial") {
nopartial = true; nopartial = true;
continue; continue;
@ -694,6 +707,7 @@ struct MuxcoverPass : public Pass {
worker.cost_mux8 = cost_mux8; worker.cost_mux8 = cost_mux8;
worker.cost_mux16 = cost_mux16; worker.cost_mux16 = cost_mux16;
worker.nodecode = nodecode; worker.nodecode = nodecode;
worker.freedecode = freedecode;
worker.nopartial = nopartial; worker.nopartial = nopartial;
worker.run(); worker.run();
} }