diff options
author | Clifford Wolf <clifford@clifford.at> | 2016-11-06 00:04:10 +0100 |
---|---|---|
committer | Clifford Wolf <clifford@clifford.at> | 2016-11-06 00:04:10 +0100 |
commit | ef603c6fe13f521d774bdc2f0222eb1ee53071f9 (patch) | |
tree | b597b1f8ccf93086fb84d109552e96c25c3798b1 /passes/cmds | |
parent | 914aa8a5d3c884df0eafbef87fdeb9c3594ebd5f (diff) | |
download | yosys-ef603c6fe13f521d774bdc2f0222eb1ee53071f9.tar.gz yosys-ef603c6fe13f521d774bdc2f0222eb1ee53071f9.tar.bz2 yosys-ef603c6fe13f521d774bdc2f0222eb1ee53071f9.zip |
Implemented "scc -set_attr"
Diffstat (limited to 'passes/cmds')
-rw-r--r-- | passes/cmds/scc.cc | 54 |
1 files changed, 32 insertions, 22 deletions
diff --git a/passes/cmds/scc.cc b/passes/cmds/scc.cc index 6b8f3f512..76363e051 100644 --- a/passes/cmds/scc.cc +++ b/passes/cmds/scc.cc @@ -246,11 +246,9 @@ struct SccPass : public Pass { log(" are assumed to be bidirectional 'inout' ports.\n"); log("\n"); log(" -set_attr <name> <value>\n"); - log(" -set_cell_attr <name> <value>\n"); - log(" -set_wire_attr <name> <value>\n"); - log(" set the specified attribute on all cells and/or wires that are part of\n"); - log(" a logic loop. the special token {} in the value is replaced with a\n"); - log(" unique identifier for the logic loop.\n"); + log(" set the specified attribute on all cells that are part of a logic\n"); + log(" loop. the special token {} in the value is replaced with a unique\n"); + log(" identifier for the logic loop.\n"); log("\n"); log(" -select\n"); log(" replace the current selection with a selection of all cells and wires\n"); @@ -259,7 +257,7 @@ struct SccPass : public Pass { } virtual void execute(std::vector<std::string> args, RTLIL::Design *design) { - std::map<std::string, std::string> setCellAttr, setWireAttr; + std::map<std::string, std::string> setAttr; bool allCellTypes = false; bool selectMode = false; bool nofeedbackMode = false; @@ -287,18 +285,7 @@ struct SccPass : public Pass { continue; } if (args[argidx] == "-set_attr" && argidx+2 < args.size()) { - setCellAttr[args[argidx+1]] = args[argidx+2]; - setWireAttr[args[argidx+1]] = args[argidx+2]; - argidx += 2; - continue; - } - if (args[argidx] == "-set_cell_attr" && argidx+2 < args.size()) { - setCellAttr[args[argidx+1]] = args[argidx+2]; - argidx += 2; - continue; - } - if (args[argidx] == "-set_wire_attr" && argidx+2 < args.size()) { - setWireAttr[args[argidx+1]] = args[argidx+2]; + setAttr[args[argidx+1]] = args[argidx+2]; argidx += 2; continue; } @@ -311,9 +298,6 @@ struct SccPass : public Pass { int origSelectPos = design->selection_stack.size() - 1; extra_args(args, argidx, design); - if (setCellAttr.size() > 0 || setWireAttr.size() > 0) - log_cmd_error("The -set*_attr options are not implemented at the moment!\n"); - RTLIL::Selection newSelection(false); int scc_counter = 0; @@ -321,7 +305,33 @@ struct SccPass : public Pass { if (design->selected(mod_it.second)) { SccWorker worker(design, mod_it.second, nofeedbackMode, allCellTypes, maxDepth); - scc_counter += GetSize(worker.sccList); + + if (!setAttr.empty()) + { + for (const auto &cells : worker.sccList) + { + for (auto attr : setAttr) + { + IdString attr_name(RTLIL::escape_id(attr.first)); + string attr_valstr = attr.second; + string index = stringf("%d", scc_counter); + + for (size_t pos = 0; (pos = attr_valstr.find("{}", pos)) != string::npos; pos += index.size()) + attr_valstr.replace(pos, 2, index); + + Const attr_value(attr_valstr); + + for (auto cell : cells) + cell->attributes[attr_name] = attr_value; + } + + scc_counter++; + } + } + else + { + scc_counter += GetSize(worker.sccList); + } if (selectMode) worker.select(newSelection); |