Skip to content

Commit 1da9a01

Browse files
committed
Add flux.inv to quartz.inv conversion
1 parent e5ed2c9 commit 1da9a01

File tree

1 file changed

+50
-13
lines changed

1 file changed

+50
-13
lines changed

mlir/lib/Conversion/FluxToQuartz/FluxToQuartz.cpp

Lines changed: 50 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -798,6 +798,44 @@ struct ConvertFluxCtrlOp final : OpConversionPattern<flux::CtrlOp> {
798798
}
799799
};
800800

801+
/**
802+
* @brief Converts flux.inv to quartz.inv
803+
*
804+
* @par Example:
805+
* ```mlir
806+
* %targets_out = flux.inv %targets_in {
807+
* %targets_res = flux.s %targets_in : !flux.qubit -> !flux.qubit
808+
* flux.yield %targets_res
809+
* } : {!flux.qubit} -> {!flux.qubit}
810+
* ```
811+
* is converted to
812+
* ```mlir
813+
* quartz.inv {
814+
* quartz.s %q0 : !quartz.qubit
815+
* quartz.yield
816+
* }
817+
* ```
818+
*/
819+
struct ConvertFluxInvOp final : OpConversionPattern<flux::InvOp> {
820+
using OpConversionPattern::OpConversionPattern;
821+
822+
LogicalResult
823+
matchAndRewrite(flux::InvOp op, OpAdaptor adaptor,
824+
ConversionPatternRewriter& rewriter) const override {
825+
// Create quartz.inv operation
826+
auto quartzOp = rewriter.create<quartz::InvOp>(op.getLoc());
827+
828+
// Clone body region from Flux to Quartz
829+
auto& dstRegion = quartzOp.getBody();
830+
rewriter.cloneRegionBefore(op.getBody(), dstRegion, dstRegion.end());
831+
832+
// Replace the output qubits with the same Quartz references
833+
rewriter.replaceOp(op, adaptor.getOperands());
834+
835+
return success();
836+
}
837+
};
838+
801839
/**
802840
* @brief Converts flux.yield to quartz.yield
803841
*
@@ -865,19 +903,18 @@ struct FluxToQuartz final : impl::FluxToQuartzBase<FluxToQuartz> {
865903

866904
// Register operation conversion patterns
867905
// Note: No state tracking needed - OpAdaptors handle type conversion
868-
patterns
869-
.add<ConvertFluxAllocOp, ConvertFluxDeallocOp, ConvertFluxStaticOp,
870-
ConvertFluxMeasureOp, ConvertFluxResetOp, ConvertFluxGPhaseOp,
871-
ConvertFluxIdOp, ConvertFluxXOp, ConvertFluxYOp, ConvertFluxZOp,
872-
ConvertFluxHOp, ConvertFluxSOp, ConvertFluxSdgOp, ConvertFluxTOp,
873-
ConvertFluxTdgOp, ConvertFluxSXOp, ConvertFluxSXdgOp,
874-
ConvertFluxRXOp, ConvertFluxRYOp, ConvertFluxRZOp, ConvertFluxPOp,
875-
ConvertFluxROp, ConvertFluxU2Op, ConvertFluxUOp, ConvertFluxSWAPOp,
876-
ConvertFluxiSWAPOp, ConvertFluxDCXOp, ConvertFluxECROp,
877-
ConvertFluxRXXOp, ConvertFluxRYYOp, ConvertFluxRZXOp,
878-
ConvertFluxRZZOp, ConvertFluxXXPlusYYOp, ConvertFluxXXMinusYYOp,
879-
ConvertFluxBarrierOp, ConvertFluxCtrlOp, ConvertFluxYieldOp>(
880-
typeConverter, context);
906+
patterns.add<
907+
ConvertFluxAllocOp, ConvertFluxDeallocOp, ConvertFluxStaticOp,
908+
ConvertFluxMeasureOp, ConvertFluxResetOp, ConvertFluxGPhaseOp,
909+
ConvertFluxIdOp, ConvertFluxXOp, ConvertFluxYOp, ConvertFluxZOp,
910+
ConvertFluxHOp, ConvertFluxSOp, ConvertFluxSdgOp, ConvertFluxTOp,
911+
ConvertFluxTdgOp, ConvertFluxSXOp, ConvertFluxSXdgOp, ConvertFluxRXOp,
912+
ConvertFluxRYOp, ConvertFluxRZOp, ConvertFluxPOp, ConvertFluxROp,
913+
ConvertFluxU2Op, ConvertFluxUOp, ConvertFluxSWAPOp, ConvertFluxiSWAPOp,
914+
ConvertFluxDCXOp, ConvertFluxECROp, ConvertFluxRXXOp, ConvertFluxRYYOp,
915+
ConvertFluxRZXOp, ConvertFluxRZZOp, ConvertFluxXXPlusYYOp,
916+
ConvertFluxXXMinusYYOp, ConvertFluxBarrierOp, ConvertFluxCtrlOp,
917+
ConvertFluxInvOp, ConvertFluxYieldOp>(typeConverter, context);
881918

882919
// Conversion of flux types in func.func signatures
883920
// Note: This currently has limitations with signature changes

0 commit comments

Comments
 (0)