4
(declare (xargs :guard t))
9
(declare (xargs :guard (integerp k)))
14
(include-book "cat-def")
15
(local (include-book "../../arithmetic/top"))
16
(local (include-book "bits"))
17
(local (include-book "bitn"))
18
(local (include-book "bvecp"))
19
(local (include-book "cat"))
22
(declare (xargs :guard (and (natp x)
25
(mbe :logic (bits x n n)
26
:exec (if (evenp (ash x (- n))) 0 1)))
30
Currently we expect to leave setbits enabled so that it rewrites to cat, but there are some lemmas below which
31
might be useful if we choose to keep setbits disabled...
33
is this comment still valid? :
34
;it may happen that setbitn is called with an index which is a signal rather than a constant.
35
;in that case, we probably don't want it to expand to setbits.
36
;thus, we always expect the indices in setbits calls to be constants
39
;Set bits I down to J of the W-bit value X to Y.
41
(setbits x w i j y) is only well-defined when the following predicate is true:
50
(bvecp y (+ 1 i (- j))))
55
(defund setbits (x w i j y)
56
(declare (xargs :guard (and (rationalp x) (rationalp y)
57
(acl2-numberp i) (acl2-numberp j) (acl2-numberp w))))
60
(cat (bits x (1- w) (+ 1 i))
62
(cat (bits y (+ i (- j)) 0)
69
;Note: when j is 0, there is not lower part of x, but we have cat-with-n-0 to handle this case.
70
(defund setbits (x w i j y)
71
(declare (xargs :guard (and (natp x)
80
(mbe :logic (cat (bits x (1- w) (1+ i))
82
(cat (bits y (+ i (- j)) 0)
87
:exec (cond ((int= j 0)
88
(cond ((int= (1+ i) w)
89
(bits y (+ i (- j)) 0))
91
(cat (bits x (1- w) (1+ i))
93
(bits y (+ i (- j)) 0)
96
(cat (bits y (+ i (- j)) 0)
101
(cat (bits x (1- w) (1+ i))
103
(cat (bits y (+ i (- j)) 0)
112
(defun setbits (x i j y)
113
(ocat (ocat (ash x (- (1+ i)))
120
(defthm setbits-nonnegative-integer-type
121
(and (integerp (setbits x w i j y))
122
(<= 0 (setbits x w i j y)))
123
:hints (("Goal" :in-theory (enable setbits)))
124
:rule-classes (:type-prescription)
127
;this rule is no better than setbits-nonnegative-integer-type and might be worse:
128
(in-theory (disable (:type-prescription setbits)))
131
(natp (setbits x w i j y)))
134
(defthm setbits-upper-bound
135
(< (setbits x w i j y) (expt 2 w))
136
:hints (("Goal" :in-theory (enable setbits cat-upper-bound))))
138
(defthm setbits-bvecp-simple
139
(bvecp (setbits x w i j y) w)
140
:hints (("goal" :in-theory (enable bvecp))))
142
(defthm setbits-bvecp
143
(implies (and (<= w k)
144
(case-split (integerp k))
146
(bvecp (setbits x w i j y) k))
147
:hints (("goal" :use setbits-bvecp-simple
148
:in-theory (disable setbits-bvecp-simple))))
150
(defthm setbits-does-nothing
151
(implies (and (case-split (< i w))
152
(case-split (<= j i))
153
(case-split (integerp i))
154
(case-split (integerp j))
155
(case-split (<= 0 j))
157
(equal (setbits x w i j (bits x i j))
159
:hints (("Goal" :in-theory (enable setbits))))
162
#| old, prove the two match for bvecps
163
(defun oldsetbits (x i j y)
164
(ocat (ocat (ash x (- (1+ i)))
171
(defthm oldsetbits-rewrite-1
172
(implies (and (bvecp x n)
178
(bvecp y (1+ (- i j))))
179
(equal (oldsetbits x i j y)
180
(ocat (ocat (bits x (1- n) (1+ i))
186
(defthm setbits-match
187
(implies (and (bvecp x n)
192
(bvecp y (1+ (- i j)))
196
(equal (oldsetbits x i j y)
197
(setbits x w i j y)))
199
:hints (("Goal" :in-theory (enable setbits oldsetbits bits-does-nothing
204
;taking bits from the lower third
205
;slow proof with may cases!
206
(defthm bits-setbits-1
207
(implies (and (< k j)
208
(case-split (<= 0 w))
210
(case-split (<= 0 l))
211
(case-split (<= j i)) ;drop?
212
(case-split (integerp w))
213
(case-split (integerp i))
214
(case-split (integerp j))
216
(equal (bits (setbits x w i j y) k l)
218
:hints (("Goal" :in-theory (enable setbits))))
220
;taking bits from the middle third
221
;slow proof with may cases!
222
(defthm bits-setbits-2
223
(implies (and (<= k i)
225
(case-split (integerp i))
226
(case-split (<= 0 j))
227
(case-split (integerp j))
228
(case-split (acl2-numberp k)); (case-split (integerp k))
229
(case-split (acl2-numberp l)) ; (case-split (integerp l))
230
(case-split (integerp w))
231
(case-split (<= 0 w))
234
(equal (bits (setbits x w i j y) k l)
235
(bits y (- k j) (- l j))))
236
:hints (("Goal" :in-theory (enable setbits natp))))
238
;taking bits from the upper third
239
(defthm bits-setbits-3
240
(implies (and (< i l)
242
(case-split (< k w)) ;handle this?
243
(case-split (<= j i))
244
(case-split (<= 0 l))
245
(case-split (<= 0 j))
246
(case-split (<= 0 w))
247
(case-split (integerp l))
248
(case-split (integerp w))
249
(case-split (integerp i))
250
(case-split (integerp j))
251
(case-split (integerp k))
253
(equal (bits (setbits x w i j y) k l)
255
:hints (("Goal" :in-theory (enable setbits natp))))
258
(defthm setbits-with-0-width
259
(equal (setbits x 0 i j y)
261
:hints (("Goal" :cases ((integerp j))
262
:in-theory (enable setbits))))
265
;why can't i prove this from bits-setbits?
266
(defthm bitn-setbits-1
267
(implies (and (< k j) ;case 1
278
(equal (bitn (setbits x w i j y) k)
280
:hints (("Goal" :in-theory (enable setbits)))
283
(defthm bitn-setbits-2
284
(implies (and(<= k i) ;;case-2
294
(equal (bitn (setbits x w i j y) k)
296
:hints (("Goal" :in-theory (enable setbits)))
299
(defthm bitn-setbits-3
300
(implies (and (< i k) ;;case-3
310
(equal (bitn (setbits x w i j y) k)
312
:hints (("Goal" :in-theory (enable setbits)))
316
;taking a slice of each of the lower two thirds.
317
(defthm bits-setbits-4
318
(implies (and (<= k i) ;;case-4
327
(acl2-numberp l) ;(integerp l)
329
(equal (bits (setbits x w i j y) k l)
330
(cat (bits y (- k j) 0)
334
:hints (("Goal" :in-theory (enable setbits))))
336
;taking a slice of each of the upper two thirds.
337
(defthm bits-setbits-5
338
(implies (and (< i k) ;case-5
341
(< k w) ;case-5 ;BOZO drop stuff like this?
346
(acl2-numberp l) ;(integerp l)
348
(equal (bits (setbits x w i j y) k l)
349
(cat (bits x k (1+ i))
351
(bits y (- i j) (- l j))
353
:hints (("Goal" :in-theory (enable setbits))))
355
;taking a slice of each of the thirds.
356
;make one huge bits-setbits lemma?
357
(defthm bits-setbits-6
358
(implies (and (< i k) ;;case-6
365
(acl2-numberp l) ; (integerp l)
368
(equal (bits (setbits x w i j y) k l)
369
(cat (bits x k (1+ i))
371
(cat (bits y (+ i (- j)) 0)
376
:hints (("Goal" :in-theory (enable setbits))))
378
;prove that if (not (natp w)) setbits = 0 .
380
;combining these adjacent ranges [i..j][k..l]
381
(defthm setbits-combine
382
(implies (and (equal j (+ k 1))
383
(case-split (<= j i))
384
(case-split (<= l k))
385
(case-split (natp w))
386
(case-split (natp i))
387
(case-split (natp j))
388
(case-split (natp k))
389
(case-split (natp l))
391
(equal (setbits (setbits x w k l y1) w i j y2)
392
(setbits x w i l (cat y2
397
:hints (("goal" :in-theory (enable setbits))))
399
(defthm setbits-combine-2
400
(implies (and (equal j (+ k 1))
402
(case-split (<= j i))
403
(case-split (<= l k))
404
(case-split (natp w))
405
(case-split (natp i))
406
(case-split (natp j))
407
(case-split (natp k))
408
(case-split (natp l))
410
(equal (setbits (setbits x w i j y2) w k l y1)
411
(setbits x w i l (cat y2
416
:hints (("goal" :in-theory (enable setbits))))
418
(defthm setbits-combine-3
419
(implies (and (equal j (+ k 1))
421
(case-split (<= j i))
422
(case-split (<= l k))
423
(case-split (natp w))
424
(case-split (natp i))
425
(case-split (natp j))
426
(case-split (natp k))
427
(case-split (natp l)))
428
(equal (setbits (setbits x w i j y2) w k l y1)
430
(cat y2 (+ 1 i (- j))
431
y1 (+ 1 k (- l)))))))
435
(implies (and (equal i (1- w))
436
(case-split (bvecp y w))
438
(equal (setbits x w i 0 y)
440
:hints (("goal" :in-theory (enable setbits))))