packages feed

kansas-lava-cores-0.1.2: tests/FIFO.hs

{-# 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 ()