packages feed

clash-multisignal 0.1.0.0 → 0.2.0.0

raw patch · 3 files changed

+56/−12 lines, 3 filesdep +deepseqdep +ghc-typelits-knownnatPVP ok

version bump matches the API change (PVP)

Dependencies added: deepseq, ghc-typelits-knownnat

API changes (from Hackage documentation)

- CLaSH.Signal.MultiSignal: instance Data.Foldable.Foldable (CLaSH.Signal.MultiSignal.MultiSignal n)
- CLaSH.Signal.MultiSignal: instance GHC.Show.Show a => GHC.Show.Show (CLaSH.Signal.MultiSignal.MultiSignal n a)
+ CLaSH.Signal.MultiSignal: fromListP :: (NFData a) => SNat (n + 1) -> [a] -> MultiSignal (n + 1) a
+ CLaSH.Signal.MultiSignal: fromListPI :: (NFData a, KnownNat n) => [a] -> MultiSignal (n + 1) a
+ CLaSH.Signal.MultiSignal: instance (GHC.Show.Show a, GHC.TypeLits.KnownNat n) => GHC.Show.Show (CLaSH.Signal.MultiSignal.MultiSignal n a)
+ CLaSH.Signal.MultiSignal: instance GHC.TypeLits.KnownNat n => Data.Foldable.Foldable (CLaSH.Signal.MultiSignal.MultiSignal n)
+ CLaSH.Signal.MultiSignal: simulateP :: (NFData a, NFData b, KnownNat n) => (MultiSignal (n + 1) a -> MultiSignal (n + 1) b) -> [a] -> [b]
- CLaSH.Signal.MultiSignal: windowP :: (KnownNat n, Default a, SignalLike f) => f a -> Vec n (f a)
+ CLaSH.Signal.MultiSignal: windowP :: (KnownNat n, Default a, Prependable f) => f a -> Vec n (f a)

Files

ChangeLog.md view
@@ -3,3 +3,7 @@ ## 0.1.0.0  -- 2017-01-08  * First version. Released on an unsuspecting world.++## 0.2.0.0  -- 2017-07-01++* Second version. Add simulation functions and fix few glitches
clash-multisignal.cabal view
@@ -2,7 +2,7 @@ -- documentation, see http://haskell.org/cabal/users-guide/  name:                clash-multisignal-version:             0.1.0.0+version:             0.2.0.0 -- synopsis:             description:         Clash/Fpga library for working with multiple elements arriving at same clock as stream. license:             BSD3@@ -24,7 +24,10 @@   -- we use Functor and Applicative from base    build-depends:       base > 4.0 && < 5.0,                         clash-prelude >= 0.10 && < 0.12 ,-                       QuickCheck+                       QuickCheck,+                       deepseq,+                       ghc-typelits-knownnat+   hs-source-dirs:      src   default-language:    Haskell2010   ghc-options: -fexpose-all-unfoldings@@ -33,3 +36,5 @@ source-repository head   type:     git   location: github.com:ra1u/clash-multisignal.git++
src/CLaSH/Signal/MultiSignal.hs view
@@ -5,7 +5,7 @@ {-# LANGUAGE ScopedTypeVariables   #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE ConstraintKinds #-}-+{-# OPTIONS_GHC -fplugin GHC.TypeLits.KnownNat.Solver #-}  module CLaSH.Signal.MultiSignal (     MultiSignal (..) ,@@ -15,14 +15,19 @@     SignalLike(..),     mealyP ,     mooreP ,-    windowP +    windowP,+    -- * Simulation functions (not synthesisable)+    fromListP,+    fromListPI,+    simulateP ) where  import qualified Data.Foldable as F-import qualified Prelude -import CLaSH.Prelude as P+import qualified Prelude as P+import CLaSH.Prelude as CP import CLaSH.Signal.Explicit as SE import Test.QuickCheck (Arbitrary(..),CoArbitrary(..))+import Control.DeepSeq   -- Stream of elements where n elements arrives at same clock@@ -40,9 +45,9 @@       su = unMultiSignal s  -instance Foldable (MultiSignal n) where+instance (KnownNat n) =>  Foldable (MultiSignal n) where     foldr f x xs = (F.foldr (.) id xs') x where -        xs' = (\ys y -> P.foldr f y ys) <$> unMultiSignal xs       +        xs' = (\ys y -> CP.foldr f y ys) <$> unMultiSignal xs         instance (KnownNat m, m ~ (n+1)) => Traversable (MultiSignal m) where@@ -74,8 +79,8 @@   fromRational = pure . fromRational  -instance Show a => Show (MultiSignal n a) where-  show x = foldMap ( \a -> mappend (show a) " ") x+instance (Show a,KnownNat n) => Show (MultiSignal n a) where+  show = show . unMultiSignal   instance (Arbitrary a,KnownNat n) => Arbitrary (MultiSignal n a) where@@ -159,11 +164,41 @@      r = fs <$> prepend s r <*> i   -windowP :: (KnownNat n, Default a, SignalLike f)+windowP :: (KnownNat n, Default a, Prependable f)        => f a               -- ^ 'SignalLike' to create a window over        -> Vec n (f a)       -- ^ Vector of signals windowP  x = iterateI (prepend def) x ++-- | convert list to  'MultiSignal'+fromListP :: (NFData a) => SNat (n + 1) -> [a] -> MultiSignal (n + 1) a+fromListP n xs = MultiSignal $ CP.fromList $ l2vl n xs where+   l2vl n xs = v :  l2vl n ys where+      v = P.head <$> r+      ys = P.tail (CP.last r) +      r = CP.iterate n P.tail xs+      vList = v : l2vl n ys +++-- | convert list to  'MultiSignal'+fromListPI :: (NFData a,KnownNat n) +           => [a] -> MultiSignal (n + 1) a+fromListPI = withSNat fromListP+++-- | Simulate a (@'MultiSignal' (n + 1) a -> 'MultiSignal' (n + 1) b@) +-- function given a list of samples of type a+simulateP :: (NFData a, NFData b, KnownNat n) +          => (MultiSignal (n + 1) a -> MultiSignal (n + 1) b )+          -> [a] +          -> [b]+simulateP f xs = P.concat +                 $ fmap toList +                 $ sample +                 $ unMultiSignal +                 $ f +                 $ fromListPI xs+ -- Prependable  -- |@@ -184,4 +219,4 @@          MultiSignal $ liftA2 (+>>) (register x (fmap last s)) s  instance Prependable (Signal' SE.SystemClock) where-   prepend = P.register+   prepend = CP.register