Skip to main content

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

Examples found in repository?
examples/simple.rs (line 8)
7fn main() {
8    let netlist = Netlist::new("example".to_string());
9
10    // Add the the two inputs
11    let a = netlist.insert_input("a".into());
12    let b = netlist.insert_input("b".into());
13
14    // Instantiate an AND gate
15    let instance = netlist
16        .insert_gate(and_gate(), "inst_0".into(), &[a, b])
17        .unwrap();
18
19    // Make this AND gate an output
20    instance.expose_with_name("y".into());
21
22    // Print the netlist
23    println!("{netlist}");
24}
More examples
Hide additional examples
examples/dont_touch.rs (line 8)
7fn main() {
8    let netlist = Netlist::new("example".to_string());
9
10    // Add the the two inputs
11    let a = netlist.insert_input("a".into());
12    let b = netlist.insert_input("b".into());
13
14    // Instantiate an AND gate
15    let instance = netlist
16        .insert_gate(and_gate(), "inst_0".into(), &[a, b])
17        .unwrap();
18
19    // Make this AND gate an output
20    instance.set_attribute("dont_touch".to_string());
21    instance.expose_with_name("y".into());
22
23    for nr in dont_touch_filter(&netlist) {
24        println!("Don't touch: {nr}");
25    }
26}
examples/variants.rs (line 65)
64fn main() {
65    let netlist = Netlist::new("example".to_string());
66
67    // Add the the two inputs
68    let a = netlist.insert_input("a".into());
69    let b = netlist.insert_input("b".into());
70
71    // Instantiate an AND gate
72    let instance = netlist
73        .insert_gate(and_gate(), "inst_0".into(), &[a, b])
74        .unwrap();
75
76    // Make this AND gate an output
77    instance.expose_with_name("y".into());
78
79    // Print the netlist
80    println!("{netlist}");
81    for node in filter_nodes!(netlist, Gate::And(_, _, _)) {
82        println!("Found AND gate: {node}");
83    }
84}
examples/lut.rs (line 110)
109fn main() {
110    let netlist = Netlist::new("example".to_string());
111
112    // Add the the two inputs
113    let a = netlist.insert_input("a".into());
114    let b = netlist.insert_input("b".into());
115
116    // Instantiate an NAND gate
117    let instance = netlist
118        .insert_gate(Lut::new(2, 7), "inst_0".into(), &[a, b])
119        .unwrap();
120
121    // Let's make it an AND gate by inverting the lookup table
122    instance.get_instance_type_mut().unwrap().invert();
123
124    // Make this LUT an output
125    instance.expose_with_name("y".into());
126
127    // Print the netlist
128    println!("{netlist}");
129
130    #[cfg(feature = "serde")]
131    {
132        let res = netlist.reclaim().unwrap().serialize(std::io::stdout());
133        if res.is_err() {
134            eprintln!("Failed to serialize netlist: {:?}", res.err());
135        }
136    }
137}
examples/connections.rs (line 17)
16fn ripple_adder() -> Netlist<Gate> {
17    let netlist = Netlist::new("ripple_adder".to_string());
18    let bitwidth = 4;
19
20    // Add the the inputs
21    let a_vec = netlist.insert_input_escaped_logic_bus("a".to_string(), bitwidth);
22    let b_vec = netlist.insert_input_escaped_logic_bus("b".to_string(), bitwidth);
23    let mut carry: DrivenNet<Gate> = netlist.insert_input("cin".into());
24
25    for i in 0..bitwidth {
26        // Instantiate a full adder for each bit
27        let fa = netlist.insert_gate_disconnected(full_adder(), format_id!("fa_{i}"));
28
29        // Connect A_i and B_i
30        fa.get_input(1).connect(a_vec[i].clone());
31        fa.get_input(2).connect(b_vec[i].clone());
32
33        // Connect with the prev carry
34        carry.connect(fa.get_input(0));
35
36        // Expose the sum
37        fa.expose_net(&fa.get_net(0)).unwrap();
38
39        carry = fa.get_output(1);
40
41        if i == bitwidth - 1 {
42            // Last full adder, expose the carry out
43            fa.get_net_mut(1).set_identifier("cout".into());
44            fa.expose_net(&fa.get_net(1)).unwrap();
45        }
46    }
47
48    netlist.reclaim().unwrap()
49}
Source

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

Attempts to reclaim the netlist, returning Some if successful.

Examples found in repository?
examples/connections.rs (line 48)
16fn ripple_adder() -> Netlist<Gate> {
17    let netlist = Netlist::new("ripple_adder".to_string());
18    let bitwidth = 4;
19
20    // Add the the inputs
21    let a_vec = netlist.insert_input_escaped_logic_bus("a".to_string(), bitwidth);
22    let b_vec = netlist.insert_input_escaped_logic_bus("b".to_string(), bitwidth);
23    let mut carry: DrivenNet<Gate> = netlist.insert_input("cin".into());
24
25    for i in 0..bitwidth {
26        // Instantiate a full adder for each bit
27        let fa = netlist.insert_gate_disconnected(full_adder(), format_id!("fa_{i}"));
28
29        // Connect A_i and B_i
30        fa.get_input(1).connect(a_vec[i].clone());
31        fa.get_input(2).connect(b_vec[i].clone());
32
33        // Connect with the prev carry
34        carry.connect(fa.get_input(0));
35
36        // Expose the sum
37        fa.expose_net(&fa.get_net(0)).unwrap();
38
39        carry = fa.get_output(1);
40
41        if i == bitwidth - 1 {
42            // Last full adder, expose the carry out
43            fa.get_net_mut(1).set_identifier("cout".into());
44            fa.expose_net(&fa.get_net(1)).unwrap();
45        }
46    }
47
48    netlist.reclaim().unwrap()
49}
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

Examples found in repository?
examples/simple.rs (line 11)
7fn main() {
8    let netlist = Netlist::new("example".to_string());
9
10    // Add the the two inputs
11    let a = netlist.insert_input("a".into());
12    let b = netlist.insert_input("b".into());
13
14    // Instantiate an AND gate
15    let instance = netlist
16        .insert_gate(and_gate(), "inst_0".into(), &[a, b])
17        .unwrap();
18
19    // Make this AND gate an output
20    instance.expose_with_name("y".into());
21
22    // Print the netlist
23    println!("{netlist}");
24}
More examples
Hide additional examples
examples/dont_touch.rs (line 11)
7fn main() {
8    let netlist = Netlist::new("example".to_string());
9
10    // Add the the two inputs
11    let a = netlist.insert_input("a".into());
12    let b = netlist.insert_input("b".into());
13
14    // Instantiate an AND gate
15    let instance = netlist
16        .insert_gate(and_gate(), "inst_0".into(), &[a, b])
17        .unwrap();
18
19    // Make this AND gate an output
20    instance.set_attribute("dont_touch".to_string());
21    instance.expose_with_name("y".into());
22
23    for nr in dont_touch_filter(&netlist) {
24        println!("Don't touch: {nr}");
25    }
26}
examples/variants.rs (line 68)
64fn main() {
65    let netlist = Netlist::new("example".to_string());
66
67    // Add the the two inputs
68    let a = netlist.insert_input("a".into());
69    let b = netlist.insert_input("b".into());
70
71    // Instantiate an AND gate
72    let instance = netlist
73        .insert_gate(and_gate(), "inst_0".into(), &[a, b])
74        .unwrap();
75
76    // Make this AND gate an output
77    instance.expose_with_name("y".into());
78
79    // Print the netlist
80    println!("{netlist}");
81    for node in filter_nodes!(netlist, Gate::And(_, _, _)) {
82        println!("Found AND gate: {node}");
83    }
84}
examples/lut.rs (line 113)
109fn main() {
110    let netlist = Netlist::new("example".to_string());
111
112    // Add the the two inputs
113    let a = netlist.insert_input("a".into());
114    let b = netlist.insert_input("b".into());
115
116    // Instantiate an NAND gate
117    let instance = netlist
118        .insert_gate(Lut::new(2, 7), "inst_0".into(), &[a, b])
119        .unwrap();
120
121    // Let's make it an AND gate by inverting the lookup table
122    instance.get_instance_type_mut().unwrap().invert();
123
124    // Make this LUT an output
125    instance.expose_with_name("y".into());
126
127    // Print the netlist
128    println!("{netlist}");
129
130    #[cfg(feature = "serde")]
131    {
132        let res = netlist.reclaim().unwrap().serialize(std::io::stdout());
133        if res.is_err() {
134            eprintln!("Failed to serialize netlist: {:?}", res.err());
135        }
136    }
137}
examples/connections.rs (line 23)
16fn ripple_adder() -> Netlist<Gate> {
17    let netlist = Netlist::new("ripple_adder".to_string());
18    let bitwidth = 4;
19
20    // Add the the inputs
21    let a_vec = netlist.insert_input_escaped_logic_bus("a".to_string(), bitwidth);
22    let b_vec = netlist.insert_input_escaped_logic_bus("b".to_string(), bitwidth);
23    let mut carry: DrivenNet<Gate> = netlist.insert_input("cin".into());
24
25    for i in 0..bitwidth {
26        // Instantiate a full adder for each bit
27        let fa = netlist.insert_gate_disconnected(full_adder(), format_id!("fa_{i}"));
28
29        // Connect A_i and B_i
30        fa.get_input(1).connect(a_vec[i].clone());
31        fa.get_input(2).connect(b_vec[i].clone());
32
33        // Connect with the prev carry
34        carry.connect(fa.get_input(0));
35
36        // Expose the sum
37        fa.expose_net(&fa.get_net(0)).unwrap();
38
39        carry = fa.get_output(1);
40
41        if i == bitwidth - 1 {
42            // Last full adder, expose the carry out
43            fa.get_net_mut(1).set_identifier("cout".into());
44            fa.expose_net(&fa.get_net(1)).unwrap();
45        }
46    }
47
48    netlist.reclaim().unwrap()
49}
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

Examples found in repository?
examples/connections.rs (line 21)
16fn ripple_adder() -> Netlist<Gate> {
17    let netlist = Netlist::new("ripple_adder".to_string());
18    let bitwidth = 4;
19
20    // Add the the inputs
21    let a_vec = netlist.insert_input_escaped_logic_bus("a".to_string(), bitwidth);
22    let b_vec = netlist.insert_input_escaped_logic_bus("b".to_string(), bitwidth);
23    let mut carry: DrivenNet<Gate> = netlist.insert_input("cin".into());
24
25    for i in 0..bitwidth {
26        // Instantiate a full adder for each bit
27        let fa = netlist.insert_gate_disconnected(full_adder(), format_id!("fa_{i}"));
28
29        // Connect A_i and B_i
30        fa.get_input(1).connect(a_vec[i].clone());
31        fa.get_input(2).connect(b_vec[i].clone());
32
33        // Connect with the prev carry
34        carry.connect(fa.get_input(0));
35
36        // Expose the sum
37        fa.expose_net(&fa.get_net(0)).unwrap();
38
39        carry = fa.get_output(1);
40
41        if i == bitwidth - 1 {
42            // Last full adder, expose the carry out
43            fa.get_net_mut(1).set_identifier("cout".into());
44            fa.expose_net(&fa.get_net(1)).unwrap();
45        }
46    }
47
48    netlist.reclaim().unwrap()
49}
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

Examples found in repository?
examples/simple.rs (line 16)
7fn main() {
8    let netlist = Netlist::new("example".to_string());
9
10    // Add the the two inputs
11    let a = netlist.insert_input("a".into());
12    let b = netlist.insert_input("b".into());
13
14    // Instantiate an AND gate
15    let instance = netlist
16        .insert_gate(and_gate(), "inst_0".into(), &[a, b])
17        .unwrap();
18
19    // Make this AND gate an output
20    instance.expose_with_name("y".into());
21
22    // Print the netlist
23    println!("{netlist}");
24}
More examples
Hide additional examples
examples/dont_touch.rs (line 16)
7fn main() {
8    let netlist = Netlist::new("example".to_string());
9
10    // Add the the two inputs
11    let a = netlist.insert_input("a".into());
12    let b = netlist.insert_input("b".into());
13
14    // Instantiate an AND gate
15    let instance = netlist
16        .insert_gate(and_gate(), "inst_0".into(), &[a, b])
17        .unwrap();
18
19    // Make this AND gate an output
20    instance.set_attribute("dont_touch".to_string());
21    instance.expose_with_name("y".into());
22
23    for nr in dont_touch_filter(&netlist) {
24        println!("Don't touch: {nr}");
25    }
26}
examples/variants.rs (line 73)
64fn main() {
65    let netlist = Netlist::new("example".to_string());
66
67    // Add the the two inputs
68    let a = netlist.insert_input("a".into());
69    let b = netlist.insert_input("b".into());
70
71    // Instantiate an AND gate
72    let instance = netlist
73        .insert_gate(and_gate(), "inst_0".into(), &[a, b])
74        .unwrap();
75
76    // Make this AND gate an output
77    instance.expose_with_name("y".into());
78
79    // Print the netlist
80    println!("{netlist}");
81    for node in filter_nodes!(netlist, Gate::And(_, _, _)) {
82        println!("Found AND gate: {node}");
83    }
84}
examples/lut.rs (line 118)
109fn main() {
110    let netlist = Netlist::new("example".to_string());
111
112    // Add the the two inputs
113    let a = netlist.insert_input("a".into());
114    let b = netlist.insert_input("b".into());
115
116    // Instantiate an NAND gate
117    let instance = netlist
118        .insert_gate(Lut::new(2, 7), "inst_0".into(), &[a, b])
119        .unwrap();
120
121    // Let's make it an AND gate by inverting the lookup table
122    instance.get_instance_type_mut().unwrap().invert();
123
124    // Make this LUT an output
125    instance.expose_with_name("y".into());
126
127    // Print the netlist
128    println!("{netlist}");
129
130    #[cfg(feature = "serde")]
131    {
132        let res = netlist.reclaim().unwrap().serialize(std::io::stdout());
133        if res.is_err() {
134            eprintln!("Failed to serialize netlist: {:?}", res.err());
135        }
136    }
137}
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.

Examples found in repository?
examples/connections.rs (line 27)
16fn ripple_adder() -> Netlist<Gate> {
17    let netlist = Netlist::new("ripple_adder".to_string());
18    let bitwidth = 4;
19
20    // Add the the inputs
21    let a_vec = netlist.insert_input_escaped_logic_bus("a".to_string(), bitwidth);
22    let b_vec = netlist.insert_input_escaped_logic_bus("b".to_string(), bitwidth);
23    let mut carry: DrivenNet<Gate> = netlist.insert_input("cin".into());
24
25    for i in 0..bitwidth {
26        // Instantiate a full adder for each bit
27        let fa = netlist.insert_gate_disconnected(full_adder(), format_id!("fa_{i}"));
28
29        // Connect A_i and B_i
30        fa.get_input(1).connect(a_vec[i].clone());
31        fa.get_input(2).connect(b_vec[i].clone());
32
33        // Connect with the prev carry
34        carry.connect(fa.get_input(0));
35
36        // Expose the sum
37        fa.expose_net(&fa.get_net(0)).unwrap();
38
39        carry = fa.get_output(1);
40
41        if i == bitwidth - 1 {
42            // Last full adder, expose the carry out
43            fa.get_net_mut(1).set_identifier("cout".into());
44            fa.expose_net(&fa.get_net(1)).unwrap();
45        }
46    }
47
48    netlist.reclaim().unwrap()
49}
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 clean_once(&self) -> Result<Vec<Object<I>>, Error>

Cleans unused nodes from the netlist, returning Ok(vec) of the removed objects.

Source

pub fn clean(&self) -> Result<Vec<Object<I>>, Error>

Greedly removes unused nodes from the netlist, until it stops changing. Returns Ok(vec) of the removed objects.

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