The lawful operator framework provides free theorems around the typeclass LawfulOperator
.
Its definition is based on section 3.3 of the AIGNET paper.
decls1
is a prefix of decls2
- of :: (
- size_le : decls1.size ≤ decls2.size
The prefix may never be longer than the other array.
The prefix and the other array must agree on all elements up until the bound of the prefix
- )
Instances For
If decls1
is a prefix of decls2
and we start evaluating decls2
at an
index in bounds of decls1
we can evaluate at decls1
.
If decls1
is a prefix of decls2
and we start evaluating decls2
at an
index in bounds of decls1
we can evaluate at decls1
.
Equations
- aig.ExtendingEntrypoint = { entry : Std.Sat.AIG.Entrypoint α // aig.decls.size ≤ entry.aig.decls.size }
Instances For
Equations
- aig.ExtendingRefVecEntry len = { ref : Std.Sat.AIG.RefVecEntry α len // aig.decls.size ≤ ref.aig.decls.size }
Instances For
A function f
that takes some aig : AIG α
and an argument of type β aig
is called a lawful
AIG operator if it only extends the AIG
but never modifies already existing nodes.
This guarantees that applying such a function will not change the semantics of any existing parts of the circuit, allowing us to perform local reasoning on the AIG.
- decl_eq (aig : Std.Sat.AIG α) (input : β aig) (idx : Nat) (h1 : idx < aig.decls.size) (h2 : idx < (f aig input).aig.decls.size) : (f aig input).aig.decls[idx] = aig.decls[idx]