18#include "mlir/IR/Builders.h"
19#include "mlir/Pass/Pass.h"
20#include "llvm/Support/Path.h"
21#include "llvm/Support/Process.h"
25#define GEN_PASS_DEF_SVTRACEIVERILOG
26#include "circt/Dialect/SV/SVPasses.h.inc"
40struct SVTraceIVerilogPass
41 :
public circt::sv::impl::SVTraceIVerilogBase<SVTraceIVerilogPass> {
43 void runOnOperation()
override;
48void SVTraceIVerilogPass::runOnOperation() {
49 mlir::ModuleOp mod = getOperation();
52 auto &graph = getAnalysis<InstanceGraph>();
53 auto topLevelNodes = graph.getInferredTopLevelNodes();
54 if (failed(topLevelNodes) || topLevelNodes->size() != 1) {
55 mod.emitError(
"Expected exactly one top level node");
56 return signalPassFailure();
59 dyn_cast_or_null<hw::HWModuleOp>(*topLevelNodes->front()->getModule());
61 mod.emitError(
"top module is not a HWModuleOp");
62 return signalPassFailure();
64 targetModuleName.setValue(top.getName().str());
68 if (!targetModuleName.empty() &&
69 hwmod.getName() != targetModuleName.getValue())
71 OpBuilder builder(hwmod.getBodyBlock(), hwmod.getBodyBlock()->begin());
72 std::string traceMacro;
73 llvm::raw_string_ostream ss(traceMacro);
74 auto modName = hwmod.getName();
75 ss <<
"initial begin\n $dumpfile (\"" << directoryName.getValue()
76 << modName <<
".vcd\");\n $dumpvars (0, " << modName
78 sv::VerbatimOp::create(builder, hwmod.getLoc(), ss.str());
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.