15#include "mlir/Pass/Pass.h"
16#include "llvm/ADT/Twine.h"
23#define GEN_PASS_DEF_MATERIALIZEDEBUGVARIABLES
24#include "circt/Tools/circt-bmc/Passes.h.inc"
28struct MaterializeDebugVariablesPass
29 :
public circt::impl::MaterializeDebugVariablesBase<
30 MaterializeDebugVariablesPass> {
31 using MaterializeDebugVariablesBase::MaterializeDebugVariablesBase;
33 void runOnOperation()
override {
34 for (
auto module : getOperation().getOps<
HWModuleOp>())
35 materializeDebugVariables(module);
39 static void materializeDebugVariables(
HWModuleOp module) {
40 auto *body =
module.getBodyBlock();
41 DenseSet<Value> trackedValues;
42 for (
auto varOp : body->getOps<debug::VariableOp>())
43 trackedValues.insert(varOp.getValue());
45 OpBuilder builder = OpBuilder::atBlockBegin(body);
46 for (
auto &port :
module.getPortList()) {
49 if (isa<seq::ClockType>(port.type))
51 if (!port.name || port.name.getValue().empty())
54 auto value = body->getArgument(port.argNum);
55 if (!trackedValues.insert(value).second)
57 debug::VariableOp::create(builder, value.getLoc(), port.name, value,
61 auto materializeRegAnchor = [&](
auto regOp, StringRef regName) {
62 auto regResult = regOp.getResult();
63 if (!trackedValues.insert(regResult).second)
65 auto regNameAttr = builder.getStringAttr(regName);
66 OpBuilder regBuilder(regOp);
67 regBuilder.setInsertionPointAfter(regOp);
68 debug::VariableOp::create(regBuilder, regResult.getLoc(), regNameAttr,
72 unsigned regIndex = 0;
74 if (regOp.getName() && !regOp.getName()->empty())
75 materializeRegAnchor(regOp, regOp.getName().value());
77 materializeRegAnchor(regOp, (
"reg_" + Twine(regIndex)).str());
81 for (
auto regOp : body->getOps<seq::FirRegOp>()) {
82 if (!regOp.getName().empty())
83 materializeRegAnchor(regOp, regOp.getName());
85 materializeRegAnchor(regOp, (
"reg_" + Twine(regIndex)).str());
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.