@@ -655,7 +655,7 @@ theorem getElem?_setWidth (m : Nat) (x : BitVec n) (i : Nat) :
655
655
getLsbD (setWidth m x) i = (decide (i < m) && getLsbD x i) := by
656
656
simp [getLsbD, toNat_setWidth, Nat.testBit_mod_two_pow]
657
657
658
- @[simp] theorem getMsbD_setWidth {m : Nat} {x : BitVec n} {i : Nat} :
658
+ theorem getMsbD_setWidth {m : Nat} {x : BitVec n} {i : Nat} :
659
659
getMsbD (setWidth m x) i = (decide (m - n ≤ i) && getMsbD x (i + n - m)) := by
660
660
unfold setWidth
661
661
by_cases h : n ≤ m <;> simp only [h]
@@ -1253,6 +1253,7 @@ theorem shiftLeftZeroExtend_eq {x : BitVec w} :
1253
1253
(shiftLeftZeroExtend x i).msb = x.msb := by
1254
1254
simp [shiftLeftZeroExtend_eq, BitVec.msb]
1255
1255
1256
+
1256
1257
theorem shiftLeft_add {w : Nat} (x : BitVec w) (n m : Nat) :
1257
1258
x <<< (n + m) = (x <<< n) <<< m := by
1258
1259
ext i
@@ -1687,68 +1688,27 @@ theorem getLsbD_signExtend (x : BitVec w) {v i : Nat} :
1687
1688
· rw [signExtend_eq_not_setWidth_not_of_msb_true hmsb]
1688
1689
by_cases (i < v) <;> by_cases (i < w) <;> simp_all <;> omega
1689
1690
1690
- protected theorem Nat.sub_sub_comm {n m k : Nat} : n - m - k = n - k - m := sorry
1691
-
1692
- theorem getMsbD_signExtend (x : BitVec w) {v i : Nat} :
1693
- (x.signExtend v).getMsbD i = (decide (i < v) && (if i > v-w then x.getMsbD (i-(v-w)) else x.msb)) := by
1691
+ theorem getMsbD_signExtend {x : BitVec w} {v i : Nat} :
1692
+ (x.signExtend v).getMsbD i =
1693
+ (decide (i < v) && if v - w ≤ i then x.getMsbD (i + w - v) else x.msb) := by
1694
1694
rcases hmsb : x.msb with rfl | rfl
1695
- · simp [signExtend_eq_setWidth_of_msb_false hmsb]
1696
- simp [getMsbD_setWidth']
1697
-
1698
-
1699
- rw [signExtend_eq_not_setWidth_not_of_msb_false hmsb]
1700
- rw [getMsbD]
1701
- rw [getMsbD]
1702
- simp
1703
- by_cases h : i < v
1704
- ·
1705
- simp [h]
1706
- simp [show v - 1 - i < v by omega]
1707
- by_cases h' : v - w < i
1708
- · simp [h']
1709
- simp [show (i - (v - w) < w) by omega]
1710
- rw [show (w - 1 - (i - (v-w))) = (v - 1 - i) by omega]
1711
- · simp [h']
1712
- omega
1713
- · simp [h]
1714
-
1715
- · rw [signExtend_eq_not_setWidth_not_of_msb_true hmsb]
1716
- rw [getMsbD]
1717
- rw [getMsbD]
1718
- simp
1719
- by_cases h : i < v
1720
- ·
1721
- simp [h]
1722
- simp [show v - 1 - i < v by omega]
1723
- by_cases h' : v - w < i
1724
- · simp [h']
1725
- simp [show (i - (v - w) < w) by omega]
1726
- simp [show (v - 1 - i < w) by omega]
1727
- rw [show (w - 1 - (i - (v-w))) = (v - 1 - i) by omega]
1728
- · simp [h']
1729
- rw [getlsbD_of]
1730
-
1731
- omega
1732
- · simp [h]
1695
+ · simp [signExtend_eq_setWidth_of_msb_false hmsb, getMsbD_setWidth]
1696
+ by_cases h : (v - w ≤ i) <;> simp [h, getMsbD] <;> omega
1697
+ · simp only [signExtend_eq_not_setWidth_not_of_msb_true hmsb, getMsbD_not,
1698
+ getMsbD_setWidth, Bool.not_and, Bool.not_not, Bool.if_true_right]
1699
+ by_cases h : i < v <;> by_cases h' : v - w ≤ i <;> simp [h, h'] <;> omega
1733
1700
1734
1701
theorem getElem_signExtend {x : BitVec w} {v i : Nat} (h : i < v) :
1735
1702
(x.signExtend v)[i] = if i < w then x.getLsbD i else x.msb := by
1736
1703
rw [←getLsbD_eq_getElem, getLsbD_signExtend]
1737
1704
simp [h]
1738
1705
1739
- theorem msb_SignExtend (x : BitVec w) :
1740
- (x.signExtend v).msb = (if v ≥ w then x.msb else x.getLsbD v) := by
1741
- by_cases h : v ≥ w
1742
- · simp [h, BitVec.msb]
1743
-
1744
-
1745
-
1746
-
1747
- unfold signExtend
1748
-
1749
- rw [msb_eq_getLsbD_last]
1750
- simp only [getLsbD_setWidth]
1751
- cases getLsbD x (v - 1 ) <;> simp; omega
1706
+ theorem msb_SignExtend {x : BitVec w} :
1707
+ (x.signExtend v).msb = (decide (0 < v) && if w ≥ v then x.getMsbD (w - v) else x.msb) := by
1708
+ simp [BitVec.msb, getMsbD_signExtend]
1709
+ by_cases h : w ≥ v
1710
+ · simp [h, show v - w = 0 by omega]
1711
+ · simp [h, show ¬ (v - w = 0 ) by omega]
1752
1712
1753
1713
/-- Sign extending to a width smaller than the starting width is a truncation. -/
1754
1714
theorem signExtend_eq_setWidth_of_lt (x : BitVec w) {v : Nat} (hv : v ≤ w):
@@ -1915,8 +1875,9 @@ theorem append_zero {n m : Nat} {x : BitVec n} :
1915
1875
x ++ 0 #m = x.signExtend (n + m) <<< m := by
1916
1876
induction m
1917
1877
case zero =>
1918
- simp
1878
+ simp [signExtend]
1919
1879
case succ i ih =>
1880
+ simp [bv_toNat]
1920
1881
sorry
1921
1882
1922
1883
def lhs (x : BitVec n) (y : BitVec m) : Int := (x++y).toInt
0 commit comments