pub enum ValueClassicalControlOp {
If {
condition: ClassicalExpr,
then_body: ValueControlBody,
else_body: Option<ValueControlBody>,
},
While {
condition: ClassicalExpr,
body: ValueControlBody,
},
For {
var: ClassicalVar,
start: ClassicalExpr,
stop: ClassicalExpr,
step: ClassicalExpr,
body: ValueControlBody,
},
Switch {
target: ClassicalExpr,
cases: Vec<ValueSwitchCase>,
default: Option<ValueControlBody>,
},
Break,
Continue,
}Expand description
A value-level classical control-flow operation.
This mirrors ClassicalControlOp but every
nested body is a ValueControlBody containing ValueOperation entries with
ParameterValue parameters. There are no CircuitParam::Index values anywhere
in this tree.
§Variants
| Variant | Storage-IR equivalent |
|---|---|
If | IfOp |
While | WhileOp |
For | ForOp |
Switch | SwitchOp |
Break | ClassicalControlOp::Break |
Continue | ClassicalControlOp::Continue |
Variants§
If
Execute then_body when condition is true, optionally else_body when false.
condition must have type ClassicalType::Bool.
Fields
condition: ClassicalExprBoolean branch condition.
then_body: ValueControlBodyBody executed when the condition is true.
else_body: Option<ValueControlBody>Optional body executed when the condition is false.
While
Repeat body while condition remains true.
condition must have type ClassicalType::Bool.
Fields
condition: ClassicalExprBoolean loop condition.
body: ValueControlBodyBody executed while the condition is true.
For
Iterate body over an unsigned half-open range [start, stop) with the given step.
var must have type ClassicalType::UInt.
start, stop, and step must match var’s width.
Fields
var: ClassicalVarMutable unsigned loop variable.
start: ClassicalExprInclusive initial value.
stop: ClassicalExprExclusive upper bound.
step: ClassicalExprNon-zero iteration increment.
body: ValueControlBodyLoop body.
Switch
Select one body by matching target against exact case values.
target must have an unsigned integer type. Cases do not fall through.
Fields
target: ClassicalExprUnsigned expression matched against case values.
cases: Vec<ValueSwitchCase>Exact-value cases in source order.
default: Option<ValueControlBody>Optional default body.
Break
Exit the nearest enclosing loop or switch body.
Continue
Advance to the next iteration of the nearest enclosing loop.
Implementations§
Source§impl ValueClassicalControlOp
impl ValueClassicalControlOp
Sourcepub fn new_if(
condition: ClassicalExpr,
then_body: ValueControlBody,
else_body: Option<ValueControlBody>,
) -> Result<Self, CircuitError>
pub fn new_if( condition: ClassicalExpr, then_body: ValueControlBody, else_body: Option<ValueControlBody>, ) -> Result<Self, CircuitError>
Creates a validated if operation.
condition must have type ClassicalType::Bool.
Sourcepub fn new_while(
condition: ClassicalExpr,
body: ValueControlBody,
) -> Result<Self, CircuitError>
pub fn new_while( condition: ClassicalExpr, body: ValueControlBody, ) -> Result<Self, CircuitError>
Creates a validated while operation.
condition must have type ClassicalType::Bool.
Sourcepub fn new_for(
var: ClassicalVar,
start: ClassicalExpr,
stop: ClassicalExpr,
step: ClassicalExpr,
body: ValueControlBody,
) -> Result<Self, CircuitError>
pub fn new_for( var: ClassicalVar, start: ClassicalExpr, stop: ClassicalExpr, step: ClassicalExpr, body: ValueControlBody, ) -> Result<Self, CircuitError>
Creates a validated unsigned range for operation.
var must be a UInt and start, stop, and step must match its width.
Sourcepub fn new_switch(
target: ClassicalExpr,
cases: Vec<ValueSwitchCase>,
default: Option<ValueControlBody>,
) -> Result<Self, CircuitError>
pub fn new_switch( target: ClassicalExpr, cases: Vec<ValueSwitchCase>, default: Option<ValueControlBody>, ) -> Result<Self, CircuitError>
Creates a validated exact-value switch operation.
target must be a UInt; every case value must fit its width and be unique.
Sourcepub fn used_qubits(&self) -> BTreeSet<Qubit>
pub fn used_qubits(&self) -> BTreeSet<Qubit>
Returns every qubit used by the operation’s nested control-flow bodies.
Sourcepub fn classical_var_reads(&self) -> Vec<ClassicalVar>
pub fn classical_var_reads(&self) -> Vec<ClassicalVar>
Returns the classical variables read by the controlling expressions.
Sourcepub fn classical_value_reads(&self) -> Vec<ClassicalValue>
pub fn classical_value_reads(&self) -> Vec<ClassicalValue>
Returns the immutable classical values read by the controlling expressions.
Sourcepub fn classical_writes(&self) -> Vec<ClassicalVar>
pub fn classical_writes(&self) -> Vec<ClassicalVar>
Returns the classical variables written by this operation.
Currently only For writes its loop variable.
Sourcepub fn has_measurement(&self) -> bool
pub fn has_measurement(&self) -> bool
Returns true if this control operation recursively contains measurement.
Sourcepub fn reads_value(&self, value: ClassicalValue) -> bool
pub fn reads_value(&self, value: ClassicalValue) -> bool
Returns true if this control operation recursively reads value.
Trait Implementations§
Source§impl Clone for ValueClassicalControlOp
impl Clone for ValueClassicalControlOp
Source§impl Debug for ValueClassicalControlOp
impl Debug for ValueClassicalControlOp
Source§impl Display for ValueClassicalControlOp
impl Display for ValueClassicalControlOp
Source§impl From<ValueClassicalControlOp> for ValueInstruction
impl From<ValueClassicalControlOp> for ValueInstruction
Source§fn from(op: ValueClassicalControlOp) -> Self
fn from(op: ValueClassicalControlOp) -> Self
Source§impl PartialEq for ValueClassicalControlOp
impl PartialEq for ValueClassicalControlOp
impl StructuralPartialEq for ValueClassicalControlOp
Auto Trait Implementations§
impl Freeze for ValueClassicalControlOp
impl RefUnwindSafe for ValueClassicalControlOp
impl Send for ValueClassicalControlOp
impl Sync for ValueClassicalControlOp
impl Unpin for ValueClassicalControlOp
impl UnsafeUnpin for ValueClassicalControlOp
impl UnwindSafe for ValueClassicalControlOp
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> DistributionExt for Twhere
T: ?Sized,
impl<T> DistributionExt for Twhere
T: ?Sized,
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.impl<T, U> Imply<T> for U
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 moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Pointable for T
impl<T> Pointable for T
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<T> StdoutFmt for Twhere
T: Display,
impl<T> StdoutFmt for Twhere
T: Display,
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.