Skip to content

Commit 8a8c79e

Browse files
committed
Add quartz.inv to flux.inv conversion
1 parent 4188381 commit 8a8c79e

File tree

1 file changed

+76
-13
lines changed

1 file changed

+76
-13
lines changed

mlir/lib/Conversion/QuartzToFlux/QuartzToFlux.cpp

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

Comments
 (0)