mirror of https://github.com/YosysHQ/yosys.git
Added "wreduce -memx"
This commit is contained in:
parent
15ef608453
commit
d77a914683
|
@ -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,
|
||||||
|
|
|
@ -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)");
|
||||||
|
|
Loading…
Reference in New Issue