pub enum Instruction {
Show 40 variants
Arithmetic(Arithmetic),
BinaryLogic(BinaryLogic),
CalibrationDefinition(CalibrationDefinition),
Call(Call),
Capture(Capture),
CircuitDefinition(CircuitDefinition),
Convert(Convert),
Comparison(Comparison),
Declaration(Declaration),
Delay(Delay),
Exchange(Exchange),
Fence(Fence),
FrameDefinition(FrameDefinition),
Gate(Gate),
GateDefinition(GateDefinition),
Halt(),
Include(Include),
Jump(Jump),
JumpUnless(JumpUnless),
JumpWhen(JumpWhen),
Label(Label),
Load(Load),
MeasureCalibrationDefinition(MeasureCalibrationDefinition),
Measurement(Measurement),
Move(Move),
Nop(),
Pragma(Pragma),
Pulse(Pulse),
RawCapture(RawCapture),
Reset(Reset),
SetFrequency(SetFrequency),
SetPhase(SetPhase),
SetScale(SetScale),
ShiftFrequency(ShiftFrequency),
ShiftPhase(ShiftPhase),
Store(Store),
SwapPhases(SwapPhases),
UnaryLogic(UnaryLogic),
WaveformDefinition(WaveformDefinition),
Wait(),
}Expand description
A Quil instruction.
Each variant (for Python users, each nested subclass) corresponds to a possible type of Quil instruction, which is accessible as a member within the variant.
§Python Users
The subclasses of this class are class attributes defined on it, and can be used to “wrap” instructions when they should be stored together. In particular, they are NOT the instruction classes you’d typically create, and instances of instruction classes are NOT subclasses of this class:
>>> from quil.instructions import Instruction, Gate, Qubit
>>> issubclass(Instruction.Gate, Instruction)
True
>>> issubclass(Gate, Instruction)
False
>>> g = Gate("X", (), (Qubit.Fixed(0),), ())
>>> isinstance(g, Gate)
True
>>> isinstance(g, Instruction.Gate)
False
>>> g_instr = Instruction.Gate(g)
>>> isinstance(g_instr, Gate)
False
>>> isinstance(g_instr, Instruction.Gate)
True
>>> isinstance(g_instr._0, Gate)
True
>>> g_instr._0 == g
TrueThe point of this class is to wrap different kinds of instructions
when stored together in a collection, all of which are of type Instruction.
You can check for different instruction variants and destructure them using match:
match g_instr:
case Instruction.Gate(gate):
assert isinstance(gate, Gate)
case Instruction.Wait() | Instruction.Nop():
# note the `()` -- these aren't like Python's enumerations!Variants§
Arithmetic(Arithmetic)
BinaryLogic(BinaryLogic)
CalibrationDefinition(CalibrationDefinition)
Call(Call)
Capture(Capture)
CircuitDefinition(CircuitDefinition)
Convert(Convert)
Comparison(Comparison)
Declaration(Declaration)
Delay(Delay)
Exchange(Exchange)
Fence(Fence)
FrameDefinition(FrameDefinition)
Gate(Gate)
GateDefinition(GateDefinition)
Halt()
Include(Include)
Jump(Jump)
JumpUnless(JumpUnless)
JumpWhen(JumpWhen)
Label(Label)
Load(Load)
MeasureCalibrationDefinition(MeasureCalibrationDefinition)
Measurement(Measurement)
Move(Move)
Nop()
Pragma(Pragma)
Pulse(Pulse)
RawCapture(RawCapture)
Reset(Reset)
SetFrequency(SetFrequency)
SetPhase(SetPhase)
SetScale(SetScale)
ShiftFrequency(ShiftFrequency)
ShiftPhase(ShiftPhase)
Store(Store)
SwapPhases(SwapPhases)
UnaryLogic(UnaryLogic)
WaveformDefinition(WaveformDefinition)
Wait()
Implementations§
Source§impl Instruction
impl Instruction
Source§impl Instruction
impl Instruction
Sourcepub fn apply_to_expressions(&mut self, closure: impl FnMut(&mut Expression))
pub fn apply_to_expressions(&mut self, closure: impl FnMut(&mut Expression))
Apply the provided closure to this instruction, mutating any Expressions within.
Does not affect instructions without Expressions within.
Does not traverse or mutate instructions nested within blocks (such as
within DEFCAL).
§Example
use std::mem::replace;
use std::str::FromStr;
use quil_rs::{expression::Expression, Program, quil::Quil};
let program = Program::from_str("SHIFT-PHASE 0 \"rf\" 2*2").unwrap();
let mut instructions = program.to_instructions();
instructions.iter_mut().for_each(|inst| inst.apply_to_expressions(Expression::simplify));
assert_eq!(instructions[0].to_quil().unwrap(), String::from("SHIFT-PHASE 0 \"rf\" 4"))
Sourcepub fn get_qubits(&self) -> Vec<&Qubit>
pub fn get_qubits(&self) -> Vec<&Qubit>
Return immutable references to the Qubits contained within an instruction
Sourcepub fn get_qubits_mut(&mut self) -> Vec<&mut Qubit>
pub fn get_qubits_mut(&mut self) -> Vec<&mut Qubit>
Return mutable references to the Qubits contained within an instruction
Trait Implementations§
Source§impl Clone for Instruction
impl Clone for Instruction
Source§fn clone(&self) -> Instruction
fn clone(&self) -> Instruction
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for Instruction
impl Debug for Instruction
Source§impl FromStr for Instruction
impl FromStr for Instruction
Source§impl PartialEq for Instruction
impl PartialEq for Instruction
Source§impl Quil for Instruction
impl Quil for Instruction
Source§fn write(
&self,
f: &mut impl Write,
fall_back_to_debug: bool,
) -> Result<(), ToQuilError>
fn write( &self, f: &mut impl Write, fall_back_to_debug: bool, ) -> Result<(), ToQuilError>
fall_back_to_debug
is true, then it must not return an error.Source§fn to_quil(&self) -> Result<String, ToQuilError>
fn to_quil(&self) -> Result<String, ToQuilError>
Source§fn to_quil_or_debug(&self) -> String
fn to_quil_or_debug(&self) -> String
Debug representation of that
component.impl StructuralPartialEq for Instruction
Auto Trait Implementations§
impl Freeze for Instruction
impl RefUnwindSafe for Instruction
impl Send for Instruction
impl Sync for Instruction
impl Unpin for Instruction
impl UnsafeUnpin for Instruction
impl UnwindSafe for Instruction
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreimpl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
impl<T> Scalar for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.