@@ -531,9 +531,8 @@ theorem zeroExtend_eq_setWidth {v : Nat} {x : BitVec w} :
531
531
simp [n_le_i, toNat_ofNat]
532
532
533
533
@[simp] theorem toInt_setWidth (x : BitVec w) :
534
- (x.setWidth v).toInt = Int.bmod (x.toNat) (2 ^v) := by
535
- rw [toInt_eq_toNat_bmod, toNat_setWidth]
536
- simp [@Int.emod_bmod _ (2 ^ v)]
534
+ (x.setWidth v).toInt = Int.bmod x.toNat (2 ^v) := by
535
+ simp [toInt_eq_toNat_bmod, toNat_setWidth, Int.emod_bmod]
537
536
538
537
theorem setWidth'_eq {x : BitVec w} (h : w ≤ v) : x.setWidth' h = x.setWidth v := by
539
538
apply eq_of_toNat_eq
@@ -1537,30 +1536,43 @@ theorem signExtend_eq_setWidth_of_lt (x : BitVec w) {v : Nat} (hv : v ≤ w):
1537
1536
theorem signExtend_eq (x : BitVec w) : x.signExtend w = x := by
1538
1537
rw [signExtend_eq_setWidth_of_lt _ (Nat.le_refl _), setWidth_eq]
1539
1538
1540
- theorem toNat_signExtend_of_gt (x : BitVec w) {v : Nat} (hv : v >= w):
1541
- (x.signExtend v).toNat = x.toNat + (2 ^v - 2 ^w) * (if x.msb then 1 else 0 ) := by
1539
+ /-- Sign extending to a larger bitwidth depends on the msb.
1540
+ If the msb is false, then the result equals the original value.
1541
+ If the msb is true, then we add a value of `(2^v - 2^w)`, which arises from the sign extension. -/
1542
+ theorem toNat_signExtend_of_le (x : BitVec w) {v : Nat} (hv : w ≤ v) :
1543
+ (x.signExtend v).toNat = x.toNat + if x.msb then 2 ^v - 2 ^w else 0 := by
1542
1544
apply Nat.eq_of_testBit_eq
1543
1545
intro i
1544
1546
have ⟨k, hk⟩ := Nat.exists_eq_add_of_le hv; rw [hk]
1545
- rw [testBit_toNat, getLsbD_signExtend, Nat.pow_add, ← Nat.mul_sub_one,
1546
- Nat.add_comm (x.toNat), Nat.mul_assoc, Nat.testBit_mul_pow_two_add _ (x.isLt)]
1547
- by_cases h : i < w
1548
- · simp [h, Nat.lt_add_right k h, testBit_toNat]
1549
- · by_cases h2 : x.msb
1550
- <;> by_cases h1 : i < w + k
1551
- <;> simp [h2, h, h1, Nat.sub_lt_left_of_lt_add (Nat.le_of_not_lt h)]
1552
- exact Nat.le_sub_of_add_le (Nat.add_comm _ _ ▸ (Nat.le_of_not_lt h1))
1547
+ rw [testBit_toNat, getLsbD_signExtend, Nat.pow_add, ← Nat.mul_sub_one, Nat.add_comm (x.toNat)]
1548
+ by_cases hx : x.msb
1549
+ · simp [hx, Nat.testBit_mul_pow_two_add _ x.isLt, testBit_toNat]
1550
+ -- Case analysis on i being in the intervals [0..w), [w..w + k), [w+k..∞)
1551
+ have hi : i < w ∨ (w ≤ i ∧ i < w + k) ∨ w + k ≤ i := by omega
1552
+ rcases hi with hi | hi | hi
1553
+ · simp [hi]; omega
1554
+ · simp [hi]; omega
1555
+ · simp [hi, show ¬ (i < w + k) by omega, show ¬ (i < w) by omega]
1556
+ omega
1557
+ · simp [hx, Nat.testBit_mul_pow_two_add _ x.isLt, testBit_toNat]
1558
+ have hi : i < w ∨ (w ≤ i ∧ i < w + k) ∨ w + k ≤ i := by omega
1559
+ rcases hi with hi | hi | hi
1560
+ · simp [hi]; omega
1561
+ · simp [hi]
1562
+ · simp [hi, show ¬ (i < w + k) by omega, show ¬ (i < w) by omega, getLsbD_ge x i (by omega)]
1553
1563
1564
+ /-- Sign extending to a larger bitwidth depends on the msb.
1565
+ If the msb is false, then the result equals the original value.
1566
+ If the msb is true, then we add a value of `(2^v - 2^w)`, which arises from the sign extension. -/
1554
1567
theorem toNat_signExtend (x : BitVec w) {v : Nat} :
1555
- (x.signExtend v).toNat = (x.setWidth v).toNat + ( 2 ^ v - 2 ^ w) * ( if x.msb then 1 else 0 ) := by
1568
+ (x.signExtend v).toNat = (x.setWidth v).toNat + if x.msb then 2 ^ v - 2 ^ w else 0 := by
1556
1569
by_cases h : v ≤ w
1557
- · rw [signExtend_eq_setWidth_of_lt _ h, toNat_setWidth]
1558
- simp [Nat.sub_eq_zero_of_le (Nat.pow_le_pow_of_le_right Nat.two_pos h)]
1559
- · have H := Nat.pow_le_pow_of_le_right Nat.two_pos (Nat.le_of_lt (Nat.lt_of_not_le h))
1560
- rw [toNat_signExtend_of_gt _ (Nat.le_of_lt (Nat.lt_of_not_le h)), toNat_setWidth]
1561
- rw [Nat.mod_eq_of_lt (Nat.lt_of_lt_of_le x.isLt H)]
1570
+ · have : 2 ^v ≤ 2 ^w := Nat.pow_le_pow_of_le_right Nat.two_pos h
1571
+ simp [signExtend_eq_setWidth_of_lt x h, toNat_setWidth, Nat.sub_eq_zero_of_le this]
1572
+ · have : 2 ^w ≤ 2 ^v := Nat.pow_le_pow_of_le_right Nat.two_pos (by omega)
1573
+ rw [toNat_signExtend_of_le x (by omega), toNat_setWidth, Nat.mod_eq_of_lt (by omega)]
1562
1574
1563
- theorem toInt_signExtend_of_gt (x : BitVec w) (hv : w < v):
1575
+ theorem toInt_signExtend_of_lt (x : BitVec w) (hv : w < v):
1564
1576
(x.signExtend v).toInt = x.toInt := by
1565
1577
simp only [toInt_eq_msb_cond, toNat_signExtend]
1566
1578
have : (x.signExtend v).msb = x.msb := by
@@ -1577,7 +1589,6 @@ theorem toInt_signExtend_of_le (x : BitVec w) (hv : v ≤ w) :
1577
1589
(x.signExtend v).toInt = Int.bmod (x.toNat) (2 ^v) := by
1578
1590
simp [signExtend_eq_setWidth_of_lt _ hv]
1579
1591
1580
-
1581
1592
/-! ### append -/
1582
1593
1583
1594
theorem append_def (x : BitVec v) (y : BitVec w) :
0 commit comments