diff options
author | N. Engelhardt <nak@yosyshq.com> | 2022-08-11 12:06:04 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-08-11 12:06:04 +0200 |
commit | 63fca0dbc2a189595b8bc18ac49bfa2950c02913 (patch) | |
tree | 283a3f45712560a05fec5c25462a205103282cd5 | |
parent | 91010449ff2a66f89c2a8f9718ae320d3e899c41 (diff) | |
parent | a48dcd1d40a845cfb8b18cbe986faf0b780880be (diff) | |
download | yosys-63fca0dbc2a189595b8bc18ac49bfa2950c02913.tar.gz yosys-63fca0dbc2a189595b8bc18ac49bfa2950c02913.tar.bz2 yosys-63fca0dbc2a189595b8bc18ac49bfa2950c02913.zip |
Merge pull request #3277 from YosysHQ/lofty/rename-scramble_name
-rw-r--r-- | passes/cmds/rename.cc | 56 | ||||
-rw-r--r-- | tests/various/rename_scramble_name.ys | 31 |
2 files changed, 87 insertions, 0 deletions
diff --git a/passes/cmds/rename.cc b/passes/cmds/rename.cc index 81da35ffe..b49d5cdc2 100644 --- a/passes/cmds/rename.cc +++ b/passes/cmds/rename.cc @@ -20,6 +20,7 @@ #include "kernel/register.h" #include "kernel/rtlil.h" #include "kernel/log.h" +#include "kernel/hashlib.h" USING_YOSYS_NAMESPACE PRIVATE_NAMESPACE_BEGIN @@ -156,6 +157,13 @@ struct RenamePass : public Pass { log("\n"); log("Rename top module.\n"); log("\n"); + log("\n"); + log(" rename -scramble-name [-seed <seed>] [selection]\n"); + log("\n"); + log("Assign randomly-generated names to all selected wires and cells. The seed option\n"); + log("can be used to change the random number generator seed from the default, but it\n"); + log("must be non-zero.\n"); + log("\n"); } void execute(std::vector<std::string> args, RTLIL::Design *design) override { @@ -167,7 +175,9 @@ struct RenamePass : public Pass { bool flag_hide = false; bool flag_top = false; bool flag_output = false; + bool flag_scramble_name = false; bool got_mode = false; + unsigned int seed = 1; size_t argidx; for (argidx = 1; argidx < args.size(); argidx++) @@ -203,6 +213,11 @@ struct RenamePass : public Pass { got_mode = true; continue; } + if (arg == "-scramble-name" && !got_mode) { + flag_scramble_name = true; + got_mode = true; + continue; + } if (arg == "-pattern" && argidx+1 < args.size() && args[argidx+1].find('%') != std::string::npos) { int pos = args[++argidx].find('%'); pattern_prefix = args[argidx].substr(0, pos); @@ -211,6 +226,11 @@ struct RenamePass : public Pass { } if (arg == "-suffix" && argidx + 1 < args.size()) { cell_suffix = args[++argidx]; + continue; + } + if (arg == "-seed" && argidx+1 < args.size()) { + seed = std::stoi(args[++argidx]); + continue; } break; } @@ -329,6 +349,42 @@ struct RenamePass : public Pass { design->rename(module, new_name); } else + if (flag_scramble_name) + { + extra_args(args, argidx, design); + + if (seed == 0) + log_error("Seed for -scramble-name cannot be zero.\n"); + + for (auto module : design->selected_modules()) + { + if (module->memories.size() != 0 || module->processes.size() != 0) { + log_warning("Skipping module %s with unprocessed memories or processes\n", log_id(module)); + continue; + } + + dict<RTLIL::Wire *, IdString> new_wire_names; + dict<RTLIL::Cell *, IdString> new_cell_names; + + for (auto wire : module->selected_wires()) + if (wire->port_id == 0) { + seed = mkhash_xorshift(seed); + new_wire_names[wire] = stringf("$_%u_", seed); + } + + for (auto cell : module->selected_cells()) { + seed = mkhash_xorshift(seed); + new_cell_names[cell] = stringf("$_%u_", seed); + } + + for (auto &it : new_wire_names) + module->rename(it.first, it.second); + + for (auto &it : new_cell_names) + module->rename(it.first, it.second); + } + } + else { if (argidx+2 != args.size()) log_cmd_error("Invalid number of arguments!\n"); diff --git a/tests/various/rename_scramble_name.ys b/tests/various/rename_scramble_name.ys new file mode 100644 index 000000000..9a36d0922 --- /dev/null +++ b/tests/various/rename_scramble_name.ys @@ -0,0 +1,31 @@ +read_verilog <<EOF +module top(); + wire a, b, c; +endmodule +EOF + +proc +hierarchy -top top +rename -seed 2 -scramble-name w:* +select -assert-none w:a w:b w:c +select -assert-count 3 w:$_*_ +select -assert-none w:$_*_ %% %n +design -reset + +read_verilog <<EOF +module foo(input a, b, output c); + assign c = a + b; +endmodule + +module top(); + wire a, b, c; + foo bar(.a(a), .b(b), .c(c)); +endmodule +EOF + +proc +hierarchy -top top +rename -seed 2 -scramble-name c:bar +select -assert-none c:bar +select -assert-count 1 c:$_*_ +select -assert-none c:$_*_ w:* foo/c:$add$<<EOF:2$1 %% %n |