3
0
Fork 0
mirror of https://github.com/YosysHQ/yosys synced 2025-04-24 01:25:33 +00:00
This commit is contained in:
Andrew Zonenberg 2016-04-24 22:11:56 -07:00
commit d57c85111f
6 changed files with 169 additions and 78 deletions

View file

@ -25,22 +25,11 @@
USING_YOSYS_NAMESPACE
PRIVATE_NAMESPACE_BEGIN
bool check_label(bool &active, std::string run_from, std::string run_to, std::string label)
struct PrepPass : public ScriptPass
{
if (!run_from.empty() && run_from == run_to) {
active = (label == run_from);
} else {
if (label == run_from)
active = true;
if (label == run_to)
active = false;
}
return active;
}
PrepPass() : ScriptPass("prep", "generic synthesis script") { }
struct PrepPass : public Pass {
PrepPass() : Pass("prep", "generic synthesis script") { }
virtual void help()
virtual void help() YS_OVERRIDE
{
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
log("\n");
@ -53,6 +42,10 @@ struct PrepPass : public Pass {
log(" -top <module>\n");
log(" use the specified module as top module (default='top')\n");
log("\n");
log(" -flatten\n");
log(" flatten the design before synthesis. this will pass '-auto-top' to\n");
log(" 'hierarchy' if no top module is specified.\n");
log("\n");
log(" -nordff\n");
log(" passed to 'memory_dff'. prohibits merging of FFs into memory read ports\n");
log("\n");
@ -63,31 +56,23 @@ struct PrepPass : public Pass {
log("\n");
log("\n");
log("The following commands are executed by this synthesis command:\n");
log("\n");
log(" begin:\n");
log(" hierarchy -check [-top <top>]\n");
log("\n");
log(" prep:\n");
log(" proc\n");
log(" opt_expr -keepdc\n");
log(" opt_clean\n");
log(" check\n");
log(" opt -keepdc\n");
log(" wreduce\n");
log(" memory_dff [-nordff]\n");
log(" opt_clean\n");
log(" memory_collect\n");
log(" opt -keepdc -fast\n");
log("\n");
log(" check:\n");
log(" stat\n");
log(" check\n");
help_script();
log("\n");
}
virtual void execute(std::vector<std::string> args, RTLIL::Design *design)
string top_module, fsm_opts, memory_opts;
bool flatten;
virtual void clear_flags() YS_OVERRIDE
{
std::string top_module, memory_opts;
std::string run_from, run_to;
top_module.clear();
memory_opts.clear();
flatten = false;
}
virtual void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE
{
string run_from, run_to;
size_t argidx;
for (argidx = 1; argidx < args.size(); argidx++)
@ -107,6 +92,10 @@ struct PrepPass : public Pass {
}
continue;
}
if (args[argidx] == "-flatten") {
flatten = true;
continue;
}
if (args[argidx] == "-nordff") {
memory_opts += " -nordff";
continue;
@ -118,41 +107,54 @@ struct PrepPass : public Pass {
if (!design->full_selection())
log_cmd_error("This comannd only operates on fully selected designs!\n");
bool active = run_from.empty();
log_header(design, "Executing PREP pass.\n");
log_push();
if (check_label(active, run_from, run_to, "begin"))
{
if (top_module.empty())
Pass::call(design, stringf("hierarchy -check"));
else
Pass::call(design, stringf("hierarchy -check -top %s", top_module.c_str()));
}
if (check_label(active, run_from, run_to, "coarse"))
{
Pass::call(design, "proc");
Pass::call(design, "opt_expr -keepdc");
Pass::call(design, "opt_clean");
Pass::call(design, "check");
Pass::call(design, "opt -keepdc");
Pass::call(design, "wreduce");
Pass::call(design, "memory_dff" + memory_opts);
Pass::call(design, "opt_clean");
Pass::call(design, "memory_collect");
Pass::call(design, "opt -keepdc -fast");
}
if (check_label(active, run_from, run_to, "check"))
{
Pass::call(design, "stat");
Pass::call(design, "check");
}
run_script(design, run_from, run_to);
log_pop();
}
virtual void script() YS_OVERRIDE
{
if (check_label("begin"))
{
if (help_mode) {
run("hierarchy -check [-top <top>]");
} else {
if (top_module.empty()) {
if (flatten)
run("hierarchy -check -auto-top");
else
run("hierarchy -check");
} else
run(stringf("hierarchy -check -top %s", top_module.c_str()));
}
}
if (check_label("coarse"))
{
run("proc");
if (help_mode || flatten)
run("flatten", "(if -flatten)");
run("opt_expr -keepdc");
run("opt_clean");
run("check");
run("opt -keepdc");
run("wreduce");
run("memory_dff" + (help_mode ? " [-nordff]" : memory_opts));
run("opt_clean");
run("memory_collect");
run("opt -keepdc -fast");
}
if (check_label("check"))
{
run("stat");
run("check");
}
}
} PrepPass;
PRIVATE_NAMESPACE_END

View file

@ -41,6 +41,10 @@ struct SynthPass : public ScriptPass
log(" -top <module>\n");
log(" use the specified module as top module (default='top')\n");
log("\n");
log(" -flatten\n");
log(" flatten the design before synthesis. this will pass '-auto-top' to\n");
log(" 'hierarchy' if no top module is specified.\n");
log("\n");
log(" -encfile <file>\n");
log(" passed to 'fsm_recode' via 'fsm'\n");
log("\n");
@ -68,8 +72,8 @@ struct SynthPass : public ScriptPass
log("\n");
}
std::string top_module, fsm_opts, memory_opts;
bool noalumacc, nofsm, noabc;
string top_module, fsm_opts, memory_opts;
bool flatten, noalumacc, nofsm, noabc;
virtual void clear_flags() YS_OVERRIDE
{
@ -77,6 +81,7 @@ struct SynthPass : public ScriptPass
fsm_opts.clear();
memory_opts.clear();
flatten = false;
noalumacc = false;
nofsm = false;
noabc = false;
@ -109,6 +114,10 @@ struct SynthPass : public ScriptPass
}
continue;
}
if (args[argidx] == "-flatten") {
flatten = true;
continue;
}
if (args[argidx] == "-nofsm") {
nofsm = true;
continue;
@ -147,9 +156,12 @@ struct SynthPass : public ScriptPass
if (help_mode) {
run("hierarchy -check [-top <top>]");
} else {
if (top_module.empty())
run(stringf("hierarchy -check"));
else
if (top_module.empty()) {
if (flatten)
run("hierarchy -check -auto-top");
else
run("hierarchy -check");
} else
run(stringf("hierarchy -check -top %s", top_module.c_str()));
}
}
@ -157,6 +169,8 @@ struct SynthPass : public ScriptPass
if (check_label("coarse"))
{
run("proc");
if (help_mode || flatten)
run("flatten", "(if -flatten)");
run("opt_expr");
run("opt_clean");
run("check");