pub struct FlatView<'a, N> { /* private fields */ }
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);
Implementations§
Source§impl<'a, N: HierarchyBase> FlatView<'a, N>
impl<'a, N: HierarchyBase> FlatView<'a, N>
Trait Implementations§
Source§impl<'a, N: HierarchyBase> HierarchyBase for FlatView<'a, N>
impl<'a, N: HierarchyBase> HierarchyBase for FlatView<'a, N>
Source§type NameType = <N as HierarchyBase>::NameType
type NameType = <N as HierarchyBase>::NameType
Type for names of cells, instances, etc.
Source§fn cell_by_name(&self, name: &str) -> Option<Self::CellId>
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>
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_instance_name(
&self,
cell_inst: &Self::CellInstId,
) -> Option<Self::NameType>
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
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
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)
fn for_each_cell<F>(&self, f: F)
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),
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)
fn for_each_cell_dependency<F>(&self, cell: &Self::CellId, f: F)
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)
fn for_each_dependent_cell<F>(&self, cell: &Self::CellId, f: F)
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),
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
fn num_child_instances(&self, cell: &Self::CellId) -> usize
Get the number of cell instances inside the
cell
.Source§fn each_cell_vec(&self) -> Vec<Self::CellId>
fn each_cell_vec(&self) -> Vec<Self::CellId>
Get a
Vec
of all cell IDs in this netlist.Source§fn each_cell_instance_vec(&self, cell: &Self::CellId) -> Vec<Self::CellInstId>
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> + '_>
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>
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>
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
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>
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>
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
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>
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> + '_>
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
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>
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>
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>
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>
impl<'a, N: HierarchyIds> HierarchyIds for FlatView<'a, N>
Source§type CellId = <N as HierarchyIds>::CellId
type CellId = <N as HierarchyIds>::CellId
Cell/module identifier type.
Source§type CellInstId = Arc<Vec<<N as HierarchyIds>::CellInstId>>
type CellInstId = Arc<Vec<<N as HierarchyIds>::CellInstId>>
Cell instance identifier type.
Auto Trait Implementations§
impl<'a, N> Freeze for FlatView<'a, N>
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> 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
Mutably borrows from an owned value. Read more
Source§impl<T> HierarchyReferenceAccess for Twhere
T: HierarchyBase,
impl<T> HierarchyReferenceAccess for Twhere
T: HierarchyBase,
Source§fn each_cell_ref(&self) -> Box<dyn Iterator<Item = CellRef<'_, Self>> + '_>
fn each_cell_ref(&self) -> Box<dyn Iterator<Item = CellRef<'_, Self>> + '_>
Iterate over all cell objects.
Source§fn cell_instance_ref(&self, inst_id: &Self::CellInstId) -> CellInstRef<'_, Self>
fn cell_instance_ref(&self, inst_id: &Self::CellInstId) -> CellInstRef<'_, Self>
Get a cell instance object by its ID.
Source§impl<N> HierarchyUtil for Nwhere
N: HierarchyBase,
impl<N> HierarchyUtil for Nwhere
N: HierarchyBase,
Source§fn is_top_level_cell(&self, cell: &Self::CellId) -> bool
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
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> + '_>
fn each_top_level_cell(&self) -> Box<dyn Iterator<Item = Self::CellId> + '_>
Iterate over all top level cells.
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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