[Python] Add native OpenQASM 2.0/3.0 parser and expand Qiskit interoperability#4613
Open
QuantumRaul wants to merge 4 commits into
Open
[Python] Add native OpenQASM 2.0/3.0 parser and expand Qiskit interoperability#4613QuantumRaul wants to merge 4 commits into
QuantumRaul wants to merge 4 commits into
Conversation
Signed-off-by: Raul Martinez <raul.marpa01@gmail.com>
Signed-off-by: QuantumRaul <raul.marpa01@gmail.com>
…perability in cudaq.contrib Signed-off-by: QuantumRaul <raul.marpa01@gmail.com>
…aul Martinez <raul.marpa01@gmail.com>, hereby add my Signed-off-by to this commit: b3c6dd13cdad451494b71cc55acd27b81dbb9157Signed-off-by: Raul Martinez <raul.marpa01@gmail.com> Signed-off-by: QuantumRaul <raul.marpa01@gmail.com>
0f1a492 to
f5ef498
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Expands
cudaq.contribinteroperability with two related improvements:from_qasm_str,from_qasm) — pure-Python parser that converts OpenQASM source directly into a CUDA-Q kernel, no Qiskit dependency. Dispatches on theOPENQASM <version>;header; 2.x is handled by_QASM2Translator, 3.x by the_QASM3Translatorsubclass.from_qiskit— a complete dispatch table for theqelib1.inc/stdgates.incgate sets, with a recursive fallback throughInstruction.definitionfor custom and composite gates.Both helpers share a common gate handler table (
_GATE_HANDLERSinqiskit_convert.py) so the two translators stay in lockstep on gate semantics.Motivation
The new native translator removes the dependency for qiskit over OpenQASM translation needs, adds first-class 3.0 support, and keeps
from_qiskitrobust enough to round-trip circuits built with the full Qiskit standard library.Changes
python/cudaq/contrib/qasm_convert.py_QASM2Translatorcovering the fullqelib1.incgate set (Paulis, 1-qubit Clifford, universalu1/u2/u3/u/p/u0, rotations, extended single-qubitsx/sxdg/r, controlled one- and two-qubit gates, swap family, two-qubit parametricsrxx/ryy/rzz/rzx, and multi-qubitccx/ccz/rccx/c3x/c4x/mcx/mcp), plusmeasure,reset,barrier,opaque, and user-definedgateblocks with recursive expansion._QASM3Translator(subclass) adds the 3.0 surface:qubit[N]/bit[N]declarations,c = measure q;assignment, built-inU(θ,φ,λ)and 4-parameterU(θ,φ,λ,γ),gphase(γ), legacy uppercaseCXandI, andinclude "stdgates.inc";. Gate modifiers (ctrl @,negctrl @,inv @,pow(n) @) and classical control / typed-variable declarations will be lately implemented, at the moment raiseNotImplementedErrorwith a clear message_eval_exprbuilt onast.parsewith an allowlist (constantspi/e/tau; standard math functions;+ - * / ** ^and unary+ -), used for gate-parameter expressions and nested custom-gate environments.h q;applies element-wise, mismatched sizes rejected).python/cudaq/contrib/qiskit_convert.pyif/elifdispatch with a single_GATE_HANDLERSdict keyed byoperation.name, covering the full Qiskit standard library.RXX,RYY,RZZ,RZX,ECR,iSWAP,XXPlusYY,XXMinusYY) and multi-qubit gates (CCZ,RCCX/Margolus,MCXvariants,MCP/MCPhase,CSX,CU)._apply_instructiongracefully handles unboundParameterExpressions (returns False so the caller raises a clearValueError) and recursively expands any gate not in the dispatch table throughInstruction.definition.python/cudaq/contrib/__init__.pyfrom_qasm/from_qasm_strentry points alongsidefrom_qiskit.Tests
python/tests/contrib/test_from_qasm.py— unit coverage for the expression evaluator, both QASM 2.0 and 3.0 gate surfaces, register broadcasting, and user-defined gates.python/tests/contrib/test_from_qiskit.py— per-gate tests for the expanded dispatch table.python/tests/contrib/test_roundtrip.py(new) — end-to-end round-trip tests across the three conversion paths (direct QASM, QASM→Qiskit→CUDA-Q, Qiskit→QASM→CUDA-Q), including a consistency cross-check that direct and indirect paths produce the same measurement distributions.