Changelog¶
All notable changes to this project will be documented in this file.
The format is based on a mixture of Keep a Changelog and Common Changelog. This project adheres to Semantic Versioning, with the exception that minor releases may include breaking changes.
Unreleased¶
4.0.0 - 2026-09-11¶
MQT Core 4: a compiler foundation built on MLIR and LLVM¶
MQT Core 4 is a major architectural release centered on the
MQT Compiler Collection, a quantum-classical compilation framework built on
MLIR and LLVM. It replaces the classic circuit representation with a
compiler infrastructure that connects program import, optimization, hardware
mapping, program exchange, and execution through C++, Python, and mqt-cc.
The new foundation makes quantum operations and classical computation part of the same structured program. Quantum dialects work with MLIR’s classical arithmetic, functions, and control flow, so the compiler can represent loops, reusable functions, and measurement feedback throughout supported pipelines.
The central changes are:
A new program model. QC provides reference-based quantum operations for frontend interoperability; QCO uses linear quantum values for transformations. QTensor and CBit represent quantum and classical registers. Typed programs, builders, and verifiers expose this structure to compiler users and developers.
A shared, extensible compilation pipeline. Import OpenQASM or Qiskit, inspect intermediate representations, compose optimization passes, synthesize gates, and place and route programs for a device’s operations and topology. Python, C++, and the command-line driver use the same compiler infrastructure.
Compilation connected to execution. Exchange structured programs through jeff or emit OpenQASM and QIR. QIR lowering produces LLVM text or bitcode for Base and Adaptive profiles; DDSIM uses LLVM JIT compilation and the DD runtime to execute supported QIR through QDMI. QCO also supports direct DD simulation, sampling, and unitary construction.
Workflows built around the compiler. Typed benchmarks, SDK integrations, device-directed compilation, and six executable tutorials connect program construction to results. Python wheels include the compiler and local simulator; source builds enable the LLVM/MLIR compiler by default.
Upgrading from v3 requires an explicit migration. Classic circuit APIs,
including QuantumComputation, are removed. The low-level DD and QDMI libraries
remain available. Start with the v3-to-v4 upgrade guide for
the new program model, migration paths, API replacements, and build changes
relative to v3.10.0. The entries below retain the contributing PRs and authors.
Added¶
Compiler APIs and representations¶
✨ Introduce the MLIR/LLVM-based MQT Compiler Collection with typed QC, QCO, OpenQASM, jeff, and QIR programs; shared C++ and Python compilation APIs; inspection methods; and the
mqt-ccdriver. (#1264, #1470, #1471, #1815, #1914, #2149, #2343, #2519) (@burgholzer, @denialhaag, @simon1hofmann, @taminob)✨ Add QC/QCO program builders with implicit locations, tracked qubits and tensors, register names, gate matrices, and checked linear quantum values. Preserve caller-owned inputs and reject invalid programs at checked boundaries. (#1402, #1428, #1430, #1443, #1446, #1465, #1472, #1474, #1510, #1542, #1580, #1602, #1620, #1623, #1626, #1627, #1728, #1730, #1781, #1869, #1872, #2014, #2017, #2136, #2213, #2220, #2266, #2295, #2296, #2300, #2514) (@burgholzer, @denialhaag, @li-mingbao, @MatthiasReumann, @simon1hofmann, @taminob)
✨ Represent classical registers and structured
if,for,while, and switch control flow across QC and QCO, includingbreak,continue, wide register arithmetic, and reusable quantum functions with tracked wire correspondence. (#1506, #1638, #1700, #1717, #1749, #1806, #1808, #1824, #1925, #1927, #1935, #1936, #1938, #1975, #1976, #2026, #2158, #2181, #2193, #2194, #2297, #2307, #2308, #2320, #2322, #2336, #2344, #2357, #2369, #2443, #2448, #2464) (@burgholzer, @denialhaag, @DRovara, @li-mingbao, @MatthiasReumann, @simon1hofmann)✨ Canonicalize quantum gates, modifiers, and static qubits while preserving phase, wire correspondence, and side effects. Bound angle arithmetic and reduce repeated traversal and validation work. (#1330, #1426, #1436, #1464, #1475, #1550, #1554, #1567, #1569, #1603, #1751, #1762, #1782, #1807, #1985, #2041, #2210, #2281, #2282, #2290, #2291, #2293, #2435, #2477, #2484, #2485, #2486, #2492, #2502, #2505, #2516, #2524) (@burgholzer, @denialhaag, @DRovara, @Ectras, @J4MMlE, @simon1hofmann, @taminob)
Compilation for devices¶
✨ Compile for immutable device targets through C++, Python, and
mqt-cc. Match ordered operation availability, native gates, and payload capabilities; legalize supported control flow; and reuse compiled payloads for explicit device submission. (#1687, #1993, #1999, #2049, #2162, #2211, #2215, #2218, #2219, #2285, #2323, #2495, #2497, #2506, #2510) (@burgholzer, @denialhaag, @MatthiasReumann, @simon1hofmann)✨ Place and route QCO programs across sparse and directional device topologies, preserving classical feed-forward and quantum wire mappings through branches, loops, and switches. (#1537, #1547, #1581, #1583, #1588, #1600, #1664, #1709, #1716, #1748, #1805, #1870, #1904, #1911, #1951, #1956, #1997, #2004, #2007, #2016, #2060, #2119, #2179, #2184, #2185, #2205, #2240, #2301, #2316, #2351, #2436, #2489) (@burgholzer, @denialhaag, @MatthiasReumann, @rturrado, @simon1hofmann)
✨ Evaluate multiple initial layouts, including identity and greedy candidates, with CPU-based default trial counts. Reuse routing search storage and avoid repeated program-graph and liveness analysis. (#1568, #1574, #1930, #2180, #2488, #2499, #2500, #2517, #2535) (@burgholzer, @MatthiasReumann, @simon1hofmann)
Optimization and synthesis¶
✨ Optimize single-qubit runs with Hadamard lifting, quaternion-based rotation merging, Euler synthesis, and fusion of constant or parameterized unitaries. (#1407, #1605, #1672, #1674, #2002, #2038, #2228, #2478) (@burgholzer, @denialhaag, @J4MMlE, @lirem101, @MatthiasReumann, @simon1hofmann, @taminob)
✨ Decompose multi-controlled X, Z, phase, Pauli rotations, and SWAP operations. Fuse two-qubit unitaries and synthesize target-native entanglers, including RXX, RYY, RZX, RZZ, iSWAP, ECR, and optimal square-root iSWAP circuits. (#1774, #1802, #1803, #1809, #1810, #1814, #1832, #1850, #1865, #1961, #1996, #1998, #2001, #2444, #2467, #2468, #2478, #2507, #2531) (@burgholzer, @denialhaag, @simon1hofmann)
✨ Normalize global phases and expand multi-operation quantum modifiers while preserving full-unitary semantics. (#1986, #1995, #2006, #2015, #2189) (@burgholzer, @denialhaag, @simon1hofmann)
✨ Add measurement lifting, classical-control replacement, explicit dead-gate elimination, quantum-loop unrolling, qubit reuse, and Pauli twirling. (#1705, #1718, #1755, #1756, #1923, #1924, #2039, #2118, #2216, #2224) (@burgholzer, @denialhaag, @DRovara, @MatthiasReumann, @simon1hofmann)
Program import and exchange¶
✨ Import OpenQASM 2 and 3 into QC and emit OpenQASM 3 with reusable gates, structured control flow, fixed-width angles, affine qubit indices, and dynamically bounded loops. Diagnose unsupported inputs and bound frontend and export resource use. (#1780, #1910, #1987, #1994, #2003, #2050, #2169, #2203, #2304, #2338, #2456, #2465, #2482, #2483, #2515) (@burgholzer, @denialhaag, @J4MMlE, @simon1hofmann)
✨ Import and export Qiskit circuits, reusable custom gates, captured classical expressions, and structured control flow. Preserve measurements, wide register comparisons, and target-aware gate definitions. (#2031, #2133, #2140, #2175, #2176, #2223, #2342, #2348, #2398, #2439, #2452, #2461, #2508) (@burgholzer, @denialhaag, @MatthiasReumann, @simon1hofmann)
✨ Preserve symbolic Qiskit parameters and parameter-vector provenance through supported compiler conversions. (#2150, #2178) (@burgholzer, @simon1hofmann)
✨ Exchange jeff programs as bytes or files, preserving supported gates, phase, scalar control-flow state, arrays, and reusable functions. Use native integer arithmetic and report recoverable deserialization failures. (#1479, #1548, #1565, #1637, #1676, #1706, #1776, #1836, #1934, #1939, #2000, #2018, #2105, #2212, #2339, #2451, #2457, #2525) (@burgholzer, @denialhaag, @simon1hofmann)
✨ Generate QIR 2.1 Base and Adaptive profiles as LLVM text or bitcode. Derive capability and resource metadata, lower reusable functions and classical computation, preserve output order, and reject unsupported Base control flow during conversion. (#1446, #1513, #1521, #1548, #1567, #1569, #1570, #1572, #1580, #1620, #1624, #1626, #1648, #1710, #1751, #1787, #1815, #1823, #1933, #1978, #1979, #2026, #2030, #2066, #2217, #2294, #2302, #2340, #2446, #2447, #2449, #2463, #2526) (@burgholzer, @denialhaag, @li-mingbao, @MatthiasReumann, @simon1hofmann)
Decision diagrams and execution¶
✨ Construct functionality, simulate, and sample QCO programs through C++ and Python, with dense-array helpers for supported compiler inputs. Support classical arithmetic, structured control flow, dynamic quantum data, and statically sized entry-block registers for unitary construction. (#1915, #1973, #2077, #2078, #2079, #2334, #2455, #2474, #2518, #2526) (@burgholzer, @denialhaag, @simon1hofmann)
✨ Return ordered DDSIM QIR shots and matching histograms, including variable-length recorded outputs. (#2368) (@burgholzer)
✨ Extract statevectors from eligible Adaptive QIR with classical control flow, dynamic allocations, and direct helpers. Retain uncollapsed states after eligible OpenQASM and QIR terminal sampling, with lazy dense and sparse result queries. (#2491, #2494, #2512) (@burgholzer)
✨ Capture framed, typed QIR output records through DDSIM with
custom2=Trueand resultCUSTOM1, alongside ordinary shots and counts. (#2526) (@burgholzer, @simon1hofmann)
Structured benchmarks¶
✨ Add typed quantum benchmarks with versioned instance specifications, analytic references, deterministic manifests, and C++, Python, and CLI interfaces. Families cover BV, GHZ, Grover, QFT, QPE, multiplexers, teleportation, QFT adders, modular multiplication, and repeat-until-success programs. (#2135, #2299, #2315, #2324, #2337, #2380, #2402, #2404, #2409, #2410, #2493) (@burgholzer, @denialhaag)
Documentation and development¶
📝 Connect compilation, execution, device access, and program exchange in the user guide. Add six executable compiler tutorials and checked Python/C++ examples with downloadable notebooks. (#1555, #1635, #1773, #1899, #1959, #2058, #2165, #2462, #2503, #2509, #2526) (@burgholzer, @denialhaag, @MatthiasReumann, @simon1hofmann, @ystade)
📝 Consolidate development policy and agent guidance, including compiler contracts, terminology, validation, and reproducible benchmarks. (#1905, #1907, #1908, #1909, #1960, #2072, #2120, #2128, #2256, #2272, #2354, #2490, #2496, #2498, #2501, #2523, #2526) (@burgholzer, @denialhaag, @simon1hofmann)
🐳 Add a dev container for local development. (#1786) (@denialhaag)
Changed¶
Builds and supported configurations¶
🔧 Build the LLVM/MLIR 23.1.1 compiler infrastructure and DDSIM device by default. Support LLVM builds without exceptions or RTTI, and use
BUILD_MQT_CORE_MLIR=OFFfor DD/QDMI builds that omit the compiler and DDSIM. (#1356, #1549, #1953, #2125, #2127, #2284, #2298, #2538) (@burgholzer, @denialhaag, @simon1hofmann)💥 Require CMake 3.28 or newer for source builds and embedded projects, with native dependency exclusions and system include handling. (#2421) (@burgholzer)
⚡ Reduce build, documentation, and test-discovery overhead. Share Ninja presets and generate C++ lint prerequisites without a full build while honoring disabled interprocedural optimization. (#1944, #1954, #1988, #2047, #2075, #2083, #2426, #2459, #2470) (@burgholzer, @denialhaag)
📦 Use
vcs-versioningand standard dynamic metadata for SCM-derived Python package versions, with lower bounds for build dependencies. (#1544, #2065, #2145, #2163) (@burgholzer, @denialhaag)⬆️ Update clang-tidy to version 23 and adapt the C++ sources to its diagnostics. Format TableGen files and align LLVM include and namespace conventions. (#1573, #1673, #1675, #1765, #2028, #2328) (@burgholzer, @denialhaag, @simon1hofmann)
Runtime and client behavior¶
💥 Align QIR execution with QIR 2.1 runtime and QIS signatures, isolated per-job state, deterministic seeded sampling, and checked state extraction. Optimize eligible terminal sampling and output preparation; verify Base output records against QIR-Runner. (#2034, #2035, #2036, #2044, #2466, #2513) (@burgholzer)
⚡ Reduce QDMI discovery, result-decoding, and Slurm overhead. Release the Python GIL during native QDMI calls and avoid repeated capability and result queries. (#2440, #2460, #2472, #2475, #2481, #2511) (@burgholzer)
⚡ Reduce DD cache clearing, element lookup, export, and allocation overhead, and avoid repeated QC/QCO conversion work. (#2441, #2453, #2473, #2474, #2479) (@burgholzer)
Fixed¶
Decision diagrams¶
🐛 Correct DD cache invalidation after garbage collection, compressed-matrix entries, partial traces, Kronecker products, numeric-table reuse, and logical Python vector indexing. Reject malformed paths and ragged dense matrices. (#2441, #2453, #2479) (@burgholzer)
🐛 Use deterministic, collision-free DOT node IDs, define signed complex-weight hashing, and preserve real-number collection flags during relinking. (#2518) (@burgholzer)
Device access¶
Removed¶
💥 Remove
qc::QuantumComputation,MQT::CoreIR,MQT::CoreQASM, classic Python circuit APIs, and circuit-taking DD helpers. Use compiler-backed QC/QCO APIs or remain on the v3 release series. (#2054, #2288) (@burgholzer, @simon1hofmann)💥 Remove the standalone QIR runner and make the QIR runtime and JIT internal DDSIM implementation details. Execute QIR through QDMI. (#2246) (@burgholzer, @denialhaag)
3.10.0 - 2026-09-05¶
If you are upgrading: please see
UPGRADING.md.
Added¶
✨ Expose ordered shots from DDSIM QDMI OpenQASM jobs, with matching histograms (#2368) (@burgholzer)
Changed¶
⚡ Run PennyLane QDMI jobs concurrently and release the GIL during waits and result retrieval (#2349) (@burgholzer)
💥 Raise the minimum Qiskit version from 1.1.0 to 2.1.0 (#2358) (@burgholzer)
💥 Replace the QDMI-specific primitives with native Qiskit primitives and typed backend factories. Sampler and
memory=Truerequire genuine QDMISHOTS(#2358) (@burgholzer)⬆️ Update
nanobindto version 3.0.1 (#2209, #2283) (@denialhaag, @burgholzer)💥 Move circuit IR OpenQASM serialization from operation subclasses to
qasm3::Serializerinqasm3/Serializer.hpp(#2249) (@simon1hofmann)💥 Drop support for x86 macOS and stop publishing the respective wheels (#2259) (@denialhaag)
⬆️ Raise the macOS deployment target to 13.3 to enable
std::formatin libc++ (#2259) (@denialhaag)💥 Require Python 3.11 or newer (#2209) (@denialhaag, @burgholzer)
📦 Publish one split-mode
cp311-abi3wheel for GIL-enabled CPython 3.11 and newer (#2209) (@denialhaag, @burgholzer)📦 Publish one
cp315-abi3twheel for free-threaded CPython 3.15 and newer (#2209) (@denialhaag, @burgholzer)⚡ Remove an extra dense copy from
VectorDD.get_vector(#2209) (@burgholzer)🐛 Protect process-wide DD, IR, and QDMI state for free-threaded Python (#2209) (@burgholzer)
💥 Prune dead and misleading CoreIR APIs, including renaming the non-garbage logical output count to
getNoutputQubits()andnum_output_qubits(#2112) (@simon1hofmann)
Removed¶
💥 Remove test-only DD state generators, recursive functionality construction, and DD-specific named-gate helpers (#2257, #2335) (@simon1hofmann)
💥 Remove the
spdlogdependency from source builds, installed CMake packages, and Python wheels. QDMI diagnostics continue to be written to standard error (#2270) (@denialhaag)💥 Remove
CircuitOptimizer. Move circuit flattening and final-measurement removal toQuantumComputation, equivalence-checking transformations to MQT QCEC, and mapping transformations to MQT QMAP. Move single-qubit gate fusion to both downstream packages. Remove the public circuit dependency graph and transformations without production consumers (#2262) (@simon1hofmann)💥 Remove
MQT::CoreAlgorithms, its fixed-circuit factories, and the legacy DD package evaluation. MQT Core provides no direct replacement (#2214) (@burgholzer)💥 Remove the unused decision-diagram approximation algorithm, including the
dd/Approximation.hppheader,dd::ApproximationMetadata, anddd::approximate. No replacement is provided (#2154) (@burgholzer)💥 Remove
nlohmann_jsonfrom the public package contract. MQT Core no longer installs or exports the library, no installed header exposes anlohmanntype, and the decision-diagram statistics report through strings and streams (#2138) (@denialhaag)💥 Remove the neutral-atom stack, which moves to MQT QMAP. This drops the neutral-atom computation model, the neutral-atom FoMaC device session, the neutral-atom QDMI device and its configuration, the
mqt.core.naPython module,AodOperation, and theMove,Bridge,AodActivate,AodDeactivate, andAodMoveoperation kinds (#2137) (@denialhaag)💥 Remove the random-number generator, seed, and
getGenerator()method fromQuantumComputation; randomized algorithms now own generators initialized from their seed arguments (#2111) (@simon1hofmann)💥 Remove the FoMaC compatibility name from the C++ and Python QDMI APIs. Use the
qdmiC++ namespace, headers, library, and CMake target; themqt.core.qdmiPython module; and module-level functions inmqt.core.qdmi.driver(#2115) (@burgholzer)💥 Remove the ZX-calculus library, including the
mqt-core-zxtarget,MQT::CoreZXalias,zxheaders and namespace, and its Boost.Multiprecision and GMP build support. Equivalence-checking users should use MQT QCEC; its ZX implementation is internal and does not provide a replacement public API (#2082) (@burgholzer)🔥 Remove density matrix support from the DD package (#1466) (@burgholzer)
🔥 Remove
datastructures(ds) (sub)library (#1458) (@burgholzer)
Fixed¶
🐛 Initialize Qiskit classical bits before OpenQASM 3 serialization so partially measured circuits preserve their zero values (#2399) (@burgholzer)
🐛 Handle empty DDSIM results and NUL-terminated QDMI result buffers (#2288) (@simon1hofmann)
🐛 Validate output permutations before I/O mapping initialization (#2278) (@denialhaag)
3.9.2 - 2026-08-26¶
If you are upgrading: please see UPGRADING.md.
Added¶
✨ Allow C++ and Python QDMI job submissions to omit the shot count, leaving repetition semantics to the program and device (#2258) (@burgholzer)
3.9.1 - 2026-08-25¶
If you are upgrading: please see UPGRADING.md.
Added¶
🚸 Let PennyLane QDMI devices reuse an already-open session, including a device selected from a Slurm license (#2232) (@burgholzer)
✨ Let a package register a program serializer for a program format through the
mqt.core.qiskit.program_serializersentry point group (#2114) (@marcelwa, @burgholzer)✨ Add
mqt.core.qdmi.is_binary_program_format, which states whether a program format requires exact-byte submission (#2114) (@marcelwa, @burgholzer)
Removed¶
💥 Remove the IQM JSON converter
qiskit_to_iqm_jsonand theMoveGatefrom the Qiskit plugin, which QDMI-on-IQM now owns (#2114) (@marcelwa, @burgholzer)
3.9.0 - 2026-08-19¶
If you are upgrading: please see UPGRADING.md.
Added¶
✨ Add PennyLane support for gate-based QDMI devices (#2005, #2147) (@burgholzer, @marcelwa)
✨ Add
Device::submitCalibrationJobandmqt.core.qdmi.Device.submit_calibration_jobfor triggering a calibration run (#2148) (@marcelwa, @burgholzer)✨ Add SpecAudits, a method and probe script for auditing tests that pin behavior the project never specified (#2124) (@marcelwa)
🚸 Add typed stable-ID construction for Qiskit backends, lazy provider discovery, and sampler and estimator factories with explicit shot and precision defaults (#2084) (@burgholzer)
🧪 Test static Slurm license admission and QDMI execution with DDSIM and the superconducting device, and document the cluster setup (#2043) (@burgholzer)
✨ Add C++ FoMaC and Python QDMI adapters that open the device named by one local Slurm license environment value (#2025) (@burgholzer)
✨ Add generic C++ FoMaC and Python QDMI support for custom device properties that contain operation handles (#2042) (@burgholzer)
📝 Generate
llms.txtdocumentation indexes with Sphinx-LLM (#1989, #2046) (@denialhaag, @burgholzer)✨ Support retrieving existing jobs by ID through the QDMI client API, C++ FoMaC API, and Python QDMI API, and expose optional device queue length and job queue position (#2008, #2010) (@burgholzer)
🐍 Build CPython 3.15 wheels. Their post-build tests remain disabled until test dependency wheels are available (#2011) (@denialhaag)
✨ Bundle reusable IQM Garnet and Emerald superconducting device models with stable QDMI registry IDs (#1992) (@burgholzer)
✨ Expose compressed vector and matrix DD serialization through bytes-based Python APIs (#1983) (@burgholzer)
✨ Make the neutral-atom and superconducting QDMI devices runtime configurable with session-owned topology, operations, and calibration data (#1974, #1980) (@burgholzer)
✨ Expose registered QDMI device IDs without loading device libraries (#1972) (@burgholzer)
✨ Add typed runtime configuration transport and relocatable assets for QDMI device descriptions (#1967) (@burgholzer)
Changed¶
⬆️ Update QDMI to version 1.3.3 (#2168) (@denialhaag)
⬆️ Update
nanobindto version 2.15.0 (#2141) (@denialhaag)💥 Replace the MQT-specific QDMI primitive
optionsmappings with explicit shot and precision defaults (#2084) (@burgholzer)♻️ Simplify Python optional-dependency checks while preserving the Qiskit and PennyLane availability flags (#2108) (@simon1hofmann)
💥 Remove the unused
pybind11CMake helper and renameadd_mqt_python_binding_nanobindtoadd_mqt_python_binding(#2106) (@denialhaag)💥 Move Python QDMI entities and the neutral-atom specialization to QDMI namespaces, expose device registration and opening through
mqt.core.qdmi.driver, retain v3 FoMaC compatibility aliases, and let the Qiskit adapter open stable device IDs directly (#2074) (@burgholzer)🚀 Reduce ZX diagram growth for multi-controlled X gates with an exact ancilla-free quadratic decomposition (#1984) (@burgholzer)
Fixed¶
🐛 Distinguish scalar OpenQASM qubits from one-element qubit registers and reject indexing scalar qubits (#2157) (@DRovara, @burgholzer)
🐛 Preserve the original OpenQASM type error when an assignment’s right-hand expression cannot be typed (#2156) (@DRovara, @burgholzer)
Removed¶
💥 Remove batch job submission from the QDMI client.
Device::submitJobnow states that MQT Core does not support batch jobs (#2148) (@marcelwa, @burgholzer)💥 Remove QDMI device configuration through
[tool.qdmi]inpyproject.tomland the vendored toml++ header (#2116) (@denialhaag)
3.8.0 - 2026-07-30¶
If you are upgrading: please see UPGRADING.md.
Added¶
✨ Add binary-safe QDMI program submission and retrieval to FoMaC, including explicit text and exact-byte APIs and all standard QDMI program formats (#1957) (@burgholzer)
✨ Add versioned, relocatable configuration and stable-ID registration for QDMI device libraries, including disabled-ID reservations, fresh device sessions, idempotent registration, and external-device target metadata (#1912) (@burgholzer)
✨ Add native relative-phase CCX (
rccx) support across the IR, DD package, ZX diagrams, OpenQASM import/export, and Python/Qiskit bindings (#1886, #1950) (@simon1hofmann)✨ Add support for QDMI child devices to the driver and FoMaC libraries (#1897, #1952) (@burgholzer)
✨ Add typed custom property and result queries to the C++ and Python FoMaC libraries (#1895) (@burgholzer)
✨ Add support for custom job parameters to C++ and Python FoMaC library (#1887) (@flowerthrower, @burgholzer)
✨ Add labeled and ordered output schemas to the QIR runtime (#1877) (@rturrado)
✨ Add boolean, integer, floating-point, tuple, and array record output functions to the QIR runtime (#1799) (@rturrado)
✨ Add the reusable in-process
MQT::CoreQIRJITlibrary and QIR program format support to the DDSIM QDMI device (#1766) (@rturrado)
Changed¶
⬆️ Raise the minimum supported QDMI version to 1.3.2 (#1897) (@burgholzer)
Removed¶
🔥 Replace the unstable C++
Driver::addDynamicDeviceLibraryand Pythonadd_dynamic_device_libraryAPIs with definition registration and stable-ID opening (#1912) (@burgholzer)
Fixed¶
🐛 Allow MQT Core to be embedded as a CMake subproject without target collisions and make its bundled QDMI devices individually configurable (#1965) (@burgholzer)
🐛 Fix QIR function names for adjoint gates (#1830) (@denialhaag)
3.7.0 - 2026-07-09¶
If you are upgrading: please see UPGRADING.md.
Added¶
✨ Add support for IQM’s
movegate in the QDMI Qiskit backend converter (#1844, #1848) (@burgholzer, @marcelwa)🚸 Add
constversion of theCompoundOperation’sgetOps()function (#1826) (@ystade)🚸 Add CMake presets to provide a standardized and reproducible way to configure builds (#1660) (@denialhaag)
Changed¶
⬆️ Update QDMI to version 1.3.2 (#1873) (@denialhaag)
♻️ Improve implementation and usability of FoMaC classes (#1849) (@MatthiasReumann)
⬆️ Update
nanobindto version 2.13.0 (#1817)⬆️ Update munich-quantum-toolkit/workflows to version
v2.0.1(#1660, #1737) (@denialhaag)
Removed¶
📝 Remove support for generating LaTeX documentation (#1828) (@denialhaag)
Fixed¶
🐛 Fix invalid
prop_typeforQDMI_DEVICE_PROPERTY_COUPLINGMAPin QDMI SC Device (#1842) (@MatthiasReumann)
3.6.1 - 2026-05-20¶
Changed¶
🚸 Improve native gate support for the Qiskit-to-OpenQASM3 conversion in the QDMI-Qiskit interface (#1719) (@burgholzer)
Fixed¶
🏁 Fix dynamic loading of QDMI device DLLs on Windows when an absolute path is provided (#1720) (@burgholzer)
3.6.0 - 2026-05-13¶
If you are upgrading: please see UPGRADING.md.
Added¶
🚸 Add a measurement instruction to the default SC QDMI device (#1694) (@burgholzer)
✨ Add support for multi-controlled gates to the QDMI Qiskit backend converter (#1694) (@burgholzer)
Changed¶
♻️ Build all built-in QDMI devices as shared libraries (#1694) (@burgholzer)
⬆️ Update minimum supported Qiskit version to 1.1.0 (#1694) (@burgholzer)
Fixed¶
🐛 Fix missing
nlohmann_json.natvisin Windows component-based CMake installs (#1702) (@burgholzer)🐛 Fix segfault in DD
samplemethod when idle classical bits are present (#1694) (@burgholzer)
Removed¶
🔥 Remove shared library wrappers for QDMI devices (#1694) (@burgholzer)
3.5.1 - 2026-04-23¶
If you are upgrading: please see UPGRADING.md.
Fixed¶
🐛 Fix malformed include directories in exported
nlohmann_jsonCMake targets for component-based installs (#1662) (@burgholzer)
3.5.0 - 2026-04-21¶
If you are upgrading: please see UPGRADING.md.
Added¶
✨ Add support for multi-controlled gates to ZX package (#1380) (@keefehuang, @denialhaag)
✨ Add Sampler and Estimator primitives to the QDMI-Qiskit interface (#1507) (@marcelwa)
Changed¶
⬆️ Update
nanobindto version 2.12.0 (#1528)⬆️ Update QDMI to version 1.3.0 (#1652) (@burgholzer)
📦 Switch to component-based installation for the MQT Core Python package (#1596) (@burgholzer)
⬆️ Update QDMI to latest version from stable
v1.2.xbranch (#1593) (@burgholzer)⬆️ Update
clang-tidyto version 22 (#1564) (@denialhaag, @burgholzer)👷 Build on
macos-26/macos-26-intelby default andmacos-15/macos-15-intelfor extensive tests (#1571) (@denialhaag)
3.4.1 - 2026-02-01¶
Changed¶
⬆️ Update
nanobindto version 2.11.0 (#1481) (@denialhaag)⬆️ Update Boost to version 1.89.0 (#1453) (@burgholzer)
⬆️ Update QDMI to latest version from stable
v1.2.xbranch (#1453) (@burgholzer)⬆️ Update
spdlogto version 1.17.0 (#1453) (@burgholzer)♻️ Use
llcinstead of randomclangfor compiling QIR test circuits to improve robustness and handle opaque pointers correctly across LLVM versions (#1447) (@burgholzer)♻️ Extract singleton pattern into reusable template base class for QDMI devices and driver (#1444) (@ystade, @burgholzer)
🚚 Reorganize QDMI code structure by moving devices into dedicated subdirectories and separating driver and common utilities (#1444) (@ystade)
Removed¶
🔥 No longer actively type check Python code with
mypyand solely rely onty(#1437) (@burgholzer)
3.4.0 - 2026-01-08¶
If you are upgrading: please see UPGRADING.md.
Added¶
✨ Return device handle from
add_dynamic_device_libraryfor direct backend creation (#1381) (@marcelwa)✨ Add IQM JSON support for job submission in Qiskit-QDMI Backend (#1375, #1382) (@marcelwa, @burgholzer)
✨ Add authentication support for QDMI sessions with token, username/password, auth file, auth URL, and project ID parameters (#1355) (@marcelwa)
✨ Add a new QDMI device that represents a superconducting architecture featuring a coupling map (#1328) (@ystade)
✨ Add bi-directional iterator that traverses the def-use chain of a qubit value (#1310) (@MatthiasReumann)
✨ Add
OptionalDependencyTesterto lazily handle optional Python dependencies like Qiskit (#1243) (@marcelwa, @burgholzer)✨ Expose the QDMI job interface through FoMaC (#1243) (@marcelwa, @burgholzer)
✨ Add Qiskit backend wrapper with job submission support for QDMI devices through a provider interface (#1243, #1385) (@marcelwa, @burgholzer)
✨ Support
QDMI_DEVICE_PROPERTY_SUPPORTEDPROGRAMFORMATSin the NA QDMI Device and the DDSIM QDMI Device (#1243) (@marcelwa, @burgholzer)✨ Support
QDMI_DEVICE_JOB_PROPERTY_PROGRAMin the NA QDMI Device (#1243) (@marcelwa, @burgholzer)
Changed¶
📦🏁 Build Windows x86 wheels on
windows-2025runner for newer compiler (#1415) (@burgholzer)👷 Build on
macos-15/windows-2025by default andmacos-14/windows-2022for extensive tests (#1414) (@burgholzer)📦🍎 Build macOS arm64 wheels on macos-15 runner for newer compiler (#1413) (@burgholzer)
⚡ Improve uv build caching by removing unconditional
reinstall-packageand configuring dedicatedcache-keys(#1412) (@burgholzer)👨💻📦 Build
spdlogand QDMI generators as shared libraries in Python package builds (#1411, #1403) (@burgholzer)♻️🏁 Remove Windows-specific restrictions for dynamic QDMI device library handling (#1406) (@burgholzer)
♻️ Migrate Python bindings from
pybind11tonanobind(#1383) (@denialhaag, @burgholzer)📦️ Provide Stable ABI wheels for Python 3.12+ (#1383) (@burgholzer, @denialhaag)
🚚 Create dedicated
mqt.core.nasubmodule to closely follow the structure of other submodules (#1383) (@burgholzer)✨ Add common definitions and utilities for QDMI (#1355) (@burgholzer)
🚚 Move
NAQDMI device in its right place next to other QDMI devices (#1355) (@burgholzer)♻️ Allow repeated loading of QDMI device library with potentially different session configurations (#1355) (@burgholzer)
♻️ Enable thread-safe reference counting for QDMI devices singletons (#1355) (@burgholzer)
♻️ Refactor
FoMaCsingleton to instantiableSessionclass with configurable authentication parameters (#1355) (@marcelwa)👷 Stop testing on
ubuntu-22.04andubuntu-22.04-armrunners (#1359) (@denialhaag, @burgholzer)👷 Stop testing with
clang-19and start testing withclang-21(#1359) (@denialhaag, @burgholzer)👷 Fix macOS tests with Homebrew Clang via new
munich-quantum-toolkit/workflowsversion (#1359) (@denialhaag, @burgholzer)👷 Re-enable macOS tests with GCC by disabling module scanning (#1359) (@denialhaag, @burgholzer)
♻️ Group circuit operations into scheduling units for MLIR routing (#1301) (@MatthiasReumann)
👷 Use
munich-quantum-software/setup-mlirto set up MLIR (#1294) (@denialhaag)♻️ Preserve tuple structure and improve site type clarity of the MQT NA Default QDMI Device (#1299) (@marcelwa)
♻️ Move DD package evaluation module to standalone script (#1327) (@burgholzer)
⬆️ Bump QDMI version to 1.2.0 (#1243) (@marcelwa, @burgholzer)
Fixed¶
🔧 Install all available QDMI device targets in Python package builds (#1403) (@burgholzer)
🐛 Fix operation validation in Qiskit backend to handle device-specific gate naming conventions (#1384) (@marcelwa)
🐛 Fix conditional branch handling when importing MLIR from
QuantumComputation(#1378) (@lirem101)🐛 Fix custom QDMI property and parameter handling in SC and NA devices (#1355) (@burgholzer)
🚨 Fix argument naming of
QuantumComputationandCompoundOperationdunder methods for properly implementing theMutableSequenceprotocol (#1338) (@burgholzer)🐛 Fix memory management in dynamic QDMI device by making it explicit (#1336) (@ystade)
Removed¶
🔥 Remove wheel builds for Python 3.13t (#1371) (@burgholzer)
🔥 Remove the
evaluationextra from the MQT Core Python package (#1327) (@burgholzer)🔥 Remove the
mqt-core-dd-compareentry point from the MQT Core Python package (#1327) (@burgholzer)
3.3.3 - 2025-11-10¶
Added¶
Fixed¶
🐛 Revert change to
opTypeFromString()signature made in #1283 (#1300) (@denialhaag)
3.3.2 - 2025-11-04¶
Added¶
✨ Add DD-based simulator QDMI device (#1287) (@burgholzer)
✨ A
--reuse-qubitspass implementing an advanced form of qubit reuse to reduce the qubit count of quantum circuits (#1108) (@DRovara)✨ A
--lift-measurementspass that attempts to move measurements up as much as possible, used for instance to enable better qubit reuse (#1108) (@DRovara)✨ 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¶
🐛 Fix edge-case in validation of
NAComputation(#1276) (@ystade)🐛 Allow integer QASM version declarations (#1269) (@denialhaag)
3.3.1 - 2025-10-14¶
Fixed¶
🐛 Ensure
spdlogdependency can be found frommqt-coreinstall (#1263) (@burgholzer)
3.3.0 - 2025-10-13¶
If you are upgrading: please see UPGRADING.md.
Added¶
👷 Enable testing on Python 3.14 (#1246) (@denialhaag)
✨ Add dedicated
PlacementPassto MLIR transpilation routines (#1232) (@MatthiasReumann)✨ Add an NA-specific FoMaC implementation (#1223, #1236) (@ystade, @burgholzer)
✨ Enable import of BarrierOp into MQTRef (#1224) (@denialhaag)
✨ Add naive quantum program routing MLIR pass (#1148) (@MatthiasReumann)
✨ Add QIR runtime using DD-based simulation (#1210) (@ystade, @burgholzer)
✨ Add SWAP reconstruction patterns to the newly-named
SwapReconstructionAndElisionMLIR pass (#1207) (@taminob, @burgholzer)✨ Add two-way conversions between MQTRef and QIR (#1091) (@li-mingbao)
🚸 Define custom assembly formats for MLIR operations (#1209) (@denialhaag)
✨ Add support for translating
IfElseOperations to theMQTRefMLIR dialect (#1164) (@denialhaag, @burgholzer)✨ Add MQT’s implementation of a generic FoMaC with Python bindings (#1150, #1186, #1223) (@ystade)
✨ Add new MLIR pass
ElidePermutationsfor SWAP gate elimination (#1151) (@taminob)✨ Add new pattern to MLIR pass
GateEliminationfor identity gate removal (#1140) (@taminob)✨ Add Clifford block collection pass to
CircuitOptimizermodule (#885) ([jannikpflieger], @burgholzer)✨ Add
isControlled()method to theUnitaryInterfaceMLIR class (#1157) (@taminob, @burgholzer)📝 Integrate generated MLIR documentation (#1147) (@denialhaag, @burgholzer)
✨ Add
IfElseOperationto C++ library and Python package to support Qiskit’sIfElseOp(#1117) (@denialhaag, @burgholzer, @lavanya-m-k)✨ Add
allocQubitanddeallocQubitoperations for dynamically working with single qubits to the MLIR dialects (#1139) (@DRovara, @burgholzer)✨ Add
qubitoperation for static qubit addressing to the MLIR dialects (#1098, #1116) (@MatthiasReumann)✨ Add MQT’s implementation of a QDMI Driver (#1010) (@ystade)
✨ Add MQT’s implementation of a QDMI Device for neutral atom-based quantum computing (#996, #1010, #1100) (@ystade, @burgholzer)
✨ Add translation from
QuantumComputationto theMQTRefMLIR dialect (#1099) (@denialhaag, @burgholzer)✨ Add
resetoperations to the MLIR dialects (#1106) (@DRovara)
Changed¶
♻️ Replace custom
AllocOp,DeallocOp,ExtractOp, andInsertOpwith MLIR-nativememrefoperations (#1211) (@denialhaag)🚚 Rename MLIR pass
ElidePermutationstoSwapReconstructionAndElision(#1207) (@taminob)⬆️ Require LLVM 21 for building the MLIR library (#1180) (@denialhaag)
⬆️ Update to version 21 of
clang-tidy(#1180) (@denialhaag)🚚 Rename MLIR pass
CancelConsecutiveInversestoGateElimination(#1140) (@taminob)🚚 Rename
xxminusyytoxx_minus_yyandxxplusyytoxx_plus_yyin MLIR dialects (#1071) (@BertiFlorea, @denialhaag)🚸 Add custom assembly format for operations in the MLIR dialects (#1139) (@burgholzer)
🚸 Enable
InferTypeOpInterfacein the MLIR dialects to reduce explicit type information (#1139) (@burgholzer)🚚 Rename
check-quantum-opttest target tomqt-core-mlir-lit-test(#1139) (@burgholzer)♻️ Update the
measureoperations in the MLIR dialects to no longer support more than one qubit being measured at once (#1106) (@DRovara)🚚 Rename
XXminusYYtoXXminusYYOpandXXplusYYtoXXplusYYOpin MLIR dialects (#1099) (@denialhaag)🚚 Rename
MQTDynMLIR dialect toMQTRef(#1098) (@MatthiasReumann)
Removed¶
🔥 Drop support for Python 3.9 (#1181) (@denialhaag)
🔥 Remove
ClassicControlledOperationfrom C++ library and Python package (#1117) (@denialhaag)
Fixed¶
🐛 Fix CMake installation to make
find_package(mqt-core CONFIG)succeed (#1247) (@burgholzer, @denialhaag)🏁 Fix stack overflows in OpenQASM layout parsing on Windows for large circuits (#1235) (@burgholzer)
✨ Add missing
StandardOperationconversions in MLIR roundtrip pass (#1071) (@BertiFlorea, @denialhaag)
3.2.1 - 2025-08-01¶
Fixed¶
🐛 Fix usage of
std::accumulateby changing accumulator parameter from reference to value (#1089) (@denialhaag)🐛 Fix erroneous
containscheck in DD package (#1088) (@denialhaag)
3.2.0 - 2025-07-31¶
If you are upgrading: please see UPGRADING.md.
Added¶
🐍 Start building CPython 3.14 wheels (#1076) (@denialhaag)
✨ Add MQT-internal MLIR dialect conversions (#1001) (@li-mingbao)
Changed¶
✨ Expose enums to Python via
pybind11’s new (enum.Enum-compatible)py::native_enum(#1075) (@denialhaag)⬆️ Require C++20 (#897) (@burgholzer, @denialhaag)
3.1.0 - 2025-07-11¶
If you are upgrading: please see UPGRADING.md.
Added¶
✨ Add MLIR pass for merging rotation gates (#1019) (@denialhaag)
✨ Add functions to generate random vector DDs (#975) (@MatthiasReumann)
✨ Add function to approximate decision diagrams (#908) (@MatthiasReumann)
📦 Add Windows ARM64 wheels (#926) (@burgholzer)
✨ Initial implementation of the mqtdyn Dialect (#900) (@DRovara, @ystade)
Fixed¶
🐛 Fix bug in MLIR roundtrip passes caused by accessing an invalidated iterator after erasure in a loop (#932) (@flowerthrower)
🐛 Add missing support for
sxdggates in Qiskit circuit import (#930) (@burgholzer)🐛 Fix bug related to initialization of operations with duplicate operands (#964) (@ystade)
🐛 Open issue for Qiskit upstream test only when the test is actually failing not when it was cancelled (#973) (@ystade)
🐛 Fix parsing of
GPhasein theMQTOptMLIR dialect (#1042) (@ystade, @DRovara)
Changed¶
⬆️ Bump shared library ABI version from
3.0to3.1(#1047) (@denialhaag)♻️ Switch from reference counting to mark-and-sweep garbage collection in decision diagram package (#1020) (@MatthiasReumann, [burgholzer], q-inho)
♻️ Move the C++ code for the Python bindings to the top-level
bindingsdirectory (#982) (@denialhaag)♻️ Move all Python code (no tests) to the top-level
pythondirectory (#982) (@denialhaag)⚡ Improve performance of getNqubits for StandardOperations (#959) (@ystade)
♻️ Move Make-State Functionality To StateGeneration (#984) (@MatthiasReumann)
♻️ Outsource definition of standard operations from MLIR dialects to reduce redundancy (#933) (@ystade)
♻️ Unify operands and results in MLIR dialects (#931) (@ystade)
⏪️ Restore support for (MLIR and) LLVM v19 (#934) (@flowerthrower, @ystade)
⬆️ Update nlohmann_json to
v3.12.0(#921) (@burgholzer)
3.0.2 - 2025-04-07¶
Added¶
📝 Add JOSS journal reference and citation information (#913) (@burgholzer)
📝 Add new links to Python package metadata (#911) (@burgholzer)
Fixed¶
📝 Fix old links in Python package metadata (#911) (@burgholzer)
3.0.1 - 2025-04-07¶
Fixed¶
🐛 Fix doxygen build on RtD to include C++ API docs (#912) (@burgholzer)
3.0.0 - 2025-04-06¶
If you are upgrading: please see UPGRADING.md.
Added¶
✨ Ship shared C++ libraries with
mqt-corePython package (#662) (@burgholzer)✨ Add Python bindings for the DD package (#838) (@burgholzer)
✨ Add direct MQT
QuantumComputationto QiskitQuantumCircuitexport (#859) (@burgholzer)✨ Support for Qiskit 2.0+ (#860) (@burgholzer)
✨ Add initial infrastructure for MLIR within the MQT (#878, #879, #892, #893, #895) (@burgholzer, @ystade, @DRovara, @flowerthrower, @BertiFlorea)
✨ Add State Preparation Algorithm (#543) (@M-J-Hochreiter)
🚸 Add support for indexed identifiers to OpenQASM 3 parser (#832) (@burgholzer)
🚸 Allow indexed registers as operation arguments (#839) (@burgholzer)
📝 Add documentation for the DD package (#831) (@burgholzer)
📝 Add C++ API docs setup (#817) (@pehamTom, @burgholzer)
Changed¶
Breaking: 🚚 MQT Core has moved to the munich-quantum-toolkit GitHub organization
Breaking: ✨ Adopt PEP 735 dependency groups (#762) (@burgholzer)
Breaking: ♻️ Encapsulate the OpenQASM parser in its own library (#822) (@burgholzer)
Breaking: ♻️ Replace
Configtemplate from DD package with constructor argument (#886) (@burgholzer)Breaking: ♻️ Remove template parameters from
MemoryManagerand adjacent classes (#866) (@rotmanjanez)Breaking: ♻️ Refactor algorithms to use factory functions instead of inheritance (@a9b7e70) (@burgholzer)
Breaking: ♻️ Change pointer parameters to references in DD package (#798) (@burgholzer)
Breaking: ♻️ Change registers from typedef to actual type (#807) (@burgholzer)
Breaking: ♻️ Refactor
NAComputationclass hierarchy (#846, #877) (@ystade)Breaking: ⬆️ Bump minimum required CMake version to
3.24.0(#879) (@burgholzer)Breaking: ⬆️ Bump minimum required
uvversion to0.5.20(#802) (@burgholzer)📝 Rework existing project documentation (#789, #842) (@burgholzer)
📄 Use PEP 639 license expressions (#847) (@burgholzer)
Removed¶
Breaking: 🔥 Remove the
Teleportationgate from the IR (#882) (@burgholzer)Breaking: 🔥 Remove parsers for
.real,.qc,.tfc, andGRCSfiles (#822) (@burgholzer)Breaking: 🔥 Remove tensor dump functionality (#798) (@burgholzer)
Breaking: 🔥 Remove
extract_probability_vectorfunctionality (#883) (@burgholzer)
Fixed¶
🐛 Fix Qiskit layout import and handling (#849, #858) (@burgholzer)
🐛 Properly handle timing literals in QASM parser (#724) (@burgholzer)
🐛 Fix stripping of idle qubits (#763) (@burgholzer)
🐛 Fix permutation handling in OpenQASM dump (#810) (@burgholzer)
🐛 Fix out-of-bounds error in ZX
EdgeIterator(#758) (@burgholzer)🐛 Fix endianness in DCX and XX_minus_YY gate matrix definition (#741) (@burgholzer)
🐛 Fix needless dummy register in empty circuit construction (#758) (@burgholzer)
2.7.0 - 2024-10-08¶
📚 Refer to the GitHub Release Notes for previous changelogs.