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: u32

Count 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,

source

pub fn into_inner(self) -> N

Get ownership of the netlist data.

source

pub(crate) fn netlist(&self) -> &N

Shortcut to get the reference to the netlist.

source

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,

source

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,

source

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>,

source

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.

source

pub(crate) fn init(&mut self) -> Result<(), StaError>

source

pub fn set_input_signal( &mut self, primary_input: N::PinId, signal: Lib::Signal ) -> Result<(), StaError>

Set the signal at a primary input.

source

pub fn set_output_load( &mut self, primary_output: N::PinId, load: Lib::Load ) -> Result<(), StaError>

Set the load attached to a primary output.

source

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.

source

pub fn create_clock( &mut self, clock_pin: TerminalId<N>, clock_definition: ClockDefinition<Lib::Signal> ) -> Result<(), StaError>

Specify a clock source.

source

pub(crate) fn build_timing_graph(&mut self) -> Result<(), StaError>

Create graph of delay arcs.

source

pub(crate) fn init_input_signals(&mut self) -> Result<(), StaError>

Copy the defined input signals into the nodes of the timing graph.

source

pub(crate) fn init_required_output_signals(&mut self) -> Result<(), StaError>

Copy the specified output signals into the timing graph.

source

pub(crate) fn init_output_loads(&mut self) -> Result<(), StaError>

Copy the specified output loads into the timing graph.

source

pub(crate) fn init_clock_signals(&mut self) -> Result<(), StaError>

source

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.

source

pub(crate) fn toposort_delay_graph( &self ) -> Result<Vec<TerminalId<N>>, StaError>

source

pub(crate) fn debug_print_actual_signals(&self)

source

pub(crate) fn debug_print_timing_graph(&self)

source

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.

source

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.

source

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,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<'b, N, Lib, S> HierarchyBase for SimpleSTA<'b, N, Lib, S>where N: NetlistBase, Lib: DelayBase + ConstraintBase,

§

type NameType = <N as HierarchyBase>::NameType

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

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

Get the name of the cell instance.
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_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_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_child_instances(&self, cell: &Self::CellId) -> usize

Get the number of cell instances inside the cell.
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 parent_cell(&self, cell_instance: &Self::CellInstId) -> Self::CellId

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

fn num_cells(&self) -> usize

Get the number of cell templates.
source§

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

Get the name of the cell.
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_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 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_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 get_cell_property( &self, cell: &Self::CellId, key: &Self::NameType ) -> Option<PropertyValue>

Get a property of a cell.
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 num_cell_references(&self, cell: &Self::CellId) -> usize

Count all instantiations of 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_instance( &self, cell: &Self::CellId ) -> Box<dyn Iterator<Item = Self::CellInstId> + '_>

Iterate over all instances in a cell.
source§

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

Count all cells that are dependencies of cell.
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_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 get_chip_property(&self, key: &Self::NameType) -> Option<PropertyValue>

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

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

Get a property of a cell instance.
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 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 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_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§

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)

Remove a cell and all the instances of it. Read more
source§

fn create_cell_instance( &mut self, parent_cell: &Self::CellId, template_cell: &Self::CellId, name: Option<Self::NameType> ) -> Self::CellInstId

Create a new instance of template_cell in parent_cell. Recursive instantiation is forbidden and might panic. Read more
source§

fn remove_cell_instance(&mut self, inst: &Self::CellInstId)

Remove cell instance if it exists. Read more
source§

fn set_cell_property( &mut self, cell: &Self::CellId, key: Self::NameType, value: PropertyValue )

Set a property of a cell.
source§

fn set_cell_instance_property( &mut self, inst: &Self::CellInstId, key: Self::NameType, value: PropertyValue )

Set a property of a cell instance.
source§

fn rename_cell_instance( &mut self, inst: &Self::CellInstId, new_name: Option<Self::NameType> )

Change the name of a cell instance. Read more
source§

fn rename_cell(&mut self, cell: &Self::CellId, new_name: Self::NameType)

Change the name of a cell. Read more
source§

fn create_cell(&mut self, name: Self::NameType) -> Self::CellId

Create a new and empty cell template. A cell template can be be instantiated in other cells. Read more
source§

fn set_chip_property(&mut self, key: Self::NameType, value: PropertyValue)

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

impl<'a, N, Lib, S> HierarchyIds for SimpleSTA<'a, N, Lib, S>where N: NetlistBase, Lib: DelayBase + ConstraintBase,

§

type CellId = <N as HierarchyIds>::CellId

Cell/module identifier type.
§

type CellInstId = <N as HierarchyIds>::CellInstId

Cell instance identifier type.
source§

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> + '_>

Iterate over all shapes that are marked to belong to the specified net.
source§

fn shapes_of_pin( &self, pin_id: &Self::PinId ) -> Box<dyn Iterator<Item = Self::ShapeId> + '_>

Iterate over all shapes that are part of the pin.
source§

fn get_net_of_shape(&self, shape_id: &Self::ShapeId) -> Option<Self::NetId>

Get the net of a shape.
source§

fn get_pin_of_shape(&self, shape_id: &Self::ShapeId) -> Option<Self::PinId>

Get the pin that belongs to the shape (if any).
source§

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>

Create the link between a circuit pin and its shapes in the layout. Return the current pin.
source§

fn set_net_of_shape( &mut self, shape_id: &Self::ShapeId, net: Option<Self::NetId> ) -> Option<Self::NetId>

Set the net of a shape. Return the current net.
source§

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,

Access a shape by its ID.
source§

fn parent_of_shape( &self, shape_id: &Self::ShapeId ) -> (Self::CellId, Self::LayerId)

Get the parent cell and the layer of a shape as a (cell, layer) tuple.
source§

fn get_shape_property( &self, shape: &Self::ShapeId, key: &Self::NameType ) -> Option<PropertyValue>

Get a property of a shape.
source§

fn get_transform( &self, cell_inst: &Self::CellInstId ) -> SimpleTransform<Self::Coord>

Get the geometric transform that describes the location of a cell instance relative to its parent.
source§

fn bounding_box(&self, cell: &Self::CellId) -> Option<Rect<Self::Coord>>

Compute the bounding box of the cell over all layers. The bounding box is not defined if the cell is empty. In this case return None.
source§

fn find_layer(&self, index: UInt, datatype: UInt) -> Option<Self::LayerId>

Find layer index by the (index, data type) tuple.
source§

fn dbu(&self) -> Self::Coord

Get the distance unit used in this layout in ‘pixels per micron’.
source§

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

Iterate over all defined layers.
source§

fn layer_by_name(&self, name: &str) -> Option<Self::LayerId>

Find layer index by the name.
source§

fn each_shape_id( &self, cell: &Self::CellId, layer: &Self::LayerId ) -> Box<dyn Iterator<Item = Self::ShapeId> + '_>

Iterate over the IDs of all shapes in the cell on a specific layer.
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>),

Call a function 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>>

Compute the bounding box of the shapes on one layer. The bounding box also includes all child cell instances.
source§

fn for_each_shape<F>(&self, cell: &Self::CellId, layer: &Self::LayerId, f: F)where F: FnMut(&Self::ShapeId, &Geometry<Self::Coord>),

Call a function for each shape on this layer.
source§

fn layer_info(&self, layer: &Self::LayerId) -> LayerInfo<Self::NameType>

Get the LayerInfo data structure for this layer.
source§

fn shape_layer(&self, shape_id: &Self::ShapeId) -> Self::LayerId

Get the layer of a shape.
source§

fn shape_geometry(&self, shape_id: &Self::ShapeId) -> Geometry<Self::Coord>

Get a clone of the shape geometry.
source§

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

Insert a geometric shape into the parent cell.
source§

fn remove_shape( &mut self, shape_id: &Self::ShapeId ) -> Option<Geometry<Self::Coord>>

Remove shape from the parent cell.
source§

fn replace_shape( &mut self, shape_id: &Self::ShapeId, geometry: Geometry<Self::Coord> ) -> Geometry<Self::Coord>

Replace the geometry of a shape.
source§

fn set_transform( &mut self, cell_inst: &Self::CellInstId, tf: SimpleTransform<Self::Coord> )

Set the geometric transform that describes the location of a cell instance relative to its parent.
source§

fn set_layer_name( &mut self, layer: &Self::LayerId, name: Option<Self::NameType> ) -> Option<Self::NameType>

Set the name of a layer or clear the layer name when passing 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<(), ()>

Create a new layer with a specific ID. This is used to clone layer-stacks between layouts while preserving their IDs. Returns an Err when the ID already exists.
source§

fn create_layer(&mut self, index: UInt, datatype: UInt) -> Self::LayerId

Create a new layer. Use set_layer_name() to define a name.
source§

fn set_shape_property( &mut self, shape: &Self::ShapeId, key: Self::NameType, value: PropertyValue )

Set a property of a shape.
source§

fn set_dbu(&mut self, dbu: Self::Coord)

Set the distance unit used in this layout in ‘pixels per micron’.
source§

impl<'a, N, Lib, S> LayoutIds for SimpleSTA<'a, N, Lib, S>where N: LayoutIds + NetlistBase, Lib: DelayBase + ConstraintBase,

§

type Area = <N as LayoutIds>::Area

Number type for areas. This is possibly another type then Coord for the following reasons: Read more
§

type LayerId = <N as LayoutIds>::LayerId

Layer identifier type.
§

type Coord = <N as LayoutIds>::Coord

Number type used for coordinates and distances.
§

type ShapeId = <N as LayoutIds>::ShapeId

Shape identifier type.
source§

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>

Iterate over all external nets connected to the circuit instance. A net might appear more than once.
source§

fn for_each_external_net<F>(&self, circuit_instance: &Self::CellInstId, f: F)where F: FnMut(Self::NetId),

Iterate over all external nets connected to the circuit instance. A net might appear more than once.
source§

fn num_net_pins(&self, net: &Self::NetId) -> usize

Get the number of pins that are connected to this net.
source§

fn template_pin(&self, pin_instance: &Self::PinInstId) -> Self::PinId

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

fn parent_cell_of_pin(&self, pin: &Self::PinId) -> Self::CellId

Get the ID of the parent circuit of this pin.
source§

fn pin_direction(&self, pin: &Self::PinId) -> Direction

Get the signal direction of the pin.
source§

fn each_pin_instance_vec( &self, circuit_instance: &Self::CellInstId ) -> Vec<Self::PinInstId>

Get a 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>

Get a 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),

Call a function for each pin instance connected to this net.
source§

fn each_pin_instance_of_net_vec( &self, net: &Self::NetId ) -> Vec<Self::PinInstId>

Get a 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>

Iterate over all pins of a circuit.
source§

fn for_each_pin_instance<F>(&self, circuit_inst: &Self::CellInstId, f: F)where F: FnMut(Self::PinInstId),

Call a function for each pin instance of the circuit instance.
source§

fn for_each_pin<F>(&self, circuit: &Self::CellId, f: F)where F: FnMut(Self::PinId),

Call a function for each pin of the circuit.
source§

fn each_pin_of_net_vec(&self, net: &Self::NetId) -> Vec<Self::PinId>

Get a 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>

Iterate over all pins of a net.
source§

fn net_one(&self, parent_circuit: &Self::CellId) -> Self::NetId

Get the net of the logical constant one.
source§

fn num_net_pin_instances(&self, net: &Self::NetId) -> usize

Get the number of pin instances that are connected to this net.
source§

fn pin_instance( &self, cell_inst: &Self::CellInstId, pin: &Self::PinId ) -> Self::PinInstId

Get the ID of a pin instance given the cell instance and the pin ID.
source§

fn net_of_pin(&self, pin: &Self::PinId) -> Option<Self::NetId>

Get the internal net attached to this pin.
source§

fn for_each_pin_of_net<F>(&self, net: &Self::NetId, f: F)where F: FnMut(Self::PinId),

Call a function for each pin connected to this net.
source§

fn net_of_pin_instance( &self, pin_instance: &Self::PinInstId ) -> Option<Self::NetId>

Get the external net attached to this pin instance.
source§

fn num_pins(&self, circuit: &Self::CellId) -> usize

Get the number of pins of a circuit.
source§

fn each_pin_instance<'a>( &'a self, circuit_instance: &Self::CellInstId ) -> Box<dyn Iterator<Item = Self::PinInstId> + 'a>

Iterate over all pin instances of a circuit.
source§

fn each_pin_vec(&self, circuit: &Self::CellId) -> Vec<Self::PinId>

Get a Vec with the IDs of all pins of this circuit.
source§

fn parent_of_pin_instance(&self, pin_inst: &Self::PinInstId) -> Self::CellInstId

Get the ID of the circuit instance that holds this pin instance.
source§

fn net_name(&self, net: &Self::NetId) -> Option<Self::NameType>

Get the name of the net.
source§

fn num_net_terminals(&self, net: &Self::NetId) -> usize

Get the number of terminals that are connected to this net.
source§

fn num_internal_nets(&self, circuit: &Self::CellId) -> usize

Return the number of nets defined inside a cell.
source§

fn each_pin_of_net<'a>( &'a self, net: &Self::NetId ) -> Box<dyn Iterator<Item = Self::PinId> + 'a>

Iterate over all pins of a net.
source§

fn net_zero(&self, parent_circuit: &Self::CellId) -> Self::NetId

Get the net of the logical constant zero.
source§

fn for_each_internal_net<F>(&self, circuit: &Self::CellId, f: F)where F: FnMut(Self::NetId),

Call a function for net of the circuit.
source§

fn pin_name(&self, pin: &Self::PinId) -> Self::NameType

Get the name of the pin.
source§

fn each_external_net_vec( &self, circuit_instance: &Self::CellInstId ) -> Vec<Self::NetId>

Get a vector of all external nets connected to the circuit instance. A net might appear more than once.
source§

fn parent_cell_of_net(&self, net: &Self::NetId) -> Self::CellId

Get the ID of the parent circuit of this net.
source§

fn net_by_name( &self, parent_circuit: &Self::CellId, name: &str ) -> Option<Self::NetId>

Find a net by its name inside the parent circuit. Returns None if no such net can be found.
source§

fn pin_by_name( &self, parent_circuit: &Self::CellId, name: &str ) -> Option<Self::PinId>

Find a pin by its name. Returns 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>

Iterate over all defined nets inside a circuit.
source§

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

Create a new pin in this cell. Also adds the pin to all instances of the cell.
source§

fn remove_pin(&mut self, id: &Self::PinId)

Remove the pin from this circuit and from all instances of this circuit.
source§

fn remove_net(&mut self, net: &Self::NetId)

Delete the net if it exists and disconnect all connected terminals.
source§

fn connect_pin( &mut self, pin: &Self::PinId, net: Option<Self::NetId> ) -> Option<Self::NetId>

Connect a pin to a net. Returns the old connected net, if any.
source§

fn connect_pin_instance( &mut self, pin: &Self::PinInstId, net: Option<Self::NetId> ) -> Option<Self::NetId>

Connect a pin instance to a net. Returns the old connected net, if any.
source§

fn create_net( &mut self, parent: &Self::CellId, name: Option<Self::NameType> ) -> Self::NetId

Create a net net that lives in the parent circuit.
source§

fn disconnect_pin(&mut self, pin: &Self::PinId) -> Option<Self::NetId>

Disconnect the pin from any connected net. Returns the old connected net, if any.
source§

fn rename_pin( &mut self, pin: &Self::PinId, new_name: Self::NameType ) -> Self::NameType

Change the name of the pin, returns the old name. Read more
source§

fn disconnect_pin_instance( &mut self, pin_instance: &Self::PinInstId ) -> Option<Self::NetId>

Disconnect the pin instance from any connected net. Returns the old connected net, if any.
source§

fn rename_net( &mut self, net_id: &Self::NetId, new_name: Option<Self::NameType> ) -> Option<Self::NameType>

Set a new name for the net. This might panic if the name already exists. Returns the old name.
source§

impl<'a, N, Lib, S> NetlistIds for SimpleSTA<'a, N, Lib, S>where N: NetlistBase, Lib: DelayBase + ConstraintBase,

§

type PinId = <N as NetlistIds>::PinId

Pin identifier type. Uniquely identifies a pin in the whole netlist.
§

type PinInstId = <N as NetlistIds>::PinInstId

Pin instance identifier type. Uniquely identifies a pin instance in the whole netlist. A pin instance is a pin of a circuit instance.
§

type NetId = <N as NetlistIds>::NetId

Net identifier type. Uniquely identifies a net in the whole netlist.
source§

impl<'a, N, Lib> TimingQuery for SimpleSTA<'a, N, Lib, TimingAvailable>where N: NetlistBase + 'static, Lib: DelayBase + ConstraintBase,

§

type NetlistIds = N

Type which defines IDs of netlist components.
§

type ArrivalTime = <Lib as TimingBase>::Signal

Type for the actual arrival times.
§

type RequiredArrivalTime = <Lib as ConstraintBase>::RequiredSignal

Type for required arrival times.
§

type Slack = <Lib as ConstraintBase>::Slack

Type for delays (time difference) such as slack.
source§

fn report_aat(&self, pin: TerminalId<N>) -> Option<Self::ArrivalTime>

Report arrival time. Assumes prior call to 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>

Report required arrival time. Assumes prior call to update_timing if the netlist was modified. Might panic otherwise.
source§

fn report_slack(&self, pin: TerminalId<N>) -> Option<Self::Slack>

Report slack (arrival time - required arrival time). Assumes prior call to update_timing if the netlist was modified. Might panic otherwise.
source§

fn report_timing(&self) -> Vec<()>

Report a list of worst paths.

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§

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.

§

impl<N> HierarchyEditUtil for Nwhere N: HierarchyEdit,

§

fn clear_cell_instances(&mut self, cell: &Self::CellId)

Remove all child instances inside the cell.
§

fn prune_cell_instance(&mut self, inst: &Self::CellInstId)

Remove the cell instance and all cells which are then not used anymore.
§

fn prune_cell(&mut self, cell: &Self::CellId)

Remove the cell and all other cells which are then not used anymore.
§

impl<T> HierarchyReferenceAccess for Twhere T: HierarchyBase,

§

fn each_cell_ref(&self) -> Box<dyn Iterator<Item = CellRef<'_, Self>>, Global>

Iterate over all cell objects.
§

fn cell_ref(&self, cell_id: &Self::CellId) -> CellRef<'_, Self>

Get a cell object by its ID.
§

fn cell_instance_ref(&self, inst_id: &Self::CellInstId) -> CellInstRef<'_, Self>

Get a cell instance object by its ID.
§

impl<N> HierarchyUtil for Nwhere N: HierarchyBase,

§

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

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

fn each_top_level_cell(&self) -> Box<dyn Iterator<Item = Self::CellId>, Global>

Iterate over all top level cells.
§

fn each_leaf_cell(&self) -> Box<dyn Iterator<Item = Self::CellId>, Global>

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

fn each_cell_bottom_to_top( &self ) -> Box<dyn Iterator<Item = Self::CellId>, Global>

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.

§

impl<L> LayoutEditUtil for Lwhere L: LayoutEdit,

§

fn find_or_create_layer(&mut self, index: u32, datatype: u32) -> Self::LayerId

Create a layer or return an existing one.
§

impl<T> LayoutReferenceAccess for Twhere T: LayoutBase,

§

fn shape_ref(&self, shape_id: &Self::ShapeId) -> ShapeRef<'_, Self>

Get a cell object by its ID.
§

fn layer_ref(&self, layer_id: &Self::LayerId) -> LayerRef<'_, Self>

Get a layer object by its ID.
§

fn each_layer_ref(&self) -> Box<dyn Iterator<Item = LayerRef<'_, Self>>, Global>

Iterate over all layers defined in this layout.
§

fn layer_ref_by_name(&self, name: &str) -> Option<LayerRef<'_, Self>>

Get a layer object by the layer name.
§

impl<N> NetlistEditUtil for Nwhere N: NetlistEdit + ?Sized,

§

fn connect_terminal( &mut self, terminal: &TerminalId<Self>, net: Option<Self::NetId> ) -> Option<Self::NetId>

Connect a terminal to a net. Returns the old connected net, if any.
§

fn disconnect_terminal( &mut self, terminal: &TerminalId<Self> ) -> Option<Self::NetId>

Disconnect the terminal from any connected net. Returns the old connected net, if any.
§

fn replace_net(&mut self, old_net: &Self::NetId, new_net: &Self::NetId)

Take all terminals that are connected to 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)

Replace the circuit instance with its contents. Remove the circuit instance afterwards. Does not purge nets nor unconnected instances. So there could be unconnected nets or unconnected instances. Read more
§

fn flatten_circuit(&mut self, circuit: &Self::CellId)

Flatten all instances of this circuit by replacing them with their content. Remove the circuit from the netlist afterwards. For top level circuits this is equivalent to removing them.
§

fn purge_nets_in_circuit(&mut self, circuit_id: &Self::CellId) -> usize

Delete all unconnected nets in this circuit. Return number of purged nets.
§

fn purge_nets(&mut self) -> usize

Delete all unconnected nets in all circuits. Return number of purged nets.
§

fn create_net_names_in_circuit( &mut self, circuit_id: &Self::CellId, prefix: &str )

Create names for all unnamed nets in the specified circuit. The names will consist of the prefix and an appended number. After calling this method, no net inside this circuit will be unnamed.
§

impl<T> NetlistReferenceAccess for Twhere T: NetlistBase,

§

fn pin_ref(&self, pin: &Self::PinId) -> PinRef<'_, Self>

Get a reference to a pin from a pin ID.
§

fn pin_instance_ref(&self, id: &Self::PinInstId) -> PinInstRef<'_, Self>

Get a reference to a pin instance.
§

fn net_ref(&self, net: &Self::NetId) -> NetRef<'_, Self>

Get a reference to a net.
§

fn terminal_ref(&self, t: &TerminalId<Self>) -> TerminalRef<'_, Self>

Get a reference to a terminal.
§

impl<N> NetlistUtil for Nwhere N: NetlistBase,

§

fn net_of_terminal(&self, terminal: &TerminalId<Self>) -> Option<Self::NetId>

Get the net that is attached to this terminal.
§

fn for_each_terminal_of_net<F>(&self, net: &Self::NetId, f: F)where F: FnMut(TerminalId<Self>),

Call a function for each terminal connected to this net.
§

fn each_terminal_of_net_vec( &self, net: &Self::NetId ) -> Vec<TerminalId<Self>, Global>

Get a Vec with all terminal IDs connected to this net.
§

fn each_terminal_of_net<'a>( &'a self, net: &Self::NetId ) -> Box<dyn Iterator<Item = TerminalId<Self>> + 'a, Global>

Iterate over all terminals of a net.
§

fn is_constant_net(&self, net: &Self::NetId) -> bool

Check if the net is either the constant LOW or HIGH.
§

fn nets_of_cell_instance( &self, inst: &Self::CellInstId ) -> Box<dyn Iterator<Item = Self::NetId>, Global>

Get all nets that are connected to the circuit instance.
§

fn for_each_circuit_instance_of_net<F>(&self, net: &Self::NetId, f: F)where F: FnMut(Self::CellInstId),

Visit all circuit instances connected to this net. An instance is touched not more than once.
§

fn each_circuit_instance_of_net_vec( &self, net: &Self::NetId ) -> Vec<Self::CellInstId, Global>

Iterate over all circuit instances connected to this net. An instance is touched not more than once.
§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Write the netlist in a human readable form.
§

impl<T> Pointable for T

§

const ALIGN: usize = mem::align_of::<T>()

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
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.
§

impl<L> L2NBaseMT for Lwhere L: L2NBase + LayoutBaseMT + NetlistBaseMT,

§

impl<LN> L2NIds for LNwhere LN: LayoutIds + NetlistIds,