@@ -1114,6 +1114,68 @@ struct ConvertQuartzCtrlOp final : StatefulOpConversionPattern<quartz::CtrlOp> {
11141114 }
11151115};
11161116
1117+ /* *
1118+ * @brief Converts quartz.inv to flux.inv
1119+ *
1120+ * @par Example:
1121+ * ```mlir
1122+ * quartz.inv {
1123+ * quartz.s %q0
1124+ * quartz.yield
1125+ * }
1126+ * ```
1127+ * is converted to
1128+ * ```mlir
1129+ * %targets_out = flux.inv %targets_in {
1130+ * %targets_res = flux.s %targets_in : !flux.qubit -> !flux.qubit
1131+ * flux.yield %targets_res
1132+ * } : {!flux.qubit} -> {!flux.qubit}
1133+ * ```
1134+ */
1135+ struct ConvertQuartzInvOp final : StatefulOpConversionPattern<quartz::InvOp> {
1136+ using StatefulOpConversionPattern::StatefulOpConversionPattern;
1137+
1138+ LogicalResult
1139+ matchAndRewrite (quartz::InvOp op, OpAdaptor /* adaptor*/ ,
1140+ ConversionPatternRewriter& rewriter) const override {
1141+ auto & state = getState ();
1142+ auto & qubitMap = state.qubitMap ;
1143+
1144+ // Get Flux targets from state map
1145+ const auto numTargets = op.getNumTargets ();
1146+ SmallVector<Value> fluxTargets;
1147+ fluxTargets.reserve (numTargets);
1148+ for (size_t i = 0 ; i < numTargets; ++i) {
1149+ const auto & quartzTarget = op.getTarget (i);
1150+ const auto & fluxTarget = qubitMap[quartzTarget];
1151+ fluxTargets.push_back (fluxTarget);
1152+ }
1153+
1154+ // Create flux.inv
1155+ auto fluxOp = rewriter.create <flux::InvOp>(op.getLoc (), fluxTargets);
1156+
1157+ // Update state map
1158+ if (state.inCtrlOp == 0 ) {
1159+ const auto targetsOut = fluxOp.getTargetsOut ();
1160+ for (size_t i = 0 ; i < numTargets; ++i) {
1161+ const auto & quartzTarget = op.getTarget (i);
1162+ qubitMap[quartzTarget] = targetsOut[i];
1163+ }
1164+ }
1165+
1166+ // Update modifier information
1167+ state.inCtrlOp ++;
1168+ state.targetsIn .try_emplace (state.inCtrlOp , fluxTargets);
1169+
1170+ // Clone body region from Quartz to Flux
1171+ auto & dstRegion = fluxOp.getBody ();
1172+ rewriter.cloneRegionBefore (op.getBody (), dstRegion, dstRegion.end ());
1173+
1174+ rewriter.eraseOp (op);
1175+ return success ();
1176+ }
1177+ };
1178+
11171179/* *
11181180 * @brief Converts quartz.yield to flux.yield
11191181 *
@@ -1186,19 +1248,20 @@ struct QuartzToFlux final : impl::QuartzToFluxBase<QuartzToFlux> {
11861248
11871249 // Register operation conversion patterns with state
11881250 // tracking
1189- patterns.add <
1190- ConvertQuartzAllocOp, ConvertQuartzDeallocOp, ConvertQuartzStaticOp,
1191- ConvertQuartzMeasureOp, ConvertQuartzResetOp, ConvertQuartzGPhaseOp,
1192- ConvertQuartzIdOp, ConvertQuartzXOp, ConvertQuartzYOp, ConvertQuartzZOp,
1193- ConvertQuartzHOp, ConvertQuartzSOp, ConvertQuartzSdgOp,
1194- ConvertQuartzTOp, ConvertQuartzTdgOp, ConvertQuartzSXOp,
1195- ConvertQuartzSXdgOp, ConvertQuartzRXOp, ConvertQuartzRYOp,
1196- ConvertQuartzRZOp, ConvertQuartzPOp, ConvertQuartzROp,
1197- ConvertQuartzU2Op, ConvertQuartzUOp, ConvertQuartzSWAPOp,
1198- ConvertQuartziSWAPOp, ConvertQuartzDCXOp, ConvertQuartzECROp,
1199- ConvertQuartzRXXOp, ConvertQuartzRYYOp, ConvertQuartzRZXOp,
1200- ConvertQuartzRZZOp, ConvertQuartzXXPlusYYOp, ConvertQuartzXXMinusYYOp,
1201- ConvertQuartzBarrierOp, ConvertQuartzCtrlOp, ConvertQuartzYieldOp>(
1251+ patterns.add <ConvertQuartzAllocOp, ConvertQuartzDeallocOp,
1252+ ConvertQuartzStaticOp, ConvertQuartzMeasureOp,
1253+ ConvertQuartzResetOp, ConvertQuartzGPhaseOp, ConvertQuartzIdOp,
1254+ ConvertQuartzXOp, ConvertQuartzYOp, ConvertQuartzZOp,
1255+ ConvertQuartzHOp, ConvertQuartzSOp, ConvertQuartzSdgOp,
1256+ ConvertQuartzTOp, ConvertQuartzTdgOp, ConvertQuartzSXOp,
1257+ ConvertQuartzSXdgOp, ConvertQuartzRXOp, ConvertQuartzRYOp,
1258+ ConvertQuartzRZOp, ConvertQuartzPOp, ConvertQuartzROp,
1259+ ConvertQuartzU2Op, ConvertQuartzUOp, ConvertQuartzSWAPOp,
1260+ ConvertQuartziSWAPOp, ConvertQuartzDCXOp, ConvertQuartzECROp,
1261+ ConvertQuartzRXXOp, ConvertQuartzRYYOp, ConvertQuartzRZXOp,
1262+ ConvertQuartzRZZOp, ConvertQuartzXXPlusYYOp,
1263+ ConvertQuartzXXMinusYYOp, ConvertQuartzBarrierOp,
1264+ ConvertQuartzCtrlOp, ConvertQuartzInvOp, ConvertQuartzYieldOp>(
12021265 typeConverter, context, &state);
12031266
12041267 // Conversion of quartz types in func.func signatures
0 commit comments