qml.to_openqasm¶
- to_openqasm(circuit, wires=None, rotations=True, measure_all=True, precision=None)[source]¶
Convert a circuit to an OpenQASM 2.0 program.
Terminal measurements are assumed to be performed on all qubits in the computational basis. An optional
rotations
argument can be provided so that the output of the OpenQASM circuit is diagonal in the eigenbasis of the quantum circuit’s observables. The measurement outputs can be restricted to only those specified in the circuit by settingmeasure_all=False
.- Parameters:
circuit (QNode or QuantumScript) – the quantum circuit to be serialized.
wires (Wires or None) – the wires to use when serializing the circuit. Default is
None
, such that all the wires of the circuit are used for serialization.rotations (bool) – if
True
, add gates that diagonalize the measured wires to the eigenbasis of the circuit’s observables. Default isTrue
.measure_all (bool) – if
True
, add a computational basis measurement on all the qubits. Default isTrue
.precision (int or None) – number of decimal digits to display for the parameters.
- Returns:
OpenQASM 2.0 program corresponding to the circuit.
- Return type:
str
Example
The following QNode can be serialized to an OpenQASM 2.0 program:
dev = qml.device("default.qubit", wires=2) @qml.qnode(dev) def circuit(theta, phi): qml.RX(theta, wires=0) qml.CNOT(wires=[0,1]) qml.RZ(phi, wires=1) return qml.sample()
>>> print(qml.to_openqasm(circuit)(1.2, 0.9)) OPENQASM 2.0; include "qelib1.inc"; qreg q[2]; creg c[2]; rx(1.2) q[0]; cx q[0],q[1]; rz(0.9) q[1]; measure q[0] -> c[0]; measure q[1] -> c[1];
Usage Details
By default, the resulting OpenQASM code will have terminal measurements on all qubits, where all the measurements are performed in the computational basis. However, if terminal measurements in the circuit act only on a subset of the qubits and
measure_all=False
, the OpenQASM code will include measurements on those specific qubits only.dev = qml.device("default.qubit", wires=2) @qml.qnode(dev) def circuit(): qml.Hadamard(0) qml.CNOT(wires=[0,1]) return qml.sample(wires=1)
>>> print(qml.to_openqasm(circuit, measure_all=False)()) OPENQASM 2.0; include "qelib1.inc"; qreg q[2]; creg c[2]; h q[0]; cx q[0],q[1]; measure q[1] -> c[1];
If the circuit returns an expectation value of a given observable and
rotations=True
, the OpenQASM 2.0 program will also include the gates that diagonalize the measured wires such that they are in the eigenbasis of the measured observable.dev = qml.device("default.qubit", wires=2) @qml.qnode(dev) def circuit(): qml.Hadamard(0) qml.CNOT(wires=[0,1]) return qml.expval(qml.PauliX(0) @ qml.PauliY(1))
>>> print(qml.to_openqasm(circuit, rotations=True)()) OPENQASM 2.0; include "qelib1.inc"; qreg q[2]; creg c[2]; h q[0]; cx q[0],q[1]; h q[0]; z q[1]; s q[1]; h q[1]; measure q[0] -> c[0]; measure q[1] -> c[1];