4
;; This file contains the examples from our paper that we
5
;; were able to prove using Brute force through the ACL2
6
;; simplifier. Recursive calls are unrolled and ifs are
7
;; turned into case splits.
9
;; For a description of the example and a description of
10
;; how this relates to our SAT system see our workshop paper,
11
;; A SAT-Based Procedure for Verifying Finite State Machines in ACL2.
16
(and (iff (car x) (car y))
17
(n-bleq (1- n) (cdr x) (cdr y)))))
26
;; Returns a n+1 length sum of the first
27
;; n bits of a and b (plus the carray).
28
(defun v-adder (n c a b)
31
(cons (xor3 c (car a) (car b))
33
(maj3 c (car a) (car b))
36
(defthm v-adder-rewrite
41
(cons (xor3 c (car a) (car b))
43
(maj3 c (car a) (car b))
46
(defthm n-bleq-rewrite
51
(and (iff (car x) (car y))
52
(n-bleq (1- n) (cdr x) (cdr y))))))
55
;; ;; 4 Bit Adder Associativity
56
;; (defthm 4-adder-assoc
57
;; (n-bleq 4 (v-adder 4 nil (v-adder 4 nil a b) c)
58
;; (v-adder 4 nil a (v-adder 4 nil b c))))))
60
;; ;; 32 bit adder associativity
61
;; (defthm 32-adder-assoc
62
;; (n-bleq 32 (v-adder 32 nil (v-adder 32 nil a b) c)
63
;; (v-adder 32 nil a (v-adder 32 nil b c))))
65
;; ;; 200 Bit adder associativity
66
;; (defthm 200-adder-assoc
67
;; (n-bleq 200 (v-adder 200 nil (v-adder 200 nil a b) c)
68
;; (v-adder 200 nil a (v-adder 200 nil b c))))
74
(nth-cdr (1- n) (cdr x))))
76
(defun nth-sublist (n lst)
79
(cons (car lst) (nth-sublist (1- n) (cdr lst)))))
81
(defun append-n (n x y)
84
(cons (car x) (append-n (1- n) (cdr x) y))))
89
(cons nil (n-nills (1- n)))))
91
(defun rev-n (n x ans)
94
(rev-n (1- n) (cdr x) (cons (car x) ans))))
96
(defun mux-n-help (n in rsel)
100
(mux-n-help (1- n) (nth-cdr (expt 2 (1- n)) in) (cdr rsel))
101
(mux-n-help (1- n) in (cdr rsel)))))
103
(defun mux-n (n in sel)
104
(mux-n-help n in (rev-n n sel nil)))
106
(defun mux-n-w-help (n w in)
109
(cons (car in) (mux-n-w-help (1- n) w (nth-cdr w in)))))
111
(defun mux-n-w1 (nw sn w in sel)
114
(cons (mux-n sn (mux-n-w-help (expt 2 sn) w in) sel)
115
(mux-n-w1 (1- nw) sn w (cdr in) sel))))
117
(defun mux-n-w (n w in sel)
118
(mux-n-w1 w n w in sel))
120
(defun shift-mux-help (n w reg)
123
(append-n w reg (shift-mux-help (1- n) w (cons nil reg)))))
125
(defun shifter (sn rn rshift reg)
128
(mux-n-w sn rn (shift-mux-help (expt 2 sn) rn reg) rshift)))
130
(defthm append-n-rewrite
135
(cons (car x) (append-n (1- n) (cdr x) y)))))
137
(defthm nth-cdr-rewrite
142
(nth-cdr (1- n) (cdr x)))))
144
(defthm nth-sublist-rewrite
149
(cons (car lst) (nth-sublist (1- n) (cdr lst))))))
151
(defthm n-nills-rewrite
156
(cons nil (n-nills (1- n))))))
158
(defthm rev-n-rewrite
163
(rev-n (1- n) (cdr x) (cons (car x) ans)))))
165
(defthm mux-n-help-rewrite
167
(mux-n-help n in rsel)
171
(mux-n-help (1- n) (nth-cdr (expt 2 (1- n)) in) (cdr rsel))
172
(mux-n-help (1- n) in (cdr rsel)))))
173
:hints (("Goal" :in-theory (disable nth-cdr-rewrite))))
175
(defthm mux-n-w-help-rewrite
177
(mux-n-w-help n w in)
180
(cons (car in) (mux-n-w-help (1- n) w (nth-cdr w in)))))
181
:hints (("Goal" :in-theory (disable nth-cdr-rewrite))))
183
(defthm mux-n-w1-rewrite
185
(mux-n-w1 nw sn w in sel)
188
(cons (mux-n sn (mux-n-w-help (expt 2 sn) w in) sel)
189
(mux-n-w1 (1- nw) sn w (cdr in) sel))))
190
:hints (("Goal" :in-theory (disable mux-n-w-help-rewrite mux-n-w-help mux-n mux-n-help-rewrite))))
192
(defthm shift-mux-help-rewrite
194
(shift-mux-help n w reg)
197
(append-n w reg (shift-mux-help (1- n) w (cons nil reg)))))
198
:hints (("Goal" :in-theory (disable append-n-rewrite))))
201
;; (defthm 32x6-shift-0
203
;; (car (nth-cdr 5 shift0))
205
;; (shifter 6 32 shift0 reg)
210
;; (defthm 64x7-shift-0
212
;; (car (nth-cdr 6 shift0))
213
;; (n-bleq 64 (shifter 7 64 shift0 reg)
217
;; (defthm 32x4-add-shift
219
;; (shifter 4 32 shift0 (shifter 4 32 shift1 reg))
220
;; (shifter 5 32 (v-adder 4 nil shift0 shift1) reg)))
223
;; (defthm 64x6-add-shift
225
;; (shifter 6 64 shift0 (shifter 6 64 shift1 reg))
226
;; (shifter 7 64 (v-adder 6 nil shift0 shift1) reg)))
228
(defun increment (n x)
232
(cons nil (increment (1- n) (cdr x)))
235
(defthm increment-rewrite
237
(and (syntaxp (quotep n))
239
(equal (increment n x)
241
(cons nil (increment (1- n) (cdr x)))
244
(defthm increment-rewrite0
245
(equal (increment 0 x)
248
(defun next_digit_counter_state (x)
249
(if (n-bleq 4 x '(t nil nil t))
250
(list '(nil nil nil nil) t)
251
(list (increment 4 x) nil)))
253
(defun next_counter_state (n x)
254
(let* ((curr_d_out (next_digit_counter_state (car x)))
255
(curr_d_val (car curr_d_out))
256
(curr_d_reset (cadr curr_d_out)))
260
(cons curr_d_val (next_counter_state (1- n) (cdr x)))
261
(cons curr_d_val (cdr x))))))
264
(defun valid_digit (a)
268
(not (and a3 (or a2 a1)))))
270
(defun valid_digits (n x)
273
(and (valid_digit (car x))
274
(valid_digits (1- n) (cdr x)))))
276
(defthm valid_digits-rewrite
278
(and (syntaxp (quotep n))
282
(and (valid_digit (car x))
283
(valid_digits (1- n) (cdr x))))))
285
(defthm valid_digits-rewrite0
286
(equal (valid_digits 0 x)
289
;; 100 Digit Counter Invariant
290
;; (defthm 100-digit-counter-inv
292
;; (valid_digits 100 x)
293
;; (valid_digits 100 (next_counter_state 100 x))))