summaryrefslogtreecommitdiff
path: root/books/workshops/1999/pipeline/b-ops-aux.lisp
diff options
context:
space:
mode:
Diffstat (limited to 'books/workshops/1999/pipeline/b-ops-aux.lisp')
-rw-r--r--books/workshops/1999/pipeline/b-ops-aux.lisp738
1 files changed, 738 insertions, 0 deletions
diff --git a/books/workshops/1999/pipeline/b-ops-aux.lisp b/books/workshops/1999/pipeline/b-ops-aux.lisp
new file mode 100644
index 0000000..434d07c
--- /dev/null
+++ b/books/workshops/1999/pipeline/b-ops-aux.lisp
@@ -0,0 +1,738 @@
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; b-ops-aux.lisp:
+;; This file contains auxiliary lemmas to assist the IHS library
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(in-package "ACL2")
+
+(include-book "b-ops-aux-def")
+
+(deflabel begin-b-ops-aux)
+
+;; Type of b-if
+(defthm bitp-b-if
+ (implies (and (bitp y) (bitp z))
+ (bitp (b-if x y z)))
+ :hints (("goal" :in-theory (enable bitp))))
+
+(defthm integerp-b-if
+ (implies (and (integerp y) (integerp z))
+ (integerp (b-if x y z)))
+ :hints (("goal" :in-theory (enable bitp))))
+
+(defthm b-not-b-not
+ (equal (b-not (b-not i)) (bfix i))
+ :hints (("goal" :in-theory (enable b-not bfix zbp))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Here are several basic lemmas about bit operations.
+
+;; If bit vector X is longer than (p+s), bits between the p'th and (p+s)'th
+;; bits of the concatenation of x and y is equal to that of x.
+(defthm rdb-logapp-1
+ (implies (and (integerp x) (integerp y) (integerp i) (<= 0 i)
+ (integerp s) (<= 0 s) (integerp p) (<= 0 p)
+ (<= (+ s p) i))
+ (equal (rdb (cons s p) (logapp i x y))
+ (rdb (cons s p) x)))
+ :hints (("Goal" :in-theory (enable logapp* rdb bsp-size bsp-position))))
+
+;; If bit vector X is shorter than p, bits from the p'th LSB to (p+s)'th
+;; LSB of the concatenation of x and y is equal to that of y.
+(defthm rdb-logapp-2
+ (implies (and (integerp x) (integerp y)
+ (integerp s) (<= 0 s) (integerp p) (<= 0 p)
+ (integerp i) (<= 0 i)
+ (<= i p))
+ (equal (rdb (cons s p) (logapp i x y))
+ (rdb (cons s (- p i)) y)))
+ :hints (("Goal" :in-theory (enable logapp* rdb bsp-size bsp-position))))
+
+
+(defthm loghead-0
+ (equal (loghead x 0) 0)
+ :hints (("Goal" :in-theory (enable loghead))))
+
+(defthm loghead-1
+ (equal (loghead 1 vector) (logcar vector))
+ :hints (("Goal" :in-theory (enable logcar loghead))))
+
+(defthm logcar-bitp
+ (implies (bitp x)
+ (equal (logcar x) x))
+ :hints (("Goal" :in-theory (enable bitp logcar))))
+
+(defthm logbit-0-bitp
+ (implies (bitp x)
+ (equal (logbit 0 x) x))
+ :hints (("Goal" :in-theory (enable bitp logbit))))
+
+(defthm loghead-bitp
+ (implies (bitp x)
+ (equal (loghead 1 x) x))
+ :hints (("Goal" :in-theory (enable rdb))))
+
+
+(defthm logcons-0
+ (implies (bitp x)
+ (equal (logcons x 0) x))
+ :hints (("Goal" :in-theory (enable logcons))))
+
+(defthm rdb-bitp
+ (implies (bitp x)
+ (equal (rdb (cons 1 0) x) x))
+ :hints (("Goal" :in-theory (enable rdb))))
+
+(defthm rdb-0
+ (equal (rdb (cons 0 n) x) 0)
+ :hints (("Goal" :in-theory (enable rdb bsp-size))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Here begins a basic theory about lobops
+; Recursive definition of Logbit*.
+(defthm logbit*
+ (implies (and (integerp pos)
+ (>= pos 0)
+ (integerp i))
+ (equal (logbit pos i)
+ (if (equal pos 0)
+ (logcar i)
+ (logbit (1- pos) (logcdr i)))))
+ :rule-classes :definition
+ :hints (("Goal" :in-theory (e/d (logbit logbitp*) (logbitp)))))
+
+(in-theory (disable logbit*))
+
+(local
+(defun logtail-induct (pos i)
+ (if (zp pos)
+ i
+ (logtail-induct (1- pos) (logcdr i)))))
+
+
+(defthm logcar-logtail
+ (implies (and (integerp n) (<= 0 n)
+ (integerp x))
+ (equal (logcar (logtail n x))
+ (logbit n x)))
+ :hints (("Goal" :in-theory (e/d (logtail* logbit logbitp*)
+ (logbitp))
+ :induct (logtail-induct n x))))
+
+(defthm logcdr-logtail
+ (implies (and (integerp n) (<= 0 n)
+ (integerp x))
+ (equal (logcdr (logtail n x))
+ (logtail (1+ n) x)))
+ :hints (("Goal" :in-theory (enable logtail*)
+ :induct (logtail-induct n x))))
+
+;; The following two lemmas are for expansion before BDD
+(deflabel begin-bv-expand)
+(defthm rdb-expand
+ (implies (and (syntaxp (and (quoted-constant-p s) (quoted-constant-p n)))
+ (integerp s) (< 0 s)
+ (integerp n) (<= 0 n)
+ (integerp x))
+ (equal (rdb (cons s n) x)
+ (logcons (logbit n x) (rdb (cons (1- s) (1+ n)) x))))
+ :hints (("Goal" :in-theory (enable rdb bsp-position bsp-size loghead*
+ logtail*))))
+
+
+;; logops supplement for logxxx operations. There are bunch of
+;; definition rules logior* and so on, but they are definition rules.
+;; We rewrite rules to forcibly open up the expressions before applying
+;; BDD techniques. We redefine the same lemma as a rewrite rule.
+(defthm open-logior-right-const
+ (implies (and (bitp i1)
+ (integerp i2)
+ (integerp j))
+ (equal (logior (logcons i1 i2) j)
+ (logcons (b-ior i1 (logcar j)) (logior i2 (logcdr j)))))
+ :hints (("Goal" :in-theory (enable logior*))))
+
+
+(defthm open-logior-left-const
+ (implies (and (bitp j1)
+ (integerp j2)
+ (integerp i))
+ (equal (logior i (logcons j1 j2))
+ (logcons (b-ior (logcar i) j1) (logior (logcdr i) j2))))
+ :hints (("Goal" :in-theory (enable logior*))))
+
+(defthm open-logior
+ (implies (and (bitp i1)
+ (bitp j1)
+ (integerp i2)
+ (integerp j2))
+ (equal (logior (logcons i1 i2) (logcons j1 j2))
+ (logcons (b-ior i1 j1) (logior i2 j2))))
+ :hints (("Goal" :in-theory (enable logior*))))
+
+(defthm open-logxor-right-const
+ (implies (and (bitp i1)
+ (integerp i2)
+ (integerp j))
+ (equal (logxor (logcons i1 i2) j)
+ (logcons (b-xor i1 (logcar j)) (logxor i2 (logcdr j)))))
+ :hints (("Goal" :in-theory (enable logxor*))))
+
+
+(defthm open-logxor-left-const
+ (implies (and (bitp j1)
+ (integerp j2)
+ (integerp i))
+ (equal (logxor i (logcons j1 j2))
+ (logcons (b-xor (logcar i) j1) (logxor (logcdr i) j2))))
+ :hints (("Goal" :in-theory (enable logxor*))))
+
+(defthm open-logxor
+ (implies (and (bitp i1)
+ (bitp j1)
+ (integerp i2)
+ (integerp j2))
+ (equal (logxor (logcons i1 i2) (logcons j1 j2))
+ (logcons (b-xor i1 j1) (logxor i2 j2))))
+ :hints (("Goal" :in-theory (enable logxor*))))
+
+
+
+
+(defthm open-logand-right-const
+ (implies (and (bitp i1)
+ (integerp i2)
+ (integerp j))
+ (equal (logand (logcons i1 i2) j)
+ (logcons (b-and i1 (logcar j)) (logand i2 (logcdr j)))))
+ :hints (("Goal" :in-theory (enable logand*))))
+
+
+(defthm open-logand-left-const
+ (implies (and (bitp j1)
+ (integerp j2)
+ (integerp i))
+ (equal (logand i (logcons j1 j2))
+ (logcons (b-and (logcar i) j1) (logand (logcdr i) j2))))
+ :hints (("Goal" :in-theory (enable logand*))))
+
+(defthm open-logand
+ (implies (and (bitp i1)
+ (bitp j1)
+ (integerp i2)
+ (integerp j2))
+ (equal (logand (logcons i1 i2) (logcons j1 j2))
+ (logcons (b-and i1 j1) (logand i2 j2))))
+ :hints (("Goal" :in-theory (enable logand*))))
+
+(defthm open-lognot
+ (implies (and (bitp i1)
+ (integerp i2))
+ (equal (lognot (logcons i1 i2))
+ (logcons (b-not i1) (lognot i2))))
+ :hints (("Goal" :in-theory (enable lognot*))))
+
+(defthm fold-logcdr-vector
+ (implies (and (integerp x)
+ (syntaxp (or (not (consp x))
+ (not (equal (car x) 'logcons$inline)))))
+ (equal (logcdr x) (logtail 1 x)))
+ :hints (("goal" :in-theory (enable logtail*))))
+(in-theory (disable fold-logcdr-vector))
+
+(defthm fold-logcar-vector
+ (implies (and (integerp x)
+ (syntaxp (or (not (consp x))
+ (not (equal (car x) 'logcons$inline)))))
+ (equal (logcar x) (logbit 0 x)))
+ :hints (("goal" :in-theory (e/d (logbit logbitp*)
+ (logbitp)))))
+
+(in-theory (disable fold-logcar-vector))
+(deflabel end-bv-expand)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Bv-eqv rules
+(defthm bv-eqv*
+ (implies (and (integerp x)
+ (integerp y)
+ (integerp n)
+ (>= n 0))
+ (equal (bv-eqv n x y)
+ (if (zp n)
+ 1
+ (b-and (b-eqv (logcar x) (logcar y))
+ (bv-eqv (1- n) (logcdr x) (logcdr y))))))
+ :hints (("goal" :in-theory (enable bv-eqv loghead*)))
+ :rule-classes :definition)
+
+(in-theory (disable bv-eqv*))
+
+;; Following lemma is useful in converting a formula with 'bv-eqv' to one
+;; with 'equal'.
+;; This can cause BDD simplification to fail, especially if when the words
+;; need to be open up.
+(defthm bv-eqv-iff-equal
+ (implies (and (unsigned-byte-p n x) (unsigned-byte-p n y))
+ (equal (b1p (bv-eqv n x y))
+ (equal x y)))
+ :hints (("Goal" :in-theory (enable bv-eqv b1p))))
+
+(defthm bv-eqv-0
+ (equal (bv-eqv 0 x y) 1)
+ :Hints (("Goal" :in-theory (enable bv-eqv))))
+
+(defthm bv-x-x
+ (equal (bv-eqv n x x) 1)
+ :hints (("goal" :in-theory (enable bv-eqv))))
+
+(defthm bv-eqv-assoc
+ (equal (bv-eqv n x y) (bv-eqv n y x))
+ :hints (("Goal" :in-theory (enable bv-eqv))))
+
+(defthm bv-eqv-bits
+ (implies (and (bitp x) (bitp y) (integerp n) (> n 0))
+ (equal (bv-eqv n x y) (b-eqv x y)))
+ :hints (("Goal" :in-theory (enable bv-eqv* bitp bv-eqv-iff-equal))))
+
+(defthm bv-eqv-expand
+ (implies (and (integerp x) (integerp y)
+ (integerp n) (> n 0)
+ (syntaxp (quoted-constant-p n)))
+ (equal (bv-eqv n x y)
+ (b-and (b-eqv (logcar x) (logcar y))
+ (bv-eqv (1- n) (logcdr x) (logcdr y)))))
+ :hints (("Goal" :in-theory (enable bv-eqv*))))
+
+;; Following lemma is a schematic lemma which will be used in BDD proof.
+;; We noticed that several lemmas is a tautology under the property that
+;; (bv-eqv x y) and (bv-eqv x z) are not simultaneously asserted, if y and
+;; z are not equal. We instantiate the following lemma and add it to BDD
+;; proof as a hint.
+(defthm bv-eqv-transitivity
+ (implies (and (unsigned-byte-p n x)
+ (unsigned-byte-p n y)
+ (unsigned-byte-p n z)
+ (b1p (b-and (bv-eqv n x z) (bv-eqv n y z))))
+ (equal x y))
+ :hints (("Goal" :in-theory (enable bv-eqv )))
+ :rule-classes nil)
+
+;; Bv-expander is the theory to be enabled to expand bit vectors before
+;; applying bdd's.
+(deftheory bv-expander
+ '(rdb-expand
+ open-lognot
+ open-logand open-logand-right-const open-logand-left-const
+ open-logior open-logior-right-const open-logior-left-const
+ open-logxor open-logxor-right-const open-logxor-left-const
+ fold-logcar-vector fold-logcdr-vector
+ bv-eqv-bits
+ bv-eqv-0
+ bv-eqv-expand))
+
+(in-theory (disable bv-expander))
+
+(local (in-theory (enable b1p)))
+
+;; Bit-boolean-converter converting expressions of form (equal x 1) to
+;; expressions using bitp, lest BDD package assigns different boolean values
+;; to (b1p x) and (equal x 1). It also converts (equal x 0) to (not (b1p x)).
+(defthm equal-to-1-to-b1p
+ (implies (bitp x)
+ (equal (equal x 1)
+ (b1p x)))
+ :Hints (("Goal" :In-theory (enable bitp))))
+
+(defthm equal-to-0-to-not-b1p
+ (implies (bitp x)
+ (equal (equal x 0)
+ (not (b1p x))))
+ :Hints (("Goal" :In-theory (enable bitp))))
+
+(defthm equal-to-b1p-b-eqv
+ (implies (and (bitp x) (bitp y))
+ (equal (equal x y) (b1p (b-eqv x y))))
+ :hints (("Goal" :in-theory (enable b-eqv b1p zbp bitp))))
+
+(deftheory equal-b1p-converter
+ '(equal-to-1-to-b1p equal-to-0-to-not-b1p))
+
+(in-theory (disable equal-b1p-converter))
+(in-theory (disable equal-to-b1p-b-eqv))
+
+;; From here, we define bit-to-boolean converter, especially for BDD
+;; operation.
+(deflabel begin-lift-b-ops)
+
+(defthm zbp-b-and
+ (equal (zbp (b-and x y))
+ (or (zbp x) (zbp y)))
+ :Hints (("Goal" :in-theory (enable b-and))))
+
+(defthm zbp-b-ior
+ (equal (zbp (b-ior x y))
+ (and (zbp x) (zbp y)))
+ :Hints (("Goal" :in-theory (enable b-ior))))
+
+(defthm zbp-b-xor
+ (equal (zbp (b-xor x y))
+ (or (and (zbp x) (zbp y))
+ (and (not (zbp x)) (not (zbp y)))))
+ :Hints (("Goal" :in-theory (enable b-xor))))
+
+(defthm zbp-b-not
+ (equal (zbp (b-not x))
+ (not (zbp x)))
+ :Hints (("Goal" :in-theory (enable b-not))))
+
+(defthm zbp-b-eqv
+ (equal (zbp (b-eqv x y))
+ (not (iff (zbp x) (zbp y))))
+ :Hints (("Goal" :in-theory (enable b-eqv))))
+
+
+
+(defthm b1p-b-and
+ (equal (b1p (b-and x y))
+ (and (b1p x) (b1p y)))
+ :Hints (("Goal" :in-theory (enable b-and))))
+
+(defthm b1p-b-ior
+ (equal (b1p (b-ior x y))
+ (or (b1p x) (b1p y)))
+ :Hints (("Goal" :in-theory (enable b-ior))))
+
+(defthm b1p-b-xor
+ (equal (b1p (b-xor x y))
+ (or (and (b1p x) (not (b1p y)))
+ (and (not (b1p x)) (b1p y))))
+ :Hints (("Goal" :in-theory (enable b-xor))))
+
+(defthm b1p-b-not
+ (equal (b1p (b-not x))
+ (not (b1p x)))
+ :Hints (("Goal" :in-theory (enable b-not))))
+
+(defthm b1p-b-eqv
+ (equal (b1p (b-eqv x y))
+ (iff (b1p x) (b1p y)))
+ :Hints (("Goal" :in-theory (enable b-eqv))))
+
+(defthm b1p-nand (equal (b1p (b-nand x y)) (not (and (b1p x) (b1p y))))
+ :hints (("Goal" :in-theory (enable b-nand))))
+
+(defthm b1p-nor (equal (b1p (b-nor x y)) (not (or (b1p x) (b1p y))))
+ :hints (("Goal" :in-theory (enable b-nor))))
+
+(defthm b1p-andc1 (equal (b1p (b-andc1 x y)) (and (not (b1p x)) (b1p y)))
+ :hints (("Goal" :in-theory (enable b-andc1))))
+
+(defthm b1p-andc2 (equal (b1p (b-andc2 x y)) (and (b1p x) (not (b1p y))))
+ :hints (("Goal" :in-theory (enable b-andc2))))
+
+(defthm b1p-orc1 (equal (b1p (b-orc1 x y)) (or (not (b1p x)) (b1p y)))
+ :hints (("Goal" :in-theory (enable b-orc1))))
+
+(defthm b1p-orc2 (equal (b1p (b-orc2 x y)) (or (b1p x) (not (b1p y))))
+ :hints (("Goal" :in-theory (enable b-orc2))))
+
+(defthm zbp-to-b1p
+ (equal (zbp x) (not (b1p x)))
+ :hints (("Goal" :in-theory (enable b1p))))
+
+(deflabel end-lift-b-ops)
+
+(deftheory lift-b-ops
+ (set-difference-theories (universal-theory 'end-lift-b-ops)
+ (universal-theory 'begin-lift-b-ops)))
+
+(in-theory (disable lift-b-ops))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; New Simplifier
+; This simplifier simplifies bit terms into 1 and 0's using information
+; represented by b1p.
+; Origianl Simplify-Bit-Functions can simplify expressions with bit-functions
+; if its arguments are 0 or 1's. For instance, it can reduce expressions
+; with a rule like:
+; (EQUAL (B-AND 1 X) (BFIX X))
+; In the new simplifier reduces the expressions if hypothesis satisfies
+; certain conditions, like
+; (implies (and (bitp x) (bitp y) (not (b1p y)))
+; (equal (b-and x y) 0))
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(deflabel begin-b1p-bit-rewriter)
+
+(defthm b1p-bit-forward
+ (implies (and (b1p b) (force (bitp b))) (equal b 1))
+ :hints (("goal" :in-theory (enable b1p bitp zbp)))
+ :rule-classes :forward-chaining)
+
+(defthm not-b1p-bit-forward
+ (implies (and (not (b1p b)) (force (bitp b))) (equal b 0))
+ :hints (("goal" :in-theory (enable b1p bitp zbp)))
+ :rule-classes :forward-chaining)
+
+(defthm simplify-bit-functions-2
+ (and (implies (and (bitp x) (bitp y) (not (b1p x)))
+ (equal (b-and x y) 0))
+ (implies (and (bitp x) (bitp y) (not (b1p y)))
+ (equal (b-and x y) 0))
+ (implies (and (bitp x) (bitp y) (b1p x))
+ (equal (b-and x y) y))
+ (implies (and (bitp x) (bitp y) (b1p y))
+ (equal (b-and x y) x))
+
+ (implies (and (bitp x) (bitp y) (not (b1p x)))
+ (equal (b-ior x y) y))
+ (implies (and (bitp x) (bitp y) (not (b1p y)))
+ (equal (b-ior x y) x))
+ (implies (and (bitp x) (bitp y) (b1p x))
+ (equal (b-ior x y) 1))
+ (implies (and (bitp x) (bitp y) (b1p y))
+ (equal (b-ior x y) 1))
+
+ (implies (and (bitp x) (bitp y) (not (b1p x)))
+ (equal (b-xor x y) y))
+ (implies (and (bitp x) (bitp y) (not (b1p y)))
+ (equal (b-xor x y) x))
+ (implies (and (bitp x) (bitp y) (b1p x))
+ (equal (b-xor x y) (b-not y)))
+ (implies (and (bitp x) (bitp y) (b1p y))
+ (equal (b-xor x y) (b-not x)))
+
+ (implies (and (bitp x) (bitp y) (not (b1p x)))
+ (equal (b-eqv x y) (b-not y)))
+ (implies (and (bitp x) (bitp y) (not (b1p y)))
+ (equal (b-eqv x y) (b-not x)))
+ (implies (and (bitp x) (bitp y) (b1p x))
+ (equal (b-eqv x y) y))
+ (implies (and (bitp x) (bitp y) (b1p y))
+ (equal (b-eqv x y) x))
+
+ (implies (and (bitp x) (bitp y) (not (b1p x)))
+ (equal (b-nand x y) 1))
+ (implies (and (bitp x) (bitp y) (not (b1p y)))
+ (equal (b-nand x y) 1))
+ (implies (and (bitp x) (bitp y) (b1p x))
+ (equal (b-nand x y) (b-not y)))
+ (implies (and (bitp x) (bitp y) (b1p y))
+ (equal (b-nand x y) (b-not x)))
+
+ (implies (and (bitp x) (bitp y) (not (b1p x)))
+ (equal (b-nor x y) (b-not y)))
+ (implies (and (bitp x) (bitp y) (not (b1p y)))
+ (equal (b-nor x y) (b-not x)))
+ (implies (and (bitp x) (bitp y) (b1p x))
+ (equal (b-nor x y) 0))
+ (implies (and (bitp x) (bitp y) (b1p y))
+ (equal (b-nor x y) 0))
+
+ (implies (and (bitp x) (bitp y) (not (b1p x)))
+ (equal (b-andc1 x y) y))
+ (implies (and (bitp x) (bitp y) (not (b1p y)))
+ (equal (b-andc1 x y) 0))
+ (implies (and (bitp x) (bitp y) (b1p x))
+ (equal (b-andc1 x y) 0))
+ (implies (and (bitp x) (bitp y) (b1p y))
+ (equal (b-andc1 x y) (b-not x)))
+
+ (implies (and (bitp x) (bitp y) (not (b1p x)))
+ (equal (b-andc2 x y) 0))
+ (implies (and (bitp x) (bitp y) (not (b1p y)))
+ (equal (b-andc2 x y) x))
+ (implies (and (bitp x) (bitp y) (b1p x))
+ (equal (b-andc2 x y) (b-not y)))
+ (implies (and (bitp x) (bitp y) (b1p y))
+ (equal (b-andc2 x y) 0))
+
+ (implies (and (bitp x) (bitp y) (not (b1p x)))
+ (equal (b-orc1 x y) 1))
+ (implies (and (bitp x) (bitp y) (not (b1p y)))
+ (equal (b-orc1 x y) (b-not x)))
+ (implies (and (bitp x) (bitp y) (b1p x))
+ (equal (b-orc1 x y) y))
+ (implies (and (bitp x) (bitp y) (b1p y))
+ (equal (b-orc1 x y) 1))
+
+ (implies (and (bitp x) (bitp y) (not (b1p x)))
+ (equal (b-orc2 x y) (b-not y)))
+ (implies (and (bitp x) (bitp y) (not (b1p y)))
+ (equal (b-orc2 x y) 1))
+ (implies (and (bitp x) (bitp y) (b1p x))
+ (equal (b-orc2 x y) 1))
+ (implies (and (bitp x) (bitp y) (b1p y))
+ (equal (b-orc2 x y) x)))
+ :hints (("Goal" :in-theory (enable b1p zbp b-and bitp))))
+
+(deflabel end-b1p-bit-rewriter)
+
+(deftheory b1p-bit-rewriter
+ (set-difference-theories (universal-theory 'end-b1p-bit-rewriter)
+ (universal-theory 'begin-b1p-bit-rewriter)))
+
+(in-theory (disable b1p-bit-rewriter))
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; BDD helps
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(deftheory pre-bdd-disables
+ '(bv-eqv-iff-equal simplify-bit-functions))
+
+(deftheory bdd-disables
+ '(bv-eqv-iff-equal simplify-bit-functions))
+
+(theory-invariant (incompatible (:rewrite bv-eqv-iff-equal)
+ (:rewrite rdb-expand)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; range of unsigned-byte-p
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; theories about the range of unsigned-byte-p
+(defthm plus-unsigned-byte-p-lt-2-*-expt-2-width
+ (implies (and (unsigned-byte-p width val1)
+ (unsigned-byte-p width val2))
+ (< (+ val1 val2) (* 2 (expt 2 width))))
+ :hints (("goal" :in-theory (enable unsigned-byte-p))))
+
+(defun logbit-induction (pos val)
+ (if (zp pos)
+ val
+ (logbit-induction (1- pos) (logcdr val))))
+
+; If a value are in the range 0 <= val < 2^width
+; then the width'th bit of val is not set.
+(defthm logbit-0-if-val-lt-expt-2-width
+ (implies (and (integerp width) (<= 0 width)
+ (integerp val)
+ (<= 0 val) (< val (expt 2 width)))
+ (equal (logbit width val) 0))
+ :hints (("goal" :in-theory (e/d (logbit* expt logcar logcdr)
+ (exponents-add))
+ :induct (logbit-induction width val)))
+ :rule-classes nil)
+
+
+(encapsulate nil
+(local
+ (defthm logbit-1-if-val-gt-expt-2-width-help1
+ (IMPLIES (AND (INTEGERP WIDTH)
+ (< 0 WIDTH)
+ (INTEGERP VAL)
+ (<= (* 2 (EXPT 2 (+ -1 WIDTH))) VAL)
+ (< (/ VAL 2) (* 2 (EXPT 2 (+ -1 WIDTH)))))
+ (> (* 2 (EXPT 2 (+ -1 WIDTH)))
+ (FLOOR VAL 2)))
+ :rule-classes nil))
+
+(local
+ (defthm logbit-1-if-val-gt-expt-2-width-help2
+ (implies (and (integerp val)
+ (integerp width) (< 0 width)
+ (< VAL (* 2 2 (EXPT 2 (+ -1 WIDTH)))))
+ (< (/ VAL 2) (* 2 (EXPT 2 (+ -1 WIDTH)))))
+ :hints (("goal" :in-theory (e/d (expt) (exponents-add))))
+ :rule-classes nil))
+
+(local
+(defthm logbit-1-if-val-gt-expt-2-width-help
+ (IMPLIES (AND (INTEGERP WIDTH)
+ (INTEGERP VAL)
+ (< 0 WIDTH)
+ (<= (* 2 (EXPT 2 (+ -1 WIDTH))) (FLOOR VAL 2)))
+ (<= (* 2 2 (EXPT 2 (+ -1 WIDTH))) VAL))
+ :hints (("goal" :in-theory (e/d (exponents-add) (expt))
+ :use ((:instance logbit-1-if-val-gt-expt-2-width-help1)
+ (:instance logbit-1-if-val-gt-expt-2-width-help2))))))
+
+
+; If a value are in the range 2^width <= val < 2^width * 2,
+; then the width'th bit of val is set.
+(defthm logbit-1-if-val-gt-expt-2-width
+ (implies (and (integerp width) (<= 0 width)
+ (integerp val)
+ (<= (expt 2 width) val)
+ (< val (* 2 (expt 2 width))))
+ (equal (logbit width val) 1))
+ :hints (("goal" :in-theory (e/d (logbit* expt logcar logcdr)
+ (exponents-add))
+ :induct (logbit-induction width val)))
+ :rule-classes nil)
+)
+
+; Suppose val1 and val2 are unsigned-byte-p whose width is w.
+; If w'th bit of the sum (+ val1 val2) is not set,
+; (+ val1 val2) < 2^w.
+(defthm plus-unsigned-byte-lt-expt-2-width-if-logbit
+ (implies (and (unsigned-byte-p width val1)
+ (unsigned-byte-p width val2)
+ (not (b1p (logbit width (+ val1 val2)))))
+ (< (+ val1 val2) (expt 2 width)))
+ :hints (("goal" :in-theory (enable unsigned-byte-p)
+ :use (:instance logbit-1-if-val-gt-expt-2-width
+ (val (+ val1 val2))))))
+
+
+
+; Suppose val1 and val2 are unsigned-byte-p whose width is w.
+; If w'th bit of the sum (+ val1 val2) is set, then
+; 2^w < (+ val1 val2).
+(defthm plus-unsigned-byte-gt-expt-2-width-if-logbit
+ (implies (and (unsigned-byte-p width val1)
+ (unsigned-byte-p width val2)
+ (b1p (logbit width (+ val1 val2))))
+ (<= (expt 2 width) (+ val1 val2)))
+ :hints (("goal" :in-theory (enable unsigned-byte-p)
+ :use (:instance logbit-0-if-val-lt-expt-2-width
+ (val (+ val1 val2))))))
+
+; Suppose val1 and val2 are unsigned-byte-p whose width is w.
+; If the sum of val1 and val2 does not carry out to w'th bit,
+; (loghead w (+ val1 val2)) = (+ val1 val2)
+(defthm loghead-unsigned-byte-+-if-not-carry
+ (implies (and (integerp width)
+ (<= 0 width)
+ (unsigned-byte-p width val1)
+ (unsigned-byte-p width val2)
+ (not (b1p (logbit width (+ val1 val2)))))
+ (equal (loghead width (+ val1 val2)) (+ val1 val2)))
+ :hints (("goal" :in-theory (e/d (loghead)
+ (bfix))
+ :do-not-induct t)))
+
+(encapsulate nil
+(local
+(defthm j*k-ge-2*k-if-j-gt-1
+ (implies (and (integerp j)
+ (< 1 j)
+ (integerp k)
+ (< 0 k))
+ (<= (* 2 k) (* j k)))
+ :hints (("Goal" :in-theory (enable <-*-right-cancel)))
+ :rule-classes :linear))
+
+; A trivia theorem.
+; If y < x < 2*y, then (x mod y) = x - y
+(defthm mod-x-y-=-minux-x-y
+ (implies (and (integerp x) (integerp y) (< 0 y)
+ (<= y x) (< x (* 2 y)))
+ (equal (mod x y) (- x y)))
+ :Hints (("goal" :in-theory (disable (:generalize floor-bounded-by-/)))
+ ("subgoal 1" :cases ((<= j 1)))))
+)
+
+(in-theory (disable mod-x-y-=-minux-x-y))
+
+; Suppose val1 and val2 are unsigned-byte-p whose width is w.
+; If the sum of val1 and val2 does not carry out to w'th bit,
+; (loghead w (+ val1 val2)) = (+ val1 val2)
+(defthm loghead-unsigned-byte-+-if-carry
+ (implies (and (integerp width)
+ (<= 0 width)
+ (unsigned-byte-p width val1)
+ (unsigned-byte-p width val2)
+ (b1p (logbit width (+ val1 val2))))
+ (equal (loghead width (+ val1 val2))
+ (- (+ val1 val2) (expt 2 width))))
+ :hints (("goal" :in-theory (enable loghead mod-x-y-=-minux-x-y)
+ :do-not-induct t)))