Copyright | (C) 2013-2016 University of Twente 2017 Google Inc. |
---|---|
License | BSD2 (see the file LICENSE) |
Maintainer | Christiaan Baaij <christiaan.baaij@gmail.com> |
Safe Haskell | Trustworthy |
Language | Haskell2010 |
Extensions |
|
Synopsis
- data DSignal (domain :: Domain) (delay :: Nat) a
- delayed :: forall domain gated synchronous a n d. KnownNat d => Clock domain gated -> Reset domain synchronous -> Vec d a -> DSignal domain n a -> DSignal domain (n + d) a
- delayedI :: (Default a, KnownNat d) => Clock domain gated -> Reset domain synchronous -> DSignal domain n a -> DSignal domain (n + d) a
- feedback :: (DSignal domain n a -> (DSignal domain n a, DSignal domain ((n + m) + 1) a)) -> DSignal domain n a
- fromSignal :: Signal domain a -> DSignal domain 0 a
- toSignal :: DSignal domain delay a -> Signal domain a
- dfromList :: NFData a => [a] -> DSignal domain 0 a
- dfromList_lazy :: [a] -> DSignal domain 0 a
- unsafeFromSignal :: Signal domain a -> DSignal domain n a
- antiDelay :: SNat d -> DSignal domain (n + d) a -> DSignal domain n a
Delay-annotated synchronous signals
data DSignal (domain :: Domain) (delay :: Nat) a Source #
A synchronized signal with samples of type a
, synchronized to clock
clk
, that has accumulated delay
amount of samples delay along its path.
Instances
Functor (DSignal domain delay) Source # | |
Applicative (DSignal domain delay) Source # | |
Defined in Clash.Explicit.Signal.Delayed pure :: a -> DSignal domain delay a # (<*>) :: DSignal domain delay (a -> b) -> DSignal domain delay a -> DSignal domain delay b # liftA2 :: (a -> b -> c) -> DSignal domain delay a -> DSignal domain delay b -> DSignal domain delay c # (*>) :: DSignal domain delay a -> DSignal domain delay b -> DSignal domain delay b # (<*) :: DSignal domain delay a -> DSignal domain delay b -> DSignal domain delay a # | |
Foldable (DSignal domain delay) Source # | |
Defined in Clash.Explicit.Signal.Delayed fold :: Monoid m => DSignal domain delay m -> m # foldMap :: Monoid m => (a -> m) -> DSignal domain delay a -> m # foldr :: (a -> b -> b) -> b -> DSignal domain delay a -> b # foldr' :: (a -> b -> b) -> b -> DSignal domain delay a -> b # foldl :: (b -> a -> b) -> b -> DSignal domain delay a -> b # foldl' :: (b -> a -> b) -> b -> DSignal domain delay a -> b # foldr1 :: (a -> a -> a) -> DSignal domain delay a -> a # foldl1 :: (a -> a -> a) -> DSignal domain delay a -> a # toList :: DSignal domain delay a -> [a] # null :: DSignal domain delay a -> Bool # length :: DSignal domain delay a -> Int # elem :: Eq a => a -> DSignal domain delay a -> Bool # maximum :: Ord a => DSignal domain delay a -> a # minimum :: Ord a => DSignal domain delay a -> a # | |
Traversable (DSignal domain delay) Source # | |
Defined in Clash.Explicit.Signal.Delayed traverse :: Applicative f => (a -> f b) -> DSignal domain delay a -> f (DSignal domain delay b) # sequenceA :: Applicative f => DSignal domain delay (f a) -> f (DSignal domain delay a) # mapM :: Monad m => (a -> m b) -> DSignal domain delay a -> m (DSignal domain delay b) # sequence :: Monad m => DSignal domain delay (m a) -> m (DSignal domain delay a) # | |
Fractional a => Fractional (DSignal domain delay a) Source # | |
Num a => Num (DSignal domain delay a) Source # | |
Defined in Clash.Explicit.Signal.Delayed (+) :: DSignal domain delay a -> DSignal domain delay a -> DSignal domain delay a # (-) :: DSignal domain delay a -> DSignal domain delay a -> DSignal domain delay a # (*) :: DSignal domain delay a -> DSignal domain delay a -> DSignal domain delay a # negate :: DSignal domain delay a -> DSignal domain delay a # abs :: DSignal domain delay a -> DSignal domain delay a # signum :: DSignal domain delay a -> DSignal domain delay a # fromInteger :: Integer -> DSignal domain delay a # | |
Show a => Show (DSignal domain delay a) Source # | |
Lift a => Lift (DSignal domain delay a) Source # | |
Default a => Default (DSignal domain delay a) Source # | |
Defined in Clash.Explicit.Signal.Delayed | |
Arbitrary a => Arbitrary (DSignal domain delay a) Source # | |
CoArbitrary a => CoArbitrary (DSignal domain delay a) Source # | |
Defined in Clash.Explicit.Signal.Delayed coarbitrary :: DSignal domain delay a -> Gen b -> Gen b |
delayed :: forall domain gated synchronous a n d. KnownNat d => Clock domain gated -> Reset domain synchronous -> Vec d a -> DSignal domain n a -> DSignal domain (n + d) a Source #
delayedI :: (Default a, KnownNat d) => Clock domain gated -> Reset domain synchronous -> DSignal domain n a -> DSignal domain (n + d) a Source #
feedback :: (DSignal domain n a -> (DSignal domain n a, DSignal domain ((n + m) + 1) a)) -> DSignal domain n a Source #
Feed the delayed result of a function back to its input:
mac :: Clock domain gated -> Reset domain synchronous ->DSignal
domain 0 Int ->DSignal
domain 0 Int ->DSignal
domain 0 Int mac clk rst x y =feedback
(mac' x y) where mac' ::DSignal
domain 0 Int ->DSignal
domain 0 Int ->DSignal
domain 0 Int -> (DSignal
domain 0 Int,DSignal
domain 1 Int) mac' a b acc = let acc' = a * b + acc in (acc,delay
clk rst (singleton
0) acc')
>>>
sampleN 6 (mac systemClockGen systemResetGen (dfromList [1..]) (dfromList [1..]))
[0,1,5,14,30,55]
Signal <-> DSignal conversion
fromSignal :: Signal domain a -> DSignal domain 0 a Source #
Signal
s are not delayed
sample s == dsample (fromSignal s)
toSignal :: DSignal domain delay a -> Signal domain a Source #
Strip a DSignal
from its delay information.
List <-> DSignal conversion (not synthesisable)
dfromList :: NFData a => [a] -> DSignal domain 0 a Source #
Create a DSignal
from a list
Every element in the list will correspond to a value of the signal for one clock cycle.
>>>
sampleN 2 (dfromList [1,2,3,4,5])
[1,2]
NB: This function is not synthesisable
lazy versions
dfromList_lazy :: [a] -> DSignal domain 0 a Source #
Create a DSignal
from a list
Every element in the list will correspond to a value of the signal for one clock cycle.
>>>
sampleN 2 (dfromList [1,2,3,4,5])
[1,2]
NB: This function is not synthesisable
Experimental
unsafeFromSignal :: Signal domain a -> DSignal domain n a Source #