lean4-htt/tests/lean/run/bv_cast.lean
Kim Morrison 6b62fed82e
feat: proposed change to BitVec API (#5200)
This renames `BitVec.getLsb` to `getLsbD` (`D` for "default" value, i.e.
false), and introduces `getLsb?` and `getLsb'` (which we can rename to
`getLsb` after a deprecation cycle).

(Similarly for `getMsb`.)

Also adds a `GetElem` class so we can use `x[i]` and `x[i]?` notation. 

Later, we will turn
```
theorem getLsbD_eq_getElem?_getD (x : BitVec w) (i : Nat) (h : i < w) :
    x.getLsbD i = x[i]?.getD false
```
on as a `@[simp]` lemma.

This PR doesn't attempt to demonstrate the benefits, but I think both
arguments are going to get easier, and this will bring the BitVec API
closer in line to List/Array, etc.

---------

Co-authored-by: Markus Himmel <markus@lean-fro.org>
2024-08-30 02:00:57 +00:00

39 lines
1.3 KiB
Text

import Std.Tactic.BVDecide
open BitVec
theorem cast_unit_1 (x : BitVec 64) : Nat.cast 0 &&& x = 0 := by
bv_decide
theorem cast_unit_2 (x : BitVec 64) : x.zeroExtend 32 = (x.zeroExtend 64).zeroExtend 32 := by
bv_decide
theorem cast_unit_3 (x : BitVec 64) : x.zeroExtend 128 = (x.zeroExtend 64).zeroExtend 128 := by
bv_decide
theorem cast_unit_3' (x : BitVec 64) : x.truncate 128 = (x.truncate 64).zeroExtend 128 := by
bv_decide
theorem cast_unit_4 (x y : BitVec 32) : (x.zeroExtend 64).extractLsb 32 0 = (y.zeroExtend 64).extractLsb 32 0 → x = y := by
bv_decide
theorem cast_unit_5 (x y : BitVec 64) : (x ++ y).extractLsb 63 0 = (y ++ x).extractLsb 127 64 := by
bv_decide
theorem cast_unit_5' (x y : BitVec 64) : (BitVec.append x y).extractLsb 63 0 = (y ++ x).extractLsb 127 64 := by
bv_decide
theorem cast_unit_6 (x : BitVec 64) : x.signExtend 32 = (x.signExtend 64).signExtend 32 := by
bv_decide
theorem cast_unit_7 (x : BitVec 64) : x.signExtend 128 = (x.signExtend 64).signExtend 128 := by
bv_decide
theorem cast_unit_8 (x : BitVec 64) : (x.signExtend 128 = x.zeroExtend 128) ↔ (x.msb = false) := by
bv_decide
theorem cast_unit_9 (x : BitVec 32) : (x.replicate 20).zeroExtend 32 = x := by
bv_decide
theorem cast_unit_10 (x : BitVec 32) : (x.replicate 20).getLsbD 40 = x.getLsbD 8 := by
bv_decide