Skip to content

Commit be73247

Browse files
committed
WIP
1 parent dcd6e05 commit be73247

File tree

1 file changed

+18
-57
lines changed

1 file changed

+18
-57
lines changed

src/Init/Data/BitVec/Lemmas.lean

Lines changed: 18 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -655,7 +655,7 @@ theorem getElem?_setWidth (m : Nat) (x : BitVec n) (i : Nat) :
655655
getLsbD (setWidth m x) i = (decide (i < m) && getLsbD x i) := by
656656
simp [getLsbD, toNat_setWidth, Nat.testBit_mod_two_pow]
657657

658-
@[simp] theorem getMsbD_setWidth {m : Nat} {x : BitVec n} {i : Nat} :
658+
theorem getMsbD_setWidth {m : Nat} {x : BitVec n} {i : Nat} :
659659
getMsbD (setWidth m x) i = (decide (m - n ≤ i) && getMsbD x (i + n - m)) := by
660660
unfold setWidth
661661
by_cases h : n ≤ m <;> simp only [h]
@@ -1253,6 +1253,7 @@ theorem shiftLeftZeroExtend_eq {x : BitVec w} :
12531253
(shiftLeftZeroExtend x i).msb = x.msb := by
12541254
simp [shiftLeftZeroExtend_eq, BitVec.msb]
12551255

1256+
12561257
theorem shiftLeft_add {w : Nat} (x : BitVec w) (n m : Nat) :
12571258
x <<< (n + m) = (x <<< n) <<< m := by
12581259
ext i
@@ -1687,68 +1688,27 @@ theorem getLsbD_signExtend (x : BitVec w) {v i : Nat} :
16871688
· rw [signExtend_eq_not_setWidth_not_of_msb_true hmsb]
16881689
by_cases (i < v) <;> by_cases (i < w) <;> simp_all <;> omega
16891690

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
16941694
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
17331700

17341701
theorem getElem_signExtend {x : BitVec w} {v i : Nat} (h : i < v) :
17351702
(x.signExtend v)[i] = if i < w then x.getLsbD i else x.msb := by
17361703
rw [←getLsbD_eq_getElem, getLsbD_signExtend]
17371704
simp [h]
17381705

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]
17521712

17531713
/-- Sign extending to a width smaller than the starting width is a truncation. -/
17541714
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} :
19151875
x ++ 0#m = x.signExtend (n + m) <<< m := by
19161876
induction m
19171877
case zero =>
1918-
simp
1878+
simp [signExtend]
19191879
case succ i ih =>
1880+
simp [bv_toNat]
19201881
sorry
19211882

19221883
def lhs (x : BitVec n) (y : BitVec m) : Int := (x++y).toInt

0 commit comments

Comments
 (0)