Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
86c0957
✨ add new operation type `R`
burgholzer Nov 1, 2025
261e828
🚸 add convenience method to QuantumComputation class
burgholzer Nov 1, 2025
ecffe57
✨ add support to QASM parser
burgholzer Nov 1, 2025
9fe0b10
✨ add support to DD package
burgholzer Nov 1, 2025
f59826f
✨ expose to Python
burgholzer Nov 1, 2025
9c51a46
✨ add support to MLIR
burgholzer Nov 1, 2025
5185d0a
✅ add MLIR tests
burgholzer Nov 1, 2025
b2e907c
🚸 add `prx` alias for R gate
burgholzer Nov 1, 2025
10fbcb3
✨ add support to QIR runtime
burgholzer Nov 1, 2025
b83f5ff
✅ add IR tests
burgholzer Nov 1, 2025
c6b5d4e
✅ add QIR tests
burgholzer Nov 1, 2025
6183d09
✅ add DD package tests
burgholzer Nov 1, 2025
9235d44
✨ add support to ZX package
burgholzer Nov 1, 2025
49cdd19
✨ add support to Qiskit plugin
burgholzer Nov 1, 2025
a9cde3e
📝 add changelog entry
burgholzer Nov 1, 2025
94139e1
🚨 use designated initializers everywhere
burgholzer Nov 1, 2025
4da7a8f
🩹 fix qubit SSA value in MLIR test suite
burgholzer Nov 1, 2025
57fb6fb
🩹 fix type stubs for new operation
burgholzer Nov 1, 2025
c1956ae
🩹 fix `prx` implementation in QIR runtime
burgholzer Nov 1, 2025
89f91f7
✅ add `r` to QASM tests
burgholzer Nov 1, 2025
ec4fe7f
⚡ faster `opTypeFromString`
burgholzer Nov 1, 2025
c382572
🏁 fix windows build
burgholzer Nov 1, 2025
92d2160
🚨 address linter warnings
burgholzer Nov 1, 2025
5d1241c
🏁 fix Windows (again)
burgholzer Nov 1, 2025
f1cc80f
Add documentation for prx as R gate alias in QIR runtime (#1285)
Copilot Nov 1, 2025
c189c20
Add Doxygen documentation for R(θ, φ) gate matrix implementation (#1284)
Copilot Nov 1, 2025
c681127
🎨 use CTAD
burgholzer Nov 1, 2025
c4a9922
🚨 fix linter warning
burgholzer Nov 1, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ This project adheres to [Semantic Versioning], with the exception that minor rel

### Added

- ✨ Add native support for `R(theta, phi)` gate ([#1283]) ([**@burgholzer**])
- ✨ Add A\*-search-based routing algorithm to MLIR transpilation routines ([#1237], [#1271], [#1279]) ([**@MatthiasReumann**])

### Fixed
Expand Down Expand Up @@ -220,6 +221,7 @@ _📚 Refer to the [GitHub Release Notes](https://github.com/munich-quantum-tool

<!-- PR links -->

[#1283]: https://github.com/munich-quantum-toolkit/core/pull/1283
[#1279]: https://github.com/munich-quantum-toolkit/core/pull/1279
[#1276]: https://github.com/munich-quantum-toolkit/core/pull/1276
[#1271]: https://github.com/munich-quantum-toolkit/core/pull/1271
Expand Down
1 change: 1 addition & 0 deletions bindings/ir/operations/register_optype.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ void registerOptype(const py::module& m) {
.value("rx", qc::OpType::RX)
.value("ry", qc::OpType::RY)
.value("rz", qc::OpType::RZ)
.value("r", qc::OpType::R)
.value("swap", qc::OpType::SWAP)
.value("iswap", qc::OpType::iSWAP)
.value("iswapdg", qc::OpType::iSWAPdg)
Expand Down
1 change: 1 addition & 0 deletions bindings/ir/register_quantum_computation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -345,6 +345,7 @@ void registerQuantumComputation(py::module& m) {
py::arg(#param1), "controls"_a, "target"_a);

DEFINE_SINGLE_TARGET_TWO_PARAMETER_OPERATION(u2, phi, lambda_)
DEFINE_SINGLE_TARGET_TWO_PARAMETER_OPERATION(r, theta, phi)

#define DEFINE_SINGLE_TARGET_THREE_PARAMETER_OPERATION(op, param0, param1, \
param2) \
Expand Down
1 change: 1 addition & 0 deletions include/mqt-core/ir/QuantumComputation.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,7 @@ class QuantumComputation {
const Controls& controls, const Qubit target);

DECLARE_SINGLE_TARGET_TWO_PARAMETER_OPERATION(u2, phi, lambda)
DECLARE_SINGLE_TARGET_TWO_PARAMETER_OPERATION(r, theta, phi)

#undef DECLARE_SINGLE_TARGET_TWO_PARAMETER_OPERATION

Expand Down
4 changes: 3 additions & 1 deletion include/mqt-core/ir/operations/OpType.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#include <istream>
#include <ostream>
#include <string>
#include <string_view>

namespace qc {

Expand Down Expand Up @@ -90,6 +91,7 @@ std::string shortName(OpType opType);
case RX:
case RY:
case RZ:
case R:
return true;
default:
return false;
Expand All @@ -100,7 +102,7 @@ inline std::ostream& operator<<(std::ostream& out, const OpType opType) {
return out << toString(opType);
}

[[nodiscard]] OpType opTypeFromString(const std::string& opType);
[[nodiscard]] OpType opTypeFromString(std::string_view opType);

inline std::istream& operator>>(std::istream& in, OpType& opType) {
std::string opTypeStr;
Expand Down
5 changes: 3 additions & 2 deletions include/mqt-core/ir/operations/OpType.inc
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,9 @@ HANDLE_OP_TYPE(14, SXdg, OpTypeInv, "sxdg")
HANDLE_OP_TYPE(15, RX, OpTypeNone, "rx")
HANDLE_OP_TYPE(16, RY, OpTypeNone, "ry")
HANDLE_OP_TYPE(17, RZ, OpTypeDiag, "rz")
HANDLE_OP_TYPE(41, R, OpTypeNone, "r")
HANDLE_OP_TYPE(18, SWAP, OpTypeNone, "swap")
HANDLE_OP_TYPE(19, iSWAP, OpTypeNone, "iswap")
HANDLE_OP_TYPE(19, iSWAP, OpTypeNone, "iswap")
HANDLE_OP_TYPE(19, iSWAPdg, OpTypeInv, "iswapdg")
HANDLE_OP_TYPE(20, Peres, OpTypeNone, "peres")
HANDLE_OP_TYPE(20, Peresdg, OpTypeInv, "peresdg")
Expand Down Expand Up @@ -68,7 +69,7 @@ HANDLE_OP_TYPE(38, AodActivate, 0, "aod_activate")
HANDLE_OP_TYPE(39, AodDeactivate, 0, "aod_deactivate")
HANDLE_OP_TYPE(40, AodMove, 0, "aod_move")

LAST_OP_TYPE(41)
LAST_OP_TYPE(42)


#undef OpTypeInv
Expand Down
229 changes: 169 additions & 60 deletions include/mqt-core/qasm3/StdGates.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,75 +49,184 @@ const std::string QE1LIB = "gate rccx a, b, c {\n"
const std::map<std::string, std::shared_ptr<Gate>> STANDARD_GATES = {
// gates from which all other gates can be constructed.
{"gphase",
std::make_shared<StandardGate>(StandardGate({0, 0, 1, qc::GPhase}))},
{"U", std::make_shared<StandardGate>(StandardGate({0, 1, 3, qc::U}))},
std::make_shared<StandardGate>(StandardGate({.nControls = 0,
.nTargets = 0,
.nParameters = 1,
.type = qc::GPhase}))},
{"U",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 0, .nTargets = 1, .nParameters = 3, .type = qc::U}))},

// natively supported gates
{"p", std::make_shared<StandardGate>(StandardGate({0, 1, 1, qc::P}))},
{"u1", std::make_shared<StandardGate>(StandardGate({0, 1, 1, qc::P}))},
{"phase", std::make_shared<StandardGate>(StandardGate({0, 1, 1, qc::P}))},
{"cphase", std::make_shared<StandardGate>(StandardGate({1, 1, 1, qc::P}))},
{"cp", std::make_shared<StandardGate>(StandardGate({1, 1, 1, qc::P}))},

{"id", std::make_shared<StandardGate>(StandardGate({0, 1, 0, qc::I}))},
{"u2", std::make_shared<StandardGate>(StandardGate({0, 1, 2, qc::U2}))},
{"u3", std::make_shared<StandardGate>(StandardGate({0, 1, 3, qc::U}))},
{"u", std::make_shared<StandardGate>(StandardGate({0, 1, 3, qc::U}))},

{"x", std::make_shared<StandardGate>(StandardGate({0, 1, 0, qc::X}))},
{"cx", std::make_shared<StandardGate>(StandardGate({1, 1, 0, qc::X}))},
{"CX", std::make_shared<StandardGate>(StandardGate({1, 1, 0, qc::X}))},
{"ccx", std::make_shared<StandardGate>(StandardGate({2, 1, 0, qc::X}))},
{"c3x", std::make_shared<StandardGate>(StandardGate({3, 1, 0, qc::X}))},
{"c4x", std::make_shared<StandardGate>(StandardGate({4, 1, 0, qc::X}))},

{"rx", std::make_shared<StandardGate>(StandardGate({0, 1, 1, qc::RX}))},
{"crx", std::make_shared<StandardGate>(StandardGate({1, 1, 1, qc::RX}))},

{"y", std::make_shared<StandardGate>(StandardGate({0, 1, 0, qc::Y}))},
{"cy", std::make_shared<StandardGate>(StandardGate({1, 1, 0, qc::Y}))},

{"ry", std::make_shared<StandardGate>(StandardGate({0, 1, 1, qc::RY}))},
{"cry", std::make_shared<StandardGate>(StandardGate({1, 1, 1, qc::RY}))},

{"z", std::make_shared<StandardGate>(StandardGate({0, 1, 0, qc::Z}))},
{"cz", std::make_shared<StandardGate>(StandardGate({1, 1, 0, qc::Z}))},

{"rz", std::make_shared<StandardGate>(StandardGate({0, 1, 1, qc::RZ}))},
{"crz", std::make_shared<StandardGate>(StandardGate({1, 1, 1, qc::RZ}))},

{"h", std::make_shared<StandardGate>(StandardGate({0, 1, 0, qc::H}))},
{"ch", std::make_shared<StandardGate>(StandardGate({1, 1, 0, qc::H}))},

{"s", std::make_shared<StandardGate>(StandardGate({0, 1, 0, qc::S}))},
{"sdg", std::make_shared<StandardGate>(StandardGate({0, 1, 0, qc::Sdg}))},

{"t", std::make_shared<StandardGate>(StandardGate({0, 1, 0, qc::T}))},
{"tdg", std::make_shared<StandardGate>(StandardGate({0, 1, 0, qc::Tdg}))},

{"sx", std::make_shared<StandardGate>(StandardGate({0, 1, 0, qc::SX}))},
{"sxdg", std::make_shared<StandardGate>(StandardGate({0, 1, 0, qc::SXdg}))},
{"p",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 0, .nTargets = 1, .nParameters = 1, .type = qc::P}))},
{"u1",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 0, .nTargets = 1, .nParameters = 1, .type = qc::P}))},
{"phase",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 0, .nTargets = 1, .nParameters = 1, .type = qc::P}))},
{"cphase",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 1, .nTargets = 1, .nParameters = 1, .type = qc::P}))},
{"cp",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 1, .nTargets = 1, .nParameters = 1, .type = qc::P}))},

{"id",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 0, .nTargets = 1, .nParameters = 0, .type = qc::I}))},
{"u2",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 0, .nTargets = 1, .nParameters = 2, .type = qc::U2}))},
{"u3",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 0, .nTargets = 1, .nParameters = 3, .type = qc::U}))},
{"u",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 0, .nTargets = 1, .nParameters = 3, .type = qc::U}))},

{"x",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 0, .nTargets = 1, .nParameters = 0, .type = qc::X}))},
{"cx",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 1, .nTargets = 1, .nParameters = 0, .type = qc::X}))},
{"CX",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 1, .nTargets = 1, .nParameters = 0, .type = qc::X}))},
{"ccx",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 2, .nTargets = 1, .nParameters = 0, .type = qc::X}))},
{"c3x",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 3, .nTargets = 1, .nParameters = 0, .type = qc::X}))},
{"c4x",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 4, .nTargets = 1, .nParameters = 0, .type = qc::X}))},

{"rx",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 0, .nTargets = 1, .nParameters = 1, .type = qc::RX}))},
{"crx",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 1, .nTargets = 1, .nParameters = 1, .type = qc::RX}))},

{"y",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 0, .nTargets = 1, .nParameters = 0, .type = qc::Y}))},
{"cy",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 1, .nTargets = 1, .nParameters = 0, .type = qc::Y}))},

{"ry",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 0, .nTargets = 1, .nParameters = 1, .type = qc::RY}))},
{"cry",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 1, .nTargets = 1, .nParameters = 1, .type = qc::RY}))},

{"z",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 0, .nTargets = 1, .nParameters = 0, .type = qc::Z}))},
{"cz",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 1, .nTargets = 1, .nParameters = 0, .type = qc::Z}))},

{"rz",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 0, .nTargets = 1, .nParameters = 1, .type = qc::RZ}))},
{"crz",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 1, .nTargets = 1, .nParameters = 1, .type = qc::RZ}))},

{"r",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 0, .nTargets = 1, .nParameters = 2, .type = qc::R}))},
{"prx",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 0, .nTargets = 1, .nParameters = 2, .type = qc::R}))},
{"cr",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 1, .nTargets = 1, .nParameters = 2, .type = qc::R}))},
Comment thread
coderabbitai[bot] marked this conversation as resolved.

{"h",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 0, .nTargets = 1, .nParameters = 0, .type = qc::H}))},
{"ch",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 1, .nTargets = 1, .nParameters = 0, .type = qc::H}))},

{"s",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 0, .nTargets = 1, .nParameters = 0, .type = qc::S}))},
{"sdg",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 0, .nTargets = 1, .nParameters = 0, .type = qc::Sdg}))},

{"t",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 0, .nTargets = 1, .nParameters = 0, .type = qc::T}))},
{"tdg",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 0, .nTargets = 1, .nParameters = 0, .type = qc::Tdg}))},

{"sx",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 0, .nTargets = 1, .nParameters = 0, .type = qc::SX}))},
{"sxdg",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 0, .nTargets = 1, .nParameters = 0, .type = qc::SXdg}))},
{"c3sqrtx",
std::make_shared<StandardGate>(StandardGate({3, 1, 0, qc::SXdg}))},
std::make_shared<StandardGate>(StandardGate(
{.nControls = 3, .nTargets = 1, .nParameters = 0, .type = qc::SXdg}))},

{"swap", std::make_shared<StandardGate>(StandardGate({0, 2, 0, qc::SWAP}))},
{"swap",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 0, .nTargets = 2, .nParameters = 0, .type = qc::SWAP}))},
{"cswap",
std::make_shared<StandardGate>(StandardGate({1, 2, 0, qc::SWAP}))},
std::make_shared<StandardGate>(StandardGate(
{.nControls = 1, .nTargets = 2, .nParameters = 0, .type = qc::SWAP}))},

{"iswap",
std::make_shared<StandardGate>(StandardGate({0, 2, 0, qc::iSWAP}))},
std::make_shared<StandardGate>(StandardGate({.nControls = 0,
.nTargets = 2,
.nParameters = 0,
.type = qc::iSWAP}))},
{"iswapdg",
std::make_shared<StandardGate>(StandardGate({0, 2, 0, qc::iSWAPdg}))},

{"rxx", std::make_shared<StandardGate>(StandardGate({0, 2, 1, qc::RXX}))},
{"ryy", std::make_shared<StandardGate>(StandardGate({0, 2, 1, qc::RYY}))},
{"rzz", std::make_shared<StandardGate>(StandardGate({0, 2, 1, qc::RZZ}))},
{"rzx", std::make_shared<StandardGate>(StandardGate({0, 2, 1, qc::RZX}))},
{"dcx", std::make_shared<StandardGate>(StandardGate({0, 2, 0, qc::DCX}))},
{"ecr", std::make_shared<StandardGate>(StandardGate({0, 2, 0, qc::ECR}))},
std::make_shared<StandardGate>(StandardGate({.nControls = 0,
.nTargets = 2,
.nParameters = 0,
.type = qc::iSWAPdg}))},

{"rxx",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 0, .nTargets = 2, .nParameters = 1, .type = qc::RXX}))},
{"ryy",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 0, .nTargets = 2, .nParameters = 1, .type = qc::RYY}))},
{"rzz",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 0, .nTargets = 2, .nParameters = 1, .type = qc::RZZ}))},
{"rzx",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 0, .nTargets = 2, .nParameters = 1, .type = qc::RZX}))},
{"dcx",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 0, .nTargets = 2, .nParameters = 0, .type = qc::DCX}))},
{"ecr",
std::make_shared<StandardGate>(StandardGate(
{.nControls = 0, .nTargets = 2, .nParameters = 0, .type = qc::ECR}))},
{"xx_minus_yy",
std::make_shared<StandardGate>(StandardGate({0, 2, 2, qc::XXminusYY}))},
std::make_shared<StandardGate>(StandardGate({.nControls = 0,
.nTargets = 2,
.nParameters = 2,
.type = qc::XXminusYY}))},
{"xx_plus_yy",
std::make_shared<StandardGate>(StandardGate({0, 2, 2, qc::XXplusYY}))},
std::make_shared<StandardGate>(StandardGate({.nControls = 0,
.nTargets = 2,
.nParameters = 2,
.type = qc::XXplusYY}))},
};
} // namespace qasm3
2 changes: 2 additions & 0 deletions include/mqt-core/qir/runtime/QIR.h
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,8 @@ void __quantum__qis__sqrtx__body(Qubit*);
void __quantum__qis__sqrtxdg__body(Qubit*);
void __quantum__qis__t__body(Qubit*);
void __quantum__qis__tdg__body(Qubit*);
void __quantum__qis__r__body(Qubit*, double, double);
void __quantum__qis__prx__body(Qubit*, double, double);
void __quantum__qis__rx__body(Qubit*, double);
void __quantum__qis__ry__body(Qubit*, double);
void __quantum__qis__rz__body(Qubit*, double);
Expand Down
10 changes: 10 additions & 0 deletions mlir/include/mlir/Dialect/Common/IR/StdOps.td.inc
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,16 @@ def SXdgOp : UnitaryOp<"sxdg", [OneTarget, NoParameter]> {
}];
}

def ROp : UnitaryOp<"r", [OneTarget, TwoParameters]> {
let summary = "R operation";

let description = [{
This class represents a R gate. It takes a qubit and a variadic
list of positive/negative controls as an input. Additionally, it accepts
two parameters indicating the degree of the rotation angles.
}];
}

def RXOp : UnitaryOp<"rx", [OneTarget, OneParameter]> {
let summary = "RX operation";

Expand Down
1 change: 1 addition & 0 deletions mlir/lib/Conversion/MQTOptToMQTRef/MQTOptToMQTRef.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,7 @@ struct MQTOptToMQTRef final : impl::MQTOptToMQTRefBase<MQTOptToMQTRef> {
ADD_CONVERT_PATTERN(POp)
ADD_CONVERT_PATTERN(SXOp)
ADD_CONVERT_PATTERN(SXdgOp)
ADD_CONVERT_PATTERN(ROp)
ADD_CONVERT_PATTERN(RXOp)
ADD_CONVERT_PATTERN(RYOp)
ADD_CONVERT_PATTERN(RZOp)
Expand Down
1 change: 1 addition & 0 deletions mlir/lib/Conversion/MQTRefToMQTOpt/MQTRefToMQTOpt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -434,6 +434,7 @@ struct MQTRefToMQTOpt final : impl::MQTRefToMQTOptBase<MQTRefToMQTOpt> {
ADD_CONVERT_PATTERN(POp)
ADD_CONVERT_PATTERN(SXOp)
ADD_CONVERT_PATTERN(SXdgOp)
ADD_CONVERT_PATTERN(ROp)
ADD_CONVERT_PATTERN(RXOp)
ADD_CONVERT_PATTERN(RYOp)
ADD_CONVERT_PATTERN(RZOp)
Expand Down
1 change: 1 addition & 0 deletions mlir/lib/Conversion/MQTRefToQIR/MQTRefToQIR.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -986,6 +986,7 @@ struct MQTRefToQIR final : impl::MQTRefToQIRBase<MQTRefToQIR> {
ADD_CONVERT_PATTERN(POp)
ADD_CONVERT_PATTERN(SXOp)
ADD_CONVERT_PATTERN(SXdgOp)
ADD_CONVERT_PATTERN(ROp)
ADD_CONVERT_PATTERN(RXOp)
ADD_CONVERT_PATTERN(RYOp)
ADD_CONVERT_PATTERN(RZOp)
Expand Down
2 changes: 2 additions & 0 deletions mlir/lib/Conversion/QIRToMQTRef/QIRToMQTRef.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@ class StatefulOpConversionPattern : public OpConversionPattern<OpType> {
{"rzz", "RZZOp"}, {"rzx", "RZXOp"}, {"u1", "POp"}};

inline static const llvm::StringMap<StringRef> DOUBLE_ROTATION_GATES = {
{"r", "ROp"},
{"u2", "U2Op"},
{"xx_minus_yy", "XXminusYYOp"},
{"xx_plus_yy", "XXplusYYOp"}};
Expand Down Expand Up @@ -349,6 +350,7 @@ struct ConvertQIRCall final : StatefulOpConversionPattern<LLVM::CallOp> {
ADD_CONVERT_ROTATION_GATE(POp)
ADD_CONVERT_ROTATION_GATE(UOp)
ADD_CONVERT_ROTATION_GATE(U2Op)
ADD_CONVERT_ROTATION_GATE(ROp)
ADD_CONVERT_ROTATION_GATE(RXOp)
ADD_CONVERT_ROTATION_GATE(RYOp)
ADD_CONVERT_ROTATION_GATE(RZOp)
Expand Down
Loading
Loading