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 = datapath::CompressOp::create(rewriter, addOp.getLoc(),
61 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);
117 rewriter.getIntegerAttr(addOp.getType(), 0));
118 for (
size_t i = 0; i < maxOperands; ++i) {
119 auto tOp = i < trueValOperands.size() ? trueValOperands[i] : zero;
120 auto fOp = i < falseValOperands.size() ? falseValOperands[i] : zero;
121 auto newMux = comb::MuxOp::create(rewriter, addOp.getLoc(),
122 nestedMuxOp.getCond(), tOp, fOp);
123 newCompressOperands.push_back(newMux.getResult());
128 if (newCompressOperands.size() <= addOp.getNumOperands())
132 auto newCompressOp = datapath::CompressOp::create(rewriter, addOp.getLoc(),
133 newCompressOperands, 2);
136 rewriter.replaceOpWithNewOp<
comb::AddOp>(addOp, newCompressOp.getResults(),
144struct DatapathReduceDelayPass
145 :
public circt::datapath::impl::DatapathReduceDelayBase<
146 DatapathReduceDelayPass> {
148 void runOnOperation()
override {
149 Operation *op = getOperation();
150 MLIRContext *ctx = op->getContext();
153 patterns.add<FoldAddReplicate, FoldMuxAdd>(ctx);
155 if (failed(applyPatternsGreedily(op, std::move(
patterns))))
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.