18#include "mlir/Pass/Pass.h"
19#include "mlir/Transforms/DialectConversion.h"
22#define GEN_PASS_DEF_CONVERTSYNTHTOCOMB
23#include "circt/Conversion/Passes.h.inc"
35struct SynthAndInverterOpConversion
39 matchAndRewrite(synth::aig::AndInverterOp op, OpAdaptor adaptor,
40 ConversionPatternRewriter &rewriter)
const override {
42 auto width = op.getResult().getType().getIntOrFloatBitWidth();
45 SmallVector<Value> operands;
46 operands.reserve(op.getNumOperands());
47 for (
auto [input, inverted] : llvm::zip(op.getOperands(), op.getInverted()))
48 operands.push_back(inverted ? rewriter.createOrFold<
comb::XorOp>(
49 op.getLoc(), input, allOnes,
true)
53 op, rewriter.createOrFold<
comb::AndOp>(op.getLoc(), operands,
true));
58struct SynthMajorityInverterOpConversion
63 matchAndRewrite(synth::mig::MajorityInverterOp op, OpAdaptor adaptor,
64 ConversionPatternRewriter &rewriter)
const override {
66 if (op.getNumOperands() > 3)
69 auto getOperand = [&](
unsigned idx) {
70 auto input = op.getInputs()[idx];
71 if (!op.getInverted()[idx])
73 auto width = input.getType().getIntOrFloatBitWidth();
75 APInt::getAllOnes(width));
76 return rewriter.createOrFold<
comb::XorOp>(op.getLoc(), input, allOnes,
80 if (op.getNumOperands() == 1) {
81 rewriter.replaceOp(op, getOperand(0));
85 assert(op.getNumOperands() == 3 &&
"Expected 3 operands for majority op");
86 SmallVector<Value, 3> inputs;
87 for (
size_t i = 0; i < 3; ++i)
88 inputs.push_back(getOperand(i));
91 auto getProduct = [&](
unsigned idx1,
unsigned idx2) {
93 op.getLoc(), ValueRange{inputs[idx1], inputs[idx2]},
true);
96 SmallVector<Value, 3> operands;
97 operands.push_back(getProduct(0, 1));
98 operands.push_back(getProduct(0, 2));
99 operands.push_back(getProduct(1, 2));
102 op, rewriter.createOrFold<
comb::OrOp>(op.getLoc(), operands,
true));
114struct ConvertSynthToCombPass
115 :
public impl::ConvertSynthToCombBase<ConvertSynthToCombPass> {
117 void runOnOperation()
override;
118 using ConvertSynthToCombBase<ConvertSynthToCombPass>::ConvertSynthToCombBase;
123 patterns.add<SynthAndInverterOpConversion, SynthMajorityInverterOpConversion>(
127void ConvertSynthToCombPass::runOnOperation() {
128 ConversionTarget target(getContext());
129 target.addLegalDialect<comb::CombDialect, hw::HWDialect>();
130 target.addIllegalDialect<synth::SynthDialect>();
132 RewritePatternSet
patterns(&getContext());
135 if (failed(mlir::applyPartialConversion(getOperation(), target,
137 return signalPassFailure();
assert(baseType &&"element must be base type")
static void populateSynthToCombConversionPatterns(RewritePatternSet &patterns)
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.