| open BitVec | |
| -- Basic arithmetic | |
| #guard 1#12 + 2#12 = 3#12 | |
| #guard 3#5 * 7#5 = 0x15#5 | |
| #guard 3#4 * 7#4 = 0x05#4 | |
| #guard zeroExtend 4 0x7f#8 = 0xf#4 | |
| #guard zeroExtend 12 0x7f#8 = 0x07f#12 | |
| #guard zeroExtend 12 0x80#8 = 0x080#12 | |
| #guard zeroExtend 16 0xff#8 = 0x00ff#16 | |
| #guard signExtend 4 0x7f#8 = 0xf#4 | |
| #guard signExtend 12 0x7f#8 = 0x07f#12 | |
| #guard signExtend 12 0x80#8 = 0xf80#12 | |
| #guard signExtend 16 0xff#8 = 0xffff#16 | |
| -- Division and mod/rem | |
| #guard 3#4 / 0 = 0 | |
| #guard 10#4 / 2 = 5 | |
| #guard 8#4 % 0 = 8 | |
| #guard 4#4 % 1 = 0 | |
| #guard 4#4 % 3 = 1 | |
| #guard 0xf#4 % (-2) = 1 | |
| #guard 0xf#4 % (-8) = 7 | |
| #guard sdiv 6#4 2 = 3#4 | |
| #guard sdiv 7#4 2 = 3#4 | |
| #guard sdiv 6#4 (-2) = -3#4 | |
| #guard sdiv 7#4 (-2) = -3#4 | |
| #guard sdiv (-6#4) 2 = -3#4 | |
| #guard sdiv (-7#4) 2 = -3#4 | |
| #guard sdiv (-6#4) (-2) = 3#4 | |
| #guard sdiv (-7#4) (-2) = 3#4 | |
| #guard srem 3#4 2 = 1 | |
| #guard srem (-4#4) 3 = -1 | |
| #guard srem ( 4#4) (-3) = 1 | |
| #guard srem (-4#4) (-3) = -1 | |
| #guard smod 3#4 2 = 1 | |
| #guard smod (-4#4) 3 = 2 | |
| #guard smod ( 4#4) (-3) = -2 | |
| #guard smod (-4#4) (-3) = -1 | |
| -- ofInt/toInt | |
| #guard .ofInt 3 (-1) = 0b111#3 | |
| #guard .ofInt 3 0 = 0b000#3 | |
| #guard .ofInt 3 4 = 0b100#3 | |
| #guard .ofInt 3 (-2) = 0b110#3 | |
| #guard .ofInt 3 (-4) = 0b100#3 | |
| #guard (0x0#4).toInt = 0 | |
| #guard (0x7#4).toInt = 7 | |
| #guard (0x8#4).toInt = -8 | |
| #guard (0xe#4).toInt = -2 | |
| -- Bitwise operations | |
| #guard ~~~0b1010#4 = 0b0101#4 | |
| #guard 0b1010#4 &&& 0b0110#4 = 0b0010#4 | |
| #guard 0b1010#4 ||| 0b0110#4 = 0b1110#4 | |
| #guard 0b1010#4 ^^^ 0b0110#4 = 0b1100#4 | |
| -- shift operations | |
| #guard 0b0011#4 <<< 3 = 0b1000 | |
| #guard 0b1011#4 >>> 1 = 0b0101 | |
| #guard sshiftRight 0b1001#4 1 = 0b1100#4 | |
| #guard rotateLeft 0b0011#4 3 = 0b1001 | |
| #guard rotateRight 0b0010#4 2 = 0b1000 | |
| #guard 0xab#8 ++ 0xcd#8 = 0xabcd#16 | |
| -- get/extract | |
| #guard !getMsbD 0b0101#4 0 | |
| #guard getMsbD 0b0101#4 1 | |
| #guard !getMsbD 0b0101#4 2 | |
| #guard getMsbD 0b0101#4 3 | |
| #guard !getMsbD 0b1111#4 4 | |
| #guard getLsbD 0b0101#4 0 | |
| #guard !getLsbD 0b0101#4 1 | |
| #guard getLsbD 0b0101#4 2 | |
| #guard !getLsbD 0b0101#4 3 | |
| #guard !getLsbD 0b1111#4 4 | |
| #guard extractLsb 3 0 0x1234#16 = 4 | |
| #guard extractLsb 7 4 0x1234#16 = 3 | |
| #guard extractLsb' 0 4 0x1234#16 = 0x4#4 | |
| /-- | |
| This tests the match compiler with bitvector literals to ensure | |
| it can successfully generate a pattern for a bitvector literals. | |
| This fixes a regression introduced in PR #366. | |
| -/ | |
| def testMatch8 (i : BitVec 32) := | |
| let op1 := i.extractLsb 28 25 | |
| match op1 with | |
| | 0b1000#4 => some 0 | |
| | _ => none | |
| -- Pretty-printing | |
| #guard toString 5#12 = "0x005#12" | |
| #guard toString 5#13 = "0x0005#13" | |
| #guard toString 5#12 = "0x005#12" | |
| #guard toString 5#13 = "0x0005#13" | |
| -- Simp | |
| example (n w : Nat) (p : n < 2^w) : { toFin := { val := n, isLt := p } : BitVec w} = .ofNat w n := by | |
| simp only [ofFin_eq_ofNat] | |
| -- Decidable quantifiers | |
| example : ∀ v : BitVec 2, (v[1] && v[0]) = (v[0] && v[1]) := by decide | |
| -- `bv_decide` doesn't yet do existentials: | |
| example : ∃ x y : BitVec 5, x ^^^ y = allOnes 5 := by decide |