@@ -3455,80 +3455,81 @@ theorem append_assoc_left {a b c : Nat} (x : BitVec a) (y : BitVec b) (z : BitVe
3455
3455
· simp [h₂]
3456
3456
rw [Nat.sub_sub, Nat.add_comm (n := c)]
3457
3457
3458
- theorem cast_heq {n w : Nat} {eq : w = n} {x : BitVec w} :
3459
- HEq (cast eq x) x := by
3460
-
3461
- sorry
3462
-
3463
- theorem heq_cast_right {α β β' : Sort _} (a : α) (b : β) {h : β = β'} :
3464
- HEq a (cast h b) = HEq a b :=
3465
- by
3466
- apply propext;
3467
- constructor
3468
- <;> intro premise;
3469
- . have : HEq (cast h b) b := cast_heq _ _
3470
- apply HEq.trans _ this;
3471
- assumption;
3472
- . apply HEq.trans premise;
3473
- apply HEq.symm;
3474
- apply cast_heq;
3475
-
3476
- theorem heq_cast_left {n w : Nat} {eq : w = n} {x : BitVec w} :
3477
- HEq (cast eq x) x = HEq x x :=
3478
- by
3479
- apply propext;
3480
- constructor
3481
- <;> intro premise;
3482
- . have : HEq x (cast eq x) := HEq.symm cast_heq eq x
3483
- apply HEq.trans this;
3484
- assumption;
3485
- . apply HEq.trans _ premise;
3486
- apply cast_heq;
3487
-
3488
- theorem append_replicate_comm {n w : Nat} {x : BitVec w} :
3489
- HEq (replicate n x ++ x) (x ++ replicate n x) := by
3490
- induction n
3491
- case zero =>
3492
- simp; apply cast_heq
3493
- case succ n ih =>
3494
- rw [replicate_succ_eq, ← cast_append_left (by simp only [Nat.add_comm, Nat.mul_succ]), ← cast_append_right (by simp only [Nat.mul_succ,
3495
- Nat.add_comm])]
3496
- apply HEq.trans (cast_heq ..)
3497
- symm
3498
- apply HEq.trans (cast_heq ..)
3499
- symm
3500
- rw [append_assoc_left]
3501
- apply HEq.trans (cast_heq ..)
3502
- congr 2
3503
- <;> omega
3458
+ @[simp]
3459
+ theorem replicate_one {w : Nat} {x : BitVec w} (h : w = w * 1 := by omega) :
3460
+ (x.replicate 1 ) = x.cast h := by simp [replicate, h]
3461
+
3462
+ theorem replicate_append_replicate_eq {w n : Nat} {x : BitVec w} (h : w * (n + m) = w * n + w * m := by omega) :
3463
+ x.replicate n ++ x.replicate m = (x.replicate (n + m)).cast h := by
3464
+ apply BitVec.eq_of_getLsbD_eq
3465
+ simp only [getLsbD_cast, getLsbD_replicate, getLsbD_append, getLsbD_replicate]
3466
+ intros i
3467
+ by_cases h₀ : i < w * m <;> by_cases h₁ : i < w * (n + m)
3468
+ · simp only [h₀, decide_true, Bool.true_and, cond_true, h₁]
3469
+ · rw [Nat.mul_add] at h₁
3470
+ simp only [h₀, decide_true, Bool.true_and, cond_true, Bool.iff_and_self, decide_eq_true_eq]
3471
+ omega
3472
+ · have h₂ : i ≥ w * m := by omega
3473
+ simp only [h₀, decide_false, Bool.false_and, show i - w * m < w * n by omega, decide_true,
3474
+ Bool.true_and, cond_false, h₁]
3475
+ congr 1
3476
+ rw [Nat.sub_mul_mod (by omega)]
3477
+ · simp only [h₀, decide_false, Bool.false_and, cond_false, h₁, Bool.and_eq_false_imp,
3478
+ decide_eq_true_eq]
3479
+ omega
3480
+
3481
+
3504
3482
3505
3483
@[simp]
3506
3484
theorem getMsbD_replicate {n w : Nat} (x : BitVec w) :
3507
3485
(x.replicate n).getMsbD i =
3508
3486
(decide (i < w * n) && x.getMsbD (i % w)) := by
3509
- induction n generalizing x
3510
- case zero => simp
3511
- case succ n ih =>
3512
- rw [replicate_succ_eq, ← append_replicate_comm]
3513
- simp only [append_def, getMsbD_or, getMsbD_shiftLeftZeroExtend, ih, getMsbD_setWidth',
3514
- ge_iff_le]
3515
- have h_w : w * (n + 1 ) - w = w * n := by
3516
- rw [Nat.mul_succ, Nat.add_sub_cancel]
3517
- rw [h_w]
3518
- by_cases h : i < w * n
3519
- · simp only [h, decide_true, Bool.true_and, show ¬w * n ≤ i by omega, decide_false,
3520
- Bool.false_and, Bool.or_false, Bool.iff_and_self, decide_eq_true_eq]
3521
- intro; omega
3522
- · by_cases h' : i < w * (n + 1 )
3523
- · simp [h, h', ih, show w * n ≤ i by omega]
3524
- rw [Nat.sub_mul_eq_mod_of_lt_of_le (n := n) (by omega) (by omega)]
3525
- · have h_iwn : i - w * n ≥ w := by
3526
- by_cases h'' : i = w * (n + 1 )
3527
- · simp [h'', Nat.mul_succ, Nat.add_comm]
3528
- · simp [show i > w * (n + 1 ) by omega]
3529
- rw [Nat.mul_succ] at h'
3487
+ simp [getMsbD_eq_getLsbD]
3488
+ by_cases h₀ : 0 < w
3489
+ · by_cases h₁ : i < w * n <;> by_cases h₂ : n = 0
3490
+ · simp [h₁, h₂]
3491
+ · simp [h₁, h₂, show w * n - 1 - i < w * n by omega, Nat.mod_lt i h₀]
3492
+ congr 1
3493
+ induction n
3494
+ case neg.e_i.zero => omega
3495
+ case neg.e_i.succ n ih =>
3496
+ simp_all [Nat.mul_add]
3497
+ by_cases h₃ : i < w * n
3498
+ · simp [show w * n + w - 1 -i = w + (w * n - 1 - i) by omega]
3499
+ rw [ih (by omega)]
3500
+ intros hcontra
3501
+ subst hcontra
3502
+ simp at h₃
3503
+ · rw [Nat.mod_eq_of_lt]
3504
+ · have := Nat.mod_add_div i w
3505
+ have hiw : i / w = n := by
3506
+ apply Nat.div_eq_of_lt_le
3507
+ · rw [Nat.mul_comm]
3508
+ omega
3509
+ · rw [Nat.add_mul]
3510
+ simp
3511
+ rw [Nat.mul_comm]
3512
+ omega
3513
+ rw [hiw] at this
3514
+ conv =>
3515
+ lhs
3516
+ rw [← this]
3530
3517
omega
3531
- simp [h, h', h_iwn, show i ≥ w * (n + 1 ) by omega]
3518
+ · omega
3519
+ · simp [h₁, h₂]
3520
+ · simp [h₁, h₂]
3521
+ · simp [show w = 0 by omega]
3522
+
3523
+ @[simp]
3524
+ theorem msb_replicate {n w : Nat} (x : BitVec w) :
3525
+ (x.replicate n).msb =
3526
+ (decide (0 < n) && x.msb) := by
3527
+ simp [BitVec.msb, getMsbD_replicate]
3528
+ by_cases hn : 0 < n <;> by_cases hw : 0 < w
3529
+ · simp [hn, hw]
3530
+ · simp [show w = 0 by omega]
3531
+ · simp [hn, hw]
3532
+ · simp [show w = 0 by omega, show n = 0 by omega]
3532
3533
3533
3534
theorem append_assoc {x₁ : BitVec w₁} {x₂ : BitVec w₂} {x₃ : BitVec w₃} :
3534
3535
(x₁ ++ x₂) ++ x₃ = (x₁ ++ (x₂ ++ x₃)).cast (by omega) := by
0 commit comments