pub struct Netlist<I>where
I: Instantiable,{ /* private fields */ }Expand description
A netlist data structure
Implementations§
Source§impl<I> Netlist<I>where
I: Instantiable,
impl<I> Netlist<I>where
I: Instantiable,
Sourcepub fn reclaim(self: Rc<Self>) -> Option<Self>
pub fn reclaim(self: Rc<Self>) -> Option<Self>
Attempts to reclaim the netlist, returning Some if successful.
Sourcepub fn deep_clone(self: &Rc<Self>) -> Rc<Self>
pub fn deep_clone(self: &Rc<Self>) -> Rc<Self>
Creates a deep clone of the netlist.
Sourcepub fn insert_input(self: &Rc<Self>, net: Net) -> DrivenNet<I>
pub fn insert_input(self: &Rc<Self>, net: Net) -> DrivenNet<I>
Inserts an input net to the netlist
Sourcepub fn insert_input_escaped_logic_bus(
self: &Rc<Self>,
net: String,
bw: usize,
) -> Vec<DrivenNet<I>>
pub fn insert_input_escaped_logic_bus( self: &Rc<Self>, net: String, bw: usize, ) -> Vec<DrivenNet<I>>
Inserts a four-state logic input port to the netlist
Sourcepub fn insert_gate(
self: &Rc<Self>,
inst_type: I,
inst_name: Identifier,
operands: &[DrivenNet<I>],
) -> Result<NetRef<I>, Error>
pub fn insert_gate( self: &Rc<Self>, inst_type: I, inst_name: Identifier, operands: &[DrivenNet<I>], ) -> Result<NetRef<I>, Error>
Inserts a gate to the netlist
Sourcepub fn insert_gate_disconnected(
self: &Rc<Self>,
inst_type: I,
inst_name: Identifier,
) -> NetRef<I>
pub fn insert_gate_disconnected( self: &Rc<Self>, inst_type: I, inst_name: Identifier, ) -> NetRef<I>
Use interior mutability to add an object to the netlist. Returns a mutable reference to the created object.
Sourcepub fn insert_constant(
self: &Rc<Self>,
value: Logic,
inst_name: Identifier,
) -> Result<DrivenNet<I>, Error>
pub fn insert_constant( self: &Rc<Self>, value: Logic, inst_name: Identifier, ) -> Result<DrivenNet<I>, Error>
Inserts a constant Logic value to the netlist
Sourcepub fn get_driver(&self, netref: NetRef<I>, index: usize) -> Option<NetRef<I>>
pub fn get_driver(&self, netref: NetRef<I>, index: usize) -> Option<NetRef<I>>
Returns the driving node at input position index for netref
§Panics
Panics if index is out of bounds
The netref does not belong to this netlist
Sourcepub fn expose_net_with_name(
&self,
net: DrivenNet<I>,
name: Identifier,
) -> DrivenNet<I>
pub fn expose_net_with_name( &self, net: DrivenNet<I>, name: Identifier, ) -> DrivenNet<I>
Set an added object as a top-level output with a specific name. Multiple calls with different names for the same net will create multiple aliases.
§Panics
The net does not belong to this netlist
Sourcepub fn expose_net(&self, net: DrivenNet<I>) -> Result<DrivenNet<I>, Error>
pub fn expose_net(&self, net: DrivenNet<I>) -> Result<DrivenNet<I>, Error>
Sets the current net as a top-level output using the current name of the net
§Panics
The net does not belong to this netlist
Sourcepub fn remove_output(
&self,
operand: &DrivenNet<I>,
net_name: &Identifier,
) -> bool
pub fn remove_output( &self, operand: &DrivenNet<I>, net_name: &Identifier, ) -> bool
Removes a specific output alias by its operand and net name. Returns true if the output was removed, false if it didn’t exist.
§Panics
The operand does not belong to this netlist
Sourcepub fn remove_outputs(&self, operand: &DrivenNet<I>) -> usize
pub fn remove_outputs(&self, operand: &DrivenNet<I>) -> usize
Removes all output aliases for a specific operand. Returns the number of outputs that were removed.
Sourcepub fn clear_outputs(&self)
pub fn clear_outputs(&self)
Removes all outputs from the netlist.
Source§impl<I> Netlist<I>where
I: Instantiable,
impl<I> Netlist<I>where
I: Instantiable,
Sourcepub fn get_input_ports(&self) -> impl Iterator<Item = Net>
pub fn get_input_ports(&self) -> impl Iterator<Item = Net>
Iterates over the input ports of the netlist.
Sourcepub fn get_output_ports(&self) -> Vec<Net>
pub fn get_output_ports(&self) -> Vec<Net>
Returns a list of output nets
Sourcepub fn get_analysis<'a, A: Analysis<'a, I>>(&'a self) -> Result<A, Error>
pub fn get_analysis<'a, A: Analysis<'a, I>>(&'a self) -> Result<A, Error>
Constructs an analysis of the netlist.
Sourcepub fn find_net(&self, net: &Net) -> Option<DrivenNet<I>>
pub fn find_net(&self, net: &Net) -> Option<DrivenNet<I>>
Finds the first circuit node that drives the net. This operation is O(n).
This should be unique provided the netlist is well-formed.
Sourcepub fn drives_an_output(&self, netref: NetRef<I>) -> bool
pub fn drives_an_output(&self, netref: NetRef<I>) -> bool
Returns true if an output of netref which is driving a module output.
§Panics
The netref does not belong to this netlist
Sourcepub fn rename_nets<F: Fn(&Identifier, usize) -> Identifier>(
&self,
f: F,
) -> Result<(), Error>
pub fn rename_nets<F: Fn(&Identifier, usize) -> Identifier>( &self, f: F, ) -> Result<(), Error>
Rename nets and instances in the netlist using the provided injective function. Returns an error if the function is not injective.
§Examples
use safety_net::format_id;
use safety_net::{Gate, GateNetlist};
let netlist = GateNetlist::new("example".to_string());
let inv = Gate::new_logical("INV".into(), vec!["A".into()], "Y".into());
let foo = netlist.insert_input("foo".into());
let nr = netlist.insert_gate(inv, "bar".into(), &[foo]).unwrap();
nr.expose_with_name("baz".into());
netlist.rename_nets(|id, i| format_id!("{}_{}", id, i) ).unwrap();
// "bar_Y" -> "bar_Y_0"
// "bar" -> "bar_1"Sourcepub fn retain_once(
&self,
set: &mut HashSet<DrivenNet<I>>,
) -> Result<Vec<Object<I>>, Error>
pub fn retain_once( &self, set: &mut HashSet<DrivenNet<I>>, ) -> Result<Vec<Object<I>>, Error>
Retains the DrivenNets in set, given they are used. Otherwise, they are cleaned and returned in a Ok(vec).
Sourcepub fn clean(&self) -> Result<Vec<Object<I>>, Error>
pub fn clean(&self) -> Result<Vec<Object<I>>, Error>
Removes unused nodes from the netlist, until it stops changing.
Returns Ok(vec) of the removed objects.
Source§impl<I> Netlist<I>where
I: Instantiable,
impl<I> Netlist<I>where
I: Instantiable,
Sourcepub fn objects(&self) -> impl Iterator<Item = NetRef<I>>
pub fn objects(&self) -> impl Iterator<Item = NetRef<I>>
Returns an iterator over the circuit nodes in the netlist.
Sourcepub fn matches<F>(&self, filter: F) -> impl Iterator<Item = NetRef<I>>
pub fn matches<F>(&self, filter: F) -> impl Iterator<Item = NetRef<I>>
Returns an iterator over the circuit nodes that match the instance type.
Sourcepub fn inputs(&self) -> impl Iterator<Item = DrivenNet<I>>
pub fn inputs(&self) -> impl Iterator<Item = DrivenNet<I>>
Returns an iterator to principal inputs in the netlist as references.
Sourcepub fn outputs(&self) -> Vec<(DrivenNet<I>, Net)>
pub fn outputs(&self) -> Vec<(DrivenNet<I>, Net)>
Returns an iterator to circuit nodes that drive an output in the netlist.
Sourcepub fn connections(&self) -> impl Iterator<Item = Connection<I>>
pub fn connections(&self) -> impl Iterator<Item = Connection<I>>
Returns an iterator over the wire connections in the netlist.
Trait Implementations§
Source§impl<I> Display for Netlist<I>where
I: Instantiable,
impl<I> Display for Netlist<I>where
I: Instantiable,
Source§impl<'a, I> IntoIterator for &'a Netlist<I>where
I: Instantiable,
impl<'a, I> IntoIterator for &'a Netlist<I>where
I: Instantiable,
Auto Trait Implementations§
impl<I> !Freeze for Netlist<I>
impl<I> !RefUnwindSafe for Netlist<I>
impl<I> !Send for Netlist<I>
impl<I> !Sync for Netlist<I>
impl<I> Unpin for Netlist<I>
impl<I> !UnwindSafe for Netlist<I>
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
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.