18 #include "mlir/IR/Builders.h"
19 #include "llvm/Support/Path.h"
20 #include "llvm/Support/Process.h"
22 using namespace circt;
32 struct SVTraceIVerilogPass
33 :
public sv::SVTraceIVerilogBase<SVTraceIVerilogPass> {
34 void runOnOperation()
override;
39 void SVTraceIVerilogPass::runOnOperation() {
40 mlir::ModuleOp mod = getOperation();
43 auto &graph = getAnalysis<InstanceGraph>();
44 auto topLevelNodes = graph.getInferredTopLevelNodes();
45 if (failed(topLevelNodes) || topLevelNodes->size() != 1) {
46 mod.emitError(
"Expected exactly one top level node");
47 return signalPassFailure();
50 dyn_cast_or_null<hw::HWModuleOp>(*topLevelNodes->front()->getModule());
52 mod.emitError(
"top module is not a HWModuleOp");
53 return signalPassFailure();
55 targetModuleName.setValue(top.getName().str());
59 if (!targetModuleName.empty() &&
60 hwmod.getName() != targetModuleName.getValue())
62 OpBuilder
builder(hwmod.getBodyBlock(), hwmod.getBodyBlock()->begin());
63 std::string traceMacro;
64 llvm::raw_string_ostream ss(traceMacro);
65 auto modName = hwmod.getName();
66 ss <<
"initial begin\n $dumpfile (\"" << directoryName.getValue()
67 << modName <<
".vcd\");\n $dumpvars (0, " << modName
69 builder.create<sv::VerbatimOp>(hwmod.getLoc(), ss.str());
74 return std::make_unique<SVTraceIVerilogPass>();
std::unique_ptr< mlir::Pass > createSVTraceIVerilogPass()
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.