Struct calyx_opt::traversal::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
sourceimpl CompTraversal
impl CompTraversal
sourcepub fn new(comps: Vec<Component>, order: Order) -> Self
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.
sourcepub fn apply_update<F>(&mut self, upd: F) -> CalyxResult<()>where
F: FnMut(&mut Component, &Vec<Component>) -> CalyxResult<()>,
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
.