diff --git a/passes/cmds/box_derive.cc b/passes/cmds/box_derive.cc index a0faacc9a..c193e91ae 100644 --- a/passes/cmds/box_derive.cc +++ b/passes/cmds/box_derive.cc @@ -51,6 +51,9 @@ struct BoxDerivePass : Pass { log(" replaces the internal Yosys naming scheme in which the names of derived\n"); log(" modules start with '$paramod$')\n"); log("\n"); + log(" -apply\n"); + log(" use the derived modules\n"); + log("\n"); } void execute(std::vector args, RTLIL::Design *d) override { @@ -59,11 +62,14 @@ struct BoxDerivePass : Pass { size_t argidx; IdString naming_attr; IdString base_name; + bool apply_mode = false; for (argidx = 1; argidx < args.size(); argidx++) { if (args[argidx] == "-naming_attr" && argidx + 1 < args.size()) naming_attr = RTLIL::escape_id(args[++argidx]); else if (args[argidx] == "-base" && argidx + 1 < args.size()) base_name = RTLIL::escape_id(args[++argidx]); + else if (args[argidx] == "-apply") + apply_mode = true; else break; } @@ -90,24 +96,29 @@ struct BoxDerivePass : Pass { auto index = std::make_pair(base->name, cell->parameters); - if (cell->parameters.empty() || done.count(index)) + if (cell->parameters.empty()) continue; - IdString derived_type = base->derive(d, cell->parameters); - Module *derived = d->module(derived_type); - log_assert(derived && "Failed to derive module\n"); - log_debug("derived %s\n", derived_type); + if (!done.count(index)) { + IdString derived_type = base->derive(d, cell->parameters); + Module *derived = d->module(derived_type); + log_assert(derived && "Failed to derive module\n"); + log("derived %s\n", derived_type); - if (!naming_attr.empty() && derived->has_attribute(naming_attr)) { - IdString new_name = RTLIL::escape_id(derived->get_string_attribute(naming_attr)); - if (!new_name.isPublic()) - log_error("Derived module %s cannot be renamed to private name %s.\n", - log_id(derived), log_id(new_name)); - derived->attributes.erase(naming_attr); - d->rename(derived, new_name); + if (!naming_attr.empty() && derived->has_attribute(naming_attr)) { + IdString new_name = RTLIL::escape_id(derived->get_string_attribute(naming_attr)); + if (!new_name.isPublic()) + log_error("Derived module %s cannot be renamed to private name %s.\n", + log_id(derived), log_id(new_name)); + derived->attributes.erase(naming_attr); + d->rename(derived, new_name); + } + + done[index] = derived; } - done[index] = derived; + if (apply_mode) + cell->type = done[index]->name; } } } diff --git a/tests/various/box_derive.ys b/tests/various/box_derive.ys index f02e13360..ef6c87193 100644 --- a/tests/various/box_derive.ys +++ b/tests/various/box_derive.ys @@ -34,6 +34,7 @@ module top; endmodule EOF +design -save before box_derive -naming_attr final_name top select -assert-mod-count 1 =aa1 @@ -48,6 +49,45 @@ select -assert-mod-count 1 =cc1 select -assert-mod-count 0 =cc2 select -assert-mod-count 0 =cc3 +# no instances of the new derived modules +# you could use wildcards like t:aa* here - if that wasn't just broken +select -assert-count 0 t:aa1 t:aa2 t:aa3 +select -assert-count 0 t:bb1 t:bb2 t:bb3 +select -assert-count 0 t:cc1 t:cc2 t:cc3 + +design -load before + +# same command but with -apply +box_derive -apply -naming_attr final_name top + +# same derived modules created as without -apply +select -assert-mod-count 1 =aa1 +select -assert-mod-count 1 =aa2 +select -assert-mod-count 0 =aa3 + +select -assert-mod-count 1 =bb1 +select -assert-mod-count 0 =bb2 +select -assert-mod-count 1 =bb3 + +select -assert-mod-count 1 =cc1 +select -assert-mod-count 0 =cc2 +select -assert-mod-count 0 =cc3 + +# but we have instances of the new derived modules +select -assert-count 1 t:aa1 +select -assert-count 1 t:aa2 +select -assert-count 0 t:aa3 + +select -assert-count 1 t:bb1 +select -assert-count 0 t:bb2 +select -assert-count 1 t:bb3 + +select -assert-count 2 t:cc1 +select -assert-count 0 t:cc2 +select -assert-count 0 t:cc3 + + + # we are expecting the original aa, bb, cc modules # and 5 specializations generated by box_derive select -assert-mod-count 8 =A:whitebox