pub struct Circuit { /* private fields */ }
Expand description
Combinational circuit with negation as well as n-ary AND, OR, and XOR gates
Implementations§
Source§impl Circuit
impl Circuit
Sourcepub fn inputs_mut(&mut self) -> &mut VarSet
pub fn inputs_mut(&mut self) -> &mut VarSet
Get a mutable reference to the circuit inputs
Sourcepub fn reserve_gates(&mut self, additional: usize)
pub fn reserve_gates(&mut self, additional: usize)
Reserve space for at least additional
more gates. Note that this will
not reserve space for gate inputs. To that end, use
Self::reserve_gate_inputs()
.
This is essentially a wrapper around Vec::reserve()
, so the
documentation there provides more details.
Sourcepub fn reserve_gate_inputs(&mut self, additional: usize)
pub fn reserve_gate_inputs(&mut self, additional: usize)
Reserve space for at least additional
more gate inputs (the space is
shared between all gates). Note that this will not reserve space for
the gate metadata. To that end, use Self::reserve_gates()
.
This is essentially a wrapper around Vec::reserve()
, so the
documentation there provides more details.
Sourcepub fn gate(&self, literal: Literal) -> Option<Gate<'_>>
pub fn gate(&self, literal: Literal) -> Option<Gate<'_>>
Get the Gate
for literal
Returns None
iff literal
refers to a constant, a circuit input, or
a gate that is not present in this circuit.
See also: Self::gate_for_no()
Sourcepub fn gate_for_no(&self, gate_no: Var) -> Option<Gate<'_>>
pub fn gate_for_no(&self, gate_no: Var) -> Option<Gate<'_>>
Get the Gate
for gate_no
Returns None
iff literal
refers to a gate that is not present in
this circuit.
See also: Self::gate()
Sourcepub fn gate_inputs_mut(&mut self, literal: Literal) -> Option<&mut [Literal]>
pub fn gate_inputs_mut(&mut self, literal: Literal) -> Option<&mut [Literal]>
Get a mutable reference to the gate inputs
Returns None
iff literal
refers to a constant, a circuit input, or
a gate that is not present in this circuit.
Sourcepub fn gate_inputs_mut_for_no(&mut self, gate_no: Var) -> Option<&mut [Literal]>
pub fn gate_inputs_mut_for_no(&mut self, gate_no: Var) -> Option<&mut [Literal]>
Get a mutable reference to the gate inputs
Returns None
iff literal
refers to a constant, a circuit input, or
a gate that is not present in this circuit.
Sourcepub fn set_gate_kind(&mut self, literal: Literal, kind: GateKind)
pub fn set_gate_kind(&mut self, literal: Literal, kind: GateKind)
Set the kind of the gate referenced by literal
Panics if literal
does not refer to a gate in this circuit.
Sourcepub fn set_gate_kind_for_no(&mut self, gate_no: Var, kind: GateKind)
pub fn set_gate_kind_for_no(&mut self, gate_no: Var, kind: GateKind)
Set the kind of the gate referenced by gate_no
Panics if literal
does not refer to a gate in this circuit.
Sourcepub fn set_last_gate_kind(&mut self, kind: GateKind)
pub fn set_last_gate_kind(&mut self, kind: GateKind)
Set the kind of the gate referenced by literal
Panics if the circuit is empty.
Sourcepub fn first_gate(&self) -> Option<Gate<'_>>
pub fn first_gate(&self) -> Option<Gate<'_>>
Get the first gate
Returns None
iff literal
refers to a constant, a circuit input, or
a gate that is not present in this circuit.
Sourcepub fn last_gate(&self) -> Option<Gate<'_>>
pub fn last_gate(&self) -> Option<Gate<'_>>
Get the last gate
Returns None
iff literal
refers to a constant, a circuit input, or
a gate that is not present in this circuit.
Sourcepub fn push_gate(&mut self, kind: GateKind) -> Literal
pub fn push_gate(&mut self, kind: GateKind) -> Literal
Create a new empty gate at the end of the sequence
Sourcepub fn pop_gate(&mut self) -> bool
pub fn pop_gate(&mut self) -> bool
Remove the last gate (if there is one)
Returns true iff the number of gates was positive before removal.
Sourcepub fn push_gate_input(&mut self, literal: Literal)
pub fn push_gate_input(&mut self, literal: Literal)
Add an input to the last gate
There must be already one gate in the circuit, otherwise this method triggers a debug assertion or does not do anything, respectively.
Sourcepub fn push_gate_inputs(&mut self, literals: impl IntoIterator<Item = Literal>)
pub fn push_gate_inputs(&mut self, literals: impl IntoIterator<Item = Literal>)
Add inputs to the last gate
There must be already one gate in the circuit, otherwise this method triggers a debug assertion or does not do anything, respectively.
Sourcepub fn iter_gates(&self) -> CircuitGateIter<'_> ⓘ
pub fn iter_gates(&self) -> CircuitGateIter<'_> ⓘ
Iterate over all gates in the circuit
The iteration order is from first to last in the gate sequence.
Sourcepub fn retain_gates(&mut self, predicate: impl FnMut(&mut [Literal]) -> bool)
pub fn retain_gates(&mut self, predicate: impl FnMut(&mut [Literal]) -> bool)
Retain the gates for which predicate
returns true
Note that removing one gate changes the gate numbers of all subsequent gates, but this method does not automatically update the gate inputs.
Sourcepub fn clear_gates(&mut self)
pub fn clear_gates(&mut self)
Remove all gate definitions from the circuit
Sourcepub fn find_cycle(&self) -> Option<Literal>
pub fn find_cycle(&self) -> Option<Literal>
Check if this circuit is acyclic
Returns None
if acyclic, or Some(literal)
if literal
depends on itself.
Sourcepub fn simplify(
&self,
roots: impl IntoIterator<Item = Literal>,
) -> Result<(Self, Vec<Literal>), Literal>
pub fn simplify( &self, roots: impl IntoIterator<Item = Literal>, ) -> Result<(Self, Vec<Literal>), Literal>
Simplify the circuit such that
- no gate has constant inputs
- no inputs of XOR gates are negated (only the output)
- for every gate, all its inputs are distinct (disregarding polarities)
- all gates have at least two inputs
- there are no two structurally equivalent gates (same kind and inputs, disregarding the input order)
Additionally, the new circuit will only contain gates reachable from
roots
. The order of gate inputs in the resulting circuit follows the
order of the first discovered equivalent gate (with duplicates etc.
removed).
If the reachable circuit fragment contains a cycle, this method returns
Err(l)
, where l
represents a gate that is part of the cycle.
Likewise, if the reachable fragment depends on unknown inputs
(input_number >= self.inputs().len()
, including Literal::UNDEF
),
the return value is Err(l)
, where l
is the unknown literal.
On success, the gates in the returned circuit are topologically sorted.
The additional Vec<Literal>
maps the gates of self
to literals valid
in the simplified circuit.
Hint: Problem::simplify
uses this method to simplify the circuit and
also maps the
Trait Implementations§
impl Eq for Circuit
impl StructuralPartialEq for Circuit
Auto Trait Implementations§
impl Freeze for Circuit
impl RefUnwindSafe for Circuit
impl Send for Circuit
impl Sync for Circuit
impl Unpin for Circuit
impl UnwindSafe for Circuit
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
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.