Tabel de funcționalități OpenQASM 3
Mai jos se află o listă a funcționalităților limbajului OpenQASM 3.
Pentru mai multe detalii despre aceste capabilități, consultă Specificația Live OpenQASM 3.X.
Legendă:
-
❌ Nesuportat
-
🟡 Suport parțial
-
✅ Suportat
Semnificația marcajului „suportat" complet depinde de coloană:
-
Qiskit SDK: Funcționalitatea poate fi parsată de
qiskit.qasm3.loads(folosind extensiaqiskit-qasm3-import), reprezentată într-unQuantumCircuit, și exportată în OpenQASM 3 deqiskit.qasm3.dumps. -
IBM Quantum Compute Service: Un circuit care conține funcționalitatea Qiskit corespunzătoare poate fi executat cu succes pe hardware prin IBM Quantum Compute Service.
Semnificația „suportului parțial" depinde de obicei de notele legate.
Cea mai frecventă metodă de a trimite circuite către IBM Quantum Compute Service este să creezi Circuit-ul în interfața Python din Qiskit SDK. Circuitele construite și trimise în acest mod nu trebuie încărcate din fișiere OpenQASM 3 în Qiskit SDK.
Dacă nu folosești OpenQASM 3 direct, poți utiliza în siguranță funcționalitățile care sunt suportate pentru reprezentare în Qiskit SDK, export în OpenQASM 3 și trimitere către IBM Quantum Compute Service. Aceasta include funcționalitățile care nu pot fi încărcate de Qiskit SDK din OpenQASM 3.
| OpenQASM 3 Feature | Qiskit SDK feature | Qiskit SDK | IBM Quantum Compute Service | Notes |
|---|---|---|---|---|
| comments | ✅ | ✅ | 1 | |
| QASM vstring | ✅ | ✅ | 1 | |
include | 🟡 | ❌ | 1, 7 | |
| unicode names | ✅ | ✅ | ||
qubit | Qubit and QuantumRegister | ✅ | 🟡 | 2 |
bit | Clbit and ClassicalRegister | ✅ | ✅ | 3 |
bool | expr.Var and classical expressions | 🟡 | ✅ | 4 |
int | ❌ | ✅ | 4 | |
uint | expr.Var and classical expressions | 🟡 | ✅ | 4 |
float | expr.Var and classical expressions | 🟡 | 🟡 | 4 |
angle | Implicit, as gate parameters | ❌ | 🟡 | 4 |
complex | ❌ | ❌ | 4 | |
const | ❌ | ❌ | 4 | |
pi/π/tau/τ/euler/ℇ | Constant-folded into gate parameters | ✅ | ✅ | |
| Aliasing: let | Quantum and classical registers | 🟡 | ❌ | 5 |
| register concatenation | Quantum and classical registers | 🟡 | ❌ | 5 |
| casting | expr.Cast classical expressions | 🟡 | 🟡 | 4 |
duration | ❌ | ❌ | ||
durationof | ❌ | ❌ | ||
ns/µs/us/ms/s/dt | Durations of delay and box | ✅ | ✅ | 6 |
stretch | expr.Stretch | 🟡 | 🟡 | 4, 6 |
delay | Delay/QuantumCircuit.delay | ✅ | ✅ | 6 |
barrier | Barrier/QuantumCircuit.barrier | ✅ | ✅ | |
box | BoxOp/QuantumCircuit.box | ✅ | ❌ | 6 |
Built-in U | UGate/QuantumCircuit.u | ✅ | ✅ | |
gate | 🟡 | 🟡 | 7 | |
gphase | QuantumCircuit.global_phase | 🟡 | ❌ | 7 |
ctrl @/ negctrl @ | AnnotatedOperation | 🟡 | ❌ | 7 |
inv @ | AnnotatedOperation | 🟡 | ❌ | 7 |
pow(k) @ | AnnotatedOperation | 🟡 | ❌ | 7 |
reset | Reset/QuantumCircuit.reset | ✅ | ✅ | |
measure | Measure/QuantumCircuit.measure | ✅ | ✅ | |
| bit operations | 🟡 | ✅ | 4 | |
| boolean operations | 🟡 | ✅ | 4 | |
| arithmetic expressions | 🟡 | 🟡 | 4 | |
| comparisons | 🟡 | ✅ | 4 | |
if | QuantumCircuit.if_test | ✅ | ✅ | 8 |
else | QuantumCircuit.if_test | ✅ | ✅ | 8 |
else if | QuantumCircuit.if_test | ✅ | ❌ | 8 |
for loops | QuantumCircuit.for_loop | 🟡 | ❌ | 8 |
while loops | QuantumCircuit.while_loop | ✅ | ❌ | 8 |
continue | QuantumCircuit.continue_loop | 🟡 | ❌ | 8 |
break | QuantumCircuit.break_loop | 🟡 | ❌ | 8 |
return | ❌ | ❌ | ||
extern | ❌ | ❌ | ||
def subroutines (classical) | ❌ | ❌ | ||
def subroutines (quantum) | ❌ | ❌ | ||
input | QuantumCircuit.add_input | ✅ | 🟡 | 4, 9 |
output | ❌ | ❌ |
Note
- Aceste funcționalități ale programelor OpenQASM 3 nu au niciun impact asupra execuției, iar Qiskit le elimină
ca parte a parsării fișierelor. Fișierele care le folosesc pot fi trimise, dar nu vor avea
niciun efect. Pentru fișierele
include,stdgates.inceste suportat în prezent ca intrare în Qiskit, iar execuția pe Backend necesită întotdeauna ca circuitele să fi fost compilate conform Arhitecturii de Set de Instrucțiuni (ISA) a Backend-ului, unde fișiereleincludesunt irelevante.
- Qiskit SDK suportă parsarea și exportul fișierelor OpenQASM 3 cu orice declarații
qubit. Pentru execuția pe hardware, doar circuitele definite în termeni de qubiți hardware (de exemplu,$0) sunt valide. Qiskit SDK generează automat OpenQASM 3 în termenii identificatorilor de qubiți hardware suportați, dacă Circuit-ul a fost transpilat pentru un Backend cu informații de layout.
- Declarațiile de variabile de tip
bitșibit[n]în Qiskit SDK corespund declarațiilorClbitșiClassicalRegister.
- Începând cu iulie 2025, Qiskit SDK poate reprezenta variabile locale dintr-un set restrâns de tipuri, poate
reprezenta multe operații la runtime pe aceste obiecte și suportă exportul lor în OpenQASM 3.
Totuși, Qiskit SDK (prin
qiskit-qasm3-importv0.6.0) nu suportă parsarea fișierelor OpenQASM 3 care conțin declarații de variabile și are suport foarte limitat pentru parsarea expresiilor cu variabile. În general, cea mai mare parte din ceea ce Qiskit poate reprezenta în sistemul său de expresii poate fi executat pe hardware adecvat cu circuite dinamice, chiar dacă expresia nu poate fi încă parsată de Qiskit SDK. Consultă documentația Qiskit a modululuiqiskit.circuit.classicalpentru cele mai actualizate informații.
- Qiskit SDK poate reprezenta aliasul de registre atât pentru registrele cuantice, cât și pentru cele clasice, dar este
puternic descurajat să se folosească aliasul registrelor clasice. Majoritatea expresiilor pe registre clasice
nu funcționează cu aliasuri, iar registrele clasice cu alias nu sunt suportate pentru
execuția pe hardware. Parser-ul OpenQASM 3 din Qiskit poate rezolva instrucțiunile de alias
letcare leagă rezultatul concatenării de registre.
- Qiskit SDK suportă întârzieri explicite prin
QuantumCircuit.delay, iar casetele de circuit (QuantumCircuit.box) pot avea și ele durate explicite. Aceste durate pot include expresii clasice ale variabilelorstretch. Qiskit SDK (începând cu iulie 2025, prinqiskit-qasm3-importv0.6.0) nu suportă parsarea declarațiilor de tipdurationsaustretchdin fișiere OpenQASM 3. Hardware-ul are suport limitat pentru durate care includstretch.
- Circuitele trebuie transpilate conform ISA-ului Backend-ului pentru a rula pe hardware IBM. Aceasta exclude
definițiile personalizate de
gateși constructele de nivel superior, cum ar fi modificatorii de poartă (precuminv @), din a fi valide pentru execuția pe hardware verbatim, dar procesultranspilele rezolvă în circuite ISA valide. Qiskit SDK (începând cu iulie 2025, prinqiskit-qasm3-importv0.6.0) va evalua cu anticipare modificatorii de poartă în timpul parsării, astfel că aceștia nu vor fi vizibili înQuantumCircuit-ul rezultat, potențial cu un cost la runtime.
- Qiskit SDK poate reprezenta fluxul de control structurat și îl poate exporta în OpenQASM 3. Instrucțiunile
continueșibreakpot fi tehnic reprezentate de Qiskit, dar nu sunt bine suportate nici în cadrul Qiskit SDK. Bucleleforîn Qiskit v2.1.0 nu sunt bine suportate. Fluxul de control imbricat (cum ar fi unifîn interiorul altuiif, sau o instrucțiuneelse if) nu este eligibil pentru execuție pe hardware.
- Qiskit SDK suportă declararea oricărui tip clasic suportat ca variabilă
inputpe circuit. Astfel de variabile nu sunt eligibile în prezent pentru execuția pe hardware și nu pot fi încărcate de importatorul OpenQASM 3 din Qiskit. ObiecteleParameterneasociate prezente înQuantumCircuitsunt exportate ca variabileinput float[64]. Anumite opțiuni de configurare la runtime pot permite executarea unor astfel de circuite pe anumite Backend-uri.
Pași următori
- Află cum să generezi cod OpenQASM folosind IBM Quantum Composer.
- Consultă referința OpenQASM 3 Qiskit API.
- Consultă referința OpenQASM 2 Qiskit API.
- Consultă subiectul Verifică-ți programul.
- Vizitează OpenQASM Live Specification.