playground/haskell/clash-unsorted/Streams.hs

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