pub enum ControlNodeKind {
Block {
insts: EntityList<DataInst>,
},
Select {
kind: SelectionKind,
scrutinee: Value,
cases: SmallVec<[ControlRegion; 2]>,
},
Loop {
initial_inputs: SmallVec<[Value; 2]>,
body: ControlRegion,
repeat_condition: Value,
},
ExitInvocation {
kind: ExitInvocationKind,
inputs: SmallVec<[Value; 2]>,
},
}Variants§
Block
Linear chain of DataInsts, executing in sequence.
This is only an optimization over keeping DataInsts in ControlRegion
linear chains directly, or even merging DataInst with ControlNode.
Fields
insts: EntityList<DataInst>Select
Choose one ControlRegion out of cases to execute, based on a single
value input (scrutinee) interpreted according to SelectionKind.
This corresponds to “gamma” (γ) nodes in (R)VSDG, though those are
sometimes limited only to a two-way selection on a boolean condition.
Loop
Execute body repeatedly, until repeat_condition evaluates to false.
To represent “loop state”, body can take inputs, getting values from:
- on the first iteration:
initial_inputs - on later iterations:
body’s ownoutputs(from the last iteration)
As the condition is checked only after the body, this type of loop is
sometimes described as “tail-controlled”, and is also equivalent to the
C-like do { body; } while(repeat_condition) construct.
This corresponds to “theta” (θ) nodes in (R)VSDG.
ExitInvocation
Leave the current invocation, similar to returning from every function call in the stack (up to and including the entry-point), but potentially indicating a fatal error as well.
Trait Implementations§
Source§impl Clone for ControlNodeKind
impl Clone for ControlNodeKind
Source§fn clone(&self) -> ControlNodeKind
fn clone(&self) -> ControlNodeKind
1.0.0 · Source§const fn clone_from(&mut self, source: &Self)
const fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl Freeze for ControlNodeKind
impl RefUnwindSafe for ControlNodeKind
impl Send for ControlNodeKind
impl Sync for ControlNodeKind
impl Unpin for ControlNodeKind
impl UnwindSafe for ControlNodeKind
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
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 more