clash-prelude-0.10.13: CAES Language for Synchronous Hardware - Prelude library

Copyright(C) 2013-2016, University of Twente
LicenseBSD2 (see the file LICENSE)
MaintainerChristiaan Baaij <christiaan.baaij@gmail.com>
Safe HaskellTrustworthy
LanguageHaskell2010
Extensions
  • Cpp
  • MonoLocalBinds
  • ScopedTypeVariables
  • TypeFamilies
  • GADTs
  • GADTSyntax
  • DataKinds
  • DeriveFunctor
  • DeriveTraversable
  • DeriveFoldable
  • MultiParamTypeClasses
  • MagicHash
  • KindSignatures
  • GeneralizedNewtypeDeriving
  • TypeOperators
  • ExplicitNamespaces
  • ExplicitForAll

CLaSH.Signal.Delayed.Explicit

Contents

Description

 

Synopsis

Delay-annotated synchronous signals

data DSignal' clk delay 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' clk delay) Source 
Applicative (DSignal' clk delay) Source 
Foldable (DSignal' clk delay) Source 
Traversable (DSignal' clk delay) Source 
Bounded a => Bounded (DSignal' clk delay a) Source 
Enum a => Enum (DSignal' clk delay a) Source 
Eq (DSignal' clk delay a) Source 
Fractional a => Fractional (DSignal' clk delay a) Source 
Integral a => Integral (DSignal' clk delay a) Source 
Num a => Num (DSignal' clk delay a) Source 
Ord a => Ord (DSignal' clk delay a) Source 
(Num a, Ord a) => Real (DSignal' clk delay a) Source 
Show a => Show (DSignal' clk delay a) Source 
Arbitrary a => Arbitrary (DSignal' clk delay a) Source 
CoArbitrary a => CoArbitrary (DSignal' clk delay a) Source 
Bits a => Bits (DSignal' clk delay a) Source 
FiniteBits a => FiniteBits (DSignal' clk delay a) Source 
Default a => Default (DSignal' clk delay a) Source 
Lift a => Lift (DSignal' clk delay a) Source 
SaturatingNum a => SaturatingNum (DSignal' clk delay a) Source 
ExtendingNum a b => ExtendingNum (DSignal' clk n a) (DSignal' clk n b) Source 
type AResult (DSignal' clk n a) (DSignal' clk n b) = DSignal' clk n (AResult a b) Source 
type MResult (DSignal' clk n a) (DSignal' clk n b) = DSignal' clk n (MResult a b) Source 

delay' :: forall clk a n d. KnownNat d => SClock clk -> Vec d a -> DSignal' clk n a -> DSignal' clk (n + d) a Source

Delay a DSignal' for d periods.

delay3 :: DSignal' clk n Int -> DSignal' clk (n + 3) Int
delay3 = delay (0 :> 0 :> 0 :> Nil)
>>> sampleN 6 (delay3 (dfromList [1..]))
[0,0,0,1,2,3]

delayI' :: (Default a, KnownNat d) => SClock clk -> DSignal' clk n a -> DSignal' clk (n + d) a Source

Delay a DSignal clk' for m periods, where m is derived from the context.

delay2 :: DSignal' clk n Int -> DSignal' clk (n + 2) Int
delay2 = delayI
>>> sampleN 6 (delay2 (dfromList [1..]))
[0,0,1,2,3,4]

feedback :: (DSignal' clk n a -> (DSignal' clk n a, DSignal' clk ((n + m) + 1) a)) -> DSignal' clk n a Source

Feed the delayed result of a function back to its input:

mac :: DSignal' clk 0 Int -> DSignal' clk 0 Int -> DSignal' clk 0 Int
mac x y = feedback (mac' x y)
  where
    mac' :: DSignal' clk 0 Int -> DSignal' clk 0 Int -> DSignal' clk 0 Int
         -> (DSignal' clk 0 Int, DSignal' clk 1 Int)
    mac' a b acc = let acc' = a * b + acc
                   in  (acc, delay (singleton 0) acc')
>>> sampleN 6 (mac (dfromList [1..]) (dfromList [1..]))
[0,1,5,14,30,55]

Signal <-> DSignal conversion

fromSignal :: Signal' clk a -> DSignal' clk 0 a Source

Signals are not delayed

sample s == dsample (fromSignal s)

toSignal :: DSignal' clk delay a -> Signal' clk a Source

Strip a DSignal from its delay information.

List <-> DSignal conversion (not synthesisable)

dfromList :: [a] -> DSignal' clk 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' clk a -> DSignal' clk n a Source

EXPERIMENTAL

Unsafely convert a Signal to any DSignal clk'.

NB: Should only be used to interface with functions specified in terms of Signal.

antiDelay :: SNat d -> DSignal' clk (n + d) a -> DSignal' clk n a Source

EXPERIMENTAL

Access a delayed signal in the present.

mac :: DSignal clk' 0 Int -> DSignal clk' 0 Int -> DSignal clk' 0 Int
mac x y = acc'
  where
    acc' = (x * y) + antiDelay d1 acc
    acc  = delay (singleton 0) acc'