pub enum TensorBody {
Operand(usize),
Const(u64),
Add(Box<TensorBody>, Box<TensorBody>),
Sub(Box<TensorBody>, Box<TensorBody>),
Mul(Box<TensorBody>, Box<TensorBody>),
Min(Box<TensorBody>, Box<TensorBody>),
Max(Box<TensorBody>, Box<TensorBody>),
FloorDiv(Box<TensorBody>, Box<TensorBody>),
Shr {
arg: Box<TensorBody>,
by: u32,
},
Unary {
kind: SfpuKind,
arg: Box<TensorBody>,
},
Select {
cond: Pred,
then: Box<TensorBody>,
otherwise: Box<TensorBody>,
},
}Expand description
The scalar expression a ComputeOp::Generic applies at each point of its iteration space.
Deliberately NOT ScalarBody: that is the CGRA’s integer LoopCell datapath, which has no
home for a float transcendental. Where a body happens to be integer-expressible the fabric
lowering can convert it; otherwise it refuses by name, which is what it already does today.
Variants§
Operand(usize)
Operand i, indexed through ins[i].
Const(u64)
A literal, as f64 bits so the op stays Hash + Eq.
Add(Box<TensorBody>, Box<TensorBody>)
Sub(Box<TensorBody>, Box<TensorBody>)
Mul(Box<TensorBody>, Box<TensorBody>)
Min(Box<TensorBody>, Box<TensorBody>)
The smaller and the larger of two values: a clamp is one of each, a ReLU a Max with 0.
Max(Box<TensorBody>, Box<TensorBody>)
FloorDiv(Box<TensorBody>, Box<TensorBody>)
⌊a / b⌋, rounding toward −∞ — the VM’s //. A zero divisor faults.
Shr
a >> by, an arithmetic shift (⌊a / 2^by⌋): an int8 model’s requant divides by its power of two this way.
Unary
Select
cond ? then : otherwise on an AXIS predicate — piecewise along the iteration space, decided
by POSITION rather than by value, which no arithmetic on values can do. Both branches are
evaluated (branch-free), so an unselected branch may read outside its page and yield 0.0. A
rope window, a conv ring shift and the j < pos attention mask are each one of these.
Implementations§
Source§impl TensorBody
impl TensorBody
Sourcepub fn post_order(&self) -> Vec<&TensorBody>
pub fn post_order(&self) -> Vec<&TensorBody>
Every node of the body, each after its operands and the left operand first — the order whose position names a node wherever a body’s nodes are counted: its proven intervals, a run’s observations, a datapath’s wires.
Sourcepub fn max_operand(&self) -> Option<usize>
pub fn max_operand(&self) -> Option<usize>
The largest operand index the body names anywhere — in a leaf or in a predicate’s bound — so a validator can refuse a body that would index past the stage’s operands before an evaluator does.
Sourcepub fn pred_names_operand(&self, i: usize) -> bool
pub fn pred_names_operand(&self, i: usize) -> bool
Whether a predicate anywhere in the body reads its bound from operand i.
Trait Implementations§
Source§impl Clone for TensorBody
impl Clone for TensorBody
Source§fn clone(&self) -> TensorBody
fn clone(&self) -> TensorBody
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for TensorBody
impl Debug for TensorBody
Source§impl<'de> Deserialize<'de> for TensorBody
impl<'de> Deserialize<'de> for TensorBody
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl Hash for TensorBody
impl Hash for TensorBody
Source§impl PartialEq for TensorBody
impl PartialEq for TensorBody
Source§impl Serialize for TensorBody
impl Serialize for TensorBody
impl Eq for TensorBody
impl StructuralPartialEq for TensorBody
Auto Trait Implementations§
impl Freeze for TensorBody
impl RefUnwindSafe for TensorBody
impl Send for TensorBody
impl Sync for TensorBody
impl Unpin for TensorBody
impl UnsafeUnpin for TensorBody
impl UnwindSafe for TensorBody
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,
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.§impl<T> DowncastSync for T
impl<T> DowncastSync for T
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.