mirror of
https://github.com/YosysHQ/yosys
synced 2025-04-23 09:05:32 +00:00
Merge remote-tracking branch 'origin/master' into xc7dsp
This commit is contained in:
commit
f890cfb63b
76 changed files with 840 additions and 568 deletions
|
@ -121,7 +121,7 @@ struct CoverPass : public Pass {
|
|||
}
|
||||
break;
|
||||
}
|
||||
while (argidx < args.size() && args[argidx].substr(0, 1) != "-")
|
||||
while (argidx < args.size() && args[argidx].compare(0, 1, "-") != 0)
|
||||
patterns.push_back(args[argidx++]);
|
||||
extra_args(args, argidx, design);
|
||||
|
||||
|
|
|
@ -34,7 +34,7 @@ static bool match_ids(RTLIL::IdString id, std::string pattern)
|
|||
{
|
||||
if (id == pattern)
|
||||
return true;
|
||||
if (id.size() > 0 && id[0] == '\\' && id.substr(1) == pattern)
|
||||
if (id.size() > 0 && id[0] == '\\' && id.compare(1, std::string::npos, pattern.c_str()) == 0)
|
||||
return true;
|
||||
if (patmatch(pattern.c_str(), id.c_str()))
|
||||
return true;
|
||||
|
@ -124,11 +124,11 @@ static bool match_attr(const dict<RTLIL::IdString, RTLIL::Const> &attributes, st
|
|||
size_t pos = match_expr.find_first_of("<!=>");
|
||||
|
||||
if (pos != std::string::npos) {
|
||||
if (match_expr.substr(pos, 2) == "!=")
|
||||
if (match_expr.compare(pos, 2, "!=") == 0)
|
||||
return match_attr(attributes, match_expr.substr(0, pos), match_expr.substr(pos+2), '!');
|
||||
if (match_expr.substr(pos, 2) == "<=")
|
||||
if (match_expr.compare(pos, 2, "<=") == 0)
|
||||
return match_attr(attributes, match_expr.substr(0, pos), match_expr.substr(pos+2), '[');
|
||||
if (match_expr.substr(pos, 2) == ">=")
|
||||
if (match_expr.compare(pos, 2, ">=") == 0)
|
||||
return match_attr(attributes, match_expr.substr(0, pos), match_expr.substr(pos+2), ']');
|
||||
return match_attr(attributes, match_expr.substr(0, pos), match_expr.substr(pos+1), match_expr[pos]);
|
||||
}
|
||||
|
@ -711,32 +711,32 @@ static void select_stmt(RTLIL::Design *design, std::string arg)
|
|||
log_cmd_error("Must have at least one element on the stack for operator %%a.\n");
|
||||
select_op_alias(design, work_stack[work_stack.size()-1]);
|
||||
} else
|
||||
if (arg == "%x" || (arg.size() > 2 && arg.substr(0, 2) == "%x" && (arg[2] == ':' || arg[2] == '*' || arg[2] == '.' || ('0' <= arg[2] && arg[2] <= '9')))) {
|
||||
if (arg == "%x" || (arg.size() > 2 && arg.compare(0, 2, "%x") == 0 && (arg[2] == ':' || arg[2] == '*' || arg[2] == '.' || ('0' <= arg[2] && arg[2] <= '9')))) {
|
||||
if (work_stack.size() < 1)
|
||||
log_cmd_error("Must have at least one element on the stack for operator %%x.\n");
|
||||
select_op_expand(design, arg, 'x', false);
|
||||
} else
|
||||
if (arg == "%ci" || (arg.size() > 3 && arg.substr(0, 3) == "%ci" && (arg[3] == ':' || arg[3] == '*' || arg[3] == '.' || ('0' <= arg[3] && arg[3] <= '9')))) {
|
||||
if (arg == "%ci" || (arg.size() > 3 && arg.compare(0, 3, "%ci") == 0 && (arg[3] == ':' || arg[3] == '*' || arg[3] == '.' || ('0' <= arg[3] && arg[3] <= '9')))) {
|
||||
if (work_stack.size() < 1)
|
||||
log_cmd_error("Must have at least one element on the stack for operator %%ci.\n");
|
||||
select_op_expand(design, arg, 'i', false);
|
||||
} else
|
||||
if (arg == "%co" || (arg.size() > 3 && arg.substr(0, 3) == "%co" && (arg[3] == ':' || arg[3] == '*' || arg[3] == '.' || ('0' <= arg[3] && arg[3] <= '9')))) {
|
||||
if (arg == "%co" || (arg.size() > 3 && arg.compare(0, 3, "%co") == 0 && (arg[3] == ':' || arg[3] == '*' || arg[3] == '.' || ('0' <= arg[3] && arg[3] <= '9')))) {
|
||||
if (work_stack.size() < 1)
|
||||
log_cmd_error("Must have at least one element on the stack for operator %%co.\n");
|
||||
select_op_expand(design, arg, 'o', false);
|
||||
} else
|
||||
if (arg == "%xe" || (arg.size() > 3 && arg.substr(0, 3) == "%xe" && (arg[3] == ':' || arg[3] == '*' || arg[3] == '.' || ('0' <= arg[3] && arg[3] <= '9')))) {
|
||||
if (arg == "%xe" || (arg.size() > 3 && arg.compare(0, 3, "%xe") == 0 && (arg[3] == ':' || arg[3] == '*' || arg[3] == '.' || ('0' <= arg[3] && arg[3] <= '9')))) {
|
||||
if (work_stack.size() < 1)
|
||||
log_cmd_error("Must have at least one element on the stack for operator %%xe.\n");
|
||||
select_op_expand(design, arg, 'x', true);
|
||||
} else
|
||||
if (arg == "%cie" || (arg.size() > 4 && arg.substr(0, 4) == "%cie" && (arg[4] == ':' || arg[4] == '*' || arg[4] == '.' || ('0' <= arg[4] && arg[4] <= '9')))) {
|
||||
if (arg == "%cie" || (arg.size() > 4 && arg.compare(0, 4, "%cie") == 0 && (arg[4] == ':' || arg[4] == '*' || arg[4] == '.' || ('0' <= arg[4] && arg[4] <= '9')))) {
|
||||
if (work_stack.size() < 1)
|
||||
log_cmd_error("Must have at least one element on the stack for operator %%cie.\n");
|
||||
select_op_expand(design, arg, 'i', true);
|
||||
} else
|
||||
if (arg == "%coe" || (arg.size() > 4 && arg.substr(0, 4) == "%coe" && (arg[4] == ':' || arg[4] == '*' || arg[4] == '.' || ('0' <= arg[4] && arg[4] <= '9')))) {
|
||||
if (arg == "%coe" || (arg.size() > 4 && arg.compare(0, 4, "%coe") == 0 && (arg[4] == ':' || arg[4] == '*' || arg[4] == '.' || ('0' <= arg[4] && arg[4] <= '9')))) {
|
||||
if (work_stack.size() < 1)
|
||||
log_cmd_error("Must have at least one element on the stack for operator %%coe.\n");
|
||||
select_op_expand(design, arg, 'o', true);
|
||||
|
@ -766,7 +766,7 @@ static void select_stmt(RTLIL::Design *design, std::string arg)
|
|||
} else {
|
||||
size_t pos = arg.find('/');
|
||||
if (pos == std::string::npos) {
|
||||
if (arg.find(':') == std::string::npos || arg.substr(0, 1) == "A")
|
||||
if (arg.find(':') == std::string::npos || arg.compare(0, 1, "A") == 0)
|
||||
arg_mod = arg;
|
||||
else
|
||||
arg_mod = "*", arg_memb = arg;
|
||||
|
@ -787,7 +787,7 @@ static void select_stmt(RTLIL::Design *design, std::string arg)
|
|||
sel.full_selection = false;
|
||||
for (auto &mod_it : design->modules_)
|
||||
{
|
||||
if (arg_mod.substr(0, 2) == "A:") {
|
||||
if (arg_mod.compare(0, 2, "A:") == 0) {
|
||||
if (!match_attr(mod_it.second->attributes, arg_mod.substr(2)))
|
||||
continue;
|
||||
} else
|
||||
|
@ -800,27 +800,27 @@ static void select_stmt(RTLIL::Design *design, std::string arg)
|
|||
}
|
||||
|
||||
RTLIL::Module *mod = mod_it.second;
|
||||
if (arg_memb.substr(0, 2) == "w:") {
|
||||
if (arg_memb.compare(0, 2, "w:") == 0) {
|
||||
for (auto &it : mod->wires_)
|
||||
if (match_ids(it.first, arg_memb.substr(2)))
|
||||
sel.selected_members[mod->name].insert(it.first);
|
||||
} else
|
||||
if (arg_memb.substr(0, 2) == "i:") {
|
||||
if (arg_memb.compare(0, 2, "i:") == 0) {
|
||||
for (auto &it : mod->wires_)
|
||||
if (it.second->port_input && match_ids(it.first, arg_memb.substr(2)))
|
||||
sel.selected_members[mod->name].insert(it.first);
|
||||
} else
|
||||
if (arg_memb.substr(0, 2) == "o:") {
|
||||
if (arg_memb.compare(0, 2, "o:") == 0) {
|
||||
for (auto &it : mod->wires_)
|
||||
if (it.second->port_output && match_ids(it.first, arg_memb.substr(2)))
|
||||
sel.selected_members[mod->name].insert(it.first);
|
||||
} else
|
||||
if (arg_memb.substr(0, 2) == "x:") {
|
||||
if (arg_memb.compare(0, 2, "x:") == 0) {
|
||||
for (auto &it : mod->wires_)
|
||||
if ((it.second->port_input || it.second->port_output) && match_ids(it.first, arg_memb.substr(2)))
|
||||
sel.selected_members[mod->name].insert(it.first);
|
||||
} else
|
||||
if (arg_memb.substr(0, 2) == "s:") {
|
||||
if (arg_memb.compare(0, 2, "s:") == 0) {
|
||||
size_t delim = arg_memb.substr(2).find(':');
|
||||
if (delim == std::string::npos) {
|
||||
int width = atoi(arg_memb.substr(2).c_str());
|
||||
|
@ -837,27 +837,27 @@ static void select_stmt(RTLIL::Design *design, std::string arg)
|
|||
sel.selected_members[mod->name].insert(it.first);
|
||||
}
|
||||
} else
|
||||
if (arg_memb.substr(0, 2) == "m:") {
|
||||
if (arg_memb.compare(0, 2, "m:") == 0) {
|
||||
for (auto &it : mod->memories)
|
||||
if (match_ids(it.first, arg_memb.substr(2)))
|
||||
sel.selected_members[mod->name].insert(it.first);
|
||||
} else
|
||||
if (arg_memb.substr(0, 2) == "c:") {
|
||||
if (arg_memb.compare(0, 2, "c:") ==0) {
|
||||
for (auto &it : mod->cells_)
|
||||
if (match_ids(it.first, arg_memb.substr(2)))
|
||||
sel.selected_members[mod->name].insert(it.first);
|
||||
} else
|
||||
if (arg_memb.substr(0, 2) == "t:") {
|
||||
if (arg_memb.compare(0, 2, "t:") == 0) {
|
||||
for (auto &it : mod->cells_)
|
||||
if (match_ids(it.second->type, arg_memb.substr(2)))
|
||||
sel.selected_members[mod->name].insert(it.first);
|
||||
} else
|
||||
if (arg_memb.substr(0, 2) == "p:") {
|
||||
if (arg_memb.compare(0, 2, "p:") == 0) {
|
||||
for (auto &it : mod->processes)
|
||||
if (match_ids(it.first, arg_memb.substr(2)))
|
||||
sel.selected_members[mod->name].insert(it.first);
|
||||
} else
|
||||
if (arg_memb.substr(0, 2) == "a:") {
|
||||
if (arg_memb.compare(0, 2, "a:") == 0) {
|
||||
for (auto &it : mod->wires_)
|
||||
if (match_attr(it.second->attributes, arg_memb.substr(2)))
|
||||
sel.selected_members[mod->name].insert(it.first);
|
||||
|
@ -871,12 +871,12 @@ static void select_stmt(RTLIL::Design *design, std::string arg)
|
|||
if (match_attr(it.second->attributes, arg_memb.substr(2)))
|
||||
sel.selected_members[mod->name].insert(it.first);
|
||||
} else
|
||||
if (arg_memb.substr(0, 2) == "r:") {
|
||||
if (arg_memb.compare(0, 2, "r:") == 0) {
|
||||
for (auto &it : mod->cells_)
|
||||
if (match_attr(it.second->parameters, arg_memb.substr(2)))
|
||||
sel.selected_members[mod->name].insert(it.first);
|
||||
} else {
|
||||
if (arg_memb.substr(0, 2) == "n:")
|
||||
if (arg_memb.compare(0, 2, "n:") == 0)
|
||||
arg_memb = arg_memb.substr(2);
|
||||
for (auto &it : mod->wires_)
|
||||
if (match_ids(it.first, arg_memb))
|
||||
|
@ -927,7 +927,7 @@ void handle_extra_select_args(Pass *pass, vector<string> args, size_t argidx, si
|
|||
{
|
||||
work_stack.clear();
|
||||
for (; argidx < args_size; argidx++) {
|
||||
if (args[argidx].substr(0, 1) == "-") {
|
||||
if (args[argidx].compare(0, 1, "-") == 0) {
|
||||
if (pass != NULL)
|
||||
pass->cmd_error(args, argidx, "Unexpected option in selection arguments.");
|
||||
else
|
||||
|
|
|
@ -34,7 +34,7 @@ struct setunset_t
|
|||
|
||||
setunset_t(std::string set_name, std::string set_value) : name(RTLIL::escape_id(set_name)), value(), unset(false)
|
||||
{
|
||||
if (set_value.substr(0, 1) == "\"" && set_value.substr(GetSize(set_value)-1) == "\"") {
|
||||
if (set_value.compare(0, 1, "\"") == 0 && set_value.compare(GetSize(set_value)-1, std::string::npos, "\"") == 0) {
|
||||
value = RTLIL::Const(set_value.substr(1, GetSize(set_value)-2));
|
||||
} else {
|
||||
RTLIL::SigSpec sig_value;
|
||||
|
|
|
@ -527,11 +527,11 @@ struct ShowWorker
|
|||
{
|
||||
currentColor = xorshift32(currentColor);
|
||||
if (wires_on_demand.count(it.first) > 0) {
|
||||
if (it.second.in.size() == 1 && it.second.out.size() > 1 && it.second.in.begin()->substr(0, 1) == "p")
|
||||
if (it.second.in.size() == 1 && it.second.out.size() > 1 && it.second.in.begin()->compare(0, 1, "p") == 0)
|
||||
it.second.out.erase(*it.second.in.begin());
|
||||
if (it.second.in.size() == 1 && it.second.out.size() == 1) {
|
||||
std::string from = *it.second.in.begin(), to = *it.second.out.begin();
|
||||
if (from != to || from.substr(0, 1) != "p")
|
||||
if (from != to || from.compare(0, 1, "p") != 0)
|
||||
fprintf(f, "%s:e -> %s:w [%s, %s];\n", from.c_str(), to.c_str(), nextColor(it.second.color).c_str(), widthLabel(it.second.bits).c_str());
|
||||
continue;
|
||||
}
|
||||
|
@ -808,7 +808,7 @@ struct ShowPass : public Pass {
|
|||
if (f.fail())
|
||||
log_error("Can't open lib file `%s'.\n", filename.c_str());
|
||||
RTLIL::Design *lib = new RTLIL::Design;
|
||||
Frontend::frontend_call(lib, &f, filename, (filename.size() > 3 && filename.substr(filename.size()-3) == ".il") ? "ilang" : "verilog");
|
||||
Frontend::frontend_call(lib, &f, filename, (filename.size() > 3 && filename.compare(filename.size()-3, std::string::npos, ".il") == 0 ? "ilang" : "verilog"));
|
||||
libs.push_back(lib);
|
||||
}
|
||||
|
||||
|
|
|
@ -97,7 +97,7 @@ struct EquivOptPass:public ScriptPass
|
|||
|
||||
for (; argidx < args.size(); argidx++) {
|
||||
if (command.empty()) {
|
||||
if (args[argidx].substr(0, 1) == "-")
|
||||
if (args[argidx].compare(0, 1, "-") == 0)
|
||||
cmd_error(args, argidx, "Unknown option.");
|
||||
} else {
|
||||
command += " ";
|
||||
|
|
|
@ -215,9 +215,9 @@ struct EquivStructWorker
|
|||
if (c != nullptr) {
|
||||
string n = cell_name.str();
|
||||
cells_type = c->type;
|
||||
if (GetSize(n) > 5 && n.substr(GetSize(n)-5) == "_gold")
|
||||
if (GetSize(n) > 5 && n.compare(GetSize(n)-5, std::string::npos, "_gold") == 0)
|
||||
gold_cells.push_back(c);
|
||||
else if (GetSize(n) > 5 && n.substr(GetSize(n)-5) == "_gate")
|
||||
else if (GetSize(n) > 5 && n.compare(GetSize(n)-5, std::string::npos, "_gate") == 0)
|
||||
gate_cells.push_back(c);
|
||||
else
|
||||
other_cells.push_back(c);
|
||||
|
|
|
@ -50,7 +50,7 @@ struct FsmExpand
|
|||
if (full_mode || cell->type == "$_MUX_")
|
||||
return true;
|
||||
|
||||
if (cell->type == "$mux" || cell->type == "$pmux")
|
||||
if (cell->type.in("$mux", "$pmux"))
|
||||
if (cell->getPort("\\A").size() < 2)
|
||||
return true;
|
||||
|
||||
|
|
|
@ -168,7 +168,7 @@ undef_bit_in_next_state:
|
|||
ctrl_in_bit_indices[ctrl_in[i]] = i;
|
||||
|
||||
for (auto &it : ctrl_in_bit_indices)
|
||||
if (tr.ctrl_in.bits.at(it.second) == RTLIL::S1 && exclusive_ctrls.count(it.first) != 0)
|
||||
if (tr.ctrl_in.bits.at(it.second) == State::S1 && exclusive_ctrls.count(it.first) != 0)
|
||||
for (auto &dc_bit : exclusive_ctrls.at(it.first))
|
||||
if (ctrl_in_bit_indices.count(dc_bit))
|
||||
tr.ctrl_in.bits.at(ctrl_in_bit_indices.at(dc_bit)) = RTLIL::State::Sa;
|
||||
|
@ -216,13 +216,13 @@ undef_bit_in_next_state:
|
|||
ce.push();
|
||||
dont_care.append(undef);
|
||||
ce.set(undef, constval.as_const());
|
||||
if (exclusive_ctrls.count(undef) && constval == RTLIL::S1)
|
||||
if (exclusive_ctrls.count(undef) && constval == State::S1)
|
||||
for (auto &bit : exclusive_ctrls.at(undef)) {
|
||||
RTLIL::SigSpec bitval = bit;
|
||||
if (ce.eval(bitval) && bitval != RTLIL::S0)
|
||||
if (ce.eval(bitval) && bitval != State::S0)
|
||||
goto found_contradiction_1;
|
||||
else
|
||||
ce.set(bit, RTLIL::S0);
|
||||
ce.set(bit, State::S0);
|
||||
}
|
||||
find_transitions(ce, ce_nostop, fsm_data, states, state_in, ctrl_in, ctrl_out, dff_in, dont_care);
|
||||
found_contradiction_1:
|
||||
|
@ -231,21 +231,21 @@ undef_bit_in_next_state:
|
|||
else
|
||||
{
|
||||
ce.push(), ce_nostop.push();
|
||||
ce.set(undef, RTLIL::S0);
|
||||
ce_nostop.set(undef, RTLIL::S0);
|
||||
ce.set(undef, State::S0);
|
||||
ce_nostop.set(undef, State::S0);
|
||||
find_transitions(ce, ce_nostop, fsm_data, states, state_in, ctrl_in, ctrl_out, dff_in, dont_care);
|
||||
ce.pop(), ce_nostop.pop();
|
||||
|
||||
ce.push(), ce_nostop.push();
|
||||
ce.set(undef, RTLIL::S1);
|
||||
ce_nostop.set(undef, RTLIL::S1);
|
||||
ce.set(undef, State::S1);
|
||||
ce_nostop.set(undef, State::S1);
|
||||
if (exclusive_ctrls.count(undef))
|
||||
for (auto &bit : exclusive_ctrls.at(undef)) {
|
||||
RTLIL::SigSpec bitval = bit;
|
||||
if ((ce.eval(bitval) || ce_nostop.eval(bitval)) && bitval != RTLIL::S0)
|
||||
if ((ce.eval(bitval) || ce_nostop.eval(bitval)) && bitval != State::S0)
|
||||
goto found_contradiction_2;
|
||||
else
|
||||
ce.set(bit, RTLIL::S0), ce_nostop.set(bit, RTLIL::S0);
|
||||
ce.set(bit, State::S0), ce_nostop.set(bit, RTLIL::S0);
|
||||
}
|
||||
find_transitions(ce, ce_nostop, fsm_data, states, state_in, ctrl_in, ctrl_out, dff_in, dont_care);
|
||||
found_contradiction_2:
|
||||
|
@ -263,8 +263,8 @@ static void extract_fsm(RTLIL::Wire *wire)
|
|||
RTLIL::SigSpec dff_in(RTLIL::State::Sm, wire->width);
|
||||
RTLIL::Const reset_state(RTLIL::State::Sx, wire->width);
|
||||
|
||||
RTLIL::SigSpec clk = RTLIL::S0;
|
||||
RTLIL::SigSpec arst = RTLIL::S0;
|
||||
RTLIL::SigSpec clk = State::S0;
|
||||
RTLIL::SigSpec arst = State::S0;
|
||||
bool clk_polarity = true;
|
||||
bool arst_polarity = true;
|
||||
|
||||
|
@ -371,8 +371,8 @@ static void extract_fsm(RTLIL::Wire *wire)
|
|||
RTLIL::Cell *fsm_cell = module->addCell(stringf("$fsm$%s$%d", wire->name.c_str(), autoidx++), "$fsm");
|
||||
fsm_cell->setPort("\\CLK", clk);
|
||||
fsm_cell->setPort("\\ARST", arst);
|
||||
fsm_cell->parameters["\\CLK_POLARITY"] = clk_polarity ? RTLIL::S1 : RTLIL::S0;
|
||||
fsm_cell->parameters["\\ARST_POLARITY"] = arst_polarity ? RTLIL::S1 : RTLIL::S0;
|
||||
fsm_cell->parameters["\\CLK_POLARITY"] = clk_polarity ? State::S1 : State::S0;
|
||||
fsm_cell->parameters["\\ARST_POLARITY"] = arst_polarity ? State::S1 : State::S0;
|
||||
fsm_cell->setPort("\\CTRL_IN", ctrl_in);
|
||||
fsm_cell->setPort("\\CTRL_OUT", ctrl_out);
|
||||
fsm_cell->parameters["\\NAME"] = RTLIL::Const(wire->name.str());
|
||||
|
|
|
@ -133,7 +133,7 @@ static void implement_pattern_cache(RTLIL::Module *module, std::map<RTLIL::Const
|
|||
cases_vector.append(and_sig);
|
||||
break;
|
||||
case 0:
|
||||
cases_vector.append(RTLIL::SigSpec(1, 1));
|
||||
cases_vector.append(State::S1);
|
||||
break;
|
||||
default:
|
||||
log_abort();
|
||||
|
@ -150,7 +150,7 @@ static void implement_pattern_cache(RTLIL::Module *module, std::map<RTLIL::Const
|
|||
} else if (cases_vector.size() == 1) {
|
||||
module->connect(RTLIL::SigSig(output, cases_vector));
|
||||
} else {
|
||||
module->connect(RTLIL::SigSig(output, RTLIL::SigSpec(0, 1)));
|
||||
module->connect(RTLIL::SigSig(output, State::S0));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -48,7 +48,7 @@ void generate(RTLIL::Design *design, const std::vector<std::string> &celltypes,
|
|||
RTLIL::Cell *cell = i2.second;
|
||||
if (design->has(cell->type))
|
||||
continue;
|
||||
if (cell->type.substr(0, 1) == "$" && cell->type.substr(0, 3) != "$__")
|
||||
if (cell->type.begins_with("$__"))
|
||||
continue;
|
||||
for (auto &pattern : celltypes)
|
||||
if (patmatch(pattern.c_str(), RTLIL::unescape_id(cell->type).c_str()))
|
||||
|
@ -143,7 +143,7 @@ void generate(RTLIL::Design *design, const std::vector<std::string> &celltypes,
|
|||
// Return the "basic" type for an array item.
|
||||
std::string basic_cell_type(const std::string celltype, int pos[3] = nullptr) {
|
||||
std::string basicType = celltype;
|
||||
if (celltype.substr(0, 7) == "$array:") {
|
||||
if (celltype.compare(0, strlen("$array:"), "$array:") == 0) {
|
||||
int pos_idx = celltype.find_first_of(':');
|
||||
int pos_num = celltype.find_first_of(':', pos_idx + 1);
|
||||
int pos_type = celltype.find_first_of(':', pos_num + 1);
|
||||
|
@ -194,16 +194,16 @@ bool expand_module(RTLIL::Design *design, RTLIL::Module *module, bool flag_check
|
|||
std::vector<RTLIL::IdString> connections_to_add_name;
|
||||
std::vector<RTLIL::SigSpec> connections_to_add_signal;
|
||||
|
||||
if (cell->type.substr(0, 7) == "$array:") {
|
||||
if (cell->type.begins_with("$array:")) {
|
||||
int pos[3];
|
||||
basic_cell_type(cell->type.str(), pos);
|
||||
int pos_idx = pos[0];
|
||||
int pos_num = pos[1];
|
||||
int pos_type = pos[2];
|
||||
int idx = atoi(cell->type.str().substr(pos_idx + 1, pos_num).c_str());
|
||||
int num = atoi(cell->type.str().substr(pos_num + 1, pos_type).c_str());
|
||||
int idx = atoi(cell->type.substr(pos_idx + 1, pos_num).c_str());
|
||||
int num = atoi(cell->type.substr(pos_num + 1, pos_type).c_str());
|
||||
array_cells[cell] = std::pair<int, int>(idx, num);
|
||||
cell->type = cell->type.str().substr(pos_type + 1);
|
||||
cell->type = cell->type.substr(pos_type + 1);
|
||||
}
|
||||
dict<RTLIL::IdString, RTLIL::Module*> interfaces_to_add_to_submodule;
|
||||
dict<RTLIL::IdString, RTLIL::IdString> modports_used_in_submodule;
|
||||
|
@ -422,7 +422,7 @@ bool expand_module(RTLIL::Design *design, RTLIL::Module *module, bool flag_check
|
|||
for (auto &conn : cell->connections_) {
|
||||
int conn_size = conn.second.size();
|
||||
RTLIL::IdString portname = conn.first;
|
||||
if (portname.substr(0, 1) == "$") {
|
||||
if (portname.begins_with("$")) {
|
||||
int port_id = atoi(portname.substr(1).c_str());
|
||||
for (auto &wire_it : mod->wires_)
|
||||
if (wire_it.second->port_id == port_id) {
|
||||
|
@ -457,9 +457,8 @@ void hierarchy_worker(RTLIL::Design *design, std::set<RTLIL::Module*, IdString::
|
|||
|
||||
for (auto cell : mod->cells()) {
|
||||
std::string celltype = cell->type.str();
|
||||
if (celltype.substr(0, 7) == "$array:") {
|
||||
if (celltype.compare(0, strlen("$array:"), "$array:") == 0)
|
||||
celltype = basic_cell_type(celltype);
|
||||
}
|
||||
if (design->module(celltype))
|
||||
hierarchy_worker(design, used, design->module(celltype), indent+4);
|
||||
}
|
||||
|
@ -521,9 +520,8 @@ int find_top_mod_score(Design *design, Module *module, dict<Module*, int> &db)
|
|||
for (auto cell : module->cells()) {
|
||||
std::string celltype = cell->type.str();
|
||||
// Is this an array instance
|
||||
if (celltype.substr(0, 7) == "$array:") {
|
||||
if (celltype.compare(0, strlen("$array:"), "$array:") == 0)
|
||||
celltype = basic_cell_type(celltype);
|
||||
}
|
||||
// Is this cell a module instance?
|
||||
auto instModule = design->module(celltype);
|
||||
// If there is no instance for this, issue a warning.
|
||||
|
|
|
@ -194,8 +194,8 @@ Cell *handle_memory(Module *module, RTLIL::Memory *memory)
|
|||
log_assert(sig_wr_en.size() == wr_ports * memory->width);
|
||||
|
||||
mem->parameters["\\WR_PORTS"] = Const(wr_ports);
|
||||
mem->parameters["\\WR_CLK_ENABLE"] = wr_ports ? sig_wr_clk_enable.as_const() : Const(0, 1);
|
||||
mem->parameters["\\WR_CLK_POLARITY"] = wr_ports ? sig_wr_clk_polarity.as_const() : Const(0, 1);
|
||||
mem->parameters["\\WR_CLK_ENABLE"] = wr_ports ? sig_wr_clk_enable.as_const() : State::S0;
|
||||
mem->parameters["\\WR_CLK_POLARITY"] = wr_ports ? sig_wr_clk_polarity.as_const() : State::S0;
|
||||
|
||||
mem->setPort("\\WR_CLK", sig_wr_clk);
|
||||
mem->setPort("\\WR_ADDR", sig_wr_addr);
|
||||
|
@ -209,9 +209,9 @@ Cell *handle_memory(Module *module, RTLIL::Memory *memory)
|
|||
log_assert(sig_rd_data.size() == rd_ports * memory->width);
|
||||
|
||||
mem->parameters["\\RD_PORTS"] = Const(rd_ports);
|
||||
mem->parameters["\\RD_CLK_ENABLE"] = rd_ports ? sig_rd_clk_enable.as_const() : Const(0, 1);
|
||||
mem->parameters["\\RD_CLK_POLARITY"] = rd_ports ? sig_rd_clk_polarity.as_const() : Const(0, 1);
|
||||
mem->parameters["\\RD_TRANSPARENT"] = rd_ports ? sig_rd_transparent.as_const() : Const(0, 1);
|
||||
mem->parameters["\\RD_CLK_ENABLE"] = rd_ports ? sig_rd_clk_enable.as_const() : State::S0;
|
||||
mem->parameters["\\RD_CLK_POLARITY"] = rd_ports ? sig_rd_clk_polarity.as_const() : State::S0;
|
||||
mem->parameters["\\RD_TRANSPARENT"] = rd_ports ? sig_rd_transparent.as_const() : State::S0;
|
||||
|
||||
mem->setPort("\\RD_CLK", sig_rd_clk);
|
||||
mem->setPort("\\RD_ADDR", sig_rd_addr);
|
||||
|
|
|
@ -262,7 +262,7 @@ struct MemoryDffWorker
|
|||
mux_cells_a[sigmap(cell->getPort("\\A"))] = cell;
|
||||
mux_cells_b[sigmap(cell->getPort("\\B"))] = cell;
|
||||
}
|
||||
if (cell->type == "$not" || cell->type == "$_NOT_" || (cell->type == "$logic_not" && GetSize(cell->getPort("\\A")) == 1)) {
|
||||
if (cell->type.in("$not", "$_NOT_") || (cell->type == "$logic_not" && GetSize(cell->getPort("\\A")) == 1)) {
|
||||
SigSpec sig_a = cell->getPort("\\A");
|
||||
SigSpec sig_y = cell->getPort("\\Y");
|
||||
if (cell->type == "$not")
|
||||
|
|
|
@ -301,7 +301,7 @@ struct MemoryMapWorker
|
|||
|
||||
RTLIL::Wire *w = w_seladdr;
|
||||
|
||||
if (wr_bit != RTLIL::SigSpec(1, 1))
|
||||
if (wr_bit != State::S1)
|
||||
{
|
||||
RTLIL::Cell *c = module->addCell(genid(cell->name, "$wren", i, "", j, "", wr_offset), "$and");
|
||||
c->parameters["\\A_SIGNED"] = RTLIL::Const(0);
|
||||
|
|
|
@ -155,7 +155,7 @@ struct MemoryShareWorker
|
|||
{
|
||||
bool ignore_data_port = false;
|
||||
|
||||
if (cell->type == "$mux" || cell->type == "$pmux")
|
||||
if (cell->type.in("$mux", "$pmux"))
|
||||
{
|
||||
std::vector<RTLIL::SigBit> sig_a = sigmap(cell->getPort("\\A"));
|
||||
std::vector<RTLIL::SigBit> sig_b = sigmap(cell->getPort("\\B"));
|
||||
|
@ -173,7 +173,7 @@ struct MemoryShareWorker
|
|||
continue;
|
||||
}
|
||||
|
||||
if ((cell->type == "$memwr" || cell->type == "$memrd") &&
|
||||
if (cell->type.in("$memwr", "$memrd") &&
|
||||
cell->parameters.at("\\MEMID").decode_string() == memid)
|
||||
ignore_data_port = true;
|
||||
|
||||
|
@ -690,7 +690,7 @@ struct MemoryShareWorker
|
|||
sigmap_xmux.add(cell->getPort("\\Y"), sig_a);
|
||||
}
|
||||
|
||||
if (cell->type == "$mux" || cell->type == "$pmux")
|
||||
if (cell->type.in("$mux", "$pmux"))
|
||||
{
|
||||
std::vector<RTLIL::SigBit> sig_y = sigmap(cell->getPort("\\Y"));
|
||||
for (int i = 0; i < int(sig_y.size()); i++)
|
||||
|
|
|
@ -49,7 +49,7 @@ struct ExclusiveDatabase
|
|||
}
|
||||
else if (cell->type == "$logic_not") {
|
||||
nonconst_sig = sigmap(cell->getPort("\\A"));
|
||||
const_sig = Const(RTLIL::S0, GetSize(nonconst_sig));
|
||||
const_sig = Const(State::S0, GetSize(nonconst_sig));
|
||||
y_port = sigmap(cell->getPort("\\Y"));
|
||||
}
|
||||
else if (cell->type == "$reduce_or") {
|
||||
|
|
|
@ -222,10 +222,10 @@ bool compare_signals(RTLIL::SigBit &s1, RTLIL::SigBit &s2, SigPool ®s, SigPoo
|
|||
|
||||
bool check_public_name(RTLIL::IdString id)
|
||||
{
|
||||
const std::string &id_str = id.str();
|
||||
if (id_str[0] == '$')
|
||||
if (id.begins_with("$"))
|
||||
return false;
|
||||
if (id_str.substr(0, 2) == "\\_" && (id_str[id_str.size()-1] == '_' || id_str.find("_[") != std::string::npos))
|
||||
const std::string &id_str = id.str();
|
||||
if (id.begins_with("\\_") && (id.ends_with("_") || id_str.find("_[") != std::string::npos))
|
||||
return false;
|
||||
if (id_str.find(".$") != std::string::npos)
|
||||
return false;
|
||||
|
|
|
@ -367,10 +367,11 @@ void replace_const_cells(RTLIL::Design *design, RTLIL::Module *module, bool cons
|
|||
|
||||
for (auto cell : module->cells())
|
||||
if (design->selected(module, cell) && cell->type[0] == '$') {
|
||||
if ((cell->type == "$_NOT_" || cell->type == "$not" || cell->type == "$logic_not") &&
|
||||
if (cell->type.in("$_NOT_", "$not", "$logic_not") &&
|
||||
cell->getPort("\\A").size() == 1 && cell->getPort("\\Y").size() == 1)
|
||||
invert_map[assign_map(cell->getPort("\\Y"))] = assign_map(cell->getPort("\\A"));
|
||||
if ((cell->type == "$mux" || cell->type == "$_MUX_") && cell->getPort("\\A") == SigSpec(State::S1) && cell->getPort("\\B") == SigSpec(State::S0))
|
||||
if (cell->type.in("$mux", "$_MUX_") &&
|
||||
cell->getPort("\\A") == SigSpec(State::S1) && cell->getPort("\\B") == SigSpec(State::S0))
|
||||
invert_map[assign_map(cell->getPort("\\Y"))] = assign_map(cell->getPort("\\S"));
|
||||
if (ct_combinational.cell_known(cell->type))
|
||||
for (auto &conn : cell->connections()) {
|
||||
|
@ -512,13 +513,11 @@ void replace_const_cells(RTLIL::Design *design, RTLIL::Module *module, bool cons
|
|||
|
||||
if (do_fine)
|
||||
{
|
||||
if (cell->type == "$not" || cell->type == "$pos" ||
|
||||
cell->type == "$and" || cell->type == "$or" || cell->type == "$xor" || cell->type == "$xnor")
|
||||
if (cell->type.in("$not", "$pos", "$and", "$or", "$xor", "$xnor"))
|
||||
if (group_cell_inputs(module, cell, true, assign_map))
|
||||
goto next_cell;
|
||||
|
||||
if (cell->type == "$logic_not" || cell->type == "$logic_and" || cell->type == "$logic_or" ||
|
||||
cell->type == "$reduce_or" || cell->type == "$reduce_and" || cell->type == "$reduce_bool")
|
||||
if (cell->type.in("$logic_not", "$logic_and", "$logic_or", "$reduce_or", "$reduce_and", "$reduce_bool"))
|
||||
{
|
||||
SigBit neutral_bit = cell->type == "$reduce_and" ? State::S1 : State::S0;
|
||||
|
||||
|
@ -541,7 +540,7 @@ void replace_const_cells(RTLIL::Design *design, RTLIL::Module *module, bool cons
|
|||
}
|
||||
}
|
||||
|
||||
if (cell->type == "$logic_and" || cell->type == "$logic_or")
|
||||
if (cell->type.in("$logic_and", "$logic_or"))
|
||||
{
|
||||
SigBit neutral_bit = State::S0;
|
||||
|
||||
|
@ -590,7 +589,7 @@ void replace_const_cells(RTLIL::Design *design, RTLIL::Module *module, bool cons
|
|||
}
|
||||
}
|
||||
|
||||
if (cell->type == "$logic_not" || cell->type == "$logic_and" || cell->type == "$logic_or" || cell->type == "$reduce_or" || cell->type == "$reduce_bool")
|
||||
if (cell->type.in("$logic_not", "$logic_and", "$logic_or", "$reduce_or", "$reduce_bool"))
|
||||
{
|
||||
RTLIL::SigSpec sig_a = assign_map(cell->getPort("\\A"));
|
||||
|
||||
|
@ -616,7 +615,7 @@ void replace_const_cells(RTLIL::Design *design, RTLIL::Module *module, bool cons
|
|||
}
|
||||
}
|
||||
|
||||
if (cell->type == "$logic_and" || cell->type == "$logic_or")
|
||||
if (cell->type.in("$logic_and", "$logic_or"))
|
||||
{
|
||||
RTLIL::SigSpec sig_b = assign_map(cell->getPort("\\B"));
|
||||
|
||||
|
@ -642,7 +641,8 @@ void replace_const_cells(RTLIL::Design *design, RTLIL::Module *module, bool cons
|
|||
}
|
||||
}
|
||||
|
||||
if (cell->type.in("$add", "$sub")) {
|
||||
if (cell->type.in("$add", "$sub"))
|
||||
{
|
||||
RTLIL::SigSpec sig_a = assign_map(cell->getPort("\\A"));
|
||||
RTLIL::SigSpec sig_b = assign_map(cell->getPort("\\B"));
|
||||
RTLIL::SigSpec sig_y = cell->getPort("\\Y");
|
||||
|
@ -666,18 +666,62 @@ void replace_const_cells(RTLIL::Design *design, RTLIL::Module *module, bool cons
|
|||
did_something = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (cell->type == "$alu")
|
||||
{
|
||||
RTLIL::SigSpec sig_a = assign_map(cell->getPort("\\A"));
|
||||
RTLIL::SigSpec sig_b = assign_map(cell->getPort("\\B"));
|
||||
RTLIL::SigBit sig_ci = assign_map(cell->getPort("\\CI"));
|
||||
RTLIL::SigBit sig_bi = assign_map(cell->getPort("\\BI"));
|
||||
RTLIL::SigSpec sig_x = cell->getPort("\\X");
|
||||
RTLIL::SigSpec sig_y = cell->getPort("\\Y");
|
||||
RTLIL::SigSpec sig_co = cell->getPort("\\CO");
|
||||
|
||||
if (sig_ci.wire || sig_bi.wire)
|
||||
goto next_cell;
|
||||
|
||||
bool sub = (sig_ci == State::S1 && sig_bi == State::S1);
|
||||
|
||||
// If not a subtraction, yet there is a carry or B is inverted
|
||||
// then no optimisation is possible as carry will not be constant
|
||||
if (!sub && (sig_ci != State::S0 || sig_bi != State::S0))
|
||||
goto next_cell;
|
||||
|
||||
int i;
|
||||
for (i = 0; i < GetSize(sig_y); i++) {
|
||||
if (sig_b.at(i, State::Sx) == State::S0 && sig_a.at(i, State::Sx) != State::Sx) {
|
||||
module->connect(sig_x[i], sub ? module->Not(NEW_ID, sig_a[i]).as_bit() : sig_a[i]);
|
||||
module->connect(sig_y[i], sig_a[i]);
|
||||
module->connect(sig_co[i], sub ? State::S1 : State::S0);
|
||||
}
|
||||
else if (!sub && sig_a.at(i, State::Sx) == State::S0 && sig_b.at(i, State::Sx) != State::Sx) {
|
||||
module->connect(sig_x[i], sig_b[i]);
|
||||
module->connect(sig_y[i], sig_b[i]);
|
||||
module->connect(sig_co[i], State::S0);
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
if (i > 0) {
|
||||
cover("opt.opt_expr.fine.$alu");
|
||||
cell->setPort("\\A", sig_a.extract_end(i));
|
||||
cell->setPort("\\B", sig_b.extract_end(i));
|
||||
cell->setPort("\\X", sig_x.extract_end(i));
|
||||
cell->setPort("\\Y", sig_y.extract_end(i));
|
||||
cell->setPort("\\CO", sig_co.extract_end(i));
|
||||
cell->fixup_parameters();
|
||||
did_something = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (cell->type == "$reduce_xor" || cell->type == "$reduce_xnor" || cell->type == "$shift" || cell->type == "$shiftx" ||
|
||||
cell->type == "$shl" || cell->type == "$shr" || cell->type == "$sshl" || cell->type == "$sshr" ||
|
||||
cell->type == "$lt" || cell->type == "$le" || cell->type == "$ge" || cell->type == "$gt" ||
|
||||
cell->type == "$neg" || cell->type == "$add" || cell->type == "$sub" ||
|
||||
cell->type == "$mul" || cell->type == "$div" || cell->type == "$mod" || cell->type == "$pow")
|
||||
if (cell->type.in("$reduce_xor", "$reduce_xnor", "$shift", "$shiftx", "$shl", "$shr", "$sshl", "$sshr",
|
||||
"$lt", "$le", "$ge", "$gt", "$neg", "$add", "$sub", "$mul", "$div", "$mod", "$pow"))
|
||||
{
|
||||
RTLIL::SigSpec sig_a = assign_map(cell->getPort("\\A"));
|
||||
RTLIL::SigSpec sig_b = cell->hasPort("\\B") ? assign_map(cell->getPort("\\B")) : RTLIL::SigSpec();
|
||||
|
||||
if (cell->type == "$shl" || cell->type == "$shr" || cell->type == "$sshl" || cell->type == "$sshr" || cell->type == "$shift" || cell->type == "$shiftx")
|
||||
if (cell->type.in("$shl", "$shr", "$sshl", "$sshr", "$shift", "$shiftx"))
|
||||
sig_a = RTLIL::SigSpec();
|
||||
|
||||
for (auto &bit : sig_a.to_sigbit_vector())
|
||||
|
@ -692,8 +736,7 @@ void replace_const_cells(RTLIL::Design *design, RTLIL::Module *module, bool cons
|
|||
found_the_x_bit:
|
||||
cover_list("opt.opt_expr.xbit", "$reduce_xor", "$reduce_xnor", "$shl", "$shr", "$sshl", "$sshr", "$shift", "$shiftx",
|
||||
"$lt", "$le", "$ge", "$gt", "$neg", "$add", "$sub", "$mul", "$div", "$mod", "$pow", cell->type.str());
|
||||
if (cell->type == "$reduce_xor" || cell->type == "$reduce_xnor" ||
|
||||
cell->type == "$lt" || cell->type == "$le" || cell->type == "$ge" || cell->type == "$gt")
|
||||
if (cell->type.in("$reduce_xor", "$reduce_xnor", "$lt", "$le", "$ge", "$gt"))
|
||||
replace_cell(assign_map, module, cell, "x-bit in input", "\\Y", RTLIL::State::Sx);
|
||||
else
|
||||
replace_cell(assign_map, module, cell, "x-bit in input", "\\Y", RTLIL::SigSpec(RTLIL::State::Sx, cell->getPort("\\Y").size()));
|
||||
|
@ -701,14 +744,14 @@ void replace_const_cells(RTLIL::Design *design, RTLIL::Module *module, bool cons
|
|||
}
|
||||
}
|
||||
|
||||
if ((cell->type == "$_NOT_" || cell->type == "$not" || cell->type == "$logic_not") && cell->getPort("\\Y").size() == 1 &&
|
||||
if (cell->type.in("$_NOT_", "$not", "$logic_not") && cell->getPort("\\Y").size() == 1 &&
|
||||
invert_map.count(assign_map(cell->getPort("\\A"))) != 0) {
|
||||
cover_list("opt.opt_expr.invert.double", "$_NOT_", "$not", "$logic_not", cell->type.str());
|
||||
replace_cell(assign_map, module, cell, "double_invert", "\\Y", invert_map.at(assign_map(cell->getPort("\\A"))));
|
||||
goto next_cell;
|
||||
}
|
||||
|
||||
if ((cell->type == "$_MUX_" || cell->type == "$mux") && invert_map.count(assign_map(cell->getPort("\\S"))) != 0) {
|
||||
if (cell->type.in("$_MUX_", "$mux") && invert_map.count(assign_map(cell->getPort("\\S"))) != 0) {
|
||||
cover_list("opt.opt_expr.invert.muxsel", "$_MUX_", "$mux", cell->type.str());
|
||||
log_debug("Optimizing away select inverter for %s cell `%s' in module `%s'.\n", log_id(cell->type), log_id(cell), log_id(module));
|
||||
RTLIL::SigSpec tmp = cell->getPort("\\A");
|
||||
|
@ -811,7 +854,7 @@ void replace_const_cells(RTLIL::Design *design, RTLIL::Module *module, bool cons
|
|||
}
|
||||
}
|
||||
|
||||
if (cell->type == "$_TBUF_" || cell->type == "$tribuf") {
|
||||
if (cell->type.in("$_TBUF_", "$tribuf")) {
|
||||
RTLIL::SigSpec input = cell->getPort(cell->type == "$_TBUF_" ? "\\E" : "\\EN");
|
||||
RTLIL::SigSpec a = cell->getPort("\\A");
|
||||
assign_map.apply(input);
|
||||
|
@ -828,7 +871,7 @@ void replace_const_cells(RTLIL::Design *design, RTLIL::Module *module, bool cons
|
|||
}
|
||||
}
|
||||
|
||||
if (cell->type == "$eq" || cell->type == "$ne" || cell->type == "$eqx" || cell->type == "$nex")
|
||||
if (cell->type.in("$eq", "$ne", "$eqx", "$nex"))
|
||||
{
|
||||
RTLIL::SigSpec a = cell->getPort("\\A");
|
||||
RTLIL::SigSpec b = cell->getPort("\\B");
|
||||
|
@ -845,7 +888,7 @@ void replace_const_cells(RTLIL::Design *design, RTLIL::Module *module, bool cons
|
|||
for (int i = 0; i < GetSize(a); i++) {
|
||||
if (a[i].wire == NULL && b[i].wire == NULL && a[i] != b[i] && a[i].data <= RTLIL::State::S1 && b[i].data <= RTLIL::State::S1) {
|
||||
cover_list("opt.opt_expr.eqneq.isneq", "$eq", "$ne", "$eqx", "$nex", cell->type.str());
|
||||
RTLIL::SigSpec new_y = RTLIL::SigSpec((cell->type == "$eq" || cell->type == "$eqx") ? RTLIL::State::S0 : RTLIL::State::S1);
|
||||
RTLIL::SigSpec new_y = RTLIL::SigSpec(cell->type.in("$eq", "$eqx") ? RTLIL::State::S0 : RTLIL::State::S1);
|
||||
new_y.extend_u0(cell->parameters["\\Y_WIDTH"].as_int(), false);
|
||||
replace_cell(assign_map, module, cell, "isneq", "\\Y", new_y);
|
||||
goto next_cell;
|
||||
|
@ -858,7 +901,7 @@ void replace_const_cells(RTLIL::Design *design, RTLIL::Module *module, bool cons
|
|||
|
||||
if (new_a.size() == 0) {
|
||||
cover_list("opt.opt_expr.eqneq.empty", "$eq", "$ne", "$eqx", "$nex", cell->type.str());
|
||||
RTLIL::SigSpec new_y = RTLIL::SigSpec((cell->type == "$eq" || cell->type == "$eqx") ? RTLIL::State::S1 : RTLIL::State::S0);
|
||||
RTLIL::SigSpec new_y = RTLIL::SigSpec(cell->type.in("$eq", "$eqx") ? RTLIL::State::S1 : RTLIL::State::S0);
|
||||
new_y.extend_u0(cell->parameters["\\Y_WIDTH"].as_int(), false);
|
||||
replace_cell(assign_map, module, cell, "empty", "\\Y", new_y);
|
||||
goto next_cell;
|
||||
|
@ -873,7 +916,7 @@ void replace_const_cells(RTLIL::Design *design, RTLIL::Module *module, bool cons
|
|||
}
|
||||
}
|
||||
|
||||
if ((cell->type == "$eq" || cell->type == "$ne") && cell->parameters["\\Y_WIDTH"].as_int() == 1 &&
|
||||
if (cell->type.in("$eq", "$ne") && cell->parameters["\\Y_WIDTH"].as_int() == 1 &&
|
||||
cell->parameters["\\A_WIDTH"].as_int() == 1 && cell->parameters["\\B_WIDTH"].as_int() == 1)
|
||||
{
|
||||
RTLIL::SigSpec a = assign_map(cell->getPort("\\A"));
|
||||
|
@ -903,7 +946,7 @@ void replace_const_cells(RTLIL::Design *design, RTLIL::Module *module, bool cons
|
|||
}
|
||||
}
|
||||
|
||||
if ((cell->type == "$eq" || cell->type == "$ne") &&
|
||||
if (cell->type.in("$eq", "$ne") &&
|
||||
(assign_map(cell->getPort("\\A")).is_fully_zero() || assign_map(cell->getPort("\\B")).is_fully_zero()))
|
||||
{
|
||||
cover_list("opt.opt_expr.eqneq.cmpzero", "$eq", "$ne", cell->type.str());
|
||||
|
@ -962,7 +1005,7 @@ void replace_const_cells(RTLIL::Design *design, RTLIL::Module *module, bool cons
|
|||
bool identity_wrt_b = false;
|
||||
bool arith_inverse = false;
|
||||
|
||||
if (cell->type == "$add" || cell->type == "$sub" || cell->type == "$or" || cell->type == "$xor")
|
||||
if (cell->type.in("$add", "$sub", "$or", "$xor"))
|
||||
{
|
||||
RTLIL::SigSpec a = assign_map(cell->getPort("\\A"));
|
||||
RTLIL::SigSpec b = assign_map(cell->getPort("\\B"));
|
||||
|
@ -974,7 +1017,7 @@ void replace_const_cells(RTLIL::Design *design, RTLIL::Module *module, bool cons
|
|||
identity_wrt_a = true;
|
||||
}
|
||||
|
||||
if (cell->type == "$shl" || cell->type == "$shr" || cell->type == "$sshl" || cell->type == "$sshr" || cell->type == "$shift" || cell->type == "$shiftx")
|
||||
if (cell->type.in("$shl", "$shr", "$sshl", "$sshr", "$shift", "$shiftx"))
|
||||
{
|
||||
RTLIL::SigSpec b = assign_map(cell->getPort("\\B"));
|
||||
|
||||
|
@ -1029,15 +1072,15 @@ void replace_const_cells(RTLIL::Design *design, RTLIL::Module *module, bool cons
|
|||
}
|
||||
}
|
||||
|
||||
if (mux_bool && (cell->type == "$mux" || cell->type == "$_MUX_") &&
|
||||
cell->getPort("\\A") == RTLIL::SigSpec(0, 1) && cell->getPort("\\B") == RTLIL::SigSpec(1, 1)) {
|
||||
if (mux_bool && cell->type.in("$mux", "$_MUX_") &&
|
||||
cell->getPort("\\A") == State::S0 && cell->getPort("\\B") == State::S1) {
|
||||
cover_list("opt.opt_expr.mux_bool", "$mux", "$_MUX_", cell->type.str());
|
||||
replace_cell(assign_map, module, cell, "mux_bool", "\\Y", cell->getPort("\\S"));
|
||||
goto next_cell;
|
||||
}
|
||||
|
||||
if (mux_bool && (cell->type == "$mux" || cell->type == "$_MUX_") &&
|
||||
cell->getPort("\\A") == RTLIL::SigSpec(1, 1) && cell->getPort("\\B") == RTLIL::SigSpec(0, 1)) {
|
||||
if (mux_bool && cell->type.in("$mux", "$_MUX_") &&
|
||||
cell->getPort("\\A") == State::S1 && cell->getPort("\\B") == State::S0) {
|
||||
cover_list("opt.opt_expr.mux_invert", "$mux", "$_MUX_", cell->type.str());
|
||||
log_debug("Replacing %s cell `%s' in module `%s' with inverter.\n", log_id(cell->type), log_id(cell), log_id(module));
|
||||
cell->setPort("\\A", cell->getPort("\\S"));
|
||||
|
@ -1056,7 +1099,7 @@ void replace_const_cells(RTLIL::Design *design, RTLIL::Module *module, bool cons
|
|||
goto next_cell;
|
||||
}
|
||||
|
||||
if (consume_x && mux_bool && (cell->type == "$mux" || cell->type == "$_MUX_") && cell->getPort("\\A") == RTLIL::SigSpec(0, 1)) {
|
||||
if (consume_x && mux_bool && cell->type.in("$mux", "$_MUX_") && cell->getPort("\\A") == State::S0) {
|
||||
cover_list("opt.opt_expr.mux_and", "$mux", "$_MUX_", cell->type.str());
|
||||
log_debug("Replacing %s cell `%s' in module `%s' with and-gate.\n", log_id(cell->type), log_id(cell), log_id(module));
|
||||
cell->setPort("\\A", cell->getPort("\\S"));
|
||||
|
@ -1076,7 +1119,7 @@ void replace_const_cells(RTLIL::Design *design, RTLIL::Module *module, bool cons
|
|||
goto next_cell;
|
||||
}
|
||||
|
||||
if (consume_x && mux_bool && (cell->type == "$mux" || cell->type == "$_MUX_") && cell->getPort("\\B") == RTLIL::SigSpec(1, 1)) {
|
||||
if (consume_x && mux_bool && cell->type.in("$mux", "$_MUX_") && cell->getPort("\\B") == State::S1) {
|
||||
cover_list("opt.opt_expr.mux_or", "$mux", "$_MUX_", cell->type.str());
|
||||
log_debug("Replacing %s cell `%s' in module `%s' with or-gate.\n", log_id(cell->type), log_id(cell), log_id(module));
|
||||
cell->setPort("\\B", cell->getPort("\\S"));
|
||||
|
@ -1096,7 +1139,7 @@ void replace_const_cells(RTLIL::Design *design, RTLIL::Module *module, bool cons
|
|||
goto next_cell;
|
||||
}
|
||||
|
||||
if (mux_undef && (cell->type == "$mux" || cell->type == "$pmux")) {
|
||||
if (mux_undef && cell->type.in("$mux", "$pmux")) {
|
||||
RTLIL::SigSpec new_a, new_b, new_s;
|
||||
int width = cell->getPort("\\A").size();
|
||||
if ((cell->getPort("\\A").is_fully_undef() && cell->getPort("\\B").is_fully_undef()) ||
|
||||
|
@ -1438,7 +1481,7 @@ void replace_const_cells(RTLIL::Design *design, RTLIL::Module *module, bool cons
|
|||
}
|
||||
|
||||
// simplify comparisons
|
||||
if (do_fine && (cell->type == "$lt" || cell->type == "$ge" || cell->type == "$gt" || cell->type == "$le"))
|
||||
if (do_fine && cell->type.in("$lt", "$ge", "$gt", "$le"))
|
||||
{
|
||||
IdString cmp_type = cell->type;
|
||||
SigSpec var_sig = cell->getPort("\\A");
|
||||
|
|
|
@ -101,6 +101,12 @@ struct OptLutWorker
|
|||
{
|
||||
if (cell->type == "$lut")
|
||||
{
|
||||
if (cell->has_keep_attr())
|
||||
continue;
|
||||
SigBit lut_output = cell->getPort("\\Y");
|
||||
if (lut_output.wire->get_bool_attribute("\\keep"))
|
||||
continue;
|
||||
|
||||
int lut_width = cell->getParam("\\WIDTH").as_int();
|
||||
SigSpec lut_input = cell->getPort("\\A");
|
||||
int lut_arity = 0;
|
||||
|
|
|
@ -94,8 +94,8 @@ struct OptMergeWorker
|
|||
const dict<RTLIL::IdString, RTLIL::SigSpec> *conn = &cell->connections();
|
||||
dict<RTLIL::IdString, RTLIL::SigSpec> alt_conn;
|
||||
|
||||
if (cell->type == "$and" || cell->type == "$or" || cell->type == "$xor" || cell->type == "$xnor" || cell->type == "$add" || cell->type == "$mul" ||
|
||||
cell->type == "$logic_and" || cell->type == "$logic_or" || cell->type == "$_AND_" || cell->type == "$_OR_" || cell->type == "$_XOR_") {
|
||||
if (cell->type.in("$and", "$or", "$xor", "$xnor", "$add", "$mul",
|
||||
"$logic_and", "$logic_or", "$_AND_", "$_OR_", "$_XOR_")) {
|
||||
alt_conn = *conn;
|
||||
if (assign_map(alt_conn.at("\\A")) < assign_map(alt_conn.at("\\B"))) {
|
||||
alt_conn["\\A"] = conn->at("\\B");
|
||||
|
@ -103,13 +103,13 @@ struct OptMergeWorker
|
|||
}
|
||||
conn = &alt_conn;
|
||||
} else
|
||||
if (cell->type == "$reduce_xor" || cell->type == "$reduce_xnor") {
|
||||
if (cell->type.in("$reduce_xor", "$reduce_xnor")) {
|
||||
alt_conn = *conn;
|
||||
assign_map.apply(alt_conn.at("\\A"));
|
||||
alt_conn.at("\\A").sort();
|
||||
conn = &alt_conn;
|
||||
} else
|
||||
if (cell->type == "$reduce_and" || cell->type == "$reduce_or" || cell->type == "$reduce_bool") {
|
||||
if (cell->type.in("$reduce_and", "$reduce_or", "$reduce_bool")) {
|
||||
alt_conn = *conn;
|
||||
assign_map.apply(alt_conn.at("\\A"));
|
||||
alt_conn.at("\\A").sort_and_unify();
|
||||
|
@ -222,7 +222,7 @@ struct OptMergeWorker
|
|||
return true;
|
||||
}
|
||||
|
||||
if (cell1->type.substr(0, 1) == "$" && conn1.count("\\Q") != 0) {
|
||||
if (cell1->type.begins_with("$") && conn1.count("\\Q") != 0) {
|
||||
std::vector<RTLIL::SigBit> q1 = dff_init_map(cell1->getPort("\\Q")).to_sigbit_vector();
|
||||
std::vector<RTLIL::SigBit> q2 = dff_init_map(cell2->getPort("\\Q")).to_sigbit_vector();
|
||||
for (size_t i = 0; i < q1.size(); i++)
|
||||
|
|
|
@ -84,7 +84,7 @@ struct OptMuxtreeWorker
|
|||
// .const_deactivated
|
||||
for (auto cell : module->cells())
|
||||
{
|
||||
if (cell->type == "$mux" || cell->type == "$pmux")
|
||||
if (cell->type.in("$mux", "$pmux"))
|
||||
{
|
||||
RTLIL::SigSpec sig_a = cell->getPort("\\A");
|
||||
RTLIL::SigSpec sig_b = cell->getPort("\\B");
|
||||
|
|
|
@ -63,15 +63,15 @@ bool handle_dffsr(RTLIL::Module *mod, RTLIL::Cell *cell)
|
|||
|
||||
log_assert(GetSize(sig_set) == GetSize(sig_clr));
|
||||
|
||||
if (cell->type.substr(0,8) == "$_DFFSR_") {
|
||||
if (cell->type.begins_with("$_DFFSR_")) {
|
||||
pol_set = cell->type[9] == 'P' ? State::S1 : State::S0;
|
||||
pol_clr = cell->type[10] == 'P' ? State::S1 : State::S0;
|
||||
} else
|
||||
if (cell->type.substr(0,11) == "$_DLATCHSR_") {
|
||||
if (cell->type.begins_with("$_DLATCHSR_")) {
|
||||
pol_set = cell->type[12] == 'P' ? State::S1 : State::S0;
|
||||
pol_clr = cell->type[13] == 'P' ? State::S1 : State::S0;
|
||||
} else
|
||||
if (cell->type == "$dffsr" || cell->type == "$dlatchsr") {
|
||||
if (cell->type.in("$dffsr", "$dlatchsr")) {
|
||||
pol_set = cell->parameters["\\SET_POLARITY"].as_bool() ? State::S1 : State::S0;
|
||||
pol_clr = cell->parameters["\\CLR_POLARITY"].as_bool() ? State::S1 : State::S0;
|
||||
} else
|
||||
|
@ -137,7 +137,7 @@ bool handle_dffsr(RTLIL::Module *mod, RTLIL::Cell *cell)
|
|||
return true;
|
||||
}
|
||||
|
||||
if (cell->type == "$dffsr" || cell->type == "$dlatchsr")
|
||||
if (cell->type.in("$dffsr", "$dlatchsr"))
|
||||
{
|
||||
cell->setParam("\\WIDTH", GetSize(sig_d));
|
||||
cell->setPort("\\SET", sig_set);
|
||||
|
@ -198,9 +198,9 @@ bool handle_dffsr(RTLIL::Module *mod, RTLIL::Cell *cell)
|
|||
{
|
||||
IdString new_type;
|
||||
|
||||
if (cell->type.substr(0,8) == "$_DFFSR_")
|
||||
if (cell->type.begins_with("$_DFFSR_"))
|
||||
new_type = stringf("$_DFF_%c_", cell->type[8]);
|
||||
else if (cell->type.substr(0,11) == "$_DLATCHSR_")
|
||||
else if (cell->type.begins_with("$_DLATCHSR_"))
|
||||
new_type = stringf("$_DLATCH_%c_", cell->type[11]);
|
||||
else
|
||||
log_abort();
|
||||
|
@ -278,7 +278,7 @@ bool handle_dff(RTLIL::Module *mod, RTLIL::Cell *dff)
|
|||
sig_c = dff->getPort("\\C");
|
||||
val_cp = RTLIL::Const(dff->type == "$_DFF_P_", 1);
|
||||
}
|
||||
else if (dff->type.substr(0,6) == "$_DFF_" && dff->type.substr(9) == "_" &&
|
||||
else if (dff->type.begins_with("$_DFF_") && dff->type.compare(9, 1, "_") == 0 &&
|
||||
(dff->type[6] == 'N' || dff->type[6] == 'P') &&
|
||||
(dff->type[7] == 'N' || dff->type[7] == 'P') &&
|
||||
(dff->type[8] == '0' || dff->type[8] == '1')) {
|
||||
|
@ -290,7 +290,7 @@ bool handle_dff(RTLIL::Module *mod, RTLIL::Cell *dff)
|
|||
val_rp = RTLIL::Const(dff->type[7] == 'P', 1);
|
||||
val_rv = RTLIL::Const(dff->type[8] == '1', 1);
|
||||
}
|
||||
else if (dff->type.substr(0,7) == "$_DFFE_" && dff->type.substr(9) == "_" &&
|
||||
else if (dff->type.begins_with("$_DFFE_") && dff->type.compare(9, 1, "_") == 0 &&
|
||||
(dff->type[7] == 'N' || dff->type[7] == 'P') &&
|
||||
(dff->type[8] == 'N' || dff->type[8] == 'P')) {
|
||||
sig_d = dff->getPort("\\D");
|
||||
|
@ -428,7 +428,7 @@ bool handle_dff(RTLIL::Module *mod, RTLIL::Cell *dff)
|
|||
return true;
|
||||
}
|
||||
|
||||
log_assert(dff->type.substr(0,6) == "$_DFF_");
|
||||
log_assert(dff->type.begins_with("$_DFF_"));
|
||||
dff->type = stringf("$_DFF_%c_", + dff->type[6]);
|
||||
dff->unsetPort("\\R");
|
||||
}
|
||||
|
@ -452,7 +452,7 @@ bool handle_dff(RTLIL::Module *mod, RTLIL::Cell *dff)
|
|||
return true;
|
||||
}
|
||||
|
||||
log_assert(dff->type.substr(0,7) == "$_DFFE_");
|
||||
log_assert(dff->type.begins_with("$_DFFE_"));
|
||||
dff->type = stringf("$_DFF_%c_", + dff->type[7]);
|
||||
dff->unsetPort("\\E");
|
||||
}
|
||||
|
@ -624,7 +624,7 @@ struct OptRmdffPass : public Pass {
|
|||
}
|
||||
}
|
||||
|
||||
if (cell->type == "$mux" || cell->type == "$pmux") {
|
||||
if (cell->type.in("$mux", "$pmux")) {
|
||||
if (cell->getPort("\\A").size() == cell->getPort("\\B").size())
|
||||
mux_drivers.insert(assign_map(cell->getPort("\\Y")), cell);
|
||||
continue;
|
||||
|
|
|
@ -376,13 +376,13 @@ struct ShareWorker
|
|||
continue;
|
||||
}
|
||||
|
||||
if (cell->type == "$mul" || cell->type == "$div" || cell->type == "$mod") {
|
||||
if (cell->type.in("$mul", "$div", "$mod")) {
|
||||
if (config.opt_aggressive || cell->parameters.at("\\Y_WIDTH").as_int() >= 4)
|
||||
shareable_cells.insert(cell);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (cell->type == "$shl" || cell->type == "$shr" || cell->type == "$sshl" || cell->type == "$sshr") {
|
||||
if (cell->type.in("$shl", "$shr", "$sshl", "$sshr")) {
|
||||
if (config.opt_aggressive || cell->parameters.at("\\Y_WIDTH").as_int() >= 8)
|
||||
shareable_cells.insert(cell);
|
||||
continue;
|
||||
|
|
|
@ -55,7 +55,7 @@ bool check_signal(RTLIL::Module *mod, RTLIL::SigSpec signal, RTLIL::SigSpec ref,
|
|||
return check_signal(mod, cell->getPort("\\A"), ref, polarity);
|
||||
}
|
||||
|
||||
if ((cell->type == "$eq" || cell->type == "$eqx") && cell->getPort("\\Y") == signal) {
|
||||
if (cell->type.in("$eq", "$eqx") && cell->getPort("\\Y") == signal) {
|
||||
if (cell->getPort("\\A").is_fully_const()) {
|
||||
if (!cell->getPort("\\A").as_bool())
|
||||
polarity = !polarity;
|
||||
|
@ -68,7 +68,7 @@ bool check_signal(RTLIL::Module *mod, RTLIL::SigSpec signal, RTLIL::SigSpec ref,
|
|||
}
|
||||
}
|
||||
|
||||
if ((cell->type == "$ne" || cell->type == "$nex") && cell->getPort("\\Y") == signal) {
|
||||
if (cell->type.in("$ne", "$nex") && cell->getPort("\\Y") == signal) {
|
||||
if (cell->getPort("\\A").is_fully_const()) {
|
||||
if (cell->getPort("\\A").as_bool())
|
||||
polarity = !polarity;
|
||||
|
|
|
@ -65,8 +65,7 @@ struct PruneWorker
|
|||
pool<RTLIL::SigBit> sw_assigned = do_switch((*it), assigned, affected);
|
||||
assigned.insert(sw_assigned.begin(), sw_assigned.end());
|
||||
}
|
||||
pool<RTLIL::SigSig> remove;
|
||||
for (auto it = cs->actions.rbegin(); it != cs->actions.rend(); ++it) {
|
||||
for (auto it = cs->actions.rbegin(); it != cs->actions.rend(); ) {
|
||||
RTLIL::SigSpec lhs = sigmap(it->first);
|
||||
bool redundant = true;
|
||||
for (auto &bit : lhs) {
|
||||
|
@ -75,9 +74,10 @@ struct PruneWorker
|
|||
break;
|
||||
}
|
||||
}
|
||||
bool remove = false;
|
||||
if (redundant) {
|
||||
removed_count++;
|
||||
remove.insert(*it);
|
||||
remove = true;
|
||||
} else {
|
||||
if (root) {
|
||||
bool promotable = true;
|
||||
|
@ -99,7 +99,7 @@ struct PruneWorker
|
|||
}
|
||||
promoted_count++;
|
||||
module->connect(conn);
|
||||
remove.insert(*it);
|
||||
remove = true;
|
||||
}
|
||||
}
|
||||
for (auto &bit : lhs)
|
||||
|
@ -109,11 +109,9 @@ struct PruneWorker
|
|||
if (bit.wire)
|
||||
affected.insert(bit);
|
||||
}
|
||||
}
|
||||
for (auto it = cs->actions.begin(); it != cs->actions.end(); ) {
|
||||
if (remove[*it]) {
|
||||
it = cs->actions.erase(it);
|
||||
} else it++;
|
||||
if (remove)
|
||||
cs->actions.erase((it++).base() - 1);
|
||||
else it++;
|
||||
}
|
||||
return assigned;
|
||||
}
|
||||
|
|
|
@ -47,8 +47,8 @@ struct BruteForceEquivChecker
|
|||
{
|
||||
if (inputs.size() < mod1_inputs.size()) {
|
||||
RTLIL::SigSpec inputs0 = inputs, inputs1 = inputs;
|
||||
inputs0.append(RTLIL::Const(0, 1));
|
||||
inputs1.append(RTLIL::Const(1, 1));
|
||||
inputs0.append(State::S0);
|
||||
inputs1.append(State::S1);
|
||||
run_checker(inputs0);
|
||||
run_checker(inputs1);
|
||||
return;
|
||||
|
|
|
@ -151,7 +151,7 @@ void create_dff_dq_map(std::map<RTLIL::IdString, dff_map_info_t> &map, RTLIL::De
|
|||
continue;
|
||||
}
|
||||
|
||||
if (info.cell->type.size() == 10 && info.cell->type.substr(0, 6) == "$_DFF_") {
|
||||
if (info.cell->type.size() == 10 && info.cell->type.begins_with("$_DFF_")) {
|
||||
info.bit_clk = sigmap(info.cell->getPort("\\C")).as_bit();
|
||||
info.bit_arst = sigmap(info.cell->getPort("\\R")).as_bit();
|
||||
info.clk_polarity = info.cell->type[6] == 'P';
|
||||
|
|
|
@ -59,7 +59,7 @@ void create_miter_equiv(struct Pass *that, std::vector<std::string> args, RTLIL:
|
|||
}
|
||||
break;
|
||||
}
|
||||
if (argidx+3 != args.size() || args[argidx].substr(0, 1) == "-")
|
||||
if (argidx+3 != args.size() || args[argidx].compare(0, 1, "-") == 0)
|
||||
that->cmd_error(args, argidx, "command argument error");
|
||||
|
||||
RTLIL::IdString gold_name = RTLIL::escape_id(args[argidx++]);
|
||||
|
@ -236,7 +236,7 @@ void create_miter_equiv(struct Pass *that, std::vector<std::string> args, RTLIL:
|
|||
if (flag_make_assert) {
|
||||
RTLIL::Cell *assert_cell = miter_module->addCell(NEW_ID, "$assert");
|
||||
assert_cell->setPort("\\A", all_conditions);
|
||||
assert_cell->setPort("\\EN", RTLIL::SigSpec(1, 1));
|
||||
assert_cell->setPort("\\EN", State::S1);
|
||||
}
|
||||
|
||||
RTLIL::Wire *w_trigger = miter_module->addWire("\\trigger");
|
||||
|
@ -279,7 +279,7 @@ void create_miter_assert(struct Pass *that, std::vector<std::string> args, RTLIL
|
|||
}
|
||||
break;
|
||||
}
|
||||
if ((argidx+1 != args.size() && argidx+2 != args.size()) || args[argidx].substr(0, 1) == "-")
|
||||
if ((argidx+1 != args.size() && argidx+2 != args.size()) || args[argidx].compare(0, 1, "-") == 0)
|
||||
that->cmd_error(args, argidx, "command argument error");
|
||||
|
||||
IdString module_name = RTLIL::escape_id(args[argidx++]);
|
||||
|
|
|
@ -519,7 +519,7 @@ struct SatHelper
|
|||
for (auto &p : d->connections()) {
|
||||
if (d->type == "$dff" && p.first == "\\CLK")
|
||||
continue;
|
||||
if (d->type.substr(0, 6) == "$_DFF_" && p.first == "\\C")
|
||||
if (d->type.begins_with("$_DFF_") && p.first == "\\C")
|
||||
continue;
|
||||
queued_signals.add(handled_signals.remove(sigmap(p.second)));
|
||||
}
|
||||
|
@ -797,7 +797,7 @@ struct SatHelper
|
|||
|
||||
vector<string> data;
|
||||
string name = wd.first.c_str();
|
||||
while (name.substr(0, 1) == "\\")
|
||||
while (name.compare(0, 1, "\\") == 0)
|
||||
name = name.substr(1);
|
||||
|
||||
fprintf(f, " { \"name\": \"%s\", \"wave\": \"", name.c_str());
|
||||
|
@ -1353,7 +1353,7 @@ struct SatPass : public Pass {
|
|||
if (show_regs) {
|
||||
pool<Wire*> reg_wires;
|
||||
for (auto cell : module->cells()) {
|
||||
if (cell->type == "$dff" || cell->type.substr(0, 6) == "$_DFF_")
|
||||
if (cell->type == "$dff" || cell->type.begins_with("$_DFF_"))
|
||||
for (auto bit : cell->getPort("\\Q"))
|
||||
if (bit.wire)
|
||||
reg_wires.insert(bit.wire);
|
||||
|
|
|
@ -166,7 +166,7 @@ void mark_port(RTLIL::SigSpec sig)
|
|||
|
||||
void extract_cell(RTLIL::Cell *cell, bool keepff)
|
||||
{
|
||||
if (cell->type == "$_DFF_N_" || cell->type == "$_DFF_P_")
|
||||
if (cell->type.in("$_DFF_N_", "$_DFF_P_"))
|
||||
{
|
||||
if (clk_polarity != (cell->type == "$_DFF_P_"))
|
||||
return;
|
||||
|
@ -177,11 +177,11 @@ void extract_cell(RTLIL::Cell *cell, bool keepff)
|
|||
goto matching_dff;
|
||||
}
|
||||
|
||||
if (cell->type == "$_DFFE_NN_" || cell->type == "$_DFFE_NP_" || cell->type == "$_DFFE_PN_" || cell->type == "$_DFFE_PP_")
|
||||
if (cell->type.in("$_DFFE_NN_", "$_DFFE_NP_", "$_DFFE_PN_", "$_DFFE_PP_"))
|
||||
{
|
||||
if (clk_polarity != (cell->type == "$_DFFE_PN_" || cell->type == "$_DFFE_PP_"))
|
||||
if (clk_polarity != cell->type.in("$_DFFE_PN_", "$_DFFE_PP_"))
|
||||
return;
|
||||
if (en_polarity != (cell->type == "$_DFFE_NP_" || cell->type == "$_DFFE_PP_"))
|
||||
if (en_polarity != cell->type.in("$_DFFE_NP_", "$_DFFE_PP_"))
|
||||
return;
|
||||
if (clk_sig != assign_map(cell->getPort("\\C")))
|
||||
return;
|
||||
|
@ -333,17 +333,17 @@ std::string remap_name(RTLIL::IdString abc_name, RTLIL::Wire **orig_wire = nullp
|
|||
{
|
||||
std::string abc_sname = abc_name.substr(1);
|
||||
bool isnew = false;
|
||||
if (abc_sname.substr(0, 4) == "new_")
|
||||
if (abc_sname.compare(0, 4, "new_") == 0)
|
||||
{
|
||||
abc_sname.erase(0, 4);
|
||||
isnew = true;
|
||||
}
|
||||
if (abc_sname.substr(0, 5) == "ys__n")
|
||||
if (abc_sname.compare(0, 5, "ys__n") == 0)
|
||||
{
|
||||
abc_sname.erase(0, 5);
|
||||
if (std::isdigit(abc_sname.at(0)))
|
||||
{
|
||||
int sid = std::stoi(abc_sname);
|
||||
int sid = std::atoi(abc_sname.c_str());
|
||||
size_t postfix_start = abc_sname.find_first_not_of("0123456789");
|
||||
std::string postfix = postfix_start != std::string::npos ? abc_sname.substr(postfix_start) : "";
|
||||
|
||||
|
@ -941,33 +941,33 @@ void abc_module(RTLIL::Design *design, RTLIL::Module *current_module, std::strin
|
|||
fprintf(f, "GATE ONE 1 Y=CONST1;\n");
|
||||
fprintf(f, "GATE BUF %d Y=A; PIN * NONINV 1 999 1 0 1 0\n", cell_cost.at("$_BUF_"));
|
||||
fprintf(f, "GATE NOT %d Y=!A; PIN * INV 1 999 1 0 1 0\n", cell_cost.at("$_NOT_"));
|
||||
if (enabled_gates.empty() || enabled_gates.count("AND"))
|
||||
if (enabled_gates.count("AND"))
|
||||
fprintf(f, "GATE AND %d Y=A*B; PIN * NONINV 1 999 1 0 1 0\n", cell_cost.at("$_AND_"));
|
||||
if (enabled_gates.empty() || enabled_gates.count("NAND"))
|
||||
if (enabled_gates.count("NAND"))
|
||||
fprintf(f, "GATE NAND %d Y=!(A*B); PIN * INV 1 999 1 0 1 0\n", cell_cost.at("$_NAND_"));
|
||||
if (enabled_gates.empty() || enabled_gates.count("OR"))
|
||||
if (enabled_gates.count("OR"))
|
||||
fprintf(f, "GATE OR %d Y=A+B; PIN * NONINV 1 999 1 0 1 0\n", cell_cost.at("$_OR_"));
|
||||
if (enabled_gates.empty() || enabled_gates.count("NOR"))
|
||||
if (enabled_gates.count("NOR"))
|
||||
fprintf(f, "GATE NOR %d Y=!(A+B); PIN * INV 1 999 1 0 1 0\n", cell_cost.at("$_NOR_"));
|
||||
if (enabled_gates.empty() || enabled_gates.count("XOR"))
|
||||
if (enabled_gates.count("XOR"))
|
||||
fprintf(f, "GATE XOR %d Y=(A*!B)+(!A*B); PIN * UNKNOWN 1 999 1 0 1 0\n", cell_cost.at("$_XOR_"));
|
||||
if (enabled_gates.empty() || enabled_gates.count("XNOR"))
|
||||
if (enabled_gates.count("XNOR"))
|
||||
fprintf(f, "GATE XNOR %d Y=(A*B)+(!A*!B); PIN * UNKNOWN 1 999 1 0 1 0\n", cell_cost.at("$_XNOR_"));
|
||||
if (enabled_gates.empty() || enabled_gates.count("ANDNOT"))
|
||||
if (enabled_gates.count("ANDNOT"))
|
||||
fprintf(f, "GATE ANDNOT %d Y=A*!B; PIN * UNKNOWN 1 999 1 0 1 0\n", cell_cost.at("$_ANDNOT_"));
|
||||
if (enabled_gates.empty() || enabled_gates.count("ORNOT"))
|
||||
if (enabled_gates.count("ORNOT"))
|
||||
fprintf(f, "GATE ORNOT %d Y=A+!B; PIN * UNKNOWN 1 999 1 0 1 0\n", cell_cost.at("$_ORNOT_"));
|
||||
if (enabled_gates.empty() || enabled_gates.count("AOI3"))
|
||||
if (enabled_gates.count("AOI3"))
|
||||
fprintf(f, "GATE AOI3 %d Y=!((A*B)+C); PIN * INV 1 999 1 0 1 0\n", cell_cost.at("$_AOI3_"));
|
||||
if (enabled_gates.empty() || enabled_gates.count("OAI3"))
|
||||
if (enabled_gates.count("OAI3"))
|
||||
fprintf(f, "GATE OAI3 %d Y=!((A+B)*C); PIN * INV 1 999 1 0 1 0\n", cell_cost.at("$_OAI3_"));
|
||||
if (enabled_gates.empty() || enabled_gates.count("AOI4"))
|
||||
if (enabled_gates.count("AOI4"))
|
||||
fprintf(f, "GATE AOI4 %d Y=!((A*B)+(C*D)); PIN * INV 1 999 1 0 1 0\n", cell_cost.at("$_AOI4_"));
|
||||
if (enabled_gates.empty() || enabled_gates.count("OAI4"))
|
||||
if (enabled_gates.count("OAI4"))
|
||||
fprintf(f, "GATE OAI4 %d Y=!((A+B)*(C+D)); PIN * INV 1 999 1 0 1 0\n", cell_cost.at("$_OAI4_"));
|
||||
if (enabled_gates.empty() || enabled_gates.count("MUX"))
|
||||
if (enabled_gates.count("MUX"))
|
||||
fprintf(f, "GATE MUX %d Y=(A*B)+(S*B)+(!S*A); PIN * UNKNOWN 1 999 1 0 1 0\n", cell_cost.at("$_MUX_"));
|
||||
if (enabled_gates.empty() || enabled_gates.count("NMUX"))
|
||||
if (enabled_gates.count("NMUX"))
|
||||
fprintf(f, "GATE NMUX %d Y=!((A*B)+(S*B)+(!S*A)); PIN * UNKNOWN 1 999 1 0 1 0\n", cell_cost.at("$_NMUX_"));
|
||||
if (map_mux4)
|
||||
fprintf(f, "GATE MUX4 %d Y=(!S*!T*A)+(S*!T*B)+(!S*T*C)+(S*T*D); PIN * UNKNOWN 1 999 1 0 1 0\n", 2*cell_cost.at("$_MUX_"));
|
||||
|
@ -1411,7 +1411,9 @@ struct AbcPass : public Pass {
|
|||
// log("\n");
|
||||
log(" -g type1,type2,...\n");
|
||||
log(" Map to the specified list of gate types. Supported gates types are:\n");
|
||||
log(" AND, NAND, OR, NOR, XOR, XNOR, ANDNOT, ORNOT, MUX, AOI3, OAI3, AOI4, OAI4.\n");
|
||||
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
|
||||
log(" AND, NAND, OR, NOR, XOR, XNOR, ANDNOT, ORNOT, MUX,\n");
|
||||
log(" NMUX, AOI3, OAI3, AOI4, OAI4.\n");
|
||||
log(" (The NOT gate is always added to this list automatically.)\n");
|
||||
log("\n");
|
||||
log(" The following aliases can be used to reference common sets of gate types:\n");
|
||||
|
@ -1423,9 +1425,13 @@ struct AbcPass : public Pass {
|
|||
log(" gates: AND NAND OR NOR XOR XNOR ANDNOT ORNOT\n");
|
||||
log(" aig: AND NAND OR NOR ANDNOT ORNOT\n");
|
||||
log("\n");
|
||||
log(" The alias 'all' represent the full set of all gate types.\n");
|
||||
log("\n");
|
||||
log(" Prefix a gate type with a '-' to remove it from the list. For example\n");
|
||||
log(" the arguments 'AND,OR,XOR' and 'simple,-MUX' are equivalent.\n");
|
||||
log("\n");
|
||||
log(" The default is 'all,-NMUX,-AOI3,-OAI3,-AOI4,-OAI4'.\n");
|
||||
log("\n");
|
||||
log(" -dff\n");
|
||||
log(" also pass $_DFF_?_ and $_DFFE_??_ cells through ABC. modules with many\n");
|
||||
log(" clock domains are automatically partitioned in clock domains and each\n");
|
||||
|
@ -1584,7 +1590,7 @@ struct AbcPass : public Pass {
|
|||
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()))
|
||||
while (GetSize(lut_costs) < std::atoi(parts.at(0).c_str()))
|
||||
lut_costs.push_back(atoi(parts.at(1).c_str()));
|
||||
else
|
||||
log_cmd_error("Invalid -luts syntax.\n");
|
||||
|
@ -1701,6 +1707,22 @@ struct AbcPass : public Pass {
|
|||
gate_list.push_back("ORNOT");
|
||||
goto ok_alias;
|
||||
}
|
||||
if (g == "all") {
|
||||
gate_list.push_back("AND");
|
||||
gate_list.push_back("NAND");
|
||||
gate_list.push_back("OR");
|
||||
gate_list.push_back("NOR");
|
||||
gate_list.push_back("XOR");
|
||||
gate_list.push_back("XNOR");
|
||||
gate_list.push_back("ANDNOT");
|
||||
gate_list.push_back("ORNOT");
|
||||
gate_list.push_back("AOI3");
|
||||
gate_list.push_back("OAI3");
|
||||
gate_list.push_back("AOI4");
|
||||
gate_list.push_back("OAI4");
|
||||
gate_list.push_back("MUX");
|
||||
gate_list.push_back("NMUX");
|
||||
}
|
||||
cmd_error(args, argidx, stringf("Unsupported gate type: %s", g.c_str()));
|
||||
ok_gate:
|
||||
gate_list.push_back(g);
|
||||
|
@ -1752,6 +1774,23 @@ struct AbcPass : public Pass {
|
|||
if (!constr_file.empty() && liberty_file.empty())
|
||||
log_cmd_error("Got -constr but no -liberty!\n");
|
||||
|
||||
if (enabled_gates.empty()) {
|
||||
enabled_gates.insert("AND");
|
||||
enabled_gates.insert("NAND");
|
||||
enabled_gates.insert("OR");
|
||||
enabled_gates.insert("NOR");
|
||||
enabled_gates.insert("XOR");
|
||||
enabled_gates.insert("XNOR");
|
||||
enabled_gates.insert("ANDNOT");
|
||||
enabled_gates.insert("ORNOT");
|
||||
// enabled_gates.insert("AOI3");
|
||||
// enabled_gates.insert("OAI3");
|
||||
// enabled_gates.insert("AOI4");
|
||||
// enabled_gates.insert("OAI4");
|
||||
enabled_gates.insert("MUX");
|
||||
// enabled_gates.insert("NMUX");
|
||||
}
|
||||
|
||||
for (auto mod : design->selected_modules())
|
||||
{
|
||||
if (mod->processes.size() > 0) {
|
||||
|
@ -1822,15 +1861,15 @@ struct AbcPass : public Pass {
|
|||
}
|
||||
}
|
||||
|
||||
if (cell->type == "$_DFF_N_" || cell->type == "$_DFF_P_")
|
||||
if (cell->type.in("$_DFF_N_", "$_DFF_P_"))
|
||||
{
|
||||
key = clkdomain_t(cell->type == "$_DFF_P_", assign_map(cell->getPort("\\C")), true, RTLIL::SigSpec());
|
||||
}
|
||||
else
|
||||
if (cell->type == "$_DFFE_NN_" || cell->type == "$_DFFE_NP_" || cell->type == "$_DFFE_PN_" || cell->type == "$_DFFE_PP_")
|
||||
if (cell->type.in("$_DFFE_NN_", "$_DFFE_NP_" "$_DFFE_PN_", "$_DFFE_PP_"))
|
||||
{
|
||||
bool this_clk_pol = cell->type == "$_DFFE_PN_" || cell->type == "$_DFFE_PP_";
|
||||
bool this_en_pol = cell->type == "$_DFFE_NP_" || cell->type == "$_DFFE_PP_";
|
||||
bool this_clk_pol = cell->type.in("$_DFFE_PN_", "$_DFFE_PP_");
|
||||
bool this_en_pol = cell->type.in("$_DFFE_NP_", "$_DFFE_PP_");
|
||||
key = clkdomain_t(this_clk_pol, assign_map(cell->getPort("\\C")), this_en_pol, assign_map(cell->getPort("\\E")));
|
||||
}
|
||||
else
|
||||
|
|
|
@ -593,7 +593,7 @@ void abc9_module(RTLIL::Design *design, RTLIL::Module *current_module, std::stri
|
|||
c->setPort("\\Y", module->addWire(NEW_ID));
|
||||
RTLIL::Wire *wire = module->wire(remap_name(y_bit.wire->name));
|
||||
log_assert(wire);
|
||||
module->connect(RTLIL::SigBit(wire, y_bit.offset), RTLIL::S1);
|
||||
module->connect(RTLIL::SigBit(wire, y_bit.offset), State::S1);
|
||||
}
|
||||
else if (!lut_costs.empty() || !lut_file.empty()) {
|
||||
RTLIL::Cell* driver_lut = nullptr;
|
||||
|
@ -1153,15 +1153,15 @@ struct Abc9Pass : public Pass {
|
|||
}
|
||||
}
|
||||
|
||||
if (cell->type == "$_DFF_N_" || cell->type == "$_DFF_P_")
|
||||
if (cell->type.in("$_DFF_N_", "$_DFF_P_"))
|
||||
{
|
||||
key = clkdomain_t(cell->type == "$_DFF_P_", assign_map(cell->getPort("\\C")), true, RTLIL::SigSpec());
|
||||
}
|
||||
else
|
||||
if (cell->type == "$_DFFE_NN_" || cell->type == "$_DFFE_NP_" || cell->type == "$_DFFE_PN_" || cell->type == "$_DFFE_PP_")
|
||||
if (cell->type.in("$_DFFE_NN_", "$_DFFE_NP_", "$_DFFE_PN_", "$_DFFE_PP_"))
|
||||
{
|
||||
bool this_clk_pol = cell->type == "$_DFFE_PN_" || cell->type == "$_DFFE_PP_";
|
||||
bool this_en_pol = cell->type == "$_DFFE_NP_" || cell->type == "$_DFFE_PP_";
|
||||
bool this_clk_pol = cell->type.in("$_DFFE_PN_", "$_DFFE_PP_");
|
||||
bool this_en_pol = cell->type.in("$_DFFE_NP_", "$_DFFE_PP_");
|
||||
key = clkdomain_t(this_clk_pol, assign_map(cell->getPort("\\C")), this_en_pol, assign_map(cell->getPort("\\E")));
|
||||
}
|
||||
else
|
||||
|
|
|
@ -66,7 +66,7 @@ struct AigmapPass : public Pass {
|
|||
{
|
||||
Aig aig(cell);
|
||||
|
||||
if (cell->type == "$_AND_" || cell->type == "$_NOT_")
|
||||
if (cell->type.in("$_AND_", "$_NOT_"))
|
||||
aig.name.clear();
|
||||
|
||||
if (nand_mode && cell->type == "$_NAND_")
|
||||
|
|
|
@ -315,7 +315,7 @@ struct AlumaccWorker
|
|||
}
|
||||
|
||||
if (subtract_b)
|
||||
C.append(RTLIL::S1);
|
||||
C.append(State::S1);
|
||||
|
||||
if (GetSize(C) > 1)
|
||||
goto next_macc;
|
||||
|
@ -402,7 +402,7 @@ struct AlumaccWorker
|
|||
alunode_t *n = nullptr;
|
||||
|
||||
for (auto node : sig_alu[RTLIL::SigSig(A, B)])
|
||||
if (node->is_signed == is_signed && node->invert_b && node->c == RTLIL::S1) {
|
||||
if (node->is_signed == is_signed && node->invert_b && node->c == State::S1) {
|
||||
n = node;
|
||||
break;
|
||||
}
|
||||
|
@ -411,7 +411,7 @@ struct AlumaccWorker
|
|||
n = new alunode_t;
|
||||
n->a = A;
|
||||
n->b = B;
|
||||
n->c = RTLIL::S1;
|
||||
n->c = State::S1;
|
||||
n->y = module->addWire(NEW_ID, max(GetSize(A), GetSize(B)));
|
||||
n->is_signed = is_signed;
|
||||
n->invert_b = true;
|
||||
|
@ -440,7 +440,7 @@ struct AlumaccWorker
|
|||
alunode_t *n = nullptr;
|
||||
|
||||
for (auto node : sig_alu[RTLIL::SigSig(A, B)])
|
||||
if (node->is_signed == is_signed && node->invert_b && node->c == RTLIL::S1) {
|
||||
if (node->is_signed == is_signed && node->invert_b && node->c == State::S1) {
|
||||
n = node;
|
||||
break;
|
||||
}
|
||||
|
@ -484,8 +484,8 @@ struct AlumaccWorker
|
|||
|
||||
n->alu_cell->setPort("\\A", n->a);
|
||||
n->alu_cell->setPort("\\B", n->b);
|
||||
n->alu_cell->setPort("\\CI", GetSize(n->c) ? n->c : RTLIL::S0);
|
||||
n->alu_cell->setPort("\\BI", n->invert_b ? RTLIL::S1 : RTLIL::S0);
|
||||
n->alu_cell->setPort("\\CI", GetSize(n->c) ? n->c : State::S0);
|
||||
n->alu_cell->setPort("\\BI", n->invert_b ? State::S1 : State::S0);
|
||||
n->alu_cell->setPort("\\Y", n->y);
|
||||
n->alu_cell->setPort("\\X", module->addWire(NEW_ID, GetSize(n->y)));
|
||||
n->alu_cell->setPort("\\CO", module->addWire(NEW_ID, GetSize(n->y)));
|
||||
|
|
|
@ -85,7 +85,7 @@ struct DeminoutPass : public Pass {
|
|||
|
||||
if (conn.first == "\\Y" && cell->type.in("$mux", "$pmux", "$_MUX_", "$_TBUF_", "$tribuf"))
|
||||
{
|
||||
bool tribuf = (cell->type == "$_TBUF_" || cell->type == "$tribuf");
|
||||
bool tribuf = cell->type.in("$_TBUF_", "$tribuf");
|
||||
|
||||
if (!tribuf) {
|
||||
for (auto &c : cell->connections()) {
|
||||
|
|
|
@ -52,13 +52,13 @@ struct Dff2dffeWorker
|
|||
}
|
||||
|
||||
for (auto cell : module->cells()) {
|
||||
if (cell->type == "$mux" || cell->type == "$pmux" || cell->type == "$_MUX_") {
|
||||
if (cell->type.in("$mux", "$pmux", "$_MUX_")) {
|
||||
RTLIL::SigSpec sig_y = sigmap(cell->getPort("\\Y"));
|
||||
for (int i = 0; i < GetSize(sig_y); i++)
|
||||
bit2mux[sig_y[i]] = cell_int_t(cell, i);
|
||||
}
|
||||
if (direct_dict.empty()) {
|
||||
if (cell->type == "$dff" || cell->type == "$_DFF_N_" || cell->type == "$_DFF_P_")
|
||||
if (cell->type.in("$dff", "$_DFF_N_", "$_DFF_P_"))
|
||||
dff_cells.push_back(cell);
|
||||
} else {
|
||||
if (direct_dict.count(cell->type))
|
||||
|
@ -167,7 +167,7 @@ struct Dff2dffeWorker
|
|||
}
|
||||
|
||||
if (GetSize(or_input) == 0)
|
||||
return RTLIL::S1;
|
||||
return State::S1;
|
||||
|
||||
if (GetSize(or_input) == 1)
|
||||
return or_input;
|
||||
|
@ -304,7 +304,7 @@ struct Dff2dffePass : public Pass {
|
|||
}
|
||||
if (args[argidx] == "-unmap-mince" && argidx + 1 < args.size()) {
|
||||
unmap_mode = true;
|
||||
min_ce_use = std::stoi(args[++argidx]);
|
||||
min_ce_use = atoi(args[++argidx].c_str());
|
||||
continue;
|
||||
}
|
||||
if (args[argidx] == "-direct" && argidx + 2 < args.size()) {
|
||||
|
@ -377,7 +377,7 @@ struct Dff2dffePass : public Pass {
|
|||
mod->remove(cell);
|
||||
continue;
|
||||
}
|
||||
if (cell->type.substr(0, 7) == "$_DFFE_") {
|
||||
if (cell->type.begins_with("$_DFFE_")) {
|
||||
if (min_ce_use >= 0) {
|
||||
int ce_use = 0;
|
||||
for (auto cell_other : mod->selected_cells()) {
|
||||
|
@ -390,8 +390,8 @@ struct Dff2dffePass : public Pass {
|
|||
continue;
|
||||
}
|
||||
|
||||
bool clk_pol = cell->type.substr(7, 1) == "P";
|
||||
bool en_pol = cell->type.substr(8, 1) == "P";
|
||||
bool clk_pol = cell->type.compare(7, 1, "P") == 0;
|
||||
bool en_pol = cell->type.compare(8, 1, "P") == 0;
|
||||
RTLIL::SigSpec tmp = mod->addWire(NEW_ID);
|
||||
mod->addDff(NEW_ID, cell->getPort("\\C"), tmp, cell->getPort("\\Q"), clk_pol);
|
||||
if (en_pol)
|
||||
|
|
|
@ -54,7 +54,7 @@ public:
|
|||
|
||||
RTLIL::Const unified_param(RTLIL::IdString cell_type, RTLIL::IdString param, RTLIL::Const value)
|
||||
{
|
||||
if (cell_type.substr(0, 1) != "$" || cell_type.substr(0, 2) == "$_")
|
||||
if (!cell_type.begins_with("$") || cell_type.begins_with("$_"))
|
||||
return value;
|
||||
|
||||
#define param_bool(_n) if (param == _n) return value.as_bool();
|
||||
|
@ -203,7 +203,7 @@ bool module2graph(SubCircuit::Graph &graph, RTLIL::Module *mod, bool constports,
|
|||
continue;
|
||||
|
||||
std::string type = cell->type.str();
|
||||
if (sel == NULL && type.substr(0, 2) == "\\$")
|
||||
if (sel == NULL && type.compare(0, 2, "\\$") == 0)
|
||||
type = type.substr(1);
|
||||
graph.createNode(cell->name.str(), type, (void*)cell);
|
||||
|
||||
|
@ -594,7 +594,7 @@ struct ExtractPass : public Pass {
|
|||
map = new RTLIL::Design;
|
||||
for (auto &filename : map_filenames)
|
||||
{
|
||||
if (filename.substr(0, 1) == "%")
|
||||
if (filename.compare(0, 1, "%") == 0)
|
||||
{
|
||||
if (!saved_designs.count(filename.substr(1))) {
|
||||
delete map;
|
||||
|
@ -613,10 +613,10 @@ struct ExtractPass : public Pass {
|
|||
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");
|
||||
Frontend::frontend_call(map, &f, filename, (filename.size() > 3 && filename.compare(filename.size()-3, std::string::npos, ".il") == 0 ? "ilang" : "verilog"));
|
||||
f.close();
|
||||
|
||||
if (filename.size() <= 3 || filename.substr(filename.size()-3) != ".il") {
|
||||
if (filename.size() <= 3 || filename.compare(filename.size()-3, std::string::npos, ".il") != 0) {
|
||||
Pass::call(map, "proc");
|
||||
Pass::call(map, "opt_clean");
|
||||
}
|
||||
|
|
|
@ -36,7 +36,7 @@ struct MaccmapWorker
|
|||
|
||||
void add(RTLIL::SigBit bit, int position)
|
||||
{
|
||||
if (position >= width || bit == RTLIL::S0)
|
||||
if (position >= width || bit == State::S0)
|
||||
return;
|
||||
|
||||
if (bits.at(position).count(bit)) {
|
||||
|
@ -53,7 +53,7 @@ struct MaccmapWorker
|
|||
|
||||
if (do_subtract) {
|
||||
a = module->Not(NEW_ID, a);
|
||||
add(RTLIL::S1, 0);
|
||||
add(State::S1, 0);
|
||||
}
|
||||
|
||||
for (int i = 0; i < width; i++)
|
||||
|
@ -80,7 +80,7 @@ struct MaccmapWorker
|
|||
else
|
||||
{
|
||||
add(module->And(NEW_ID, a, RTLIL::SigSpec(b[i], width)), false, do_subtract);
|
||||
a = {a.extract(0, width-1), RTLIL::S0};
|
||||
a = {a.extract(0, width-1), State::S0};
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -88,10 +88,10 @@ struct MaccmapWorker
|
|||
{
|
||||
int start_index = 0, stop_index = GetSize(in1);
|
||||
|
||||
while (start_index < stop_index && in1[start_index] == RTLIL::S0 && in2[start_index] == RTLIL::S0 && in3[start_index] == RTLIL::S0)
|
||||
while (start_index < stop_index && in1[start_index] == State::S0 && in2[start_index] == RTLIL::S0 && in3[start_index] == RTLIL::S0)
|
||||
start_index++;
|
||||
|
||||
while (start_index < stop_index && in1[stop_index-1] == RTLIL::S0 && in2[stop_index-1] == RTLIL::S0 && in3[stop_index-1] == RTLIL::S0)
|
||||
while (start_index < stop_index && in1[stop_index-1] == State::S0 && in2[stop_index-1] == RTLIL::S0 && in3[stop_index-1] == RTLIL::S0)
|
||||
stop_index--;
|
||||
|
||||
if (start_index == stop_index)
|
||||
|
@ -222,7 +222,7 @@ struct MaccmapWorker
|
|||
RTLIL::SigSpec in3 = summands[i+2];
|
||||
RTLIL::SigSpec out1, out2;
|
||||
fulladd(in1, in2, in3, out1, out2);
|
||||
RTLIL::SigBit extra_bit = RTLIL::S0;
|
||||
RTLIL::SigBit extra_bit = State::S0;
|
||||
if (!tree_sum_bits.empty()) {
|
||||
extra_bit = tree_sum_bits.back();
|
||||
tree_sum_bits.pop_back();
|
||||
|
@ -240,8 +240,8 @@ struct MaccmapWorker
|
|||
RTLIL::Cell *c = module->addCell(NEW_ID, "$alu");
|
||||
c->setPort("\\A", summands.front());
|
||||
c->setPort("\\B", summands.back());
|
||||
c->setPort("\\CI", RTLIL::S0);
|
||||
c->setPort("\\BI", RTLIL::S0);
|
||||
c->setPort("\\CI", State::S0);
|
||||
c->setPort("\\BI", State::S0);
|
||||
c->setPort("\\Y", module->addWire(NEW_ID, width));
|
||||
c->setPort("\\X", module->addWire(NEW_ID, width));
|
||||
c->setPort("\\CO", module->addWire(NEW_ID, width));
|
||||
|
|
|
@ -675,36 +675,36 @@ struct MuxcoverPass : public Pass {
|
|||
for (argidx = 1; argidx < args.size(); argidx++)
|
||||
{
|
||||
const auto &arg = args[argidx];
|
||||
if (arg.size() >= 6 && arg.substr(0,6) == "-mux2=") {
|
||||
cost_mux2 = std::stoi(arg.substr(6));
|
||||
if (arg.size() >= 6 && arg.compare(0,6,"-mux2=") == 0) {
|
||||
cost_mux2 = atoi(arg.substr(6).c_str());
|
||||
continue;
|
||||
}
|
||||
if (arg.size() >= 5 && arg.substr(0,5) == "-mux4") {
|
||||
if (arg.size() >= 5 && arg.compare(0,5,"-mux4") == 0) {
|
||||
use_mux4 = true;
|
||||
if (arg.size() > 5) {
|
||||
if (arg[5] != '=') break;
|
||||
cost_mux4 = std::stoi(arg.substr(6));
|
||||
cost_mux4 = atoi(arg.substr(6).c_str());
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (arg.size() >= 5 && arg.substr(0,5) == "-mux8") {
|
||||
if (arg.size() >= 5 && arg.compare(0,5,"-mux8") == 0) {
|
||||
use_mux8 = true;
|
||||
if (arg.size() > 5) {
|
||||
if (arg[5] != '=') break;
|
||||
cost_mux8 = std::stoi(arg.substr(6));
|
||||
cost_mux8 = atoi(arg.substr(6).c_str());
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (arg.size() >= 6 && arg.substr(0,6) == "-mux16") {
|
||||
if (arg.size() >= 6 && arg.compare(0,6,"-mux16") == 0) {
|
||||
use_mux16 = true;
|
||||
if (arg.size() > 6) {
|
||||
if (arg[6] != '=') break;
|
||||
cost_mux16 = std::stoi(arg.substr(7));
|
||||
cost_mux16 = atoi(arg.substr(7).c_str());
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (arg.size() >= 6 && arg.substr(0,6) == "-dmux=") {
|
||||
cost_dmux = std::stoi(arg.substr(6));
|
||||
if (arg.size() >= 6 && arg.compare(0,6,"-dmux=") == 0) {
|
||||
cost_dmux = atoi(arg.substr(6).c_str());
|
||||
continue;
|
||||
}
|
||||
if (arg == "-nodecode") {
|
||||
|
|
|
@ -185,7 +185,7 @@ static void logic_reduce(RTLIL::Module *module, RTLIL::SigSpec &sig, RTLIL::Cell
|
|||
}
|
||||
|
||||
if (sig.size() == 0)
|
||||
sig = RTLIL::SigSpec(0, 1);
|
||||
sig = State::S0;
|
||||
}
|
||||
|
||||
void simplemap_lognot(RTLIL::Module *module, RTLIL::Cell *cell)
|
||||
|
@ -245,7 +245,7 @@ void simplemap_eqne(RTLIL::Module *module, RTLIL::Cell *cell)
|
|||
RTLIL::SigSpec sig_b = cell->getPort("\\B");
|
||||
RTLIL::SigSpec sig_y = cell->getPort("\\Y");
|
||||
bool is_signed = cell->parameters.at("\\A_SIGNED").as_bool();
|
||||
bool is_ne = cell->type == "$ne" || cell->type == "$nex";
|
||||
bool is_ne = cell->type.in("$ne", "$nex");
|
||||
|
||||
RTLIL::SigSpec xor_out = module->addWire(NEW_ID, max(GetSize(sig_a), GetSize(sig_b)));
|
||||
RTLIL::Cell *xor_cell = module->addXor(NEW_ID, sig_a, sig_b, xor_out, is_signed);
|
||||
|
|
|
@ -243,7 +243,7 @@ struct TechmapWorker
|
|||
if (positional_ports.count(portname) > 0)
|
||||
portname = positional_ports.at(portname);
|
||||
if (tpl->wires_.count(portname) == 0 || tpl->wires_.at(portname)->port_id == 0) {
|
||||
if (portname.substr(0, 1) == "$")
|
||||
if (portname.begins_with("$"))
|
||||
log_error("Can't map port `%s' of cell `%s' to template `%s'!\n", portname.c_str(), cell->name.c_str(), tpl->name.c_str());
|
||||
continue;
|
||||
}
|
||||
|
@ -341,7 +341,7 @@ struct TechmapWorker
|
|||
RTLIL::Cell *c = module->addCell(c_name, it.second);
|
||||
design->select(module, c);
|
||||
|
||||
if (!flatten_mode && c->type.substr(0, 2) == "\\$")
|
||||
if (!flatten_mode && c->type.begins_with("\\$"))
|
||||
c->type = c->type.substr(1);
|
||||
|
||||
for (auto &it2 : c->connections_) {
|
||||
|
@ -406,7 +406,7 @@ struct TechmapWorker
|
|||
continue;
|
||||
|
||||
std::string cell_type = cell->type.str();
|
||||
if (in_recursion && cell_type.substr(0, 2) == "\\$")
|
||||
if (in_recursion && cell->type.begins_with("\\$"))
|
||||
cell_type = cell_type.substr(1);
|
||||
|
||||
if (celltypeMap.count(cell_type) == 0) {
|
||||
|
@ -468,7 +468,7 @@ struct TechmapWorker
|
|||
|
||||
std::string cell_type = cell->type.str();
|
||||
|
||||
if (in_recursion && cell_type.substr(0, 2) == "\\$")
|
||||
if (in_recursion && cell->type.begins_with("\\$"))
|
||||
cell_type = cell_type.substr(1);
|
||||
|
||||
for (auto &tpl_name : celltypeMap.at(cell_type))
|
||||
|
@ -602,7 +602,7 @@ struct TechmapWorker
|
|||
}
|
||||
|
||||
for (auto conn : cell->connections()) {
|
||||
if (conn.first.substr(0, 1) == "$")
|
||||
if (conn.first.begins_with("$"))
|
||||
continue;
|
||||
if (tpl->wires_.count(conn.first) > 0 && tpl->wires_.at(conn.first)->port_id > 0)
|
||||
continue;
|
||||
|
@ -725,7 +725,7 @@ struct TechmapWorker
|
|||
|
||||
for (auto &it : twd)
|
||||
{
|
||||
if (it.first.substr(0, 12) != "_TECHMAP_DO_" || it.second.empty())
|
||||
if (it.first.compare(0, 12, "_TECHMAP_DO_") != 0 || it.second.empty())
|
||||
continue;
|
||||
|
||||
auto &data = it.second.front();
|
||||
|
@ -874,7 +874,7 @@ struct TechmapWorker
|
|||
tpl->cloneInto(m);
|
||||
|
||||
for (auto cell : m->cells()) {
|
||||
if (cell->type.substr(0, 2) == "\\$")
|
||||
if (cell->type.begins_with("\\$"))
|
||||
cell->type = cell->type.substr(1);
|
||||
}
|
||||
|
||||
|
@ -1113,7 +1113,7 @@ struct TechmapPass : public Pass {
|
|||
Frontend::frontend_call(map, &f, "<techmap.v>", verilog_frontend);
|
||||
} else {
|
||||
for (auto &fn : map_files)
|
||||
if (fn.substr(0, 1) == "%") {
|
||||
if (fn.compare(0, 1, "%") == 0) {
|
||||
if (!saved_designs.count(fn.substr(1))) {
|
||||
delete map;
|
||||
log_cmd_error("Can't saved design `%s'.\n", fn.c_str()+1);
|
||||
|
@ -1128,7 +1128,7 @@ struct TechmapPass : public Pass {
|
|||
yosys_input_files.insert(fn);
|
||||
if (f.fail())
|
||||
log_cmd_error("Can't open map file `%s'\n", fn.c_str());
|
||||
Frontend::frontend_call(map, &f, fn, (fn.size() > 3 && fn.substr(fn.size()-3) == ".il") ? "ilang" : verilog_frontend);
|
||||
Frontend::frontend_call(map, &f, fn, (fn.size() > 3 && fn.compare(fn.size()-3, std::string::npos, ".il") == 0 ? "ilang" : verilog_frontend));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1143,7 +1143,7 @@ struct TechmapPass : public Pass {
|
|||
free(p);
|
||||
} else {
|
||||
string module_name = it.first.str();
|
||||
if (module_name.substr(0, 2) == "\\$")
|
||||
if (it.first.begins_with("\\$"))
|
||||
module_name = module_name.substr(1);
|
||||
celltypeMap[module_name].insert(it.first);
|
||||
}
|
||||
|
|
|
@ -186,7 +186,7 @@ static void create_gold_module(RTLIL::Design *design, RTLIL::IdString cell_type,
|
|||
|
||||
RTLIL::SigSpec config;
|
||||
for (int i = 0; i < (1 << width); i++)
|
||||
config.append(xorshift32(2) ? RTLIL::S1 : RTLIL::S0);
|
||||
config.append(xorshift32(2) ? State::S1 : State::S0);
|
||||
|
||||
cell->setParam("\\LUT", config.as_const());
|
||||
}
|
||||
|
@ -209,16 +209,16 @@ static void create_gold_module(RTLIL::Design *design, RTLIL::IdString cell_type,
|
|||
for (int i = 0; i < width*depth; i++)
|
||||
switch (xorshift32(3)) {
|
||||
case 0:
|
||||
config.append(RTLIL::S1);
|
||||
config.append(RTLIL::S0);
|
||||
config.append(State::S1);
|
||||
config.append(State::S0);
|
||||
break;
|
||||
case 1:
|
||||
config.append(RTLIL::S0);
|
||||
config.append(RTLIL::S1);
|
||||
config.append(State::S0);
|
||||
config.append(State::S1);
|
||||
break;
|
||||
case 2:
|
||||
config.append(RTLIL::S0);
|
||||
config.append(RTLIL::S0);
|
||||
config.append(State::S0);
|
||||
config.append(State::S0);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -308,18 +308,18 @@ static void create_gold_module(RTLIL::Design *design, RTLIL::IdString cell_type,
|
|||
case 0:
|
||||
n = xorshift32(GetSize(sig) + 1);
|
||||
for (int i = 0; i < n; i++)
|
||||
sig[i] = xorshift32(2) == 1 ? RTLIL::S1 : RTLIL::S0;
|
||||
sig[i] = xorshift32(2) == 1 ? State::S1 : State::S0;
|
||||
break;
|
||||
case 1:
|
||||
n = xorshift32(GetSize(sig) + 1);
|
||||
for (int i = n; i < GetSize(sig); i++)
|
||||
sig[i] = xorshift32(2) == 1 ? RTLIL::S1 : RTLIL::S0;
|
||||
sig[i] = xorshift32(2) == 1 ? State::S1 : State::S0;
|
||||
break;
|
||||
case 2:
|
||||
n = xorshift32(GetSize(sig));
|
||||
m = xorshift32(GetSize(sig));
|
||||
for (int i = min(n, m); i < max(n, m); i++)
|
||||
sig[i] = xorshift32(2) == 1 ? RTLIL::S1 : RTLIL::S0;
|
||||
sig[i] = xorshift32(2) == 1 ? State::S1 : State::S0;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -491,7 +491,7 @@ static void run_eval_test(RTLIL::Design *design, bool verbose, bool nosat, std::
|
|||
|
||||
RTLIL::Const in_value;
|
||||
for (int i = 0; i < GetSize(gold_wire); i++)
|
||||
in_value.bits.push_back(xorshift32(2) ? RTLIL::S1 : RTLIL::S0);
|
||||
in_value.bits.push_back(xorshift32(2) ? State::S1 : State::S0);
|
||||
|
||||
if (xorshift32(4) == 0) {
|
||||
int inv_chance = 1 + xorshift32(8);
|
||||
|
@ -591,11 +591,11 @@ static void run_eval_test(RTLIL::Design *design, bool verbose, bool nosat, std::
|
|||
}
|
||||
|
||||
for (int i = 0; i < GetSize(out_sig); i++) {
|
||||
if (out_val[i] != RTLIL::S0 && out_val[i] != RTLIL::S1)
|
||||
if (out_val[i] != State::S0 && out_val[i] != State::S1)
|
||||
continue;
|
||||
if (out_val[i] == RTLIL::S0 && sat1_model_value.at(i) == false)
|
||||
if (out_val[i] == State::S0 && sat1_model_value.at(i) == false)
|
||||
continue;
|
||||
if (out_val[i] == RTLIL::S1 && sat1_model_value.at(i) == true)
|
||||
if (out_val[i] == State::S1 && sat1_model_value.at(i) == true)
|
||||
continue;
|
||||
log_error("Mismatch in sat model 1 (no undef modeling) output!\n");
|
||||
}
|
||||
|
@ -627,12 +627,12 @@ static void run_eval_test(RTLIL::Design *design, bool verbose, bool nosat, std::
|
|||
|
||||
for (int i = 0; i < GetSize(out_sig); i++) {
|
||||
if (sat2_model_value.at(GetSize(out_sig) + i)) {
|
||||
if (out_val[i] != RTLIL::S0 && out_val[i] != RTLIL::S1)
|
||||
if (out_val[i] != State::S0 && out_val[i] != State::S1)
|
||||
continue;
|
||||
} else {
|
||||
if (out_val[i] == RTLIL::S0 && sat2_model_value.at(i) == false)
|
||||
if (out_val[i] == State::S0 && sat2_model_value.at(i) == false)
|
||||
continue;
|
||||
if (out_val[i] == RTLIL::S1 && sat2_model_value.at(i) == true)
|
||||
if (out_val[i] == State::S1 && sat2_model_value.at(i) == true)
|
||||
continue;
|
||||
}
|
||||
log_error("Mismatch in sat model 2 (undef modeling) output!\n");
|
||||
|
@ -872,7 +872,7 @@ struct TestCellPass : public Pass {
|
|||
continue;
|
||||
}
|
||||
|
||||
if (args[argidx].substr(0, 1) == "/") {
|
||||
if (args[argidx].compare(0, 1, "/") == 0) {
|
||||
std::vector<std::string> new_selected_cell_types;
|
||||
for (auto it : selected_cell_types)
|
||||
if (it != args[argidx].substr(1))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue