19#include "mlir/IR/BuiltinOps.h"
20#include "mlir/IR/PatternMatch.h"
21#include "mlir/Pass/Pass.h"
22#include "mlir/Pass/PassRegistry.h"
23#include "mlir/Transforms/DialectConversion.h"
24#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
28#define GEN_PASS_DEF_LOWERINSTANCES
29#include "circt/Dialect/MSFT/MSFTPasses.h.inc"
41struct LowerInstancesPass
42 :
public circt::msft::impl::LowerInstancesBase<LowerInstancesPass> {
43 void runOnOperation()
override;
45 LogicalResult lower(DynamicInstanceOp inst, InstanceHierarchyOp hier,
58 hw::HierPathOp ref =
nullptr;
62 if (llvm::any_of(inst.getOps(), [](Operation &op) {
63 return isa<DynInstDataOpInterface>(op);
67 auto refSym = StringAttr::get(&getContext(),
"instref");
68 auto origRefSym = refSym;
71 refSym = StringAttr::get(&getContext(),
72 origRefSym.getValue() +
"_" + Twine(++ctr));
75 ArrayAttr hierPath = inst.getPath();
76 ref = hw::HierPathOp::create(b, inst.getLoc(), refSym,
84 OpBuilder hierBlock(&hier.getBody().front().front());
85 for (Operation &op : llvm::make_early_inc_range(inst.getOps())) {
87 assert(!isa<DynamicInstanceOp>(op));
89 hierBlock.insert(&op);
92 if (
auto specOp = dyn_cast<UnaryDynInstDataOpInterface>(op)) {
94 specOp.setPathOp(ref);
101void LowerInstancesPass::runOnOperation() {
102 auto top = getOperation();
103 auto *ctxt = &getContext();
108 size_t numFailed = 0;
109 OpBuilder builder(ctxt);
112 for (Operation &op : llvm::make_early_inc_range(top.getOps())) {
113 auto instHierOp = dyn_cast<InstanceHierarchyOp>(op);
116 builder.setInsertionPoint(&op);
119 instHierOp->walk<mlir::WalkOrder::PostOrder>([&](DynamicInstanceOp inst) {
120 if (failed(lower(inst, instHierOp, builder)))
131 return std::make_unique<LowerInstancesPass>();
assert(baseType &&"element must be base type")
void addDefinitions(mlir::Operation *top)
Populate the symbol cache with all symbol-defining operations within the 'top' operation.
void addDefinition(mlir::Attribute key, mlir::Operation *op) override
In the building phase, add symbols.
mlir::Operation * getDefinition(mlir::Attribute attr) const override
Lookup a definition for 'symbol' in the cache.
std::unique_ptr< mlir::Pass > createLowerInstancesPass()
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.