Source code for qarp.absorb._qasm3_absorber
"""QASM3 absorber: QASM3 string → QARPx SimpleBlock.
Wraps the C++ ``qx.QASM3Absorber`` (``cpp/libqarpx/src/absorb/qasm3_absorber.cpp``).
Round-trip invariant:
qasm = qx.QASM3Emitter().emit(cmds, n)
assert qx.QASM3Emitter().emit(QASM3Absorber().absorb(qasm).flatten(), n) == qasm
"""
from __future__ import annotations
import re
from ._reconstruct import build_block
[docs]
class QASM3Absorber:
[docs]
def source_name(self) -> str:
return "qasm3"
[docs]
def absorb(self, qasm3_source: str):
import qarpx as qx
m = re.match(r"^//\s*(\S+)", qasm3_source.lstrip())
circuit_name = m.group(1) if m else "Circuit"
try:
commands, n_qubits, n_cbits, _ = qx.QASM3Absorber().absorb(qasm3_source)
except RuntimeError as e:
raise RuntimeError(f"QASM3Absorber: parse error: {e}") from e
return build_block(commands, n_qubits, n_cbits, name=circuit_name)