Netlist

Struct Netlist 

Source
pub struct Netlist<I>
where I: Instantiable,
{ /* private fields */ }
Expand description

A netlist data structure

Implementations§

Source§

impl<I> Netlist<I>
where I: Instantiable,

Source

pub fn new(name: String) -> Rc<Self>

Creates a new netlist with the given name

Source

pub fn reclaim(self: Rc<Self>) -> Option<Self>

Attempts to reclaim the netlist, returning Some if successful.

Source

pub fn deep_clone(self: &Rc<Self>) -> Rc<Self>

Creates a deep clone of the netlist.

Source

pub fn insert_input(self: &Rc<Self>, net: Net) -> DrivenNet<I>

Inserts an input net to the netlist

Source

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

Source

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

Source

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.

Source

pub fn insert_constant( self: &Rc<Self>, value: Logic, inst_name: Identifier, ) -> Result<DrivenNet<I>, Error>

Inserts a constant Logic value to the netlist

Source

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

Source

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

Source

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

Source

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

Source

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.

Source

pub fn clear_outputs(&self)

Removes all outputs from the netlist.

Source

pub fn delete_net_uses(&self, netref: NetRef<I>) -> Result<Object<I>, Error>

Unlink a circuit node from the rest of the netlist. Return the object that was being stored.

§Panics

The netref does not belong to this netlist

Source

pub fn replace_net_uses( &self, of: DrivenNet<I>, with: &DrivenNet<I>, ) -> Result<Object<I>, Error>

Replaces the uses of a circuit node with another circuit node. The Object stored at of is returned.

§Panics

of or with do not belong to this netlist

Source§

impl<I> Netlist<I>
where I: Instantiable,

Source

pub fn get_name(&self) -> Ref<'_, String>

Returns the name of the netlist module

Source

pub fn set_name(&self, name: String)

Sets the name of the netlist module

§Panics

Panics if the module name cannot be borrowed mutably.

Source

pub fn get_input_ports(&self) -> impl Iterator<Item = Net>

Iterates over the input ports of the netlist.

Source

pub fn get_output_ports(&self) -> Vec<Net>

Returns a list of output nets

Source

pub fn get_analysis<'a, A: Analysis<'a, I>>(&'a self) -> Result<A, Error>

Constructs an analysis of the netlist.

Source

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.

Source

pub fn first(&self) -> Option<NetRef<I>>

Returns a NetRef to the first circuit node

Source

pub fn last(&self) -> Option<NetRef<I>>

Returns a NetRef to the last circuit node

Source

pub fn len(&self) -> usize

Returns the number of objects in the netlist (instances + inputs)

Source

pub fn is_empty(&self) -> bool

Returns true if the netlist contains no objects.

Source

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

Source

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"
Source

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

Source

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

pub fn retain( &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).

Source

pub fn verify(&self) -> Result<(), Error>

Verifies that a netlist is well-formed.

Source§

impl<I> Netlist<I>
where I: Instantiable,

Source

pub fn objects(&self) -> impl Iterator<Item = NetRef<I>>

Returns an iterator over the circuit nodes in the netlist.

Source

pub fn matches<F>(&self, filter: F) -> impl Iterator<Item = NetRef<I>>
where F: Fn(&I) -> bool,

Returns an iterator over the circuit nodes that match the instance type.

Source

pub fn inputs(&self) -> impl Iterator<Item = DrivenNet<I>>

Returns an iterator to principal inputs in the netlist as references.

Source

pub fn outputs(&self) -> Vec<(DrivenNet<I>, Net)>

Returns an iterator to circuit nodes that drive an output in the netlist.

Source

pub fn connections(&self) -> impl Iterator<Item = Connection<I>>

Returns an iterator over the wire connections in the netlist.

Source

pub fn node_dfs(&self, from: NetRef<I>) -> impl Iterator<Item = NetRef<I>>

Returns a depth-first search iterator over the nodes in the netlist.

§Panics

from does not belong to this netlist

Source

pub fn net_dfs(&self, from: DrivenNet<I>) -> impl Iterator<Item = DrivenNet<I>>

Returns a depth-first search iterator over the nodes in the netlist, with the nodes in DrivenNet form.

§Panics

from does not belong to this netlist

Trait Implementations§

Source§

impl<I> Debug for Netlist<I>
where I: Instantiable + Debug,

Source§

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

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

impl<I> Display for Netlist<I>
where I: Instantiable,

Source§

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

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

impl<'a, I> IntoIterator for &'a Netlist<I>
where I: Instantiable,

Source§

type Item = Net

The type of the elements being iterated over.
Source§

type IntoIter = NetIterator<'a, I>

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> Self::IntoIter

Creates an iterator from a value. Read more

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> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

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

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

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

Source§

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

Mutably borrows from an owned value. Read more
Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

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

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows 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
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows 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
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .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
where Self: BorrowMut<B>, B: ?Sized,

Calls .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
where Self: AsRef<R>, R: ?Sized,

Calls .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
where Self: AsMut<R>, R: ?Sized,

Calls .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
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

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

Performs the conversion.
Source§

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

Source§

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

The type returned in the event of a conversion error.
Source§

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

Performs the conversion.