• Top
    • Documentation
    • Books
    • Recursion-and-induction
    • Boolean-reasoning
      • Ipasir
      • Aignet
      • Aig
      • Satlink
      • Truth
      • Ubdds
      • Bdd
      • Faig
      • Bed
      • 4v
        • 4v-sexprs
          • 4v-sexpr-vars
          • 4v-sexpr-eval
          • 4v-sexpr-to-faig
            • 4v-and-faig-operations-commute
            • 4v-sexpr-to-faig-plain
            • 4v-sexpr-to-faig-opt
            • Sfaig
            • 4v->faig-const
            • 4v-sexpr-to-faig-list
            • Faig-const-fix
            • Faig-const->4v
            • 4v-sexpr-to-faig-alist
            • Faig-const-<=
            • Faig-const-p
          • 4v-sexpr-restrict-with-rw
          • 4vs-constructors
          • 4v-sexpr-compose-with-rw
          • 4v-sexpr-restrict
          • 4v-sexpr-alist-extract
          • 4v-sexpr-compose
          • 4v-nsexpr-p
          • 4v-sexpr-purebool-p
          • 4v-sexpr-<=
          • Sfaig
          • Sexpr-equivs
          • 3v-syntax-sexprp
          • Sexpr-rewriting
          • 4v-sexpr-ind
          • 4v-alist-extract
        • 4v-monotonicity
        • 4v-operations
        • Why-4v-logic
        • 4v-<=
        • 4vp
        • 4vcases
        • 4v-fix
        • 4v-lookup
    • Projects
    • Debugging
    • Std
    • Proof-automation
    • Macro-libraries
    • ACL2
    • Interfacing-tools
    • Hardware-verification
    • Software-verification
    • Testing-utilities
    • Math
  • 4v-sexprs

4v-sexpr-to-faig

Translation from 4v-sexprs into a faigs.

It is often useful to be able to convert a sexpr into a faig, since then you can apply AIG/FAIG based tools such as ABC, sat solvers, the bddify algorithm, and so forth to sexpr-based models. For instance, we use this conversion to implement an efficient gl symbolic counterpart for 4v-sexpr-eval, which is used in practically all of our GL-based hardware proofs.

Signature: (4v-sexpr-to-faig x onoff &key (optimize 't)) builds an faig.

x is the sexpr you want to convert into an FAIG.

onoff argument should be an alist that assigns an initial FAIG for every variable of x. Commonly the onoff alist should bind each variable v to some pair of fresh variables like (v1 . v0), i.e., v1 is the onset variable and v0 is the offset variable for v, but other uses are also possible. It is beneficial for onoff to be a fast alist, but it will be made fast if necessary.

optimize is an optional flag that defaults to t. When optimization is allowed, we convert the sexpr in a smarter way that is generally faster and produces smaller FAIGs which may be easier for other tools to analyze. You almost certainly want optimization unless you are doing certain kinds of fragile AIG decomposition where you really want AIGs that are exactly the same. (If that sounds like nonsense, then you want optimization.)

The basic idea of the optimization is to take advantage of the fact that many sexpr operations are actually "three-valued," i.e., they never produce Z. For instance, when we are converting a sexpr like (NOT (AND A B)) into an faig, since we know the result of an AND gate is never Z, it suffices to use t-aig-not instead of f-aig-not. There are similar reductions for many gates; see faig-constructors for some details.

You might regard 4v-sexpr-to-faig as a somewhat low-level function. Its correctness theorem is rather elaborate and to make use of it you generally need to construct an onoff alist that sensibly accomplishes your goal. A good starting place and example might be 4v-sexpr-eval-by-faig, which generates an appropriate onoff so that it can carry out a 4v-sexpr-eval computation using FAIG evaluation as the engine.

Function: 4v-sexpr-to-faig-fn1

(defun 4v-sexpr-to-faig-fn1 (x onoff optimizep)
  "Assumes ONOFF is fast."
  (declare (xargs :guard t))
  (if optimizep (4v-sexpr-to-faig-opt x onoff)
    (4v-sexpr-to-faig-plain x onoff)))

Function: 4v-sexpr-to-faig-fn

(defun 4v-sexpr-to-faig-fn (x onoff optimizep)
  "Assumes ONOFF is fast."
  (declare (xargs :guard t))
  (with-fast-alist onoff
                   (if optimizep (4v-sexpr-to-faig-opt x onoff)
                     (4v-sexpr-to-faig-plain x onoff))))

Theorem: 4v-sexpr-to-faig-fn1-removal

(defthm 4v-sexpr-to-faig-fn1-removal
  (equal (4v-sexpr-to-faig-fn1 x onoff optimizep)
         (4v-sexpr-to-faig-fn x onoff optimizep)))

Theorem: consp-of-4v-sexpr-to-faig-fn

(defthm consp-of-4v-sexpr-to-faig-fn
  (consp (4v-sexpr-to-faig-fn x onoff optimize))
  :rule-classes :type-prescription)

Theorem: faig-eval-of-4v-sexpr-to-faig

(defthm faig-eval-of-4v-sexpr-to-faig
  (equal (faig-eval (4v-sexpr-to-faig-fn x onoff optimize)
                    env)
         (faig-eval (4v-sexpr-to-faig-plain x onoff)
                    env)))

Subtopics

4v-and-faig-operations-commute
Lemmas showing that equivalence of 4v-operations to faig-constructors.
4v-sexpr-to-faig-plain
Non-optimized conversion from sexprs into faigs.
4v-sexpr-to-faig-opt
Optimized conversion from sexprs into faigs.
Sfaig
A simplified version of 4v-sexpr-to-faig that constructs its own onoff list out of the variables of the sexpr.
4v->faig-const
Convert a 4vp into a faig-const-p.
4v-sexpr-to-faig-list
Convert a sexpr list into a faig list.
Faig-const-fix
Identity for FAIG constants, or constant X otherwise.
Faig-const->4v
Convert a faig-const-p into a 4vp.
4v-sexpr-to-faig-alist
Convert a sexpr alist into an faig alist.
Faig-const-<=
Lattice ordering for FAIG constants.
Faig-const-p
Recognizer for constant faigs.