diff --git a/passes/cmds/select.cc b/passes/cmds/select.cc index e455baf7c..ff72724ae 100644 --- a/passes/cmds/select.cc +++ b/passes/cmds/select.cc @@ -876,9 +876,20 @@ static void select_stmt(RTLIL::Design *design, std::string arg, bool disable_emp sel.selected_members[mod->name].insert(cell->name); } else if (arg_memb.compare(0, 2, "t:") == 0) { - for (auto cell : mod->cells()) - if (match_ids(cell->type, arg_memb.substr(2))) - sel.selected_members[mod->name].insert(cell->name); + if (arg_memb.compare(2, 1, "@") == 0) { + std::string set_name = RTLIL::escape_id(arg_memb.substr(3)); + if (!design->selection_vars.count(set_name)) + log_cmd_error("Selection @%s is not defined!\n", RTLIL::unescape_id(set_name).c_str()); + + auto &muster = design->selection_vars[set_name]; + for (auto cell : mod->cells()) + if (muster.selected_modules.count(cell->type)) + sel.selected_members[mod->name].insert(cell->name); + } else { + for (auto cell : mod->cells()) + if (match_ids(cell->type, arg_memb.substr(2))) + sel.selected_members[mod->name].insert(cell->name); + } } else if (arg_memb.compare(0, 2, "p:") == 0) { for (auto &it : mod->processes) @@ -1164,6 +1175,9 @@ struct SelectPass : public Pass { log(" t:<pattern>\n"); log(" all cells with a type matching the given pattern\n"); log("\n"); + log(" t:@<name>\n"); + log(" all cells with a type matching a module in the saved selection <name>\n"); + log("\n"); log(" p:<pattern>\n"); log(" all processes with a name matching the given pattern\n"); log("\n"); diff --git a/tests/select/mod-attribute.ys b/tests/select/mod-attribute.ys new file mode 100644 index 000000000..4d3704378 --- /dev/null +++ b/tests/select/mod-attribute.ys @@ -0,0 +1,52 @@ +read_rtlil <<EOT +module \pdk_not + + wire input 1 \A + wire output 2 \Y + + cell $_NOT_ \not + connect \A \A + connect \Y \Y + end + +end + +module \pdk_buf + + wire input 1 \A + wire output 2 \Y + + cell $_BUF_ \buf + connect \A \A + connect \Y \Y + end + +end + +module \top + wire input 1 \A + wire output 2 \Y + wire \w + + cell \pdk_buf \buf + connect \A \A + connect \Y \w + end + + cell \pdk_not \not + connect \A \w + connect \Y \Y + end + +end +EOT + +cellmatch -lut_attrs * + +select -set buffers a:lut=2'b10 %m +select -set inverters a:lut=2'b01 %m + +select -assert-count 1 t:@buffers t:pdk_buf %i +select -assert-count 0 t:@buffers t:pdk_not %i +select -assert-count 0 t:@inverters t:pdk_buf %i +select -assert-count 1 t:@inverters t:pdk_not %i