circuit

Macro circuit 

Source
macro_rules! circuit {
    (qubits: $num_qubits:expr, $($rest:tt)*) => { ... };
}
Expand description

Creates a Circuit object using a domain-specific language.

The macro provides a concise, intuitive way to define a quantum circuit.

§Syntax

The basic structure is:

circuit! {
    qubits: <number_of_qubits>,
    <operation_1>,
    <operation_2>,
    ...
}

Where <operation> can be one of the following:

§Single-Qubit Gates

Apply a gate to a single qubit or multiple qubits individually.

  • h(qubit) or h([qubit1, qubit2, ...])
  • x(qubit) or x([qubit1, qubit2, ...])
  • y(qubit) or y([qubit1, qubit2, ...])
  • z(qubit) or z([qubit1, qubit2, ...])
  • s(qubit) or s([qubit1, qubit2, ...])
  • t(qubit) or t([qubit1, qubit2, ...])
  • sdag(qubit) or sdag([qubit1, qubit2, ...])
  • tdag(qubit) or tdag([qubit1, qubit2, ...])
  • id(qubit) or id([qubit1, qubit2, ...])

§Two-Qubit Gates

  • cnot(control, target)
  • swap(qubit1, qubit2)

§Controlled Gates

Controlled gates can have single or multiple targets and controls.

  • ch(target, control) or ch([targets], [controls])
  • cx(target, control) or cx([targets], [controls])
  • cy(target, control) or cy([targets], [controls])
  • cz(target, control) or cz([targets], [controls])
  • cs(target, control) or cs([targets], [controls])
  • csdag(target, control) or csdag([targets], [controls])
  • ct(target, control) or ct([targets], [controls])
  • ctdag(target, control) or ctdag([targets], [controls])

§Gates with Angles

Angles are f64 values.

  • rx(qubit, angle) or rx([qubits], angle)
  • ry(qubit, angle) or ry([qubits], angle)
  • rz(qubit, angle) or rz([qubits], angle)
  • p(qubit, angle) or p([qubits], angle)
  • ry_phase(qubit, theta, phi) or ry_phase([qubits], theta, phi)
  • ry_phase_dag(qubit, theta, phi) or ry_phase_dag([qubits], theta, phi)

§Controlled Gates with Angles

  • crx(target, control, angle) or crx([targets], [controls], angle)
  • cry(target, control, angle) or cry([targets], [controls], angle)
  • crz(target, control, angle) or crz([targets], [controls], angle)
  • cp(target, control, angle) or cp([targets], [controls], angle)
  • cry_phase(target, control, theta, phi) or cry_phase([targets], [controls], theta, phi)
  • cry_phase_dag(target, control, theta, phi) or cry_phase_dag([targets], [controls], theta, phi)

§Special Gates

  • toffoli(target, control1, control2)
  • cswap(target1, target2, control) or cswap(target1, target2, [controls])
  • matchgate(target, theta, phi1, phi2)
  • cmatchgate(target, control, theta, phi1, phi2) or cmatchgate(target, [controls], theta, phi1, phi2)
  • pauli_string(pauli_string)
  • pauli_time_evolution(pauli_string, time)

§Unitary Gates

Apply a custom unitary matrix.

  • unitary(qubit, matrix)
  • unitary([qubits], matrix)
  • cunitary(target, control, matrix) or cunitary([targets], [controls], matrix)

§Warning

  • The matrix must be a valid unitary matrix. if the matrix is not unitary, the macro will panic.

§Measurement Gates

  • measurex(qubit) or measurex([qubits])
  • measurey(qubit) or measurey([qubits])
  • measurez(qubit) or measurez([qubits])
  • measure_custom(qubit, matrix) or measure_custom([qubits], matrix)

§Returns

  • Result<Circuit, Error> - A result containing the constructed Circuit or an error if the circuit cannot be built.