Added "extract -map %<design_name>"

This commit is contained in:
Clifford Wolf 2014-02-20 23:30:15 +01:00
parent 483c99fe46
commit 236fc4209c
1 changed files with 29 additions and 9 deletions

View File

@ -315,6 +315,10 @@ struct ExtractPass : public Pass {
log(" use the modules in this file as reference. This option can be used\n"); log(" use the modules in this file as reference. This option can be used\n");
log(" multiple times.\n"); log(" multiple times.\n");
log("\n"); log("\n");
log(" -map %%<design-name>\n");
log(" use the modules in this in-memory design as reference. This option can\n");
log(" be used multiple times.\n");
log("\n");
log(" -verbose\n"); log(" -verbose\n");
log(" print debug output while analyzing\n"); log(" print debug output while analyzing\n");
log("\n"); log("\n");
@ -524,16 +528,32 @@ struct ExtractPass : public Pass {
if (!mine_mode) if (!mine_mode)
{ {
map = new RTLIL::Design; map = new RTLIL::Design;
for (auto &filename : map_filenames) { for (auto &filename : map_filenames)
FILE *f = fopen(filename.c_str(), "rt"); {
if (f == NULL) if (filename.substr(0, 1) == "%")
log_cmd_error("Can't open map file `%s'.\n", filename.c_str()); {
Frontend::frontend_call(map, f, filename, (filename.size() > 3 && filename.substr(filename.size()-3) == ".il") ? "ilang" : "verilog"); if (!saved_designs.count(filename.substr(1))) {
fclose(f); delete map;
log_cmd_error("Can't saved design `%s'.\n", filename.c_str()+1);
}
for (auto &it : saved_designs.at(filename.substr(1))->modules)
if (!map->modules.count(it.first))
map->modules[it.first] = it.second->clone();
}
else
{
FILE *f = fopen(filename.c_str(), "rt");
if (f == NULL) {
delete map;
log_cmd_error("Can't open map file `%s'.\n", filename.c_str());
}
Frontend::frontend_call(map, f, filename, (filename.size() > 3 && filename.substr(filename.size()-3) == ".il") ? "ilang" : "verilog");
fclose(f);
if (filename.size() <= 3 || filename.substr(filename.size()-3) != ".il") { if (filename.size() <= 3 || filename.substr(filename.size()-3) != ".il") {
Pass::call(map, "proc"); Pass::call(map, "proc");
Pass::call(map, "opt_clean"); Pass::call(map, "opt_clean");
}
} }
} }
} }