Interop¶
QuantSDK circuits can be seamlessly converted to and from other quantum frameworks — enabling you to leverage existing tooling while staying framework-agnostic.
Supported Frameworks¶
| Framework | Import | Export | Status |
|---|---|---|---|
| Qiskit | Available | ||
| OpenQASM 2.0 | Available | ||
| Cirq | v0.2 | ||
| PennyLane | v0.2 |
Quick Usage¶
Via Circuit Convenience Methods¶
import quantsdk as qs
circuit = qs.Circuit(2).h(0).cx(0, 1).measure_all()
# Export
qc = circuit.to_qiskit() # -> qiskit.QuantumCircuit
qasm = circuit.to_openqasm() # -> str (OpenQASM 2.0)
# Import
circuit2 = qs.Circuit.from_qiskit(qc)
circuit3 = qs.Circuit.from_openqasm(qasm)
Via Interop Module¶
from quantsdk.interop import to_qiskit, from_qiskit, to_openqasm, from_openqasm
# Export
qc = to_qiskit(circuit)
qasm_str = to_openqasm(circuit)
# Import
circuit = from_qiskit(qc)
circuit = from_openqasm(qasm_str)
Qiskit Interop¶
to_qiskit¶
to_qiskit
¶
to_qiskit(circuit: Circuit) -> QuantumCircuit
Convert a QuantSDK Circuit to a Qiskit QuantumCircuit.
| PARAMETER | DESCRIPTION |
|---|---|
circuit
|
The QuantSDK circuit to convert.
TYPE:
|
| RETURNS | DESCRIPTION |
|---|---|
QuantumCircuit
|
A Qiskit QuantumCircuit equivalent. |
| RAISES | DESCRIPTION |
|---|---|
ImportError
|
If qiskit is not installed. |
Example::
import quantsdk as qs
from quantsdk.interop import to_qiskit
circuit = qs.Circuit(2)
circuit.h(0).cx(0, 1).measure_all()
qiskit_circuit = to_qiskit(circuit)
print(qiskit_circuit)
from_qiskit¶
from_qiskit
¶
from_qiskit(qiskit_circuit: QuantumCircuit) -> Circuit
Convert a Qiskit QuantumCircuit to a QuantSDK Circuit.
| PARAMETER | DESCRIPTION |
|---|---|
qiskit_circuit
|
The Qiskit circuit to convert.
TYPE:
|
| RETURNS | DESCRIPTION |
|---|---|
Circuit
|
A QuantSDK Circuit equivalent. |
| RAISES | DESCRIPTION |
|---|---|
ImportError
|
If qiskit is not installed. |
ValueError
|
If the Qiskit circuit contains unsupported gates. |
Example::
from qiskit.circuit import QuantumCircuit
from quantsdk.interop import from_qiskit
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
qc.measure_all()
circuit = from_qiskit(qc)
print(circuit.draw())
Gate Mapping¶
All 50+ QuantSDK gates are mapped to their Qiskit equivalents:
| QuantSDK | Qiskit |
|---|---|
HGate |
qiskit.circuit.library.HGate |
CXGate |
qiskit.circuit.library.CXGate |
RZGate(theta) |
qiskit.circuit.library.RZGate(theta) |
ToffoliGate |
qiskit.circuit.library.CCXGate |
| ... | ... |
OpenQASM Interop¶
to_openqasm¶
to_openqasm
¶
to_openqasm(circuit: Circuit) -> str
Export a QuantSDK Circuit as an OpenQASM 2.0 string.
| PARAMETER | DESCRIPTION |
|---|---|
circuit
|
The QuantSDK circuit to convert.
TYPE:
|
| RETURNS | DESCRIPTION |
|---|---|
str
|
An OpenQASM 2.0 compliant string. |
Example::
import quantsdk as qs
from quantsdk.interop import to_openqasm
circuit = qs.Circuit(2)
circuit.h(0).cx(0, 1).measure_all()
qasm_str = to_openqasm(circuit)
print(qasm_str)
from_openqasm¶
from_openqasm
¶
from_openqasm(qasm_str: str) -> Circuit
Parse an OpenQASM 2.0 string into a QuantSDK Circuit.
| PARAMETER | DESCRIPTION |
|---|---|
qasm_str
|
An OpenQASM 2.0 compliant string.
TYPE:
|
| RETURNS | DESCRIPTION |
|---|---|
Circuit
|
A QuantSDK Circuit. |
| RAISES | DESCRIPTION |
|---|---|
ValueError
|
If the QASM string is malformed or contains unsupported gates. |
Example::
from quantsdk.interop import from_openqasm
qasm = '''
OPENQASM 2.0;
include "qelib1.inc";
qreg q[2];
creg c[2];
h q[0];
cx q[0],q[1];
measure q[0] -> c[0];
measure q[1] -> c[1];
'''
circuit = from_openqasm(qasm)
print(circuit.draw())
Supported QASM Gates¶
The OpenQASM exporter supports all standard qelib1.inc gates plus custom
gate definitions for QuantSDK-specific gates.
OPENQASM 2.0;
include "qelib1.inc";
qreg q[2];
creg c[2];
h q[0];
cx q[0],q[1];
measure q[0] -> c[0];
measure q[1] -> c[1];
Notes¶
- Qiskit interop requires
pip install quantsdk[interop](orquantsdk[ibm]) - OpenQASM interop requires
pip install quantsdk[interop](uses Qiskit's QASM parser for import) - Gate parameters (rotation angles) are preserved exactly during round-trips
- Measurement mappings are preserved during conversion
- Circuit names are carried over when available