79 lines
2.3 KiB
Haskell
79 lines
2.3 KiB
Haskell
module Streams where
|
|
|
|
import Clash.Prelude
|
|
|
|
type ClockType = Int
|
|
|
|
-- data Stream a =
|
|
-- Cons a (Stream a)
|
|
--
|
|
-- merge
|
|
-- :: Stream (Maybe a)
|
|
-- -> Stream (Maybe a)
|
|
-- -> Stream (Maybe a)
|
|
-- merge (Cons (Just x') xs) (Cons _ ys) = Cons (Just x') (merge xs ys)
|
|
-- merge (Cons Nothing xs) (Cons y' ys) = Cons y' (merge xs ys)
|
|
|
|
-- merge' :: (Maybe a, Maybe a) -> Maybe a
|
|
-- merge' (Just x, _) = Just x
|
|
-- merge' (_, y) = y
|
|
|
|
|
|
merge
|
|
:: Maybe a -- State: Unused
|
|
-> (Maybe a, Maybe a) -- Input: values from 2 streams
|
|
-> (Maybe a, Maybe a) -- Output, next state
|
|
merge _ (Just x, _) = (Nothing, Just x)
|
|
merge _ (_, y) = (Nothing, y)
|
|
|
|
delay
|
|
:: Maybe ClockType -- State: Remaining time
|
|
-> (Maybe ClockType, Maybe ()) -- Input: d,r values
|
|
-> (Maybe ClockType, Maybe ()) -- Output, next state
|
|
-- XXX: Got to limit ClockType to greater than 0
|
|
delay (Just 0) (Nothing, Nothing) = (Nothing, Just ()) -- fire. No new delay.
|
|
delay (Just 0) (Just d, _) = (Just (d-1), Just ()) -- fire. New delay with/without reset signal
|
|
delay _ (Nothing, Just ()) = (Nothing, Nothing) -- reset when it wasn't about to fire
|
|
delay _ (Just d, Just r) = (Just (d-1), Nothing) -- set when it wasn't about to fire
|
|
|
|
mergeS
|
|
:: (HiddenClockResetEnable dom,
|
|
Num a,
|
|
NFDataX a)
|
|
=> Signal dom (Maybe a, Maybe a)
|
|
-> Signal dom (Maybe a)
|
|
mergeS = mealy Streams.merge Nothing
|
|
|
|
-- delayS
|
|
-- :: (HiddenClockResetEnable dom,
|
|
-- --Num a,
|
|
-- NFDataX a)
|
|
-- => Signal dom (Maybe a, Maybe ())
|
|
-- -> Signal dom (Maybe ())
|
|
-- -- XXX: There's a Clash.Prelude.delay: Could be something we can use
|
|
-- delayS = mealy Streams.delay Nothing
|
|
|
|
delayS
|
|
:: HiddenClockResetEnable dom
|
|
=> Signal dom (Maybe ClockType, Maybe ())
|
|
-> Signal dom (Maybe ())
|
|
delayS = mealy Streams.delay Nothing
|
|
|
|
-- topEntity ::
|
|
-- Clock System
|
|
-- -> Reset System
|
|
-- -> Enable System
|
|
-- -> Signal System (Maybe Int, Maybe Int)
|
|
-- -> Signal System (Maybe Int)
|
|
-- topEntity = exposeClockResetEnable Streams.mergeS
|
|
|
|
topEntity ::
|
|
Clock System
|
|
-> Reset System
|
|
-> Enable System
|
|
-> Signal System (Maybe ClockType, Maybe ())
|
|
-> Signal System (Maybe ())
|
|
topEntity = exposeClockResetEnable Streams.delayS
|
|
|
|
-- XXX: How to pass functions as arguments to clash functions
|