17#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
19#define DEBUG_TYPE "synth-maximum-and-cover"
23#define GEN_PASS_DEF_MAXIMUMANDCOVER
24#include "circt/Dialect/Synth/Transforms/SynthPasses.h.inc"
35 LogicalResult matchAndRewrite(aig::AndInverterOp op,
36 PatternRewriter &rewriter)
const override {
38 llvm::SmallVector<Value> newFanins;
39 llvm::SmallVector<bool> newInverts;
42 for (
auto [input, inverted] : llvm::zip(op.getInputs(), op.getInverted())) {
43 auto andOp = input.getDefiningOp<aig::AndInverterOp>();
49 if (!inverted && andOp && andOp->hasOneUse()) {
51 for (
auto [fanin, faninInverted] :
52 llvm::zip(andOp.getInputs(), andOp.getInverted())) {
53 newFanins.push_back(fanin);
54 newInverts.push_back(faninInverted);
59 newFanins.push_back(input);
60 newInverts.push_back(inverted);
68 rewriter.replaceOpWithNewOp<aig::AndInverterOp>(op, newFanins, newInverts);
73struct MaximumAndCoverPass
74 :
public impl::MaximumAndCoverBase<MaximumAndCoverPass> {
75 void runOnOperation()
override;
79void MaximumAndCoverPass::runOnOperation() {
80 RewritePatternSet
patterns(&getContext());
81 patterns.add<MaximumAndCoverPattern>(&getContext());
83 mlir::FrozenRewritePatternSet frozenPatterns(std::move(
patterns));
84 if (failed(mlir::applyPatternsGreedily(getOperation(), frozenPatterns)))
85 return signalPassFailure();
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.