150 if (
auto hwModule = dyn_cast<hw::HWModuleOp>(*module))
151 for (
auto param : hwModule.getParameters())
153 module, cast<ParamDeclAttr>(param).getName()));
155 auto *ctxt =
module.getContext();
157 auto verilogNameAttr = StringAttr::get(ctxt,
"hw.verilogName");
159 auto ports =
module.getPortList();
160 SmallVector<Attribute> newNames(ports.size());
161 bool updated =
false;
162 bool isFuncOp = isa<FuncOp>(module);
163 for (
auto [idx, port] : llvm::enumerate(ports)) {
164 auto verilogName = port.attrs.get(verilogNameAttr);
167 if (isFuncOp && port.attrs.get(FuncOp::getExplicitlyReturnedAttrName())) {
169 newNames[idx] = StringAttr::get(ctxt,
getSymOpName(module));
173 auto newName = StringAttr::get(
174 ctxt, nameResolver.
getLegalName(cast<StringAttr>(verilogName)));
175 newNames[idx] = newName;
176 if (verilogName != newName)
180 auto oldName = ports[idx].name;
183 if (newName != oldName) {
184 newNames[idx] = StringAttr::get(ctxt, newName);
190 module.setPortAttrs(verilogNameAttr, newNames);
192 SmallVector<std::pair<Operation *, StringAttr>> nameEntries;
195 module.walk([&](Operation *op) {
198 if (auto name = op->getAttrOfType<StringAttr>(verilogNameAttr)) {
199 nameResolver.insertUsedName(
200 op->getAttrOfType<StringAttr>(verilogNameAttr));
202 hw::InstanceOp, sv::InterfaceInstanceOp, sv::GenerateOp>(
205 nameEntries.emplace_back(
206 op, StringAttr::get(op->getContext(),
getSymOpName(op)));
207 }
else if (
auto forOp = dyn_cast<ForOp>(op)) {
208 nameEntries.emplace_back(op, forOp.getInductionVarNameAttr());
209 }
else if (
auto genForOp = dyn_cast<GenerateForOp>(op)) {
210 nameEntries.emplace_back(op, genForOp.getInductionVarNameAttr());
211 }
else if (isa<AssertOp, AssumeOp, CoverOp, AssertConcurrentOp,
212 AssumeConcurrentOp, CoverConcurrentOp, AssertPropertyOp,
213 AssumePropertyOp, CoverPropertyOp, verif::AssertOp,
214 verif::CoverOp, verif::AssumeOp>(op)) {
216 if (
auto labelAttr = op->getAttrOfType<StringAttr>(
"label"))
217 nameEntries.emplace_back(op, labelAttr);
218 else if (options.enforceVerifLabels) {
221 StringRef defaultName =
222 llvm::TypeSwitch<Operation *, StringRef>(op)
223 .Case<AssertOp, AssertConcurrentOp, AssertPropertyOp,
224 verif::AssertOp>([](
auto) {
return "assert"; })
225 .Case<CoverOp, CoverConcurrentOp, CoverPropertyOp,
226 verif::CoverOp>([](
auto) {
return "cover"; })
227 .Case<AssumeOp, AssumeConcurrentOp, AssumePropertyOp,
228 verif::AssumeOp>([](
auto) {
return "assume"; });
229 nameEntries.emplace_back(
230 op, StringAttr::get(op->getContext(), defaultName));
236 for (
auto [op, nameAttr] : nameEntries) {
237 auto newName = nameResolver.getLegalName(nameAttr);
238 assert(!newName.empty() &&
"must have a valid name");
240 op->setAttr(verilogNameAttr, nameAttr.getValue() == newName
242 : StringAttr::
get(ctxt, newName));
250 : globalNameResolver(options), options(options) {
255 for (
auto &op : *topLevel.getBody()) {
258 if (isa<HWModuleExternOp>(op) || isa<HWModuleGeneratedOp>(op)) {
261 op.emitError(
"name \"")
262 << name <<
"\" is not allowed in Verilog output";
264 }
else if (
auto reservedNamesOp = dyn_cast<sv::ReserveNamesOp>(op)) {
265 for (StringAttr name :
266 reservedNamesOp.getReservedNames().getAsRange<StringAttr>()) {
274 for (
auto &op : *topLevel.getBody()) {
275 if (
auto module = dyn_cast<HWModuleOp>(op)) {
282 if (
auto interface = dyn_cast<InterfaceOp>(op)) {
289 mlir::parallelForEach(
290 topLevel.getContext(), topLevel.getOps<HWEmittableModuleLike>(),
292 legalizeModuleLocalNames(module, options, globalNameTable);
339 MLIRContext *ctxt = interface.getContext();
340 auto verilogNameAttr = StringAttr::get(ctxt,
"hw.verilogName");
342 if (newName != interface.getName())
343 interface->setAttr(verilogNameAttr, StringAttr::get(ctxt, newName));
347 for (
auto &op : *interface.getBodyBlock()) {
348 if (isa<InterfaceSignalOp, InterfaceModportOp>(op)) {
349 auto name = SymbolTable::getSymbolName(&op).getValue();
352 op.setAttr(verilogNameAttr, StringAttr::get(ctxt, newName));