OpenQASM Exporter

The ParityOS package offers exporters for quantum circuits to OpenQASM 3.0. Exporters for other frameworks are available as separate extension packages.

from parityos.bits import Cbit, Qubit
from parityos.exporters.openqasm_exporter import export_parityos_to_qasm3
from parityos.operators import Circuit
from parityos.operators.controlled_operator import CNOT
from parityos.operators.elementary_operator import H, Z
from parityos.operators.rotation_operator import RX

# Create circuit qubits.
qubits = [Qubit(name) for name in ("a", "b", "c")]

# Create the following circuit as sequence of gates, followed by a measurement of all qubits.
#     ┌───────┐┌───┐┌───┐   ┌─┐
# qa: ┤ Rx(2) ├┤ H ├┤ Z ├───┤M├
#     └───────┘├───┤└┬─┬┘   └╥┘
# qb: ─────────┤ X ├─┤M├─────╫─
#       ┌───┐  └─┬─┘ └╥┘ ┌─┐ ║
# qc: ──┤ H ├────■────╫──┤M├─╫─
#       └───┘         ║  └╥┘ ║
# c: 3/═══════════════╩═══╩══╩═
#                     1   2  0
circuit = Circuit(
    [
        RX(qubits[0], 2),
        H(qubits[0]),
        H(qubits[2]),
        CNOT(qubits[2], qubits[1]),
        Z(qubits[0]),
    ]
).measure_all()

# Export to OpenQASM 3.0.
qasm3_circuit = export_parityos_to_qasm3(circuit)
expected = """
OPENQASM 3;
include "stdgates.inc";
// Circuit generated by ParityOS.

qubit q_a;
qubit q_b;
qubit q_c;
bit c_0;
bit c_1;
bit c_2;

rx(2) q_a;
h q_a;
h q_c;
cx q_c, q_b;
z q_a;
measure q_a -> c_0;
measure q_b -> c_1;
measure q_c -> c_2;
"""

assert qasm3_circuit.circuit == expected
assert qasm3_circuit.qubit_map == {Qubit("c"): "q_c", Qubit("b"): "q_b", Qubit("a"): "q_a"}
assert qasm3_circuit.cbit_map == {Cbit(2): "c_2", Cbit(0): "c_0", Cbit(1): "c_1"}