This module contains the basic definitions for an AIG (And Inverter Graph) in the style of AIGNET, as described in https://arxiv.org/pdf/1304.7861.pdf section 3. It consists of an AIG definition, a description of its semantics and basic operations to construct nodes in the AIG.
A circuit node. These are not recursive but instead contain indices into an AIG, with inputs indexed by α.
- const: {α : Type} → Bool → Std.Sat.AIG.Decl α
A node with a constant output value.
- atom: {α : Type} → α → Std.Sat.AIG.Decl α
An input node to the circuit.
- gate: {α : Type} → Nat → Nat → Bool → Bool → Std.Sat.AIG.Decl α
An AIG gate with configurable input nodes and polarity.
landrare the input node indices whilelinvandrinvsay whether there is an inverter on the left and right inputs, respectively.
Instances For
Equations
- Std.Sat.AIG.instHashableDecl = { hash := Std.Sat.AIG.hashDecl✝ }
Cache.WF xs is a predicate asserting that a cache : HashMap (Decl α) Nat is a valid lookup
cache for xs : Array (Decl α), that is, whenever cache.find? decl returns an index into
xs : Array Decl, xs[index] = decl. Note that this predicate does not force the cache to be
complete, if there is no entry in the cache for some node, it can still exist in the AIG.
- empty: ∀ {α : Type} [inst : Hashable α] [inst_1 : DecidableEq α] {decls : Array (Std.Sat.AIG.Decl α)}, Std.Sat.AIG.Cache.WF decls ∅
- push_id: ∀ {α : Type} [inst : Hashable α] [inst_1 : DecidableEq α] {decls : Array (Std.Sat.AIG.Decl α)} {cache : Std.HashMap (Std.Sat.AIG.Decl α) Nat} {decl : Std.Sat.AIG.Decl α}, Std.Sat.AIG.Cache.WF decls cache → Std.Sat.AIG.Cache.WF (decls.push decl) cache
- push_cache: ∀ {α : Type} [inst : Hashable α] [inst_1 : DecidableEq α] {decls : Array (Std.Sat.AIG.Decl α)} {cache : Std.HashMap (Std.Sat.AIG.Decl α) Nat} {decl : Std.Sat.AIG.Decl α}, Std.Sat.AIG.Cache.WF decls cache → Std.Sat.AIG.Cache.WF (decls.push decl) (cache.insert decl decls.size)
Instances For
A cache for reusing elements from decls if they are available.
Equations
- Std.Sat.AIG.Cache α decls = { map : Std.HashMap (Std.Sat.AIG.Decl α) Nat // Std.Sat.AIG.Cache.WF decls map }
Instances For
Create an empty Cache, valid with respect to any Array Decl.
Instances For
Given a cache, valid with respect to some decls, we can extend the decls without
extending the cache and remain valid.
Equations
- cache.noUpdate = ⟨cache.val, ⋯⟩
Instances For
Given a cache, valid with respect to some decls, we can extend the decls
and the cache at the same time with the same values and remain valid.
Instances For
Contains the index of decl in decls along with a proof that the index is indeed correct.
Instances For
For a c : Cache α decls, any index idx that is a cache hit for some decl is within bounds of decls (i.e. idx < decls.size).
If Cache.get? decl returns some i then decls[i] = decl holds.
An And Inverter Graph together with a cache for subterm sharing.
- decls : Array (Std.Sat.AIG.Decl α)
- cache : Std.Sat.AIG.Cache α self.decls
- invariant : Std.Sat.AIG.IsDAG α self.decls
In order to be a valid AIG,
declsmust form a DAG.
Instances For
An AIG with an empty AIG and cache.
Equations
- Std.Sat.AIG.empty = { decls := #[], cache := Std.Sat.AIG.Cache.empty #[], invariant := ⋯ }
Instances For
Equations
- Std.Sat.AIG.instMembership = { mem := Std.Sat.AIG.Mem }
A Ref into aig1 is also valid for aig2 if aig1 is smaller than aig2.
Equations
- ref.cast h = { gate := ref.gate, hgate := ⋯ }
Instances For
A pair of Refs, useful for LawfulOperators that act on two Refs at a time.
- lhs : aig.Ref
- rhs : aig.Ref
Instances For
The Ref.cast equivalent for BinaryInput.
Equations
- input.cast h = { lhs := input.lhs.cast h, rhs := input.rhs.cast h }
Instances For
A collection of 3 of Refs, useful for LawfulOperators that act on three Refs at a time,
in particular multiplexer style functions.
- discr : aig.Ref
- lhs : aig.Ref
- rhs : aig.Ref
Instances For
The Ref.cast equivalent for TernaryInput.
Equations
- input.cast h = { discr := input.discr.cast h, lhs := input.lhs.cast h, rhs := input.rhs.cast h }
Instances For
An entrypoint into an AIG. This can be used to evaluate a circuit, starting at a certain node,
with AIG.denote or to construct bigger circuits on top of this specific node.
- aig : Std.Sat.AIG α
The AIG that we are in.
- ref : self.aig.Ref
The reference to the node in
aigthat thisEntrypointtargets.
Instances For
Transform an Entrypoint into a graphviz string. Useful for debugging purposes.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Instances For
Equations
- Std.Sat.AIG.toGraphviz.invEdgeStyle isInv = if isInv = true then " [color=red]" else " [color=blue]"
Instances For
Instances For
A sequence of references bundled with their AIG.
- aig : Std.Sat.AIG α
- vec : self.aig.RefVec w
Instances For
A RefVec bundled with constant distance to be shifted by.
- vec : aig.RefVec w
- distance : Nat
Instances For
A RefVec bundled with a RefVec as distance to be shifted by.
- n : Nat
- target : aig.RefVec m
- distance : aig.RefVec self.n
Instances For
A RefVec to be extended to newWidth.
- w : Nat
- vec : aig.RefVec self.w
Instances For
Evaluate an AIG.Entrypoint using some assignment for atoms.
Equations
- ⟦assign, entry⟧ = Std.Sat.AIG.denote.go entry.ref.gate entry.aig.decls assign ⋯ ⋯
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Denotation of an AIG at a specific Entrypoint.
Instances For
Denotation of an AIG at a specific Entrypoint with the Entrypoint being constructed on the fly.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
The denotation of the sub-DAG in the aig at node start is false for all assignments.
Instances For
The denotation of the Entrypoint is false for all assignments.
Equations
- entry.Unsat = entry.aig.UnsatAt entry.ref.gate ⋯
Instances For
An input to an AIG gate.
- ref : aig.Ref
The node we are referring to.
- inv : Bool
Whether the node is inverted
Instances For
The Ref.cast equivalent for Fanin.
Instances For
The input type for creating AIG and gates.
- lhs : aig.Fanin
- rhs : aig.Fanin
Instances For
The Ref.cast equivalent for GateInput.
Equations
- input.cast h = { lhs := input.lhs.cast h, rhs := input.rhs.cast h }
Instances For
Add a new and inverter gate to the AIG in aig. Note that this version is only meant for proving,
for production purposes use AIG.mkGateCached and equality theorems to this one.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Add a new input node to the AIG in aig. Note that this version is only meant for proving,
for production purposes use AIG.mkAtomCached and equality theorems to this one.
Equations
- aig.mkAtom n = { aig := { decls := aig.decls.push (Std.Sat.AIG.Decl.atom n), cache := aig.cache.noUpdate, invariant := ⋯ }, ref := { gate := aig.decls.size, hgate := ⋯ } }
Instances For
Add a new constant node to aig. Note that this version is only meant for proving,
for production purposes use AIG.mkConstCached and equality theorems to this one.
Equations
- aig.mkConst val = { aig := { decls := aig.decls.push (Std.Sat.AIG.Decl.const val), cache := aig.cache.noUpdate, invariant := ⋯ }, ref := { gate := aig.decls.size, hgate := ⋯ } }