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"
26 using namespace circt;
34 struct LowerInstancesPass :
public LowerInstancesBase<LowerInstancesPass> {
35 void runOnOperation()
override;
50 hw::HierPathOp ref =
nullptr;
54 if (llvm::any_of(inst.getOps(), [](Operation &op) {
55 return isa<DynInstDataOpInterface>(op);
60 auto origRefSym = refSym;
62 while (topSyms.getDefinition(refSym))
64 origRefSym.getValue() +
"_" + Twine(++ctr));
67 ArrayAttr hierPath = inst.getPath();
68 ref = b.
create<hw::HierPathOp>(inst.getLoc(), refSym, hierPath);
71 topSyms.addDefinition(refSym, ref);
75 OpBuilder hierBlock(&hier.getBody().front().front());
76 for (Operation &op : llvm::make_early_inc_range(inst.getOps())) {
78 assert(!isa<DynamicInstanceOp>(op));
80 hierBlock.insert(&op);
83 if (
auto specOp = dyn_cast<UnaryDynInstDataOpInterface>(op)) {
85 specOp.setPathOp(ref);
92 void LowerInstancesPass::runOnOperation() {
93 auto top = getOperation();
94 auto *ctxt = &getContext();
97 topSyms.addDefinitions(top);
103 for (Operation &op : llvm::make_early_inc_range(top.getOps())) {
104 auto instHierOp = dyn_cast<InstanceHierarchyOp>(op);
107 builder.setInsertionPoint(&op);
111 if (failed(lower(inst, instHierOp,
builder)))
122 return std::make_unique<LowerInstancesPass>();
assert(baseType &&"element must be base type")
Default symbol cache implementation; stores associations between names (StringAttr's) to mlir::Operat...
Direction get(bool isOutput)
Returns an output direction if isOutput is true, otherwise returns an input direction.
std::unique_ptr< mlir::Pass > createLowerInstancesPass()
This file defines an intermediate representation for circuits acting as an abstraction for constraint...