54 SmallVector<InstanceChoiceOp> instances;
56 for (Operation &op : *
module.getBody()) {
57 if (auto sym = dyn_cast<SymbolOpInterface>(&op))
58 symCache.addSymbol(sym);
60 if (
auto module = dyn_cast<HWModuleOp>(&op))
61 module.walk([&](InstanceChoiceOp inst) { instances.push_back(inst); });
68 auto declBuilder = OpBuilder::atBlockBegin(module.getBody());
69 for (InstanceChoiceOp inst : instances) {
70 auto parent = inst->getParentOfType<
HWModuleOp>();
72 auto defaultModuleOp = cast<HWModuleLike>(
73 symCache.getDefinition(inst.getDefaultModuleNameAttr()));
76 SmallString<128> name;
78 llvm::raw_svector_ostream os(name);
79 os <<
"__circt_choice_" << parent.getName() <<
"_"
80 << inst.getInstanceName();
83 auto symName = ns.
newName(name);
84 auto symNameAttr = declBuilder.getStringAttr(symName);
85 auto symRef = FlatSymbolRefAttr::get(symNameAttr);
86 declBuilder.create<MacroDeclOp>(inst.getLoc(), symNameAttr,
94 ImplicitLocOpBuilder builder(inst.getLoc(), inst);
98 builder.create<sv::MacroDefOp>(
99 symRef, builder.getStringAttr(
"{{0}}"),
100 builder.getArrayAttr(
101 {FlatSymbolRefAttr::get(defaultModuleOp.getNameAttr())}));
103 inst->setAttr(
"hw.choiceTarget", symRef);