• Top
    • Documentation
    • Books
    • Boolean-reasoning
      • Ipasir
      • Aignet
        • Base-api
        • Aignet-construction
        • Representation
        • Aignet-copy-init
        • Aignet-simplify-with-tracking
        • Aignet-simplify-marked-with-tracking
        • Aignet-cnf
        • Aignet-simplify-marked
        • Aignet-complete-copy
        • Aignet-transforms
          • Aignet-output-ranges
          • Aignet-comb-transforms
            • Fraig
              • Fraig-config
              • Fraig-sweep-node
              • Fraig-sweep-aux
              • Fraig-finish-copy-nonstrict
              • Fraig-core-aux
              • Fraig-output-type
              • Ipasir-check-aignet-equivalence
              • Fraig-store-ctrex-aux
              • Fraig-finish-copy-outs
              • Fraig-core
              • Fraig-ctrexes-maybe-resim
              • Fraig-sweep
              • Fraig-store-ctrex
              • S32v-row-repeat-bitcols
              • Fraig-ctrexes-resim-aux
              • Fraig-config-normalized-output-map
              • S32v-copy-cares
              • Ipasir-maybe-recycle
              • Fraig-ctrexes-ok
              • Fraig-add-equiv-class-outputs-aux-2
              • Fraig-add-equiv-class-outputs-aux-1
              • Fraig-ctrexes-resim
              • Fraig-create-aignet-node-mask
              • Fraig-classes-maybe-delete-class
              • Aignet-copy-outs-range
              • Fraig-record-sat-ctrex-rec
              • Fraig-ctrex-has-relevant-disagreement
              • S32v-bitcol-nth-set
              • Fraig-output-map-mark-non-simplified
              • Fraig-output-map-mark-simplified
              • Fraig-output-map-initial-equiv-start/count
              • Fraig-minimize-sat-ctrex-rec
              • Fraig-create-output-map
              • Bitarr-copy-cares-to-s32v-col
              • S32v-install-bit
              • S32v-bitcol-count-set
              • Fraig-ctrexes-init
              • Bitarr-or-cares-with-s32v-col
              • Fraig-ctrex-find-agreeable
              • S32v-repeat-bitcols
              • S32v-add-salt
              • Bitarr-remove-marked
              • Print-fraig-stats-noninitial
              • Fraig-ctrex-regvals->vecsim
              • Fraig-ctrex-invals->vecsim
              • Bitarr-to-s32v-col
              • Fraig-output-map-entry
              • Aignet-unmark-higher-levels
              • Aignet-mark-output-node-range
              • Fraig-initial-sim
              • Fraig-ctrexes-reinit
              • Fraig-add-equiv-class-outputs
              • Aignet-maybe-update-refs
              • S32v-randomize-rows
              • S32v-get-bit
              • Fraig-level-limit-ok
              • Aignet-vals->regvals-after-invals
              • Aignet-mark-fanout-cones-of-marked
              • Fraig-debug-output-ranges
              • S32v-zero-rows
              • Fraig-output-map-total-count
              • Fraig-output-map-has-multiple-initial-equivs
              • Fraig-output-map-has-initial-equivs
              • Fraig-output-type-map
              • Aignet-vals->in/regvals
              • Fraig-output-map
              • Fraig-total-checks
              • Fraig-stats-count-sat-call
              • Fraig-ctrex-ncols
              • Fraig-ctrex-data-rows
              • Fraig-stats-update-last-chance
              • Print-fraig-stats-initial
              • Print-classes-counts-with-mark
              • Fraig-stats-increment-forced-proved
              • Fraig-stats-increment-coincident-nodes
              • Print-classes-counts
              • Fraig-ctrex-in/reg-rows
            • Parametrize
            • Observability-fix
            • Constprop
            • Apply-m-assumption-n-output-output-transform-default
            • Balance
            • Apply-n-output-comb-transform-default
            • Apply-comb-transform-default
            • Obs-constprop
            • Rewrite
            • Comb-transform
            • Abc-comb-simplify
            • Prune
            • Rewrite!
            • M-assumption-n-output-comb-transform->name
            • N-output-comb-transform->name
            • Comb-transform->name
            • N-output-comb-transformlist
            • M-assumption-n-output-comb-transformlist
            • Comb-transformlist
            • Apply-comb-transform
          • Aignet-m-assumption-n-output-transforms
          • Aignet-n-output-comb-transforms
        • Aignet-eval
        • Semantics
        • Aignet-read-aiger
        • Aignet-write-aiger
        • Aignet-abc-interface
        • Utilities
      • Aig
      • Satlink
      • Truth
      • Ubdds
      • Bdd
      • Faig
      • Bed
      • 4v
    • Projects
    • Debugging
    • Std
    • Proof-automation
    • Macro-libraries
    • ACL2
    • Interfacing-tools
    • Hardware-verification
    • Software-verification
    • Math
    • Testing-utilities
  • Aignet-comb-transforms

Fraig

Apply combinational SAT sweeping (fraiging) to remove redundancies in the input network.

Signature
(fraig strict-count aignet aignet2 config output-ranges state) 
  → 
(mv new-aignet2 new-output-ranges new-state)
Arguments
strict-count — Number of initial outputs that must be combinationally preserved, or NIL meaning all.
    Guard (acl2::maybe-natp strict-count).
aignet — Input aignet.
aignet2 — New aignet -- will be emptied.
config — Settings for the transform.
    Guard (fraig-config-p config).
output-ranges — Guard (aignet-output-range-map-p output-ranges).
Returns
new-output-ranges — Type (aignet-output-range-map-p new-output-ranges).

Note: This fraiging implementation is heavily based on the one in ABC, developed and maintained at Berkeley by Alan Mishchenko.

Settings for the transform can be tweaked using the config input, which is a fraig-config object.

When used as a n-output-comb-transform or m-assumption-n-output-comb-transform (i.e. when we don't need to keep strict combinational equivalence), the FRAIG transform can track, as an output-range, the remaining candidate equivalences that were neither proved nor disproved. This list of transformations demonstrates the use of this option:

(aignet::make-fraig-config ...
       ;; Save the remaining equivalences resulting from this transform
       :save-candidate-equivs-as :fraig-remaining-equiv-classes
       ;; Do a final simulation if there are any pending counterexamples at the end of the SAT sweep,
       ;; to ensure we've broken all the equivalence classes we've gotten counterexamples for:
       :final-force-resim t
       ...)
(aignet::make-fraig-config ...
       ;; Read the recorded candidate equivalences as our starting equivalence classes
       :output-types `((:fraig-remaining-equiv-classes
                         . ,(aignet::fraig-output-type-initial-equiv-classes)))
       ...)

Configured this way, the subsequent FRAIG transform doesn't need to re-disprove candidate equivalences that are difficult to contradict through random simulation; if the previous FRAIG transform already found a counterexample to the equivalence and that equivalence was then resimulated, then it will no longer be present in the equivalence classes. The resimulation can be forced by setting the :final-force-resim config option.

Definitions and Theorems

Function: fraig

(defun fraig (strict-count aignet
                           aignet2 config output-ranges state)
 (declare (xargs :stobjs (aignet aignet2 state)))
 (declare
     (xargs :guard (and (acl2::maybe-natp strict-count)
                        (fraig-config-p config)
                        (aignet-output-range-map-p output-ranges))))
 (declare (xargs :guard (or (not strict-count)
                            (<= strict-count (num-outs aignet)))))
 (let ((__function__ 'fraig))
   (declare (ignorable __function__))
   (b*
     (((local-stobjs aignet-tmp)
       (mv aignet2 aignet-tmp output-ranges state))
      ((mv aignet-tmp output-ranges state)
       (fraig-core strict-count aignet
                   aignet-tmp config output-ranges state))
      (aignet2 (aignet-prune-comb aignet-tmp aignet2
                                  (fraig-config->gatesimp config))))
     (mv aignet2
         aignet-tmp output-ranges state))))

Theorem: aignet-output-range-map-p-of-fraig.new-output-ranges

(defthm aignet-output-range-map-p-of-fraig.new-output-ranges
  (b* (((mv ?new-aignet2
            ?new-output-ranges ?new-state)
        (fraig strict-count aignet
               aignet2 config output-ranges state)))
    (aignet-output-range-map-p new-output-ranges))
  :rule-classes :rewrite)

Theorem: num-ins-of-fraig

(defthm num-ins-of-fraig
  (b* (((mv ?new-aignet2
            ?new-output-ranges ?new-state)
        (fraig strict-count aignet
               aignet2 config output-ranges state)))
    (equal (stype-count :pi new-aignet2)
           (stype-count :pi aignet))))

Theorem: num-regs-of-fraig

(defthm num-regs-of-fraig
  (b* (((mv ?new-aignet2
            ?new-output-ranges ?new-state)
        (fraig strict-count aignet
               aignet2 config output-ranges state)))
    (equal (stype-count :reg new-aignet2)
           (stype-count :reg aignet))))

Theorem: output-ranges-length-of-fraig

(defthm output-ranges-length-of-fraig
  (b* (((mv ?new-aignet2
            ?new-output-ranges ?new-state)
        (fraig strict-count aignet
               aignet2 config output-ranges state)))
    (equal (aignet-output-range-map-length new-output-ranges)
           (stype-count :po new-aignet2))))

Theorem: num-outs-of-fraig

(defthm num-outs-of-fraig
  (b* (((mv ?new-aignet2
            ?new-output-ranges ?new-state)
        (fraig strict-count aignet
               aignet2 config output-ranges state)))
    (implies (not strict-count)
             (equal (stype-count :po new-aignet2)
                    (stype-count :po aignet)))))

Theorem: num-outs-lower-bound-of-fraig-nonstrict

(defthm num-outs-lower-bound-of-fraig-nonstrict
  (b* (((mv ?new-aignet2
            ?new-output-ranges ?new-state)
        (fraig strict-count aignet
               aignet2 config output-ranges state)))
    (implies strict-count
             (<= (nfix strict-count)
                 (stype-count :po new-aignet2))))
  :rule-classes :linear)

Theorem: fraig-comb-equivalent

(defthm fraig-comb-equivalent
  (b* (((mv ?new-aignet2
            ?new-output-ranges ?new-state)
        (fraig strict-count aignet
               aignet2 config output-ranges state)))
    (implies (not strict-count)
             (comb-equiv new-aignet2 aignet))))

Theorem: output-eval-of-fraig-when-nonstrict

(defthm output-eval-of-fraig-when-nonstrict
  (b* (((mv ?new-aignet2
            ?new-output-ranges ?new-state)
        (fraig strict-count aignet
               aignet2 config output-ranges state)))
    (implies (and strict-count
                  (< (nfix i) (nfix strict-count)))
             (equal (output-eval i invals regvals new-aignet2)
                    (output-eval i invals regvals aignet)))))

Theorem: normalize-input-of-fraig

(defthm normalize-input-of-fraig
  (implies (syntaxp (not (equal aignet2 ''nil)))
           (equal (fraig strict-count aignet
                         aignet2 config output-ranges state)
                  (fraig strict-count aignet
                         nil config output-ranges state))))

Theorem: w-state-of-fraig

(defthm w-state-of-fraig
  (b* (((mv ?new-aignet2
            ?new-output-ranges ?new-state)
        (fraig strict-count aignet
               aignet2 config output-ranges state)))
    (equal (w new-state) (w state))))

Theorem: fraig-of-maybe-natp-fix-strict-count

(defthm fraig-of-maybe-natp-fix-strict-count
  (equal (fraig (acl2::maybe-natp-fix strict-count)
                aignet
                aignet2 config output-ranges state)
         (fraig strict-count aignet
                aignet2 config output-ranges state)))

Theorem: fraig-maybe-nat-equiv-congruence-on-strict-count

(defthm fraig-maybe-nat-equiv-congruence-on-strict-count
  (implies (acl2::maybe-nat-equiv strict-count strict-count-equiv)
           (equal (fraig strict-count aignet
                         aignet2 config output-ranges state)
                  (fraig strict-count-equiv aignet
                         aignet2 config output-ranges state)))
  :rule-classes :congruence)

Theorem: fraig-of-fraig-config-fix-config

(defthm fraig-of-fraig-config-fix-config
  (equal (fraig strict-count
                aignet aignet2 (fraig-config-fix config)
                output-ranges state)
         (fraig strict-count aignet
                aignet2 config output-ranges state)))

Theorem: fraig-fraig-config-equiv-congruence-on-config

(defthm fraig-fraig-config-equiv-congruence-on-config
  (implies (fraig-config-equiv config config-equiv)
           (equal (fraig strict-count aignet
                         aignet2 config output-ranges state)
                  (fraig strict-count aignet aignet2
                         config-equiv output-ranges state)))
  :rule-classes :congruence)

Theorem: fraig-of-aignet-output-range-map-fix-output-ranges

(defthm fraig-of-aignet-output-range-map-fix-output-ranges
  (equal (fraig strict-count aignet aignet2 config
                (aignet-output-range-map-fix output-ranges)
                state)
         (fraig strict-count aignet
                aignet2 config output-ranges state)))

Theorem: fraig-aignet-output-range-map-equiv-congruence-on-output-ranges

(defthm
    fraig-aignet-output-range-map-equiv-congruence-on-output-ranges
 (implies
   (aignet-output-range-map-equiv output-ranges output-ranges-equiv)
   (equal (fraig strict-count aignet
                 aignet2 config output-ranges state)
          (fraig strict-count aignet aignet2
                 config output-ranges-equiv state)))
 :rule-classes :congruence)

Subtopics

Fraig-config
Configuration object for the fraig aignet transform.
Fraig-sweep-node
Fraig-sweep-aux
Fraig-finish-copy-nonstrict
Fraig-core-aux
Fraig-output-type
Object describing how the fraig transform should treat a range of output nodes
Ipasir-check-aignet-equivalence
Fraig-store-ctrex-aux
Fraig-finish-copy-outs
Fraig-core
Fraig-ctrexes-maybe-resim
Fraig-sweep
Fraig-store-ctrex
S32v-row-repeat-bitcols
Fraig-ctrexes-resim-aux
Fraig-config-normalized-output-map
S32v-copy-cares
Ipasir-maybe-recycle
Fraig-ctrexes-ok
Fraig-add-equiv-class-outputs-aux-2
Fraig-add-equiv-class-outputs-aux-1
Fraig-ctrexes-resim
Fraig-create-aignet-node-mask
Fraig-classes-maybe-delete-class
Aignet-copy-outs-range
Fraig-record-sat-ctrex-rec
Fraig-ctrex-has-relevant-disagreement
S32v-bitcol-nth-set
Fraig-output-map-mark-non-simplified
Fraig-output-map-mark-simplified
Fraig-output-map-initial-equiv-start/count
Fraig-minimize-sat-ctrex-rec
Fraig-create-output-map
Bitarr-copy-cares-to-s32v-col
S32v-install-bit
S32v-bitcol-count-set
Fraig-ctrexes-init
Bitarr-or-cares-with-s32v-col
Fraig-ctrex-find-agreeable
S32v-repeat-bitcols
S32v-add-salt
Bitarr-remove-marked
Print-fraig-stats-noninitial
Fraig-ctrex-regvals->vecsim
Fraig-ctrex-invals->vecsim
Bitarr-to-s32v-col
Fraig-output-map-entry
Aignet-unmark-higher-levels
Aignet-mark-output-node-range
Fraig-initial-sim
Fraig-ctrexes-reinit
Fraig-add-equiv-class-outputs
Aignet-maybe-update-refs
S32v-randomize-rows
S32v-get-bit
Fraig-level-limit-ok
Aignet-vals->regvals-after-invals
Aignet-mark-fanout-cones-of-marked
Fraig-debug-output-ranges
S32v-zero-rows
Fraig-output-map-total-count
Fraig-output-map-has-multiple-initial-equivs
Fraig-output-map-has-initial-equivs
Fraig-output-type-map
An alist mapping symbolp to fraig-output-type-p.
Aignet-vals->in/regvals
Fraig-output-map
A list of fraig-output-map-entry-p objects.
Fraig-total-checks
Fraig-stats-count-sat-call
Fraig-ctrex-ncols
Fraig-ctrex-data-rows
Fraig-stats-update-last-chance
Print-fraig-stats-initial
Print-classes-counts-with-mark
Fraig-stats-increment-forced-proved
Fraig-stats-increment-coincident-nodes
Print-classes-counts
Fraig-ctrex-in/reg-rows