Importación y Exportación OpenQASM
QiliSDK puede conectar Circuit tanto con OpenQASM 2.0 como con OpenQASM 3.0 a través de los siguientes puntos de entrada en qilisdk.utils.openqasm:
OpenQASM 2.0
from_qasm2()— analiza una cadena OpenQASM 2.0 en un Circuit.from_qasm2_file()— lee un archivo.qasm.to_qasm2()— serializa un Circuit a una cadena OpenQASM 2.0.to_qasm2_file()— escribe un archivo.qasm.
OpenQASM 3.0
from_qasm3()— analiza una cadena OpenQASM 3.0 en un Circuit.from_qasm3_file()— lee un archivo.qasm.to_qasm3()— serializa un Circuit a una cadena OpenQASM 3.0.to_qasm3_file()— escribe un archivo.qasm.
La dependencia openqasm3 es opcional; instálela con el extra openqasm:
pip install qilisdk[openqasm]
Inicio rápido
from qilisdk.digital import CNOT, Circuit, H, M
from qilisdk.utils.openqasm import to_qasm2, from_qasm2, to_qasm3, from_qasm3
circuit = Circuit(2)
circuit.add(H(0))
circuit.add(CNOT(0, 1))
circuit.add(M(0, 1))
# OpenQASM 2.0
qasm2_text = to_qasm2(circuit)
print(qasm2_text)
reparsed = from_qasm2(qasm2_text)
# OpenQASM 3.0
qasm3_text = to_qasm3(circuit)
print(qasm3_text)
reparsed = from_qasm3(qasm3_text)
Lectura y escritura de archivos:
from qilisdk.utils.openqasm import to_qasm2_file, from_qasm2_file
from qilisdk.utils.openqasm import to_qasm3_file, from_qasm3_file
to_qasm2_file(circuit, "bell.qasm")
same_circuit = from_qasm2_file("bell.qasm")
to_qasm3_file(circuit, "bell3.qasm")
same_circuit = from_qasm3_file("bell3.qasm")
Características soportadas de OpenQASM 3.0
✅: La característica está totalmente soportada
🟡: La característica está parcialmente soportada, vea la nota para más explicación
❌: La característica no está soportada
Característica OpenQASM 3 |
Soportado |
Notas |
|---|---|---|
comentarios |
✅ |
|
Cadena de versión QASM |
✅ |
|
include |
✅ |
|
nombres unicode |
✅ |
|
qubit |
✅ |
|
bit |
🟡 |
1 |
bool |
🟡 |
1 |
int |
🟡 |
1 |
uint |
🟡 |
1 |
float |
🟡 |
1 |
angle |
🟡 |
1 |
complex |
🟡 |
1 |
const |
✅ |
|
pi/π/tau/τ/euler/ℇ |
✅ |
|
Alias: |
✅ |
|
concatenación de registros |
❌ |
|
conversión de tipo ( |
✅ |
|
duration |
🟡 |
1 |
durationof |
❌ |
|
ns/μs/us/ms/s/dt |
✅ |
|
stretch ( |
🟡 |
1 |
delay |
❌ |
|
barrier |
❌ |
|
box |
❌ |
|
|
✅ |
|
definición de puerta |
🟡 |
1 |
gphase |
❌ |
|
|
✅ |
|
|
🟡 |
1 |
|
✅ |
|
|
🟡 |
1, 2 |
reset |
❌ |
|
measure |
🟡 |
3 |
operaciones de bits |
🟡 |
1 |
operaciones booleanas |
🟡 |
1 |
expresiones aritméticas |
🟡 |
1 |
comparaciones |
🟡 |
1 |
|
🟡 |
1 |
|
🟡 |
1 |
|
🟡 |
1 |
bucles for |
🟡 |
1 |
switch |
🟡 |
1 |
bucles while |
🟡 |
1 |
|
🟡 |
1 |
|
🟡 |
1 |
extern |
❌ |
|
subrutinas def |
🟡 |
1 |
return |
🟡 |
1 |
input |
🟡 |
1 |
output |
❌ |
La lectura de estas construcciones está totalmente soportada, pero las expresiones no se almacenan en el objeto
Circuity no se escribirán al convertir a OpenQASM. Por ejemplo, declararint x = 5;hace quexsea evaluada y usada durante el análisis, pero la declaración de variable no aparecerá en el objeto de circuito resultante ni en ninguna cadena QASM reexportada.pow(k) @solo está soportado cuandokes un entero; se implementa mediante aplicación repetida de la puerta.Las mediciones a mitad de circuito no están soportadas en QiliSDK.