4
(declare (xargs :guard t))
9
(declare (xargs :guard (integerp k)))
14
(include-book "cat-def")
15
(local (include-book "setbits-proofs"))
18
(declare (xargs :guard (and (natp x)
21
(mbe :logic (bits x n n)
22
:exec (if (evenp (ash x (- n))) 0 1)))
26
Currently we expect to leave setbits enabled so that it rewrites to cat, but there are some lemmas below which
27
might be useful if we choose to keep setbits disabled...
29
is this comment still valid? :
30
;it may happen that setbitn is called with an index which is a signal rather than a constant.
31
;in that case, we probably don't want it to expand to setbits.
32
;thus, we always expect the indices in setbits calls to be constants
35
;Set bits I down to J of the W-bit value X to Y.
37
(setbits x w i j y) is only well-defined when the following predicate is true:
46
(bvecp y (+ 1 i (- j))))
50
;Note: when j is 0, there is no lower part of x, but we have cat-with-n-0 to handle this case.
51
(defund setbits (x w i j y)
52
(declare (xargs :guard (and (natp x)
61
(mbe :logic (cat (bits x (1- w) (1+ i))
63
(cat (bits y (+ i (- j)) 0)
68
:exec (cond ((int= j 0)
69
(cond ((int= (1+ i) w)
70
(bits y (+ i (- j)) 0))
72
(cat (bits x (1- w) (1+ i))
74
(bits y (+ i (- j)) 0)
77
(cat (bits y (+ i (- j)) 0)
82
(cat (bits x (1- w) (1+ i))
84
(cat (bits y (+ i (- j)) 0)
90
(defthm setbits-nonnegative-integer-type
91
(and (integerp (setbits x w i j y))
92
(<= 0 (setbits x w i j y)))
93
:rule-classes (:type-prescription))
95
;this rule is no better than setbits-nonnegative-integer-type and might be worse:
96
(in-theory (disable (:type-prescription setbits)))
99
(natp (setbits x w i j y)))
103
(defthm setbits-upper-bound
104
(< (setbits x w i j y) (expt 2 w)))
106
(defthm setbits-bvecp-simple
107
(bvecp (setbits x w i j y) w))
109
(defthm setbits-bvecp
110
(implies (and (<= w k) ;gen?
111
(case-split (integerp k))
113
(bvecp (setbits x w i j y) k)))
115
(defthm setbits-does-nothing
116
(implies (and (case-split (< i w))
117
(case-split (<= j i))
118
(case-split (integerp i))
119
(case-split (integerp j))
120
(case-split (<= 0 j))
122
(equal (setbits x w i j (bits x i j))
125
;taking bits from the lower third
126
(defthm bits-setbits-1
127
(implies (and (< k j)
128
(case-split (<= 0 w))
130
(case-split (<= 0 l))
131
(case-split (<= j i)) ;drop?
132
(case-split (integerp w))
133
(case-split (integerp i))
134
(case-split (integerp j))
136
(equal (bits (setbits x w i j y) k l)
138
:hints (("Goal" :in-theory (enable setbits))))
140
;taking bits from the middle third
142
(defthm bits-setbits-2
143
(implies (and (<= k i)
145
(case-split (integerp i))
146
(case-split (<= 0 j))
147
(case-split (integerp j))
148
(case-split (acl2-numberp k)); (case-split (integerp k))
149
(case-split (acl2-numberp l)) ; (case-split (integerp l))
150
(case-split (integerp w))
151
(case-split (<= 0 w))
154
(equal (bits (setbits x w i j y) k l)
155
(bits y (- k j) (- l j))))
156
:hints (("Goal" :in-theory (enable setbits natp))))
158
;taking bits from the upper third
159
(defthm bits-setbits-3
160
(implies (and (< i l)
162
(case-split (< k w)) ;handle this?
163
(case-split (<= j i))
164
(case-split (<= 0 l))
165
(case-split (<= 0 j))
166
(case-split (<= 0 w))
167
(case-split (integerp l))
168
(case-split (integerp w))
169
(case-split (integerp i))
170
(case-split (integerp j))
171
(case-split (integerp k))
173
(equal (bits (setbits x w i j y) k l)
175
:hints (("Goal" :in-theory (enable setbits natp))))
177
(defthm setbits-with-w-0
178
(equal (setbits x 0 i j y)
181
;add case-splits to the bitn-setbits rules?
182
;why can't i prove this from bits-setbits?
183
(defthm bitn-setbits-1
184
(implies (and (< k j) ;case 1
195
(equal (bitn (setbits x w i j y) k)
198
(defthm bitn-setbits-2
199
(implies (and(<= k i) ;;case-2
209
(equal (bitn (setbits x w i j y) k)
212
(defthm bitn-setbits-3
213
(implies (and (< i k) ;;case-3
223
(equal (bitn (setbits x w i j y) k)
226
;taking a slice of each of the lower two thirds.
227
(defthm bits-setbits-4
228
(implies (and (<= k i) ;;case-4
237
(acl2-numberp l) ;(integerp l)
239
(equal (bits (setbits x w i j y) k l)
240
(cat (bits y (- k j) 0)
244
:hints (("Goal" :in-theory (enable setbits))))
246
;taking a slice of each of the upper two thirds.
247
(defthm bits-setbits-5
248
(implies (and (< i k) ;case-5
251
(< k w) ;case-5 ;BOZO drop stuff like this?
256
(acl2-numberp l) ;(integerp l)
258
(equal (bits (setbits x w i j y) k l)
259
(cat (bits x k (1+ i))
261
(bits y (- i j) (- l j))
264
;taking a slice of each of the thirds.
265
;make one huge bits-setbits lemma?
266
(defthm bits-setbits-6
267
(implies (and (< i k) ;;case-6
274
(acl2-numberp l) ; (integerp l)
277
(equal (bits (setbits x w i j y) k l)
278
(cat (bits x k (1+ i))
280
(cat (bits y (+ i (- j)) 0)
286
;prove that if (not (natp w)) setbits = 0 .
288
;are our setbits-combine rules sufficient to cover all of the cases?
290
;combining these adjacent ranges [i..j][k..l]
291
(defthm setbits-combine
292
(implies (and (equal j (+ k 1))
293
(case-split (<= j i))
294
(case-split (<= l k))
295
(case-split (natp w))
296
(case-split (natp i))
297
(case-split (natp j))
298
(case-split (natp k))
299
(case-split (natp l))
301
(equal (setbits (setbits x w k l y1) w i j y2)
302
(setbits x w i l (cat y2
308
(defthm setbits-combine-2
309
(implies (and (equal j (+ k 1))
311
(case-split (<= j i))
312
(case-split (<= l k))
313
(case-split (natp w))
314
(case-split (natp i))
315
(case-split (natp j))
316
(case-split (natp k))
317
(case-split (natp l))
319
(equal (setbits (setbits x w i j y2) w k l y1)
320
(setbits x w i l (cat y2
326
(defthm setbits-combine-3
327
(implies (and (equal j (+ k 1))
329
(case-split (<= j i))
330
(case-split (<= l k))
331
(case-split (natp w))
332
(case-split (natp i))
333
(case-split (natp j))
334
(case-split (natp k))
335
(case-split (natp l)))
336
(equal (setbits (setbits x w i j y2) w k l y1)
338
(cat y2 (+ 1 i (- j))
339
y1 (+ 1 k (- l)))))))
343
(implies (and (equal i (1- w))
344
(case-split (bvecp y w))
346
(equal (setbits x w i 0 y)