calyx_opt::traversal

Struct CompTraversal

Source
pub struct CompTraversal { /* private fields */ }
Expand description

Define traversal order of components: pre-order, post-order, or none.

§No order

Iterates over the components in any order

§Post-order

If a component B creates a cell of type A then component A is guaranteed to be visited before B. This is done by finding a topological order over a graph where A will have a directed edge to B.

Instead of constructing a new vector of components in a topological order, the implementation builds an order vector which contains indices into the original component vector. This way, we can return the components in the input order once we’re done with the post order traversal.

§Pre-order

Reverse of post-order

§Example

let comps: Vec<ir::Component>;
// Construct a post order.
let post = PostOrder::new(comps, Order::Post);
// Apply a mutable update to components.
let upd: FnMut(&mut ir::Component) -> CalyxResult<()>;
post.apply_update(upd);
// Recover the components in original order.
let new_comps = post.take();

Implementations§

Source§

impl CompTraversal

Source

pub fn new(comps: Vec<Component>, order: Order) -> Self

Returns a new instance the PostOrder iterator given a Vector of components.

§Panics

Panics if there is no post-order traversal of the vectors possible.

Source

pub fn apply_update<F>(&mut self, upd: F) -> CalyxResult<()>
where F: FnMut(&mut Component, &Vec<Component>) -> CalyxResult<()>,

Traverses components in post-order and applies upd.

Source

pub fn take(self) -> Vec<Component>

Returns the underlying component vector in original order.

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> 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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
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.