Skip to content

QASM Export

quanta.export.qasm

quanta.export.qasm — OpenQASM 3.0 circuit export.

Example

from quanta.export.qasm import to_qasm print(to_qasm(bell_state)) OPENQASM 3.0; include "stdgates.inc"; qubit[2] q; bit[2] c; h q[0]; cx q[0], q[1]; c = measure q;

from_qasm_gates

from_qasm_gates(
    qasm_str: str,
) -> list[tuple[str, tuple[int, ...]]]

Extracts gate list from QASM string (simple parser).

Parameters:

Name Type Description Default
qasm_str str

OpenQASM 3.0 string'i.

required

Returns:

Source code in quanta/export/qasm.py
def from_qasm_gates(qasm_str: str) -> list[tuple[str, tuple[int, ...]]]:
    """Extracts gate list from QASM string (simple parser).


    Args:
        qasm_str: OpenQASM 3.0 string'i.

    Returns:
    """
    reverse_map = {v: k for k, v in _QASM_GATE_MAP.items()}
    gates: list[tuple[str, tuple[int, ...]]] = []

    for line in qasm_str.strip().split("\n"):
        line = line.strip().rstrip(";")

        if not line or line.startswith(("OPENQASM", "include", "qubit", "bit", "//")):
            continue
        if line.startswith("c[") or line.startswith("measure"):
            continue

        parts = line.split()
        if not parts:
            continue

        gate_name_raw = parts[0].split("(")[0]  # clean parametric gates
        quanta_name = reverse_map.get(gate_name_raw, gate_name_raw.upper())

        qubit_str = " ".join(parts[1:])
        import re
        qubit_indices = re.findall(r"q\[(\d+)\]", qubit_str)
        qubits = tuple(int(idx) for idx in qubit_indices)

        gates.append((quanta_name, qubits))

    return gates

to_qasm

to_qasm(circuit: CircuitDefinition) -> str

Converts circuit to OpenQASM 3.0 format.

Parameters:

Name Type Description Default
circuit CircuitDefinition

Circuit defined with @circuit.

required

Returns:

Type Description
str

OpenQASM 3.0 string'i.

Raises:

Source code in quanta/export/qasm.py
def to_qasm(circuit: CircuitDefinition) -> str:
    """Converts circuit to OpenQASM 3.0 format.

    Args:
        circuit: Circuit defined with @circuit.

    Returns:
        OpenQASM 3.0 string'i.

    Raises:
    """
    builder = circuit.build()
    dag = DAGCircuit.from_builder(builder)

    lines: list[str] = []

    lines.append("OPENQASM 3.0;")
    lines.append('include "stdgates.inc";')
    lines.append("")

    lines.append(f"qubit[{dag.num_qubits}] q;")

    has_measure = builder.measurement is not None
    if has_measure:
        measured = (
            builder.measurement.qubits
            if builder.measurement.qubits
            else tuple(range(dag.num_qubits))
        )
        lines.append(f"bit[{len(measured)}] c;")

    lines.append("")

    for op in dag.op_nodes():
        qasm_line = _op_to_qasm(op, dag.num_qubits)
        lines.append(qasm_line)

    if has_measure:
        lines.append("")
        measured = (
            builder.measurement.qubits
            if builder.measurement.qubits
            else tuple(range(dag.num_qubits))
        )
        for i, q in enumerate(measured):
            lines.append(f"c[{i}] = measure q[{q}];")

    lines.append("")
    return "\n".join(lines)