From bd9b0f13ab4510a4b51d0d67caefbfa2379f249b Mon Sep 17 00:00:00 2001 From: lsschmid <117631861+lsschmid@users.noreply.github.com> Date: Thu, 8 Aug 2024 09:42:47 +0200 Subject: [PATCH 01/21] :sparkles: added PassBy operation for flying ancillae --- include/mqt-core/QuantumComputation.hpp | 1 + include/mqt-core/operations/OpType.hpp | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/include/mqt-core/QuantumComputation.hpp b/include/mqt-core/QuantumComputation.hpp index 5642eb7448..39498a451d 100644 --- a/include/mqt-core/QuantumComputation.hpp +++ b/include/mqt-core/QuantumComputation.hpp @@ -567,6 +567,7 @@ class QuantumComputation { DEFINE_TWO_TARGET_OPERATION(peres) DEFINE_TWO_TARGET_OPERATION(peresdg) DEFINE_TWO_TARGET_OPERATION(move) + DEFINE_TWO_TARGET_OPERATION(passby) #define DEFINE_TWO_TARGET_SINGLE_PARAMETER_OPERATION(op, param) \ void op(const SymbolOrNumber&(param), const Qubit target0, \ diff --git a/include/mqt-core/operations/OpType.hpp b/include/mqt-core/operations/OpType.hpp index 49901c3a39..a0f0c03576 100644 --- a/include/mqt-core/operations/OpType.hpp +++ b/include/mqt-core/operations/OpType.hpp @@ -61,6 +61,7 @@ enum OpType : std::uint8_t { MultiAFalse, // Neutral atom shuttling operations Move, + PassBy, AodActivate, AodDeactivate, AodMove, @@ -156,6 +157,8 @@ inline std::string toString(const OpType& opType) { return "classic_controlled"; case Move: return "move"; + case PassBy: + return "pass_by"; case AodActivate: return "aod_activate"; case AodDeactivate: @@ -329,6 +332,7 @@ const inline static std::unordered_map {"classic_controlled", OpType::ClassicControlled}, {"compound", OpType::Compound}, {"move", OpType::Move}, + {"pass_by", OpType::PassBy}, {"aod_activate", OpType::AodActivate}, {"aod_deactivate", OpType::AodDeactivate}, {"aod_move", OpType::AodMove}, From fa45fb06188083795775cb31111884a3694e2a8e Mon Sep 17 00:00:00 2001 From: lsschmid <117631861+lsschmid@users.noreply.github.com> Date: Tue, 13 Aug 2024 10:52:05 +0200 Subject: [PATCH 02/21] =?UTF-8?q?=E2=9C=A8=20=20allow=20passby=20to=20have?= =?UTF-8?q?=20multiple=20targets.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/mqt-core/QuantumComputation.hpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/include/mqt-core/QuantumComputation.hpp b/include/mqt-core/QuantumComputation.hpp index 39498a451d..5957d8eafa 100644 --- a/include/mqt-core/QuantumComputation.hpp +++ b/include/mqt-core/QuantumComputation.hpp @@ -567,7 +567,6 @@ class QuantumComputation { DEFINE_TWO_TARGET_OPERATION(peres) DEFINE_TWO_TARGET_OPERATION(peresdg) DEFINE_TWO_TARGET_OPERATION(move) - DEFINE_TWO_TARGET_OPERATION(passby) #define DEFINE_TWO_TARGET_SINGLE_PARAMETER_OPERATION(op, param) \ void op(const SymbolOrNumber&(param), const Qubit target0, \ @@ -682,6 +681,11 @@ class QuantumComputation { emplace_back(targets, qc::Barrier); } + void passby(const Control moved, const Targets& targets) { + checkQubitRange(targets); + emplace_back(Controls{moved}, targets, qc::PassBy); + } + void classicControlled(const OpType op, const Qubit target, const ClassicalRegister& controlRegister, const std::uint64_t expectedValue = 1U, From 99afdb0bc2cd3dabfef14035b8c06a480719f47f Mon Sep 17 00:00:00 2001 From: Ludwig Schmid Date: Mon, 20 Jan 2025 14:22:12 +0100 Subject: [PATCH 03/21] =?UTF-8?q?=E2=9C=A8=20=20added=20passby=20operation?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/mqt-core/ir/QuantumComputation.hpp | 2 ++ src/ir/QuantumComputation.cpp | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/include/mqt-core/ir/QuantumComputation.hpp b/include/mqt-core/ir/QuantumComputation.hpp index 7580202d78..8a51dd7c68 100644 --- a/include/mqt-core/ir/QuantumComputation.hpp +++ b/include/mqt-core/ir/QuantumComputation.hpp @@ -346,6 +346,8 @@ class QuantumComputation { void barrier(Qubit target); void barrier(const Targets& targets); + void passby(const Control moved, const Targets& targets); + void classicControlled(OpType op, Qubit target, const ClassicalRegister& controlRegister, std::uint64_t expectedValue = 1U, diff --git a/src/ir/QuantumComputation.cpp b/src/ir/QuantumComputation.cpp index 71bfffb46f..d26d648820 100644 --- a/src/ir/QuantumComputation.cpp +++ b/src/ir/QuantumComputation.cpp @@ -1836,6 +1836,10 @@ void QuantumComputation::barrier(const Targets& targets) { checkQubitRange(targets); emplace_back(targets, Barrier); } +void QuantumComputation::passby(const Control moved, const Targets& targets) { + checkQubitRange(targets); + emplace_back(Controls{moved}, targets, PassBy); +} void QuantumComputation::classicControlled( const OpType op, const Qubit target, const ClassicalRegister& controlRegister, const std::uint64_t expectedValue, From 5b93fd06ce963f073ad38233b29ddbef6d2fcc81 Mon Sep 17 00:00:00 2001 From: Ludwig Schmid Date: Mon, 20 Jan 2025 16:47:26 +0100 Subject: [PATCH 04/21] =?UTF-8?q?=E2=9C=A8=20=20added=20qasm=20string=20fo?= =?UTF-8?q?r=20passby=20operation.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ir/operations/StandardOperation.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ir/operations/StandardOperation.cpp b/src/ir/operations/StandardOperation.cpp index 685cd8cf96..df588b00a6 100644 --- a/src/ir/operations/StandardOperation.cpp +++ b/src/ir/operations/StandardOperation.cpp @@ -425,6 +425,9 @@ void StandardOperation::dumpGateType(std::ostream& of, std::ostringstream& op, case Move: op << "move"; break; + case PassBy: + op << "pass_by"; + break; case Peres: of << op.str() << "cx"; for (const auto& c : controls) { From d85d0a1158fc5f29c81fcb6d0f0ddab63c2e9788 Mon Sep 17 00:00:00 2001 From: Ludwig Schmid Date: Tue, 21 Jan 2025 15:47:16 +0100 Subject: [PATCH 05/21] =?UTF-8?q?=E2=9C=A8=20Changed=20passby=20to=20two-t?= =?UTF-8?q?arget=20operation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/mqt-core/ir/QuantumComputation.hpp | 3 +-- src/ir/QuantumComputation.cpp | 5 +---- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/include/mqt-core/ir/QuantumComputation.hpp b/include/mqt-core/ir/QuantumComputation.hpp index 8a51dd7c68..9fced6e608 100644 --- a/include/mqt-core/ir/QuantumComputation.hpp +++ b/include/mqt-core/ir/QuantumComputation.hpp @@ -296,6 +296,7 @@ class QuantumComputation { DECLARE_TWO_TARGET_OPERATION(peres) DECLARE_TWO_TARGET_OPERATION(peresdg) DECLARE_TWO_TARGET_OPERATION(move) + DECLARE_TWO_TARGET_OPERATION(passby) #undef DECLARE_TWO_TARGET_OPERATION @@ -346,8 +347,6 @@ class QuantumComputation { void barrier(Qubit target); void barrier(const Targets& targets); - void passby(const Control moved, const Targets& targets); - void classicControlled(OpType op, Qubit target, const ClassicalRegister& controlRegister, std::uint64_t expectedValue = 1U, diff --git a/src/ir/QuantumComputation.cpp b/src/ir/QuantumComputation.cpp index d26d648820..d7d09c23a3 100644 --- a/src/ir/QuantumComputation.cpp +++ b/src/ir/QuantumComputation.cpp @@ -1685,6 +1685,7 @@ DEFINE_TWO_TARGET_OPERATION(iswapdg) DEFINE_TWO_TARGET_OPERATION(peres) DEFINE_TWO_TARGET_OPERATION(peresdg) DEFINE_TWO_TARGET_OPERATION(move) +DEFINE_TWO_TARGET_OPERATION(passby) #undef DEFINE_TWO_TARGET_OPERATION @@ -1836,10 +1837,6 @@ void QuantumComputation::barrier(const Targets& targets) { checkQubitRange(targets); emplace_back(targets, Barrier); } -void QuantumComputation::passby(const Control moved, const Targets& targets) { - checkQubitRange(targets); - emplace_back(Controls{moved}, targets, PassBy); -} void QuantumComputation::classicControlled( const OpType op, const Qubit target, const ClassicalRegister& controlRegister, const std::uint64_t expectedValue, From e0ea685f7d9b7f89e97e54a47160cd1c17dfd624 Mon Sep 17 00:00:00 2001 From: Ludwig Schmid Date: Thu, 23 Jan 2025 10:15:54 +0100 Subject: [PATCH 06/21] =?UTF-8?q?=E2=9C=A8=20Added=20Bridge=20Gate=20as=20?= =?UTF-8?q?Standard=20Operation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/mqt-core/ir/QuantumComputation.hpp | 2 ++ include/mqt-core/ir/operations/OpType.hpp | 4 ++++ src/ir/QuantumComputation.cpp | 5 +++++ 3 files changed, 11 insertions(+) diff --git a/include/mqt-core/ir/QuantumComputation.hpp b/include/mqt-core/ir/QuantumComputation.hpp index 9fced6e608..466622ce32 100644 --- a/include/mqt-core/ir/QuantumComputation.hpp +++ b/include/mqt-core/ir/QuantumComputation.hpp @@ -340,6 +340,8 @@ class QuantumComputation { */ void measureAll(bool addBits = true); + void bridge(const Targets& targets); + void reset(Qubit target); void reset(const Targets& targets); diff --git a/include/mqt-core/ir/operations/OpType.hpp b/include/mqt-core/ir/operations/OpType.hpp index 6356208b4b..d3d10a0891 100644 --- a/include/mqt-core/ir/operations/OpType.hpp +++ b/include/mqt-core/ir/operations/OpType.hpp @@ -69,6 +69,7 @@ enum OpType : std::uint8_t { MultiATrue, MultiAFalse, // Neutral atom shuttling operations + Bridge, Move, PassBy, AodActivate, @@ -164,6 +165,8 @@ inline std::string toString(const OpType& opType) { return "teleportation"; case ClassicControlled: return "classic_controlled"; + case Bridge: + return "bridge"; case Move: return "move"; case PassBy: @@ -340,6 +343,7 @@ const inline static std::unordered_map {"teleportation", OpType::Teleportation}, {"classic_controlled", OpType::ClassicControlled}, {"compound", OpType::Compound}, + {"bridge", OpType::Bridge}, {"move", OpType::Move}, {"pass_by", OpType::PassBy}, {"aod_activate", OpType::AodActivate}, diff --git a/src/ir/QuantumComputation.cpp b/src/ir/QuantumComputation.cpp index d7d09c23a3..d6e822af74 100644 --- a/src/ir/QuantumComputation.cpp +++ b/src/ir/QuantumComputation.cpp @@ -1816,6 +1816,11 @@ void QuantumComputation::measureAll(const bool addBits) { } } +void QuantumComputation::bridge(const Targets& targets) { + checkQubitRange(targets); + emplace_back(targets, Bridge); +} + void QuantumComputation::reset(const Qubit target) { checkQubitRange(target); emplace_back(std::vector{target}, Reset); From b3735bd2c10692205da24a547f8cdc66365b09ae Mon Sep 17 00:00:00 2001 From: Ludwig Schmid Date: Thu, 23 Jan 2025 10:36:03 +0100 Subject: [PATCH 07/21] =?UTF-8?q?=E2=9C=A8=20Added=20qasm=20output=20for?= =?UTF-8?q?=20bridge=20gate.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ir/operations/StandardOperation.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ir/operations/StandardOperation.cpp b/src/ir/operations/StandardOperation.cpp index df588b00a6..d2501c849d 100644 --- a/src/ir/operations/StandardOperation.cpp +++ b/src/ir/operations/StandardOperation.cpp @@ -422,6 +422,9 @@ void StandardOperation::dumpGateType(std::ostream& of, std::ostringstream& op, case iSWAPdg: op << "iswapdg"; break; + case Bridge: + op << "bridge"; + break; case Move: op << "move"; break; From ae59dce06737b1befcfa14d35c6a3c63d8676809 Mon Sep 17 00:00:00 2001 From: Ludwig Schmid Date: Mon, 3 Feb 2025 14:32:40 +0100 Subject: [PATCH 08/21] =?UTF-8?q?=F0=9F=90=9B=20Removed=20underbar=20from?= =?UTF-8?q?=20passBy=20string?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/mqt-core/ir/operations/OpType.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/mqt-core/ir/operations/OpType.hpp b/include/mqt-core/ir/operations/OpType.hpp index d3d10a0891..0d0bf9b186 100644 --- a/include/mqt-core/ir/operations/OpType.hpp +++ b/include/mqt-core/ir/operations/OpType.hpp @@ -170,7 +170,7 @@ inline std::string toString(const OpType& opType) { case Move: return "move"; case PassBy: - return "pass_by"; + return "passby"; case AodActivate: return "aod_activate"; case AodDeactivate: @@ -345,7 +345,7 @@ const inline static std::unordered_map {"compound", OpType::Compound}, {"bridge", OpType::Bridge}, {"move", OpType::Move}, - {"pass_by", OpType::PassBy}, + {"passby", OpType::PassBy}, {"aod_activate", OpType::AodActivate}, {"aod_deactivate", OpType::AodDeactivate}, {"aod_move", OpType::AodMove}, From fdf59c54f7eae3bc2eb72bd6ad7667d98ffbc687 Mon Sep 17 00:00:00 2001 From: Ludwig Schmid Date: Tue, 4 Feb 2025 16:22:13 +0100 Subject: [PATCH 09/21] =?UTF-8?q?=F0=9F=94=A5=20removed=20again=20passby?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/mqt-core/ir/QuantumComputation.hpp | 1 - include/mqt-core/ir/operations/OpType.hpp | 4 ---- src/ir/QuantumComputation.cpp | 1 - src/ir/operations/StandardOperation.cpp | 3 --- 4 files changed, 9 deletions(-) diff --git a/include/mqt-core/ir/QuantumComputation.hpp b/include/mqt-core/ir/QuantumComputation.hpp index 466622ce32..c57ae27c3c 100644 --- a/include/mqt-core/ir/QuantumComputation.hpp +++ b/include/mqt-core/ir/QuantumComputation.hpp @@ -296,7 +296,6 @@ class QuantumComputation { DECLARE_TWO_TARGET_OPERATION(peres) DECLARE_TWO_TARGET_OPERATION(peresdg) DECLARE_TWO_TARGET_OPERATION(move) - DECLARE_TWO_TARGET_OPERATION(passby) #undef DECLARE_TWO_TARGET_OPERATION diff --git a/include/mqt-core/ir/operations/OpType.hpp b/include/mqt-core/ir/operations/OpType.hpp index 0d0bf9b186..d8295a5ebf 100644 --- a/include/mqt-core/ir/operations/OpType.hpp +++ b/include/mqt-core/ir/operations/OpType.hpp @@ -71,7 +71,6 @@ enum OpType : std::uint8_t { // Neutral atom shuttling operations Bridge, Move, - PassBy, AodActivate, AodDeactivate, AodMove, @@ -169,8 +168,6 @@ inline std::string toString(const OpType& opType) { return "bridge"; case Move: return "move"; - case PassBy: - return "passby"; case AodActivate: return "aod_activate"; case AodDeactivate: @@ -345,7 +342,6 @@ const inline static std::unordered_map {"compound", OpType::Compound}, {"bridge", OpType::Bridge}, {"move", OpType::Move}, - {"passby", OpType::PassBy}, {"aod_activate", OpType::AodActivate}, {"aod_deactivate", OpType::AodDeactivate}, {"aod_move", OpType::AodMove}, diff --git a/src/ir/QuantumComputation.cpp b/src/ir/QuantumComputation.cpp index d6e822af74..65c12c0557 100644 --- a/src/ir/QuantumComputation.cpp +++ b/src/ir/QuantumComputation.cpp @@ -1685,7 +1685,6 @@ DEFINE_TWO_TARGET_OPERATION(iswapdg) DEFINE_TWO_TARGET_OPERATION(peres) DEFINE_TWO_TARGET_OPERATION(peresdg) DEFINE_TWO_TARGET_OPERATION(move) -DEFINE_TWO_TARGET_OPERATION(passby) #undef DEFINE_TWO_TARGET_OPERATION diff --git a/src/ir/operations/StandardOperation.cpp b/src/ir/operations/StandardOperation.cpp index d2501c849d..9ed0502488 100644 --- a/src/ir/operations/StandardOperation.cpp +++ b/src/ir/operations/StandardOperation.cpp @@ -428,9 +428,6 @@ void StandardOperation::dumpGateType(std::ostream& of, std::ostringstream& op, case Move: op << "move"; break; - case PassBy: - op << "pass_by"; - break; case Peres: of << op.str() << "cx"; for (const auto& c : controls) { From 3dd3edc1511b97ae2102008a9af34712b7eb69d9 Mon Sep 17 00:00:00 2001 From: Ludwig Schmid Date: Tue, 4 Feb 2025 21:49:15 +0100 Subject: [PATCH 10/21] =?UTF-8?q?=E2=9C=A8=20Added=20getEuclideanDistanceF?= =?UTF-8?q?p=20method=20to=20calculate=20Euclidean=20distance=20as=20float?= =?UTF-8?q?ing=20point?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/mqt-core/na/NADefinitions.hpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/include/mqt-core/na/NADefinitions.hpp b/include/mqt-core/na/NADefinitions.hpp index a9d181de39..288f474be4 100644 --- a/include/mqt-core/na/NADefinitions.hpp +++ b/include/mqt-core/na/NADefinitions.hpp @@ -55,7 +55,11 @@ struct Point { const auto delta = *this - c; return delta.length(); } - + [[maybe_unused]] [[nodiscard]] qc::fp + getEuclideanDistanceFp(const Point& c) const { + const auto delta = *this - c; + return std::sqrt(delta.x * delta.x + delta.y * delta.y); + } [[maybe_unused]] [[nodiscard]] std::int64_t getManhattanDistanceX(const Point& c) const { if (x > c.x) { From 4c499ad80f1d09080d59333d3c5132a1db16e6e8 Mon Sep 17 00:00:00 2001 From: Ludwig Schmid Date: Wed, 5 Feb 2025 09:35:38 +0100 Subject: [PATCH 11/21] =?UTF-8?q?=F0=9F=90=9B=20Fixed=20aod=20qasm=20outpu?= =?UTF-8?q?t?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ir/operations/AodOperation.cpp | 52 ++++++++++++++++++++++-------- 1 file changed, 38 insertions(+), 14 deletions(-) diff --git a/src/ir/operations/AodOperation.cpp b/src/ir/operations/AodOperation.cpp index 04ed6824f7..6739fc6c32 100644 --- a/src/ir/operations/AodOperation.cpp +++ b/src/ir/operations/AodOperation.cpp @@ -40,6 +40,7 @@ std::string SingleOperation::toQASMString() const { ss << static_cast(dir) << ", " << start << ", " << end << "; "; return ss.str(); } + std::vector AodOperation::convertToDimension(const std::vector& dirs) { std::vector dirsEnum(dirs.size()); @@ -100,6 +101,7 @@ std::vector AodOperation::getEnds(const Dimension dir) const { } return ends; } + std::vector AodOperation::getStarts(const Dimension dir) const { std::vector starts; for (const auto& op : operations) { @@ -109,6 +111,7 @@ std::vector AodOperation::getStarts(const Dimension dir) const { } return starts; } + qc::fp AodOperation::getMaxDistance(const Dimension dir) const { const auto distances = getDistances(dir); if (distances.empty()) { @@ -116,6 +119,7 @@ qc::fp AodOperation::getMaxDistance(const Dimension dir) const { } return *std::max_element(distances.begin(), distances.end()); } + std::vector AodOperation::getDistances(const Dimension dir) const { std::vector params; for (const auto& op : operations) { @@ -125,26 +129,47 @@ std::vector AodOperation::getDistances(const Dimension dir) const { } return params; } + void AodOperation::dumpOpenQASM(std::ostream& of, const qc::RegisterNames& qreg, [[maybe_unused]] const qc::RegisterNames& creg, const size_t indent, bool /*openQASM3*/) const { - of << std::setprecision(std::numeric_limits::digits10); - of << std::string(indent * qc::OUTPUT_INDENT_SIZE, ' '); - of << name; - // write AOD operations - of << " ("; + std::ostringstream oss; + oss << std::setprecision(std::numeric_limits::digits10); + + // Add indentation and operation name + oss << std::string(indent * qc::OUTPUT_INDENT_SIZE, ' ') << name; + + // Write AOD operations + oss << " ("; for (const auto& op : operations) { - of << op.toQASMString(); + oss << op.toQASMString(); + } + + // Remove the last "; " if present + std::string content = oss.str(); + const std::string semicolon = "; "; + if (content.size() >= semicolon.size() && + content.compare(content.size() - semicolon.size(), semicolon.size(), + semicolon) == 0) { + content.erase(content.size() - semicolon.size()); } - // remove last semicolon - of.seekp(-1, std::ios_base::end); - of << ")"; - // write qubit start + + content += ")"; + + // Write qubit start for (const auto& qubit : targets) { - of << " " << qreg[qubit].second << ","; + content += " " + qreg[qubit].second + ","; + } + + // Remove the last comma if present + if (!content.empty() && content.back() == ',') { + content.pop_back(); } - of.seekp(-1, std::ios_base::end); - of << ";\n"; + + content += ";\n"; + + // Write final content to the provided ostream + of << content; } void AodOperation::invert() { @@ -158,5 +183,4 @@ void AodOperation::invert() { type = qc::OpType::AodActivate; } } - } // namespace na From b65026b5dc1b8b038be2a0b40cf3dfa90aaec651 Mon Sep 17 00:00:00 2001 From: Ludwig Schmid Date: Thu, 18 Sep 2025 19:00:52 +0200 Subject: [PATCH 12/21] =?UTF-8?q?=F0=9F=90=9B=20Fixed=20typo=20in=20op=20t?= =?UTF-8?q?ype=20number?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/mqt-core/ir/operations/OpType.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/mqt-core/ir/operations/OpType.inc b/include/mqt-core/ir/operations/OpType.inc index 3b869126ba..cf1bd0ddbd 100644 --- a/include/mqt-core/ir/operations/OpType.inc +++ b/include/mqt-core/ir/operations/OpType.inc @@ -64,7 +64,7 @@ HANDLE_OP_TYPE(36, MultiAFalse, 0, "multi_a_false") // Neutral atom shuttling operations HANDLE_OP_TYPE(37, Move, 0, "move") -HANDLE_OP_TYPE(87, Bridge, 0, "bridge") +HANDLE_OP_TYPE(38, Bridge, 0, "bridge") HANDLE_OP_TYPE(39, AodActivate, 0, "aod_activate") HANDLE_OP_TYPE(40, AodDeactivate, 0, "aod_deactivate") HANDLE_OP_TYPE(41, AodMove, 0, "aod_move") From 3df8ebe6a9e7ceef3ae36972eb0fd669cae530fe Mon Sep 17 00:00:00 2001 From: Ludwig Schmid Date: Thu, 18 Sep 2025 19:02:47 +0200 Subject: [PATCH 13/21] =?UTF-8?q?=F0=9F=90=9B=20Fixed=20typo=20in=20qasm?= =?UTF-8?q?=20output?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ir/operations/AodOperation.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ir/operations/AodOperation.cpp b/src/ir/operations/AodOperation.cpp index 83cd1a8db4..c88c1aa4de 100644 --- a/src/ir/operations/AodOperation.cpp +++ b/src/ir/operations/AodOperation.cpp @@ -133,14 +133,14 @@ std::vector AodOperation::getDistances(const Dimension dir) const { } void AodOperation::dumpOpenQASM( - std::ostream& of, const qc : qc::QubitIndexToRegisterMap& qubitMap, - [[maybe_unused]] constqc::BitIndexToRegisterMap& bitMap, + std::ostream& of, const qc::QubitIndexToRegisterMap& qubitMap, + [[maybe_unused]] const qc::BitIndexToRegisterMap& bitMap, const size_t indent, bool /*openQASM3*/) const { std::ostringstream oss; oss << std::setprecision(std::numeric_limits::digits10); // Add indentation and operation name - oss << std::string(indent * qc::OUTPUT_INDENT_SIZE, ' ') << name; + oss << std::string(indent * OUTPUT_INDENT_SIZE, ' ') << name; // Write AOD operations oss << " ("; From 061c377aa9e565e620798bfd0882ef2c4f2d2da3 Mon Sep 17 00:00:00 2001 From: Ludwig Schmid Date: Wed, 5 Nov 2025 13:48:30 +0100 Subject: [PATCH 14/21] =?UTF-8?q?=F0=9F=90=9B=20Fixed=20double=20assigned?= =?UTF-8?q?=20type=20values?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/mqt-core/ir/operations/OpType.inc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/mqt-core/ir/operations/OpType.inc b/include/mqt-core/ir/operations/OpType.inc index dbe9173cb0..a3d181e186 100644 --- a/include/mqt-core/ir/operations/OpType.inc +++ b/include/mqt-core/ir/operations/OpType.inc @@ -68,9 +68,9 @@ HANDLE_OP_TYPE(37, Move, 0, "move") HANDLE_OP_TYPE(38, Bridge, 0, "bridge") HANDLE_OP_TYPE(39, AodActivate, 0, "aod_activate") HANDLE_OP_TYPE(40, AodDeactivate, 0, "aod_deactivate") -HANDLE_OP_TYPE(41, AodMove, 0, "aod_move") +HANDLE_OP_TYPE(42, AodMove, 0, "aod_move") -LAST_OP_TYPE(42) +LAST_OP_TYPE(43) #undef OpTypeInv From 1e1476cf7914468587932f35e3353eefa24801e4 Mon Sep 17 00:00:00 2001 From: Ludwig Schmid Date: Wed, 5 Nov 2025 14:16:10 +0100 Subject: [PATCH 15/21] =?UTF-8?q?=E2=9C=85=20=20Fixed=20wrong=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/ir/test_operation.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/ir/test_operation.cpp b/test/ir/test_operation.cpp index fb46850d38..f1c99a5dc7 100644 --- a/test/ir/test_operation.cpp +++ b/test/ir/test_operation.cpp @@ -309,7 +309,7 @@ TEST(AodOperation, Qasm) { qubitToReg.try_emplace(1, qreg, qreg.toString(1)); move.dumpOpenQASM(ss, qubitToReg, {}, 0, false); - EXPECT_EQ(ss.str(), "aod_move (0, 0, 1; 1, 1, 3;) q[0], q[1];\n"); + EXPECT_EQ(ss.str(), "aod_move (0, 0, 1; 1, 1, 3) q[0], q[1];\n"); } TEST(AodOperation, Constructors) { From 869f0b4feb5fdced769180d8a504eb02d6f80129 Mon Sep 17 00:00:00 2001 From: Ludwig Schmid Date: Wed, 5 Nov 2025 14:41:36 +0100 Subject: [PATCH 16/21] =?UTF-8?q?=E2=9C=85=20added=20test=20to=20cover=20a?= =?UTF-8?q?ll=20bridge=20and=20move?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/ir/test_operation.cpp | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/test/ir/test_operation.cpp b/test/ir/test_operation.cpp index f1c99a5dc7..add3397256 100644 --- a/test/ir/test_operation.cpp +++ b/test/ir/test_operation.cpp @@ -257,6 +257,34 @@ TEST(StandardOperation, Move) { const qc::StandardOperation moveOp({0, 1}, qc::OpType::Move); EXPECT_EQ(moveOp.getTargets().size(), 2); EXPECT_EQ(moveOp.getNqubits(), 2); + + // QASM dump verification + std::stringstream ss; + qc::QuantumRegister qreg(0, 2, "q"); + qc::QubitIndexToRegisterMap qubitToReg{}; + qubitToReg.try_emplace(0, qreg, qreg.toString(0)); + qubitToReg.try_emplace(1, qreg, qreg.toString(1)); + moveOp.dumpOpenQASM(ss, qubitToReg, {}, 0, false); + EXPECT_EQ(ss.str(), "move q[0], q[1];\n"); +} + +TEST(StandardOperation, Bridge) { + const qc::StandardOperation bridgeOp({0, 1, 2}, qc::OpType::Bridge); + EXPECT_EQ(bridgeOp.getTargets().size(), 3); + EXPECT_EQ(bridgeOp.getNqubits(), 3); + + // QASM dump verification + std::stringstream ss; + qc::QuantumRegister qreg(0, 3, "q"); + qc::QubitIndexToRegisterMap qubitToReg{}; + qubitToReg.try_emplace(0, qreg, qreg.toString(0)); + qubitToReg.try_emplace(1, qreg, qreg.toString(1)); + qubitToReg.try_emplace(2, qreg, qreg.toString(2)); + bridgeOp.dumpOpenQASM(ss, qubitToReg, {}, 0, false); + EXPECT_EQ(ss.str(), "bridge q[0], q[1], q[2];\n"); + + qc::QuantumComputation qc(3); + EXPECT_NO_THROW(qc.bridge({0, 1, 2})); } TEST(AodOperation, Activate) { From 59efb3754a6c7316e26f154a73154ae951f36b55 Mon Sep 17 00:00:00 2001 From: Ludwig Schmid Date: Wed, 5 Nov 2025 14:45:15 +0100 Subject: [PATCH 17/21] =?UTF-8?q?=F0=9F=9A=A8=20Fixed=20linter=20warnings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ir/operations/AodOperation.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/ir/operations/AodOperation.cpp b/src/ir/operations/AodOperation.cpp index c88c1aa4de..1527aa786f 100644 --- a/src/ir/operations/AodOperation.cpp +++ b/src/ir/operations/AodOperation.cpp @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include @@ -151,9 +150,7 @@ void AodOperation::dumpOpenQASM( // Remove the last "; " if present std::string content = oss.str(); const std::string semicolon = "; "; - if (content.size() >= semicolon.size() && - content.compare(content.size() - semicolon.size(), semicolon.size(), - semicolon) == 0) { + if (content.size() >= semicolon.size() && content.ends_with(semicolon)) { content.erase(content.size() - semicolon.size()); } From bb69232b8f58c618b224ff2db1f3f98e72b7ecf6 Mon Sep 17 00:00:00 2001 From: Ludwig Schmid Date: Wed, 5 Nov 2025 14:55:25 +0100 Subject: [PATCH 18/21] =?UTF-8?q?=F0=9F=8E=A8=20improved=20qasm=20dump=20f?= =?UTF-8?q?or=20aod=20operation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ir/operations/AodOperation.cpp | 46 +++++++++++------------------- 1 file changed, 17 insertions(+), 29 deletions(-) diff --git a/src/ir/operations/AodOperation.cpp b/src/ir/operations/AodOperation.cpp index 1527aa786f..8b3a0f460c 100644 --- a/src/ir/operations/AodOperation.cpp +++ b/src/ir/operations/AodOperation.cpp @@ -135,41 +135,29 @@ void AodOperation::dumpOpenQASM( std::ostream& of, const qc::QubitIndexToRegisterMap& qubitMap, [[maybe_unused]] const qc::BitIndexToRegisterMap& bitMap, const size_t indent, bool /*openQASM3*/) const { - std::ostringstream oss; - oss << std::setprecision(std::numeric_limits::digits10); + of << std::setprecision(std::numeric_limits::digits10); + of << std::string(indent * OUTPUT_INDENT_SIZE, ' ') << name << " ("; - // Add indentation and operation name - oss << std::string(indent * OUTPUT_INDENT_SIZE, ' ') << name; - - // Write AOD operations - oss << " ("; + // Write AOD operations with separator logic + bool first = true; for (const auto& op : operations) { - oss << op.toQASMString(); - } - - // Remove the last "; " if present - std::string content = oss.str(); - const std::string semicolon = "; "; - if (content.size() >= semicolon.size() && content.ends_with(semicolon)) { - content.erase(content.size() - semicolon.size()); + if (!first) { + of << "; "; + } + first = false; + of << static_cast(op.dir) << ", " << op.start << ", " + << op.end; } + of << ")"; - content += ")"; - - // Write qubit start + // Write qubits with separator logic for (const auto& qubit : targets) { - content += " " + qubitMap.at(qubit).second + ","; - } - - // Remove the last comma if present - if (!content.empty() && content.back() == ',') { - content.pop_back(); + of << " " << qubitMap.at(qubit).second; + if (&qubit != &targets.back()) { + of << ","; + } } - - content += ";\n"; - - // Write final content to the provided ostream - of << content; + of << ";\n"; } void AodOperation::invert() { From 9428d93bcf1715921627141a797fde053bbe5ee5 Mon Sep 17 00:00:00 2001 From: Ludwig Schmid <117631861+lsschmid@users.noreply.github.com> Date: Mon, 10 Nov 2025 09:44:46 +0100 Subject: [PATCH 19/21] Revert enum values to previous definition. Co-authored-by: Lukas Burgholzer Signed-off-by: Ludwig Schmid <117631861+lsschmid@users.noreply.github.com> --- include/mqt-core/ir/operations/OpType.inc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/mqt-core/ir/operations/OpType.inc b/include/mqt-core/ir/operations/OpType.inc index a3d181e186..a4099ca02b 100644 --- a/include/mqt-core/ir/operations/OpType.inc +++ b/include/mqt-core/ir/operations/OpType.inc @@ -65,10 +65,10 @@ HANDLE_OP_TYPE(36, MultiAFalse, 0, "multi_a_false") // Neutral atom shuttling operations HANDLE_OP_TYPE(37, Move, 0, "move") -HANDLE_OP_TYPE(38, Bridge, 0, "bridge") -HANDLE_OP_TYPE(39, AodActivate, 0, "aod_activate") -HANDLE_OP_TYPE(40, AodDeactivate, 0, "aod_deactivate") -HANDLE_OP_TYPE(42, AodMove, 0, "aod_move") +HANDLE_OP_TYPE(42, Bridge, 0, "bridge") +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(43) From 834b3dfcd64ff35736611e1e9c22bf07f2bde38e Mon Sep 17 00:00:00 2001 From: Ludwig Schmid Date: Mon, 10 Nov 2025 10:25:07 +0100 Subject: [PATCH 20/21] =?UTF-8?q?=F0=9F=8E=A8=20reworked=20qasm=20output?= =?UTF-8?q?=20to=20avoid=20pointer=20comparison.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ir/operations/AodOperation.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/ir/operations/AodOperation.cpp b/src/ir/operations/AodOperation.cpp index 8b3a0f460c..190e373607 100644 --- a/src/ir/operations/AodOperation.cpp +++ b/src/ir/operations/AodOperation.cpp @@ -151,11 +151,13 @@ void AodOperation::dumpOpenQASM( of << ")"; // Write qubits with separator logic + bool firstQubit = true; for (const auto& qubit : targets) { - of << " " << qubitMap.at(qubit).second; - if (&qubit != &targets.back()) { + if (!firstQubit) { of << ","; } + firstQubit = false; + of << " " << qubitMap.at(qubit).second; } of << ";\n"; } From bbceb099ea33c799488b9ff75c7a0c73bfda6bc0 Mon Sep 17 00:00:00 2001 From: Ludwig Schmid Date: Mon, 10 Nov 2025 10:40:28 +0100 Subject: [PATCH 21/21] =?UTF-8?q?=F0=9F=93=9D=20updated=20CHANGELOG.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d4f47d924c..36d73692b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,10 @@ This project adheres to [Semantic Versioning], with the exception that minor rel ## [Unreleased] +### Added + +- ✨ Add support for bridge gates for the neutral atom hybrid mapper ([#1293]) ([**@lsschmid**]) + ## [3.3.2] - 2025-11-04 ### Added @@ -227,6 +231,7 @@ _📚 Refer to the [GitHub Release Notes](https://github.com/munich-quantum-tool +[#1293]: https://github.com/munich-quantum-toolkit/core/pull/1293 [#1287]: https://github.com/munich-quantum-toolkit/core/pull/1287 [#1283]: https://github.com/munich-quantum-toolkit/core/pull/1283 [#1279]: https://github.com/munich-quantum-toolkit/core/pull/1279 @@ -351,6 +356,7 @@ _📚 Refer to the [GitHub Release Notes](https://github.com/munich-quantum-tool [**@lavanya-m-k**]: https://github.com/lavanya-m-k [**@taminob**]: https://github.com/taminob [**@jannikpflieger**]: https://github.com/jannikpflieger +[**@lsschmid**]: https://github.com/lsschmid