Copyright | (C) 2013-2016 University of Twente 2016 Myrtle Software Ltd 2022 QBayLogic B.V. |
---|---|
License | BSD2 (see the file LICENSE) |
Maintainer | QBayLogic B.V. <[email protected]> |
Safe Haskell | Trustworthy |
Language | Haskell2010 |
Extensions |
|
Clash.Promoted.Nat
Description
Synopsis
- data SNat (n :: Nat) where
- snatProxy :: forall (n :: Nat) proxy. KnownNat n => proxy n -> SNat n
- withSNat :: forall (n :: Nat) a. KnownNat n => (SNat n -> a) -> a
- snatToInteger :: forall (n :: Nat). SNat n -> Integer
- snatToNatural :: forall (n :: Nat). SNat n -> Natural
- snatToNum :: forall a (n :: Nat). Num a => SNat n -> a
- natToInteger :: forall (n :: Nat). KnownNat n => Integer
- natToNatural :: forall (n :: Nat). KnownNat n => Natural
- natToNum :: forall (n :: Nat) a. (Num a, KnownNat n) => a
- addSNat :: forall (a :: Nat) (b :: Nat). SNat a -> SNat b -> SNat (a + b)
- mulSNat :: forall (a :: Nat) (b :: Nat). SNat a -> SNat b -> SNat (a * b)
- powSNat :: forall (a :: Nat) (b :: Nat). SNat a -> SNat b -> SNat (a ^ b)
- minSNat :: forall (a :: Nat) (b :: Nat). SNat a -> SNat b -> SNat (Min a b)
- maxSNat :: forall (a :: Nat) (b :: Nat). SNat a -> SNat b -> SNat (Max a b)
- succSNat :: forall (a :: Nat). SNat a -> SNat (a + 1)
- subSNat :: forall (a :: Natural) (b :: Natural). SNat (a + b) -> SNat b -> SNat a
- divSNat :: forall (b :: Natural) (a :: Nat). 1 <= b => SNat a -> SNat b -> SNat (Div a b)
- modSNat :: forall (b :: Natural) (a :: Nat). 1 <= b => SNat a -> SNat b -> SNat (Mod a b)
- flogBaseSNat :: forall (base :: Natural) (x :: Natural). (2 <= base, 1 <= x) => SNat base -> SNat x -> SNat (FLog base x)
- clogBaseSNat :: forall (base :: Natural) (x :: Natural). (2 <= base, 1 <= x) => SNat base -> SNat x -> SNat (CLog base x)
- logBaseSNat :: forall (base :: Nat) (x :: Nat). FLog base x ~ CLog base x => SNat base -> SNat x -> SNat (Log base x)
- predSNat :: forall (a :: Natural). SNat (a + 1) -> SNat a
- pow2SNat :: forall (a :: Nat). SNat a -> SNat (2 ^ a)
- data SNatLE (a :: Natural) (b :: Natural) where
- compareSNat :: forall (a :: Nat) (b :: Nat). SNat a -> SNat b -> SNatLE a b
- data UNat (a :: Nat) where
- toUNat :: forall (n :: Nat). SNat n -> UNat n
- fromUNat :: forall (n :: Nat). UNat n -> SNat n
- addUNat :: forall (n :: Nat) (m :: Nat). UNat n -> UNat m -> UNat (n + m)
- mulUNat :: forall (n :: Nat) (m :: Nat). UNat n -> UNat m -> UNat (n * m)
- powUNat :: forall (n :: Nat) (m :: Nat). UNat n -> UNat m -> UNat (n ^ m)
- predUNat :: forall (n :: Natural). UNat (n + 1) -> UNat n
- subUNat :: forall (m :: Natural) (n :: Natural). UNat (m + n) -> UNat n -> UNat m
- data BNat (a :: Nat) where
- toBNat :: forall (n :: Nat). SNat n -> BNat n
- fromBNat :: forall (n :: Nat). BNat n -> SNat n
- showBNat :: forall (n :: Nat). BNat n -> String
- succBNat :: forall (n :: Nat). BNat n -> BNat (n + 1)
- addBNat :: forall (n :: Nat) (m :: Nat). BNat n -> BNat m -> BNat (n + m)
- mulBNat :: forall (n :: Nat) (m :: Nat). BNat n -> BNat m -> BNat (n * m)
- powBNat :: forall (n :: Nat) (m :: Nat). BNat n -> BNat m -> BNat (n ^ m)
- predBNat :: forall (n :: Natural). 1 <= n => BNat n -> BNat (n - 1)
- div2BNat :: forall (n :: Natural). BNat (2 * n) -> BNat n
- div2Sub1BNat :: forall (n :: Natural). BNat ((2 * n) + 1) -> BNat n
- log2BNat :: forall (n :: Natural). BNat (2 ^ n) -> BNat n
- stripZeros :: forall (n :: Nat). BNat n -> BNat n
- leToPlus :: forall (k :: Nat) (n :: Nat) r. k <= n => (forall (m :: Natural). n ~ (k + m) => r) -> r
- leToPlusKN :: forall (k :: Nat) (n :: Nat) r. (k <= n, KnownNat k, KnownNat n) => (forall (m :: Natural). (n ~ (k + m), KnownNat m) => r) -> r
Singleton natural numbers
Data type
data SNat (n :: Nat) where Source #
Singleton value for a type-level natural number n
- Clash.Promoted.Nat.Literals contains a list of predefined
SNat
literals - Clash.Promoted.Nat.TH has functions to easily create large ranges of new
SNat
literals
Construction
snatProxy :: forall (n :: Nat) proxy. KnownNat n => proxy n -> SNat n Source #
Create an
from a proxy for nSNat
n
withSNat :: forall (n :: Nat) a. KnownNat n => (SNat n -> a) -> a Source #
Supply a function with a singleton natural n
according to the context
Conversion
Conversion (ambiguous types)
natToInteger :: forall (n :: Nat). KnownNat n => Integer Source #
Same as snatToInteger
and natVal
, but doesn't take term
arguments. Example usage:
>>>
natToInteger @5
5
natToNatural :: forall (n :: Nat). KnownNat n => Natural Source #
Same as snatToNatural
and natVal
, but doesn't take term
arguments. Example usage:
>>>
natToNatural @5
5
natToNum :: forall (n :: Nat) a. (Num a, KnownNat n) => a Source #
Same as snatToNum
, but doesn't take term arguments. Example usage:
>>>
natToNum @5 @Int
5
Arithmetic
addSNat :: forall (a :: Nat) (b :: Nat). SNat a -> SNat b -> SNat (a + b) infixl 6 Source #
Add two singleton natural numbers
mulSNat :: forall (a :: Nat) (b :: Nat). SNat a -> SNat b -> SNat (a * b) infixl 7 Source #
Multiply two singleton natural numbers
powSNat :: forall (a :: Nat) (b :: Nat). SNat a -> SNat b -> SNat (a ^ b) infixr 8 Source #
Power of two singleton natural numbers
succSNat :: forall (a :: Nat). SNat a -> SNat (a + 1) Source #
Successor of a singleton natural number
Partial
subSNat :: forall (a :: Natural) (b :: Natural). SNat (a + b) -> SNat b -> SNat a infixl 6 Source #
Subtract two singleton natural numbers
divSNat :: forall (b :: Natural) (a :: Nat). 1 <= b => SNat a -> SNat b -> SNat (Div a b) infixl 7 Source #
Division of two singleton natural numbers
modSNat :: forall (b :: Natural) (a :: Nat). 1 <= b => SNat a -> SNat b -> SNat (Mod a b) infixl 7 Source #
Modulo of two singleton natural numbers
Arguments
:: forall (base :: Natural) (x :: Natural). (2 <= base, 1 <= x) | |
=> SNat base | Base |
-> SNat x | |
-> SNat (FLog base x) |
Floor of the logarithm of a natural number
Arguments
:: forall (base :: Natural) (x :: Natural). (2 <= base, 1 <= x) | |
=> SNat base | Base |
-> SNat x | |
-> SNat (CLog base x) |
Ceiling of the logarithm of a natural number
Arguments
:: forall (base :: Nat) (x :: Nat). FLog base x ~ CLog base x | |
=> SNat base | Base |
-> SNat x | |
-> SNat (Log base x) |
Exact integer logarithm of a natural number
NB: Only works when the argument is a power of the base
predSNat :: forall (a :: Natural). SNat (a + 1) -> SNat a Source #
Predecessor of a singleton natural number
Specialised
pow2SNat :: forall (a :: Nat). SNat a -> SNat (2 ^ a) Source #
Power of two of a singleton natural number
Comparison
data SNatLE (a :: Natural) (b :: Natural) where Source #
Ordering relation between two Nats
compareSNat :: forall (a :: Nat) (b :: Nat). SNat a -> SNat b -> SNatLE a b Source #
Get an ordering relation between two SNats
Unary/Peano-encoded natural numbers
Data type
data UNat (a :: Nat) where Source #
Unary representation of a type-level natural
NB: Not synthesizable
Construction
toUNat :: forall (n :: Nat). SNat n -> UNat n Source #
Convert a singleton natural number to its unary representation
NB: Not synthesizable
Conversion
fromUNat :: forall (n :: Nat). UNat n -> SNat n Source #
Convert a unary-encoded natural number to its singleton representation
NB: Not synthesizable
Arithmetic
addUNat :: forall (n :: Nat) (m :: Nat). UNat n -> UNat m -> UNat (n + m) Source #
Add two unary-encoded natural numbers
NB: Not synthesizable
mulUNat :: forall (n :: Nat) (m :: Nat). UNat n -> UNat m -> UNat (n * m) Source #
Multiply two unary-encoded natural numbers
NB: Not synthesizable
powUNat :: forall (n :: Nat) (m :: Nat). UNat n -> UNat m -> UNat (n ^ m) Source #
Power of two unary-encoded natural numbers
NB: Not synthesizable
Partial
predUNat :: forall (n :: Natural). UNat (n + 1) -> UNat n Source #
Predecessor of a unary-encoded natural number
NB: Not synthesizable
subUNat :: forall (m :: Natural) (n :: Natural). UNat (m + n) -> UNat n -> UNat m Source #
Subtract two unary-encoded natural numbers
NB: Not synthesizable
Base-2 encoded natural numbers
Data type
data BNat (a :: Nat) where Source #
Base-2 encoded natural number
- NB: The LSB is the left/outer-most constructor:
- NB: Not synthesizable
>>>
B0 (B1 (B1 BT))
b6
Constructors
Starting/Terminating element:
BT ::
BNat
0
Constructors
BT :: BNat 0 | |
B0 :: forall (n :: Natural). BNat n -> BNat (2 * n) | |
B1 :: forall (n :: Natural). BNat n -> BNat ((2 * n) + 1) |
Construction
toBNat :: forall (n :: Nat). SNat n -> BNat n Source #
Convert a singleton natural number to its base-2 representation
NB: Not synthesizable
Conversion
fromBNat :: forall (n :: Nat). BNat n -> SNat n Source #
Convert a base-2 encoded natural number to its singleton representation
NB: Not synthesizable
Pretty printing base-2 encoded natural numbers
showBNat :: forall (n :: Nat). BNat n -> String Source #
Show a base-2 encoded natural as a binary literal
NB: The LSB is shown as the right-most bit
>>>
d789
d789>>>
toBNat d789
b789>>>
showBNat (toBNat d789)
"0b1100010101">>>
0b1100010101 :: Integer
789
Arithmetic
succBNat :: forall (n :: Nat). BNat n -> BNat (n + 1) Source #
Successor of a base-2 encoded natural number
NB: Not synthesizable
addBNat :: forall (n :: Nat) (m :: Nat). BNat n -> BNat m -> BNat (n + m) Source #
Add two base-2 encoded natural numbers
NB: Not synthesizable
mulBNat :: forall (n :: Nat) (m :: Nat). BNat n -> BNat m -> BNat (n * m) Source #
Multiply two base-2 encoded natural numbers
NB: Not synthesizable
powBNat :: forall (n :: Nat) (m :: Nat). BNat n -> BNat m -> BNat (n ^ m) Source #
Power of two base-2 encoded natural numbers
NB: Not synthesizable
Partial
predBNat :: forall (n :: Natural). 1 <= n => BNat n -> BNat (n - 1) Source #
Predecessor of a base-2 encoded natural number
NB: Not synthesizable
div2BNat :: forall (n :: Natural). BNat (2 * n) -> BNat n Source #
Divide a base-2 encoded natural number by 2
NB: Not synthesizable
div2Sub1BNat :: forall (n :: Natural). BNat ((2 * n) + 1) -> BNat n Source #
Subtract 1 and divide a base-2 encoded natural number by 2
NB: Not synthesizable
log2BNat :: forall (n :: Natural). BNat (2 ^ n) -> BNat n Source #
Get the log2 of a base-2 encoded natural number
NB: Not synthesizable
Normalisation
stripZeros :: forall (n :: Nat). BNat n -> BNat n Source #
Strip non-contributing zero's from a base-2 encoded natural number
>>>
B1 (B0 (B0 (B0 BT)))
b1>>>
showBNat (B1 (B0 (B0 (B0 BT))))
"0b0001">>>
showBNat (stripZeros (B1 (B0 (B0 (B0 BT)))))
"0b1">>>
stripZeros (B1 (B0 (B0 (B0 BT))))
b1
NB: Not synthesizable