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"
35 using OpConversionPattern<AddOp>::OpConversionPattern;
37 matchAndRewrite(AddOp op, OpAdaptor adaptor,
38 ConversionPatternRewriter &rewriter)
const override {
40 auto width = op.getType().getIntOrFloatBitWidth();
43 rewriter.replaceOpWithNewOp<hw::ConstantOp>(op, op.getType(), 0);
48 auto results = datapath::CompressOp::create(rewriter, op.getLoc(),
51 rewriter.replaceOpWithNewOp<AddOp>(op, results.getResults(),
true);
59 using OpConversionPattern<MulOp>::OpConversionPattern;
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());
98void ConvertCombToDatapathPass::runOnOperation() {
99 ConversionTarget target(getContext());
101 target.addLegalDialect<datapath::DatapathDialect, comb::CombDialect,
106 target.addDynamicallyLegalOp<comb::AddOp>([](comb::AddOp op) {
107 if (op.getNumOperands() <= 2)
110 if (op.getNumOperands() == 3) {
111 if (
auto constOp = op.getOperand(2).getDefiningOp<hw::ConstantOp>())
112 return constOp.getValue().isOne();
117 target.addDynamicallyLegalOp<comb::MulOp>(
118 [](comb::MulOp op) {
return op.getNumOperands() > 2; });
119 target.addIllegalOp<comb::SubOp>();
121 RewritePatternSet patterns(&getContext());
124 if (failed(mlir::applyPartialConversion(getOperation(), target,
125 std::move(patterns))))
126 return signalPassFailure();
static void populateCombToDatapathConversionPatterns(RewritePatternSet &patterns)
false return failure()
Parse an optional keyword or string and set instance into 'result'.
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.