@@ -1148,6 +1148,69 @@ struct ConvertQuartzCtrlOp final : StatefulOpConversionPattern<quartz::CtrlOp> {
11481148 }
11491149};
11501150
1151+ /* *
1152+ * @brief Converts quartz.inv to flux.inv
1153+ *
1154+ * @par Example:
1155+ * ```mlir
1156+ * quartz.inv {
1157+ * quartz.s %q0
1158+ * quartz.yield
1159+ * }
1160+ * ```
1161+ * is converted to
1162+ * ```mlir
1163+ * %targets_out = flux.inv %targets_in {
1164+ * %targets_res = flux.s %targets_in : !flux.qubit -> !flux.qubit
1165+ * flux.yield %targets_res
1166+ * } : {!flux.qubit} -> {!flux.qubit}
1167+ * ```
1168+ */
1169+ struct ConvertQuartzInvOp final : StatefulOpConversionPattern<quartz::InvOp> {
1170+ using StatefulOpConversionPattern::StatefulOpConversionPattern;
1171+
1172+ LogicalResult
1173+ matchAndRewrite (quartz::InvOp op, OpAdaptor /* adaptor*/ ,
1174+ ConversionPatternRewriter& rewriter) const override {
1175+ auto & state = getState ();
1176+ auto & qubitMap = state.qubitMap ;
1177+
1178+ // Get Flux targets from state map
1179+ const auto numTargets = op.getNumTargets ();
1180+ SmallVector<Value> fluxTargets;
1181+ fluxTargets.reserve (numTargets);
1182+ for (size_t i = 0 ; i < numTargets; ++i) {
1183+ const auto & quartzTarget = op.getTarget (i);
1184+ assert (qubitMap.contains (quartzTarget) && " Quartz qubit not found" );
1185+ const auto & fluxTarget = qubitMap[quartzTarget];
1186+ fluxTargets.push_back (fluxTarget);
1187+ }
1188+
1189+ // Create flux.inv
1190+ auto fluxOp = rewriter.create <flux::InvOp>(op.getLoc (), fluxTargets);
1191+
1192+ // Update state map
1193+ if (state.inCtrlOp == 0 ) {
1194+ const auto targetsOut = fluxOp.getTargetsOut ();
1195+ for (size_t i = 0 ; i < numTargets; ++i) {
1196+ const auto & quartzTarget = op.getTarget (i);
1197+ qubitMap[quartzTarget] = targetsOut[i];
1198+ }
1199+ }
1200+
1201+ // Update modifier information
1202+ state.inCtrlOp ++;
1203+ state.targetsIn .try_emplace (state.inCtrlOp , fluxTargets);
1204+
1205+ // Clone body region from Quartz to Flux
1206+ auto & dstRegion = fluxOp.getBody ();
1207+ rewriter.cloneRegionBefore (op.getBody (), dstRegion, dstRegion.end ());
1208+
1209+ rewriter.eraseOp (op);
1210+ return success ();
1211+ }
1212+ };
1213+
11511214/* *
11521215 * @brief Converts quartz.yield to flux.yield
11531216 *
@@ -1220,19 +1283,20 @@ struct QuartzToFlux final : impl::QuartzToFluxBase<QuartzToFlux> {
12201283
12211284 // Register operation conversion patterns with state
12221285 // tracking
1223- patterns.add <
1224- ConvertQuartzAllocOp, ConvertQuartzDeallocOp, ConvertQuartzStaticOp,
1225- ConvertQuartzMeasureOp, ConvertQuartzResetOp, ConvertQuartzGPhaseOp,
1226- ConvertQuartzIdOp, ConvertQuartzXOp, ConvertQuartzYOp, ConvertQuartzZOp,
1227- ConvertQuartzHOp, ConvertQuartzSOp, ConvertQuartzSdgOp,
1228- ConvertQuartzTOp, ConvertQuartzTdgOp, ConvertQuartzSXOp,
1229- ConvertQuartzSXdgOp, ConvertQuartzRXOp, ConvertQuartzRYOp,
1230- ConvertQuartzRZOp, ConvertQuartzPOp, ConvertQuartzROp,
1231- ConvertQuartzU2Op, ConvertQuartzUOp, ConvertQuartzSWAPOp,
1232- ConvertQuartziSWAPOp, ConvertQuartzDCXOp, ConvertQuartzECROp,
1233- ConvertQuartzRXXOp, ConvertQuartzRYYOp, ConvertQuartzRZXOp,
1234- ConvertQuartzRZZOp, ConvertQuartzXXPlusYYOp, ConvertQuartzXXMinusYYOp,
1235- ConvertQuartzBarrierOp, ConvertQuartzCtrlOp, ConvertQuartzYieldOp>(
1286+ patterns.add <ConvertQuartzAllocOp, ConvertQuartzDeallocOp,
1287+ ConvertQuartzStaticOp, ConvertQuartzMeasureOp,
1288+ ConvertQuartzResetOp, ConvertQuartzGPhaseOp, ConvertQuartzIdOp,
1289+ ConvertQuartzXOp, ConvertQuartzYOp, ConvertQuartzZOp,
1290+ ConvertQuartzHOp, ConvertQuartzSOp, ConvertQuartzSdgOp,
1291+ ConvertQuartzTOp, ConvertQuartzTdgOp, ConvertQuartzSXOp,
1292+ ConvertQuartzSXdgOp, ConvertQuartzRXOp, ConvertQuartzRYOp,
1293+ ConvertQuartzRZOp, ConvertQuartzPOp, ConvertQuartzROp,
1294+ ConvertQuartzU2Op, ConvertQuartzUOp, ConvertQuartzSWAPOp,
1295+ ConvertQuartziSWAPOp, ConvertQuartzDCXOp, ConvertQuartzECROp,
1296+ ConvertQuartzRXXOp, ConvertQuartzRYYOp, ConvertQuartzRZXOp,
1297+ ConvertQuartzRZZOp, ConvertQuartzXXPlusYYOp,
1298+ ConvertQuartzXXMinusYYOp, ConvertQuartzBarrierOp,
1299+ ConvertQuartzCtrlOp, ConvertQuartzInvOp, ConvertQuartzYieldOp>(
12361300 typeConverter, context, &state);
12371301
12381302 // Conversion of quartz types in func.func signatures
0 commit comments