{-# LANGUAGE ScopedTypeVariables #-}
module Rate (tests) where
import Language.KansasLava
import Language.KansasLava.Test
import Hardware.KansasLava.Rate (rate)
import Data.Sized.Ix
import Data.Maybe
--import Debug.Trace
tests :: TestSeq -> IO ()
tests test = do
let t1 :: (Size w) => String -> Witness w -> Rational -> Rational -> IO ()
t1 str = testRate test str
t1 "0.01" (Witness :: Witness X16) 0.01 0.0
t1 "0.05" (Witness :: Witness X16) 0.05 0.0
t1 "0.1" (Witness :: Witness X16) 0.1 0.0
t1 "0.2" (Witness :: Witness X16) 0.2 0.0
t1 "0.3" (Witness :: Witness X16) 0.3 0.0
t1 "0.33" (Witness :: Witness X16) 0.33 0.0
t1 "0.4" (Witness :: Witness X16) 0.4 0.001
t1 "0.5" (Witness :: Witness X16) 0.5 0.0
t1 "0.6" (Witness :: Witness X16) 0.6 0.001
t1 "0.66" (Witness :: Witness X16) 0.66 0.001
t1 "0.7" (Witness :: Witness X16) 0.7 0.0
t1 "0.8" (Witness :: Witness X16) 0.8 0.0
t1 "0.9" (Witness :: Witness X16) 0.9 0.0
t1 "0.95" (Witness :: Witness X16) 0.95 0.0
t1 "1" (Witness :: Witness X16) 1 0.0
-- And some *real* examples.
t1 "baud" (Witness :: Witness X16) (115200 / (50 * 1000 * 1000)) 0.001
-- And others
t1 "1/16" (Witness :: Witness X16) (1/16) 0.001
t1 "1/32" (Witness :: Witness X16) (1/32) 0.001
t1 "1/64" (Witness :: Witness X16) (1/64) 0.001
t1 "1/65" (Witness :: Witness X16) (1/65) 0.001
t1 "2/65" (Witness :: Witness X16) (2/65) 0.001
-- And others
t1 "2/65@8" (Witness :: Witness X8) (2/65) 0.001
t1 "2/65@7" (Witness :: Witness X7) (2/65) 0.001
t1 "2/65@6" (Witness :: Witness X6) (2/65) 0.001
return ()
testRate :: forall w .
(Size w)
=> TestSeq
-> String
-> Witness w
-> Rational
-> Rational
-> IO ()
testRate (TestSeq test _) nm w r limit = do
let dut = do
let o0 :: Seq Bool
o0 = rate w r
outStdLogic "o0" (o0 :: Seq Bool)
driver = do
ans <- inStdLogic "o0"
let vs = fromS ans
return $ \ n ->
let sofar :: [Rational]
sofar = [ fromIntegral (length (filter (== Just True) (take i vs))) / fromIntegral i
| i <- [n `div` 10,n]
]
delta :: [String]
delta = [ "testRate failure: " ++ show (s,r,abs(s-r),limit)
| s <- sofar
, abs (s - r) > limit
]
in listToMaybe delta
test ("rate/" ++ nm) 10000 dut driver