OpenQASM 3 機能テーブル
以下は OpenQASM 3 の言語機能のリストです。
これらの機能の詳細については、OpenQASM 3.X Live Specification を参照してください。
キー:
- ❌ サポートなし
- 🟡 部分的サポート
- ✅ サポート済み
「サポート済み」マークの意味は列によって異なります:
-
Qiskit SDK: この機能は
qiskit.qasm3.loads(qiskit-qasm3-import拡張機能を使用)でパースでき、QuantumCircuitで表現でき、qiskit.qasm3.dumpsで OpenQASM 3 にエクスポートできます。 -
IBM Qiskit Runtime: 対応する Qiskit 機能を含む Circuit を、IBM® Qiskit Runtime を通じてハードウェア上で正常に実行できます。
「部分的サポート」の意味は、通常、リンクされた注釈に依存します。
備考
IBM Qiskit Runtime に Circuit を送信する最も一般的な方法は、Qiskit SDK の Python インターフェースで Circuit を作成することです。 この方法で作成・送信された Circuit は、OpenQASM 3 ファイルから Qiskit SDK に読み込む必要はありません。
OpenQASM 3 を直接使用しない場合は、Qiskit SDK での表現、OpenQASM 3 へのエクスポート、IBM Qiskit Runtime への送信がサポートされている機能を安全に使用できます。 これには、Qiskit SDK が OpenQASM 3 から読み込めない機能も含まれます。
| OpenQASM 3 機能 | Qiskit SDK 機能 | Qiskit SDK | IBM Qiskit Runtime | 注釈 |
|---|---|---|---|---|
| comments | ✅ | ✅ | 1 | |
| QASM vstring | ✅ | ✅ | 1 | |
include | 🟡 | ❌ | 1, 7 | |
| unicode names | ✅ | ✅ | ||
qubit | qubit と QuantumRegister | ✅ | 🟡 | 2 |
bit | Clbit と ClassicalRegister | ✅ | ✅ | 3 |
bool | expr.Var と古典式 | 🟡 | ✅ | 4 |
int | ❌ | ✅ | 4 | |
uint | expr.Var と古典式 | 🟡 | ✅ | 4 |
float | expr.Var と古典式 | 🟡 | 🟡 | 4 |
angle | 暗黙的、Gate パラメータとして | ❌ | 🟡 | 4 |
complex | ❌ | ❌ | 4 | |
const | ❌ | ❌ | 4 | |
pi/π/tau/τ/euler/ℇ | Gate パラメータに定数畳み込み | ✅ | ✅ | |
| Aliasing: let | 量子レジスタと古典レジスタ | 🟡 | ❌ | 5 |
| register concatenation | 量子レジスタと古典レジスタ | 🟡 | ❌ | 5 |
| casting | expr.Cast 古典式 | 🟡 | 🟡 | 4 |
duration | ❌ | ❌ | ||
durationof | ❌ | ❌ | ||
ns/µs/us/ms/s/dt | delay と 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 | ❌ | ❌ |
注釈
- これらの OpenQASM 3 プログラム機能は実行に影響を与えず、Qiskit はファイルのパース時にこれらを
除去します。これらを使用するファイルは送信できますが、効果はありません。
includeファイルについては、stdgates.incが現在 Qiskit への入力としてサポートされており、Backend での実行では常に Circuit が Backend の命令セットアーキテクチャ(ISA)にコンパイルされている必要があり、includeファイルは関係ありません。
- Qiskit SDK は、任意の
qubit宣言を含む OpenQASM 3 ファイルのパースとダンプをサポートしています。 ハードウェアでの実行には、ハードウェア qubit(例:$0)で定義された Circuit のみが有効です。 Qiskit SDK は、Circuit がレイアウト情報を持つ Backend 向けにトランスパイルされた場合、 サポートされているハードウェア qubit 識別子で OpenQASM 3 を自動的に出力します。
- Qiskit SDK での
bit型およびbit[n]型の変数宣言は、ClbitおよびClassicalRegisterの宣言に対応します。
- 2025年7月時点で、Qiskit SDK は制限された型のセットのローカル変数を表現でき、
これらのオブジェクトに対する多くのランタイム操作を表現でき、OpenQASM 3 への出力をサポートしています。
ただし、Qiskit SDK(
qiskit-qasm3-importv0.6.0 を通じて)は変数宣言を含む OpenQASM 3 ファイルのパースをサポートしておらず、変数式のパースに対するサポートは非常に限られています。 一般的に、Qiskit が式システムで表現できるものの大部分は、式がまだ Qiskit SDK でパースできない場合でも、 適切な動的 Circuit ハードウェアで実行できます。最新の情報については、 Qiskit のqiskit.circuit.classicalモジュールのドキュメントを参照してください。
- Qiskit SDK は量子レジスタと古典レジスタの両方でレジスタのエイリアシングを表現できますが、
古典レジスタのエイリアシングの使用は強く推奨されません。古典レジスタに対するほとんどの式は
エイリアスでは機能せず、エイリアスされた古典レジスタはハードウェアでの実行にサポートされていません。
Qiskit の OpenQASM 3 パーサーは、レジスタの連結結果をバインドする
letエイリアス文を解決できます。
- Qiskit SDK は
QuantumCircuit.delayによる明示的な遅延をサポートしており、Circuit boxes (QuantumCircuit.box)にも明示的な持続時間を設定できます。これらの持続時間にはstretch変数の 古典式を含めることができます。Qiskit SDK(2025年7月時点、qiskit-qasm3-importv0.6.0 を通じて)は、OpenQASM 3 ファイルからのduration型またはstretch型の宣言のパースを サポートしていません。ハードウェアはstretchを含む持続時間に対して限定的なサポートがあります。
- IBM ハードウェアで実行するには、Circuit を Backend の ISA にトランスパイルする必要があります。これにより、
カスタム
gate定義や Gate 修飾子(inv @など)のような高レベルの構造は ハードウェア上でそのまま実行することはできませんが、transpileプロセスがこれらを 有効な ISA Circuit に解決します。Qiskit SDK(2025年7月時点、qiskit-qasm3-importv0.6.0 を通じて)はパース時に Gate 修飾子を即座に評価するため、結果のQuantumCircuitには 表示されず、実行時のコストが発生する可能性があります。
- Qiskit SDK は構造化された制御フローを表現し、OpenQASM 3 にエクスポートできます。
continue文とbreak文は技術的に Qiskit で表現できますが、Qiskit SDK 内でも十分にサポートされていません。 Qiskit v2.1.0 のforループは 十分にサポートされていません。ネストされた制御フロー (別のif内のifやelse if文など)はハードウェアでの実行の対象外です。
- Qiskit SDK は、サポートされている任意の古典型を Circuit の
input変数として宣言することをサポートしています。 このような変数は現在ハードウェアでの実行の対象外であり、Qiskit の OpenQASM 3 インポーターで読み込むことも できません。QuantumCircuitに存在する未バインドのParameterオブジェクトはinput float[64]変数としてエクスポートされます。特定のランタイム設定オプションにより、一部の Backend でこのような Circuit を実行できる場合があります。
次のステップ
推奨事項
- IBM Quantum Composer を使用して OpenQASM コードを生成する方法を学びましょう。
- OpenQASM 3 Qiskit API リファレンスを参照してください。
- OpenQASM 2 Qiskit API リファレンスを参照してください。
- Review the Verify your program topic.
- プログラムの検証のトピックを確認してください。
- OpenQASM Live Specification にアクセスしてください。