  Quantum assembly languages are machine-independent languages that
traditionally describe quantum computation in the circuit model. Open quantum
assembly language (OpenQASM 2) was proposed as an imperative programming
language for quantum circuits based on earlier QASM dialects. In principle, any
quantum computation could be described using OpenQASM 2, but there is a need to
describe a broader set of circuits beyond the language of qubits and gates. By
examining interactive use cases, we recognize two different timescales of
quantum-classical interactions: real-time classical computations that must be
performed within the coherence times of the qubits, and near-time computations
with less stringent timing. Since the near-time domain is adequately described
by existing programming frameworks, we choose in OpenQASM 3 to focus on the
real-time domain, which must be more tightly coupled to the execution of
quantum operations. We add support for arbitrary control flow as well as
calling external classical functions. In addition, we recognize the need to
describe circuits at multiple levels of specificity, and therefore we extend
the language to include timing, pulse control, and gate modifiers. These new
language features create a multi-level intermediate representation for circuit
development and optimization, as well as control sequence implementation for
calibration, characterization, and error mitigation.
