Skip to content

Commit abb9346

Browse files
committed
Add quartz.inv to flux.inv conversion
1 parent 7c2db06 commit abb9346

File tree

1 file changed

+77
-13
lines changed

1 file changed

+77
-13
lines changed

mlir/lib/Conversion/QuartzToFlux/QuartzToFlux.cpp

Lines changed: 77 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)