Added "wreduce -memx"

This commit is contained in:
Clifford Wolf 2016-08-20 12:52:50 +02:00
parent 15ef608453
commit d77a914683
2 changed files with 20 additions and 5 deletions

View File

@ -366,15 +366,26 @@ struct WreducePass : public Pass {
log(" assign y = a + b + c + 1;\n"); log(" assign y = a + b + c + 1;\n");
log(" endmodule\n"); log(" endmodule\n");
log("\n"); log("\n");
log("Options:\n");
log("\n");
log(" -memx\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("\n");
} }
virtual void execute(std::vector<std::string> args, Design *design) virtual void execute(std::vector<std::string> args, Design *design)
{ {
WreduceConfig config; WreduceConfig config;
bool opt_memx = false;
log_header(design, "Executing WREDUCE pass (reducing word size of cells).\n"); log_header(design, "Executing WREDUCE pass (reducing word size of cells).\n");
size_t argidx; size_t argidx;
for (argidx = 1; argidx < args.size(); argidx++) { for (argidx = 1; argidx < args.size(); argidx++) {
if (args[argidx] == "-memx") {
opt_memx = true;
continue;
}
break; break;
} }
extra_args(args, argidx, design); extra_args(args, argidx, design);
@ -397,12 +408,12 @@ struct WreducePass : public Pass {
module->connect(sig, Const(0, GetSize(sig))); module->connect(sig, Const(0, GetSize(sig)));
} }
} }
if (c->type.in("$memrd", "$memwr", "$meminit")) { if (!opt_memx && c->type.in("$memrd", "$memwr", "$meminit")) {
IdString memid = c->getParam("\\MEMID").decode_string(); IdString memid = c->getParam("\\MEMID").decode_string();
RTLIL::Memory *mem = module->memories.at(memid); RTLIL::Memory *mem = module->memories.at(memid);
if (mem->start_offset == 0) { if (mem->start_offset >= 0) {
int cur_addrbits = c->getParam("\\ABITS").as_int(); int cur_addrbits = c->getParam("\\ABITS").as_int();
int max_addrbits = ceil_log2(mem->size); int max_addrbits = ceil_log2(mem->start_offset + mem->size);
if (cur_addrbits > max_addrbits) { if (cur_addrbits > max_addrbits) {
log("Removed top %d address bits (of %d) from memory %s port %s.%s (%s).\n", log("Removed top %d address bits (of %d) from memory %s port %s.%s (%s).\n",
cur_addrbits-max_addrbits, cur_addrbits, cur_addrbits-max_addrbits, cur_addrbits,

View File

@ -173,8 +173,12 @@ struct PrepPass : public ScriptPass
run("opt_clean"); run("opt_clean");
run("check"); run("check");
run("opt -keepdc"); run("opt -keepdc");
if (!ifxmode) if (!ifxmode) {
run("wreduce"); if (help_mode)
run("wreduce [-memx]");
else
run(memxmode ? "wreduce -memx" : "wreduce");
}
run("memory_dff" + (help_mode ? " [-nordff]" : memory_opts)); run("memory_dff" + (help_mode ? " [-nordff]" : memory_opts));
if (help_mode || memxmode) if (help_mode || memxmode)
run("memory_memx", "(if -memx)"); run("memory_memx", "(if -memx)");