• Top
    • Documentation
    • Books
    • Recursion-and-induction
    • Boolean-reasoning
      • Ipasir
      • Aignet
        • Base-api
        • Aignet-construction
          • Gatesimp
          • Aignet-hash-mux
          • Aignet-hash-or
            • Aignet-hash-and
            • Aignet-hash-xor
            • Aignet-hash-iff
            • Aignet-build
            • Patbind-aignet-build
          • Representation
          • Aignet-copy-init
          • Aignet-simplify-marked-with-tracking
          • Aignet-cnf
          • Aignet-simplify-with-tracking
          • Aignet-complete-copy
          • Aignet-eval
          • Semantics
          • Aignet-transforms
          • Aignet-simplify-marked
          • Aignet-read-aiger
          • Aignet-write-aiger
          • Aignet-abc-interface
          • Utilities
        • Aig
        • Satlink
        • Truth
        • Ubdds
        • Bdd
        • Faig
        • Bed
        • 4v
      • Debugging
      • Projects
      • Std
      • Proof-automation
      • Macro-libraries
      • ACL2
      • Interfacing-tools
      • Hardware-verification
      • Software-verification
      • Testing-utilities
      • Math
    • Aignet-construction

    Aignet-hash-or

    Implement an OR of two literals node in an AIGNET, or find a node already representing the required logical expression.

    Signature
    (aignet-hash-or lit1 lit2 gatesimp strash aignet) 
      → 
    (mv result new-strash new-aignet)
    Arguments
    lit1 — Literal to AND with lit2.
        Guard (litp lit1).
    lit2 — Guard (litp lit2).
    gatesimp — Configuration for how much simplification to try and whether to use hashing.
        Guard (gatesimp-p gatesimp).
    strash — Stobj containing the aignet's structural hash table.
    Returns
    result — Type (litp result).

    See aignet-construction.

    Definitions and Theorems

    Function: aignet-hash-or

    (defun aignet-hash-or
           (lit1 lit2 gatesimp strash aignet)
           (declare (xargs :stobjs (strash aignet)))
           (declare (type (unsigned-byte 30) lit1)
                    (type (unsigned-byte 30) lit2)
                    (type (unsigned-byte 6) gatesimp))
           (declare (xargs :guard (and (litp lit1)
                                       (litp lit2)
                                       (gatesimp-p gatesimp))))
           (declare (xargs :guard (and (fanin-litp lit1 aignet)
                                       (fanin-litp lit2 aignet))
                           :split-types t))
           (let ((__function__ 'aignet-hash-or))
                (declare (ignorable __function__))
                (b* (((mv lit strash aignet)
                      (aignet-hash-and (lit-negate^ lit1)
                                       (lit-negate^ lit2)
                                       gatesimp strash aignet)))
                    (mv (lit-negate^ lit) strash aignet))))

    Theorem: litp-of-aignet-hash-or.result

    (defthm acl2::litp-of-aignet-hash-or.result
            (b* (((mv ?result ?new-strash ?new-aignet)
                  (aignet-hash-or lit1 lit2 gatesimp strash aignet)))
                (litp result))
            :rule-classes (:rewrite :type-prescription))

    Theorem: aignet-extension-p-of-aignet-hash-or

    (defthm
         acl2::aignet-extension-p-of-aignet-hash-or
         (aignet-extension-p
              (mv-nth 2
                      (aignet-hash-or lit1 lit2 gatesimp strash aignet))
              aignet)
         :rule-classes :rewrite)

    Theorem: aignet-litp-of-aignet-hash-or

    (defthm aignet-litp-of-aignet-hash-or
            (b* (((mv ?result ?new-strash ?new-aignet)
                  (aignet-hash-or lit1 lit2 gatesimp strash aignet)))
                (implies (and (aignet-litp lit1 aignet)
                              (aignet-litp lit2 aignet))
                         (aignet-litp result new-aignet))))

    Theorem: deps-of-aignet-hash-or

    (defthm deps-of-aignet-hash-or
            (b* (((mv ?result ?new-strash ?new-aignet)
                  (aignet-hash-or lit1 lit2 gatesimp strash aignet)))
                (implies (and (not (depends-on (lit->var lit1)
                                               ci-id aignet))
                              (not (depends-on (lit->var lit2)
                                               ci-id aignet)))
                         (not (depends-on (lit->var result)
                                          ci-id new-aignet)))))

    Theorem: lit-eval-of-aignet-hash-or

    (defthm lit-eval-of-aignet-hash-or
            (b* (((mv ?result ?new-strash ?new-aignet)
                  (aignet-hash-or lit1 lit2 gatesimp strash aignet)))
                (equal (lit-eval result invals regvals new-aignet)
                       (b-ior (lit-eval lit1 invals regvals aignet)
                              (lit-eval lit2 invals regvals aignet)))))

    Theorem: stype-counts-preserved-of-aignet-hash-or

    (defthm
         stype-counts-preserved-of-aignet-hash-or
         (b* (((mv ?result ?new-strash ?new-aignet)
               (aignet-hash-or lit1 lit2 gatesimp strash aignet)))
             (implies (and (not (equal (stype-fix stype) (and-stype)))
                           (not (equal (stype-fix stype) (xor-stype))))
                      (equal (stype-count stype new-aignet)
                             (stype-count stype aignet)))))

    Theorem: unsigned-byte-p-of-aignet-hash-or

    (defthm unsigned-byte-p-of-aignet-hash-or
            (b* (((mv ?result ?new-strash ?new-aignet)
                  (aignet-hash-or lit1 lit2 gatesimp strash aignet)))
                (implies (and (< (fanin-count aignet) 536870911)
                              (natp n)
                              (<= 30 n))
                         (unsigned-byte-p n result))))

    Theorem: fanin-count-of-aignet-hash-or

    (defthm fanin-count-of-aignet-hash-or
            (b* (((mv ?result ?new-strash ?new-aignet)
                  (aignet-hash-or lit1 lit2 gatesimp strash aignet)))
                (<= (fanin-count new-aignet)
                    (+ 1 (fanin-count aignet))))
            :rule-classes :linear)

    Theorem: aignet-hash-or-of-lit-fix-lit1

    (defthm acl2::aignet-hash-or-of-lit-fix-lit1
            (equal (aignet-hash-or (lit-fix lit1)
                                   lit2 gatesimp strash aignet)
                   (aignet-hash-or lit1 lit2 gatesimp strash aignet)))

    Theorem: aignet-hash-or-lit-equiv-congruence-on-lit1

    (defthm
       acl2::aignet-hash-or-lit-equiv-congruence-on-lit1
       (implies (lit-equiv lit1 acl2::lit1-equiv)
                (equal (aignet-hash-or lit1 lit2 gatesimp strash aignet)
                       (aignet-hash-or acl2::lit1-equiv
                                       lit2 gatesimp strash aignet)))
       :rule-classes :congruence)

    Theorem: aignet-hash-or-of-lit-fix-lit2

    (defthm acl2::aignet-hash-or-of-lit-fix-lit2
            (equal (aignet-hash-or lit1 (lit-fix lit2)
                                   gatesimp strash aignet)
                   (aignet-hash-or lit1 lit2 gatesimp strash aignet)))

    Theorem: aignet-hash-or-lit-equiv-congruence-on-lit2

    (defthm
       acl2::aignet-hash-or-lit-equiv-congruence-on-lit2
       (implies (lit-equiv lit2 acl2::lit2-equiv)
                (equal (aignet-hash-or lit1 lit2 gatesimp strash aignet)
                       (aignet-hash-or lit1 acl2::lit2-equiv
                                       gatesimp strash aignet)))
       :rule-classes :congruence)

    Theorem: aignet-hash-or-of-gatesimp-fix-gatesimp

    (defthm acl2::aignet-hash-or-of-gatesimp-fix-gatesimp
            (equal (aignet-hash-or lit1 lit2 (gatesimp-fix gatesimp)
                                   strash aignet)
                   (aignet-hash-or lit1 lit2 gatesimp strash aignet)))

    Theorem: aignet-hash-or-gatesimp-equiv-congruence-on-gatesimp

    (defthm
       acl2::aignet-hash-or-gatesimp-equiv-congruence-on-gatesimp
       (implies
            (gatesimp-equiv gatesimp acl2::gatesimp-equiv)
            (equal (aignet-hash-or lit1 lit2 gatesimp strash aignet)
                   (aignet-hash-or lit1 lit2
                                   acl2::gatesimp-equiv strash aignet)))
       :rule-classes :congruence)

    Theorem: aignet-hash-or-of-node-list-fix-aignet

    (defthm
         acl2::aignet-hash-or-of-node-list-fix-aignet
         (equal (aignet-hash-or lit1 lit2
                                gatesimp strash (node-list-fix aignet))
                (aignet-hash-or lit1 lit2 gatesimp strash aignet)))

    Theorem: aignet-hash-or-node-list-equiv-congruence-on-aignet

    (defthm
       acl2::aignet-hash-or-node-list-equiv-congruence-on-aignet
       (implies
            (node-list-equiv aignet acl2::aignet-equiv)
            (equal (aignet-hash-or lit1 lit2 gatesimp strash aignet)
                   (aignet-hash-or lit1 lit2
                                   gatesimp strash acl2::aignet-equiv)))
       :rule-classes :congruence)