Paradigms: | --> |
Designers: | --> |
Developers: | --> |
Year: | --> |
License: | Apache License 2.0 |
File Ext: | .qasm |
Open Quantum Assembly Language (OpenQASM; pronounced open kazm[1]) is a programming language designed for describing quantum circuits and algorithms for execution on quantum computers. It is designed to be an intermediate representation that can be used by higher-level compilers to communicate with quantum hardware, and allows for the description of a wide range of quantum operations, as well as classical feed-forward flow control based on measurement outcomes.
The language includes a mechanism for describing explicit timing of instructions, and allows for the attachment of low-level definitions to gates for tasks such as calibration.[1] OpenQASM is not intended for general-purpose classical computation, and hardware implementations of the language may not support the full range of data manipulation described in the specification. Compilers for OpenQASM are expected to support a wide range of classical operations for compile-time constants, but the support for these operations on runtime values may vary between implementations.[2]
The language was first described in a paper published in July 2017,[1] and a reference source code implementation was released as part of IBM's Quantum Information Software Kit (Qiskit) for use with their IBM Quantum Experience cloud quantum computing platform. The language has similar qualities to traditional hardware description languages such as Verilog.
OpenQASM defines its version at the head of a source file as a number, as in the declaration:
The level of OpenQASM's original published implementations is OpenQASM 2.0. Version 3.0 of the specification is the current one and can be viewed at the OpenQASM repository on GitHub.
The following is an example of OpenQASM source code from the official library. The program adds two four-bit numbers.[3]
gate majority a, b, c
gate unmaj a, b, c
qubit[1] cin;qubit[4] a;qubit[4] b;qubit[1] cout;bit[5] ans;uint[4] a_in = 1; // a = 0001uint[4] b_in = 15; // b = 1111// initialize qubitsreset cin;reset a;reset b;reset cout;
// set input statesfor i in [0: 3] // add a to b, storing result in bmajority cin[0], b[0], a[0];for i in [0: 2] cx a[3], cout[0];for i in [2: -1: 0] unmaj cin[0], b[0], a[0];measure b[0:3] -> ans[0:3];measure cout[0] -> ans[4];