{-# LANGUAGE ScopedTypeVariables, TypeFamilies, FlexibleContexts #-}
module FIFO (tests) where
import Language.KansasLava
import Language.KansasLava.Test
import Hardware.KansasLava.FIFO (fifo)
import Data.Sized.Unsigned
import Data.Sized.Arith
import Data.Sized.Ix
import System.Random
import Data.Ratio
--import Data.Maybe
import Debug.Trace
tests :: TestSeq -> IO ()
tests test = do
-- testing FIFOs
let fifoTest :: forall w sz . (Rep (ADD sz X1),
Rep sz,
Rep w,
Eq w,
Size sz,
Size (ADD sz X1),
Num sz,
Num (ADD sz X1)) => Witness sz -> StreamTest w w
fifoTest wit = StreamTest
{ theStream = fifo wit low
, correctnessCondition = \ ins outs -> -- trace (show ("cc",length ins,length outs)) $
case () of
() | outs /= take (length outs) ins -> return "in/out differences"
() | length outs < fromIntegral count
-> return ("to few transfers: " ++ show (length outs))
() | length ins - length outs > size (undefined :: sz)
-> return ("missing items?" ++ show (length ins,length outs,size (undefined :: sz)))
| otherwise -> Nothing
, theStreamTestCount = count
, theStreamTestCycles =
if size (undefined :: sz) <= 2
then 40000
else 30000
, theStreamName = "fifo/" ++ show (size (error "witness" :: sz))
}
where
count = 1000
let t :: forall w sz sz1 .
(Eq w, Rep w, Show w,
Size (W w),
sz1 ~ ADD sz X1,
Size (ADD (W w) X1), --- Hmm
Size sz, Size sz1,
Rep sz, Rep sz1,
Num w, Num sz, Num sz1)
=> String -> Witness w -> Witness sz -> IO ()
t str arb w = testStream test str (fifoTest w :: StreamTest w w)
t "U5" (Witness :: Witness U5) (Witness :: Witness X1)
t "U5" (Witness :: Witness U5) (Witness :: Witness X2)
t "U5" (Witness :: Witness U5) (Witness :: Witness X3)
t "U5" (Witness :: Witness U5) (Witness :: Witness X4)
t "U5" (Witness :: Witness U5) (Witness :: Witness X5)
t "U5" (Witness :: Witness U5) (Witness :: Witness X6)
t "U5" (Witness :: Witness U5) (Witness :: Witness X7)
t "U5" (Witness :: Witness U5) (Witness :: Witness X8)
return ()
return ()