{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE DataKinds #-}
module ReWire.Bits where
import ReWire
import ReWire.Finite
import Prelude hiding (head, (<>), (==), (-), (^), (&&), (||))
type Lit = W 128
zero :: Bit
zero :: Bit
zero = Bit
False
one :: Bit
one :: Bit
one = Bit
True
{-# INLINE bit #-}
bit :: W 1 -> Bit
bit :: W 1 -> Bit
bit = W 1 -> Bit
W (1 + 0) -> Bit
forall (n :: Natural). W (1 + n) -> Bit
msbit
{-# INLINE toInteger #-}
toInteger :: W n -> Integer
toInteger :: forall (n :: Natural). W n -> Integer
toInteger = Vec n Bit -> Integer
forall (n :: Natural). W n -> Integer
toIntegerV
{-# INLINE (@@) #-}
(@@) :: (KnownNat n,KnownNat m) => W n -> (Integer, Integer) -> W m
W n
a @@ :: forall (n :: Natural) (m :: Natural).
(KnownNat n, KnownNat m) =>
W n -> (Integer, Integer) -> W m
@@ (Integer
j, Integer
i) = W n -> Integer -> Integer -> W m
forall (n :: Natural) (m :: Natural).
(KnownNat n, KnownNat m) =>
W n -> Integer -> Integer -> W m
bitSlice W n
a Integer
j Integer
i
{-# INLINE (@.) #-}
(@.) :: KnownNat n => W n -> Integer -> Bit
W n
a @. :: forall (n :: Natural). KnownNat n => W n -> Integer -> Bit
@. Integer
i = W n -> Integer -> Bit
forall (n :: Natural). KnownNat n => W n -> Integer -> Bit
bitIndex W n
a Integer
i
infixr 9 **
infixl 8 *, /, %
infixl 7 +, -
infixl 6 <<., >>., >>>
infixl 6 >, >=, <, <=
infixr 6 <>
infixl 5 .&.
infixl 4 ^, ~^, `xor`
infixl 3 .|.
infixr 2 &&., &&&
infixr 1 ||., |||
{-# INLINE lit #-}
lit :: KnownNat n => Integer -> W n
lit :: forall (n :: Natural). KnownNat n => Integer -> W n
lit Integer
i = Vec 128 Bit -> Vec n Bit
forall (m :: Natural) (n :: Natural).
KnownNat m =>
Vec n Bit -> Vec m Bit
rwPrimResize (Integer -> Vec 128 Bit
rwPrimBits Integer
i :: Lit)
{-# INLINE resize #-}
resize :: KnownNat m => W n -> W m
resize :: forall (m :: Natural) (n :: Natural).
KnownNat m =>
Vec n Bit -> Vec m Bit
resize = Vec n Bit -> Vec m Bit
forall (m :: Natural) (n :: Natural).
KnownNat m =>
Vec n Bit -> Vec m Bit
rwPrimResize
{-# INLINE sext #-}
sext :: KnownNat m => W (1 + n) -> W (m + (1 + n))
sext :: forall (m :: Natural) (n :: Natural).
KnownNat m =>
W (1 + n) -> W (m + (1 + n))
sext W (1 + n)
w = Bit -> Vec m Bit
forall (n :: Natural) a. KnownNat n => a -> Vec n a
rwPrimVecReplicate (W (1 + n) -> Bit
forall (n :: Natural). W (1 + n) -> Bit
msbit W (1 + n)
w) Vec m Bit -> W (1 + n) -> Vector Vector (m + (1 + n)) Bit
forall (n :: Natural) a (m :: Natural).
Vec n a -> Vec m a -> Vec (n + m) a
`rwPrimVecConcat` W (1 + n)
w
{-# INLINE bitSlice #-}
bitSlice :: (KnownNat n, KnownNat m) => W n -> Integer -> Integer -> W m
bitSlice :: forall (n :: Natural) (m :: Natural).
(KnownNat n, KnownNat m) =>
W n -> Integer -> Integer -> W m
bitSlice W n
v Integer
j Integer
i = W n -> Finite n -> Finite n -> W m
forall (m :: Natural) (n :: Natural).
KnownNat m =>
W n -> Finite n -> Finite n -> W m
finBitSlice W n
v (Integer -> Finite n
forall (n :: Natural). KnownNat n => Integer -> Finite n
finite Integer
j) (Integer -> Finite n
forall (n :: Natural). KnownNat n => Integer -> Finite n
finite Integer
i)
{-# INLINE bitIndex #-}
bitIndex :: KnownNat n => W n -> Integer -> Bit
bitIndex :: forall (n :: Natural). KnownNat n => W n -> Integer -> Bit
bitIndex W n
v Integer
i = W n -> Finite n -> Bit
forall (n :: Natural). W n -> Finite n -> Bit
finBitIndex W n
v (Integer -> Finite n
forall (n :: Natural). KnownNat n => Integer -> Finite n
finite Integer
i)
{-# INLINE finBitSlice #-}
finBitSlice :: KnownNat m => W n -> Finite n -> Finite n -> W m
finBitSlice :: forall (m :: Natural) (n :: Natural).
KnownNat m =>
W n -> Finite n -> Finite n -> W m
finBitSlice = Vec n Bit -> Finite n -> Finite n -> Vec m Bit
forall (m :: Natural) (n :: Natural).
KnownNat m =>
W n -> Finite n -> Finite n -> W m
rwPrimBitSlice
{-# INLINE finBitIndex #-}
finBitIndex :: W n -> Finite n -> Bit
finBitIndex :: forall (n :: Natural). W n -> Finite n -> Bit
finBitIndex = Vec n Bit -> Finite n -> Bit
forall (n :: Natural). W n -> Finite n -> Bit
rwPrimBitIndex
{-# INLINE (+) #-}
(+) :: KnownNat n => W n -> W n -> W n
+ :: forall (n :: Natural). KnownNat n => W n -> W n -> W n
(+) = Vec n Bit -> Vec n Bit -> Vec n Bit
forall (n :: Natural). KnownNat n => W n -> W n -> W n
rwPrimAdd
{-# INLINE (-) #-}
(-) :: KnownNat n => W n -> W n -> W n
(-) = Vec n Bit -> Vec n Bit -> Vec n Bit
forall (n :: Natural). KnownNat n => W n -> W n -> W n
rwPrimSub
{-# INLINE (*) #-}
(*) :: KnownNat n => W n -> W n -> W n
* :: forall (n :: Natural). KnownNat n => W n -> W n -> W n
(*) = Vec n Bit -> Vec n Bit -> Vec n Bit
forall (n :: Natural). KnownNat n => W n -> W n -> W n
rwPrimMul
{-# INLINE (/) #-}
(/) :: KnownNat n => W n -> W n -> W n
/ :: forall (n :: Natural). KnownNat n => W n -> W n -> W n
(/) = Vec n Bit -> Vec n Bit -> Vec n Bit
forall (n :: Natural). KnownNat n => W n -> W n -> W n
rwPrimDiv
{-# INLINE (%) #-}
(%) :: KnownNat n => W n -> W n -> W n
% :: forall (n :: Natural). KnownNat n => W n -> W n -> W n
(%) = Vec n Bit -> Vec n Bit -> Vec n Bit
forall (n :: Natural). KnownNat n => W n -> W n -> W n
rwPrimMod
{-# INLINE (**) #-}
(**) :: KnownNat n => W n -> W n -> W n
** :: forall (n :: Natural). KnownNat n => W n -> W n -> W n
(**) = Vec n Bit -> Vec n Bit -> Vec n Bit
forall (n :: Natural). KnownNat n => W n -> W n -> W n
rwPrimPow
{-# INLINE (&&&) #-}
(&&&) :: Bool -> Bool -> Bool
&&& :: Bit -> Bit -> Bit
(&&&) Bit
a Bit
b = W 1 -> Bit
bit (W 1 -> Bit) -> W 1 -> Bit
forall a b. (a -> b) -> a -> b
$ ([Bit] -> W 1
forall (n :: Natural) a. KnownNat n => [a] -> Vec n a
fromList [Bit
a] :: W 1) W 1 -> W 1 -> W 1
forall (n :: Natural). W n -> W n -> W n
.&. ([Bit] -> W 1
forall (n :: Natural) a. KnownNat n => [a] -> Vec n a
fromList [Bit
b] :: W 1)
{-# INLINE (|||) #-}
(|||) :: Bool -> Bool -> Bool
||| :: Bit -> Bit -> Bit
(|||) Bit
a Bit
b = W 1 -> Bit
bit (W 1 -> Bit) -> W 1 -> Bit
forall a b. (a -> b) -> a -> b
$ ([Bit] -> W 1
forall (n :: Natural) a. KnownNat n => [a] -> Vec n a
fromList [Bit
a] :: W 1) W 1 -> W 1 -> W 1
forall (n :: Natural). W n -> W n -> W n
.|. ([Bit] -> W 1
forall (n :: Natural) a. KnownNat n => [a] -> Vec n a
fromList [Bit
b] :: W 1)
{-# INLINE (&&.) #-}
(&&.) :: W n -> W n -> Bool
&&. :: forall (n :: Natural). W n -> W n -> Bit
(&&.) = Vec n Bit -> Vec n Bit -> Bit
forall (n :: Natural). W n -> W n -> Bit
rwPrimLAnd
{-# INLINE (||.) #-}
(||.) :: W n -> W n -> Bool
||. :: forall (n :: Natural). W n -> W n -> Bit
(||.) = Vec n Bit -> Vec n Bit -> Bit
forall (n :: Natural). W n -> W n -> Bit
rwPrimLOr
{-# INLINE lnot #-}
lnot :: W n -> Bit
lnot :: forall (n :: Natural). W n -> Bit
lnot = Vec n Bit -> Bit
forall (n :: Natural). W n -> Bit
rwPrimLNot
{-# INLINE (.&.) #-}
(.&.) :: W n -> W n -> W n
.&. :: forall (n :: Natural). W n -> W n -> W n
(.&.) = Vec n Bit -> Vec n Bit -> Vec n Bit
forall (n :: Natural). W n -> W n -> W n
rwPrimAnd
{-# INLINE (.|.) #-}
(.|.) :: W n -> W n -> W n
.|. :: forall (n :: Natural). W n -> W n -> W n
(.|.) = Vec n Bit -> Vec n Bit -> Vec n Bit
forall (n :: Natural). W n -> W n -> W n
rwPrimOr
{-# INLINE bnot #-}
bnot :: W n -> W n
bnot :: forall (n :: Natural). W n -> W n
bnot = Vec n Bit -> Vec n Bit
forall (n :: Natural). W n -> W n
rwPrimNot
{-# INLINE (^) #-}
(^) :: W n -> W n -> W n
^ :: forall (n :: Natural). W n -> W n -> W n
(^) = Vec n Bit -> Vec n Bit -> Vec n Bit
forall (n :: Natural). W n -> W n -> W n
rwPrimXOr
{-# INLINE xor #-}
xor :: Bool -> Bool -> Bool
xor :: Bit -> Bit -> Bit
xor Bit
a Bit
b = W 1 -> Bit
bit (W 1 -> Bit) -> W 1 -> Bit
forall a b. (a -> b) -> a -> b
$ [Bit] -> W 1
forall (n :: Natural) a. KnownNat n => [a] -> Vec n a
fromList [Bit
a] W 1 -> W 1 -> W 1
forall (n :: Natural). W n -> W n -> W n
^ [Bit] -> W 1
forall (n :: Natural) a. KnownNat n => [a] -> Vec n a
fromList [Bit
b]
{-# INLINE (~^) #-}
(~^) :: W n -> W n -> W n
~^ :: forall (n :: Natural). W n -> W n -> W n
(~^) = Vec n Bit -> Vec n Bit -> Vec n Bit
forall (n :: Natural). W n -> W n -> W n
rwPrimXNor
{-# INLINE (<<.) #-}
(<<.) :: KnownNat n => W n -> W n -> W n
<<. :: forall (n :: Natural). KnownNat n => W n -> W n -> W n
(<<.) = Vec n Bit -> Vec n Bit -> Vec n Bit
forall (n :: Natural). KnownNat n => W n -> W n -> W n
rwPrimLShift
{-# INLINE (>>.) #-}
(>>.) :: KnownNat n => W n -> W n -> W n
>>. :: forall (n :: Natural). KnownNat n => W n -> W n -> W n
(>>.) = Vec n Bit -> Vec n Bit -> Vec n Bit
forall (n :: Natural). KnownNat n => W n -> W n -> W n
rwPrimRShift
{-# INLINE (>>>) #-}
(>>>) :: KnownNat n => W n -> W n -> W n
>>> :: forall (n :: Natural). KnownNat n => W n -> W n -> W n
(>>>) = Vec n Bit -> Vec n Bit -> Vec n Bit
forall (n :: Natural). KnownNat n => W n -> W n -> W n
rwPrimRShiftArith
{-# INLINE rotR #-}
rotR :: KnownNat m => W m -> W m -> W m
rotR :: forall (n :: Natural). KnownNat n => W n -> W n -> W n
rotR W m
n W m
w = (W m
w W m -> W m -> W m
forall (n :: Natural). KnownNat n => W n -> W n -> W n
>>. W m
n) W m -> W m -> W m
forall (n :: Natural). W n -> W n -> W n
.|. (W m
w W m -> W m -> W m
forall (n :: Natural). KnownNat n => W n -> W n -> W n
<<. (Integer -> W m
forall (n :: Natural). KnownNat n => Integer -> W n
lit (W m -> Integer
forall (n :: Natural) a. KnownNat n => Vec n a -> Integer
len W m
w) W m -> W m -> W m
forall (n :: Natural). KnownNat n => W n -> W n -> W n
- W m
n))
{-# INLINE rotL #-}
rotL :: KnownNat m => W m -> W m -> W m
rotL :: forall (n :: Natural). KnownNat n => W n -> W n -> W n
rotL W m
n W m
w = (W m
w W m -> W m -> W m
forall (n :: Natural). KnownNat n => W n -> W n -> W n
<<. W m
n) W m -> W m -> W m
forall (n :: Natural). W n -> W n -> W n
.|. (W m
w W m -> W m -> W m
forall (n :: Natural). KnownNat n => W n -> W n -> W n
>>. (Integer -> W m
forall (n :: Natural). KnownNat n => Integer -> W n
lit (W m -> Integer
forall (n :: Natural) a. KnownNat n => Vec n a -> Integer
len W m
w) W m -> W m -> W m
forall (n :: Natural). KnownNat n => W n -> W n -> W n
- W m
n))
{-# INLINE (==) #-}
(==) :: W n -> W n -> Bool
== :: forall (n :: Natural). W n -> W n -> Bit
(==) = Vec n Bit -> Vec n Bit -> Bit
forall (n :: Natural). W n -> W n -> Bit
rwPrimEq
{-# INLINE (/=) #-}
(/=) :: W n -> W n -> Bool
/= :: forall (n :: Natural). W n -> W n -> Bit
(/=) W n
a W n
b = Bit -> Bit
not (W n
a W n -> W n -> Bit
forall (n :: Natural). W n -> W n -> Bit
== W n
b)
{-# INLINE (>) #-}
(>) :: W n -> W n -> Bool
> :: forall (n :: Natural). W n -> W n -> Bit
(>) = Vec n Bit -> Vec n Bit -> Bit
forall (n :: Natural). W n -> W n -> Bit
rwPrimGt
{-# INLINE (>=) #-}
(>=) :: W n -> W n -> Bool
>= :: forall (n :: Natural). W n -> W n -> Bit
(>=) = Vec n Bit -> Vec n Bit -> Bit
forall (n :: Natural). W n -> W n -> Bit
rwPrimGtEq
{-# INLINE (<) #-}
(<) :: W n -> W n -> Bool
< :: forall (n :: Natural). W n -> W n -> Bit
(<) = Vec n Bit -> Vec n Bit -> Bit
forall (n :: Natural). W n -> W n -> Bit
rwPrimLt
{-# INLINE (<=) #-}
(<=) :: W n -> W n -> Bool
<= :: forall (n :: Natural). W n -> W n -> Bit
(<=) = Vec n Bit -> Vec n Bit -> Bit
forall (n :: Natural). W n -> W n -> Bit
rwPrimLtEq
{-# INLINE (<>) #-}
(<>) :: W n -> W m -> W (n + m)
<> :: forall (n :: Natural) (m :: Natural). W n -> W m -> W (n + m)
(<>) = Vec n Bit -> Vec m Bit -> Vec (n + m) Bit
forall (n :: Natural) a (m :: Natural).
Vec n a -> Vec m a -> Vec (n + m) a
rwPrimVecConcat
{-# INLINE rAnd #-}
rAnd :: W n -> Bit
rAnd :: forall (n :: Natural). W n -> Bit
rAnd = Vec n Bit -> Bit
forall (n :: Natural). W n -> Bit
rwPrimRAnd
{-# INLINE rNAnd #-}
rNAnd :: W (1 + n) -> Bit
rNAnd :: forall (n :: Natural). W (1 + n) -> Bit
rNAnd = Vec (1 + n) Bit -> Bit
forall (n :: Natural). W (1 + n) -> Bit
rwPrimRNAnd
{-# INLINE rOr #-}
rOr :: W n -> Bit
rOr :: forall (n :: Natural). W n -> Bit
rOr = Vec n Bit -> Bit
forall (n :: Natural). W n -> Bit
rwPrimROr
{-# INLINE rNor #-}
rNor :: W (1 + n) -> Bit
rNor :: forall (n :: Natural). W (1 + n) -> Bit
rNor = Vec (1 + n) Bit -> Bit
forall (n :: Natural). W (1 + n) -> Bit
rwPrimRNor
{-# INLINE rXOr #-}
rXOr :: W (1 + n) -> Bit
rXOr :: forall (n :: Natural). W (1 + n) -> Bit
rXOr = Vec (1 + n) Bit -> Bit
forall (n :: Natural). W (1 + n) -> Bit
rwPrimRXOr
{-# INLINE rXNor #-}
rXNor :: W (1 + n) -> Bit
rXNor :: forall (n :: Natural). W (1 + n) -> Bit
rXNor = Vec (1 + n) Bit -> Bit
forall (n :: Natural). W (1 + n) -> Bit
rwPrimRXNor
{-# INLINE msbit #-}
msbit :: W (1 + n) -> Bit
msbit :: forall (n :: Natural). W (1 + n) -> Bit
msbit = Vec (1 + n) Bit -> Bit
forall (n :: Natural). W (1 + n) -> Bit
rwPrimMSBit
{-# INLINE odd #-}
odd :: W (1 + n) -> Bool
odd :: forall (n :: Natural). W (1 + n) -> Bit
odd W (1 + n)
b = W 1 -> Bit
bit (W (1 + n) -> W 1
forall (m :: Natural) (n :: Natural).
KnownNat m =>
Vec n Bit -> Vec m Bit
resize W (1 + n)
b :: W 1)
{-# INLINE even #-}
even :: W (1 + n) -> Bool
even :: forall (n :: Natural). W (1 + n) -> Bit
even W (1 + n)
b = Bit -> Bit
not (W 1 -> Bit
bit (W (1 + n) -> W 1
forall (m :: Natural) (n :: Natural).
KnownNat m =>
Vec n Bit -> Vec m Bit
resize W (1 + n)
b :: W 1))