Struct libreda_sta::SimpleSTA
source · pub struct SimpleSTA<'a, N, Lib, State>where
N: NetlistBase,
Lib: DelayBase + LoadBase + ConstraintBase,{
pub(crate) netlist: N,
pub(crate) top_cell: N::CellId,
pub(crate) library: &'a Lib,
pub(crate) input_signals: HashMap<N::PinId, Lib::Signal>,
pub(crate) output_loads: HashMap<N::PinId, Lib::Load>,
pub(crate) required_output_signals: HashMap<N::PinId, Lib::RequiredSignal>,
pub(crate) clocks: HashMap<TerminalId<N>, ClockDefinition<Lib::Signal>>,
pub(crate) timing_graph: TimingGraph<N, Lib>,
pub(crate) generation: u32,
pub(crate) _netlist_type: PhantomData<N>,
pub(crate) _state: PhantomData<State>,
}Expand description
Simple static timing analysis engine.
Fields§
§netlist: N§top_cell: N::CellId§library: &'a Lib§input_signals: HashMap<N::PinId, Lib::Signal>§output_loads: HashMap<N::PinId, Lib::Load>§required_output_signals: HashMap<N::PinId, Lib::RequiredSignal>§clocks: HashMap<TerminalId<N>, ClockDefinition<Lib::Signal>>§timing_graph: TimingGraph<N, Lib>§generation: u32Count the number of timing updates. Used to efficiently mark nodes in the timing graph which are relevant for the current incremental upgrade. Used to distinguish between the first full update (needs more initialization) and subsequent incremental updates.
_netlist_type: PhantomData<N>§_state: PhantomData<State>Implementations§
source§impl<'a, N, Lib, S> SimpleSTA<'a, N, Lib, S>where
N: NetlistBase,
Lib: DelayBase + ConstraintBase,
impl<'a, N, Lib, S> SimpleSTA<'a, N, Lib, S>where N: NetlistBase, Lib: DelayBase + ConstraintBase,
sourcepub fn into_inner(self) -> N
pub fn into_inner(self) -> N
Get ownership of the netlist data.
pub(crate) fn top_cell_ref(&self) -> CellRef<'_, N>
source§impl<'a, N, Lib> SimpleSTA<'a, N, Lib, TimingAvailable>where
N: NetlistBase,
Lib: DelayBase + ConstraintBase,
impl<'a, N, Lib> SimpleSTA<'a, N, Lib, TimingAvailable>where N: NetlistBase, Lib: DelayBase + ConstraintBase,
sourcepub fn to_modifiable(self) -> SimpleSTA<'a, N, Lib, Modifiable>
pub fn to_modifiable(self) -> SimpleSTA<'a, N, Lib, Modifiable>
Convert to modifiable state. Call this function to modify the timing analysis settings or the netlist.
source§impl<'a, N, Lib> SimpleSTA<'a, N, Lib, Modifiable>where
N: NetlistBaseMT,
Lib: CellLoadModel<N> + CellDelayModel<N> + CellConstraintModel<N> + Sync,
impl<'a, N, Lib> SimpleSTA<'a, N, Lib, Modifiable>where N: NetlistBaseMT, Lib: CellLoadModel<N> + CellDelayModel<N> + CellConstraintModel<N> + Sync,
sourcepub fn update_timing(
self
) -> Result<SimpleSTA<'a, N, Lib, TimingAvailable>, (StaError, Self)>
pub fn update_timing( self ) -> Result<SimpleSTA<'a, N, Lib, TimingAvailable>, (StaError, Self)>
Compute the timing information.
On success, returns the STA engine in TimingAvailable mode where
timing queries are enabled.
On error, returns a tuple with an error code and the STA engine in Modifiable mode.
source§impl<'a, N, Lib> SimpleSTA<'a, N, Lib, Modifiable>where
N: NetlistBase,
Lib: CellLoadModel<N> + CellDelayModel<N> + CellConstraintModel<N>,
impl<'a, N, Lib> SimpleSTA<'a, N, Lib, Modifiable>where N: NetlistBase, Lib: CellLoadModel<N> + CellDelayModel<N> + CellConstraintModel<N>,
sourcepub fn new(
netlist: N,
top_cell: N::CellId,
cell_timing_library: &'a Lib
) -> Result<Self, StaError>
pub fn new( netlist: N, top_cell: N::CellId, cell_timing_library: &'a Lib ) -> Result<Self, StaError>
Create a new static timing analysis engine which analyzes the given netlist using timing information of the cells from the given library.
pub(crate) fn init(&mut self) -> Result<(), StaError>
sourcepub fn set_input_signal(
&mut self,
primary_input: N::PinId,
signal: Lib::Signal
) -> Result<(), StaError>
pub fn set_input_signal( &mut self, primary_input: N::PinId, signal: Lib::Signal ) -> Result<(), StaError>
Set the signal at a primary input.
sourcepub fn set_output_load(
&mut self,
primary_output: N::PinId,
load: Lib::Load
) -> Result<(), StaError>
pub fn set_output_load( &mut self, primary_output: N::PinId, load: Lib::Load ) -> Result<(), StaError>
Set the load attached to a primary output.
sourcepub fn set_required_output_signal(
&mut self,
primary_output: N::PinId,
required_signal: Lib::RequiredSignal
) -> Result<(), StaError>
pub fn set_required_output_signal( &mut self, primary_output: N::PinId, required_signal: Lib::RequiredSignal ) -> Result<(), StaError>
Specify the timing constraint of a primary output.
sourcepub fn create_clock(
&mut self,
clock_pin: TerminalId<N>,
clock_definition: ClockDefinition<Lib::Signal>
) -> Result<(), StaError>
pub fn create_clock( &mut self, clock_pin: TerminalId<N>, clock_definition: ClockDefinition<Lib::Signal> ) -> Result<(), StaError>
Specify a clock source.
sourcepub(crate) fn build_timing_graph(&mut self) -> Result<(), StaError>
pub(crate) fn build_timing_graph(&mut self) -> Result<(), StaError>
Create graph of delay arcs.
sourcepub(crate) fn init_input_signals(&mut self) -> Result<(), StaError>
pub(crate) fn init_input_signals(&mut self) -> Result<(), StaError>
Copy the defined input signals into the nodes of the timing graph.
sourcepub(crate) fn init_required_output_signals(&mut self) -> Result<(), StaError>
pub(crate) fn init_required_output_signals(&mut self) -> Result<(), StaError>
Copy the specified output signals into the timing graph.
sourcepub(crate) fn init_output_loads(&mut self) -> Result<(), StaError>
pub(crate) fn init_output_loads(&mut self) -> Result<(), StaError>
Copy the specified output loads into the timing graph.
pub(crate) fn init_clock_signals(&mut self) -> Result<(), StaError>
sourcepub(crate) fn propagate_signals(
&mut self,
net_loads: &FnvHashMap<N::NetId, Lib::Load>
) -> Result<(), StaError>where
Lib: Sync,
N: NetlistBaseMT,
pub(crate) fn propagate_signals( &mut self, net_loads: &FnvHashMap<N::NetId, Lib::Load> ) -> Result<(), StaError>where Lib: Sync, N: NetlistBaseMT,
Compute actual and required arival times.
pub(crate) fn toposort_delay_graph( &self ) -> Result<Vec<TerminalId<N>>, StaError>
pub(crate) fn debug_print_actual_signals(&self)
pub(crate) fn debug_print_timing_graph(&self)
sourcepub(crate) fn run_sta(&mut self) -> Result<(), StaError>where
Lib: Sync,
N: NetlistBaseMT,
pub(crate) fn run_sta(&mut self) -> Result<(), StaError>where Lib: Sync, N: NetlistBaseMT,
Do static timing analysis of the top cell.
A single clock is allowed and specified with clock_input.
Results are just printed on stdout.
sourcepub(crate) fn check_library(&self) -> Result<(), StaError>
pub(crate) fn check_library(&self) -> Result<(), StaError>
Check that all cells in the circuit are covered by the library. TODO: Maybe move this into the library adapter.
sourcepub(crate) fn check_clock_sources(&self) -> Result<(), StaError>
pub(crate) fn check_clock_sources(&self) -> Result<(), StaError>
Do some sanity checks.
Trait Implementations§
source§impl<'a, N, Lib, State: Debug> Debug for SimpleSTA<'a, N, Lib, State>where
N: NetlistBase + Debug,
Lib: DelayBase + LoadBase + ConstraintBase + Debug,
N::CellId: Debug,
N::PinId: Debug,
Lib::Signal: Debug,
Lib::Load: Debug,
Lib::RequiredSignal: Debug,
impl<'a, N, Lib, State: Debug> Debug for SimpleSTA<'a, N, Lib, State>where N: NetlistBase + Debug, Lib: DelayBase + LoadBase + ConstraintBase + Debug, N::CellId: Debug, N::PinId: Debug, Lib::Signal: Debug, Lib::Load: Debug, Lib::RequiredSignal: Debug,
source§impl<'b, N, Lib, S> HierarchyBase for SimpleSTA<'b, N, Lib, S>where
N: NetlistBase,
Lib: DelayBase + ConstraintBase,
impl<'b, N, Lib, S> HierarchyBase for SimpleSTA<'b, N, Lib, S>where N: NetlistBase, Lib: DelayBase + ConstraintBase,
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>
source§fn each_cell_vec(&self) -> Vec<Self::CellId>
fn each_cell_vec(&self) -> Vec<Self::CellId>
Vec of all cell IDs in this netlist.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>
Vec of each cell that is a child of this 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>
cell.source§fn num_child_instances(&self, cell: &Self::CellId) -> usize
fn num_child_instances(&self, cell: &Self::CellId) -> usize
cell.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),
source§fn parent_cell(&self, cell_instance: &Self::CellInstId) -> Self::CellId
fn parent_cell(&self, cell_instance: &Self::CellInstId) -> Self::CellId
source§fn for_each_cell<F>(&self, f: F)where
F: FnMut(Self::CellId),
fn for_each_cell<F>(&self, f: F)where F: FnMut(Self::CellId),
source§fn for_each_cell_dependency<F>(&self, cell: &Self::CellId, f: F)where
F: FnMut(Self::CellId),
fn for_each_cell_dependency<F>(&self, cell: &Self::CellId, f: F)where F: FnMut(Self::CellId),
cell.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>
Vec of the IDs of all instances in this 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>
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> + '_>
cell, i.e. instances that use this cell as
a template.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>
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>
None if the name does not exist.source§fn num_cell_references(&self, cell: &Self::CellId) -> usize
fn num_cell_references(&self, cell: &Self::CellId) -> usize
cell.source§fn num_dependent_cells(&self, cell: &Self::CellId) -> usize
fn num_dependent_cells(&self, cell: &Self::CellId) -> usize
cell, i.e. contain an instance of 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> + '_>
source§fn num_cell_dependencies(&self, cell: &Self::CellId) -> usize
fn num_cell_dependencies(&self, cell: &Self::CellId) -> usize
cell.source§fn template_cell(&self, cell_instance: &Self::CellInstId) -> Self::CellId
fn template_cell(&self, cell_instance: &Self::CellInstId) -> Self::CellId
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),
cell, i.e. instances that use this cell as
a template.source§fn get_chip_property(&self, key: &Self::NameType) -> Option<PropertyValue>
fn get_chip_property(&self, key: &Self::NameType) -> Option<PropertyValue>
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>
source§fn cell_by_name(&self, name: &str) -> Option<Self::CellId>
fn cell_by_name(&self, name: &str) -> Option<Self::CellId>
None if the cell does not exist.source§fn for_each_dependent_cell<F>(&self, cell: &Self::CellId, f: F)where
F: FnMut(Self::CellId),
fn for_each_dependent_cell<F>(&self, cell: &Self::CellId, f: F)where F: FnMut(Self::CellId),
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>
Vec of each cell that directly depends on 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>
cell.source§impl<'b, N, Lib, S> HierarchyEdit for SimpleSTA<'b, N, Lib, S>where
N: NetlistBase + HierarchyEdit,
Lib: DelayBase + ConstraintBase + CellDelayModel<N> + CellConstraintModel<N>,
impl<'b, N, Lib, S> HierarchyEdit for SimpleSTA<'b, N, Lib, S>where N: NetlistBase + HierarchyEdit, Lib: DelayBase + ConstraintBase + CellDelayModel<N> + CellConstraintModel<N>,
source§fn remove_cell(&mut self, cell_id: &Self::CellId)
fn remove_cell(&mut self, cell_id: &Self::CellId)
source§fn create_cell_instance(
&mut self,
parent_cell: &Self::CellId,
template_cell: &Self::CellId,
name: Option<Self::NameType>
) -> Self::CellInstId
fn create_cell_instance( &mut self, parent_cell: &Self::CellId, template_cell: &Self::CellId, name: Option<Self::NameType> ) -> Self::CellInstId
template_cell in parent_cell.
Recursive instantiation is forbidden and might panic. Read moresource§fn remove_cell_instance(&mut self, inst: &Self::CellInstId)
fn remove_cell_instance(&mut self, inst: &Self::CellInstId)
source§fn set_cell_property(
&mut self,
cell: &Self::CellId,
key: Self::NameType,
value: PropertyValue
)
fn set_cell_property( &mut self, cell: &Self::CellId, key: Self::NameType, value: PropertyValue )
source§fn set_cell_instance_property(
&mut self,
inst: &Self::CellInstId,
key: Self::NameType,
value: PropertyValue
)
fn set_cell_instance_property( &mut self, inst: &Self::CellInstId, key: Self::NameType, value: PropertyValue )
source§fn rename_cell_instance(
&mut self,
inst: &Self::CellInstId,
new_name: Option<Self::NameType>
)
fn rename_cell_instance( &mut self, inst: &Self::CellInstId, new_name: Option<Self::NameType> )
source§fn rename_cell(&mut self, cell: &Self::CellId, new_name: Self::NameType)
fn rename_cell(&mut self, cell: &Self::CellId, new_name: Self::NameType)
source§fn create_cell(&mut self, name: Self::NameType) -> Self::CellId
fn create_cell(&mut self, name: Self::NameType) -> Self::CellId
source§fn set_chip_property(&mut self, key: Self::NameType, value: PropertyValue)
fn set_chip_property(&mut self, key: Self::NameType, value: PropertyValue)
source§impl<'a, N, Lib, S> HierarchyIds for SimpleSTA<'a, N, Lib, S>where
N: NetlistBase,
Lib: DelayBase + ConstraintBase,
impl<'a, N, Lib, S> HierarchyIds for SimpleSTA<'a, N, Lib, S>where N: NetlistBase, Lib: DelayBase + ConstraintBase,
§type CellInstId = <N as HierarchyIds>::CellInstId
type CellInstId = <N as HierarchyIds>::CellInstId
source§impl<'b, N, Lib, S> L2NBase for SimpleSTA<'b, N, Lib, S>where
N: L2NBase,
Lib: DelayBase + ConstraintBase,
impl<'b, N, Lib, S> L2NBase for SimpleSTA<'b, N, Lib, S>where N: L2NBase, Lib: DelayBase + ConstraintBase,
source§fn shapes_of_net(
&self,
net_id: &Self::NetId
) -> Box<dyn Iterator<Item = Self::ShapeId> + '_>
fn shapes_of_net( &self, net_id: &Self::NetId ) -> Box<dyn Iterator<Item = Self::ShapeId> + '_>
source§fn shapes_of_pin(
&self,
pin_id: &Self::PinId
) -> Box<dyn Iterator<Item = Self::ShapeId> + '_>
fn shapes_of_pin( &self, pin_id: &Self::PinId ) -> Box<dyn Iterator<Item = Self::ShapeId> + '_>
source§fn get_net_of_shape(&self, shape_id: &Self::ShapeId) -> Option<Self::NetId>
fn get_net_of_shape(&self, shape_id: &Self::ShapeId) -> Option<Self::NetId>
source§fn get_pin_of_shape(&self, shape_id: &Self::ShapeId) -> Option<Self::PinId>
fn get_pin_of_shape(&self, shape_id: &Self::ShapeId) -> Option<Self::PinId>
source§impl<'b, N, Lib, S> L2NEdit for SimpleSTA<'b, N, Lib, S>where
N: L2NEdit,
Lib: DelayBase + ConstraintBase + CellDelayModel<N> + CellConstraintModel<N>,
impl<'b, N, Lib, S> L2NEdit for SimpleSTA<'b, N, Lib, S>where N: L2NEdit, Lib: DelayBase + ConstraintBase + CellDelayModel<N> + CellConstraintModel<N>,
source§fn set_pin_of_shape(
&mut self,
shape_id: &Self::ShapeId,
pin: Option<Self::PinId>
) -> Option<Self::PinId>
fn set_pin_of_shape( &mut self, shape_id: &Self::ShapeId, pin: Option<Self::PinId> ) -> Option<Self::PinId>
source§fn set_net_of_shape(
&mut self,
shape_id: &Self::ShapeId,
net: Option<Self::NetId>
) -> Option<Self::NetId>
fn set_net_of_shape( &mut self, shape_id: &Self::ShapeId, net: Option<Self::NetId> ) -> Option<Self::NetId>
source§impl<'b, N, Lib, S> LayoutBase for SimpleSTA<'b, N, Lib, S>where
N: NetlistBase + LayoutBase,
Lib: DelayBase + ConstraintBase,
impl<'b, N, Lib, S> LayoutBase for SimpleSTA<'b, N, Lib, S>where N: NetlistBase + LayoutBase, Lib: DelayBase + ConstraintBase,
source§fn with_shape<F, R>(&self, shape_id: &Self::ShapeId, f: F) -> Rwhere
F: FnMut(&Self::LayerId, &Geometry<Self::Coord>) -> R,
fn with_shape<F, R>(&self, shape_id: &Self::ShapeId, f: F) -> Rwhere F: FnMut(&Self::LayerId, &Geometry<Self::Coord>) -> R,
source§fn parent_of_shape(
&self,
shape_id: &Self::ShapeId
) -> (Self::CellId, Self::LayerId)
fn parent_of_shape( &self, shape_id: &Self::ShapeId ) -> (Self::CellId, Self::LayerId)
source§fn get_shape_property(
&self,
shape: &Self::ShapeId,
key: &Self::NameType
) -> Option<PropertyValue>
fn get_shape_property( &self, shape: &Self::ShapeId, key: &Self::NameType ) -> Option<PropertyValue>
source§fn get_transform(
&self,
cell_inst: &Self::CellInstId
) -> SimpleTransform<Self::Coord>
fn get_transform( &self, cell_inst: &Self::CellInstId ) -> SimpleTransform<Self::Coord>
source§fn bounding_box(&self, cell: &Self::CellId) -> Option<Rect<Self::Coord>>
fn bounding_box(&self, cell: &Self::CellId) -> Option<Rect<Self::Coord>>
None.source§fn find_layer(&self, index: UInt, datatype: UInt) -> Option<Self::LayerId>
fn find_layer(&self, index: UInt, datatype: UInt) -> Option<Self::LayerId>
source§fn dbu(&self) -> Self::Coord
fn dbu(&self) -> Self::Coord
source§fn each_layer(&self) -> Box<dyn Iterator<Item = Self::LayerId> + '_>
fn each_layer(&self) -> Box<dyn Iterator<Item = Self::LayerId> + '_>
source§fn layer_by_name(&self, name: &str) -> Option<Self::LayerId>
fn layer_by_name(&self, name: &str) -> Option<Self::LayerId>
source§fn each_shape_id(
&self,
cell: &Self::CellId,
layer: &Self::LayerId
) -> Box<dyn Iterator<Item = Self::ShapeId> + '_>
fn each_shape_id( &self, cell: &Self::CellId, layer: &Self::LayerId ) -> Box<dyn Iterator<Item = Self::ShapeId> + '_>
source§fn for_each_shape_recursive<F>(
&self,
cell: &Self::CellId,
layer: &Self::LayerId,
f: F
)where
F: FnMut(SimpleTransform<Self::Coord>, &Self::ShapeId, &Geometry<Self::Coord>),
fn for_each_shape_recursive<F>( &self, cell: &Self::CellId, layer: &Self::LayerId, f: F )where F: FnMut(SimpleTransform<Self::Coord>, &Self::ShapeId, &Geometry<Self::Coord>),
f for each shape of this cell and its sub cells.
Along to the geometric shape f also gets a transformation as argument.
The transformation describes the actual position of the geometric shape relative to the cell.source§fn bounding_box_per_layer(
&self,
cell: &Self::CellId,
layer: &Self::LayerId
) -> Option<Rect<Self::Coord>>
fn bounding_box_per_layer( &self, cell: &Self::CellId, layer: &Self::LayerId ) -> Option<Rect<Self::Coord>>
source§fn for_each_shape<F>(&self, cell: &Self::CellId, layer: &Self::LayerId, f: F)where
F: FnMut(&Self::ShapeId, &Geometry<Self::Coord>),
fn for_each_shape<F>(&self, cell: &Self::CellId, layer: &Self::LayerId, f: F)where F: FnMut(&Self::ShapeId, &Geometry<Self::Coord>),
source§fn layer_info(&self, layer: &Self::LayerId) -> LayerInfo<Self::NameType>
fn layer_info(&self, layer: &Self::LayerId) -> LayerInfo<Self::NameType>
LayerInfo data structure for this layer.source§fn shape_layer(&self, shape_id: &Self::ShapeId) -> Self::LayerId
fn shape_layer(&self, shape_id: &Self::ShapeId) -> Self::LayerId
source§fn shape_geometry(&self, shape_id: &Self::ShapeId) -> Geometry<Self::Coord>
fn shape_geometry(&self, shape_id: &Self::ShapeId) -> Geometry<Self::Coord>
source§impl<'b, N, Lib, S> LayoutEdit for SimpleSTA<'b, N, Lib, S>where
N: NetlistBase + LayoutEdit,
Lib: DelayBase + ConstraintBase + CellDelayModel<N> + CellConstraintModel<N>,
impl<'b, N, Lib, S> LayoutEdit for SimpleSTA<'b, N, Lib, S>where N: NetlistBase + LayoutEdit, Lib: DelayBase + ConstraintBase + CellDelayModel<N> + CellConstraintModel<N>,
source§fn insert_shape(
&mut self,
parent_cell: &Self::CellId,
layer: &Self::LayerId,
geometry: Geometry<Self::Coord>
) -> Self::ShapeId
fn insert_shape( &mut self, parent_cell: &Self::CellId, layer: &Self::LayerId, geometry: Geometry<Self::Coord> ) -> Self::ShapeId
source§fn remove_shape(
&mut self,
shape_id: &Self::ShapeId
) -> Option<Geometry<Self::Coord>>
fn remove_shape( &mut self, shape_id: &Self::ShapeId ) -> Option<Geometry<Self::Coord>>
source§fn replace_shape(
&mut self,
shape_id: &Self::ShapeId,
geometry: Geometry<Self::Coord>
) -> Geometry<Self::Coord>
fn replace_shape( &mut self, shape_id: &Self::ShapeId, geometry: Geometry<Self::Coord> ) -> Geometry<Self::Coord>
source§fn set_transform(
&mut self,
cell_inst: &Self::CellInstId,
tf: SimpleTransform<Self::Coord>
)
fn set_transform( &mut self, cell_inst: &Self::CellInstId, tf: SimpleTransform<Self::Coord> )
source§fn set_layer_name(
&mut self,
layer: &Self::LayerId,
name: Option<Self::NameType>
) -> Option<Self::NameType>
fn set_layer_name( &mut self, layer: &Self::LayerId, name: Option<Self::NameType> ) -> Option<Self::NameType>
None.
This method should not change the ID of the layer.
Returns the previous name of the layer.source§fn create_layer_with_id(
&mut self,
layer_id: Self::LayerId,
index: UInt,
datatype: UInt
) -> Result<(), ()>
fn create_layer_with_id( &mut self, layer_id: Self::LayerId, index: UInt, datatype: UInt ) -> Result<(), ()>
Err when the ID already exists.source§fn create_layer(&mut self, index: UInt, datatype: UInt) -> Self::LayerId
fn create_layer(&mut self, index: UInt, datatype: UInt) -> Self::LayerId
set_layer_name() to define a name.source§fn set_shape_property(
&mut self,
shape: &Self::ShapeId,
key: Self::NameType,
value: PropertyValue
)
fn set_shape_property( &mut self, shape: &Self::ShapeId, key: Self::NameType, value: PropertyValue )
source§impl<'a, N, Lib, S> LayoutIds for SimpleSTA<'a, N, Lib, S>where
N: LayoutIds + NetlistBase,
Lib: DelayBase + ConstraintBase,
impl<'a, N, Lib, S> LayoutIds for SimpleSTA<'a, N, Lib, S>where N: LayoutIds + NetlistBase, Lib: DelayBase + ConstraintBase,
source§impl<'b, N, Lib, S> NetlistBase for SimpleSTA<'b, N, Lib, S>where
N: NetlistBase,
Lib: DelayBase + ConstraintBase,
impl<'b, N, Lib, S> NetlistBase for SimpleSTA<'b, N, Lib, S>where N: NetlistBase, Lib: DelayBase + ConstraintBase,
source§fn each_external_net<'a>(
&'a self,
circuit_instance: &Self::CellInstId
) -> Box<dyn Iterator<Item = Self::NetId> + 'a>
fn each_external_net<'a>( &'a self, circuit_instance: &Self::CellInstId ) -> Box<dyn Iterator<Item = Self::NetId> + 'a>
source§fn for_each_external_net<F>(&self, circuit_instance: &Self::CellInstId, f: F)where
F: FnMut(Self::NetId),
fn for_each_external_net<F>(&self, circuit_instance: &Self::CellInstId, f: F)where F: FnMut(Self::NetId),
source§fn num_net_pins(&self, net: &Self::NetId) -> usize
fn num_net_pins(&self, net: &Self::NetId) -> usize
source§fn template_pin(&self, pin_instance: &Self::PinInstId) -> Self::PinId
fn template_pin(&self, pin_instance: &Self::PinInstId) -> Self::PinId
source§fn parent_cell_of_pin(&self, pin: &Self::PinId) -> Self::CellId
fn parent_cell_of_pin(&self, pin: &Self::PinId) -> Self::CellId
source§fn pin_direction(&self, pin: &Self::PinId) -> Direction
fn pin_direction(&self, pin: &Self::PinId) -> Direction
source§fn each_pin_instance_vec(
&self,
circuit_instance: &Self::CellInstId
) -> Vec<Self::PinInstId>
fn each_pin_instance_vec( &self, circuit_instance: &Self::CellInstId ) -> Vec<Self::PinInstId>
Vec with the IDs of all pin instance of this circuit instance.source§fn each_internal_net_vec(&self, circuit: &Self::CellId) -> Vec<Self::NetId>
fn each_internal_net_vec(&self, circuit: &Self::CellId) -> Vec<Self::NetId>
Vec with all nets in this circuit.source§fn for_each_pin_instance_of_net<F>(&self, net: &Self::NetId, f: F)where
F: FnMut(Self::PinInstId),
fn for_each_pin_instance_of_net<F>(&self, net: &Self::NetId, f: F)where F: FnMut(Self::PinInstId),
source§fn each_pin_instance_of_net_vec(
&self,
net: &Self::NetId
) -> Vec<Self::PinInstId>
fn each_pin_instance_of_net_vec( &self, net: &Self::NetId ) -> Vec<Self::PinInstId>
Vec with all pin instance IDs connected to this net.source§fn each_pin<'a>(
&'a self,
circuit: &Self::CellId
) -> Box<dyn Iterator<Item = Self::PinId> + 'a>
fn each_pin<'a>( &'a self, circuit: &Self::CellId ) -> Box<dyn Iterator<Item = Self::PinId> + 'a>
source§fn for_each_pin_instance<F>(&self, circuit_inst: &Self::CellInstId, f: F)where
F: FnMut(Self::PinInstId),
fn for_each_pin_instance<F>(&self, circuit_inst: &Self::CellInstId, f: F)where F: FnMut(Self::PinInstId),
source§fn for_each_pin<F>(&self, circuit: &Self::CellId, f: F)where
F: FnMut(Self::PinId),
fn for_each_pin<F>(&self, circuit: &Self::CellId, f: F)where F: FnMut(Self::PinId),
source§fn each_pin_of_net_vec(&self, net: &Self::NetId) -> Vec<Self::PinId>
fn each_pin_of_net_vec(&self, net: &Self::NetId) -> Vec<Self::PinId>
Vec with all pin IDs connected to this net.source§fn each_pin_instance_of_net<'a>(
&'a self,
net: &Self::NetId
) -> Box<dyn Iterator<Item = Self::PinInstId> + 'a>
fn each_pin_instance_of_net<'a>( &'a self, net: &Self::NetId ) -> Box<dyn Iterator<Item = Self::PinInstId> + 'a>
source§fn net_one(&self, parent_circuit: &Self::CellId) -> Self::NetId
fn net_one(&self, parent_circuit: &Self::CellId) -> Self::NetId
source§fn num_net_pin_instances(&self, net: &Self::NetId) -> usize
fn num_net_pin_instances(&self, net: &Self::NetId) -> usize
source§fn pin_instance(
&self,
cell_inst: &Self::CellInstId,
pin: &Self::PinId
) -> Self::PinInstId
fn pin_instance( &self, cell_inst: &Self::CellInstId, pin: &Self::PinId ) -> Self::PinInstId
source§fn net_of_pin(&self, pin: &Self::PinId) -> Option<Self::NetId>
fn net_of_pin(&self, pin: &Self::PinId) -> Option<Self::NetId>
source§fn for_each_pin_of_net<F>(&self, net: &Self::NetId, f: F)where
F: FnMut(Self::PinId),
fn for_each_pin_of_net<F>(&self, net: &Self::NetId, f: F)where F: FnMut(Self::PinId),
source§fn net_of_pin_instance(
&self,
pin_instance: &Self::PinInstId
) -> Option<Self::NetId>
fn net_of_pin_instance( &self, pin_instance: &Self::PinInstId ) -> Option<Self::NetId>
source§fn each_pin_instance<'a>(
&'a self,
circuit_instance: &Self::CellInstId
) -> Box<dyn Iterator<Item = Self::PinInstId> + 'a>
fn each_pin_instance<'a>( &'a self, circuit_instance: &Self::CellInstId ) -> Box<dyn Iterator<Item = Self::PinInstId> + 'a>
source§fn each_pin_vec(&self, circuit: &Self::CellId) -> Vec<Self::PinId>
fn each_pin_vec(&self, circuit: &Self::CellId) -> Vec<Self::PinId>
Vec with the IDs of all pins of this circuit.source§fn parent_of_pin_instance(&self, pin_inst: &Self::PinInstId) -> Self::CellInstId
fn parent_of_pin_instance(&self, pin_inst: &Self::PinInstId) -> Self::CellInstId
source§fn num_net_terminals(&self, net: &Self::NetId) -> usize
fn num_net_terminals(&self, net: &Self::NetId) -> usize
source§fn num_internal_nets(&self, circuit: &Self::CellId) -> usize
fn num_internal_nets(&self, circuit: &Self::CellId) -> usize
source§fn each_pin_of_net<'a>(
&'a self,
net: &Self::NetId
) -> Box<dyn Iterator<Item = Self::PinId> + 'a>
fn each_pin_of_net<'a>( &'a self, net: &Self::NetId ) -> Box<dyn Iterator<Item = Self::PinId> + 'a>
source§fn net_zero(&self, parent_circuit: &Self::CellId) -> Self::NetId
fn net_zero(&self, parent_circuit: &Self::CellId) -> Self::NetId
source§fn for_each_internal_net<F>(&self, circuit: &Self::CellId, f: F)where
F: FnMut(Self::NetId),
fn for_each_internal_net<F>(&self, circuit: &Self::CellId, f: F)where F: FnMut(Self::NetId),
source§fn each_external_net_vec(
&self,
circuit_instance: &Self::CellInstId
) -> Vec<Self::NetId>
fn each_external_net_vec( &self, circuit_instance: &Self::CellInstId ) -> Vec<Self::NetId>
source§fn parent_cell_of_net(&self, net: &Self::NetId) -> Self::CellId
fn parent_cell_of_net(&self, net: &Self::NetId) -> Self::CellId
source§fn net_by_name(
&self,
parent_circuit: &Self::CellId,
name: &str
) -> Option<Self::NetId>
fn net_by_name( &self, parent_circuit: &Self::CellId, name: &str ) -> Option<Self::NetId>
None if no such net can be found.source§fn pin_by_name(
&self,
parent_circuit: &Self::CellId,
name: &str
) -> Option<Self::PinId>
fn pin_by_name( &self, parent_circuit: &Self::CellId, name: &str ) -> Option<Self::PinId>
None if no such pin can be found.source§fn each_internal_net<'a>(
&'a self,
circuit: &Self::CellId
) -> Box<dyn Iterator<Item = Self::NetId> + 'a>
fn each_internal_net<'a>( &'a self, circuit: &Self::CellId ) -> Box<dyn Iterator<Item = Self::NetId> + 'a>
source§impl<'b, N, Lib, S> NetlistEdit for SimpleSTA<'b, N, Lib, S>where
N: NetlistEdit,
Lib: DelayBase + ConstraintBase + CellDelayModel<N> + CellConstraintModel<N>,
impl<'b, N, Lib, S> NetlistEdit for SimpleSTA<'b, N, Lib, S>where N: NetlistEdit, Lib: DelayBase + ConstraintBase + CellDelayModel<N> + CellConstraintModel<N>,
source§fn create_pin(
&mut self,
cell: &Self::CellId,
name: Self::NameType,
direction: Direction
) -> Self::PinId
fn create_pin( &mut self, cell: &Self::CellId, name: Self::NameType, direction: Direction ) -> Self::PinId
source§fn remove_pin(&mut self, id: &Self::PinId)
fn remove_pin(&mut self, id: &Self::PinId)
source§fn remove_net(&mut self, net: &Self::NetId)
fn remove_net(&mut self, net: &Self::NetId)
source§fn connect_pin(
&mut self,
pin: &Self::PinId,
net: Option<Self::NetId>
) -> Option<Self::NetId>
fn connect_pin( &mut self, pin: &Self::PinId, net: Option<Self::NetId> ) -> Option<Self::NetId>
source§fn connect_pin_instance(
&mut self,
pin: &Self::PinInstId,
net: Option<Self::NetId>
) -> Option<Self::NetId>
fn connect_pin_instance( &mut self, pin: &Self::PinInstId, net: Option<Self::NetId> ) -> Option<Self::NetId>
source§fn create_net(
&mut self,
parent: &Self::CellId,
name: Option<Self::NameType>
) -> Self::NetId
fn create_net( &mut self, parent: &Self::CellId, name: Option<Self::NameType> ) -> Self::NetId
parent circuit.source§fn disconnect_pin(&mut self, pin: &Self::PinId) -> Option<Self::NetId>
fn disconnect_pin(&mut self, pin: &Self::PinId) -> Option<Self::NetId>
source§fn rename_pin(
&mut self,
pin: &Self::PinId,
new_name: Self::NameType
) -> Self::NameType
fn rename_pin( &mut self, pin: &Self::PinId, new_name: Self::NameType ) -> Self::NameType
source§fn disconnect_pin_instance(
&mut self,
pin_instance: &Self::PinInstId
) -> Option<Self::NetId>
fn disconnect_pin_instance( &mut self, pin_instance: &Self::PinInstId ) -> Option<Self::NetId>
source§fn rename_net(
&mut self,
net_id: &Self::NetId,
new_name: Option<Self::NameType>
) -> Option<Self::NameType>
fn rename_net( &mut self, net_id: &Self::NetId, new_name: Option<Self::NameType> ) -> Option<Self::NameType>
source§impl<'a, N, Lib, S> NetlistIds for SimpleSTA<'a, N, Lib, S>where
N: NetlistBase,
Lib: DelayBase + ConstraintBase,
impl<'a, N, Lib, S> NetlistIds for SimpleSTA<'a, N, Lib, S>where N: NetlistBase, Lib: DelayBase + ConstraintBase,
source§impl<'a, N, Lib> TimingQuery for SimpleSTA<'a, N, Lib, TimingAvailable>where
N: NetlistBase + 'static,
Lib: DelayBase + ConstraintBase,
impl<'a, N, Lib> TimingQuery for SimpleSTA<'a, N, Lib, TimingAvailable>where N: NetlistBase + 'static, Lib: DelayBase + ConstraintBase,
§type NetlistIds = N
type NetlistIds = N
§type ArrivalTime = <Lib as TimingBase>::Signal
type ArrivalTime = <Lib as TimingBase>::Signal
§type RequiredArrivalTime = <Lib as ConstraintBase>::RequiredSignal
type RequiredArrivalTime = <Lib as ConstraintBase>::RequiredSignal
§type Slack = <Lib as ConstraintBase>::Slack
type Slack = <Lib as ConstraintBase>::Slack
source§fn report_aat(&self, pin: TerminalId<N>) -> Option<Self::ArrivalTime>
fn report_aat(&self, pin: TerminalId<N>) -> Option<Self::ArrivalTime>
update_timing if the netlist was modified. Might panic otherwise.
Returns an Option because some it is possible that no arrival time is defined (for example
for a floating part of the netlist which is not attached to a clock).source§fn report_rat(&self, pin: TerminalId<N>) -> Option<Self::RequiredArrivalTime>
fn report_rat(&self, pin: TerminalId<N>) -> Option<Self::RequiredArrivalTime>
update_timing if the netlist was modified. Might panic otherwise.source§fn report_slack(&self, pin: TerminalId<N>) -> Option<Self::Slack>
fn report_slack(&self, pin: TerminalId<N>) -> Option<Self::Slack>
update_timing if the netlist was modified. Might panic otherwise.source§fn report_timing(&self) -> Vec<()>
fn report_timing(&self) -> Vec<()>
Auto Trait Implementations§
impl<'a, N, Lib, State> !RefUnwindSafe for SimpleSTA<'a, N, Lib, State>
impl<'a, N, Lib, State> Send for SimpleSTA<'a, N, Lib, State>where Lib: Sync, N: Send, State: Send, <N as HierarchyIds>::CellId: Send, <N as NetlistIds>::PinId: Send, <N as NetlistIds>::PinInstId: Send,
impl<'a, N, Lib, State> Sync for SimpleSTA<'a, N, Lib, State>where Lib: Sync, N: Sync, State: Sync, <N as HierarchyIds>::CellId: Sync, <N as NetlistIds>::PinId: Sync, <N as NetlistIds>::PinInstId: Sync,
impl<'a, N, Lib, State> Unpin for SimpleSTA<'a, N, Lib, State>where N: Unpin, State: Unpin, <N as HierarchyIds>::CellId: Unpin, <Lib as ConstraintBase>::Constraint: Unpin, <Lib as DelayBase>::Delay: Unpin, <Lib as LoadBase>::Load: Unpin, <N as NetlistIds>::PinId: Unpin, <N as NetlistIds>::PinInstId: Unpin, <Lib as ConstraintBase>::RequiredSignal: Unpin, <Lib as TimingBase>::Signal: Unpin,
impl<'a, N, Lib, State> UnwindSafe for SimpleSTA<'a, N, Lib, State>where Lib: RefUnwindSafe, N: UnwindSafe, State: UnwindSafe, <N as HierarchyIds>::CellId: UnwindSafe, <Lib as ConstraintBase>::Constraint: UnwindSafe, <Lib as DelayBase>::Delay: UnwindSafe, <Lib as LoadBase>::Load: UnwindSafe, <N as NetlistIds>::PinId: UnwindSafe, <N as NetlistIds>::PinInstId: UnwindSafe, <Lib as ConstraintBase>::RequiredSignal: UnwindSafe, <Lib as TimingBase>::Signal: UnwindSafe,
Blanket Implementations§
§impl<N> HierarchyEditUtil for Nwhere
N: HierarchyEdit,
impl<N> HierarchyEditUtil for Nwhere N: HierarchyEdit,
§fn clear_cell_instances(&mut self, cell: &Self::CellId)
fn clear_cell_instances(&mut self, cell: &Self::CellId)
cell.§fn prune_cell_instance(&mut self, inst: &Self::CellInstId)
fn prune_cell_instance(&mut self, inst: &Self::CellInstId)
§fn prune_cell(&mut self, cell: &Self::CellId)
fn prune_cell(&mut self, cell: &Self::CellId)
§impl<T> HierarchyReferenceAccess for Twhere
T: HierarchyBase,
impl<T> HierarchyReferenceAccess for Twhere T: HierarchyBase,
§fn each_cell_ref(&self) -> Box<dyn Iterator<Item = CellRef<'_, Self>>, Global>
fn each_cell_ref(&self) -> Box<dyn Iterator<Item = CellRef<'_, Self>>, Global>
§fn cell_instance_ref(&self, inst_id: &Self::CellInstId) -> CellInstRef<'_, Self>
fn cell_instance_ref(&self, inst_id: &Self::CellInstId) -> CellInstRef<'_, Self>
§impl<N> HierarchyUtil for Nwhere
N: HierarchyBase,
impl<N> HierarchyUtil for Nwhere N: HierarchyBase,
§fn is_top_level_cell(&self, cell: &Self::CellId) -> bool
fn is_top_level_cell(&self, cell: &Self::CellId) -> bool
§fn is_leaf_cell(&self, cell: &Self::CellId) -> bool
fn is_leaf_cell(&self, cell: &Self::CellId) -> bool
§fn each_top_level_cell(&self) -> Box<dyn Iterator<Item = Self::CellId>, Global>
fn each_top_level_cell(&self) -> Box<dyn Iterator<Item = Self::CellId>, Global>
§fn each_leaf_cell(&self) -> Box<dyn Iterator<Item = Self::CellId>, Global>
fn each_leaf_cell(&self) -> Box<dyn Iterator<Item = Self::CellId>, Global>
§fn each_cell_bottom_to_top(
&self
) -> Box<dyn Iterator<Item = Self::CellId>, Global>
fn each_cell_bottom_to_top( &self ) -> Box<dyn Iterator<Item = Self::CellId>, Global>
§impl<L> LayoutEditUtil for Lwhere
L: LayoutEdit,
impl<L> LayoutEditUtil for Lwhere L: LayoutEdit,
§fn find_or_create_layer(&mut self, index: u32, datatype: u32) -> Self::LayerId
fn find_or_create_layer(&mut self, index: u32, datatype: u32) -> Self::LayerId
§impl<T> LayoutReferenceAccess for Twhere
T: LayoutBase,
impl<T> LayoutReferenceAccess for Twhere T: LayoutBase,
§fn each_layer_ref(&self) -> Box<dyn Iterator<Item = LayerRef<'_, Self>>, Global>
fn each_layer_ref(&self) -> Box<dyn Iterator<Item = LayerRef<'_, Self>>, Global>
§fn layer_ref_by_name(&self, name: &str) -> Option<LayerRef<'_, Self>>
fn layer_ref_by_name(&self, name: &str) -> Option<LayerRef<'_, Self>>
§impl<N> NetlistEditUtil for Nwhere
N: NetlistEdit + ?Sized,
impl<N> NetlistEditUtil for Nwhere N: NetlistEdit + ?Sized,
§fn connect_terminal(
&mut self,
terminal: &TerminalId<Self>,
net: Option<Self::NetId>
) -> Option<Self::NetId>
fn connect_terminal( &mut self, terminal: &TerminalId<Self>, net: Option<Self::NetId> ) -> Option<Self::NetId>
§fn disconnect_terminal(
&mut self,
terminal: &TerminalId<Self>
) -> Option<Self::NetId>
fn disconnect_terminal( &mut self, terminal: &TerminalId<Self> ) -> Option<Self::NetId>
§fn replace_net(&mut self, old_net: &Self::NetId, new_net: &Self::NetId)
fn replace_net(&mut self, old_net: &Self::NetId, new_net: &Self::NetId)
old_net and connect them to new_net instead.
The old net is no longer used and removed. Read more§fn flatten_circuit_instance(&mut self, circuit_instance: &Self::CellInstId)
fn flatten_circuit_instance(&mut self, circuit_instance: &Self::CellInstId)
§fn flatten_circuit(&mut self, circuit: &Self::CellId)
fn flatten_circuit(&mut self, circuit: &Self::CellId)
§fn purge_nets_in_circuit(&mut self, circuit_id: &Self::CellId) -> usize
fn purge_nets_in_circuit(&mut self, circuit_id: &Self::CellId) -> usize
§fn purge_nets(&mut self) -> usize
fn purge_nets(&mut self) -> usize
§fn create_net_names_in_circuit(
&mut self,
circuit_id: &Self::CellId,
prefix: &str
)
fn create_net_names_in_circuit( &mut self, circuit_id: &Self::CellId, prefix: &str )
prefix and an appended number.
After calling this method, no net inside this circuit will be unnamed.§impl<T> NetlistReferenceAccess for Twhere
T: NetlistBase,
impl<T> NetlistReferenceAccess for Twhere T: NetlistBase,
§fn pin_instance_ref(&self, id: &Self::PinInstId) -> PinInstRef<'_, Self>
fn pin_instance_ref(&self, id: &Self::PinInstId) -> PinInstRef<'_, Self>
§fn terminal_ref(&self, t: &TerminalId<Self>) -> TerminalRef<'_, Self>
fn terminal_ref(&self, t: &TerminalId<Self>) -> TerminalRef<'_, Self>
§impl<N> NetlistUtil for Nwhere
N: NetlistBase,
impl<N> NetlistUtil for Nwhere N: NetlistBase,
§fn net_of_terminal(&self, terminal: &TerminalId<Self>) -> Option<Self::NetId>
fn net_of_terminal(&self, terminal: &TerminalId<Self>) -> Option<Self::NetId>
§fn for_each_terminal_of_net<F>(&self, net: &Self::NetId, f: F)where
F: FnMut(TerminalId<Self>),
fn for_each_terminal_of_net<F>(&self, net: &Self::NetId, f: F)where F: FnMut(TerminalId<Self>),
§fn each_terminal_of_net_vec(
&self,
net: &Self::NetId
) -> Vec<TerminalId<Self>, Global>
fn each_terminal_of_net_vec( &self, net: &Self::NetId ) -> Vec<TerminalId<Self>, Global>
Vec with all terminal IDs connected to this net.