20 #include "mlir/Transforms/DialectConversion.h"
25 using namespace circt;
30 struct ConvertHandshakeToDCPass
31 :
public IbisConvertHandshakeToDCBase<ConvertHandshakeToDCPass> {
32 void runOnOperation()
override;
37 using OpAdaptor =
typename ReturnOp::Adaptor;
40 matchAndRewrite(ReturnOp op, OpAdaptor adaptor,
41 ConversionPatternRewriter &rewriter)
const override {
42 rewriter.replaceOpWithNewOp<ibis::ReturnOp>(op, adaptor.getOperands());
47 struct StaticBlockOpConversion
50 using OpAdaptor =
typename IsolatedStaticBlockOp::Adaptor;
53 matchAndRewrite(IsolatedStaticBlockOp op, OpAdaptor adaptor,
54 ConversionPatternRewriter &rewriter)
const override {
55 llvm::SmallVector<Type> resultTypes;
57 getTypeConverter()->convertTypes(op.getResultTypes(), resultTypes)))
59 auto dcBlock = rewriter.create<DCBlockOp>(op.getLoc(), resultTypes,
60 adaptor.getOperands());
61 rewriter.eraseOp(dcBlock.getBodyBlock()->getTerminator());
62 rewriter.mergeBlocks(op.getBodyBlock(), dcBlock.getBodyBlock(),
63 dcBlock.getBodyBlock()->getArguments());
65 rewriter.replaceOp(op, dcBlock.getResults());
72 static bool isDCType(Type t) {
return isa<dc::ValueType, dc::TokenType>(t); }
75 return llvm::all_of(op->getOperandTypes(),
isDCType) &&
76 llvm::all_of(op->getResultTypes(),
isDCType);
79 void ConvertHandshakeToDCPass::runOnOperation() {
80 ibis::ClassOp classOp = getOperation();
81 auto targetModifier = [&](mlir::ConversionTarget &target) {
82 target.addDynamicallyLegalOp<ibis::DataflowMethodOp>(
83 [](ibis::DataflowMethodOp op) {
84 auto methodLikeOp = cast<MethodLikeOpInterface>(op.getOperation());
85 return llvm::all_of(methodLikeOp.getArgumentTypes(),
isDCType) &&
86 llvm::all_of(methodLikeOp.getResultTypes(),
isDCType);
88 target.addDynamicallyLegalOp<ibis::ReturnOp>(
isDCTypedOp);
89 target.addLegalDialect<hw::HWDialect, ibis::IbisDialect>();
90 target.addIllegalOp<ibis::IsolatedStaticBlockOp>();
94 target.addLegalOp<ibis::DCBlockOp>();
95 target.markOpRecursivelyLegal<ibis::DCBlockOp>();
98 auto patternBuilder = [&](TypeConverter &typeConverter,
105 typeConverter, classOp.getContext());
115 return std::make_unique<ConvertHandshakeToDCPass>();
static bool isDCType(Type t)
static bool isDCTypedOp(Operation *op)
DenseSet< Operation * > ConvertedOps
LogicalResult runHandshakeToDC(mlir::Operation *op, llvm::function_ref< void(TypeConverter &typeConverter, ConvertedOps &convertedOps, RewritePatternSet &patterns)> patternBuilder, llvm::function_ref< void(mlir::ConversionTarget &)> configureTarget={})
std::unique_ptr< mlir::Pass > createConvertHandshakeToDCPass()
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.