13#include "mlir/Pass/Pass.h"
14#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
18#define GEN_PASS_DEF_DATAPATHREDUCEDELAY
19#include "circt/Dialect/Datapath/DatapathPasses.h.inc"
24using namespace datapath;
40 using OpRewritePattern::OpRewritePattern;
43 PatternRewriter &rewriter)
const override {
45 SmallVector<Value, 8> newCompressOperands;
47 for (Value operand : addOp.getOperands()) {
49 llvm::append_range(newCompressOperands, nestedAddOp.getOperands());
51 newCompressOperands.push_back(operand);
56 if (newCompressOperands.size() <= addOp.getNumOperands())
60 auto newCompressOp = rewriter.create<datapath::CompressOp>(
61 addOp.getLoc(), newCompressOperands, 2);
64 rewriter.replaceOpWithNewOp<
comb::AddOp>(addOp, newCompressOp.getResults(),
74 using OpRewritePattern::OpRewritePattern;
79 PatternRewriter &rewriter)
const override {
81 SmallVector<Value, 8> newCompressOperands;
82 for (Value operand : addOp.getOperands()) {
88 newCompressOperands.push_back(operand);
92 SmallVector<Value> trueValOperands = {nestedMuxOp.getTrueValue()};
93 SmallVector<Value> falseValOperands = {nestedMuxOp.getFalseValue()};
96 nestedMuxOp.getTrueValue().getDefiningOp<
comb::AddOp>())
97 trueValOperands = trueVal.getOperands();
101 nestedMuxOp.getFalseValue().getDefiningOp<
comb::AddOp>())
102 falseValOperands = falseVal.getOperands();
105 std::max(trueValOperands.size(), falseValOperands.size());
108 if (maxOperands <= 1) {
109 newCompressOperands.push_back(operand);
116 addOp.getLoc(), rewriter.getIntegerAttr(addOp.getType(), 0));
117 for (
size_t i = 0; i < maxOperands; ++i) {
118 auto tOp = i < trueValOperands.size() ? trueValOperands[i] : zero;
119 auto fOp = i < falseValOperands.size() ? falseValOperands[i] : zero;
121 addOp.getLoc(), nestedMuxOp.getCond(), tOp, fOp);
122 newCompressOperands.push_back(newMux.getResult());
127 if (newCompressOperands.size() <= addOp.getNumOperands())
131 auto newCompressOp = rewriter.create<datapath::CompressOp>(
132 addOp.getLoc(), newCompressOperands, 2);
135 rewriter.replaceOpWithNewOp<
comb::AddOp>(addOp, newCompressOp.getResults(),
143struct DatapathReduceDelayPass
144 :
public circt::datapath::impl::DatapathReduceDelayBase<
145 DatapathReduceDelayPass> {
147 void runOnOperation()
override {
148 Operation *op = getOperation();
149 MLIRContext *ctx = op->getContext();
152 patterns.add<FoldAddReplicate, FoldMuxAdd>(ctx);
154 if (failed(applyPatternsGreedily(op, std::move(
patterns))))
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.