18 #include "mlir/Transforms/DialectConversion.h"
20 using namespace circt;
25 struct DataflowMethodOpConversion
28 using OpAdaptor =
typename DataflowMethodOp::Adaptor;
31 matchAndRewrite(DataflowMethodOp op, OpAdaptor adaptor,
32 ConversionPatternRewriter &rewriter)
const override {
34 auto newContainer = rewriter.create<ContainerOp>(
35 op.getLoc(), op.getInnerSym(),
false);
36 rewriter.setInsertionPointToStart(newContainer.getBodyBlock());
41 rewriter.create<ThisOp>(op.getLoc(), newContainer.getInnerRef());
44 llvm::SmallVector<Value> argValues;
45 for (
auto [arg, name] : llvm::zip_equal(
46 op.getArguments(), op.getArgNames().getAsRange<StringAttr>())) {
47 auto port = rewriter.create<InputPortOp>(
49 argValues.push_back(rewriter.create<PortReadOp>(arg.getLoc(), port));
52 ReturnOp returnOp = cast<ReturnOp>(op.getBodyBlock()->getTerminator());
53 for (
auto [idx, resType] : llvm::enumerate(
54 cast<MethodLikeOpInterface>(op.getOperation()).getResultTypes())) {
55 auto portName = rewriter.getStringAttr(
"out" + std::to_string(idx));
56 auto port = rewriter.create<OutputPortOp>(
58 rewriter.create<PortWriteOp>(op.getLoc(), port, returnOp.getOperand(idx));
61 rewriter.mergeBlocks(op.getBodyBlock(), newContainer.getBodyBlock(),
64 rewriter.eraseOp(returnOp);
69 struct MethodsToContainersPass
70 :
public IbisConvertMethodsToContainersBase<MethodsToContainersPass> {
71 void runOnOperation()
override;
75 void MethodsToContainersPass::runOnOperation() {
76 auto *context = &getContext();
77 ConversionTarget target(*context);
78 target.addLegalDialect<IbisDialect>();
79 target.addIllegalOp<DataflowMethodOp>();
80 target.addIllegalOp<ReturnOp>();
83 patterns.insert<DataflowMethodOpConversion>(context);
85 applyPartialConversion(getOperation(), target, std::move(
patterns))))
90 return std::make_unique<MethodsToContainersPass>();
Direction get(bool isOutput)
Returns an output direction if isOutput is true, otherwise returns an input direction.
std::unique_ptr< mlir::Pass > createConvertMethodsToContainersPass()
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.