17#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
19#define DEBUG_TYPE "synth-lower-variadic"
23#define GEN_PASS_DEF_LOWERVARIADIC
24#include "circt/Dialect/Synth/Transforms/SynthPasses.h.inc"
37 OperandRange operands,
38 ArrayRef<bool> inverts,
39 PatternRewriter &rewriter) {
40 switch (operands.size()) {
42 assert(0 &&
"cannot be called with empty operand range");
46 return aig::AndInverterOp::create(rewriter, op.getLoc(), operands[0],
51 return aig::AndInverterOp::create(rewriter, op.getLoc(), operands[0],
52 operands[1], inverts[0], inverts[1]);
54 auto firstHalf = operands.size() / 2;
57 inverts.take_front(firstHalf), rewriter);
60 inverts.drop_front(firstHalf), rewriter);
61 return aig::AndInverterOp::create(rewriter, op.getLoc(), lhs, rhs);
69 LogicalResult matchAndRewrite(aig::AndInverterOp op,
70 PatternRewriter &rewriter)
const override {
71 if (op.getInputs().size() <= 2)
77 rewriter.replaceOp(op,
79 op.getInverted(), rewriter));
95struct LowerVariadicPass :
public impl::LowerVariadicBase<LowerVariadicPass> {
96 void runOnOperation()
override;
100void LowerVariadicPass::runOnOperation() {
101 RewritePatternSet
patterns(&getContext());
103 mlir::FrozenRewritePatternSet frozen(std::move(
patterns));
105 if (failed(mlir::applyPatternsGreedily(getOperation(), frozen)))
106 return signalPassFailure();
assert(baseType &&"element must be base type")
static void populateLowerVariadicPatterns(RewritePatternSet &patterns)
static Value lowerVariadicAndInverterOp(AndInverterOp op, OperandRange operands, ArrayRef< bool > inverts, PatternRewriter &rewriter)
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.