diff --git a/include/circt/Dialect/OM/OMPasses.h b/include/circt/Dialect/OM/OMPasses.h index 67bbaa4b7291..546295861d45 100644 --- a/include/circt/Dialect/OM/OMPasses.h +++ b/include/circt/Dialect/OM/OMPasses.h @@ -9,6 +9,7 @@ #ifndef CIRCT_DIALECT_OM_OMPASSES_H #define CIRCT_DIALECT_OM_OMPASSES_H +#include "circt/Support/LLVM.h" #include "mlir/Pass/Pass.h" #include @@ -20,7 +21,8 @@ namespace circt { namespace om { std::unique_ptr createOMLinkModulesPass(); -std::unique_ptr createFreezePathsPass(); +std::unique_ptr createFreezePathsPass( + std::function getOpNameFallback = {}); std::unique_ptr createVerifyObjectFieldsPass(); #define GEN_PASS_REGISTRATION diff --git a/lib/Dialect/OM/Transforms/FreezePaths.cpp b/lib/Dialect/OM/Transforms/FreezePaths.cpp index ddc3109e3900..848dca3bc629 100644 --- a/lib/Dialect/OM/Transforms/FreezePaths.cpp +++ b/lib/Dialect/OM/Transforms/FreezePaths.cpp @@ -30,8 +30,9 @@ using namespace om; namespace { struct PathVisitor { - PathVisitor(hw::InstanceGraph &instanceGraph, hw::InnerRefNamespace &irn) - : instanceGraph(instanceGraph), irn(irn) {} + PathVisitor(hw::InstanceGraph &instanceGraph, hw::InnerRefNamespace &irn, + std::function &getOpName) + : instanceGraph(instanceGraph), irn(irn), getOpNameFallback(getOpName) {} StringAttr field; LogicalResult processPath(Location loc, hw::HierPathOp hierPathOp, @@ -44,6 +45,7 @@ struct PathVisitor { LogicalResult run(ModuleOp module); hw::InstanceGraph &instanceGraph; hw::InnerRefNamespace &irn; + std::function getOpNameFallback; }; } // namespace @@ -118,6 +120,8 @@ LogicalResult PathVisitor::processPath(Location loc, hw::HierPathOp hierPathOp, auto *op = target.getOp(); // Get the verilog name of the target. auto verilogName = op->getAttrOfType("hw.verilogName"); + if (!verilogName && getOpNameFallback) + verilogName = getOpNameFallback(op); if (!verilogName) { auto diag = emitError(loc, "component does not have verilog name"); diag.attachNote(op->getLoc()) << "component here"; @@ -147,6 +151,8 @@ LogicalResult PathVisitor::processPath(Location loc, hw::HierPathOp hierPathOp, auto currentModule = innerRef.getModule(); // Get the verilog name of the target. auto verilogName = op->getAttrOfType("hw.verilogName"); + if (!verilogName && getOpNameFallback) + verilogName = getOpNameFallback(op); if (!verilogName) { auto diag = emitError(loc, "component does not have verilog name"); diag.attachNote(op->getLoc()) << "component here"; @@ -299,7 +305,11 @@ LogicalResult PathVisitor::run(ModuleOp module) { namespace { struct FreezePathsPass : public circt::om::impl::FreezePathsBase { + FreezePathsPass(std::function getOpName) + : getOpName(std::move(getOpName)) {} void runOnOperation() override; + + std::function getOpName; }; } // namespace @@ -310,10 +320,11 @@ void FreezePathsPass::runOnOperation() { auto &symbolTable = getAnalysis(); hw::InnerSymbolTableCollection collection(module); hw::InnerRefNamespace irn{symbolTable, collection}; - if (failed(PathVisitor(instanceGraph, irn).run(module))) + if (failed(PathVisitor(instanceGraph, irn, getOpName).run(module))) signalPassFailure(); } -std::unique_ptr circt::om::createFreezePathsPass() { - return std::make_unique(); +std::unique_ptr circt::om::createFreezePathsPass( + std::function getOpName) { + return std::make_unique(getOpName); }