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 기능을 포함하는 회로가 IBM® Qiskit Runtime을 통해 하드웨어에서 성공적으로 실행될 수 있습니다.
"부분 지원"의 의미는 일반적으로 연결된 참고사항에 따라 다릅니다.
참고
IBM Qiskit Runtime에 회로를 제출하는 가장 일반적인 방법은 Qiskit SDK의 Python 공간 인터페이스에서 회로를 만드는 것입니다. 이러한 방식으로 구성되고 제출된 회로는 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 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 | ❌ | ❌ |
참고사항
- 이러한 OpenQASM 3 프로그램 기능은 실행에 영향을 주지 않으며 Qiskit은 파일을
파싱하는 과정에서 이를 제거합니다. 이를 사용하는 파일은 제출될 수 있으나
아무런 효과가 없습니다.
include파일의 경우,stdgates.inc가 현재 Qiskit의 입력으로 지원되며, 백엔드 실행은 항상 백엔드 명령어 집합 아키텍처(ISA)로 컴파일된 회로를 필요로 합니다. 이때include파일은 관련이 없습니다.
- Qiskit SDK는 어떤
qubit선언이든 OpenQASM 3 파일의 파싱 및 덤프를 지원합니다. 하드웨어 실행의 경우, 하드웨어 qubit(예:$0)으로 정의된 회로만 유효합니다. 레이아웃 정보가 있는 백엔드용으로 회로가 트랜스파일된 경우, Qiskit SDK는 지원되는 하드웨어-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에서 아직 파싱할 수 없는 경우에도 그렇습니다. 최신 정보는 Qiskit 문서의qiskit.circuit.classical모듈을 참고하세요.
- Qiskit SDK는 양자 및 고전 레지스터 모두에 대해 레지스터 별칭을 표현할 수 있으나, 고전
레지스터의 별칭 사용은 강력히 권장되지 않습니다. 고전 레지스터에 대한 대부분의 표현식은
별칭과 함께 작동하지 않으며, 별칭된 고전 레지스터는 하드웨어에서 실행이 지원되지 않습니다.
Qiskit OpenQASM 3 파서는 레지스터 연결 결과를 바인딩하는
let별칭 문을 해석할 수 있습니다.
- Qiskit SDK는
QuantumCircuit.delay를 통한 명시적 지연을 지원하며, 회로 박스 (QuantumCircuit.box)도 명시적 지속 시간을 가질 수 있습니다. 이러한 지속 시간은stretch변수의 고전 표현식을 포함할 수 있습니다. Qiskit SDK는 (2025년 7월 기준,qiskit-qasm3-importv0.6.0을 통해) OpenQASM 3 파일에서duration또는stretch유형의 선언을 파싱하는 것을 지원하지 않습니다. 하드웨어는stretch를 포함한 지속 시간에 대해 제한된 지원을 제공합니다.
- 회로는 IBM 하드웨어에서 실행하려면 백엔드 ISA로 트랜스파일되어야 합니다. 이로 인해
사용자 정의
gate정의와 같은 상위 수준 구성(예:inv @와 같은 게이트 수정자)이 하드웨어에서 원본 그대로 실행하기에는 유효하지 않지만,transpile프로세스는 이를 유효한 ISA 회로로 해석합니다. Qiskit SDK는 (2025년 7월 기준,qiskit-qasm3-importv0.6.0을 통해) 파싱 중에 게이트 수정자를 적극적으로 평가하므로, 이들은 결과QuantumCircuit에 나타나지 않을 수 있으며, 이는 잠재적으로 런타임 비용을 수반합니다.
- Qiskit SDK는 구조화된 제어 흐름을 표현할 수 있으며 이를 OpenQASM 3로 내보낼 수 있습니다.
continue와break문은 기술적으로 Qiskit에서 표현할 수 있지만, Qiskit SDK 내에서도 잘 지원되지 않습니다. Qiskit v2.1.0의for루프는 잘 지원되지 않습니다. 중첩된 제어 흐름(예: 다른if내의if또는else if문)은 하드웨어에서 실행할 수 있는 자격이 없습니다.
- Qiskit SDK는 지원되는 모든 고전 유형을 회로의
input변수로 선언하는 것을 지원합니다. 이러한 변수는 현재 하드웨어에서 실행할 수 있는 자격이 없으며, Qiskit OpenQASM 3 임포터에서 로드할 수 없습니다.QuantumCircuit에 있는 바인딩되지 않은Parameter객체는input float[64]변수로 내보내집니다. 특정 런타임 구성 옵션은 일부 백엔드에서 이러한 회로의 실행을 활성화할 수 있습니다.
다음 단계
권장 사항
- IBM Quantum Composer를 사용하여 OpenQASM 코드를 생성하는 방법을 알아보세요.
- OpenQASM 3 Qiskit API 참조를 참고하세요.
- OpenQASM 2 Qiskit API 참조를 참고하세요.
- 프로그램 검증 주제를 살펴보세요.
- OpenQASM Live Specification을 방문하세요.