Filtering...

deps

books/centaur/aignet/deps
other
(in-package "AIGNET")
other
(include-book "semantics")
other
(local (add-default-post-define-hook :fix))
other
(define depends-on
  ((id natp) (ci-id natp)
    aignet)
  :guard (and (id-existsp id aignet)
    (id-existsp ci-id aignet))
  :measure (nfix id)
  (aignet-case (id->type id aignet)
    :gate (or (depends-on (lit->var (gate-id->fanin0 id aignet))
        ci-id
        aignet)
      (depends-on (lit->var (gate-id->fanin1 id aignet))
        ci-id
        aignet))
    :ci (equal (lnfix ci-id)
      (lnfix id))
    :const nil)
  ///
  (defthm depends-on-of-extension
    (implies (and (aignet-extension-binding)
        (aignet-idp id orig))
      (equal (depends-on id ci-id new)
        (depends-on id ci-id orig)))
    :hints (("goal" :induct (depends-on id ci-id new))))
  (defthm id-eval-of-update-ins-when-not-depends-on
    (implies (and (not (depends-on id ci-id aignet))
        (equal (stype (car (lookup-id ci-id aignet)))
          (pi-stype))
        (equal (stype-count :pi (cdr (lookup-id ci-id aignet)))
          (nfix n)))
      (equal (id-eval id
          (update-nth n val invals)
          regvals
          aignet)
        (id-eval id
          invals
          regvals
          aignet)))
    :hints (("goal" :induct (id-eval-ind id aignet)
       :expand ((:free (invals)
          (id-eval id
            invals
            regvals
            aignet)) (:free (lit invals regvals)
           (lit-eval lit
             invals
             regvals
             aignet))
         (:free (lit1 lit2 invals regvals)
           (eval-and-of-lits lit1
             lit2
             invals
             regvals
             aignet))
         (:free (lit1 lit2 invals regvals)
           (eval-xor-of-lits lit1
             lit2
             invals
             regvals
             aignet))))))
  (defthm lit-eval-of-update-ins-when-not-depends-on
    (implies (and (not (depends-on (lit->var lit)
            ci-id
            aignet))
        (equal (stype (car (lookup-id ci-id aignet)))
          (pi-stype))
        (equal (stype-count :pi (cdr (lookup-id ci-id aignet)))
          (nfix n)))
      (equal (lit-eval lit
          (update-nth n val invals)
          regvals
          aignet)
        (lit-eval lit
          invals
          regvals
          aignet)))
    :hints (("goal" :expand ((:free (lit invals regvals)
          (lit-eval lit
            invals
            regvals
            aignet))))))
  (defthm id-eval-of-update-regs-when-not-depends-on
    (implies (and (not (depends-on id ci-id aignet))
        (equal (stype (car (lookup-id ci-id aignet)))
          (reg-stype))
        (equal (stype-count :reg (cdr (lookup-id ci-id aignet)))
          (nfix n)))
      (equal (id-eval id
          invals
          (update-nth n val regvals)
          aignet)
        (id-eval id
          invals
          regvals
          aignet)))
    :hints (("goal" :induct (id-eval-ind id aignet)
       :expand ((:free (regvals)
          (id-eval id
            invals
            regvals
            aignet)) (:free (lit invals regvals)
           (lit-eval lit
             invals
             regvals
             aignet))
         (:free (lit1 lit2 invals regvals)
           (eval-and-of-lits lit1
             lit2
             invals
             regvals
             aignet))
         (:free (lit1 lit2 invals regvals)
           (eval-xor-of-lits lit1
             lit2
             invals
             regvals
             aignet))))))
  (defthm lit-eval-of-update-regs-when-not-depends-on
    (implies (and (not (depends-on (lit->var lit)
            ci-id
            aignet))
        (equal (stype (car (lookup-id ci-id aignet)))
          (reg-stype))
        (equal (stype-count :reg (cdr (lookup-id ci-id aignet)))
          (nfix n)))
      (equal (lit-eval lit
          invals
          (update-nth n val regvals)
          aignet)
        (lit-eval lit
          invals
          regvals
          aignet)))
    :hints (("goal" :expand ((:free (lit invals regvals)
          (lit-eval lit
            invals
            regvals
            aignet))))))
  (defthm depends-on-of-0
    (not (depends-on 0 n aignet)))
  (defthm depends-on-of-fanin
    (implies (and (not (depends-on id ci-id aignet))
        (equal (ctype (stype (car (lookup-id id aignet))))
          (gate-ctype)))
      (and (not (depends-on (lit->var (fanin 0
                (lookup-id id aignet)))
            ci-id
            aignet))
        (not (depends-on (lit->var (fanin 1
                (lookup-id id aignet)))
            ci-id
            aignet)))))
  (defthm depends-on-of-id-fix
    (equal (depends-on (aignet-id-fix id aignet)
        ci-id
        aignet)
      (depends-on id ci-id aignet))
    :hints (("Goal" :in-theory (enable aignet-id-fix)))))