Merge pull request #1019 from YosysHQ/clifford/fix1016

Add "wreduce -keepdc"
This commit is contained in:
Clifford Wolf 2019-05-22 13:29:04 +02:00 committed by GitHub
commit 5c164d0863
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 13 additions and 3 deletions

View File

@ -29,6 +29,7 @@ PRIVATE_NAMESPACE_BEGIN
struct WreduceConfig struct WreduceConfig
{ {
pool<IdString> supported_cell_types; pool<IdString> supported_cell_types;
bool keepdc = false;
WreduceConfig() WreduceConfig()
{ {
@ -82,7 +83,7 @@ struct WreduceWorker
SigBit ref = sig_a[i]; SigBit ref = sig_a[i];
for (int k = 0; k < GetSize(sig_s); k++) { for (int k = 0; k < GetSize(sig_s); k++) {
if (ref != Sx && sig_b[k*GetSize(sig_a) + i] != Sx && ref != sig_b[k*GetSize(sig_a) + i]) if ((config->keepdc || (ref != Sx && sig_b[k*GetSize(sig_a) + i] != Sx)) && ref != sig_b[k*GetSize(sig_a) + i])
goto no_match_ab; goto no_match_ab;
if (sig_b[k*GetSize(sig_a) + i] != Sx) if (sig_b[k*GetSize(sig_a) + i] != Sx)
ref = sig_b[k*GetSize(sig_a) + i]; ref = sig_b[k*GetSize(sig_a) + i];
@ -495,6 +496,9 @@ struct WreducePass : public Pass {
log(" Do not change the width of memory address ports. Use this options in\n"); log(" Do not change the width of memory address ports. Use this options in\n");
log(" flows that use the 'memory_memx' pass.\n"); log(" flows that use the 'memory_memx' pass.\n");
log("\n"); log("\n");
log(" -keepdc\n");
log(" Do not optimize explicit don't-care values.\n");
log("\n");
} }
void execute(std::vector<std::string> args, Design *design) YS_OVERRIDE void execute(std::vector<std::string> args, Design *design) YS_OVERRIDE
{ {
@ -509,6 +513,10 @@ struct WreducePass : public Pass {
opt_memx = true; opt_memx = true;
continue; continue;
} }
if (args[argidx] == "-keepdc") {
config.keepdc = true;
continue;
}
break; break;
} }
extra_args(args, argidx, design); extra_args(args, argidx, design);

View File

@ -195,9 +195,11 @@ struct PrepPass : public ScriptPass
run(nokeepdc ? "opt" : "opt -keepdc"); run(nokeepdc ? "opt" : "opt -keepdc");
if (!ifxmode) { if (!ifxmode) {
if (help_mode) if (help_mode)
run("wreduce [-memx]"); run("wreduce -keepdc [-memx]");
else else if (nokeepdc)
run(memxmode ? "wreduce -memx" : "wreduce"); run(memxmode ? "wreduce -memx" : "wreduce");
else
run(memxmode ? "wreduce -keepdc -memx" : "wreduce -keepdc");
} }
if (!nomemmode) { if (!nomemmode) {
run(string("memory_dff") + (help_mode ? " [-nordff]" : nordff ? " -nordff" : "")); run(string("memory_dff") + (help_mode ? " [-nordff]" : nordff ? " -nordff" : ""));