pub enum Expression {
    InfixOp {
        meta: Meta,
        lhe: Box<Expression>,
        infix_op: ExpressionInfixOpcode,
        rhe: Box<Expression>,
    },
    PrefixOp {
        meta: Meta,
        prefix_op: ExpressionPrefixOpcode,
        rhe: Box<Expression>,
    },
    SwitchOp {
        meta: Meta,
        cond: Box<Expression>,
        if_true: Box<Expression>,
        if_false: Box<Expression>,
    },
    Variable {
        meta: Meta,
        name: VariableName,
    },
    Number(Meta, BigInt),
    Call {
        meta: Meta,
        name: String,
        args: Vec<Expression>,
    },
    InlineArray {
        meta: Meta,
        values: Vec<Expression>,
    },
    Access {
        meta: Meta,
        var: VariableName,
        access: Vec<AccessType>,
    },
    Update {
        meta: Meta,
        var: VariableName,
        access: Vec<AccessType>,
        rhe: Box<Expression>,
    },
    Phi {
        meta: Meta,
        args: Vec<VariableName>,
    },
}

Variants§

§

InfixOp

An infix operation of the form lhe * rhe.

§

PrefixOp

A prefix operation of the form * rhe.

Fields

§meta: Meta
§

SwitchOp

An inline switch operation (or inline if-then-else) of the form cond? if_true: if_false.

Fields

§meta: Meta
§if_true: Box<Expression>
§if_false: Box<Expression>
§

Variable

A local variable, signal, or component.

Fields

§meta: Meta
§

Number(Meta, BigInt)

A constant field element.

§

Call

A function call node.

Fields

§meta: Meta
§name: String
§

InlineArray

An inline array on the form [value, ...].

Fields

§meta: Meta
§values: Vec<Expression>
§

Access

An Access node represents an array access of the form a[i]...[k].

Fields

§meta: Meta
§access: Vec<AccessType>
§

Update

Updates of the form var[i]...[k] = rhe lift to IR statements of the form var = update(var, (i, ..., k), rhe). This is needed when we convert the CFG to SSA. Since arrays are versioned atomically, we need to track which version of the array that is updated to obtain the new version. (This is needed to track variable use, dead assignments, and data flow.)

Note: The type metadata in meta tracks the type of the variable var.

Fields

§meta: Meta
§access: Vec<AccessType>
§

Phi

An SSA phi-expression.

Fields

§meta: Meta

Implementations§

Source§

impl Expression

Source

pub fn meta(&self) -> &Meta

Source

pub fn meta_mut(&mut self) -> &mut Meta

Trait Implementations§

Source§

impl Clone for Expression

Source§

fn clone(&self) -> Expression

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Expression

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl DegreeMeta for Expression

Source§

fn propagate_degrees(&mut self, env: &DegreeEnvironment) -> bool

Compute expression degrees for this node and child nodes. Returns true if the node (or a child node) is updated.
Source§

fn degree(&self) -> Option<&DegreeRange>

Returns an inclusive range the degree of the node may take.
Source§

impl Display for Expression

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl Hash for Expression

Source§

fn hash<H: Hasher>(&self, state: &mut H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Expression

Syntactic equality for expressions.

Source§

fn eq(&self, other: &Expression) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl TypeMeta for Expression

Source§

fn propagate_types(&mut self, vars: &Declarations)

Propagate variable types to variable child nodes.
Source§

fn is_local(&self) -> bool

Returns true if the node is a local variable.
Source§

fn is_signal(&self) -> bool

Returns true if the node is a signal.
Source§

fn is_component(&self) -> bool

Returns true if the node is a component.
Source§

fn variable_type(&self) -> Option<&VariableType>

For declared variables, this returns the type. For undeclared variables and other expression nodes this returns None.
Source§

impl ValueMeta for Expression

Source§

fn propagate_values(&mut self, env: &mut ValueEnvironment) -> bool

Propagate variable values defined by the environment to each sub-node. The method returns true if the node (or a sub-node) was updated.
Source§

fn is_constant(&self) -> bool

Returns true if the node reduces to a constant value.
Source§

fn is_boolean(&self) -> bool

Returns true if the node reduces to a boolean value.
Source§

fn is_field_element(&self) -> bool

Returns true if the node reduces to a field element.
Source§

fn value(&self) -> Option<&ValueReduction>

Returns the value if the node reduces to a constant, and None otherwise.
Source§

impl VariableMeta for Expression

Source§

fn cache_variable_use(&mut self)

Compute variables read/written by the node. Must be called before either of the getters are called. To avoid interior mutability this needs to be called again whenever the node is mutated in a way that may invalidate the cached variable use.
Source§

fn locals_read(&self) -> &VariableUses

Get the set of variables read by the IR node.
Source§

fn locals_written(&self) -> &VariableUses

Get the set of variables written by the IR node.
Source§

fn signals_read(&self) -> &VariableUses

Get the set of signals read by the IR node. Note that this does not include signals belonging to sub-components.
Source§

fn signals_written(&self) -> &VariableUses

Get the set of signals written by the IR node. Note that this does not include signals belonging to sub-components.
Source§

fn components_read(&self) -> &VariableUses

Get the set of components read by the IR node. Note that a component read is typically a signal read for a signal exported by the component.
Source§

fn components_written(&self) -> &VariableUses

Get the set of components written by the IR node. Note that a component write may either be a component initialization, or a signal write for a signal exported by the component.
Source§

fn variables_read<'a>( &'a self, ) -> Box<dyn Iterator<Item = &'a VariableUse> + 'a>

Get the set of variables read by the IR node. Note that this is simply the union of all locals, signals, and components read by the node.
Source§

fn variables_written<'a>( &'a self, ) -> Box<dyn Iterator<Item = &'a VariableUse> + 'a>

Get the set of variables written by the IR node. Note that this is simply the union of all locals, signals, and components written.
Source§

fn variables_used<'a>( &'a self, ) -> Box<dyn Iterator<Item = &'a VariableUse> + 'a>

Get the set of variables either read or written by the IR node.
Source§

impl Eq for Expression

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V