share codepath for scratchpad argument handling with command arguments

This commit is contained in:
N. Engelhardt 2020-01-03 14:11:41 +01:00
parent 341fd872b5
commit b2ad781b07
1 changed files with 84 additions and 40 deletions

View File

@ -332,10 +332,6 @@ void abc9_module(RTLIL::Design *design, RTLIL::Module *current_module, std::stri
abc9_script += script_file[i];
} else
abc9_script += stringf("source %s", script_file.c_str());
} else if (design->scratchpad.count("abc9.script")) {
abc9_script += design->scratchpad_get_string("abc9.script");
} else if (design->scratchpad.count("abc9.scriptfile")) {
abc9_script += stringf("source %s", design->scratchpad_get_string("abc9.scriptfile").c_str());
} else if (!lut_costs.empty() || !lut_file.empty()) {
//bool all_luts_cost_same = true;
//for (int this_cost : lut_costs)
@ -956,6 +952,42 @@ struct Abc9Pass : public Pass {
#endif
#endif
// get arguments from scratchpad first, then override by command arguments
std::string lut_arg, luts_arg;
if (design->scratchpad.count("abc9.script")) {
script_file = design->scratchpad_get_string("abc9.script");
}
if (design->scratchpad.count("abc9.D")) {
delay_target = "-D " + design->scratchpad_get_string("abc9.D");
}
if (design->scratchpad.count("abc9.lut")) {
lut_arg = design->scratchpad_get_string("abc9.lut");
}
if (design->scratchpad.count("abc9.luts")) {
luts_arg = design->scratchpad_get_string("abc9.luts");
}
if (design->scratchpad.count("abc9.fast")) {
fast_mode = design->scratchpad_get_bool("abc9.fast", false /* default value if not bool-like */);
}
if (design->scratchpad.count("abc9.nocleanup")) {
cleanup = !design->scratchpad_get_bool("abc9.nocleanup", false /* default value if not bool-like */);
}
if (design->scratchpad.count("abc9.showtmp")) {
show_tempdir = design->scratchpad_get_bool("abc9.showtmp", false /* default value if not bool-like */);
}
if (design->scratchpad.count("abc9.markgroups")) {
markgroups = design->scratchpad_get_bool("abc9.markgroups", false /* default value if not bool-like */);
}
if (design->scratchpad.count("abc9.box")) {
box_file = design->scratchpad_get_string("abc9.box");
}
if (design->scratchpad.count("abc9.W")) {
wire_delay = "-W " + design->scratchpad_get_string("abc9.W");
}
if (design->scratchpad.count("abc9.nomfs")) {
nomfs = design->scratchpad_get_bool("abc9.nomfs", false /* default value if not bool-like */);
}
size_t argidx;
char pwd [PATH_MAX];
if (!getcwd(pwd, sizeof(pwd))) {
@ -984,45 +1016,11 @@ struct Abc9Pass : public Pass {
// continue;
//}
if (arg == "-lut" && argidx+1 < args.size()) {
string arg = args[++argidx];
if (arg.find_first_not_of("0123456789:") == std::string::npos) {
size_t pos = arg.find_first_of(':');
int lut_mode = 0, lut_mode2 = 0;
if (pos != string::npos) {
lut_mode = atoi(arg.substr(0, pos).c_str());
lut_mode2 = atoi(arg.substr(pos+1).c_str());
} else {
lut_mode = atoi(arg.c_str());
lut_mode2 = lut_mode;
}
lut_costs.clear();
for (int i = 0; i < lut_mode; i++)
lut_costs.push_back(1);
for (int i = lut_mode; i < lut_mode2; i++)
lut_costs.push_back(2 << (i - lut_mode));
}
else {
lut_file = arg;
rewrite_filename(lut_file);
if (!lut_file.empty() && !is_absolute_path(lut_file) && lut_file[0] != '+')
lut_file = std::string(pwd) + "/" + lut_file;
}
lut_arg = args[++argidx];
continue;
}
if (arg == "-luts" && argidx+1 < args.size()) {
lut_costs.clear();
for (auto &tok : split_tokens(args[++argidx], ",")) {
auto parts = split_tokens(tok, ":");
if (GetSize(parts) == 0 && !lut_costs.empty())
lut_costs.push_back(lut_costs.back());
else if (GetSize(parts) == 1)
lut_costs.push_back(atoi(parts.at(0).c_str()));
else if (GetSize(parts) == 2)
while (GetSize(lut_costs) < atoi(parts.at(0).c_str()))
lut_costs.push_back(atoi(parts.at(1).c_str()));
else
log_cmd_error("Invalid -luts syntax.\n");
}
luts_arg = args[++argidx];
continue;
}
if (arg == "-fast") {
@ -1070,6 +1068,52 @@ struct Abc9Pass : public Pass {
}
extra_args(args, argidx, design);
rewrite_filename(script_file);
if (!script_file.empty() && !is_absolute_path(script_file) && script_file[0] != '+')
script_file = std::string(pwd) + "/" + script_file;
// handle -lut / -luts args
if (!lut_arg.empty()) {
string arg = lut_arg;
if (arg.find_first_not_of("0123456789:") == std::string::npos) {
size_t pos = arg.find_first_of(':');
int lut_mode = 0, lut_mode2 = 0;
if (pos != string::npos) {
lut_mode = atoi(arg.substr(0, pos).c_str());
lut_mode2 = atoi(arg.substr(pos+1).c_str());
} else {
lut_mode = atoi(arg.c_str());
lut_mode2 = lut_mode;
}
lut_costs.clear();
for (int i = 0; i < lut_mode; i++)
lut_costs.push_back(1);
for (int i = lut_mode; i < lut_mode2; i++)
lut_costs.push_back(2 << (i - lut_mode));
}
else {
lut_file = arg;
rewrite_filename(lut_file);
if (!lut_file.empty() && !is_absolute_path(lut_file) && lut_file[0] != '+')
lut_file = std::string(pwd) + "/" + lut_file;
}
}
if (!luts_arg.empty()) {
lut_costs.clear();
for (auto &tok : split_tokens(luts_arg, ",")) {
auto parts = split_tokens(tok, ":");
if (GetSize(parts) == 0 && !lut_costs.empty())
lut_costs.push_back(lut_costs.back());
else if (GetSize(parts) == 1)
lut_costs.push_back(atoi(parts.at(0).c_str()));
else if (GetSize(parts) == 2)
while (GetSize(lut_costs) < atoi(parts.at(0).c_str()))
lut_costs.push_back(atoi(parts.at(1).c_str()));
else
log_cmd_error("Invalid -luts syntax.\n");
}
}
// ABC expects a box file for XAIG
if (box_file.empty())
box_file = "+/dummy.box";