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"
36static Value materializeInvertedInput(Location loc, Value input,
bool inverted,
37 ConversionPatternRewriter &rewriter,
41 auto width = input.getType().getIntOrFloatBitWidth();
44 return rewriter.createOrFold<
comb::XorOp>(loc, input, allOnes,
true);
50 matchAndRewrite(synth::ChoiceOp op, OpAdaptor adaptor,
51 ConversionPatternRewriter &rewriter)
const override {
53 rewriter.replaceOp(op, adaptor.getInputs().front());
58template <
typename SynthOp>
63 virtual Value createOp(Location loc, ArrayRef<Value> inputs,
64 ConversionPatternRewriter &rewriter)
const = 0;
67 matchAndRewrite(SynthOp op,
typename SynthOp::Adaptor adaptor,
68 ConversionPatternRewriter &rewriter)
const override {
69 SmallVector<Value> operands;
70 operands.reserve(op.getNumOperands());
72 for (
auto [input, inverted] :
73 llvm::zip(adaptor.getInputs(), op.getInverted()))
74 operands.push_back(materializeInvertedInput(op.
getLoc(), input, inverted,
77 rewriter.replaceOp(op, createOp(op.getLoc(), operands, rewriter));
82struct SynthAndInverterOpConversion
83 : SynthInverterOpConversion<synth::aig::AndInverterOp> {
84 using SynthInverterOpConversion<
85 synth::aig::AndInverterOp>::SynthInverterOpConversion;
86 Value createOp(Location loc, ArrayRef<Value> inputs,
87 ConversionPatternRewriter &rewriter)
const override {
88 return rewriter.createOrFold<
comb::AndOp>(loc, inputs,
true);
92struct SynthXorInverterOpConversion
93 : SynthInverterOpConversion<synth::XorInverterOp> {
94 using SynthInverterOpConversion<
95 synth::XorInverterOp>::SynthInverterOpConversion;
96 Value createOp(Location loc, ArrayRef<Value> inputs,
97 ConversionPatternRewriter &rewriter)
const override {
98 return rewriter.createOrFold<
comb::XorOp>(loc, inputs,
true);
109struct ConvertSynthToCombPass
110 :
public impl::ConvertSynthToCombBase<ConvertSynthToCombPass> {
112 void runOnOperation()
override;
113 using ConvertSynthToCombBase<ConvertSynthToCombPass>::ConvertSynthToCombBase;
118 patterns.add<SynthChoiceOpConversion, SynthAndInverterOpConversion,
119 SynthXorInverterOpConversion>(
patterns.getContext());
122void ConvertSynthToCombPass::runOnOperation() {
123 ConversionTarget target(getContext());
124 target.addLegalDialect<comb::CombDialect, hw::HWDialect>();
125 target.addIllegalDialect<synth::SynthDialect>();
127 RewritePatternSet
patterns(&getContext());
130 if (failed(mlir::applyPartialConversion(getOperation(), target,
132 return signalPassFailure();
static Location getLoc(DefSlot slot)
static void populateSynthToCombConversionPatterns(RewritePatternSet &patterns)
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.