17#include "mlir/Pass/Pass.h"
18#include "mlir/Transforms/DialectConversion.h"
21#define GEN_PASS_DEF_CONVERTCOMBTODATAPATH
22#include "circt/Conversion/Passes.h.inc"
37 matchAndRewrite(
AddOp op, OpAdaptor adaptor,
38 ConversionPatternRewriter &rewriter)
const override {
40 auto width = op.getType().getIntOrFloatBitWidth();
48 auto results = datapath::CompressOp::create(rewriter, op.getLoc(),
51 rewriter.replaceOpWithNewOp<
AddOp>(op, results.getResults(),
true);
61 matchAndRewrite(
MulOp op, OpAdaptor adaptor,
62 ConversionPatternRewriter &rewriter)
const override {
64 if (adaptor.getInputs().size() != 2)
67 auto width = op.getType().getIntOrFloatBitWidth();
69 auto pp = datapath::PartialProductOp::create(rewriter, op.getLoc(),
70 op.getInputs(), width);
72 rewriter.replaceOpWithNewOp<
AddOp>(op, pp.getResults(),
true);
84struct ConvertCombToDatapathPass
85 :
public impl::ConvertCombToDatapathBase<ConvertCombToDatapathPass> {
86 void runOnOperation()
override;
87 using ConvertCombToDatapathBase<
88 ConvertCombToDatapathPass>::ConvertCombToDatapathBase;
94 patterns.add<CombAddOpConversion, CombMulOpConversion>(
patterns.getContext());
97void ConvertCombToDatapathPass::runOnOperation() {
98 ConversionTarget target(getContext());
100 target.addLegalDialect<datapath::DatapathDialect, comb::CombDialect,
105 [](
comb::AddOp op) {
return op.getNumOperands() <= 2; });
108 [](
comb::MulOp op) {
return op.getNumOperands() > 2; });
110 RewritePatternSet
patterns(&getContext());
113 if (failed(mlir::applyPartialConversion(getOperation(), target,
115 return signalPassFailure();
static void populateCombToDatapathConversionPatterns(RewritePatternSet &patterns)
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.