synth: add k-LUT mode.

This commit is contained in:
whitequark 2019-01-02 08:25:03 +00:00
parent fdff32dd73
commit 18174202a9
1 changed files with 36 additions and 2 deletions

View File

@ -51,6 +51,9 @@ struct SynthPass : public ScriptPass
log(" -encfile <file>\n"); log(" -encfile <file>\n");
log(" passed to 'fsm_recode' via 'fsm'\n"); log(" passed to 'fsm_recode' via 'fsm'\n");
log("\n"); log("\n");
log(" -lut <k>\n");
log(" perform synthesis for a k-LUT architecture.\n");
log("\n");
log(" -nofsm\n"); log(" -nofsm\n");
log(" do not run FSM optimization\n"); log(" do not run FSM optimization\n");
log("\n"); log("\n");
@ -80,6 +83,7 @@ struct SynthPass : public ScriptPass
string top_module, fsm_opts, memory_opts; string top_module, fsm_opts, memory_opts;
bool autotop, flatten, noalumacc, nofsm, noabc, noshare; bool autotop, flatten, noalumacc, nofsm, noabc, noshare;
int lut;
void clear_flags() YS_OVERRIDE void clear_flags() YS_OVERRIDE
{ {
@ -89,6 +93,7 @@ struct SynthPass : public ScriptPass
autotop = false; autotop = false;
flatten = false; flatten = false;
lut = 0;
noalumacc = false; noalumacc = false;
nofsm = false; nofsm = false;
noabc = false; noabc = false;
@ -130,6 +135,10 @@ struct SynthPass : public ScriptPass
flatten = true; flatten = true;
continue; continue;
} }
if (args[argidx] == "-lut") {
lut = atoi(args[++argidx].c_str());
continue;
}
if (args[argidx] == "-nofsm") { if (args[argidx] == "-nofsm") {
nofsm = true; nofsm = true;
continue; continue;
@ -192,6 +201,10 @@ struct SynthPass : public ScriptPass
run("check"); run("check");
run("opt"); run("opt");
run("wreduce"); run("wreduce");
if (help_mode)
run("techmap -map +/cmp2lut.v", " (if -lut)");
else
run(stringf("techmap -map +/cmp2lut.v -D LUT_WIDTH=%d", lut));
if (!noalumacc) if (!noalumacc)
run("alumacc", " (unless -noalumacc)"); run("alumacc", " (unless -noalumacc)");
if (!noshare) if (!noshare)
@ -210,12 +223,33 @@ struct SynthPass : public ScriptPass
run("memory_map"); run("memory_map");
run("opt -full"); run("opt -full");
run("techmap"); run("techmap");
if (help_mode)
{
run("techmap -map +/gate2lut.v", "(if -noabc and -lut)");
run("clean; opt_lut", " (if -noabc and -lut)");
}
else if (noabc && lut)
{
run(stringf("techmap -map +/gate2lut.v -D LUT_WIDTH=%d", lut));
run("clean; opt_lut");
}
run("opt -fast"); run("opt -fast");
if (!noabc) { if (!noabc) {
#ifdef YOSYS_ENABLE_ABC #ifdef YOSYS_ENABLE_ABC
run("abc -fast", "(unless -noabc)"); if (help_mode)
run("opt -fast", "(unless -noabc)"); {
run("abc -fast", " (unless -noabc, unless -lut)");
run("abc -fast -lut k", "(unless -noabc, if -lut)");
}
else
{
if (lut)
run(stringf("abc -fast -lut %d", lut));
else
run("abc -fast");
}
run("opt -fast", " (unless -noabc)");
#endif #endif
} }
} }