@@ -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