1111#include " mlir/Conversion/CatalystQuantumToQC/CatalystQuantumToQC.h" // NOLINT(misc-include-cleaner)
1212
1313#include " mlir/Dialect/QC/IR/QCDialect.h"
14+ #include " mlir/Dialect/QC/IR/QCOps.h"
1415
1516#include < Quantum/IR/QuantumDialect.h>
1617#include < Quantum/IR/QuantumOps.h>
@@ -76,7 +77,7 @@ class CatalystQuantumToQCTypeConverter final : public TypeConverter {
7677 if (inputs[0 ].getType () != resultType) {
7778 if (auto memrefType = dyn_cast<MemRefType>(resultType)) {
7879 if (isa<MemRefType>(inputs[0 ].getType ())) {
79- return {builder. create < memref::CastOp>( loc, memrefType, inputs[0 ])};
80+ return {memref::CastOp::create (builder, loc, memrefType, inputs[0 ])};
8081 }
8182 }
8283 }
@@ -102,18 +103,18 @@ struct ConvertQuantumAlloc final
102103 const auto nqubits = nqubitsAttr.getValue ().getZExtValue ();
103104 const auto memrefType =
104105 MemRefType::get ({static_cast <int64_t >(nqubits)}, qubitType);
105- auto allocOp = rewriter. create < memref::AllocOp>( op.getLoc (), memrefType);
106+ auto allocOp = memref::AllocOp::create (rewriter, op.getLoc (), memrefType);
106107 rewriter.replaceOp (op, allocOp.getResult ());
107108 } else if (auto nqubitsOp = op.getNqubits ()) {
108109 // Dynamic allocation
109110 Value size = nqubitsOp;
110111 if (isa<IntegerType>(size.getType ())) {
111- size = rewriter. create < arith::IndexCastOp>(
112+ size = arith::IndexCastOp::create (rewriter,
112113 op.getLoc (), rewriter.getIndexType (), size);
113114 }
114115 const auto memrefType =
115116 MemRefType::get ({ShapedType::kDynamic }, qubitType);
116- auto allocOp = rewriter. create < memref::AllocOp>( op.getLoc (), memrefType,
117+ auto allocOp = memref::AllocOp::create (rewriter, op.getLoc (), memrefType,
117118 ValueRange{size});
118119 rewriter.replaceOp (op, allocOp.getResult ());
119120 } else {
@@ -161,7 +162,7 @@ struct ConvertQuantumMeasure final
161162 // Create the new operation
162163 // Note: quantum.measure returns (i1, !quantum.bit)
163164 // qc.measure returns i1
164- auto QCOp = rewriter. create < qc::MeasureOp>( op.getLoc (), inQubit);
165+ auto QCOp = qc::MeasureOp::create (rewriter, op.getLoc (), inQubit);
165166
166167 // Replace with results in the correct order
167168 rewriter.replaceOp (op, {inQubit, QCOp.getResult ()});
@@ -186,7 +187,7 @@ struct ConvertQuantumExtract final
186187 if (idxAttr) {
187188 // Compile-time constant index from attribute
188189 const auto idx = idxAttr.getValue ().getZExtValue ();
189- indexValue = rewriter. create < ConstantIndexOp>( op.getLoc (), idx);
190+ indexValue = ConstantIndexOp::create (rewriter, op.getLoc (), idx);
190191 } else {
191192 // Runtime dynamic index from operand
192193 auto idxOperand = adaptor.getIdx ();
@@ -196,7 +197,7 @@ struct ConvertQuantumExtract final
196197
197198 // Convert i64 to index type if needed
198199 if (isa<IntegerType>(idxOperand.getType ())) {
199- indexValue = rewriter. create < IndexCastOp>(
200+ indexValue = IndexCastOp::create (rewriter,
200201 op.getLoc (), rewriter.getIndexType (), idxOperand);
201202 } else {
202203 indexValue = idxOperand;
@@ -221,7 +222,7 @@ struct ConvertQuantumExtract final
221222 }
222223
223224 // Create the new operation
224- auto loadOp = rewriter. create < memref::LoadOp>(
225+ auto loadOp = memref::LoadOp::create (rewriter,
225226 op.getLoc (), qubitType, memref, ValueRange{indexValue});
226227
227228 // Replace the extract operation with the loaded qubit
@@ -244,7 +245,7 @@ struct ConvertQuantumInsert final
244245 if (idxAttr) {
245246 // Compile-time constant index from attribute
246247 const auto idx = idxAttr.getValue ().getZExtValue ();
247- indexValue = rewriter. create < ConstantIndexOp>( op.getLoc (), idx);
248+ indexValue = ConstantIndexOp::create (rewriter, op.getLoc (), idx);
248249 } else {
249250 // Runtime dynamic index from operand
250251 auto idxOperand = adaptor.getIdx ();
@@ -254,7 +255,7 @@ struct ConvertQuantumInsert final
254255
255256 // Convert i64 to index type if needed
256257 if (isa<IntegerType>(idxOperand.getType ())) {
257- indexValue = rewriter. create < IndexCastOp>(
258+ indexValue = IndexCastOp::create (rewriter,
258259 op.getLoc (), rewriter.getIndexType (), idxOperand);
259260 } else {
260261 indexValue = idxOperand;
@@ -272,7 +273,7 @@ struct ConvertQuantumInsert final
272273 }
273274
274275 // Create the new operation
275- rewriter. create < memref::StoreOp>( op.getLoc (), adaptor.getQubit (), memref,
276+ memref::StoreOp::create (rewriter, op.getLoc (), adaptor.getQubit (), memref,
276277 ValueRange{indexValue});
277278
278279 // In the memref model, the register is modified in-place
@@ -292,7 +293,7 @@ struct ConvertQuantumGlobalPhase final
292293 const auto param = adaptor.getParams ();
293294
294295 // Replace the original with the new operation
295- rewriter. create < qc::GPhaseOp>( op.getLoc (), param);
296+ qc::GPhaseOp::create (rewriter, op.getLoc (), param);
296297 rewriter.eraseOp (op);
297298 return success ();
298299 }
@@ -319,23 +320,23 @@ struct ConvertQuantumCustomOp final
319320 Operation* qcOp = nullptr ;
320321
321322#define CREATE_ONE_TARGET_ZERO_PARAMETER_GATE_OP (GATE_TYPE ) \
322- rewriter. create < qc::GATE_TYPE##Op>( op.getLoc (), inQubits[0 ])
323+ qc::GATE_TYPE##Op::create (rewriter, op.getLoc (), inQubits[0 ])
323324
324325#define CREATE_TWO_TARGET_ZERO_PARAMETER_GATE_OP (GATE_TYPE ) \
325- rewriter. create < qc::GATE_TYPE##Op>( op.getLoc (), inQubits[0 ], inQubits[1 ])
326+ qc::GATE_TYPE##Op::create (rewriter, op.getLoc (), inQubits[0 ], inQubits[1 ])
326327
327328#define CREATE_ONE_TARGET_ONE_PARAMETER_GATE_OP (GATE_TYPE ) \
328- rewriter. create < qc::GATE_TYPE##Op>( op.getLoc (), inQubits[0 ], paramsValues[0 ])
329+ qc::GATE_TYPE##Op::create (rewriter, op.getLoc (), inQubits[0 ], paramsValues[0 ])
329330
330331#define CREATE_TWO_TARGET_ONE_PARAMETER_GATE_OP (GATE_TYPE ) \
331- rewriter. create < qc::GATE_TYPE##Op>( op.getLoc (), inQubits[0 ], inQubits[1 ], \
332+ qc::GATE_TYPE##Op::create (rewriter, op.getLoc (), inQubits[0 ], inQubits[1 ], \
332333 paramsValues[0 ])
333334
334335 if (gateName == " Hadamard" ) {
335336 if (inCtrlQubits.empty ()) {
336337 qcOp = CREATE_ONE_TARGET_ZERO_PARAMETER_GATE_OP (H);
337338 } else {
338- qcOp = rewriter. create < qc::CtrlOp>( op.getLoc (), inCtrlQubits, [&]() {
339+ qcOp = qc::CtrlOp::create (rewriter, op.getLoc (), inCtrlQubits, [&]() {
339340 CREATE_ONE_TARGET_ZERO_PARAMETER_GATE_OP (H);
340341 });
341342 }
@@ -345,23 +346,23 @@ struct ConvertQuantumCustomOp final
345346 if (inCtrlQubits.empty ()) {
346347 qcOp = CREATE_ONE_TARGET_ZERO_PARAMETER_GATE_OP (X);
347348 } else {
348- qcOp = rewriter. create < qc::CtrlOp>( op.getLoc (), inCtrlQubits, [&]() {
349+ qcOp = qc::CtrlOp::create (rewriter, op.getLoc (), inCtrlQubits, [&]() {
349350 CREATE_ONE_TARGET_ZERO_PARAMETER_GATE_OP (X);
350351 });
351352 }
352353 } else if (gateName == " PauliY" ) {
353354 if (inCtrlQubits.empty ()) {
354355 qcOp = CREATE_ONE_TARGET_ZERO_PARAMETER_GATE_OP (Y);
355356 } else {
356- qcOp = rewriter. create < qc::CtrlOp>( op.getLoc (), inCtrlQubits, [&]() {
357+ qcOp = qc::CtrlOp::create (rewriter, op.getLoc (), inCtrlQubits, [&]() {
357358 CREATE_ONE_TARGET_ZERO_PARAMETER_GATE_OP (Y);
358359 });
359360 }
360361 } else if (gateName == " PauliZ" ) {
361362 if (inCtrlQubits.empty ()) {
362363 qcOp = CREATE_ONE_TARGET_ZERO_PARAMETER_GATE_OP (Z);
363364 } else {
364- qcOp = rewriter. create < qc::CtrlOp>( op.getLoc (), inCtrlQubits, [&]() {
365+ qcOp = qc::CtrlOp::create (rewriter, op.getLoc (), inCtrlQubits, [&]() {
365366 CREATE_ONE_TARGET_ZERO_PARAMETER_GATE_OP (Z);
366367 });
367368 }
@@ -370,15 +371,15 @@ struct ConvertQuantumCustomOp final
370371 if (inCtrlQubits.empty ()) {
371372 qcOp = CREATE_ONE_TARGET_ZERO_PARAMETER_GATE_OP (Sdg);
372373 } else {
373- qcOp = rewriter. create < qc::CtrlOp>( op.getLoc (), inCtrlQubits, [&]() {
374+ qcOp = qc::CtrlOp::create (rewriter, op.getLoc (), inCtrlQubits, [&]() {
374375 CREATE_ONE_TARGET_ZERO_PARAMETER_GATE_OP (Sdg);
375376 });
376377 }
377378 } else {
378379 if (inCtrlQubits.empty ()) {
379380 qcOp = CREATE_ONE_TARGET_ZERO_PARAMETER_GATE_OP (S);
380381 } else {
381- qcOp = rewriter. create < qc::CtrlOp>( op.getLoc (), inCtrlQubits, [&]() {
382+ qcOp = qc::CtrlOp::create (rewriter, op.getLoc (), inCtrlQubits, [&]() {
382383 CREATE_ONE_TARGET_ZERO_PARAMETER_GATE_OP (S);
383384 });
384385 }
@@ -388,15 +389,15 @@ struct ConvertQuantumCustomOp final
388389 if (inCtrlQubits.empty ()) {
389390 qcOp = CREATE_ONE_TARGET_ZERO_PARAMETER_GATE_OP (Tdg);
390391 } else {
391- qcOp = rewriter. create < qc::CtrlOp>( op.getLoc (), inCtrlQubits, [&]() {
392+ qcOp = qc::CtrlOp::create (rewriter, op.getLoc (), inCtrlQubits, [&]() {
392393 CREATE_ONE_TARGET_ZERO_PARAMETER_GATE_OP (Tdg);
393394 });
394395 }
395396 } else {
396397 if (inCtrlQubits.empty ()) {
397398 qcOp = CREATE_ONE_TARGET_ZERO_PARAMETER_GATE_OP (T);
398399 } else {
399- qcOp = rewriter. create < qc::CtrlOp>( op.getLoc (), inCtrlQubits, [&]() {
400+ qcOp = qc::CtrlOp::create (rewriter, op.getLoc (), inCtrlQubits, [&]() {
400401 CREATE_ONE_TARGET_ZERO_PARAMETER_GATE_OP (T);
401402 });
402403 }
@@ -406,15 +407,15 @@ struct ConvertQuantumCustomOp final
406407 if (inCtrlQubits.empty ()) {
407408 qcOp = CREATE_ONE_TARGET_ZERO_PARAMETER_GATE_OP (SXdg);
408409 } else {
409- qcOp = rewriter. create < qc::CtrlOp>( op.getLoc (), inCtrlQubits, [&]() {
410+ qcOp = qc::CtrlOp::create (rewriter, op.getLoc (), inCtrlQubits, [&]() {
410411 CREATE_ONE_TARGET_ZERO_PARAMETER_GATE_OP (SXdg);
411412 });
412413 }
413414 } else {
414415 if (inCtrlQubits.empty ()) {
415416 qcOp = CREATE_ONE_TARGET_ZERO_PARAMETER_GATE_OP (SX);
416417 } else {
417- qcOp = rewriter. create < qc::CtrlOp>( op.getLoc (), inCtrlQubits, [&]() {
418+ qcOp = qc::CtrlOp::create (rewriter, op.getLoc (), inCtrlQubits, [&]() {
418419 CREATE_ONE_TARGET_ZERO_PARAMETER_GATE_OP (SX);
419420 });
420421 }
@@ -423,88 +424,88 @@ struct ConvertQuantumCustomOp final
423424 if (inCtrlQubits.empty ()) {
424425 qcOp = CREATE_TWO_TARGET_ZERO_PARAMETER_GATE_OP (ECR);
425426 } else {
426- qcOp = rewriter. create < qc::CtrlOp>( op.getLoc (), inCtrlQubits, [&]() {
427+ qcOp = qc::CtrlOp::create (rewriter, op.getLoc (), inCtrlQubits, [&]() {
427428 CREATE_TWO_TARGET_ZERO_PARAMETER_GATE_OP (ECR);
428429 });
429430 }
430431 } else if (gateName == " SWAP" ) {
431432 if (inCtrlQubits.empty ()) {
432433 qcOp = CREATE_TWO_TARGET_ZERO_PARAMETER_GATE_OP (SWAP);
433434 } else {
434- qcOp = rewriter. create < qc::CtrlOp>( op.getLoc (), inCtrlQubits, [&]() {
435+ qcOp = qc::CtrlOp::create (rewriter, op.getLoc (), inCtrlQubits, [&]() {
435436 CREATE_TWO_TARGET_ZERO_PARAMETER_GATE_OP (SWAP);
436437 });
437438 }
438439 } else if (gateName == " ISWAP" ) {
439440 if (inCtrlQubits.empty ()) {
440441 qcOp = CREATE_TWO_TARGET_ZERO_PARAMETER_GATE_OP (iSWAP);
441442 } else {
442- qcOp = rewriter. create < qc::CtrlOp>( op.getLoc (), inCtrlQubits, [&]() {
443+ qcOp = qc::CtrlOp::create (rewriter, op.getLoc (), inCtrlQubits, [&]() {
443444 CREATE_TWO_TARGET_ZERO_PARAMETER_GATE_OP (iSWAP);
444445 });
445446 }
446447 } else if (gateName == " RX" ) {
447448 if (inCtrlQubits.empty ()) {
448449 qcOp = CREATE_ONE_TARGET_ONE_PARAMETER_GATE_OP (RX);
449450 } else {
450- qcOp = rewriter. create < qc::CtrlOp>( op.getLoc (), inCtrlQubits, [&]() {
451+ qcOp = qc::CtrlOp::create (rewriter, op.getLoc (), inCtrlQubits, [&]() {
451452 CREATE_ONE_TARGET_ONE_PARAMETER_GATE_OP (RX);
452453 });
453454 }
454455 } else if (gateName == " RY" ) {
455456 if (inCtrlQubits.empty ()) {
456457 qcOp = CREATE_ONE_TARGET_ONE_PARAMETER_GATE_OP (RY);
457458 } else {
458- qcOp = rewriter. create < qc::CtrlOp>( op.getLoc (), inCtrlQubits, [&]() {
459+ qcOp = qc::CtrlOp::create (rewriter, op.getLoc (), inCtrlQubits, [&]() {
459460 CREATE_ONE_TARGET_ONE_PARAMETER_GATE_OP (RY);
460461 });
461462 }
462463 } else if (gateName == " RZ" ) {
463464 if (inCtrlQubits.empty ()) {
464465 qcOp = CREATE_ONE_TARGET_ONE_PARAMETER_GATE_OP (RZ);
465466 } else {
466- qcOp = rewriter. create < qc::CtrlOp>( op.getLoc (), inCtrlQubits, [&]() {
467+ qcOp = qc::CtrlOp::create (rewriter, op.getLoc (), inCtrlQubits, [&]() {
467468 CREATE_ONE_TARGET_ONE_PARAMETER_GATE_OP (RZ);
468469 });
469470 }
470471 } else if (gateName == " PhaseShift" ) {
471472 if (inCtrlQubits.empty ()) {
472473 qcOp = CREATE_ONE_TARGET_ONE_PARAMETER_GATE_OP (P);
473474 } else {
474- qcOp = rewriter. create < qc::CtrlOp>( op.getLoc (), inCtrlQubits, [&]() {
475+ qcOp = qc::CtrlOp::create (rewriter, op.getLoc (), inCtrlQubits, [&]() {
475476 CREATE_ONE_TARGET_ONE_PARAMETER_GATE_OP (P);
476477 });
477478 }
478479 } else if (gateName == " CRX" ) {
479- qcOp = rewriter. create < qc::CtrlOp>(
480+ qcOp = qc::CtrlOp::create (rewriter,
480481 op.getLoc (), inQubits.take_front (1 ), [&]() {
481- rewriter. create < qc::RXOp>( op.getLoc (), inQubits[1 ],
482+ qc::RXOp::create (rewriter, op.getLoc (), inQubits[1 ],
482483 paramsValues[0 ]);
483484 });
484485 } else if (gateName == " CRY" ) {
485- qcOp = rewriter. create < qc::CtrlOp>(
486+ qcOp = qc::CtrlOp::create (rewriter,
486487 op.getLoc (), inQubits.take_front (1 ), [&]() {
487- rewriter. create < qc::RYOp>( op.getLoc (), inQubits[1 ],
488+ qc::RYOp::create (rewriter, op.getLoc (), inQubits[1 ],
488489 paramsValues[0 ]);
489490 });
490491 } else if (gateName == " CRZ" ) {
491- qcOp = rewriter. create < qc::CtrlOp>(
492+ qcOp = qc::CtrlOp::create (rewriter,
492493 op.getLoc (), inQubits.take_front (1 ), [&]() {
493- rewriter. create < qc::RZOp>( op.getLoc (), inQubits[1 ],
494+ qc::RZOp::create (rewriter, op.getLoc (), inQubits[1 ],
494495 paramsValues[0 ]);
495496 });
496497 } else if (gateName == " ControlledPhaseShift" ) {
497- qcOp = rewriter. create < qc::CtrlOp>(
498+ qcOp = qc::CtrlOp::create (rewriter,
498499 op.getLoc (), inQubits.take_front (1 ), [&]() {
499- rewriter. create < qc::POp>( op.getLoc (), inQubits[1 ], paramsValues[0 ]);
500+ qc::POp::create (rewriter, op.getLoc (), inQubits[1 ], paramsValues[0 ]);
500501 });
501502 } else if (gateName == " IsingXY" ) {
502503 // PennyLane IsingXY has 1 parameter (phi), OpenQASM XXPlusYY needs 2
503504 // (theta, beta) Relationship: IsingXY(phi) = XXPlusYY(phi, pi)
504505 // Add pi as second parameter (since we add it during compilation)
505506
506507 qcOp =
507- rewriter. create < qc::XXPlusYYOp>( op.getLoc (), inQubits[0 ], inQubits[1 ],
508+ qc::XXPlusYYOp::create (rewriter, op.getLoc (), inQubits[0 ], inQubits[1 ],
508509 paramsValues[0 ], std::numbers::pi);
509510 } else if (gateName == " IsingXX" ) {
510511 qcOp = CREATE_TWO_TARGET_ONE_PARAMETER_GATE_OP (RXX);
@@ -513,24 +514,24 @@ struct ConvertQuantumCustomOp final
513514 } else if (gateName == " IsingZZ" ) {
514515 qcOp = CREATE_TWO_TARGET_ONE_PARAMETER_GATE_OP (RZZ);
515516 } else if (gateName == " CNOT" ) {
516- qcOp = rewriter. create < qc::CtrlOp>( op.getLoc (), inQubits[0 ], [&]() {
517- rewriter. create < qc::XOp>( op.getLoc (), inQubits[1 ]);
517+ qcOp = qc::CtrlOp::create (rewriter, op.getLoc (), inQubits[0 ], [&]() {
518+ qc::XOp::create (rewriter, op.getLoc (), inQubits[1 ]);
518519 });
519520 } else if (gateName == " CY" ) {
520- qcOp = rewriter. create < qc::CtrlOp>( op.getLoc (), inQubits[0 ], [&]() {
521- rewriter. create < qc::YOp>( op.getLoc (), inQubits[1 ]);
521+ qcOp = qc::CtrlOp::create (rewriter, op.getLoc (), inQubits[0 ], [&]() {
522+ qc::YOp::create (rewriter, op.getLoc (), inQubits[1 ]);
522523 });
523524 } else if (gateName == " CZ" ) {
524- qcOp = rewriter. create < qc::CtrlOp>( op.getLoc (), inQubits[0 ], [&]() {
525- rewriter. create < qc::ZOp>( op.getLoc (), inQubits[1 ]);
525+ qcOp = qc::CtrlOp::create (rewriter, op.getLoc (), inQubits[0 ], [&]() {
526+ qc::ZOp::create (rewriter, op.getLoc (), inQubits[1 ]);
526527 });
527528 } else if (gateName == " Toffoli" ) {
528- qcOp = rewriter. create < qc::CtrlOp>(
529+ qcOp = qc::CtrlOp::create (rewriter,
529530 op.getLoc (), inQubits.take_front (2 ),
530- [&]() { rewriter. create < qc::XOp>( op.getLoc (), inQubits[2 ]); });
531+ [&]() { qc::XOp::create (rewriter, op.getLoc (), inQubits[2 ]); });
531532 } else if (gateName == " CSWAP" ) {
532- qcOp = rewriter. create < qc::CtrlOp>( op.getLoc (), inQubits[0 ], [&]() {
533- rewriter. create < qc::SWAPOp>( op.getLoc (), inQubits[1 ], inQubits[2 ]);
533+ qcOp = qc::CtrlOp::create (rewriter, op.getLoc (), inQubits[0 ], [&]() {
534+ qc::SWAPOp::create (rewriter, op.getLoc (), inQubits[1 ], inQubits[2 ]);
534535 });
535536 } else {
536537 return op.emitError (" Unsupported gate: " ) << gateName;
0 commit comments