mqt-core 3.2.0__cp312-cp312-win_amd64.whl → 3.3.0__cp312-cp312-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of mqt-core might be problematic. Click here for more details.

Files changed (249) hide show
  1. mqt/core/__init__.py +3 -3
  2. mqt/core/_commands.py +2 -2
  3. mqt/core/_version.py +16 -3
  4. mqt/core/bin/mqt-core-algorithms.dll +0 -0
  5. mqt/core/bin/mqt-core-circuit-optimizer.dll +0 -0
  6. mqt/core/bin/mqt-core-dd.dll +0 -0
  7. mqt/core/bin/mqt-core-ds.dll +0 -0
  8. mqt/core/bin/mqt-core-fomac.dll +0 -0
  9. mqt/core/bin/mqt-core-ir.dll +0 -0
  10. mqt/core/bin/mqt-core-na-fomac.dll +0 -0
  11. mqt/core/bin/mqt-core-na.dll +0 -0
  12. mqt/core/bin/mqt-core-qasm.dll +0 -0
  13. mqt/core/bin/mqt-core-qdmi-driver.dll +0 -0
  14. mqt/core/bin/mqt-core-qdmi-na-device.dll +0 -0
  15. mqt/core/bin/mqt-core-zx.dll +0 -0
  16. mqt/core/dd.cp312-win_amd64.pyd +0 -0
  17. mqt/core/dd.pyi +5 -7
  18. mqt/core/fomac.cp312-win_amd64.pyd +0 -0
  19. mqt/core/fomac.pyi +125 -0
  20. mqt/core/include/mqt-core/circuit_optimizer/CircuitOptimizer.hpp +13 -0
  21. mqt/core/include/mqt-core/datastructures/DirectedGraph.hpp +1 -1
  22. mqt/core/include/mqt-core/datastructures/UndirectedGraph.hpp +1 -1
  23. mqt/core/include/mqt-core/dd/CachedEdge.hpp +7 -0
  24. mqt/core/include/mqt-core/dd/Operations.hpp +12 -14
  25. mqt/core/include/mqt-core/dd/Package.hpp +1 -1
  26. mqt/core/include/mqt-core/fomac/FoMaC.hpp +568 -0
  27. mqt/core/include/mqt-core/ir/QuantumComputation.hpp +29 -28
  28. mqt/core/include/mqt-core/ir/operations/CompoundOperation.hpp +2 -0
  29. mqt/core/include/mqt-core/ir/operations/IfElseOperation.hpp +169 -0
  30. mqt/core/include/mqt-core/ir/operations/OpType.hpp +3 -0
  31. mqt/core/include/mqt-core/ir/operations/OpType.inc +2 -2
  32. mqt/core/include/mqt-core/ir/operations/Operation.hpp +3 -1
  33. mqt/core/include/mqt-core/ir/operations/StandardOperation.hpp +2 -0
  34. mqt/core/include/mqt-core/mqt_na_qdmi/device.h +602 -0
  35. mqt/core/include/mqt-core/mqt_na_qdmi/types.h +78 -0
  36. mqt/core/include/mqt-core/na/device/Device.hpp +410 -0
  37. mqt/core/include/mqt-core/na/device/DeviceMemberInitializers.hpp +724 -0
  38. mqt/core/include/mqt-core/na/device/Generator.hpp +447 -0
  39. mqt/core/include/mqt-core/na/fomac/Device.hpp +169 -0
  40. mqt/core/include/mqt-core/qdmi/Driver.hpp +431 -0
  41. mqt/core/include/nlohmann/adl_serializer.hpp +55 -0
  42. mqt/core/include/nlohmann/byte_container_with_subtype.hpp +103 -0
  43. mqt/core/include/nlohmann/detail/abi_macros.hpp +111 -0
  44. mqt/core/include/nlohmann/detail/conversions/from_json.hpp +577 -0
  45. mqt/core/include/nlohmann/detail/conversions/to_chars.hpp +1118 -0
  46. mqt/core/include/nlohmann/detail/conversions/to_json.hpp +479 -0
  47. mqt/core/include/nlohmann/detail/exceptions.hpp +291 -0
  48. mqt/core/include/nlohmann/detail/hash.hpp +129 -0
  49. mqt/core/include/nlohmann/detail/input/binary_reader.hpp +3068 -0
  50. mqt/core/include/nlohmann/detail/input/input_adapters.hpp +549 -0
  51. mqt/core/include/nlohmann/detail/input/json_sax.hpp +986 -0
  52. mqt/core/include/nlohmann/detail/input/lexer.hpp +1643 -0
  53. mqt/core/include/nlohmann/detail/input/parser.hpp +519 -0
  54. mqt/core/include/nlohmann/detail/input/position_t.hpp +37 -0
  55. mqt/core/include/nlohmann/detail/iterators/internal_iterator.hpp +35 -0
  56. mqt/core/include/nlohmann/detail/iterators/iter_impl.hpp +760 -0
  57. mqt/core/include/nlohmann/detail/iterators/iteration_proxy.hpp +235 -0
  58. mqt/core/include/nlohmann/detail/iterators/iterator_traits.hpp +61 -0
  59. mqt/core/include/nlohmann/detail/iterators/json_reverse_iterator.hpp +130 -0
  60. mqt/core/include/nlohmann/detail/iterators/primitive_iterator.hpp +132 -0
  61. mqt/core/include/nlohmann/detail/json_custom_base_class.hpp +39 -0
  62. mqt/core/include/nlohmann/detail/json_pointer.hpp +988 -0
  63. mqt/core/include/nlohmann/detail/json_ref.hpp +78 -0
  64. mqt/core/include/nlohmann/detail/macro_scope.hpp +595 -0
  65. mqt/core/include/nlohmann/detail/macro_unscope.hpp +46 -0
  66. mqt/core/include/nlohmann/detail/meta/call_std/begin.hpp +17 -0
  67. mqt/core/include/nlohmann/detail/meta/call_std/end.hpp +17 -0
  68. mqt/core/include/nlohmann/detail/meta/cpp_future.hpp +171 -0
  69. mqt/core/include/nlohmann/detail/meta/detected.hpp +70 -0
  70. mqt/core/include/nlohmann/detail/meta/identity_tag.hpp +21 -0
  71. mqt/core/include/nlohmann/detail/meta/is_sax.hpp +159 -0
  72. mqt/core/include/nlohmann/detail/meta/std_fs.hpp +29 -0
  73. mqt/core/include/nlohmann/detail/meta/type_traits.hpp +795 -0
  74. mqt/core/include/nlohmann/detail/meta/void_t.hpp +24 -0
  75. mqt/core/include/nlohmann/detail/output/binary_writer.hpp +1850 -0
  76. mqt/core/include/nlohmann/detail/output/output_adapters.hpp +147 -0
  77. mqt/core/include/nlohmann/detail/output/serializer.hpp +988 -0
  78. mqt/core/include/nlohmann/detail/string_concat.hpp +146 -0
  79. mqt/core/include/nlohmann/detail/string_escape.hpp +72 -0
  80. mqt/core/include/nlohmann/detail/string_utils.hpp +37 -0
  81. mqt/core/include/nlohmann/detail/value_t.hpp +118 -0
  82. mqt/core/include/nlohmann/json.hpp +5306 -0
  83. mqt/core/include/nlohmann/json_fwd.hpp +75 -0
  84. mqt/core/include/nlohmann/ordered_map.hpp +359 -0
  85. mqt/core/include/nlohmann/thirdparty/hedley/hedley.hpp +2045 -0
  86. mqt/core/include/nlohmann/thirdparty/hedley/hedley_undef.hpp +158 -0
  87. mqt/core/include/qdmi/qdmi/client.h +990 -0
  88. mqt/core/include/qdmi/qdmi/constants.h +1139 -0
  89. mqt/core/include/qdmi/qdmi/device.h +602 -0
  90. mqt/core/include/qdmi/qdmi/types.h +78 -0
  91. mqt/core/include/spdlog/async.h +99 -0
  92. mqt/core/include/spdlog/async_logger-inl.h +84 -0
  93. mqt/core/include/spdlog/async_logger.h +74 -0
  94. mqt/core/include/spdlog/cfg/argv.h +40 -0
  95. mqt/core/include/spdlog/cfg/env.h +36 -0
  96. mqt/core/include/spdlog/cfg/helpers-inl.h +107 -0
  97. mqt/core/include/spdlog/cfg/helpers.h +29 -0
  98. mqt/core/include/spdlog/common-inl.h +68 -0
  99. mqt/core/include/spdlog/common.h +406 -0
  100. mqt/core/include/spdlog/details/backtracer-inl.h +63 -0
  101. mqt/core/include/spdlog/details/backtracer.h +45 -0
  102. mqt/core/include/spdlog/details/circular_q.h +115 -0
  103. mqt/core/include/spdlog/details/console_globals.h +28 -0
  104. mqt/core/include/spdlog/details/file_helper-inl.h +153 -0
  105. mqt/core/include/spdlog/details/file_helper.h +61 -0
  106. mqt/core/include/spdlog/details/fmt_helper.h +141 -0
  107. mqt/core/include/spdlog/details/log_msg-inl.h +44 -0
  108. mqt/core/include/spdlog/details/log_msg.h +40 -0
  109. mqt/core/include/spdlog/details/log_msg_buffer-inl.h +54 -0
  110. mqt/core/include/spdlog/details/log_msg_buffer.h +32 -0
  111. mqt/core/include/spdlog/details/mpmc_blocking_q.h +177 -0
  112. mqt/core/include/spdlog/details/null_mutex.h +35 -0
  113. mqt/core/include/spdlog/details/os-inl.h +606 -0
  114. mqt/core/include/spdlog/details/os.h +127 -0
  115. mqt/core/include/spdlog/details/periodic_worker-inl.h +26 -0
  116. mqt/core/include/spdlog/details/periodic_worker.h +58 -0
  117. mqt/core/include/spdlog/details/registry-inl.h +270 -0
  118. mqt/core/include/spdlog/details/registry.h +131 -0
  119. mqt/core/include/spdlog/details/synchronous_factory.h +22 -0
  120. mqt/core/include/spdlog/details/tcp_client-windows.h +135 -0
  121. mqt/core/include/spdlog/details/tcp_client.h +127 -0
  122. mqt/core/include/spdlog/details/thread_pool-inl.h +126 -0
  123. mqt/core/include/spdlog/details/thread_pool.h +117 -0
  124. mqt/core/include/spdlog/details/udp_client-windows.h +98 -0
  125. mqt/core/include/spdlog/details/udp_client.h +81 -0
  126. mqt/core/include/spdlog/details/windows_include.h +11 -0
  127. mqt/core/include/spdlog/fmt/bin_to_hex.h +224 -0
  128. mqt/core/include/spdlog/fmt/bundled/args.h +220 -0
  129. mqt/core/include/spdlog/fmt/bundled/base.h +2989 -0
  130. mqt/core/include/spdlog/fmt/bundled/chrono.h +2330 -0
  131. mqt/core/include/spdlog/fmt/bundled/color.h +637 -0
  132. mqt/core/include/spdlog/fmt/bundled/compile.h +539 -0
  133. mqt/core/include/spdlog/fmt/bundled/core.h +5 -0
  134. mqt/core/include/spdlog/fmt/bundled/fmt.license.rst +27 -0
  135. mqt/core/include/spdlog/fmt/bundled/format-inl.h +1948 -0
  136. mqt/core/include/spdlog/fmt/bundled/format.h +4244 -0
  137. mqt/core/include/spdlog/fmt/bundled/os.h +427 -0
  138. mqt/core/include/spdlog/fmt/bundled/ostream.h +167 -0
  139. mqt/core/include/spdlog/fmt/bundled/printf.h +633 -0
  140. mqt/core/include/spdlog/fmt/bundled/ranges.h +850 -0
  141. mqt/core/include/spdlog/fmt/bundled/std.h +728 -0
  142. mqt/core/include/spdlog/fmt/bundled/xchar.h +369 -0
  143. mqt/core/include/spdlog/fmt/chrono.h +23 -0
  144. mqt/core/include/spdlog/fmt/compile.h +23 -0
  145. mqt/core/include/spdlog/fmt/fmt.h +30 -0
  146. mqt/core/include/spdlog/fmt/ostr.h +23 -0
  147. mqt/core/include/spdlog/fmt/ranges.h +23 -0
  148. mqt/core/include/spdlog/fmt/std.h +24 -0
  149. mqt/core/include/spdlog/fmt/xchar.h +23 -0
  150. mqt/core/include/spdlog/formatter.h +17 -0
  151. mqt/core/include/spdlog/fwd.h +18 -0
  152. mqt/core/include/spdlog/logger-inl.h +198 -0
  153. mqt/core/include/spdlog/logger.h +379 -0
  154. mqt/core/include/spdlog/mdc.h +52 -0
  155. mqt/core/include/spdlog/pattern_formatter-inl.h +1340 -0
  156. mqt/core/include/spdlog/pattern_formatter.h +118 -0
  157. mqt/core/include/spdlog/sinks/android_sink.h +137 -0
  158. mqt/core/include/spdlog/sinks/ansicolor_sink-inl.h +142 -0
  159. mqt/core/include/spdlog/sinks/ansicolor_sink.h +116 -0
  160. mqt/core/include/spdlog/sinks/base_sink-inl.h +59 -0
  161. mqt/core/include/spdlog/sinks/base_sink.h +51 -0
  162. mqt/core/include/spdlog/sinks/basic_file_sink-inl.h +48 -0
  163. mqt/core/include/spdlog/sinks/basic_file_sink.h +66 -0
  164. mqt/core/include/spdlog/sinks/callback_sink.h +56 -0
  165. mqt/core/include/spdlog/sinks/daily_file_sink.h +254 -0
  166. mqt/core/include/spdlog/sinks/dist_sink.h +81 -0
  167. mqt/core/include/spdlog/sinks/dup_filter_sink.h +91 -0
  168. mqt/core/include/spdlog/sinks/hourly_file_sink.h +193 -0
  169. mqt/core/include/spdlog/sinks/kafka_sink.h +119 -0
  170. mqt/core/include/spdlog/sinks/mongo_sink.h +108 -0
  171. mqt/core/include/spdlog/sinks/msvc_sink.h +68 -0
  172. mqt/core/include/spdlog/sinks/null_sink.h +41 -0
  173. mqt/core/include/spdlog/sinks/ostream_sink.h +43 -0
  174. mqt/core/include/spdlog/sinks/qt_sinks.h +304 -0
  175. mqt/core/include/spdlog/sinks/ringbuffer_sink.h +67 -0
  176. mqt/core/include/spdlog/sinks/rotating_file_sink-inl.h +179 -0
  177. mqt/core/include/spdlog/sinks/rotating_file_sink.h +93 -0
  178. mqt/core/include/spdlog/sinks/sink-inl.h +22 -0
  179. mqt/core/include/spdlog/sinks/sink.h +34 -0
  180. mqt/core/include/spdlog/sinks/stdout_color_sinks-inl.h +38 -0
  181. mqt/core/include/spdlog/sinks/stdout_color_sinks.h +49 -0
  182. mqt/core/include/spdlog/sinks/stdout_sinks-inl.h +127 -0
  183. mqt/core/include/spdlog/sinks/stdout_sinks.h +84 -0
  184. mqt/core/include/spdlog/sinks/syslog_sink.h +104 -0
  185. mqt/core/include/spdlog/sinks/systemd_sink.h +121 -0
  186. mqt/core/include/spdlog/sinks/tcp_sink.h +75 -0
  187. mqt/core/include/spdlog/sinks/udp_sink.h +69 -0
  188. mqt/core/include/spdlog/sinks/win_eventlog_sink.h +260 -0
  189. mqt/core/include/spdlog/sinks/wincolor_sink-inl.h +172 -0
  190. mqt/core/include/spdlog/sinks/wincolor_sink.h +82 -0
  191. mqt/core/include/spdlog/spdlog-inl.h +96 -0
  192. mqt/core/include/spdlog/spdlog.h +357 -0
  193. mqt/core/include/spdlog/stopwatch.h +66 -0
  194. mqt/core/include/spdlog/tweakme.h +148 -0
  195. mqt/core/include/spdlog/version.h +11 -0
  196. mqt/core/ir/__init__.pyi +83 -45
  197. mqt/core/ir/operations.pyi +40 -27
  198. mqt/core/ir.cp312-win_amd64.pyd +0 -0
  199. mqt/core/lib/cmake/spdlog/spdlogConfig.cmake +44 -0
  200. mqt/core/lib/cmake/spdlog/spdlogConfigTargets-release.cmake +19 -0
  201. mqt/core/lib/cmake/spdlog/spdlogConfigTargets.cmake +119 -0
  202. mqt/core/lib/cmake/spdlog/spdlogConfigVersion.cmake +65 -0
  203. mqt/core/lib/mqt-core-algorithms.lib +0 -0
  204. mqt/core/lib/mqt-core-circuit-optimizer.lib +0 -0
  205. mqt/core/lib/mqt-core-dd.lib +0 -0
  206. mqt/core/lib/mqt-core-ds.lib +0 -0
  207. mqt/core/lib/mqt-core-fomac.lib +0 -0
  208. mqt/core/lib/mqt-core-ir.lib +0 -0
  209. mqt/core/lib/mqt-core-na-fomac.lib +0 -0
  210. mqt/core/lib/mqt-core-na.lib +0 -0
  211. mqt/core/lib/mqt-core-qasm.lib +0 -0
  212. mqt/core/lib/mqt-core-qdmi-driver.lib +0 -0
  213. mqt/core/lib/mqt-core-qdmi-na-device-gen.lib +0 -0
  214. mqt/core/lib/mqt-core-qdmi-na-device.lib +0 -0
  215. mqt/core/lib/mqt-core-zx.lib +0 -0
  216. mqt/core/lib/pkgconfig/spdlog.pc +13 -0
  217. mqt/core/lib/spdlog.lib +0 -0
  218. mqt/core/na/__init__.py +12 -0
  219. mqt/core/na/fomac.cp312-win_amd64.pyd +0 -0
  220. mqt/core/na/fomac.pyi +117 -0
  221. mqt/core/nlohmann_json.natvis +278 -0
  222. mqt/core/plugins/qiskit/mqt_to_qiskit.py +75 -11
  223. mqt/core/plugins/qiskit/qiskit_to_mqt.py +108 -5
  224. mqt/core/share/cmake/mqt-core/AddMQTPythonBinding.cmake +3 -0
  225. mqt/core/share/cmake/mqt-core/Cache.cmake +17 -16
  226. mqt/core/share/cmake/mqt-core/PackageAddTest.cmake +6 -0
  227. mqt/core/share/cmake/mqt-core/StandardProjectSettings.cmake +1 -1
  228. mqt/core/share/cmake/mqt-core/mqt-core-config-version.cmake +3 -3
  229. mqt/core/share/cmake/mqt-core/mqt-core-config.cmake +3 -0
  230. mqt/core/share/cmake/mqt-core/mqt-core-targets-release.cmake +51 -0
  231. mqt/core/share/cmake/mqt-core/mqt-core-targets.cmake +124 -3
  232. mqt/core/share/cmake/nlohmann_json/nlohmann_jsonConfig.cmake +15 -0
  233. mqt/core/share/cmake/nlohmann_json/nlohmann_jsonConfigVersion.cmake +20 -0
  234. mqt/core/share/cmake/nlohmann_json/nlohmann_jsonTargets.cmake +110 -0
  235. mqt/core/share/cmake/qdmi/Cache.cmake +44 -0
  236. mqt/core/share/cmake/qdmi/PrefixHandling.cmake +78 -0
  237. mqt/core/share/cmake/qdmi/prefix_defs.txt +26 -0
  238. mqt/core/share/cmake/qdmi/qdmi-config-version.cmake +85 -0
  239. mqt/core/share/cmake/qdmi/qdmi-config.cmake +42 -0
  240. mqt/core/share/cmake/qdmi/qdmi-targets.cmake +129 -0
  241. mqt/core/share/pkgconfig/nlohmann_json.pc +7 -0
  242. mqt_core-3.3.0.dist-info/DELVEWHEEL +2 -0
  243. {mqt_core-3.2.0.dist-info → mqt_core-3.3.0.dist-info}/METADATA +74 -33
  244. {mqt_core-3.2.0.dist-info → mqt_core-3.3.0.dist-info}/RECORD +247 -53
  245. {mqt_core-3.2.0.dist-info → mqt_core-3.3.0.dist-info}/WHEEL +1 -1
  246. mqt/core/include/mqt-core/ir/operations/ClassicControlledOperation.hpp +0 -156
  247. mqt_core-3.2.0.dist-info/DELVEWHEEL +0 -2
  248. {mqt_core-3.2.0.dist-info → mqt_core-3.3.0.dist-info}/entry_points.txt +0 -0
  249. {mqt_core-3.2.0.dist-info → mqt_core-3.3.0.dist-info}/licenses/LICENSE.md +0 -0
@@ -0,0 +1,169 @@
1
+ /*
2
+ * Copyright (c) 2023 - 2025 Chair for Design Automation, TUM
3
+ * Copyright (c) 2025 Munich Quantum Software Company GmbH
4
+ * All rights reserved.
5
+ *
6
+ * SPDX-License-Identifier: MIT
7
+ *
8
+ * Licensed under the MIT License
9
+ */
10
+
11
+ #pragma once
12
+
13
+ #include "ir/Definitions.hpp"
14
+ #include "ir/Permutation.hpp"
15
+ #include "ir/Register.hpp"
16
+ #include "ir/operations/Operation.hpp"
17
+
18
+ #include <memory>
19
+ #include <optional>
20
+
21
+ namespace qc {
22
+
23
+ enum ComparisonKind : std::uint8_t {
24
+ Eq,
25
+ Neq,
26
+ Lt,
27
+ Leq,
28
+ Gt,
29
+ Geq,
30
+ };
31
+
32
+ ComparisonKind getInvertedComparisonKind(ComparisonKind kind);
33
+
34
+ std::string toString(const ComparisonKind& kind);
35
+
36
+ std::ostream& operator<<(std::ostream& os, const ComparisonKind& kind);
37
+
38
+ class IfElseOperation final : public Operation {
39
+ public:
40
+ IfElseOperation(std::unique_ptr<Operation>&& thenOp,
41
+ std::unique_ptr<Operation>&& elseOp,
42
+ const ClassicalRegister& controlRegister,
43
+ std::uint64_t expectedValue = 1U, ComparisonKind kind = Eq);
44
+
45
+ IfElseOperation(std::unique_ptr<Operation>&& thenOp,
46
+ std::unique_ptr<Operation>&& elseOp, Bit controlBit,
47
+ bool expectedValue = true, ComparisonKind kind = Eq);
48
+
49
+ IfElseOperation(const IfElseOperation& op);
50
+
51
+ IfElseOperation& operator=(const IfElseOperation& op);
52
+
53
+ [[nodiscard]] std::unique_ptr<Operation> clone() const override {
54
+ return std::make_unique<IfElseOperation>(*this);
55
+ }
56
+
57
+ void apply(const Permutation& permutation) override;
58
+
59
+ [[nodiscard]] bool isUnitary() const override { return false; }
60
+
61
+ [[nodiscard]] bool isNonUnitaryOperation() const override { return true; }
62
+
63
+ [[nodiscard]] bool isIfElseOperation() const noexcept override {
64
+ return true;
65
+ }
66
+
67
+ [[nodiscard]] bool isControlled() const override { return false; }
68
+
69
+ [[nodiscard]] auto getThenOp() const { return thenOp.get(); }
70
+
71
+ [[nodiscard]] auto getElseOp() const { return elseOp.get(); }
72
+
73
+ [[nodiscard]] const auto& getControlRegister() const noexcept {
74
+ return controlRegister;
75
+ }
76
+
77
+ [[nodiscard]] const auto& getControlBit() const noexcept {
78
+ return controlBit;
79
+ }
80
+
81
+ [[nodiscard]] auto getExpectedValueRegister() const noexcept {
82
+ return expectedValueRegister;
83
+ }
84
+
85
+ [[nodiscard]] bool getExpectedValueBit() const noexcept {
86
+ return expectedValueBit;
87
+ }
88
+
89
+ [[nodiscard]] auto getComparisonKind() const noexcept {
90
+ return comparisonKind;
91
+ }
92
+
93
+ [[nodiscard]] bool equals(const Operation& op, const Permutation& perm1,
94
+ const Permutation& perm2) const override;
95
+ [[nodiscard]] bool equals(const Operation& op) const override {
96
+ return equals(op, {}, {});
97
+ }
98
+
99
+ virtual std::ostream& print(std::ostream& os, const Permutation& permutation,
100
+ std::size_t prefixWidth,
101
+ std::size_t nqubits) const override;
102
+
103
+ void dumpOpenQASM(std::ostream& of, const QubitIndexToRegisterMap& qubitMap,
104
+ const BitIndexToRegisterMap& bitMap, std::size_t indent,
105
+ bool openQASM3) const override;
106
+
107
+ void invert() override {
108
+ throw std::runtime_error("An IfElseOperation cannot be inverted.");
109
+ }
110
+
111
+ // Override invalid Operation setters
112
+ void setTargets(const Targets&) override {
113
+ throw std::runtime_error("An IfElseOperation does not have a target.");
114
+ }
115
+
116
+ void setControls(const Controls&) override {
117
+ throw std::runtime_error("An IfElseOperation cannot be controlled.");
118
+ }
119
+ void addControl(Control) override {
120
+ throw std::runtime_error("An IfElseOperation cannot be controlled.");
121
+ }
122
+ void clearControls() override {
123
+ throw std::runtime_error("An IfElseOperation cannot be controlled.");
124
+ }
125
+ void removeControl(Control) override {
126
+ throw std::runtime_error("An IfElseOperation cannot be controlled.");
127
+ }
128
+ Controls::iterator removeControl(Controls::iterator) override {
129
+ throw std::runtime_error("An IfElseOperation cannot be controlled.");
130
+ }
131
+
132
+ void setGate(const OpType) override {
133
+ throw std::runtime_error(
134
+ "Cannot set operation type of an IfElseOperation.");
135
+ }
136
+
137
+ void setParameter(const std::vector<fp>&) override {
138
+ throw std::runtime_error("An IfElseOperation cannot be parameterized.");
139
+ }
140
+
141
+ private:
142
+ std::unique_ptr<Operation> thenOp;
143
+ std::unique_ptr<Operation> elseOp;
144
+ std::optional<ClassicalRegister> controlRegister;
145
+ std::optional<Bit> controlBit;
146
+ std::uint64_t expectedValueRegister = 1U;
147
+ bool expectedValueBit = true;
148
+ ComparisonKind comparisonKind = Eq;
149
+
150
+ /**
151
+ * @brief Canonicalizes the IfElseOperation
152
+ * @details Ensures if an else block is present, the then block is also
153
+ * present. If only the else block is present, it is moved to the then block
154
+ * and the else block is set to null with the condition inverted.
155
+ * Furthermore, non-equality constraints on single bits are converted to
156
+ * equality constraints with inverted expected value.
157
+ * Finally, if both then and else blocks are present, any equality constraint
158
+ * on a single bit with expected value false is converted to an equality
159
+ * constraint with expected value true with then and else blocks swapped.
160
+ */
161
+ void canonicalize();
162
+ };
163
+ } // namespace qc
164
+
165
+ namespace std {
166
+ template <> struct hash<qc::IfElseOperation> {
167
+ std::size_t operator()(qc::IfElseOperation const& op) const noexcept;
168
+ };
169
+ } // namespace std
@@ -66,6 +66,9 @@ std::string shortName(OpType opType);
66
66
  }
67
67
  }
68
68
 
69
+ /**
70
+ * @brief Checks if given OpType is a single qubit gate
71
+ */
69
72
  [[nodiscard]] constexpr bool isSingleQubitGate(const OpType type) {
70
73
  switch (type) {
71
74
  case I:
@@ -53,8 +53,8 @@ HANDLE_OP_TYPE(29, Compound, OpTypeNone, "compound")
53
53
  HANDLE_OP_TYPE(30, Measure, OpTypeNone, "measure")
54
54
  HANDLE_OP_TYPE(31, Reset, OpTypeNone, "reset")
55
55
 
56
- // Classically-controlled Operation
57
- HANDLE_OP_TYPE(32, ClassicControlled, OpTypeNone, "classic_controlled")
56
+ // Control flow operations
57
+ HANDLE_OP_TYPE(32, IfElse, OpTypeNone, "if_else")
58
58
 
59
59
  // Noise operations
60
60
  HANDLE_OP_TYPE(33, ATrue, 0, "a_true")
@@ -138,7 +138,7 @@ public:
138
138
 
139
139
  [[nodiscard]] virtual bool isNonUnitaryOperation() const { return false; }
140
140
 
141
- [[nodiscard]] virtual bool isClassicControlledOperation() const noexcept {
141
+ [[nodiscard]] virtual bool isIfElseOperation() const noexcept {
142
142
  return false;
143
143
  }
144
144
 
@@ -155,6 +155,8 @@ public:
155
155
 
156
156
  [[nodiscard]] virtual bool isControlled() const { return !controls.empty(); }
157
157
 
158
+ [[nodiscard]] virtual bool isClifford() const { return false; }
159
+
158
160
  /**
159
161
  * @brief Checks whether a gate is global.
160
162
  * @details A StandardOperation is global if it acts on all qubits.
@@ -82,6 +82,8 @@ public:
82
82
 
83
83
  [[nodiscard]] bool isGlobal(size_t nQubits) const override;
84
84
 
85
+ [[nodiscard]] bool isClifford() const override;
86
+
85
87
  void addControl(const Control c) override {
86
88
  if (actsOn(c.qubit)) {
87
89
  throw std::runtime_error("Cannot add control on qubit " +