pub struct FlatView<'a, N> {
    path_separator: String,
    base: &'a N,
}
Expand description

Wrapper around a netlist which provides an on-the-fly flat view of a certain cell. The presented view is flattened until leaf cells. Internally this works by using component IDs that are actually paths through the hierarchy.

Names are constructed by concatenating the names of the path elements with a separator string in between.

Example

use libreda_db::prelude::{Chip, HierarchyBase, HierarchyEdit, FlatView};

// Create a simple hierarchy.
let mut chip = Chip::new();
let top = chip.create_cell("TOP".into());
let intermediate = chip.create_cell("INTERMEDIATE".into());
let leaf1 = chip.create_cell("LEAF1".into());
let leaf2 = chip.create_cell("LEAF2".into());

// The intermediate cell contains two instances of leaf1 and one instance of leaf2.
chip.create_cell_instance(&intermediate, &leaf1, Some("leaf1_inst1".into()));
chip.create_cell_instance(&intermediate, &leaf1, Some("leaf1_inst2".into()));
chip.create_cell_instance(&intermediate, &leaf2, Some("leaf2_inst1".into()));

// Create two instances of the intermediate cell in the TOP cell.
chip.create_cell_instance(&top, &intermediate, Some("intermediate1".into()));
chip.create_cell_instance(&top, &intermediate, Some("intermediate2".into()));

// Create the flat view.

let flat = FlatView::new_with_separator(&chip, ":".to_string());
let flat_top = flat.cell_by_name("TOP").expect("TOP not found in flat view.");
// There are 2 instances of the intermediate cell which contains 3 leaf cells,
// so now the flattened top should contain 2*3 instances.
assert_eq!(flat.num_child_instances(&flat_top), 2*3);

// Get a cell instance with the path string.
let inst = flat.cell_instance_by_name(&flat_top, "intermediate1:leaf1_inst1").expect("Instance not found.");
// Instance names are assembled from the path.
assert_eq!(flat.cell_instance_name(&inst).unwrap().as_str(), "intermediate1:leaf1_inst1");

// There should be 4 instances of the LEAF1 cell now.
assert_eq!(flat.each_cell_reference(&leaf1).count(), 2*2);

Fields§

§path_separator: String

Sequence used to separate path elements when creating qualified names. Names of the original netlist are not allowed to contain the path separator.

§base: &'a N

Underlying netlist data structure.

Implementations§

source§

impl<'a, N: HierarchyBase> FlatView<'a, N>

source

pub fn new(base: &'a N) -> Self

Create a new flat view of base. Use “/” as a path separator in names.

source

pub fn new_with_separator(base: &'a N, path_separator: String) -> Self

Create a new flat view of base. Use a custom path separator in concatenated names.

source

fn cell_is_leaf(&self, cell: &N::CellId) -> bool

source

fn cell_exists_in_flat_view(&self, cell: &N::CellId) -> bool

source

fn cell_is_flattened(&self, cell: &N::CellId) -> bool

Check if the cell got flattened and does not exist in the flat view.

Trait Implementations§

source§

impl<'a, N: HierarchyBase> HierarchyBase for FlatView<'a, N>

§

type NameType = <N as HierarchyBase>::NameType

Type for names of cells, instances, etc.
source§

fn cell_by_name(&self, name: &str) -> Option<Self::CellId>

Find a cell by its name. Return the cell with the given name. Returns None if the cell does not exist.
source§

fn cell_instance_by_name( &self, parent_cell: &Self::CellId, name: &str ) -> Option<Self::CellInstId>

Find a cell instance by its name. Returns None if the name does not exist.
source§

fn cell_name(&self, cell: &Self::CellId) -> Self::NameType

Get the name of the cell.
source§

fn cell_instance_name( &self, cell_inst: &Self::CellInstId ) -> Option<Self::NameType>

Get the name of the cell instance.
source§

fn parent_cell(&self, cell_instance: &Self::CellInstId) -> Self::CellId

Get the ID of the parent cell of this instance.
source§

fn template_cell(&self, cell_instance: &Self::CellInstId) -> Self::CellId

Get the ID of the template cell of this instance.
source§

fn for_each_cell<F>(&self, f: F)where F: FnMut(Self::CellId),

Call a function on each cell of the netlist.
source§

fn for_each_cell_instance<F>(&self, cell: &Self::CellId, f: F)where F: FnMut(Self::CellInstId),

Call a function on each instance in this cell.
source§

fn for_each_cell_dependency<F>(&self, cell: &Self::CellId, f: F)where F: FnMut(Self::CellId),

Call a function for each cell that is a child of this cell.
source§

fn for_each_dependent_cell<F>(&self, cell: &Self::CellId, f: F)where F: FnMut(Self::CellId),

Call a function for each cell that directly depends on cell.
source§

fn for_each_cell_reference<F>(&self, cell: &Self::CellId, f: F)where F: FnMut(Self::CellInstId),

Iterate over all instances of this cell, i.e. instances that use this cell as a template.
source§

fn num_child_instances(&self, cell: &Self::CellId) -> usize

Get the number of cell instances inside the cell.
source§

fn num_cells(&self) -> usize

Get the number of cell templates.
source§

fn each_cell_vec(&self) -> Vec<Self::CellId>

Get a Vec of all cell IDs in this netlist.
source§

fn each_cell(&self) -> Box<dyn Iterator<Item = Self::CellId> + '_>

Iterate over all cells.
source§

fn each_cell_instance_vec(&self, cell: &Self::CellId) -> Vec<Self::CellInstId>

Get a Vec of the IDs of all instances in this cell.
source§

fn each_cell_instance( &self, cell: &Self::CellId ) -> Box<dyn Iterator<Item = Self::CellInstId> + '_>

Iterate over all instances in a cell.
source§

fn each_cell_dependency_vec(&self, cell: &Self::CellId) -> Vec<Self::CellId>

Get a Vec of each cell that is a child of this cell.
source§

fn each_cell_dependency<'a>( &'a self, cell: &Self::CellId ) -> Box<dyn Iterator<Item = Self::CellId> + 'a>

Iterate over all cells that are instantiated in this cell.
source§

fn num_cell_dependencies(&self, cell: &Self::CellId) -> usize

Count all cells that are dependencies of cell.
source§

fn each_dependent_cell_vec(&self, cell: &Self::CellId) -> Vec<Self::CellId>

Get a Vec of each cell that directly depends on cell.
source§

fn each_dependent_cell<'a>( &'a self, cell: &Self::CellId ) -> Box<dyn Iterator<Item = Self::CellId> + 'a>

Iterate over each cell that directly depends on cell.
source§

fn num_dependent_cells(&self, cell: &Self::CellId) -> usize

Count all cells that are directly dependent on cell, i.e. contain an instance of cell.
source§

fn each_cell_reference_vec(&self, cell: &Self::CellId) -> Vec<Self::CellInstId>

Get a Vec with all cell instances referencing this cell.
source§

fn each_cell_reference( &self, cell: &Self::CellId ) -> Box<dyn Iterator<Item = Self::CellInstId> + '_>

Iterate over all instances of this cell, i.e. instances that use this cell as a template.
source§

fn num_cell_references(&self, cell: &Self::CellId) -> usize

Count all instantiations of cell.
source§

fn get_chip_property(&self, key: &Self::NameType) -> Option<PropertyValue>

Get a property of the top-level chip data structure.
source§

fn get_cell_property( &self, cell: &Self::CellId, key: &Self::NameType ) -> Option<PropertyValue>

Get a property of a cell.
source§

fn get_cell_instance_property( &self, inst: &Self::CellInstId, key: &Self::NameType ) -> Option<PropertyValue>

Get a property of a cell instance.
source§

impl<'a, N: HierarchyIds> HierarchyIds for FlatView<'a, N>

§

type CellId = <N as HierarchyIds>::CellId

Cell/module identifier type.
§

type CellInstId = Vec<<N as HierarchyIds>::CellInstId, Global>

Cell instance identifier type.

Auto Trait Implementations§

§

impl<'a, N> RefUnwindSafe for FlatView<'a, N>where N: RefUnwindSafe,

§

impl<'a, N> Send for FlatView<'a, N>where N: Sync,

§

impl<'a, N> Sync for FlatView<'a, N>where N: Sync,

§

impl<'a, N> Unpin for FlatView<'a, N>

§

impl<'a, N> UnwindSafe for FlatView<'a, N>where N: RefUnwindSafe,

Blanket Implementations§

source§

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

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

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

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

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

const: unstable · source§

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

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<N> HierarchyUtil for Nwhere N: HierarchyBase,

source§

fn is_top_level_cell(&self, cell: &Self::CellId) -> bool

Check if the cell is a top level cell. This is done by checking that no other cells have an instance of this cell.
source§

fn is_leaf_cell(&self, cell: &Self::CellId) -> bool

Check if the cell is a leaf cell. This is done by checking that this cell contains no other cell instances.
source§

fn each_top_level_cell(&self) -> Box<dyn Iterator<Item = Self::CellId> + '_>

Iterate over all top level cells.
source§

fn each_leaf_cell(&self) -> Box<dyn Iterator<Item = Self::CellId> + '_>

Iterate over all leaf cells, i.e. cells which contain no other cells.
source§

fn each_cell_bottom_to_top(&self) -> Box<dyn Iterator<Item = Self::CellId> + '_>

Iterate over topologically sorted cells (from leaf-cells to top-cells).
source§

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

const: unstable · 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, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

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

Performs the conversion.
source§

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

§

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

The type returned in the event of a conversion error.
const: unstable · source§

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

Performs the conversion.