11#include "mlir/Dialect/Func/IR/FuncOps.h"
12#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
13#include "mlir/Transforms/DialectConversion.h"
14#include "llvm/Support/Debug.h"
16#define DEBUG_TYPE "arc-lower-arcs-to-funcs"
20#define GEN_PASS_DEF_LOWERARCSTOFUNCS
21#include "circt/Dialect/Arc/ArcPasses.h.inc"
33struct LowerArcsToFuncsPass
34 :
public arc::impl::LowerArcsToFuncsBase<LowerArcsToFuncsPass> {
36 LogicalResult lowerToFuncs();
37 void runOnOperation()
override;
41 using OpConversionPattern::OpConversionPattern;
43 matchAndRewrite(arc::DefineOp op, OpAdaptor adaptor,
44 ConversionPatternRewriter &rewriter)
const final {
45 auto func = mlir::func::FuncOp::create(rewriter, op.getLoc(), op.getName(),
46 op.getFunctionType());
49 LLVM::LinkageAttr::get(getContext(), LLVM::linkage::Linkage::Internal));
50 rewriter.inlineRegionBefore(op.getRegion(), func.getBody(), func.end());
57 using OpConversionPattern::OpConversionPattern;
59 matchAndRewrite(arc::OutputOp op, OpAdaptor adaptor,
60 ConversionPatternRewriter &rewriter)
const final {
61 if (!isa<arc::DefineOp, func::FuncOp>(op->getParentOp()))
63 rewriter.replaceOpWithNewOp<func::ReturnOp>(op, adaptor.getOutputs());
69 using OpConversionPattern::OpConversionPattern;
71 matchAndRewrite(arc::CallOp op, OpAdaptor adaptor,
72 ConversionPatternRewriter &rewriter)
const final {
73 SmallVector<Type> newResultTypes;
75 typeConverter->convertTypes(op.getResultTypes(), newResultTypes)))
77 rewriter.replaceOpWithNewOp<func::CallOp>(
78 op, newResultTypes, op.getArcAttr(), adaptor.getInputs());
84 using OpConversionPattern::OpConversionPattern;
86 matchAndRewrite(arc::StateOp op, OpAdaptor adaptor,
87 ConversionPatternRewriter &rewriter)
const final {
88 SmallVector<Type> newResultTypes;
90 typeConverter->convertTypes(op.getResultTypes(), newResultTypes)))
92 rewriter.replaceOpWithNewOp<func::CallOp>(
93 op, newResultTypes, op.getArcAttr(), adaptor.getInputs());
101 target.addLegalDialect<func::FuncDialect>();
102 target.addLegalDialect<LLVM::LLVMDialect>();
104 target.addIllegalOp<arc::CallOp>();
105 target.addIllegalOp<arc::DefineOp>();
106 target.addDynamicallyLegalOp<arc::OutputOp>([](
auto op) {
107 return !isa<arc::DefineOp, func::FuncOp>(op->getParentOp());
109 target.addIllegalOp<arc::StateOp>();
113 TypeConverter &typeConverter) {
114 auto *context =
patterns.getContext();
116 .add<CallOpLowering, DefineOpLowering, OutputOpLowering, StateOpLowering>(
117 typeConverter, context);
121 typeConverter.addConversion([&](Type type) {
return type; });
124LogicalResult LowerArcsToFuncsPass::lowerToFuncs() {
125 LLVM_DEBUG(llvm::dbgs() <<
"Lowering arcs to funcs\n");
126 ConversionTarget target(getContext());
127 TypeConverter converter;
128 RewritePatternSet
patterns(&getContext());
132 return applyPartialConversion(getOperation(), target, std::move(
patterns));
135void LowerArcsToFuncsPass::runOnOperation() {
136 if (failed(lowerToFuncs()))
137 return signalPassFailure();
141 return std::make_unique<LowerArcsToFuncsPass>();
static void populateLegality(ConversionTarget &target)
static void populateOpConversion(RewritePatternSet &patterns, TypeConverter &typeConverter)
static void populateTypeConversion(TypeConverter &typeConverter)
std::unique_ptr< mlir::Pass > createLowerArcsToFuncsPass()
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.