packages feed

clash-prelude 0.10 → 0.10.1

raw patch · 7 files changed

+308/−101 lines, 7 filesdep +reflectionPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependencies added: reflection

API changes (from Hackage documentation)

- CLaSH.Annotations.TopEntity: [ClockSource] :: String -> Maybe (String, String) -> [(String, String)] -> Maybe (String, String) -> String -> Bool -> ClockSource
- CLaSH.Annotations.TopEntity: [TopEntity] :: String -> [String] -> [String] -> [(String, Int)] -> [(String, Int)] -> [ClockSource] -> TopEntity
- CLaSH.Annotations.TopEntity: instance [safe] Data ClockSource
- CLaSH.Annotations.TopEntity: instance [safe] Data TopEntity
- CLaSH.Annotations.TopEntity: instance [safe] Show ClockSource
- CLaSH.Annotations.TopEntity: instance [safe] Show TopEntity
- CLaSH.Class.BitPack: instance (KnownNat (BitSize b), BitPack a, BitPack b) => BitPack (a, b)
- CLaSH.Class.BitPack: instance BitPack (BitVector n)
- CLaSH.Class.BitPack: instance BitPack Bool
- CLaSH.Class.Num: [SatBound] :: SaturationMode
- CLaSH.Class.Num: [SatSymmetric] :: SaturationMode
- CLaSH.Class.Num: [SatWrap] :: SaturationMode
- CLaSH.Class.Num: [SatZero] :: SaturationMode
- CLaSH.Class.Num: instance [safe] Eq SaturationMode
- CLaSH.Prelude.DataFlow: instance [safe] (LockStep a x, LockStep b y) => LockStep (a, b) (x, y)
- CLaSH.Prelude.DataFlow: instance [safe] LockStep Bool c
- CLaSH.Promoted.Nat: [SNat] :: (Proxy n) -> SNat
- CLaSH.Promoted.Nat: [USucc] :: UNat n -> UNat (n + 1)
- CLaSH.Promoted.Nat: [UZero] :: UNat 0
- CLaSH.Promoted.Nat: instance Show (SNat n)
- CLaSH.Promoted.Symbol: [SSymbol] :: (Proxy s) -> SSymbol
- CLaSH.Promoted.Symbol: instance [safe] Show (SSymbol s)
- CLaSH.Signal.Bundle: instance Bundle ()
- CLaSH.Signal.Bundle: instance Bundle (BitVector n)
- CLaSH.Signal.Bundle: instance Bundle (Either a b)
- CLaSH.Signal.Bundle: instance Bundle (Fixed rep int frac)
- CLaSH.Signal.Bundle: instance Bundle (Index n)
- CLaSH.Signal.Bundle: instance Bundle (Maybe a)
- CLaSH.Signal.Bundle: instance Bundle (Signed n)
- CLaSH.Signal.Bundle: instance Bundle (Unsigned n)
- CLaSH.Signal.Bundle: instance Bundle (a, b)
- CLaSH.Signal.Bundle: instance Bundle (a, b, c)
- CLaSH.Signal.Bundle: instance Bundle (a, b, c, d)
- CLaSH.Signal.Bundle: instance Bundle (a, b, c, d, e)
- CLaSH.Signal.Bundle: instance Bundle (a, b, c, d, e, f)
- CLaSH.Signal.Bundle: instance Bundle (a, b, c, d, e, f, g)
- CLaSH.Signal.Bundle: instance Bundle (a, b, c, d, e, f, g, h)
- CLaSH.Signal.Bundle: instance Bundle Bool
- CLaSH.Signal.Bundle: instance Bundle Double
- CLaSH.Signal.Bundle: instance Bundle Float
- CLaSH.Signal.Bundle: instance Bundle Int
- CLaSH.Signal.Bundle: instance Bundle Integer
- CLaSH.Signal.Bundle: instance KnownNat n => Bundle (Vec n a)
- CLaSH.Signal.Delayed: instance (Num a, Ord a) => Real (DSignal delay a)
- CLaSH.Signal.Delayed: instance Applicative (DSignal delay)
- CLaSH.Signal.Delayed: instance Arbitrary a => Arbitrary (DSignal delay a)
- CLaSH.Signal.Delayed: instance Bits a => Bits (DSignal delay a)
- CLaSH.Signal.Delayed: instance Bounded a => Bounded (DSignal delay a)
- CLaSH.Signal.Delayed: instance CoArbitrary a => CoArbitrary (DSignal delay a)
- CLaSH.Signal.Delayed: instance Default a => Default (DSignal delay a)
- CLaSH.Signal.Delayed: instance Enum a => Enum (DSignal delay a)
- CLaSH.Signal.Delayed: instance Eq (DSignal delay a)
- CLaSH.Signal.Delayed: instance ExtendingNum a b => ExtendingNum (DSignal n a) (DSignal n b)
- CLaSH.Signal.Delayed: instance FiniteBits a => FiniteBits (DSignal delay a)
- CLaSH.Signal.Delayed: instance Foldable (DSignal delay)
- CLaSH.Signal.Delayed: instance Fractional a => Fractional (DSignal delay a)
- CLaSH.Signal.Delayed: instance Functor (DSignal delay)
- CLaSH.Signal.Delayed: instance Integral a => Integral (DSignal delay a)
- CLaSH.Signal.Delayed: instance Lift a => Lift (DSignal delay a)
- CLaSH.Signal.Delayed: instance Num a => Num (DSignal delay a)
- CLaSH.Signal.Delayed: instance Ord a => Ord (DSignal delay a)
- CLaSH.Signal.Delayed: instance SaturatingNum a => SaturatingNum (DSignal delay a)
- CLaSH.Signal.Delayed: instance Show a => Show (DSignal delay a)
- CLaSH.Signal.Delayed: instance Traversable (DSignal delay)
- CLaSH.Signal.Explicit: [Clk] :: Symbol -> Nat -> Clock
- CLaSH.Signal.Explicit: [SClock] :: SSymbol name -> SNat period -> SClock (Clk name period)
- CLaSH.Signal.Internal: [:-] :: a -> Signal' clk a -> Signal' a
- CLaSH.Signal.Internal: [Clk] :: Symbol -> Nat -> Clock
- CLaSH.Signal.Internal: [SClock] :: SSymbol name -> SNat period -> SClock (Clk name period)
- CLaSH.Signal.Internal: instance (Num a, Ord a) => Real (Signal' clk a)
- CLaSH.Signal.Internal: instance Applicative (Signal' clk)
- CLaSH.Signal.Internal: instance Arbitrary a => Arbitrary (Signal' clk a)
- CLaSH.Signal.Internal: instance Bits a => Bits (Signal' clk a)
- CLaSH.Signal.Internal: instance Bounded a => Bounded (Signal' clk a)
- CLaSH.Signal.Internal: instance CoArbitrary a => CoArbitrary (Signal' clk a)
- CLaSH.Signal.Internal: instance Default a => Default (Signal' clk a)
- CLaSH.Signal.Internal: instance Enum a => Enum (Signal' clk a)
- CLaSH.Signal.Internal: instance Eq (Signal' clk a)
- CLaSH.Signal.Internal: instance ExtendingNum a b => ExtendingNum (Signal' clk a) (Signal' clk b)
- CLaSH.Signal.Internal: instance FiniteBits a => FiniteBits (Signal' clk a)
- CLaSH.Signal.Internal: instance Foldable (Signal' clk)
- CLaSH.Signal.Internal: instance Fractional a => Fractional (Signal' clk a)
- CLaSH.Signal.Internal: instance Functor (Signal' clk)
- CLaSH.Signal.Internal: instance Integral a => Integral (Signal' clk a)
- CLaSH.Signal.Internal: instance Lift a => Lift (Signal' clk a)
- CLaSH.Signal.Internal: instance Num a => Num (Signal' clk a)
- CLaSH.Signal.Internal: instance Ord a => Ord (Signal' clk a)
- CLaSH.Signal.Internal: instance SaturatingNum a => SaturatingNum (Signal' clk a)
- CLaSH.Signal.Internal: instance Show (SClock clk)
- CLaSH.Signal.Internal: instance Show a => Show (Signal' clk a)
- CLaSH.Signal.Internal: instance Traversable (Signal' clk)
- CLaSH.Sized.Fixed: [Fixed] :: rep (int + frac) -> Fixed
- CLaSH.Sized.Fixed: instance (Lift (rep (int + frac)), KnownNat frac, KnownNat int, Typeable rep) => Lift (Fixed rep int frac)
- CLaSH.Sized.Fixed: instance (size ~ (int + frac), KnownNat frac, Integral (rep size)) => Show (Fixed rep int frac)
- CLaSH.Sized.Fixed: instance Arbitrary (rep (int + frac)) => Arbitrary (Fixed rep int frac)
- CLaSH.Sized.Fixed: instance BitPack (rep (int + frac)) => BitPack (Fixed rep int frac)
- CLaSH.Sized.Fixed: instance Bits (rep (int + frac)) => Bits (Fixed rep int frac)
- CLaSH.Sized.Fixed: instance Bounded (rep (int + frac)) => Bounded (Fixed rep int frac)
- CLaSH.Sized.Fixed: instance CoArbitrary (rep (int + frac)) => CoArbitrary (Fixed rep int frac)
- CLaSH.Sized.Fixed: instance Default (rep (int + frac)) => Default (Fixed rep int frac)
- CLaSH.Sized.Fixed: instance ENumFixedC rep int1 frac1 int2 frac2 => ExtendingNum (Fixed rep int1 frac1) (Fixed rep int2 frac2)
- CLaSH.Sized.Fixed: instance Enum (rep (int + frac)) => Enum (Fixed rep int frac)
- CLaSH.Sized.Fixed: instance Eq (rep (int + frac)) => Eq (Fixed rep int frac)
- CLaSH.Sized.Fixed: instance FracFixedC rep int frac => Fractional (Fixed rep int frac)
- CLaSH.Sized.Fixed: instance NumFixedC rep int frac => Num (Fixed rep int frac)
- CLaSH.Sized.Fixed: instance NumFixedC rep int frac => SaturatingNum (Fixed rep int frac)
- CLaSH.Sized.Fixed: instance Ord (rep (int + frac)) => Ord (Fixed rep int frac)
- CLaSH.Sized.Internal.BitVector: [BV] :: Integer -> BitVector
- CLaSH.Sized.Internal.BitVector: instance (KnownNat (Max m n + 1), KnownNat (m + n)) => ExtendingNum (BitVector m) (BitVector n)
- CLaSH.Sized.Internal.BitVector: instance (KnownNat n, KnownNat (n + 1), KnownNat (n + n)) => SaturatingNum (BitVector n)
- CLaSH.Sized.Internal.BitVector: instance Default (BitVector n)
- CLaSH.Sized.Internal.BitVector: instance Eq (BitVector n)
- CLaSH.Sized.Internal.BitVector: instance KnownNat n => Arbitrary (BitVector n)
- CLaSH.Sized.Internal.BitVector: instance KnownNat n => Bits (BitVector n)
- CLaSH.Sized.Internal.BitVector: instance KnownNat n => Bounded (BitVector n)
- CLaSH.Sized.Internal.BitVector: instance KnownNat n => CoArbitrary (BitVector n)
- CLaSH.Sized.Internal.BitVector: instance KnownNat n => Enum (BitVector n)
- CLaSH.Sized.Internal.BitVector: instance KnownNat n => FiniteBits (BitVector n)
- CLaSH.Sized.Internal.BitVector: instance KnownNat n => Integral (BitVector n)
- CLaSH.Sized.Internal.BitVector: instance KnownNat n => Ixed (BitVector n)
- CLaSH.Sized.Internal.BitVector: instance KnownNat n => Lift (BitVector n)
- CLaSH.Sized.Internal.BitVector: instance KnownNat n => Num (BitVector n)
- CLaSH.Sized.Internal.BitVector: instance KnownNat n => Real (BitVector n)
- CLaSH.Sized.Internal.BitVector: instance KnownNat n => Show (BitVector n)
- CLaSH.Sized.Internal.BitVector: instance Ord (BitVector n)
- CLaSH.Sized.Internal.BitVector: instance Resize BitVector
- CLaSH.Sized.Internal.Index: [I] :: Integer -> Index
- CLaSH.Sized.Internal.Index: instance Eq (Index n)
- CLaSH.Sized.Internal.Index: instance KnownNat n => Arbitrary (Index n)
- CLaSH.Sized.Internal.Index: instance KnownNat n => Bounded (Index n)
- CLaSH.Sized.Internal.Index: instance KnownNat n => CoArbitrary (Index n)
- CLaSH.Sized.Internal.Index: instance KnownNat n => Default (Index n)
- CLaSH.Sized.Internal.Index: instance KnownNat n => Enum (Index n)
- CLaSH.Sized.Internal.Index: instance KnownNat n => Integral (Index n)
- CLaSH.Sized.Internal.Index: instance KnownNat n => Lift (Index n)
- CLaSH.Sized.Internal.Index: instance KnownNat n => Num (Index n)
- CLaSH.Sized.Internal.Index: instance KnownNat n => Real (Index n)
- CLaSH.Sized.Internal.Index: instance Ord (Index n)
- CLaSH.Sized.Internal.Index: instance Show (Index n)
- CLaSH.Sized.Internal.Signed: [S] :: Integer -> Signed
- CLaSH.Sized.Internal.Signed: instance (KnownNat (1 + Max m n), KnownNat (m + n)) => ExtendingNum (Signed m) (Signed n)
- CLaSH.Sized.Internal.Signed: instance (KnownNat n, KnownNat (1 + n), KnownNat (n + n)) => SaturatingNum (Signed n)
- CLaSH.Sized.Internal.Signed: instance Eq (Signed n)
- CLaSH.Sized.Internal.Signed: instance KnownNat n => Arbitrary (Signed n)
- CLaSH.Sized.Internal.Signed: instance KnownNat n => BitPack (Signed n)
- CLaSH.Sized.Internal.Signed: instance KnownNat n => Bits (Signed n)
- CLaSH.Sized.Internal.Signed: instance KnownNat n => Bounded (Signed n)
- CLaSH.Sized.Internal.Signed: instance KnownNat n => CoArbitrary (Signed n)
- CLaSH.Sized.Internal.Signed: instance KnownNat n => Default (Signed n)
- CLaSH.Sized.Internal.Signed: instance KnownNat n => Enum (Signed n)
- CLaSH.Sized.Internal.Signed: instance KnownNat n => FiniteBits (Signed n)
- CLaSH.Sized.Internal.Signed: instance KnownNat n => Integral (Signed n)
- CLaSH.Sized.Internal.Signed: instance KnownNat n => Ixed (Signed n)
- CLaSH.Sized.Internal.Signed: instance KnownNat n => Lift (Signed n)
- CLaSH.Sized.Internal.Signed: instance KnownNat n => Num (Signed n)
- CLaSH.Sized.Internal.Signed: instance KnownNat n => Real (Signed n)
- CLaSH.Sized.Internal.Signed: instance Ord (Signed n)
- CLaSH.Sized.Internal.Signed: instance Resize Signed
- CLaSH.Sized.Internal.Signed: instance Show (Signed n)
- CLaSH.Sized.Internal.Unsigned: [U] :: Integer -> Unsigned
- CLaSH.Sized.Internal.Unsigned: instance (KnownNat (1 + Max m n), KnownNat (m + n)) => ExtendingNum (Unsigned m) (Unsigned n)
- CLaSH.Sized.Internal.Unsigned: instance (KnownNat n, KnownNat (1 + n), KnownNat (n + n)) => SaturatingNum (Unsigned n)
- CLaSH.Sized.Internal.Unsigned: instance BitPack (Unsigned n)
- CLaSH.Sized.Internal.Unsigned: instance Default (Unsigned n)
- CLaSH.Sized.Internal.Unsigned: instance Eq (Unsigned n)
- CLaSH.Sized.Internal.Unsigned: instance KnownNat n => Arbitrary (Unsigned n)
- CLaSH.Sized.Internal.Unsigned: instance KnownNat n => Bits (Unsigned n)
- CLaSH.Sized.Internal.Unsigned: instance KnownNat n => Bounded (Unsigned n)
- CLaSH.Sized.Internal.Unsigned: instance KnownNat n => CoArbitrary (Unsigned n)
- CLaSH.Sized.Internal.Unsigned: instance KnownNat n => Enum (Unsigned n)
- CLaSH.Sized.Internal.Unsigned: instance KnownNat n => FiniteBits (Unsigned n)
- CLaSH.Sized.Internal.Unsigned: instance KnownNat n => Integral (Unsigned n)
- CLaSH.Sized.Internal.Unsigned: instance KnownNat n => Ixed (Unsigned n)
- CLaSH.Sized.Internal.Unsigned: instance KnownNat n => Lift (Unsigned n)
- CLaSH.Sized.Internal.Unsigned: instance KnownNat n => Num (Unsigned n)
- CLaSH.Sized.Internal.Unsigned: instance KnownNat n => Real (Unsigned n)
- CLaSH.Sized.Internal.Unsigned: instance Ord (Unsigned n)
- CLaSH.Sized.Internal.Unsigned: instance Resize Unsigned
- CLaSH.Sized.Internal.Unsigned: instance Show (Unsigned n)
- CLaSH.Sized.Vector: [Cons] :: a -> Vec n a -> Vec (n + 1) a
- CLaSH.Sized.Vector: [Nil] :: Vec 0 a
- CLaSH.Sized.Vector: eq# :: Eq a => Vec n a -> Vec n a -> Bool
- CLaSH.Sized.Vector: instance (Default a, KnownNat n) => Default (Vec n a)
- CLaSH.Sized.Vector: instance (KnownNat m, m ~ (n + 1)) => Foldable (Vec m)
- CLaSH.Sized.Vector: instance (KnownNat m, m ~ (n + 1)) => Traversable (Vec m)
- CLaSH.Sized.Vector: instance (KnownNat n, Arbitrary a) => Arbitrary (Vec n a)
- CLaSH.Sized.Vector: instance (KnownNat n, KnownNat (BitSize a), BitPack a) => BitPack (Vec n a)
- CLaSH.Sized.Vector: instance CoArbitrary a => CoArbitrary (Vec n a)
- CLaSH.Sized.Vector: instance Eq a => Eq (Vec n a)
- CLaSH.Sized.Vector: instance Functor (Vec n)
- CLaSH.Sized.Vector: instance KnownNat n => Applicative (Vec n)
- CLaSH.Sized.Vector: instance KnownNat n => Ixed (Vec n a)
- CLaSH.Sized.Vector: instance Lift a => Lift (Vec n a)
- CLaSH.Sized.Vector: instance Ord a => Ord (Vec n a)
- CLaSH.Sized.Vector: instance Show a => Show (Vec n a)
- CLaSH.Sized.Vector: neq# :: Eq a => Vec n a -> Vec n a -> Bool
+ CLaSH.Annotations.TopEntity: ClockSource :: String -> Maybe (String, String) -> [(String, String)] -> Maybe (String, String) -> String -> Bool -> ClockSource
+ CLaSH.Annotations.TopEntity: TopEntity :: String -> [String] -> [String] -> [(String, Int)] -> [(String, Int)] -> [ClockSource] -> TopEntity
+ CLaSH.Annotations.TopEntity: instance Data.Data.Data CLaSH.Annotations.TopEntity.ClockSource
+ CLaSH.Annotations.TopEntity: instance Data.Data.Data CLaSH.Annotations.TopEntity.TopEntity
+ CLaSH.Annotations.TopEntity: instance GHC.Show.Show CLaSH.Annotations.TopEntity.ClockSource
+ CLaSH.Annotations.TopEntity: instance GHC.Show.Show CLaSH.Annotations.TopEntity.TopEntity
+ CLaSH.Class.BitPack: instance (GHC.TypeLits.KnownNat (CLaSH.Class.BitPack.BitSize b), CLaSH.Class.BitPack.BitPack a, CLaSH.Class.BitPack.BitPack b) => CLaSH.Class.BitPack.BitPack (a, b)
+ CLaSH.Class.BitPack: instance CLaSH.Class.BitPack.BitPack (CLaSH.Sized.Internal.BitVector.BitVector n)
+ CLaSH.Class.BitPack: instance CLaSH.Class.BitPack.BitPack GHC.Types.Bool
+ CLaSH.Class.Num: SatBound :: SaturationMode
+ CLaSH.Class.Num: SatSymmetric :: SaturationMode
+ CLaSH.Class.Num: SatWrap :: SaturationMode
+ CLaSH.Class.Num: SatZero :: SaturationMode
+ CLaSH.Class.Num: instance GHC.Classes.Eq CLaSH.Class.Num.SaturationMode
+ CLaSH.Prelude.DataFlow: instance (CLaSH.Prelude.DataFlow.LockStep a x, CLaSH.Prelude.DataFlow.LockStep b y) => CLaSH.Prelude.DataFlow.LockStep (a, b) (x, y)
+ CLaSH.Prelude.DataFlow: instance CLaSH.Prelude.DataFlow.LockStep GHC.Types.Bool c
+ CLaSH.Promoted.Nat: SNat :: (Proxy n) -> SNat
+ CLaSH.Promoted.Nat: USucc :: UNat n -> UNat (n + 1)
+ CLaSH.Promoted.Nat: UZero :: UNat 0
+ CLaSH.Promoted.Nat: instance GHC.Show.Show (CLaSH.Promoted.Nat.SNat n)
+ CLaSH.Promoted.Nat.Unsafe: unsafeSNat :: Integer -> SNat k
+ CLaSH.Promoted.Symbol: SSymbol :: (Proxy s) -> SSymbol
+ CLaSH.Promoted.Symbol: instance GHC.Show.Show (CLaSH.Promoted.Symbol.SSymbol s)
+ CLaSH.Signal.Bundle: instance CLaSH.Signal.Bundle.Bundle ()
+ CLaSH.Signal.Bundle: instance CLaSH.Signal.Bundle.Bundle (CLaSH.Sized.Fixed.Fixed rep int frac)
+ CLaSH.Signal.Bundle: instance CLaSH.Signal.Bundle.Bundle (CLaSH.Sized.Internal.BitVector.BitVector n)
+ CLaSH.Signal.Bundle: instance CLaSH.Signal.Bundle.Bundle (CLaSH.Sized.Internal.Index.Index n)
+ CLaSH.Signal.Bundle: instance CLaSH.Signal.Bundle.Bundle (CLaSH.Sized.Internal.Signed.Signed n)
+ CLaSH.Signal.Bundle: instance CLaSH.Signal.Bundle.Bundle (CLaSH.Sized.Internal.Unsigned.Unsigned n)
+ CLaSH.Signal.Bundle: instance CLaSH.Signal.Bundle.Bundle (Data.Either.Either a b)
+ CLaSH.Signal.Bundle: instance CLaSH.Signal.Bundle.Bundle (GHC.Base.Maybe a)
+ CLaSH.Signal.Bundle: instance CLaSH.Signal.Bundle.Bundle (a, b)
+ CLaSH.Signal.Bundle: instance CLaSH.Signal.Bundle.Bundle (a, b, c)
+ CLaSH.Signal.Bundle: instance CLaSH.Signal.Bundle.Bundle (a, b, c, d)
+ CLaSH.Signal.Bundle: instance CLaSH.Signal.Bundle.Bundle (a, b, c, d, e)
+ CLaSH.Signal.Bundle: instance CLaSH.Signal.Bundle.Bundle (a, b, c, d, e, f)
+ CLaSH.Signal.Bundle: instance CLaSH.Signal.Bundle.Bundle (a, b, c, d, e, f, g)
+ CLaSH.Signal.Bundle: instance CLaSH.Signal.Bundle.Bundle (a, b, c, d, e, f, g, h)
+ CLaSH.Signal.Bundle: instance CLaSH.Signal.Bundle.Bundle GHC.Integer.Type.Integer
+ CLaSH.Signal.Bundle: instance CLaSH.Signal.Bundle.Bundle GHC.Types.Bool
+ CLaSH.Signal.Bundle: instance CLaSH.Signal.Bundle.Bundle GHC.Types.Double
+ CLaSH.Signal.Bundle: instance CLaSH.Signal.Bundle.Bundle GHC.Types.Float
+ CLaSH.Signal.Bundle: instance CLaSH.Signal.Bundle.Bundle GHC.Types.Int
+ CLaSH.Signal.Bundle: instance GHC.TypeLits.KnownNat n => CLaSH.Signal.Bundle.Bundle (CLaSH.Sized.Vector.Vec n a)
+ CLaSH.Signal.Delayed: instance (GHC.Num.Num a, GHC.Classes.Ord a) => GHC.Real.Real (CLaSH.Signal.Delayed.DSignal delay a)
+ CLaSH.Signal.Delayed: instance CLaSH.Class.Num.ExtendingNum a b => CLaSH.Class.Num.ExtendingNum (CLaSH.Signal.Delayed.DSignal n a) (CLaSH.Signal.Delayed.DSignal n b)
+ CLaSH.Signal.Delayed: instance CLaSH.Class.Num.SaturatingNum a => CLaSH.Class.Num.SaturatingNum (CLaSH.Signal.Delayed.DSignal delay a)
+ CLaSH.Signal.Delayed: instance Data.Bits.Bits a => Data.Bits.Bits (CLaSH.Signal.Delayed.DSignal delay a)
+ CLaSH.Signal.Delayed: instance Data.Bits.FiniteBits a => Data.Bits.FiniteBits (CLaSH.Signal.Delayed.DSignal delay a)
+ CLaSH.Signal.Delayed: instance Data.Default.Class.Default a => Data.Default.Class.Default (CLaSH.Signal.Delayed.DSignal delay a)
+ CLaSH.Signal.Delayed: instance Data.Foldable.Foldable (CLaSH.Signal.Delayed.DSignal delay)
+ CLaSH.Signal.Delayed: instance Data.Traversable.Traversable (CLaSH.Signal.Delayed.DSignal delay)
+ CLaSH.Signal.Delayed: instance GHC.Base.Applicative (CLaSH.Signal.Delayed.DSignal delay)
+ CLaSH.Signal.Delayed: instance GHC.Base.Functor (CLaSH.Signal.Delayed.DSignal delay)
+ CLaSH.Signal.Delayed: instance GHC.Classes.Eq (CLaSH.Signal.Delayed.DSignal delay a)
+ CLaSH.Signal.Delayed: instance GHC.Classes.Ord a => GHC.Classes.Ord (CLaSH.Signal.Delayed.DSignal delay a)
+ CLaSH.Signal.Delayed: instance GHC.Enum.Bounded a => GHC.Enum.Bounded (CLaSH.Signal.Delayed.DSignal delay a)
+ CLaSH.Signal.Delayed: instance GHC.Enum.Enum a => GHC.Enum.Enum (CLaSH.Signal.Delayed.DSignal delay a)
+ CLaSH.Signal.Delayed: instance GHC.Num.Num a => GHC.Num.Num (CLaSH.Signal.Delayed.DSignal delay a)
+ CLaSH.Signal.Delayed: instance GHC.Real.Fractional a => GHC.Real.Fractional (CLaSH.Signal.Delayed.DSignal delay a)
+ CLaSH.Signal.Delayed: instance GHC.Real.Integral a => GHC.Real.Integral (CLaSH.Signal.Delayed.DSignal delay a)
+ CLaSH.Signal.Delayed: instance GHC.Show.Show a => GHC.Show.Show (CLaSH.Signal.Delayed.DSignal delay a)
+ CLaSH.Signal.Delayed: instance Language.Haskell.TH.Syntax.Lift a => Language.Haskell.TH.Syntax.Lift (CLaSH.Signal.Delayed.DSignal delay a)
+ CLaSH.Signal.Delayed: instance Test.QuickCheck.Arbitrary.Arbitrary a => Test.QuickCheck.Arbitrary.Arbitrary (CLaSH.Signal.Delayed.DSignal delay a)
+ CLaSH.Signal.Delayed: instance Test.QuickCheck.Arbitrary.CoArbitrary a => Test.QuickCheck.Arbitrary.CoArbitrary (CLaSH.Signal.Delayed.DSignal delay a)
+ CLaSH.Signal.Explicit: Clk :: Symbol -> Nat -> Clock
+ CLaSH.Signal.Explicit: SClock :: SSymbol name -> SNat period -> SClock (Clk name period)
+ CLaSH.Signal.Internal: (:-) :: a -> Signal' clk a -> Signal' a
+ CLaSH.Signal.Internal: Clk :: Symbol -> Nat -> Clock
+ CLaSH.Signal.Internal: SClock :: SSymbol name -> SNat period -> SClock (Clk name period)
+ CLaSH.Signal.Internal: instance (GHC.Num.Num a, GHC.Classes.Ord a) => GHC.Real.Real (CLaSH.Signal.Internal.Signal' clk a)
+ CLaSH.Signal.Internal: instance CLaSH.Class.Num.ExtendingNum a b => CLaSH.Class.Num.ExtendingNum (CLaSH.Signal.Internal.Signal' clk a) (CLaSH.Signal.Internal.Signal' clk b)
+ CLaSH.Signal.Internal: instance CLaSH.Class.Num.SaturatingNum a => CLaSH.Class.Num.SaturatingNum (CLaSH.Signal.Internal.Signal' clk a)
+ CLaSH.Signal.Internal: instance Data.Bits.Bits a => Data.Bits.Bits (CLaSH.Signal.Internal.Signal' clk a)
+ CLaSH.Signal.Internal: instance Data.Bits.FiniteBits a => Data.Bits.FiniteBits (CLaSH.Signal.Internal.Signal' clk a)
+ CLaSH.Signal.Internal: instance Data.Default.Class.Default a => Data.Default.Class.Default (CLaSH.Signal.Internal.Signal' clk a)
+ CLaSH.Signal.Internal: instance Data.Foldable.Foldable (CLaSH.Signal.Internal.Signal' clk)
+ CLaSH.Signal.Internal: instance Data.Traversable.Traversable (CLaSH.Signal.Internal.Signal' clk)
+ CLaSH.Signal.Internal: instance GHC.Base.Applicative (CLaSH.Signal.Internal.Signal' clk)
+ CLaSH.Signal.Internal: instance GHC.Base.Functor (CLaSH.Signal.Internal.Signal' clk)
+ CLaSH.Signal.Internal: instance GHC.Classes.Eq (CLaSH.Signal.Internal.Signal' clk a)
+ CLaSH.Signal.Internal: instance GHC.Classes.Ord a => GHC.Classes.Ord (CLaSH.Signal.Internal.Signal' clk a)
+ CLaSH.Signal.Internal: instance GHC.Enum.Bounded a => GHC.Enum.Bounded (CLaSH.Signal.Internal.Signal' clk a)
+ CLaSH.Signal.Internal: instance GHC.Enum.Enum a => GHC.Enum.Enum (CLaSH.Signal.Internal.Signal' clk a)
+ CLaSH.Signal.Internal: instance GHC.Num.Num a => GHC.Num.Num (CLaSH.Signal.Internal.Signal' clk a)
+ CLaSH.Signal.Internal: instance GHC.Real.Fractional a => GHC.Real.Fractional (CLaSH.Signal.Internal.Signal' clk a)
+ CLaSH.Signal.Internal: instance GHC.Real.Integral a => GHC.Real.Integral (CLaSH.Signal.Internal.Signal' clk a)
+ CLaSH.Signal.Internal: instance GHC.Show.Show (CLaSH.Signal.Internal.SClock clk)
+ CLaSH.Signal.Internal: instance GHC.Show.Show a => GHC.Show.Show (CLaSH.Signal.Internal.Signal' clk a)
+ CLaSH.Signal.Internal: instance Language.Haskell.TH.Syntax.Lift a => Language.Haskell.TH.Syntax.Lift (CLaSH.Signal.Internal.Signal' clk a)
+ CLaSH.Signal.Internal: instance Test.QuickCheck.Arbitrary.Arbitrary a => Test.QuickCheck.Arbitrary.Arbitrary (CLaSH.Signal.Internal.Signal' clk a)
+ CLaSH.Signal.Internal: instance Test.QuickCheck.Arbitrary.CoArbitrary a => Test.QuickCheck.Arbitrary.CoArbitrary (CLaSH.Signal.Internal.Signal' clk a)
+ CLaSH.Sized.Fixed: Fixed :: rep (int + frac) -> Fixed
+ CLaSH.Sized.Fixed: instance (Language.Haskell.TH.Syntax.Lift (rep (int GHC.TypeLits.+ frac)), GHC.TypeLits.KnownNat frac, GHC.TypeLits.KnownNat int, Data.Typeable.Internal.Typeable rep) => Language.Haskell.TH.Syntax.Lift (CLaSH.Sized.Fixed.Fixed rep int frac)
+ CLaSH.Sized.Fixed: instance (size ~ (int GHC.TypeLits.+ frac), GHC.TypeLits.KnownNat frac, GHC.Real.Integral (rep size)) => GHC.Show.Show (CLaSH.Sized.Fixed.Fixed rep int frac)
+ CLaSH.Sized.Fixed: instance CLaSH.Class.BitPack.BitPack (rep (int GHC.TypeLits.+ frac)) => CLaSH.Class.BitPack.BitPack (CLaSH.Sized.Fixed.Fixed rep int frac)
+ CLaSH.Sized.Fixed: instance CLaSH.Sized.Fixed.ENumFixedC rep int1 frac1 int2 frac2 => CLaSH.Class.Num.ExtendingNum (CLaSH.Sized.Fixed.Fixed rep int1 frac1) (CLaSH.Sized.Fixed.Fixed rep int2 frac2)
+ CLaSH.Sized.Fixed: instance CLaSH.Sized.Fixed.FracFixedC rep int frac => GHC.Real.Fractional (CLaSH.Sized.Fixed.Fixed rep int frac)
+ CLaSH.Sized.Fixed: instance CLaSH.Sized.Fixed.NumFixedC rep int frac => CLaSH.Class.Num.SaturatingNum (CLaSH.Sized.Fixed.Fixed rep int frac)
+ CLaSH.Sized.Fixed: instance CLaSH.Sized.Fixed.NumFixedC rep int frac => GHC.Num.Num (CLaSH.Sized.Fixed.Fixed rep int frac)
+ CLaSH.Sized.Fixed: instance Data.Bits.Bits (rep (int GHC.TypeLits.+ frac)) => Data.Bits.Bits (CLaSH.Sized.Fixed.Fixed rep int frac)
+ CLaSH.Sized.Fixed: instance Data.Default.Class.Default (rep (int GHC.TypeLits.+ frac)) => Data.Default.Class.Default (CLaSH.Sized.Fixed.Fixed rep int frac)
+ CLaSH.Sized.Fixed: instance GHC.Classes.Eq (rep (int GHC.TypeLits.+ frac)) => GHC.Classes.Eq (CLaSH.Sized.Fixed.Fixed rep int frac)
+ CLaSH.Sized.Fixed: instance GHC.Classes.Ord (rep (int GHC.TypeLits.+ frac)) => GHC.Classes.Ord (CLaSH.Sized.Fixed.Fixed rep int frac)
+ CLaSH.Sized.Fixed: instance GHC.Enum.Bounded (rep (int GHC.TypeLits.+ frac)) => GHC.Enum.Bounded (CLaSH.Sized.Fixed.Fixed rep int frac)
+ CLaSH.Sized.Fixed: instance GHC.Enum.Enum (rep (int GHC.TypeLits.+ frac)) => GHC.Enum.Enum (CLaSH.Sized.Fixed.Fixed rep int frac)
+ CLaSH.Sized.Fixed: instance Test.QuickCheck.Arbitrary.Arbitrary (rep (int GHC.TypeLits.+ frac)) => Test.QuickCheck.Arbitrary.Arbitrary (CLaSH.Sized.Fixed.Fixed rep int frac)
+ CLaSH.Sized.Fixed: instance Test.QuickCheck.Arbitrary.CoArbitrary (rep (int GHC.TypeLits.+ frac)) => Test.QuickCheck.Arbitrary.CoArbitrary (CLaSH.Sized.Fixed.Fixed rep int frac)
+ CLaSH.Sized.Internal.BitVector: BV :: Integer -> BitVector
+ CLaSH.Sized.Internal.BitVector: instance (GHC.TypeLits.KnownNat (CLaSH.Promoted.Ord.Max m n GHC.TypeLits.+ 1), GHC.TypeLits.KnownNat (m GHC.TypeLits.+ n)) => CLaSH.Class.Num.ExtendingNum (CLaSH.Sized.Internal.BitVector.BitVector m) (CLaSH.Sized.Internal.BitVector.BitVector n)
+ CLaSH.Sized.Internal.BitVector: instance (GHC.TypeLits.KnownNat n, GHC.TypeLits.KnownNat (n GHC.TypeLits.+ 1), GHC.TypeLits.KnownNat (n GHC.TypeLits.+ n)) => CLaSH.Class.Num.SaturatingNum (CLaSH.Sized.Internal.BitVector.BitVector n)
+ CLaSH.Sized.Internal.BitVector: instance CLaSH.Class.Resize.Resize CLaSH.Sized.Internal.BitVector.BitVector
+ CLaSH.Sized.Internal.BitVector: instance Data.Default.Class.Default (CLaSH.Sized.Internal.BitVector.BitVector n)
+ CLaSH.Sized.Internal.BitVector: instance GHC.Classes.Eq (CLaSH.Sized.Internal.BitVector.BitVector n)
+ CLaSH.Sized.Internal.BitVector: instance GHC.Classes.Ord (CLaSH.Sized.Internal.BitVector.BitVector n)
+ CLaSH.Sized.Internal.BitVector: instance GHC.TypeLits.KnownNat n => Control.Lens.At.Ixed (CLaSH.Sized.Internal.BitVector.BitVector n)
+ CLaSH.Sized.Internal.BitVector: instance GHC.TypeLits.KnownNat n => Data.Bits.Bits (CLaSH.Sized.Internal.BitVector.BitVector n)
+ CLaSH.Sized.Internal.BitVector: instance GHC.TypeLits.KnownNat n => Data.Bits.FiniteBits (CLaSH.Sized.Internal.BitVector.BitVector n)
+ CLaSH.Sized.Internal.BitVector: instance GHC.TypeLits.KnownNat n => GHC.Enum.Bounded (CLaSH.Sized.Internal.BitVector.BitVector n)
+ CLaSH.Sized.Internal.BitVector: instance GHC.TypeLits.KnownNat n => GHC.Enum.Enum (CLaSH.Sized.Internal.BitVector.BitVector n)
+ CLaSH.Sized.Internal.BitVector: instance GHC.TypeLits.KnownNat n => GHC.Num.Num (CLaSH.Sized.Internal.BitVector.BitVector n)
+ CLaSH.Sized.Internal.BitVector: instance GHC.TypeLits.KnownNat n => GHC.Real.Integral (CLaSH.Sized.Internal.BitVector.BitVector n)
+ CLaSH.Sized.Internal.BitVector: instance GHC.TypeLits.KnownNat n => GHC.Real.Real (CLaSH.Sized.Internal.BitVector.BitVector n)
+ CLaSH.Sized.Internal.BitVector: instance GHC.TypeLits.KnownNat n => GHC.Show.Show (CLaSH.Sized.Internal.BitVector.BitVector n)
+ CLaSH.Sized.Internal.BitVector: instance GHC.TypeLits.KnownNat n => Language.Haskell.TH.Syntax.Lift (CLaSH.Sized.Internal.BitVector.BitVector n)
+ CLaSH.Sized.Internal.BitVector: instance GHC.TypeLits.KnownNat n => Test.QuickCheck.Arbitrary.Arbitrary (CLaSH.Sized.Internal.BitVector.BitVector n)
+ CLaSH.Sized.Internal.BitVector: instance GHC.TypeLits.KnownNat n => Test.QuickCheck.Arbitrary.CoArbitrary (CLaSH.Sized.Internal.BitVector.BitVector n)
+ CLaSH.Sized.Internal.Index: I :: Integer -> Index
+ CLaSH.Sized.Internal.Index: instance GHC.Classes.Eq (CLaSH.Sized.Internal.Index.Index n)
+ CLaSH.Sized.Internal.Index: instance GHC.Classes.Ord (CLaSH.Sized.Internal.Index.Index n)
+ CLaSH.Sized.Internal.Index: instance GHC.Show.Show (CLaSH.Sized.Internal.Index.Index n)
+ CLaSH.Sized.Internal.Index: instance GHC.TypeLits.KnownNat n => Data.Default.Class.Default (CLaSH.Sized.Internal.Index.Index n)
+ CLaSH.Sized.Internal.Index: instance GHC.TypeLits.KnownNat n => GHC.Enum.Bounded (CLaSH.Sized.Internal.Index.Index n)
+ CLaSH.Sized.Internal.Index: instance GHC.TypeLits.KnownNat n => GHC.Enum.Enum (CLaSH.Sized.Internal.Index.Index n)
+ CLaSH.Sized.Internal.Index: instance GHC.TypeLits.KnownNat n => GHC.Num.Num (CLaSH.Sized.Internal.Index.Index n)
+ CLaSH.Sized.Internal.Index: instance GHC.TypeLits.KnownNat n => GHC.Real.Integral (CLaSH.Sized.Internal.Index.Index n)
+ CLaSH.Sized.Internal.Index: instance GHC.TypeLits.KnownNat n => GHC.Real.Real (CLaSH.Sized.Internal.Index.Index n)
+ CLaSH.Sized.Internal.Index: instance GHC.TypeLits.KnownNat n => Language.Haskell.TH.Syntax.Lift (CLaSH.Sized.Internal.Index.Index n)
+ CLaSH.Sized.Internal.Index: instance GHC.TypeLits.KnownNat n => Test.QuickCheck.Arbitrary.Arbitrary (CLaSH.Sized.Internal.Index.Index n)
+ CLaSH.Sized.Internal.Index: instance GHC.TypeLits.KnownNat n => Test.QuickCheck.Arbitrary.CoArbitrary (CLaSH.Sized.Internal.Index.Index n)
+ CLaSH.Sized.Internal.Signed: S :: Integer -> Signed
+ CLaSH.Sized.Internal.Signed: instance (GHC.TypeLits.KnownNat (1 GHC.TypeLits.+ CLaSH.Promoted.Ord.Max m n), GHC.TypeLits.KnownNat (m GHC.TypeLits.+ n)) => CLaSH.Class.Num.ExtendingNum (CLaSH.Sized.Internal.Signed.Signed m) (CLaSH.Sized.Internal.Signed.Signed n)
+ CLaSH.Sized.Internal.Signed: instance (GHC.TypeLits.KnownNat n, GHC.TypeLits.KnownNat (1 GHC.TypeLits.+ n), GHC.TypeLits.KnownNat (n GHC.TypeLits.+ n)) => CLaSH.Class.Num.SaturatingNum (CLaSH.Sized.Internal.Signed.Signed n)
+ CLaSH.Sized.Internal.Signed: instance CLaSH.Class.Resize.Resize CLaSH.Sized.Internal.Signed.Signed
+ CLaSH.Sized.Internal.Signed: instance GHC.Classes.Eq (CLaSH.Sized.Internal.Signed.Signed n)
+ CLaSH.Sized.Internal.Signed: instance GHC.Classes.Ord (CLaSH.Sized.Internal.Signed.Signed n)
+ CLaSH.Sized.Internal.Signed: instance GHC.Show.Show (CLaSH.Sized.Internal.Signed.Signed n)
+ CLaSH.Sized.Internal.Signed: instance GHC.TypeLits.KnownNat n => CLaSH.Class.BitPack.BitPack (CLaSH.Sized.Internal.Signed.Signed n)
+ CLaSH.Sized.Internal.Signed: instance GHC.TypeLits.KnownNat n => Control.Lens.At.Ixed (CLaSH.Sized.Internal.Signed.Signed n)
+ CLaSH.Sized.Internal.Signed: instance GHC.TypeLits.KnownNat n => Data.Bits.Bits (CLaSH.Sized.Internal.Signed.Signed n)
+ CLaSH.Sized.Internal.Signed: instance GHC.TypeLits.KnownNat n => Data.Bits.FiniteBits (CLaSH.Sized.Internal.Signed.Signed n)
+ CLaSH.Sized.Internal.Signed: instance GHC.TypeLits.KnownNat n => Data.Default.Class.Default (CLaSH.Sized.Internal.Signed.Signed n)
+ CLaSH.Sized.Internal.Signed: instance GHC.TypeLits.KnownNat n => GHC.Enum.Bounded (CLaSH.Sized.Internal.Signed.Signed n)
+ CLaSH.Sized.Internal.Signed: instance GHC.TypeLits.KnownNat n => GHC.Enum.Enum (CLaSH.Sized.Internal.Signed.Signed n)
+ CLaSH.Sized.Internal.Signed: instance GHC.TypeLits.KnownNat n => GHC.Num.Num (CLaSH.Sized.Internal.Signed.Signed n)
+ CLaSH.Sized.Internal.Signed: instance GHC.TypeLits.KnownNat n => GHC.Real.Integral (CLaSH.Sized.Internal.Signed.Signed n)
+ CLaSH.Sized.Internal.Signed: instance GHC.TypeLits.KnownNat n => GHC.Real.Real (CLaSH.Sized.Internal.Signed.Signed n)
+ CLaSH.Sized.Internal.Signed: instance GHC.TypeLits.KnownNat n => Language.Haskell.TH.Syntax.Lift (CLaSH.Sized.Internal.Signed.Signed n)
+ CLaSH.Sized.Internal.Signed: instance GHC.TypeLits.KnownNat n => Test.QuickCheck.Arbitrary.Arbitrary (CLaSH.Sized.Internal.Signed.Signed n)
+ CLaSH.Sized.Internal.Signed: instance GHC.TypeLits.KnownNat n => Test.QuickCheck.Arbitrary.CoArbitrary (CLaSH.Sized.Internal.Signed.Signed n)
+ CLaSH.Sized.Internal.Unsigned: U :: Integer -> Unsigned
+ CLaSH.Sized.Internal.Unsigned: instance (GHC.TypeLits.KnownNat (1 GHC.TypeLits.+ CLaSH.Promoted.Ord.Max m n), GHC.TypeLits.KnownNat (m GHC.TypeLits.+ n)) => CLaSH.Class.Num.ExtendingNum (CLaSH.Sized.Internal.Unsigned.Unsigned m) (CLaSH.Sized.Internal.Unsigned.Unsigned n)
+ CLaSH.Sized.Internal.Unsigned: instance (GHC.TypeLits.KnownNat n, GHC.TypeLits.KnownNat (1 GHC.TypeLits.+ n), GHC.TypeLits.KnownNat (n GHC.TypeLits.+ n)) => CLaSH.Class.Num.SaturatingNum (CLaSH.Sized.Internal.Unsigned.Unsigned n)
+ CLaSH.Sized.Internal.Unsigned: instance CLaSH.Class.BitPack.BitPack (CLaSH.Sized.Internal.Unsigned.Unsigned n)
+ CLaSH.Sized.Internal.Unsigned: instance CLaSH.Class.Resize.Resize CLaSH.Sized.Internal.Unsigned.Unsigned
+ CLaSH.Sized.Internal.Unsigned: instance Data.Default.Class.Default (CLaSH.Sized.Internal.Unsigned.Unsigned n)
+ CLaSH.Sized.Internal.Unsigned: instance GHC.Classes.Eq (CLaSH.Sized.Internal.Unsigned.Unsigned n)
+ CLaSH.Sized.Internal.Unsigned: instance GHC.Classes.Ord (CLaSH.Sized.Internal.Unsigned.Unsigned n)
+ CLaSH.Sized.Internal.Unsigned: instance GHC.Show.Show (CLaSH.Sized.Internal.Unsigned.Unsigned n)
+ CLaSH.Sized.Internal.Unsigned: instance GHC.TypeLits.KnownNat n => Control.Lens.At.Ixed (CLaSH.Sized.Internal.Unsigned.Unsigned n)
+ CLaSH.Sized.Internal.Unsigned: instance GHC.TypeLits.KnownNat n => Data.Bits.Bits (CLaSH.Sized.Internal.Unsigned.Unsigned n)
+ CLaSH.Sized.Internal.Unsigned: instance GHC.TypeLits.KnownNat n => Data.Bits.FiniteBits (CLaSH.Sized.Internal.Unsigned.Unsigned n)
+ CLaSH.Sized.Internal.Unsigned: instance GHC.TypeLits.KnownNat n => GHC.Enum.Bounded (CLaSH.Sized.Internal.Unsigned.Unsigned n)
+ CLaSH.Sized.Internal.Unsigned: instance GHC.TypeLits.KnownNat n => GHC.Enum.Enum (CLaSH.Sized.Internal.Unsigned.Unsigned n)
+ CLaSH.Sized.Internal.Unsigned: instance GHC.TypeLits.KnownNat n => GHC.Num.Num (CLaSH.Sized.Internal.Unsigned.Unsigned n)
+ CLaSH.Sized.Internal.Unsigned: instance GHC.TypeLits.KnownNat n => GHC.Real.Integral (CLaSH.Sized.Internal.Unsigned.Unsigned n)
+ CLaSH.Sized.Internal.Unsigned: instance GHC.TypeLits.KnownNat n => GHC.Real.Real (CLaSH.Sized.Internal.Unsigned.Unsigned n)
+ CLaSH.Sized.Internal.Unsigned: instance GHC.TypeLits.KnownNat n => Language.Haskell.TH.Syntax.Lift (CLaSH.Sized.Internal.Unsigned.Unsigned n)
+ CLaSH.Sized.Internal.Unsigned: instance GHC.TypeLits.KnownNat n => Test.QuickCheck.Arbitrary.Arbitrary (CLaSH.Sized.Internal.Unsigned.Unsigned n)
+ CLaSH.Sized.Internal.Unsigned: instance GHC.TypeLits.KnownNat n => Test.QuickCheck.Arbitrary.CoArbitrary (CLaSH.Sized.Internal.Unsigned.Unsigned n)
+ CLaSH.Sized.Vector: Cons :: a -> Vec n a -> Vec (n + 1) a
+ CLaSH.Sized.Vector: Nil :: Vec 0 a
+ CLaSH.Sized.Vector: bv2v :: KnownNat n => BitVector n -> Vec n Bit
+ CLaSH.Sized.Vector: data VCons (a :: *) (f :: TyFun Nat *) :: *
+ CLaSH.Sized.Vector: instance (Data.Default.Class.Default a, GHC.TypeLits.KnownNat n) => Data.Default.Class.Default (CLaSH.Sized.Vector.Vec n a)
+ CLaSH.Sized.Vector: instance (GHC.TypeLits.KnownNat m, m ~ (n GHC.TypeLits.+ 1)) => Data.Foldable.Foldable (CLaSH.Sized.Vector.Vec m)
+ CLaSH.Sized.Vector: instance (GHC.TypeLits.KnownNat m, m ~ (n GHC.TypeLits.+ 1)) => Data.Traversable.Traversable (CLaSH.Sized.Vector.Vec m)
+ CLaSH.Sized.Vector: instance (GHC.TypeLits.KnownNat n, GHC.TypeLits.KnownNat (CLaSH.Class.BitPack.BitSize a), CLaSH.Class.BitPack.BitPack a) => CLaSH.Class.BitPack.BitPack (CLaSH.Sized.Vector.Vec n a)
+ CLaSH.Sized.Vector: instance (GHC.TypeLits.KnownNat n, Test.QuickCheck.Arbitrary.Arbitrary a) => Test.QuickCheck.Arbitrary.Arbitrary (CLaSH.Sized.Vector.Vec n a)
+ CLaSH.Sized.Vector: instance GHC.Base.Functor (CLaSH.Sized.Vector.Vec n)
+ CLaSH.Sized.Vector: instance GHC.Classes.Eq a => GHC.Classes.Eq (CLaSH.Sized.Vector.Vec n a)
+ CLaSH.Sized.Vector: instance GHC.Classes.Ord a => GHC.Classes.Ord (CLaSH.Sized.Vector.Vec n a)
+ CLaSH.Sized.Vector: instance GHC.Show.Show a => GHC.Show.Show (CLaSH.Sized.Vector.Vec n a)
+ CLaSH.Sized.Vector: instance GHC.TypeLits.KnownNat n => Control.Lens.At.Ixed (CLaSH.Sized.Vector.Vec n a)
+ CLaSH.Sized.Vector: instance GHC.TypeLits.KnownNat n => GHC.Base.Applicative (CLaSH.Sized.Vector.Vec n)
+ CLaSH.Sized.Vector: instance Language.Haskell.TH.Syntax.Lift a => Language.Haskell.TH.Syntax.Lift (CLaSH.Sized.Vector.Vec n a)
+ CLaSH.Sized.Vector: instance Test.QuickCheck.Arbitrary.CoArbitrary a => Test.QuickCheck.Arbitrary.CoArbitrary (CLaSH.Sized.Vector.Vec n a)
+ CLaSH.Sized.Vector: smap :: KnownNat k => (forall l. SNat ((k - 1) - l) -> a -> b) -> Vec k a -> Vec k b
+ CLaSH.Sized.Vector: v2bv :: KnownNat n => Vec n Bit -> BitVector n
- CLaSH.Promoted.Nat: addSNat :: KnownNat (a + b) => SNat a -> SNat b -> SNat (a + b)
+ CLaSH.Promoted.Nat: addSNat :: SNat a -> SNat b -> SNat (a + b)
- CLaSH.Promoted.Nat: mulSNat :: KnownNat (a * b) => SNat a -> SNat b -> SNat (a * b)
+ CLaSH.Promoted.Nat: mulSNat :: SNat a -> SNat b -> SNat (a * b)
- CLaSH.Promoted.Nat: powSNat :: KnownNat (a ^ b) => SNat a -> SNat b -> SNat (a ^ b)
+ CLaSH.Promoted.Nat: powSNat :: SNat a -> SNat b -> SNat (a ^ b)
- CLaSH.Promoted.Nat: subSNat :: KnownNat (a - b) => SNat a -> SNat b -> SNat (a - b)
+ CLaSH.Promoted.Nat: subSNat :: SNat a -> SNat b -> SNat (a - b)
- CLaSH.Sized.Vector: dfold :: Proxy (p :: TyFun Nat * -> *) -> (forall l. Proxy l -> a -> (p $ l) -> (p $ (l + 1))) -> (p $ 0) -> Vec k a -> (p $ k)
+ CLaSH.Sized.Vector: dfold :: KnownNat k => Proxy (p :: TyFun Nat * -> *) -> (forall l. SNat l -> a -> (p $ l) -> (p $ (l + 1))) -> (p $ 0) -> Vec k a -> (p $ k)
- CLaSH.Sized.Vector: rotateLeftS :: Vec (d + n) a -> SNat d -> Vec (n + d) a
+ CLaSH.Sized.Vector: rotateLeftS :: KnownNat n => Vec n a -> SNat d -> Vec n a
- CLaSH.Sized.Vector: rotateRightS :: (KnownNat n) => Vec (n + d) a -> SNat d -> Vec (d + n) a
+ CLaSH.Sized.Vector: rotateRightS :: KnownNat n => Vec n a -> SNat d -> Vec n a
- CLaSH.Sized.Vector: vfold :: (forall l. a -> Vec l b -> Vec (l + 1) b) -> Vec k a -> Vec k b
+ CLaSH.Sized.Vector: vfold :: KnownNat k => (forall l. a -> Vec l b -> Vec (l + 1) b) -> Vec k a -> Vec k b

Files

CHANGELOG.md view
@@ -1,5 +1,11 @@ # Changelog for [`clash-prelude` package](http://hackage.haskell.org/package/clash-prelude) +## 0.10.1 *October 16th 2015*+* New features:+  * The `f` in `dfold p f`, now has an `SNat l` instead of a `Proxy l` as its first argument.+  * Add `bv2v` and `v2bv` functions that convert between `Vec n Bit` and `BitVector n`.+  * Add `smap`: apply a function to every element of a vector and the element's position (as an 'SNat' value) in the vector.+ ## 0.10 *October 3rd 2015* * New features:   * The Vec constructor `:>` is now an explicitly bidirectional pattern synonym (the actual constructor has been renamed to Cons).
clash-prelude.cabal view
@@ -1,5 +1,5 @@ Name:                 clash-prelude-Version:              0.10+Version:              0.10.1 Synopsis:             CAES Language for Synchronous Hardware - Prelude library Description:   CλaSH (pronounced ‘clash’) is a functional hardware description language that@@ -103,8 +103,9 @@                       CLaSH.Prelude.Testbench                        CLaSH.Promoted.Nat-                      CLaSH.Promoted.Nat.TH                       CLaSH.Promoted.Nat.Literals+                      CLaSH.Promoted.Nat.TH+                      CLaSH.Promoted.Nat.Unsafe                       CLaSH.Promoted.Ord                       CLaSH.Promoted.Symbol @@ -157,6 +158,7 @@                       ghc-typelits-natnormalise >= 0.3,                       lens                      >= 4.9,                       QuickCheck                >= 2.7 && <2.9,+                      reflection                >= 0.2,                       singletons                >= 1.0 && <3.0,                       template-haskell          >= 2.9.0.0 
doc/csSort.svg view
@@ -1,3 +1,3 @@ <?xml version="1.0" encoding="utf-8" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="139 33 223 300" width="223pt" height="25pc" xmlns:dc="http://purl.org/dc/elements/1.1/"><metadata> Produced by OmniGraffle 6.1.3 <dc:date>2015-10-01 15:10:32 +0000</dc:date></metadata><defs><font-face font-family="Courier" font-size="9" units-per-em="1000" underline-position="-178.22266" underline-thickness="57.617188" slope="0" x-height="462.40234" cap-height="594.72656" ascent="753.90625" descent="-246.09375" font-weight="500"><font-face-src><font-face-name name="Courier"/></font-face-src></font-face><marker orient="auto" overflow="visible" markerUnits="strokeWidth" id="FilledArrow_Marker" viewBox="-9 -4 10 8" markerWidth="10" markerHeight="8" color="black"><g><path d="M -8 0 L 0 3 L 0 -3 Z" fill="currentColor" stroke="currentColor" stroke-width="1"/></g></marker><marker orient="auto" overflow="visible" markerUnits="strokeWidth" id="FilledArrow_Marker_2" viewBox="-1 -4 8 8" markerWidth="8" markerHeight="8" color="black"><g><path d="M 5.5999994 0 L 0 -2.0999998 L 0 2.0999998 Z" fill="currentColor" stroke="currentColor" stroke-width="1"/></g></marker><marker orient="auto" overflow="visible" markerUnits="strokeWidth" id="FilledArrow_Marker_3" viewBox="-1 -3 6 6" markerWidth="6" markerHeight="6" color="black"><g><path d="M 4 0 L 0 -1.5 L 0 1.5 Z" fill="currentColor" stroke="currentColor" stroke-width="1"/></g></marker></defs><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><title>Canvas 1</title><g><title>Layer 1</title><path d="M 358.49382 266.12 L 358.49382 300.12 C 358.49382 302.88142 356.25524 305.12 353.49382 305.12 L 161.96 305.12 C 159.19857 305.12 156.96 302.88142 156.96 300.12 L 156.96 266.12 C 156.96 263.35857 159.19857 261.12 161.96 261.12 L 353.49382 261.12 C 356.25524 261.12 358.49382 263.35857 358.49382 266.12 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(141.8 33.519995)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".29956055" y="9" textLength="5.400879">7</tspan></text><path d="M 144.98828 45.580075 L 144.98828 45.399997 L 145.06 283.11997 L 156.96 283.11997" marker-start="url(#FilledArrow_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(242.4221 277.62)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".49780273" y="9" textLength="27.004395">csRow</tspan></text><line x1="175.42211" y1="305.12" x2="175.42211" y2="314.0536" marker-end="url(#FilledArrow_Marker_2)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><path d="M 359.21381 201.12 L 359.21381 235.12 C 359.21381 237.88142 356.97524 240.12 354.21381 240.12 L 213.35038 240.12 C 210.58896 240.12 208.35038 237.88142 208.35038 235.12 L 208.35038 201.12 C 208.35038 198.35857 210.58896 196.12 213.35038 196.12 L 354.21381 196.12 C 356.97524 196.12 359.21381 198.35857 359.21381 201.12 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(269.4221 212.62)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".49780273" y="9" textLength="27.004395">csRow</tspan></text><line x1="229.68" y1="240.1864" x2="229.68" y2="255.22" marker-end="url(#FilledArrow_Marker_3)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><path d="M 359.21381 137.76 L 359.21381 171.76 C 359.21381 174.52142 356.97524 176.76 354.21381 176.76 L 267.35038 176.76 C 264.58896 176.76 262.35038 174.52142 262.35038 171.76 L 262.35038 137.76 C 262.35038 134.99857 264.58896 132.76 267.35038 132.76 L 354.21381 132.76 C 356.97524 132.76 359.21381 134.99857 359.21381 137.76 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(296.4221 149.26)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".49780273" y="9" textLength="27.004395">csRow</tspan></text><line x1="283.42211" y1="176.97789" x2="283.42211" y2="189.7936" marker-end="url(#FilledArrow_Marker_3)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><path d="M 358.56 77.5621 L 358.56 111.5621 C 358.56 114.323526 356.32142 116.5621 353.56 116.5621 L 321.41656 116.5621 C 318.65514 116.5621 316.41656 114.323526 316.41656 111.5621 L 316.41656 77.5621 C 316.41656 74.80068 318.65514 72.5621 321.41656 72.5621 L 353.56 72.5621 C 356.32142 72.5621 358.56 74.80068 358.56 77.5621 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(323.48828 89.0621)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".49780273" y="9" textLength="27.004395">csRow</tspan></text><line x1="337.48829" y1="116.78" x2="337.48829" y2="127.5957" marker-end="url(#FilledArrow_Marker_3)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(341.78 47.779997)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".099121094" y="9" textLength="10.801758">&lt;&gt;</tspan></text><path d="M 347.14828 59.580075 L 347.14828 59.399997 L 347.14828 72.0621" marker-start="url(#FilledArrow_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><line x1="337.4221" y1="176.97789" x2="337.4221" y2="190.2936" marker-end="url(#FilledArrow_Marker_3)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><line x1="283.42211" y1="240.33789" x2="283.42211" y2="255.1536" marker-end="url(#FilledArrow_Marker_3)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><line x1="337.4221" y1="240.33789" x2="337.4221" y2="255.6536" marker-end="url(#FilledArrow_Marker_3)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><line x1="229.42211" y1="305.12" x2="229.42211" y2="314.0536" marker-end="url(#FilledArrow_Marker_2)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><line x1="283.42211" y1="305.12" x2="283.42211" y2="314.0536" marker-end="url(#FilledArrow_Marker_2)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><line x1="337.4221" y1="305.12" x2="337.4221" y2="314.0536" marker-end="url(#FilledArrow_Marker_2)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><path d="M 196.48828 46.180077 L 196.48828 46 L 196.45038 218.11997 L 208.35038 218.11997" marker-start="url(#FilledArrow_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><path d="M 249.98828 46.180077 L 249.98828 46 L 250.45038 154.75998 L 262.35038 154.75998" marker-start="url(#FilledArrow_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><path d="M 303.98828 45.680077 L 303.98828 45.5 L 303.98828 45.5 L 303.98828 94.56208 L 304.51656 94.56208 L 316.41656 94.56208" marker-start="url(#FilledArrow_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(194.3 34.019995)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".29956055" y="9" textLength="5.400879">3</tspan></text><text transform="translate(246.8 34.019995)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".29956055" y="9" textLength="5.400879">9</tspan></text><text transform="translate(300.8 34.019995)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".29956055" y="9" textLength="5.400879">1</tspan></text><text transform="translate(326.88 117.0621)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".29956055" y="9" textLength="5.400879">1</tspan></text><text transform="translate(274.32 179.33574)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".29956055" y="9" textLength="5.400879">1</tspan></text><text transform="translate(326.88 179.33574)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".29956055" y="9" textLength="5.400879">9</tspan></text><text transform="translate(326.88 242.64)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".29956055" y="9" textLength="5.400879">9</tspan></text><text transform="translate(219.82 242.33574)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".29956055" y="9" textLength="5.400879">1</tspan></text><text transform="translate(274.04 242.5464)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".29956055" y="9" textLength="5.400879">3</tspan></text><text transform="translate(171.81999 321.33574)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".29956055" y="9" textLength="5.400879">1</tspan></text><text transform="translate(226.54 321.0464)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".29956055" y="9" textLength="5.400879">3</tspan></text><text transform="translate(280.48 321.2)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".29956055" y="9" textLength="5.400879">7</tspan></text><text transform="translate(334.88 321.14)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".29956055" y="9" textLength="5.400879">9</tspan></text></g></g></svg>+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="139 33 223 300" width="223pt" height="25pc" xmlns:dc="http://purl.org/dc/elements/1.1/"><metadata> Produced by OmniGraffle 6.1.3 <dc:date>2015-10-05 09:58:26 +0000</dc:date></metadata><defs><font-face font-family="Courier" font-size="9" units-per-em="1000" underline-position="-178.22266" underline-thickness="57.617188" slope="0" x-height="462.40234" cap-height="594.72656" ascent="753.90625" descent="-246.09375" font-weight="500"><font-face-src><font-face-name name="Courier"/></font-face-src></font-face><marker orient="auto" overflow="visible" markerUnits="strokeWidth" id="FilledArrow_Marker" viewBox="-9 -4 10 8" markerWidth="10" markerHeight="8" color="black"><g><path d="M -8 0 L 0 3 L 0 -3 Z" fill="currentColor" stroke="currentColor" stroke-width="1"/></g></marker><marker orient="auto" overflow="visible" markerUnits="strokeWidth" id="FilledArrow_Marker_2" viewBox="-1 -4 8 8" markerWidth="8" markerHeight="8" color="black"><g><path d="M 5.5999994 0 L 0 -2.0999998 L 0 2.0999998 Z" fill="currentColor" stroke="currentColor" stroke-width="1"/></g></marker><marker orient="auto" overflow="visible" markerUnits="strokeWidth" id="FilledArrow_Marker_3" viewBox="-1 -3 6 6" markerWidth="6" markerHeight="6" color="black"><g><path d="M 4 0 L 0 -1.5 L 0 1.5 Z" fill="currentColor" stroke="currentColor" stroke-width="1"/></g></marker></defs><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><title>Canvas 1</title><g><title>Layer 1</title><path d="M 358.49382 266.12 L 358.49382 300.12 C 358.49382 302.88142 356.25524 305.12 353.49382 305.12 L 161.96 305.12 C 159.19857 305.12 156.96 302.88142 156.96 300.12 L 156.96 266.12 C 156.96 263.35857 159.19857 261.12 161.96 261.12 L 353.49382 261.12 C 356.25524 261.12 358.49382 263.35857 358.49382 266.12 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(141.8 33.519995)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".29956055" y="9" textLength="5.400879">7</tspan></text><path d="M 144.98828 45.580075 L 144.98828 45.399997 L 145.06 283.11997 L 156.96 283.11997" marker-start="url(#FilledArrow_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(239.9221 277.62)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".29736328" y="9" textLength="32.405273">insert</tspan></text><line x1="175.42211" y1="305.12" x2="175.42211" y2="314.0536" marker-end="url(#FilledArrow_Marker_2)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><path d="M 359.21381 201.12 L 359.21381 235.12 C 359.21381 237.88142 356.97524 240.12 354.21381 240.12 L 213.35038 240.12 C 210.58896 240.12 208.35038 237.88142 208.35038 235.12 L 208.35038 201.12 C 208.35038 198.35857 210.58896 196.12 213.35038 196.12 L 354.21381 196.12 C 356.97524 196.12 359.21381 198.35857 359.21381 201.12 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(266.9221 212.62)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".29736328" y="9" textLength="32.405273">insert</tspan></text><line x1="229.68" y1="240.1864" x2="229.68" y2="255.22" marker-end="url(#FilledArrow_Marker_3)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><path d="M 359.21381 137.76 L 359.21381 171.76 C 359.21381 174.52142 356.97524 176.76 354.21381 176.76 L 267.35038 176.76 C 264.58896 176.76 262.35038 174.52142 262.35038 171.76 L 262.35038 137.76 C 262.35038 134.99857 264.58896 132.76 267.35038 132.76 L 354.21381 132.76 C 356.97524 132.76 359.21381 134.99857 359.21381 137.76 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(293.9221 149.26)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".29736328" y="9" textLength="32.405273">insert</tspan></text><line x1="283.42211" y1="176.97789" x2="283.42211" y2="189.7936" marker-end="url(#FilledArrow_Marker_3)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><path d="M 358.56 77.5621 L 358.56 111.5621 C 358.56 114.323526 356.32142 116.5621 353.56 116.5621 L 321.41656 116.5621 C 318.65514 116.5621 316.41656 114.323526 316.41656 111.5621 L 316.41656 77.5621 C 316.41656 74.80068 318.65514 72.5621 321.41656 72.5621 L 353.56 72.5621 C 356.32142 72.5621 358.56 74.80068 358.56 77.5621 Z" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(320.98828 89.0621)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".29736328" y="9" textLength="32.405273">insert</tspan></text><line x1="337.48829" y1="116.78" x2="337.48829" y2="127.5957" marker-end="url(#FilledArrow_Marker_3)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(341.78 47.779997)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".099121094" y="9" textLength="10.801758">&lt;&gt;</tspan></text><path d="M 347.14828 59.580075 L 347.14828 59.399997 L 347.14828 72.0621" marker-start="url(#FilledArrow_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><line x1="337.4221" y1="176.97789" x2="337.4221" y2="190.2936" marker-end="url(#FilledArrow_Marker_3)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><line x1="283.42211" y1="240.33789" x2="283.42211" y2="255.1536" marker-end="url(#FilledArrow_Marker_3)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><line x1="337.4221" y1="240.33789" x2="337.4221" y2="255.6536" marker-end="url(#FilledArrow_Marker_3)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><line x1="229.42211" y1="305.12" x2="229.42211" y2="314.0536" marker-end="url(#FilledArrow_Marker_2)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><line x1="283.42211" y1="305.12" x2="283.42211" y2="314.0536" marker-end="url(#FilledArrow_Marker_2)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><line x1="337.4221" y1="305.12" x2="337.4221" y2="314.0536" marker-end="url(#FilledArrow_Marker_2)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><path d="M 196.48828 46.180077 L 196.48828 46 L 196.45038 218.11997 L 208.35038 218.11997" marker-start="url(#FilledArrow_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><path d="M 249.98828 46.180077 L 249.98828 46 L 250.45038 154.75998 L 262.35038 154.75998" marker-start="url(#FilledArrow_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><path d="M 303.98828 45.680077 L 303.98828 45.5 L 303.98828 45.5 L 303.98828 94.56208 L 304.51656 94.56208 L 316.41656 94.56208" marker-start="url(#FilledArrow_Marker)" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(194.3 34.019995)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".29956055" y="9" textLength="5.400879">3</tspan></text><text transform="translate(246.8 34.019995)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".29956055" y="9" textLength="5.400879">9</tspan></text><text transform="translate(300.8 34.019995)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".29956055" y="9" textLength="5.400879">1</tspan></text><text transform="translate(326.88 117.0621)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".29956055" y="9" textLength="5.400879">1</tspan></text><text transform="translate(274.32 179.33574)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".29956055" y="9" textLength="5.400879">1</tspan></text><text transform="translate(326.88 179.33574)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".29956055" y="9" textLength="5.400879">9</tspan></text><text transform="translate(326.88 242.64)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".29956055" y="9" textLength="5.400879">9</tspan></text><text transform="translate(219.82 242.33574)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".29956055" y="9" textLength="5.400879">1</tspan></text><text transform="translate(274.04 242.5464)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".29956055" y="9" textLength="5.400879">3</tspan></text><text transform="translate(171.81999 321.33574)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".29956055" y="9" textLength="5.400879">1</tspan></text><text transform="translate(226.54 321.0464)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".29956055" y="9" textLength="5.400879">3</tspan></text><text transform="translate(280.48 321.2)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".29956055" y="9" textLength="5.400879">7</tspan></text><text transform="translate(334.88 321.14)" fill="black"><tspan font-family="Courier" font-size="9" font-weight="500" x=".29956055" y="9" textLength="5.400879">9</tspan></text></g></g></svg>
src/CLaSH/Promoted/Nat.hs view
@@ -21,9 +21,11 @@   ) where -import Data.Proxy-import GHC.TypeLits-import Unsafe.Coerce+import Data.Proxy      (Proxy (..))+import Data.Reflection (reifyNat)+import GHC.TypeLits    (KnownNat, Nat, type (+), type (-), type (*), type (^),+                        natVal)+import Unsafe.Coerce   (unsafeCoerce)  -- | Singleton value for a type-level natural number 'n' --@@ -91,17 +93,21 @@ powUNat x (USucc y) = multUNat x (powUNat x y)  -- | Add two singleton natural numbers-addSNat :: KnownNat (a + b) => SNat a -> SNat b -> SNat (a+b)-addSNat _ _ = snat+addSNat :: SNat a -> SNat b -> SNat (a+b)+addSNat x y = reifyNat (snatToInteger x + snatToInteger y) (unsafeCoerce . SNat)+{-# NOINLINE addSNat #-}  -- | Subtract two singleton natural numbers-subSNat :: KnownNat (a - b) => SNat a -> SNat b -> SNat (a-b)-subSNat _ _ = snat+subSNat :: SNat a -> SNat b -> SNat (a-b)+subSNat x y = reifyNat (snatToInteger x - snatToInteger y) (unsafeCoerce . SNat)+{-# NOINLINE subSNat #-}  -- | Multiply two singleton natural numbers-mulSNat :: KnownNat (a * b) => SNat a -> SNat b -> SNat (a*b)-mulSNat _ _ = snat+mulSNat :: SNat a -> SNat b -> SNat (a*b)+mulSNat x y = reifyNat (snatToInteger x * snatToInteger y) (unsafeCoerce . SNat)+{-# NOINLINE mulSNat #-}  -- | Power of two singleton natural numbers-powSNat :: KnownNat (a ^ b) => SNat a -> SNat b -> SNat (a^b)-powSNat _ _ = snat+powSNat :: SNat a -> SNat b -> SNat (a^b)+powSNat x y = reifyNat (snatToInteger x ^ snatToInteger y) (unsafeCoerce . SNat)+{-# NOINLINE powSNat #-}
+ src/CLaSH/Promoted/Nat/Unsafe.hs view
@@ -0,0 +1,20 @@+{-# LANGUAGE Unsafe #-}++{-|+Copyright  :  (C) 2015, University of Twente+License    :  BSD2 (see the file LICENSE)+Maintainer :  Christiaan Baaij <christiaan.baaij@gmail.com>+-}+module CLaSH.Promoted.Nat.Unsafe+  (unsafeSNat)+where++import Data.Reflection    (reifyNat)+import Unsafe.Coerce      (unsafeCoerce)++import CLaSH.Promoted.Nat (SNat (..))++-- | I hope you know what you're doing+unsafeSNat :: Integer -> SNat k+unsafeSNat i = reifyNat i (unsafeCoerce . SNat)+{-# NOINLINE unsafeSNat #-}
src/CLaSH/Sized/Vector.hs view
@@ -63,7 +63,7 @@   , rotateLeft, rotateRight, rotateLeftS, rotateRightS     -- * Element-wise operations     -- ** Mapping-  , map, imap+  , map, imap, smap     -- ** Zipping   , zipWith, zipWith3   , zip, zip3@@ -83,12 +83,11 @@   , windows1d, windows2d     -- * Conversions   , toList+  , bv2v+  , v2bv     -- * Misc-  , lazyV, asNatProxy+  , lazyV, VCons, asNatProxy     -- * Primitives-    -- ** 'Eq' instance-  , eq#-  , neq#     -- ** 'Traversable' instance   , traverse#     -- ** 'BitPack' instance@@ -103,7 +102,7 @@ import Data.Proxy                 (Proxy (..)) import Data.Singletons.Prelude    (TyFun,Apply,type ($)) import GHC.TypeLits               (CmpNat, KnownNat, Nat, type (+), type (*),-                                   natVal)+                                   type (-), natVal) import GHC.Base                   (Int(I#),Int#,isTrue#) import GHC.Prim                   ((==#),(<#),(-#)) import Language.Haskell.TH        (ExpQ)@@ -118,8 +117,11 @@ import Test.QuickCheck            (Arbitrary (..), CoArbitrary (..)) import Unsafe.Coerce              (unsafeCoerce) -import CLaSH.Promoted.Nat         (SNat (..), UNat (..), snat, withSNat, toUNat)-import CLaSH.Sized.Internal.BitVector (BitVector, (++#), split#)+import CLaSH.Promoted.Nat         (SNat (..), UNat (..), snat, snatToInteger,+                                   subSNat, withSNat, toUNat)+import CLaSH.Promoted.Nat.Literals (d1)+import CLaSH.Promoted.Nat.Unsafe  (unsafeSNat)+import CLaSH.Sized.Internal.BitVector (Bit, BitVector, (++#), split#) import CLaSH.Sized.Index          (Index)  import CLaSH.Class.BitPack (BitPack (..))@@ -161,9 +163,9 @@ -- >>> data Append (m :: Nat) (a :: *) (f :: TyFun Nat *) :: * -- >>> type instance Apply (Append m a) l = Vec (l + m) a -- >>> let append' xs ys = dfold (Proxy :: Proxy (Append m a)) (const (:>)) ys xs--- >>> let cs a b     = if a > b then (a,b) else (b,a)--- >>> let csRow y xs = let (y',xs') = mapAccumL cs y xs in xs' :< y'--- >>> let csSort     = vfold csRow+-- >>> let compareSwap a b = if a > b then (a,b) else (b,a)+-- >>> let insert y xs     = let (y',xs') = mapAccumL compareSwap y xs in xs' :< y'+-- >>> let insertionSort   = vfold insert  infixr 5 `Cons` -- | Fixed size vectors.@@ -192,7 +194,7 @@ -- >>> f (3:>4:>5:>6:>7:>Nil) -- 7 ----- Also in conjunctions with ':<':+-- Also in conjunctions with (':<'): -- -- >>> let g (a :> b :> (_ :< y :< x)) = a + b +  x + y -- >>> :t g@@ -215,16 +217,17 @@       punc (x `Cons` xs)  = show x P.++ "," P.++ punc xs  instance Eq a => Eq (Vec n a) where-  (==) = eq#-  (/=) = neq#--{-# NOINLINE eq# #-}-eq# :: Eq a => Vec n a -> Vec n a -> Bool-eq# v1 v2  = foldr (&&) True (zipWith (==) v1 v2)--{-# NOINLINE neq# #-}-neq# :: Eq a => Vec n a -> Vec n a -> Bool-neq# v1 v2 = not (eq# v1 v2)+  (==) Nil _  = True+  (==) v1  v2 = fold (&&) (unsafeCoerce (zipWith (==) v1 v2))+  -- FIXME: the `unsafeCoerce` is a hack because the CLaSH compiler cannot deal+  -- with the existential length of the 'xs' in "Cons x xs".+  --+  -- Ideally we would write:+  --+  -- (==) Nil           _  = True+  -- (==) v1@(Cons _ _) v2 = fold (&&) (zipWith (==) v1 v2)+  --+  -- But the CLaSH compiler currently fails on that definition.  instance Ord a => Ord (Vec n a) where   compare x y = foldr f EQ $ zipWith compare x y@@ -394,7 +397,7 @@ -- >>> f (3:>4:>5:>6:>7:>Nil) -- 13 ----- Also in conjunctions with ':>':+-- Also in conjunctions with (':>'): -- -- >>> let g (a :> b :> (_ :< y :< x)) = a + b +  x + y -- >>> :t g@@ -1496,11 +1499,17 @@ -- <2,3,4,1> -- -- __NB:__ use `rotateLeft` if you want to rotate left by a /dynamic/ amount.-rotateLeftS :: Vec (d + n) a+rotateLeftS :: KnownNat n+            => Vec n a             -> SNat d-            -> Vec (n + d) a-rotateLeftS xs d = let (l,r) = splitAt d xs in r ++ l-{-# INLINE rotateLeftS #-}+            -> Vec n a+rotateLeftS xs d = go (snatToInteger d `mod` natVal (asNatProxy xs)) xs+  where+    go :: Integer -> Vec k a -> Vec k a+    go _ Nil           = Nil+    go 0 ys            = ys+    go n (y `Cons` ys) = go (n-1) (ys :< y)+{-# NOINLINE rotateLeftS #-}  -- | /Statically/ rotate a 'Vec'tor to the right: --@@ -1509,12 +1518,16 @@ -- <4,1,2,3> -- -- __NB:__ use `rotateRight` if you want to rotate right by a /dynamic/ amount.-rotateRightS :: forall n d a . (KnownNat n)-             => Vec (n + d) a+rotateRightS :: KnownNat n+             => Vec n a              -> SNat d-             -> Vec (d + n) a-rotateRightS xs _ = let (l,r) = splitAtI xs :: (Vec n a, Vec d a) in r ++ l-{-# INLINE rotateRightS #-}+             -> Vec n a+rotateRightS xs d = go (snatToInteger d `mod` natVal (asNatProxy xs)) xs+  where+    go _ Nil            = Nil+    go 0 ys             = ys+    go n ys@(Cons _ _)  = go (n-1) (last ys :> init ys)+{-# NOINLINE rotateRightS #-}  -- | Convert a vector to a list. --@@ -1665,23 +1678,34 @@ -- We now see that @append'@ has the appropriate type: -- -- >>> :t append'--- append' :: Vec k a -> Vec m a -> Vec (k + m) a+-- append' :: KnownNat k => Vec k a -> Vec m a -> Vec (k + m) a -- -- And that it works: -- -- >>> append' (1 :> 2 :> Nil) (3 :> 4 :> Nil) -- <1,2,3,4>-dfold :: Proxy (p :: TyFun Nat * -> *) -- ^ The /motive/-      -> (forall l . Proxy l -> a -> (p $ l) -> (p $ (l + 1))) -- ^ Function to fold+dfold :: forall p k a . KnownNat k+      => Proxy (p :: TyFun Nat * -> *) -- ^ The /motive/+      -> (forall l . SNat l -> a -> (p $ l) -> (p $ (l + 1))) -- ^ Function to fold       -> (p $ 0) -- ^ Initial element       -> Vec k a -- ^ Vector to fold over       -> (p $ k)-dfold _ _ z Nil                        = z-dfold p f z (x `Cons` (xs :: Vec l a)) = f (Proxy :: Proxy l) x (dfold p f z xs)+dfold _ f z xs = go (natVal (asNatProxy xs) - 1) xs+  where+    go :: Integer -> Vec n a -> (p $ n)+    go _ Nil                        = z+    go i (y `Cons` (ys :: Vec z a)) = f (unsafeSNat i :: SNat z) y (go (i-1) ys) {-# NOINLINE dfold #-} -data V (a :: *) (f :: TyFun Nat *) :: *-type instance Apply (V a) l = Vec l a+-- | To be used as the motive /p/ for 'dfold', when the /f/ in \"'dfold' @p f@\"+-- is a variation on (':>'), e.g.:+--+-- @+-- map' :: KnownNat k => (a -> b) -> Vec n a -> Vec n b+-- map' f = 'dfold' (Proxy :: Proxy ('VCons' a)) (\_ x xs -> f x :> xs)+-- @+data VCons (a :: *) (f :: TyFun Nat *) :: *+type instance Apply (VCons a) l = Vec l a  -- | Specialised version of 'dfold' that builds a triangular computational -- structure.@@ -1689,25 +1713,43 @@ -- Example: -- -- @--- cs a b     = if a > b then (a,b) else (b,a)--- csRow y xs = let (y',xs') = 'mapAccumL' cs y xs in xs' ':<' y'--- csSort     = 'vfold' csRow+-- compareSwap a b = if a > b then (a,b) else (b,a)+-- insert y xs     = let (y',xs') = 'mapAccumL' compareSwap y xs in xs' ':<' y'+-- insertionSort   = 'vfold' insert -- @ -- -- Builds a triangular structure of compare and swaps to sort a row. ----- >>> csSort (7 :> 3 :> 9 :> 1 :> Nil)+-- >>> insertionSort (7 :> 3 :> 9 :> 1 :> Nil) -- <1,3,7,9> ----- The circuit layout of @csSort@, build using 'vfold', is:+-- The circuit layout of @insertionSort@, build using 'vfold', is: -- -- <<doc/csSort.svg>>-vfold :: (forall l . a -> Vec l b -> Vec (l + 1) b)+vfold :: KnownNat k+      => (forall l . a -> Vec l b -> Vec (l + 1) b)       -> Vec k a       -> Vec k b-vfold f xs = dfold (Proxy :: Proxy (V a)) (const f) Nil xs+vfold f xs = dfold (Proxy :: Proxy (VCons a)) (const f) Nil xs {-# INLINE vfold #-} +-- | Apply a function to every element of a vector and the element's position+-- (as an 'SNat' value) in the vector.+--+-- >>> let rotateMatrix = smap (flip rotateRightS)+-- >>> let xss = (1:>2:>3:>Nil):>(1:>2:>3:>Nil):>(1:>2:>3:>Nil):>Nil+-- >>> xss+-- <<1,2,3>,<1,2,3>,<1,2,3>>+-- >>> rotateMatrix xss+-- <<1,2,3>,<3,1,2>,<2,3,1>>+smap :: KnownNat k => (forall l . SNat (k-1-l) -> a -> b) -> Vec k a -> Vec k b+smap f xs = dfold (Proxy :: Proxy (VCons a))+                  (\sn x xs' -> f (xsL `subSNat` d1 `subSNat` sn) x :> xs')+                  Nil xs+  where+    xsL = lengthS xs+{-# INLINE smap #-}+ instance (KnownNat n, KnownNat (BitSize a), BitPack a) => BitPack (Vec n a) where   type BitSize (Vec n a) = n * (BitSize a)   pack   = concatBitVector# . map pack@@ -1737,6 +1779,26 @@ ucBV (USucc n) bv = let (bv',x :: BitVector m) = split# bv                     in  ucBV n bv' :< x {-# INLINE ucBV #-}++-- | Convert a 'BitVector' to a 'Vec' of 'Bit's.+--+-- >>> let x = 6 :: BitVector 8+-- >>> x+-- 0000_0110+-- >>> bv2v x+-- <0,0,0,0,0,1,1,0>+bv2v :: KnownNat n => BitVector n -> Vec n Bit+bv2v = unpack++-- | Convert a 'Vec' of 'Bit's to a 'BitVector'.+--+-- >>> let x = (0:>0:>0:>1:>0:>0:>1:>0:>Nil) :: Vec 8 Bit+-- >>> x+-- <0,0,0,1,0,0,1,0>+-- >>> v2bv x+-- 0001_0010+v2bv :: KnownNat n => Vec n Bit -> BitVector n+v2bv = pack  instance Lift a => Lift (Vec n a) where   lift Nil           = [| Nil |]
src/CLaSH/Tutorial.hs view
@@ -113,29 +113,51 @@ -- >>> let topEntity = mac :: Signal (Signed 9, Signed 9) -> Signal (Signed 9) -- >>> let testInput = stimuliGenerator $(v [(1,1) :: (Signed 9,Signed 9),(2,2),(3,3),(4,4)]) -- >>> let expectedOutput = outputVerifier $(v [0 :: Signed 9,1,5,14])+-- >>> :{+-- let fibR :: Unsigned 64 -> Unsigned 64+--     fibR 0 = 0+--     fibR 1 = 1+--     fibR n = fibR (n-1) + fibR (n-2)+-- :}+--+-- >>> :{+-- let fibS :: Signal (Unsigned 64)+--     fibS = r+--       where r = register 0 r + register 0 (register 1 r)+-- :}  {- $introduction CλaSH (pronounced ‘clash’) is a functional hardware description language that borrows both its syntax and semantics from the functional programming language-Haskell. The merits of using a functional language to describe hardware comes-from the fact that combinational circuits can be directly modeled as-mathematical functions and that functional languages lend themselves very well-at describing and (de-)composing mathematical functions. The CλaSH compiler-transforms these high-level descriptions to low-level synthesizable VHDL,-Verilog, or SystemVerilog.+Haskell. It provides a familiar structural design approach to both combination+and synchronous sequential circuits. The CλaSH compiler transforms these+high-level descriptions to low-level synthesizable VHDL, Verilog, or+SystemVerilog. +Features of CλaSH:++  * Strongly typed (like VHDL), yet with a very high degree of type inference,+    enabling both safe and fast prototying using concise descriptions (like+    Verilog).+  * Interactive REPL: load your designs in an interpreter and easily test all+    your component without needing to setup a test bench.+  * Compile your designs for fast simulation.+  * Higher-order functions, in combination with type inference, result in+    designs that are fully parametric by default.+  * Synchronous sequential circuit design based on streams of values, called+    @Signal@s, lead to natural descriptions of feedback loops.+  * Multiple clock domains, with type safe clock domain crossing.+  * Template language for introducing new VHDL/(System)Verilog primitives.+ Although we say that CλaSH borrows the semantics of Haskell, that statement should be taken with a grain of salt. What we mean to say is that the CλaSH compiler views a circuit description as /structural/ description. This means, in an academic handwavy way, that every function denotes a component and every function application denotes an instantiation of said component. Now, this has-consequences on how we view /recursive/ functions: structurally, a recursive-function would denote an /infinitely/ deep / structured component, something-that cannot be turned into an actual circuit (See also <#unsupported Unsupported Haskell features>).-Of course there are variants of recursion that could be completely unfolded at-compile-time with a finite amount of steps and hence could be converted to a-realisable circuit. Sadly, this last feature is missing in the current version-of the compiler.+consequences on how we view /recursively/ defined functions: structurally, a+recursively defined function would denote an /infinitely/ deep / structured+component, something that cannot be turned into an actual circuit+(See also <#unsupported Unsupported Haskell features>).  On the other hand, Haskell's by-default non-strict evaluation works very well for the simulation of the feedback loops, which are ubiquitous in digital@@ -148,6 +170,9 @@     s = 'register' 0 (s + 1) @ +The above definition, which uses value-recursion, /can/ be synthesized to a+circuit by the CλaSH compiler.+ Over time, you will get a better feeling for the consequences of taking a /structural/ view on circuit descriptions. What is always important to remember is that every applied functions results in an instantiated component,@@ -665,10 +690,10 @@ topEntity = fir (0 ':>' 1 ':>' 2 ':>' 3 ':>' 'Nil') @ -Here we can see that, although the CλaSH compiler does not support recursion,-many of the regular patterns that we often encounter in circuit design are-already captured by the higher-order functions that are present for the 'Vec'tor-type.+Here we can see that, although the CλaSH compiler handles recursive function+definitions poorly, many of the regular patterns that we often encounter in+circuit design are already captured by the higher-order functions that are+present for the 'Vec'tor type. -}  {- $composition_sequential@@ -1666,33 +1691,120 @@  {- $unsupported #unsupported# Here is a list of Haskell features which the CλaSH compiler cannot synthesize-to VHDL/Verilog/SystemVerilog (for now):+to VHDL/(System)Verilog (for now): -* __Recursive functions__+* __Recursively defined functions__ -    Although it seems rather bad that a compiler for a-    functional language does not support recursion, this bug/feature of the-    CλaSH compiler is amortized by the builtin knowledge of all the functions-    listed in "CLaSH.Sized.Vector". And as you saw in this tutorial, the-    higher-order functions of "CLaSH.Sized.Vector" can cope with many of the-    recursive design patterns found in circuit design.+    At first hand, it seems rather bad that a compiler for a functional language+    cannot synthesize recursively defined functions to circuits. However, when+    viewing your functions as a /structural/ specification of a circuit, this+    /feature/ of the CλaSH compiler makes sense. Also, only certain types of+    recursion are considered non-synthesisable; recursively defined values are+    for example synthesisable: they are (often) synthesized to feedback loops. -    Also note that although recursive functions are not supported, recursively-    (tying-the-knot) defined values are supported (as long as these values do-    not have a function type). An example that uses recursively defined values-    is the following function that performs one iteration of bubble sort:+    Let us distinguish between three variants of recursion: -    @-    sortV xs = 'map' fst sorted :< (snd ('last' sorted))-     where-       lefts  = 'head' xs :> 'map' snd ('init' sorted)-       rights = 'tail' xs-       sorted = 'zipWith' compareSwapL lefts rights-    @+    * __Dynamic data-dependent recursion__ -    Where we can clearly see that 'lefts' and 'sorted' are defined in terms of-    each other.+        As demonstrated in this definition of a function that calculates the+        n'th Fibbonacci number: +        @+        fibR 0 = 0+        fibR 1 = 1+        fibR n = fibR (n-1) + fibR (n-2)+        @++        To get the first 10 numbers, we do the following:++        >>> import qualified Data.List as L+        >>> L.map fibR [0..9]+        [0,1,1,2,3,5,8,13,21,34]++        The @fibR@ function is not synthesizable by the CλaSH compiler, because,+        when we take a /structural/ view, @fibR@ describes an infinitely deep+        structure.++        In principal, descriptions like the above could be synthesized to a+        circuit, but it would have to be a /sequential/ circuit. Where the most+        general synthesis would then require a stack. Such a synthesis approach+        is also known as /behavioural/ synthesis, something which the CλaSH+        compiler simply does not do. One reason that CλaSH does not do this is+        because it does not fit the paradigm that only functions working on+        values of type 'Signal' result in sequential circuits, and all other+        (non higher-order) functions result in combinational circuits. This+        paradigm gives the designer the most straightforward mapping from the+        original Haskell description to generated circuit, and thus the greatest+        control over the eventual size of the circuit and longest propagation+        delay.++    * __Value-recursion__++        As demonstrated in this definition of a function that calculates the+        n'th Fibbonaci number on the n'th clock cycle:++        @+        fibS = r+          where r = 'register' 0 r + 'register' 0 ('register' 1 r)+        @++        To get the first 10 numbers, we do the following:++        >>> sampleN 10 fibS+        [0,1,1,2,3,5,8,13,21,34]++        Unlike the @fibR@ function, the above @fibS@ function /is/ synthesisable+        by the CλaSH compiler. Where the recursively defined (non-function)+        value /r/ is synthesized to a feedback loop containing three registers+        and one adder.++        Note that not all recursively defined values result in a feedback loop.+        An example that uses recursively defined values which does not result+        in a feedback loop is the following function that performs one iteration+        of bubble sort:++        @+        sortV xs = 'map' fst sorted :< (snd ('last' sorted))+         where+           lefts  = 'head' xs :> 'map' snd ('init' sorted)+           rights = 'tail' xs+           sorted = 'zipWith' compareSwapL lefts rights+        @++        Where we can clearly see that 'lefts' and 'sorted' are defined in terms+        of each other. Also the above @sortV@ function /is/ synthesisable.++    * __Static/Structure-dependent recursion__++        Static, or, structure-dependent recursion is a rather /vague/ concept.+        What we mean by this concept are recursive definitions where a user can+        sensibly imagine that the recursive definition can be completely+        unfolded (all recursion is eliminated) at compile-time in a finite+        amount of time.++        Such definitions would e.g. be:++        @+        mapV :: (a -> b) -> Vec n a -> Vec n b+        mapV _ Nil         = Nil+        mapV f (Cons x xs) = Cons (f x) (mapV f xs)++        topEntity :: Vec 4 Int -> Vec 4 Int+        topEntity = mapV (+1)+        @++        Where one can imagine that a compiler can unroll the definition of+        @mapV@ four times, knowing that the @topEntity@ function applies @mapV@+        to a 'Vec' of length 4. Sadly, the compile-time evaluation mechanisms in+        the CλaSH compiler are very poor, and a user-defined function such as+        the @mapV@ function defined above, is /currently/ not synthesisable.+        We /do/ plan to add support for this in the future. In the mean time,+        this poor support for user-defined recursive functions is amortized by+        the fact that the CλaSH compiler has built-in support for the+        higher-order functions defined in "CLaSH.Sized.Vector". Most regular+        design patterns often encountered in circuit design are captured by the+        higher-order functions in "CLaSH.Sized.Vector".+ * __Recursive datatypes__      The CλaSH compiler needs to be able to determine a bit-size for any value@@ -1723,7 +1835,6 @@          1.  In order to achieve reasonable operating frequencies, arithmetic             circuits for floating point data types must be pipelined.-         2.  Haskell's primitive arithmetic operators on floating point data types,             such as 'plusFloat#' @@ -1748,7 +1859,7 @@     'Char', 'Array', etc. cannot to translated to hardware.      The translations of 'Int', 'Int#', and 'Integer' are also incorrect: they-    are translated to the VHDL @integer@ type, the Verilog @signed [31:0], or+    are translated to the VHDL @integer@ type, the Verilog @signed [31:0]@, or     the SystemVerilog @signed logic [31:0]@ type, which can only represent     32-bit integer values. Use these types with due diligence. @@ -1774,7 +1885,7 @@ embedded language approach is already clearly visible: synthesis of recursive descriptions does not come for \"free\". This will be implemented in CλaSH in due time, but that doesn't help the circuit designer right now. As already-mentioned earlier, the lack of support for recursive functions is amortized by+mentioned earlier, the poor support for recursive functions is amortized by the built-in support for the higher-order in "CLaSH.Sized.Vector".  The big upside of CλaSH and its static analysis approach is that CλaSH can