{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DeriveLift #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE MultiWayIf #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators #-}
module Data.BitVector.Sized.Internal where
import Data.BitVector.Sized.Panic (panic)
import qualified Data.Bits as B
import qualified Data.Bits.Bitwise as B
import qualified Data.ByteString as BS
import qualified Numeric as N
import qualified Data.Parameterized.NatRepr as P
import qualified Prelude
import Control.DeepSeq (NFData)
import Data.Char (intToDigit)
import Data.List (genericLength)
import Data.Int (Int8, Int16, Int32, Int64)
import Data.Kind (Type)
import Data.Maybe (fromJust)
import Data.Word (Word8, Word16, Word32, Word64)
import Data.Parameterized ( NatRepr
, mkNatRepr
, natValue
, intValue
, addNat
, ShowF
, EqF(..)
, Hashable(..)
, Some(..)
, Pair(..)
)
import GHC.Generics (Generic)
import GHC.TypeLits (Nat, type(+), type(<=))
import Language.Haskell.TH.Lift (Lift)
import Numeric.Natural (Natural)
import Prelude hiding (abs, or, and, negate, concat, signum)
import System.Random.Stateful
checkNatRepr :: NatRepr w -> a -> a
checkNatRepr :: forall (w :: Nat) a. NatRepr w -> a -> a
checkNatRepr = forall a. Nat -> a -> a
checkNatural forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (n :: Nat). NatRepr n -> Nat
natValue
checkNatural :: Natural -> a -> a
checkNatural :: forall a. Nat -> a -> a
checkNatural Nat
n a
a = if Nat
n forall a. Ord a => a -> a -> Bool
> (forall a b. (Integral a, Num b) => a -> b
fromIntegral (forall a. Bounded a => a
maxBound :: Int) :: Natural)
then forall a. String -> [String] -> a
panic String
"Data.BitVector.Sized.Internal.checkNatural"
[forall a. Show a => a -> String
show Nat
n forall a. [a] -> [a] -> [a]
++ String
" not representable as Int"]
else a
a
fromNatural :: Natural -> Int
fromNatural :: Nat -> Int
fromNatural = forall a b. (Integral a, Num b) => a -> b
fromIntegral
newtype BV (w :: Nat) :: Type where
BV :: Integer -> BV w
deriving ( forall (w :: Nat) x. Rep (BV w) x -> BV w
forall (w :: Nat) x. BV w -> Rep (BV w) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall (w :: Nat) x. Rep (BV w) x -> BV w
$cfrom :: forall (w :: Nat) x. BV w -> Rep (BV w) x
Generic
, forall (w :: Nat). BV w -> ()
forall a. (a -> ()) -> NFData a
rnf :: BV w -> ()
$crnf :: forall (w :: Nat). BV w -> ()
NFData
, Int -> BV w -> ShowS
forall (w :: Nat). Int -> BV w -> ShowS
forall (w :: Nat). [BV w] -> ShowS
forall (w :: Nat). BV w -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [BV w] -> ShowS
$cshowList :: forall (w :: Nat). [BV w] -> ShowS
show :: BV w -> String
$cshow :: forall (w :: Nat). BV w -> String
showsPrec :: Int -> BV w -> ShowS
$cshowsPrec :: forall (w :: Nat). Int -> BV w -> ShowS
Show
, ReadPrec [BV w]
ReadPrec (BV w)
ReadS [BV w]
forall (w :: Nat). ReadPrec [BV w]
forall (w :: Nat). ReadPrec (BV w)
forall (w :: Nat). Int -> ReadS (BV w)
forall (w :: Nat). ReadS [BV w]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [BV w]
$creadListPrec :: forall (w :: Nat). ReadPrec [BV w]
readPrec :: ReadPrec (BV w)
$creadPrec :: forall (w :: Nat). ReadPrec (BV w)
readList :: ReadS [BV w]
$creadList :: forall (w :: Nat). ReadS [BV w]
readsPrec :: Int -> ReadS (BV w)
$creadsPrec :: forall (w :: Nat). Int -> ReadS (BV w)
Read
, BV w -> BV w -> Bool
forall (w :: Nat). BV w -> BV w -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: BV w -> BV w -> Bool
$c/= :: forall (w :: Nat). BV w -> BV w -> Bool
== :: BV w -> BV w -> Bool
$c== :: forall (w :: Nat). BV w -> BV w -> Bool
Eq
, BV w -> BV w -> Bool
BV w -> BV w -> Ordering
BV w -> BV w -> BV w
forall (w :: Nat). Eq (BV w)
forall (w :: Nat). BV w -> BV w -> Bool
forall (w :: Nat). BV w -> BV w -> Ordering
forall (w :: Nat). BV w -> BV w -> BV w
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: BV w -> BV w -> BV w
$cmin :: forall (w :: Nat). BV w -> BV w -> BV w
max :: BV w -> BV w -> BV w
$cmax :: forall (w :: Nat). BV w -> BV w -> BV w
>= :: BV w -> BV w -> Bool
$c>= :: forall (w :: Nat). BV w -> BV w -> Bool
> :: BV w -> BV w -> Bool
$c> :: forall (w :: Nat). BV w -> BV w -> Bool
<= :: BV w -> BV w -> Bool
$c<= :: forall (w :: Nat). BV w -> BV w -> Bool
< :: BV w -> BV w -> Bool
$c< :: forall (w :: Nat). BV w -> BV w -> Bool
compare :: BV w -> BV w -> Ordering
$ccompare :: forall (w :: Nat). BV w -> BV w -> Ordering
Ord
, forall (w :: Nat) (m :: * -> *). Quote m => BV w -> m Exp
forall (w :: Nat) (m :: * -> *). Quote m => BV w -> Code m (BV w)
forall t.
(forall (m :: * -> *). Quote m => t -> m Exp)
-> (forall (m :: * -> *). Quote m => t -> Code m t) -> Lift t
forall (m :: * -> *). Quote m => BV w -> m Exp
forall (m :: * -> *). Quote m => BV w -> Code m (BV w)
liftTyped :: forall (m :: * -> *). Quote m => BV w -> Code m (BV w)
$cliftTyped :: forall (w :: Nat) (m :: * -> *). Quote m => BV w -> Code m (BV w)
lift :: forall (m :: * -> *). Quote m => BV w -> m Exp
$clift :: forall (w :: Nat) (m :: * -> *). Quote m => BV w -> m Exp
Lift)
instance ShowF BV
instance EqF BV where
BV Integer
bv eqF :: forall (w :: Nat). BV w -> BV w -> Bool
`eqF` BV Integer
bv' = Integer
bv forall a. Eq a => a -> a -> Bool
== Integer
bv'
instance Hashable (BV w) where
hashWithSalt :: Int -> BV w -> Int
hashWithSalt Int
salt (BV Integer
i) = forall a. Hashable a => Int -> a -> Int
hashWithSalt Int
salt Integer
i
mkBV' :: NatRepr w -> Integer -> BV w
mkBV' :: forall (w :: Nat). NatRepr w -> Integer -> BV w
mkBV' NatRepr w
w Integer
x = forall (w :: Nat). Integer -> BV w
BV (forall (w :: Nat). NatRepr w -> Integer -> Integer
P.toUnsigned NatRepr w
w Integer
x)
mkBV :: NatRepr w
-> Integer
-> BV w
mkBV :: forall (w :: Nat). NatRepr w -> Integer -> BV w
mkBV NatRepr w
w Integer
x = forall (w :: Nat) a. NatRepr w -> a -> a
checkNatRepr NatRepr w
w forall a b. (a -> b) -> a -> b
$ forall (w :: Nat). NatRepr w -> Integer -> BV w
mkBV' NatRepr w
w Integer
x
checkUnsigned :: NatRepr w
-> Integer
-> Maybe Integer
checkUnsigned :: forall (w :: Nat). NatRepr w -> Integer -> Maybe Integer
checkUnsigned NatRepr w
w Integer
i = if Integer
i forall a. Ord a => a -> a -> Bool
< Integer
0 Bool -> Bool -> Bool
|| Integer
i forall a. Ord a => a -> a -> Bool
> forall (w :: Nat). NatRepr w -> Integer
P.maxUnsigned NatRepr w
w
then forall a. Maybe a
Nothing
else forall a. a -> Maybe a
Just Integer
i
mkBVUnsigned :: NatRepr w
-> Integer
-> Maybe (BV w)
mkBVUnsigned :: forall (w :: Nat). NatRepr w -> Integer -> Maybe (BV w)
mkBVUnsigned NatRepr w
w Integer
x = forall (w :: Nat) a. NatRepr w -> a -> a
checkNatRepr NatRepr w
w forall a b. (a -> b) -> a -> b
$ forall (w :: Nat). Integer -> BV w
BV forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (w :: Nat). NatRepr w -> Integer -> Maybe Integer
checkUnsigned NatRepr w
w Integer
x
signedToUnsigned :: 1 <= w => NatRepr w
-> Integer
-> Maybe Integer
signedToUnsigned :: forall (w :: Nat).
(1 <= w) =>
NatRepr w -> Integer -> Maybe Integer
signedToUnsigned NatRepr w
w Integer
i = if Integer
i forall a. Ord a => a -> a -> Bool
< forall (w :: Nat). (1 <= w) => NatRepr w -> Integer
P.minSigned NatRepr w
w Bool -> Bool -> Bool
|| Integer
i forall a. Ord a => a -> a -> Bool
> forall (w :: Nat). (1 <= w) => NatRepr w -> Integer
P.maxSigned NatRepr w
w
then forall a. Maybe a
Nothing
else forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ if Integer
i forall a. Ord a => a -> a -> Bool
< Integer
0 then Integer
i forall a. Num a => a -> a -> a
+ forall (w :: Nat). NatRepr w -> Integer
P.maxUnsigned NatRepr w
w forall a. Num a => a -> a -> a
+ Integer
1 else Integer
i
mkBVSigned :: 1 <= w => NatRepr w
-> Integer
-> Maybe (BV w)
mkBVSigned :: forall (w :: Nat). (1 <= w) => NatRepr w -> Integer -> Maybe (BV w)
mkBVSigned NatRepr w
w Integer
x = forall (w :: Nat) a. NatRepr w -> a -> a
checkNatRepr NatRepr w
w forall a b. (a -> b) -> a -> b
$ forall (w :: Nat). Integer -> BV w
BV forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (w :: Nat).
(1 <= w) =>
NatRepr w -> Integer -> Maybe Integer
signedToUnsigned NatRepr w
w Integer
x
zero :: NatRepr w -> BV w
zero :: forall (w :: Nat). NatRepr w -> BV w
zero NatRepr w
w = forall (w :: Nat) a. NatRepr w -> a -> a
checkNatRepr NatRepr w
w forall a b. (a -> b) -> a -> b
$ forall (w :: Nat). Integer -> BV w
BV Integer
0
one :: 1 <= w => NatRepr w -> BV w
one :: forall (w :: Nat). (1 <= w) => NatRepr w -> BV w
one NatRepr w
w = forall (w :: Nat) a. NatRepr w -> a -> a
checkNatRepr NatRepr w
w forall a b. (a -> b) -> a -> b
$ forall (w :: Nat). Integer -> BV w
BV Integer
1
width :: NatRepr w -> BV w
width :: forall (w :: Nat). NatRepr w -> BV w
width NatRepr w
w = forall (w :: Nat) a. NatRepr w -> a -> a
checkNatRepr NatRepr w
w forall a b. (a -> b) -> a -> b
$ forall (w :: Nat). Integer -> BV w
BV (forall (w :: Nat). NatRepr w -> Integer
intValue NatRepr w
w)
minUnsigned :: NatRepr w -> BV w
minUnsigned :: forall (w :: Nat). NatRepr w -> BV w
minUnsigned NatRepr w
w = forall (w :: Nat) a. NatRepr w -> a -> a
checkNatRepr NatRepr w
w forall a b. (a -> b) -> a -> b
$ forall (w :: Nat). Integer -> BV w
BV Integer
0
maxUnsigned :: NatRepr w -> BV w
maxUnsigned :: forall (w :: Nat). NatRepr w -> BV w
maxUnsigned NatRepr w
w = forall (w :: Nat) a. NatRepr w -> a -> a
checkNatRepr NatRepr w
w forall a b. (a -> b) -> a -> b
$ forall (w :: Nat). Integer -> BV w
BV (forall (w :: Nat). NatRepr w -> Integer
P.maxUnsigned NatRepr w
w)
minSigned :: 1 <= w => NatRepr w -> BV w
minSigned :: forall (w :: Nat). (1 <= w) => NatRepr w -> BV w
minSigned NatRepr w
w = forall (w :: Nat). NatRepr w -> Integer -> BV w
mkBV NatRepr w
w (forall (w :: Nat). (1 <= w) => NatRepr w -> Integer
P.minSigned NatRepr w
w)
maxSigned :: 1 <= w => NatRepr w -> BV w
maxSigned :: forall (w :: Nat). (1 <= w) => NatRepr w -> BV w
maxSigned NatRepr w
w = forall (w :: Nat) a. NatRepr w -> a -> a
checkNatRepr NatRepr w
w forall a b. (a -> b) -> a -> b
$ forall (w :: Nat). Integer -> BV w
BV (forall (w :: Nat). (1 <= w) => NatRepr w -> Integer
P.maxSigned NatRepr w
w)
unsignedClamp :: NatRepr w -> Integer -> BV w
unsignedClamp :: forall (w :: Nat). NatRepr w -> Integer -> BV w
unsignedClamp NatRepr w
w Integer
x = forall (w :: Nat) a. NatRepr w -> a -> a
checkNatRepr NatRepr w
w forall a b. (a -> b) -> a -> b
$
if | Integer
x forall a. Ord a => a -> a -> Bool
< forall (w :: Nat). NatRepr w -> Integer
P.minUnsigned NatRepr w
w -> forall (w :: Nat). Integer -> BV w
BV (forall (w :: Nat). NatRepr w -> Integer
P.minUnsigned NatRepr w
w)
| Integer
x forall a. Ord a => a -> a -> Bool
> forall (w :: Nat). NatRepr w -> Integer
P.maxUnsigned NatRepr w
w -> forall (w :: Nat). Integer -> BV w
BV (forall (w :: Nat). NatRepr w -> Integer
P.maxUnsigned NatRepr w
w)
| Bool
otherwise -> forall (w :: Nat). Integer -> BV w
BV Integer
x
signedClamp :: 1 <= w => NatRepr w -> Integer -> BV w
signedClamp :: forall (w :: Nat). (1 <= w) => NatRepr w -> Integer -> BV w
signedClamp NatRepr w
w Integer
x = forall (w :: Nat) a. NatRepr w -> a -> a
checkNatRepr NatRepr w
w forall a b. (a -> b) -> a -> b
$
if | Integer
x forall a. Ord a => a -> a -> Bool
< forall (w :: Nat). (1 <= w) => NatRepr w -> Integer
P.minSigned NatRepr w
w -> forall (w :: Nat). NatRepr w -> Integer -> BV w
mkBV' NatRepr w
w (forall (w :: Nat). (1 <= w) => NatRepr w -> Integer
P.minSigned NatRepr w
w)
| Integer
x forall a. Ord a => a -> a -> Bool
> forall (w :: Nat). (1 <= w) => NatRepr w -> Integer
P.maxSigned NatRepr w
w -> forall (w :: Nat). Integer -> BV w
BV (forall (w :: Nat). (1 <= w) => NatRepr w -> Integer
P.maxSigned NatRepr w
w)
| Bool
otherwise -> forall (w :: Nat). NatRepr w -> Integer -> BV w
mkBV' NatRepr w
w Integer
x
bool :: Bool -> BV 1
bool :: Bool -> BV 1
bool Bool
True = forall (w :: Nat). Integer -> BV w
BV Integer
1
bool Bool
False = forall (w :: Nat). Integer -> BV w
BV Integer
0
word8 :: Word8 -> BV 8
word8 :: Word8 -> BV 8
word8 = forall (w :: Nat). Integer -> BV w
BV forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Integral a => a -> Integer
toInteger
word16 :: Word16 -> BV 16
word16 :: Word16 -> BV 16
word16 = forall (w :: Nat). Integer -> BV w
BV forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Integral a => a -> Integer
toInteger
word32 :: Word32 -> BV 32
word32 :: Word32 -> BV 32
word32 = forall (w :: Nat). Integer -> BV w
BV forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Integral a => a -> Integer
toInteger
word64 :: Word64 -> BV 64
word64 :: Word64 -> BV 64
word64 = forall (w :: Nat). Integer -> BV w
BV forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Integral a => a -> Integer
toInteger
int8 :: Int8 -> BV 8
int8 :: Int8 -> BV 8
int8 = Word8 -> BV 8
word8 forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a b. (Integral a, Num b) => a -> b
fromIntegral :: Int8 -> Word8)
int16 :: Int16 -> BV 16
int16 :: Int16 -> BV 16
int16 = Word16 -> BV 16
word16 forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a b. (Integral a, Num b) => a -> b
fromIntegral :: Int16 -> Word16)
int32 :: Int32 -> BV 32
int32 :: Int32 -> BV 32
int32 = Word32 -> BV 32
word32 forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a b. (Integral a, Num b) => a -> b
fromIntegral :: Int32 -> Word32)
int64 :: Int64 -> BV 64
int64 :: Int64 -> BV 64
int64 = Word64 -> BV 64
word64 forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a b. (Integral a, Num b) => a -> b
fromIntegral :: Int64 -> Word64)
bitsBE :: [Bool] -> Pair NatRepr BV
bitsBE :: [Bool] -> Pair NatRepr BV
bitsBE [Bool]
bs = case Nat -> Some NatRepr
mkNatRepr (forall a. Num a => Integer -> a
fromInteger (forall i a. Num i => [a] -> i
genericLength [Bool]
bs)) of
Some NatRepr x
w -> forall (w :: Nat) a. NatRepr w -> a -> a
checkNatRepr NatRepr x
w forall a b. (a -> b) -> a -> b
$ forall {k} (a :: k -> *) (tp :: k) (b :: k -> *).
a tp -> b tp -> Pair a b
Pair NatRepr x
w (forall (w :: Nat). Integer -> BV w
BV (forall b. Bits b => [Bool] -> b
B.fromListBE [Bool]
bs))
bitsLE :: [Bool] -> Pair NatRepr BV
bitsLE :: [Bool] -> Pair NatRepr BV
bitsLE [Bool]
bs = case Nat -> Some NatRepr
mkNatRepr (forall a. Num a => Integer -> a
fromInteger (forall i a. Num i => [a] -> i
genericLength [Bool]
bs)) of
Some NatRepr x
w -> forall (w :: Nat) a. NatRepr w -> a -> a
checkNatRepr NatRepr x
w forall a b. (a -> b) -> a -> b
$ forall {k} (a :: k -> *) (tp :: k) (b :: k -> *).
a tp -> b tp -> Pair a b
Pair NatRepr x
w (forall (w :: Nat). Integer -> BV w
BV (forall b. Bits b => [Bool] -> b
B.fromListLE [Bool]
bs))
bytestringToIntegerBE :: BS.ByteString -> Integer
bytestringToIntegerBE :: ByteString -> Integer
bytestringToIntegerBE ByteString
bs
| Int
l forall a. Eq a => a -> a -> Bool
== Int
0 = Integer
0
| Int
l forall a. Eq a => a -> a -> Bool
== Int
1 = forall a. Integral a => a -> Integer
toInteger (HasCallStack => ByteString -> Word8
BS.head ByteString
bs)
| Bool
otherwise = Integer
x1 forall a. Bits a => a -> Int -> a
`B.shiftL` (Int
l2 forall a. Num a => a -> a -> a
* Int
8) forall a. Bits a => a -> a -> a
B..|. Integer
x2
where
l :: Int
l = ByteString -> Int
BS.length ByteString
bs
l1 :: Int
l1 = Int
l forall a. Integral a => a -> a -> a
`div` Int
2
l2 :: Int
l2 = Int
l forall a. Num a => a -> a -> a
- Int
l1
(ByteString
bs1, ByteString
bs2) = Int -> ByteString -> (ByteString, ByteString)
BS.splitAt Int
l1 ByteString
bs
x1 :: Integer
x1 = ByteString -> Integer
bytestringToIntegerBE ByteString
bs1
x2 :: Integer
x2 = ByteString -> Integer
bytestringToIntegerBE ByteString
bs2
bytestringToIntegerLE :: BS.ByteString -> Integer
bytestringToIntegerLE :: ByteString -> Integer
bytestringToIntegerLE ByteString
bs
| Int
l forall a. Eq a => a -> a -> Bool
== Int
0 = Integer
0
| Int
l forall a. Eq a => a -> a -> Bool
== Int
1 = forall a. Integral a => a -> Integer
toInteger (HasCallStack => ByteString -> Word8
BS.head ByteString
bs)
| Bool
otherwise = Integer
x2 forall a. Bits a => a -> Int -> a
`B.shiftL` (Int
l1 forall a. Num a => a -> a -> a
* Int
8) forall a. Bits a => a -> a -> a
B..|. Integer
x1
where
l :: Int
l = ByteString -> Int
BS.length ByteString
bs
l1 :: Int
l1 = Int
l forall a. Integral a => a -> a -> a
`div` Int
2
(ByteString
bs1, ByteString
bs2) = Int -> ByteString -> (ByteString, ByteString)
BS.splitAt Int
l1 ByteString
bs
x1 :: Integer
x1 = ByteString -> Integer
bytestringToIntegerLE ByteString
bs1
x2 :: Integer
x2 = ByteString -> Integer
bytestringToIntegerLE ByteString
bs2
bytestringBE :: BS.ByteString -> Pair NatRepr BV
bytestringBE :: ByteString -> Pair NatRepr BV
bytestringBE ByteString
bs = case Nat -> Some NatRepr
mkNatRepr (Nat
8forall a. Num a => a -> a -> a
*forall a b. (Integral a, Num b) => a -> b
fromIntegral (ByteString -> Int
BS.length ByteString
bs)) of
Some NatRepr x
w -> forall (w :: Nat) a. NatRepr w -> a -> a
checkNatRepr NatRepr x
w forall a b. (a -> b) -> a -> b
$ forall {k} (a :: k -> *) (tp :: k) (b :: k -> *).
a tp -> b tp -> Pair a b
Pair NatRepr x
w (forall (w :: Nat). Integer -> BV w
BV (ByteString -> Integer
bytestringToIntegerBE ByteString
bs))
bytestringLE :: BS.ByteString -> Pair NatRepr BV
bytestringLE :: ByteString -> Pair NatRepr BV
bytestringLE ByteString
bs = case Nat -> Some NatRepr
mkNatRepr (Nat
8forall a. Num a => a -> a -> a
*forall a b. (Integral a, Num b) => a -> b
fromIntegral (ByteString -> Int
BS.length ByteString
bs)) of
Some NatRepr x
w -> forall (w :: Nat) a. NatRepr w -> a -> a
checkNatRepr NatRepr x
w forall a b. (a -> b) -> a -> b
$ forall {k} (a :: k -> *) (tp :: k) (b :: k -> *).
a tp -> b tp -> Pair a b
Pair NatRepr x
w (forall (w :: Nat). Integer -> BV w
BV (ByteString -> Integer
bytestringToIntegerLE ByteString
bs))
bytesBE :: [Word8] -> Pair NatRepr BV
bytesBE :: [Word8] -> Pair NatRepr BV
bytesBE = ByteString -> Pair NatRepr BV
bytestringBE forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Word8] -> ByteString
BS.pack
bytesLE :: [Word8] -> Pair NatRepr BV
bytesLE :: [Word8] -> Pair NatRepr BV
bytesLE = ByteString -> Pair NatRepr BV
bytestringLE forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Word8] -> ByteString
BS.pack
asUnsigned :: BV w -> Integer
asUnsigned :: forall (w :: Nat). BV w -> Integer
asUnsigned (BV Integer
x) = Integer
x
asSigned :: (1 <= w) => NatRepr w -> BV w -> Integer
asSigned :: forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> Integer
asSigned NatRepr w
w (BV Integer
x) =
let wInt :: Int
wInt = Nat -> Int
fromNatural (forall (n :: Nat). NatRepr n -> Nat
natValue NatRepr w
w) in
if forall a. Bits a => a -> Int -> Bool
B.testBit Integer
x (Int
wInt forall a. Num a => a -> a -> a
- Int
1)
then Integer
x forall a. Num a => a -> a -> a
- forall a. Bits a => Int -> a
B.bit Int
wInt
else Integer
x
asNatural :: BV w -> Natural
asNatural :: forall (w :: Nat). BV w -> Nat
asNatural = (forall a. Num a => Integer -> a
fromInteger :: Integer -> Natural) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (w :: Nat). BV w -> Integer
asUnsigned
asBitsBE :: NatRepr w -> BV w -> [Bool]
asBitsBE :: forall (w :: Nat). NatRepr w -> BV w -> [Bool]
asBitsBE NatRepr w
w BV w
bv = [ forall (w :: Nat). Nat -> BV w -> Bool
testBit' Nat
i BV w
bv | Nat
i <- forall a. Num a => Integer -> a
fromInteger forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Integer
wi forall a. Num a => a -> a -> a
- Integer
1, Integer
wi forall a. Num a => a -> a -> a
- Integer
2 .. Integer
0] ]
where wi :: Integer
wi = forall (w :: Nat). NatRepr w -> Integer
intValue NatRepr w
w
asBitsLE :: NatRepr w -> BV w -> [Bool]
asBitsLE :: forall (w :: Nat). NatRepr w -> BV w -> [Bool]
asBitsLE NatRepr w
w BV w
bv = [ forall (w :: Nat). Nat -> BV w -> Bool
testBit' Nat
i BV w
bv | Nat
i <- forall a. Num a => Integer -> a
fromInteger forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Integer
0 .. Integer
wi forall a. Num a => a -> a -> a
- Integer
1] ]
where wi :: Integer
wi = forall (w :: Nat). NatRepr w -> Integer
intValue NatRepr w
w
integerToBytesBE :: Natural
-> Integer
-> [Word8]
integerToBytesBE :: Nat -> Integer -> [Word8]
integerToBytesBE Nat
n Integer
x =
[ forall a b. (Integral a, Num b) => a -> b
fromIntegral (Integer
x forall a. Bits a => a -> Int -> a
`B.shiftR` (Int
8forall a. Num a => a -> a -> a
*Int
ix)) | Int
ix <- [Int
niforall a. Num a => a -> a -> a
-Int
1, Int
niforall a. Num a => a -> a -> a
-Int
2 .. Int
0] ]
where ni :: Int
ni = forall a b. (Integral a, Num b) => a -> b
fromIntegral Nat
n
integerToBytesLE :: Natural
-> Integer
-> [Word8]
integerToBytesLE :: Nat -> Integer -> [Word8]
integerToBytesLE Nat
n Integer
x =
[ forall a b. (Integral a, Num b) => a -> b
fromIntegral (Integer
x forall a. Bits a => a -> Int -> a
`B.shiftR` (Int
8forall a. Num a => a -> a -> a
*Int
ix)) | Int
ix <- [Int
0 .. Int
niforall a. Num a => a -> a -> a
-Int
1] ]
where ni :: Int
ni = forall a b. (Integral a, Num b) => a -> b
fromIntegral Nat
n
asBytesBE :: NatRepr w -> BV w -> Maybe [Word8]
asBytesBE :: forall (w :: Nat). NatRepr w -> BV w -> Maybe [Word8]
asBytesBE NatRepr w
w (BV Integer
x)
| forall (n :: Nat). NatRepr n -> Nat
natValue NatRepr w
w forall a. Integral a => a -> a -> a
`mod` Nat
8 forall a. Eq a => a -> a -> Bool
== Nat
0 = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ Nat -> Integer -> [Word8]
integerToBytesBE (forall (n :: Nat). NatRepr n -> Nat
natValue NatRepr w
w forall a. Integral a => a -> a -> a
`div` Nat
8) Integer
x
| Bool
otherwise = forall a. Maybe a
Nothing
asBytesLE :: NatRepr w -> BV w -> Maybe [Word8]
asBytesLE :: forall (w :: Nat). NatRepr w -> BV w -> Maybe [Word8]
asBytesLE NatRepr w
w (BV Integer
x)
| forall (n :: Nat). NatRepr n -> Nat
natValue NatRepr w
w forall a. Integral a => a -> a -> a
`mod` Nat
8 forall a. Eq a => a -> a -> Bool
== Nat
0 = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ Nat -> Integer -> [Word8]
integerToBytesLE (forall (n :: Nat). NatRepr n -> Nat
natValue NatRepr w
w forall a. Integral a => a -> a -> a
`div` Nat
8) Integer
x
| Bool
otherwise = forall a. Maybe a
Nothing
asBytestringBE :: NatRepr w -> BV w -> Maybe BS.ByteString
asBytestringBE :: forall (w :: Nat). NatRepr w -> BV w -> Maybe ByteString
asBytestringBE NatRepr w
w BV w
bv = [Word8] -> ByteString
BS.pack forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (w :: Nat). NatRepr w -> BV w -> Maybe [Word8]
asBytesBE NatRepr w
w BV w
bv
asBytestringLE :: NatRepr w -> BV w -> Maybe BS.ByteString
asBytestringLE :: forall (w :: Nat). NatRepr w -> BV w -> Maybe ByteString
asBytestringLE NatRepr w
w BV w
bv = [Word8] -> ByteString
BS.pack forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (w :: Nat). NatRepr w -> BV w -> Maybe [Word8]
asBytesLE NatRepr w
w BV w
bv
and :: BV w -> BV w -> BV w
and :: forall (w :: Nat). BV w -> BV w -> BV w
and (BV Integer
x) (BV Integer
y) = forall (w :: Nat). Integer -> BV w
BV (Integer
x forall a. Bits a => a -> a -> a
B..&. Integer
y)
or :: BV w -> BV w -> BV w
or :: forall (w :: Nat). BV w -> BV w -> BV w
or (BV Integer
x) (BV Integer
y) = forall (w :: Nat). Integer -> BV w
BV (Integer
x forall a. Bits a => a -> a -> a
B..|. Integer
y)
xor :: BV w -> BV w -> BV w
xor :: forall (w :: Nat). BV w -> BV w -> BV w
xor (BV Integer
x) (BV Integer
y) = forall (w :: Nat). Integer -> BV w
BV (Integer
x forall a. Bits a => a -> a -> a
`B.xor` Integer
y)
complement :: NatRepr w -> BV w -> BV w
complement :: forall (w :: Nat). NatRepr w -> BV w -> BV w
complement NatRepr w
w (BV Integer
x) = forall (w :: Nat). NatRepr w -> Integer -> BV w
mkBV' NatRepr w
w (forall a. Bits a => a -> a
B.complement Integer
x)
shiftAmount :: NatRepr w -> Natural -> Int
shiftAmount :: forall (w :: Nat). NatRepr w -> Nat -> Int
shiftAmount NatRepr w
w Nat
shf = Nat -> Int
fromNatural (forall a. Ord a => a -> a -> a
min (forall (n :: Nat). NatRepr n -> Nat
natValue NatRepr w
w) Nat
shf)
shl :: NatRepr w -> BV w -> Natural -> BV w
shl :: forall (w :: Nat). NatRepr w -> BV w -> Nat -> BV w
shl NatRepr w
w (BV Integer
x) Nat
shf = forall (w :: Nat). NatRepr w -> Integer -> BV w
mkBV' NatRepr w
w (Integer
x forall a. Bits a => a -> Int -> a
`B.shiftL` forall (w :: Nat). NatRepr w -> Nat -> Int
shiftAmount NatRepr w
w Nat
shf)
ashr :: (1 <= w) => NatRepr w -> BV w -> Natural -> BV w
ashr :: forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> Nat -> BV w
ashr NatRepr w
w BV w
bv Nat
shf = forall (w :: Nat). NatRepr w -> Integer -> BV w
mkBV' NatRepr w
w (forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> Integer
asSigned NatRepr w
w BV w
bv forall a. Bits a => a -> Int -> a
`B.shiftR` forall (w :: Nat). NatRepr w -> Nat -> Int
shiftAmount NatRepr w
w Nat
shf)
lshr :: NatRepr w -> BV w -> Natural -> BV w
lshr :: forall (w :: Nat). NatRepr w -> BV w -> Nat -> BV w
lshr NatRepr w
w (BV Integer
x) Nat
shf =
forall (w :: Nat). Integer -> BV w
BV (Integer
x forall a. Bits a => a -> Int -> a
`B.shiftR` forall (w :: Nat). NatRepr w -> Nat -> Int
shiftAmount NatRepr w
w Nat
shf)
rotateL :: NatRepr w -> BV w -> Natural -> BV w
rotateL :: forall (w :: Nat). NatRepr w -> BV w -> Nat -> BV w
rotateL NatRepr w
w BV w
bv Nat
rot' = BV w
leftChunk forall (w :: Nat). BV w -> BV w -> BV w
`or` BV w
rightChunk
where rot :: Nat
rot = if Nat
wNatural forall a. Eq a => a -> a -> Bool
== Nat
0 then Nat
0 else Nat
rot' forall a. Integral a => a -> a -> a
`mod` Nat
wNatural
leftChunk :: BV w
leftChunk = forall (w :: Nat). NatRepr w -> BV w -> Nat -> BV w
shl NatRepr w
w BV w
bv Nat
rot
rightChunk :: BV w
rightChunk = forall (w :: Nat). NatRepr w -> BV w -> Nat -> BV w
lshr NatRepr w
w BV w
bv (Nat
wNatural forall a. Num a => a -> a -> a
- Nat
rot)
wNatural :: Nat
wNatural = forall (n :: Nat). NatRepr n -> Nat
natValue NatRepr w
w
rotateR :: NatRepr w -> BV w -> Natural -> BV w
rotateR :: forall (w :: Nat). NatRepr w -> BV w -> Nat -> BV w
rotateR NatRepr w
w BV w
bv Nat
rot' = BV w
leftChunk forall (w :: Nat). BV w -> BV w -> BV w
`or` BV w
rightChunk
where rot :: Nat
rot = if Nat
wNatural forall a. Eq a => a -> a -> Bool
== Nat
0 then Nat
0 else Nat
rot' forall a. Integral a => a -> a -> a
`mod` Nat
wNatural
rightChunk :: BV w
rightChunk = forall (w :: Nat). NatRepr w -> BV w -> Nat -> BV w
lshr NatRepr w
w BV w
bv Nat
rot
leftChunk :: BV w
leftChunk = forall (w :: Nat). NatRepr w -> BV w -> Nat -> BV w
shl NatRepr w
w BV w
bv (Nat
wNatural forall a. Num a => a -> a -> a
- Nat
rot)
wNatural :: Nat
wNatural = forall (n :: Nat). NatRepr n -> Nat
natValue NatRepr w
w
bit :: ix+1 <= w
=> NatRepr w
-> NatRepr ix
-> BV w
bit :: forall (ix :: Nat) (w :: Nat).
((ix + 1) <= w) =>
NatRepr w -> NatRepr ix -> BV w
bit NatRepr w
w NatRepr ix
ix =
forall (w :: Nat) a. NatRepr w -> a -> a
checkNatRepr NatRepr w
w forall a b. (a -> b) -> a -> b
$
forall (w :: Nat). Integer -> BV w
BV (forall a. Bits a => Int -> a
B.bit (Nat -> Int
fromNatural (forall (n :: Nat). NatRepr n -> Nat
natValue NatRepr ix
ix)))
bit' :: NatRepr w
-> Natural
-> BV w
bit' :: forall (w :: Nat). NatRepr w -> Nat -> BV w
bit' NatRepr w
w Nat
ix
| Nat
ix forall a. Ord a => a -> a -> Bool
< forall (n :: Nat). NatRepr n -> Nat
natValue NatRepr w
w = forall (w :: Nat) a. NatRepr w -> a -> a
checkNatRepr NatRepr w
w forall a b. (a -> b) -> a -> b
$ forall (w :: Nat). NatRepr w -> Integer -> BV w
mkBV' NatRepr w
w (forall a. Bits a => Int -> a
B.bit (Nat -> Int
fromNatural Nat
ix))
| Bool
otherwise = forall (w :: Nat). NatRepr w -> BV w
zero NatRepr w
w
setBit :: ix+1 <= w
=> NatRepr ix
-> BV w
-> BV w
setBit :: forall (ix :: Nat) (w :: Nat).
((ix + 1) <= w) =>
NatRepr ix -> BV w -> BV w
setBit NatRepr ix
ix BV w
bv =
forall (w :: Nat). BV w -> BV w -> BV w
or BV w
bv (forall (w :: Nat). Integer -> BV w
BV (forall a. Bits a => Int -> a
B.bit (Nat -> Int
fromNatural (forall (n :: Nat). NatRepr n -> Nat
natValue NatRepr ix
ix))))
setBit' :: NatRepr w
-> Natural
-> BV w
-> BV w
setBit' :: forall (w :: Nat). NatRepr w -> Nat -> BV w -> BV w
setBit' NatRepr w
w Nat
ix BV w
bv
| Nat
ix forall a. Ord a => a -> a -> Bool
< forall (n :: Nat). NatRepr n -> Nat
natValue NatRepr w
w = forall (w :: Nat). BV w -> BV w -> BV w
or BV w
bv (forall (w :: Nat). Integer -> BV w
BV (forall a. Bits a => Int -> a
B.bit (Nat -> Int
fromNatural Nat
ix)))
| Bool
otherwise = BV w
bv
clearBit :: ix+1 <= w
=> NatRepr w
-> NatRepr ix
-> BV w
-> BV w
clearBit :: forall (ix :: Nat) (w :: Nat).
((ix + 1) <= w) =>
NatRepr w -> NatRepr ix -> BV w -> BV w
clearBit NatRepr w
w NatRepr ix
ix BV w
bv =
forall (w :: Nat). BV w -> BV w -> BV w
and BV w
bv (forall (w :: Nat). NatRepr w -> BV w -> BV w
complement NatRepr w
w (forall (w :: Nat). Integer -> BV w
BV (forall a. Bits a => Int -> a
B.bit (Nat -> Int
fromNatural (forall (n :: Nat). NatRepr n -> Nat
natValue NatRepr ix
ix)))))
clearBit' :: NatRepr w
-> Natural
-> BV w
-> BV w
clearBit' :: forall (w :: Nat). NatRepr w -> Nat -> BV w -> BV w
clearBit' NatRepr w
w Nat
ix BV w
bv
| Nat
ix forall a. Ord a => a -> a -> Bool
< forall (n :: Nat). NatRepr n -> Nat
natValue NatRepr w
w = forall (w :: Nat). BV w -> BV w -> BV w
and BV w
bv (forall (w :: Nat). NatRepr w -> BV w -> BV w
complement NatRepr w
w (forall (w :: Nat). Integer -> BV w
BV (forall a. Bits a => Int -> a
B.bit (Nat -> Int
fromNatural Nat
ix))))
| Bool
otherwise = BV w
bv
complementBit :: ix+1 <= w
=> NatRepr ix
-> BV w
-> BV w
complementBit :: forall (ix :: Nat) (w :: Nat).
((ix + 1) <= w) =>
NatRepr ix -> BV w -> BV w
complementBit NatRepr ix
ix BV w
bv =
forall (w :: Nat). BV w -> BV w -> BV w
xor BV w
bv (forall (w :: Nat). Integer -> BV w
BV (forall a. Bits a => Int -> a
B.bit (Nat -> Int
fromNatural (forall (n :: Nat). NatRepr n -> Nat
natValue NatRepr ix
ix))))
complementBit' :: NatRepr w
-> Natural
-> BV w
-> BV w
complementBit' :: forall (w :: Nat). NatRepr w -> Nat -> BV w -> BV w
complementBit' NatRepr w
w Nat
ix BV w
bv
| Nat
ix forall a. Ord a => a -> a -> Bool
< forall (n :: Nat). NatRepr n -> Nat
natValue NatRepr w
w = forall (w :: Nat). BV w -> BV w -> BV w
xor BV w
bv (forall (w :: Nat). Integer -> BV w
BV (forall a. Bits a => Int -> a
B.bit (Nat -> Int
fromNatural Nat
ix)))
| Bool
otherwise = BV w
bv
testBit :: ix+1 <= w => NatRepr ix -> BV w -> Bool
testBit :: forall (ix :: Nat) (w :: Nat).
((ix + 1) <= w) =>
NatRepr ix -> BV w -> Bool
testBit NatRepr ix
ix (BV Integer
x) = forall a. Bits a => a -> Int -> Bool
B.testBit Integer
x (Nat -> Int
fromNatural (forall (n :: Nat). NatRepr n -> Nat
natValue NatRepr ix
ix))
testBit' :: Natural -> BV w -> Bool
testBit' :: forall (w :: Nat). Nat -> BV w -> Bool
testBit' Nat
ix (BV Integer
x)
| Nat
ix forall a. Ord a => a -> a -> Bool
> forall a b. (Integral a, Num b) => a -> b
fromIntegral (forall a. Bounded a => a
maxBound :: Int) = Bool
False
| Bool
otherwise = forall a. Bits a => a -> Int -> Bool
B.testBit Integer
x (Nat -> Int
fromNatural Nat
ix)
popCount :: BV w -> BV w
popCount :: forall (w :: Nat). BV w -> BV w
popCount (BV Integer
x) = forall (w :: Nat). Integer -> BV w
BV (forall a. Integral a => a -> Integer
toInteger (forall a. Bits a => a -> Int
B.popCount Integer
x))
ctz :: NatRepr w -> BV w -> BV w
ctz :: forall (w :: Nat). NatRepr w -> BV w -> BV w
ctz NatRepr w
w (BV Integer
x) = forall (w :: Nat). Integer -> BV w
BV (Integer -> Integer
go Integer
0)
where go :: Integer -> Integer
go !Integer
i | Integer
i forall a. Ord a => a -> a -> Bool
< forall (w :: Nat). NatRepr w -> Integer
intValue NatRepr w
w Bool -> Bool -> Bool
&&
Bool -> Bool
not (forall a. Bits a => a -> Int -> Bool
B.testBit Integer
x (forall a. Num a => Integer -> a
fromInteger Integer
i)) = Integer -> Integer
go (Integer
iforall a. Num a => a -> a -> a
+Integer
1)
| Bool
otherwise = Integer
i
clz :: NatRepr w -> BV w -> BV w
clz :: forall (w :: Nat). NatRepr w -> BV w -> BV w
clz NatRepr w
w (BV Integer
x) = forall (w :: Nat). Integer -> BV w
BV (Integer -> Integer
go Integer
0)
where go :: Integer -> Integer
go !Integer
i | Integer
i forall a. Ord a => a -> a -> Bool
< forall (w :: Nat). NatRepr w -> Integer
intValue NatRepr w
w Bool -> Bool -> Bool
&&
Bool -> Bool
not (forall a. Bits a => a -> Int -> Bool
B.testBit Integer
x (forall a. Num a => Integer -> a
fromInteger (forall (w :: Nat). NatRepr w -> Integer
intValue NatRepr w
w forall a. Num a => a -> a -> a
- Integer
i forall a. Num a => a -> a -> a
- Integer
1))) =
Integer -> Integer
go (Integer
iforall a. Num a => a -> a -> a
+Integer
1)
| Bool
otherwise = Integer
i
truncBits :: Natural -> BV w -> BV w
truncBits :: forall (w :: Nat). Nat -> BV w -> BV w
truncBits Nat
b (BV Integer
x) = forall a. Nat -> a -> a
checkNatural Nat
b forall a b. (a -> b) -> a -> b
$ forall (w :: Nat). Integer -> BV w
BV (Integer
x forall a. Bits a => a -> a -> a
B..&. (forall a. Bits a => Int -> a
B.bit (Nat -> Int
fromNatural Nat
b) forall a. Num a => a -> a -> a
- Integer
1))
add :: NatRepr w -> BV w -> BV w -> BV w
add :: forall (w :: Nat). NatRepr w -> BV w -> BV w -> BV w
add NatRepr w
w (BV Integer
x) (BV Integer
y) = forall (w :: Nat). NatRepr w -> Integer -> BV w
mkBV' NatRepr w
w (Integer
xforall a. Num a => a -> a -> a
+Integer
y)
sub :: NatRepr w -> BV w -> BV w -> BV w
sub :: forall (w :: Nat). NatRepr w -> BV w -> BV w -> BV w
sub NatRepr w
w (BV Integer
x) (BV Integer
y) = forall (w :: Nat). NatRepr w -> Integer -> BV w
mkBV' NatRepr w
w (Integer
xforall a. Num a => a -> a -> a
-Integer
y)
mul :: NatRepr w -> BV w -> BV w -> BV w
mul :: forall (w :: Nat). NatRepr w -> BV w -> BV w -> BV w
mul NatRepr w
w (BV Integer
x) (BV Integer
y) = forall (w :: Nat). NatRepr w -> Integer -> BV w
mkBV' NatRepr w
w (Integer
xforall a. Num a => a -> a -> a
*Integer
y)
uquot :: BV w -> BV w -> BV w
uquot :: forall (w :: Nat). BV w -> BV w -> BV w
uquot (BV Integer
x) (BV Integer
y) = forall (w :: Nat). Integer -> BV w
BV (Integer
x forall a. Integral a => a -> a -> a
`quot` Integer
y)
urem :: BV w -> BV w -> BV w
urem :: forall (w :: Nat). BV w -> BV w -> BV w
urem (BV Integer
x) (BV Integer
y) = forall (w :: Nat). Integer -> BV w
BV (Integer
x forall a. Integral a => a -> a -> a
`rem` Integer
y)
uquotRem :: BV w -> BV w -> (BV w, BV w)
uquotRem :: forall (w :: Nat). BV w -> BV w -> (BV w, BV w)
uquotRem BV w
bv1 BV w
bv2 = (forall (w :: Nat). BV w -> BV w -> BV w
uquot BV w
bv1 BV w
bv2, forall (w :: Nat). BV w -> BV w -> BV w
urem BV w
bv1 BV w
bv2)
squot :: (1 <= w) => NatRepr w -> BV w -> BV w -> BV w
squot :: forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> BV w -> BV w
squot NatRepr w
w BV w
bv1 BV w
bv2 = forall (w :: Nat). NatRepr w -> Integer -> BV w
mkBV' NatRepr w
w (Integer
x forall a. Integral a => a -> a -> a
`quot` Integer
y)
where x :: Integer
x = forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> Integer
asSigned NatRepr w
w BV w
bv1
y :: Integer
y = forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> Integer
asSigned NatRepr w
w BV w
bv2
srem :: (1 <= w) => NatRepr w -> BV w -> BV w -> BV w
srem :: forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> BV w -> BV w
srem NatRepr w
w BV w
bv1 BV w
bv2 = forall (w :: Nat). NatRepr w -> Integer -> BV w
mkBV' NatRepr w
w (Integer
x forall a. Integral a => a -> a -> a
`rem` Integer
y)
where x :: Integer
x = forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> Integer
asSigned NatRepr w
w BV w
bv1
y :: Integer
y = forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> Integer
asSigned NatRepr w
w BV w
bv2
squotRem :: (1 <= w) => NatRepr w -> BV w -> BV w -> (BV w, BV w)
squotRem :: forall (w :: Nat).
(1 <= w) =>
NatRepr w -> BV w -> BV w -> (BV w, BV w)
squotRem NatRepr w
w BV w
bv1 BV w
bv2 = (forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> BV w -> BV w
squot NatRepr w
w BV w
bv1 BV w
bv2, forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> BV w -> BV w
srem NatRepr w
w BV w
bv1 BV w
bv2)
sdiv :: (1 <= w) => NatRepr w -> BV w -> BV w -> BV w
sdiv :: forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> BV w -> BV w
sdiv NatRepr w
w BV w
bv1 BV w
bv2 = forall (w :: Nat). NatRepr w -> Integer -> BV w
mkBV' NatRepr w
w (Integer
x forall a. Integral a => a -> a -> a
`div` Integer
y)
where x :: Integer
x = forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> Integer
asSigned NatRepr w
w BV w
bv1
y :: Integer
y = forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> Integer
asSigned NatRepr w
w BV w
bv2
smod :: (1 <= w) => NatRepr w -> BV w -> BV w -> BV w
smod :: forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> BV w -> BV w
smod NatRepr w
w BV w
bv1 BV w
bv2 = forall (w :: Nat). NatRepr w -> Integer -> BV w
mkBV' NatRepr w
w (Integer
x forall a. Integral a => a -> a -> a
`mod` Integer
y)
where x :: Integer
x = forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> Integer
asSigned NatRepr w
w BV w
bv1
y :: Integer
y = forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> Integer
asSigned NatRepr w
w BV w
bv2
sdivMod :: (1 <= w) => NatRepr w -> BV w -> BV w -> (BV w, BV w)
sdivMod :: forall (w :: Nat).
(1 <= w) =>
NatRepr w -> BV w -> BV w -> (BV w, BV w)
sdivMod NatRepr w
w BV w
bv1 BV w
bv2 = (forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> BV w -> BV w
sdiv NatRepr w
w BV w
bv1 BV w
bv2, forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> BV w -> BV w
smod NatRepr w
w BV w
bv1 BV w
bv2)
abs :: (1 <= w) => NatRepr w -> BV w -> BV w
abs :: forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> BV w
abs NatRepr w
w BV w
bv = forall (w :: Nat). NatRepr w -> Integer -> BV w
mkBV' NatRepr w
w (forall a. Num a => a -> a
Prelude.abs (forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> Integer
asSigned NatRepr w
w BV w
bv))
negate :: NatRepr w -> BV w -> BV w
negate :: forall (w :: Nat). NatRepr w -> BV w -> BV w
negate NatRepr w
w (BV Integer
x) = forall (w :: Nat). NatRepr w -> Integer -> BV w
mkBV' NatRepr w
w (-Integer
x)
signBit :: 1 <= w => NatRepr w -> BV w -> BV w
signBit :: forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> BV w
signBit NatRepr w
w bv :: BV w
bv@(BV Integer
_) = forall (w :: Nat). NatRepr w -> BV w -> Nat -> BV w
lshr NatRepr w
w BV w
bv (forall (n :: Nat). NatRepr n -> Nat
natValue NatRepr w
w forall a. Num a => a -> a -> a
- Nat
1) forall (w :: Nat). BV w -> BV w -> BV w
`and` forall (w :: Nat). Integer -> BV w
BV Integer
1
signum :: 1 <= w => NatRepr w -> BV w -> BV w
signum :: forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> BV w
signum NatRepr w
w BV w
bv = forall (w :: Nat). NatRepr w -> Integer -> BV w
mkBV' NatRepr w
w (forall a. Num a => a -> a
Prelude.signum (forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> Integer
asSigned NatRepr w
w BV w
bv))
slt :: (1 <= w) => NatRepr w -> BV w -> BV w -> Bool
slt :: forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> BV w -> Bool
slt NatRepr w
w BV w
bv1 BV w
bv2 = forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> Integer
asSigned NatRepr w
w BV w
bv1 forall a. Ord a => a -> a -> Bool
< forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> Integer
asSigned NatRepr w
w BV w
bv2
sle :: (1 <= w) => NatRepr w -> BV w -> BV w -> Bool
sle :: forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> BV w -> Bool
sle NatRepr w
w BV w
bv1 BV w
bv2 = forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> Integer
asSigned NatRepr w
w BV w
bv1 forall a. Ord a => a -> a -> Bool
<= forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> Integer
asSigned NatRepr w
w BV w
bv2
ult :: BV w -> BV w -> Bool
ult :: forall (w :: Nat). BV w -> BV w -> Bool
ult BV w
bv1 BV w
bv2 = forall (w :: Nat). BV w -> Integer
asUnsigned BV w
bv1 forall a. Ord a => a -> a -> Bool
< forall (w :: Nat). BV w -> Integer
asUnsigned BV w
bv2
ule :: BV w -> BV w -> Bool
ule :: forall (w :: Nat). BV w -> BV w -> Bool
ule BV w
bv1 BV w
bv2 = forall (w :: Nat). BV w -> Integer
asUnsigned BV w
bv1 forall a. Ord a => a -> a -> Bool
<= forall (w :: Nat). BV w -> Integer
asUnsigned BV w
bv2
umin :: BV w -> BV w -> BV w
umin :: forall (w :: Nat). BV w -> BV w -> BV w
umin (BV Integer
x) (BV Integer
y) = if Integer
x forall a. Ord a => a -> a -> Bool
< Integer
y then forall (w :: Nat). Integer -> BV w
BV Integer
x else forall (w :: Nat). Integer -> BV w
BV Integer
y
umax :: BV w -> BV w -> BV w
umax :: forall (w :: Nat). BV w -> BV w -> BV w
umax (BV Integer
x) (BV Integer
y) = if Integer
x forall a. Ord a => a -> a -> Bool
< Integer
y then forall (w :: Nat). Integer -> BV w
BV Integer
y else forall (w :: Nat). Integer -> BV w
BV Integer
x
smin :: (1 <= w) => NatRepr w -> BV w -> BV w -> BV w
smin :: forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> BV w -> BV w
smin NatRepr w
w BV w
bv1 BV w
bv2 = if forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> Integer
asSigned NatRepr w
w BV w
bv1 forall a. Ord a => a -> a -> Bool
< forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> Integer
asSigned NatRepr w
w BV w
bv2 then BV w
bv1 else BV w
bv2
smax :: (1 <= w) => NatRepr w -> BV w -> BV w -> BV w
smax :: forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> BV w -> BV w
smax NatRepr w
w BV w
bv1 BV w
bv2 = if forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> Integer
asSigned NatRepr w
w BV w
bv1 forall a. Ord a => a -> a -> Bool
< forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> Integer
asSigned NatRepr w
w BV w
bv2 then BV w
bv2 else BV w
bv1
concat :: NatRepr w
-> NatRepr w'
-> BV w
-> BV w'
-> BV (w+w')
concat :: forall (w :: Nat) (w' :: Nat).
NatRepr w -> NatRepr w' -> BV w -> BV w' -> BV (w + w')
concat NatRepr w
w NatRepr w'
w' (BV Integer
hi) (BV Integer
lo) = forall (w :: Nat) a. NatRepr w -> a -> a
checkNatRepr (NatRepr w
w forall (m :: Nat) (n :: Nat).
NatRepr m -> NatRepr n -> NatRepr (m + n)
`addNat` NatRepr w'
w') forall a b. (a -> b) -> a -> b
$
forall (w :: Nat). Integer -> BV w
BV ((Integer
hi forall a. Bits a => a -> Int -> a
`B.shiftL` Nat -> Int
fromNatural (forall (n :: Nat). NatRepr n -> Nat
natValue NatRepr w'
w')) forall a. Bits a => a -> a -> a
B..|. Integer
lo)
select :: ix + w' <= w
=> NatRepr ix
-> NatRepr w'
-> BV w
-> BV w'
select :: forall (ix :: Nat) (w' :: Nat) (w :: Nat).
((ix + w') <= w) =>
NatRepr ix -> NatRepr w' -> BV w -> BV w'
select NatRepr ix
ix NatRepr w'
w' (BV Integer
x) = forall (w :: Nat). NatRepr w -> Integer -> BV w
mkBV' NatRepr w'
w' Integer
xShf
where xShf :: Integer
xShf = Integer
x forall a. Bits a => a -> Int -> a
`B.shiftR` Nat -> Int
fromNatural (forall (n :: Nat). NatRepr n -> Nat
natValue NatRepr ix
ix)
select' :: Natural
-> NatRepr w'
-> BV w
-> BV w'
select' :: forall (w' :: Nat) (w :: Nat). Nat -> NatRepr w' -> BV w -> BV w'
select' Nat
ix NatRepr w'
w' (BV Integer
x)
| forall a. Integral a => a -> Integer
toInteger Nat
ix forall a. Ord a => a -> a -> Bool
< forall a. Integral a => a -> Integer
toInteger (forall a. Bounded a => a
maxBound :: Int) = forall (w :: Nat). NatRepr w -> Integer -> BV w
mkBV NatRepr w'
w' (Integer
x forall a. Bits a => a -> Int -> a
`B.shiftR` Nat -> Int
fromNatural Nat
ix)
| Bool
otherwise = forall (w :: Nat). NatRepr w -> BV w
zero NatRepr w'
w'
zext :: w + 1 <= w'
=> NatRepr w'
-> BV w
-> BV w'
zext :: forall (w :: Nat) (w' :: Nat).
((w + 1) <= w') =>
NatRepr w' -> BV w -> BV w'
zext NatRepr w'
w (BV Integer
x) = forall (w :: Nat) a. NatRepr w -> a -> a
checkNatRepr NatRepr w'
w forall a b. (a -> b) -> a -> b
$ forall (w :: Nat). Integer -> BV w
BV Integer
x
sext :: (1 <= w, w + 1 <= w')
=> NatRepr w
-> NatRepr w'
-> BV w
-> BV w'
sext :: forall (w :: Nat) (w' :: Nat).
(1 <= w, (w + 1) <= w') =>
NatRepr w -> NatRepr w' -> BV w -> BV w'
sext NatRepr w
w NatRepr w'
w' BV w
bv = forall (w :: Nat). NatRepr w -> Integer -> BV w
mkBV NatRepr w'
w' (forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> Integer
asSigned NatRepr w
w BV w
bv)
trunc :: w' + 1 <= w
=> NatRepr w'
-> BV w
-> BV w'
trunc :: forall (w' :: Nat) (w :: Nat).
((w' + 1) <= w) =>
NatRepr w' -> BV w -> BV w'
trunc NatRepr w'
w' (BV Integer
x) = forall (w :: Nat). NatRepr w -> Integer -> BV w
mkBV' NatRepr w'
w' Integer
x
trunc' :: NatRepr w'
-> BV w
-> BV w'
trunc' :: forall (w' :: Nat) (w :: Nat). NatRepr w' -> BV w -> BV w'
trunc' NatRepr w'
w' (BV Integer
x) = forall (w :: Nat). NatRepr w -> Integer -> BV w
mkBV NatRepr w'
w' Integer
x
{-# DEPRECATED trunc' "Use zresize instead" #-}
zresize :: NatRepr w'
-> BV w
-> BV w'
zresize :: forall (w' :: Nat) (w :: Nat). NatRepr w' -> BV w -> BV w'
zresize NatRepr w'
w' (BV Integer
x) = forall (w :: Nat). NatRepr w -> Integer -> BV w
mkBV NatRepr w'
w' Integer
x
sresize :: 1 <= w
=> NatRepr w
-> NatRepr w'
-> BV w
-> BV w'
sresize :: forall (w :: Nat) (w' :: Nat).
(1 <= w) =>
NatRepr w -> NatRepr w' -> BV w -> BV w'
sresize NatRepr w
w NatRepr w'
w' BV w
bv = forall (w :: Nat). NatRepr w -> Integer -> BV w
mkBV NatRepr w'
w' (forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> Integer
asSigned NatRepr w
w BV w
bv)
mulWide :: NatRepr w -> NatRepr w' -> BV w -> BV w' -> BV (w+w')
mulWide :: forall (w :: Nat) (w' :: Nat).
NatRepr w -> NatRepr w' -> BV w -> BV w' -> BV (w + w')
mulWide NatRepr w
w NatRepr w'
w' (BV Integer
x) (BV Integer
y) = forall (w :: Nat) a. NatRepr w -> a -> a
checkNatRepr (NatRepr w
w forall (m :: Nat) (n :: Nat).
NatRepr m -> NatRepr n -> NatRepr (m + n)
`addNat` NatRepr w'
w') forall a b. (a -> b) -> a -> b
$ forall (w :: Nat). Integer -> BV w
BV (Integer
xforall a. Num a => a -> a -> a
*Integer
y)
succUnsigned :: NatRepr w -> BV w -> Maybe (BV w)
succUnsigned :: forall (w :: Nat). NatRepr w -> BV w -> Maybe (BV w)
succUnsigned NatRepr w
w (BV Integer
x) =
if Integer
x forall a. Eq a => a -> a -> Bool
== forall (w :: Nat). NatRepr w -> Integer
P.maxUnsigned NatRepr w
w
then forall a. Maybe a
Nothing
else forall a. a -> Maybe a
Just (forall (w :: Nat). Integer -> BV w
BV (Integer
xforall a. Num a => a -> a -> a
+Integer
1))
succSigned :: 1 <= w => NatRepr w -> BV w -> Maybe (BV w)
succSigned :: forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> Maybe (BV w)
succSigned NatRepr w
w (BV Integer
x) =
if Integer
x forall a. Eq a => a -> a -> Bool
== forall (w :: Nat). (1 <= w) => NatRepr w -> Integer
P.maxSigned NatRepr w
w
then forall a. Maybe a
Nothing
else forall a. a -> Maybe a
Just (forall (w :: Nat). NatRepr w -> Integer -> BV w
mkBV' NatRepr w
w (Integer
xforall a. Num a => a -> a -> a
+Integer
1))
predUnsigned :: NatRepr w -> BV w -> Maybe (BV w)
predUnsigned :: forall (w :: Nat). NatRepr w -> BV w -> Maybe (BV w)
predUnsigned NatRepr w
w (BV Integer
x) =
if Integer
x forall a. Eq a => a -> a -> Bool
== forall (w :: Nat). NatRepr w -> Integer
P.minUnsigned NatRepr w
w
then forall a. Maybe a
Nothing
else forall a. a -> Maybe a
Just (forall (w :: Nat). Integer -> BV w
BV (Integer
xforall a. Num a => a -> a -> a
-Integer
1))
predSigned :: 1 <= w => NatRepr w -> BV w -> Maybe (BV w)
predSigned :: forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> Maybe (BV w)
predSigned NatRepr w
w bv :: BV w
bv@(BV Integer
x) =
if BV w
bv forall a. Eq a => a -> a -> Bool
== forall (w :: Nat). (1 <= w) => NatRepr w -> BV w
minSigned NatRepr w
w
then forall a. Maybe a
Nothing
else forall a. a -> Maybe a
Just (forall (w :: Nat). NatRepr w -> Integer -> BV w
mkBV' NatRepr w
w (Integer
xforall a. Num a => a -> a -> a
-Integer
1))
enumFromToUnsigned :: BV w
-> BV w
-> [BV w]
enumFromToUnsigned :: forall (w :: Nat). BV w -> BV w -> [BV w]
enumFromToUnsigned BV w
bv1 BV w
bv2 = forall (w :: Nat). Integer -> BV w
BV forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [forall (w :: Nat). BV w -> Integer
asUnsigned BV w
bv1 .. forall (w :: Nat). BV w -> Integer
asUnsigned BV w
bv2]
enumFromToSigned :: 1 <= w => NatRepr w
-> BV w
-> BV w
-> [BV w]
enumFromToSigned :: forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> BV w -> [BV w]
enumFromToSigned NatRepr w
w BV w
bv1 BV w
bv2 =
forall (w :: Nat). Integer -> BV w
BV forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. HasCallStack => Maybe a -> a
fromJust forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (w :: Nat).
(1 <= w) =>
NatRepr w -> Integer -> Maybe Integer
signedToUnsigned NatRepr w
w forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> Integer
asSigned NatRepr w
w BV w
bv1 .. forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> Integer
asSigned NatRepr w
w BV w
bv2]
uniformM :: StatefulGen g m => NatRepr w -> g -> m (BV w)
uniformM :: forall g (m :: * -> *) (w :: Nat).
StatefulGen g m =>
NatRepr w -> g -> m (BV w)
uniformM NatRepr w
w g
g = forall (w :: Nat). Integer -> BV w
BV forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a g (m :: * -> *).
(UniformRange a, StatefulGen g m) =>
(a, a) -> g -> m a
uniformRM (forall (w :: Nat). NatRepr w -> Integer
P.minUnsigned NatRepr w
w, forall (w :: Nat). NatRepr w -> Integer
P.maxUnsigned NatRepr w
w) g
g
uUniformRM :: StatefulGen g m => (BV w, BV w) -> g -> m (BV w)
uUniformRM :: forall g (m :: * -> *) (w :: Nat).
StatefulGen g m =>
(BV w, BV w) -> g -> m (BV w)
uUniformRM (BV w
lo, BV w
hi) g
g =
let loI :: Integer
loI = forall (w :: Nat). BV w -> Integer
asUnsigned BV w
lo
hiI :: Integer
hiI = forall (w :: Nat). BV w -> Integer
asUnsigned BV w
hi
in forall (w :: Nat). Integer -> BV w
BV forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a g (m :: * -> *).
(UniformRange a, StatefulGen g m) =>
(a, a) -> g -> m a
uniformRM (Integer
loI, Integer
hiI) g
g
sUniformRM :: (StatefulGen g m, 1 <= w) => NatRepr w -> (BV w, BV w) -> g -> m (BV w)
sUniformRM :: forall g (m :: * -> *) (w :: Nat).
(StatefulGen g m, 1 <= w) =>
NatRepr w -> (BV w, BV w) -> g -> m (BV w)
sUniformRM NatRepr w
w (BV w
lo, BV w
hi) g
g =
let loI :: Integer
loI = forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> Integer
asSigned NatRepr w
w BV w
lo
hiI :: Integer
hiI = forall (w :: Nat). (1 <= w) => NatRepr w -> BV w -> Integer
asSigned NatRepr w
w BV w
hi
in forall (w :: Nat). NatRepr w -> Integer -> BV w
mkBV NatRepr w
w forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a g (m :: * -> *).
(UniformRange a, StatefulGen g m) =>
(a, a) -> g -> m a
uniformRM (Integer
loI, Integer
hiI) g
g
ppHex :: NatRepr w -> BV w -> String
ppHex :: forall (w :: Nat). NatRepr w -> BV w -> String
ppHex NatRepr w
w (BV Integer
x) = String
"0x" forall a. [a] -> [a] -> [a]
++ forall a. (Integral a, Show a) => a -> ShowS
N.showHex Integer
x String
"" forall a. [a] -> [a] -> [a]
++ String
":" forall a. [a] -> [a] -> [a]
++ forall (w :: Nat). NatRepr w -> String
ppWidth NatRepr w
w
ppBin :: NatRepr w -> BV w -> String
ppBin :: forall (w :: Nat). NatRepr w -> BV w -> String
ppBin NatRepr w
w (BV Integer
x) = String
"0b" forall a. [a] -> [a] -> [a]
++ forall a. (Integral a, Show a) => a -> (Int -> Char) -> a -> ShowS
N.showIntAtBase Integer
2 Int -> Char
intToDigit Integer
x String
"" forall a. [a] -> [a] -> [a]
++ String
":" forall a. [a] -> [a] -> [a]
++ forall (w :: Nat). NatRepr w -> String
ppWidth NatRepr w
w
ppOct :: NatRepr w -> BV w -> String
ppOct :: forall (w :: Nat). NatRepr w -> BV w -> String
ppOct NatRepr w
w (BV Integer
x) = String
"0o" forall a. [a] -> [a] -> [a]
++ forall a. (Integral a, Show a) => a -> ShowS
N.showOct Integer
x String
"" forall a. [a] -> [a] -> [a]
++ String
":" forall a. [a] -> [a] -> [a]
++ forall (w :: Nat). NatRepr w -> String
ppWidth NatRepr w
w
ppDec :: NatRepr w -> BV w -> String
ppDec :: forall (w :: Nat). NatRepr w -> BV w -> String
ppDec NatRepr w
w (BV Integer
x) = forall a. Show a => a -> String
show Integer
x forall a. [a] -> [a] -> [a]
++ String
":" forall a. [a] -> [a] -> [a]
++ forall (w :: Nat). NatRepr w -> String
ppWidth NatRepr w
w
ppWidth :: NatRepr w -> String
ppWidth :: forall (w :: Nat). NatRepr w -> String
ppWidth NatRepr w
w = String
"[" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show (forall (n :: Nat). NatRepr n -> Nat
natValue NatRepr w
w) forall a. [a] -> [a] -> [a]
++ String
"]"