33
44module Tests.Protocols.BiDf (tests ) where
55
6+ import Prelude as P
7+ import qualified Data.List as L
8+
69-- clash-prelude
7- import Clash.Prelude
10+ import Clash.Prelude as C
811import qualified Clash.Sized.Vector as Vector
912import Clash.Hedgehog.Sized.Vector
1013
@@ -51,6 +54,54 @@ prop_loopback_id =
5154 BiDf. loopback id -< biDf
5255 idC -< resp
5356
57+ -- | Test that 'BiDf.fanin' on a single 'BiDf' channel behaves as an identity.
58+ prop_fanin_id :: Property
59+ prop_fanin_id =
60+ idWithModelSingleDomain @ System defExpectOptions gen (\ _ _ _ -> id ) (exposeClockResetEnable impl)
61+ where
62+ gen :: Gen [Int ]
63+ gen = Gen. list (Range. linear 0 10 ) (Gen. integral (Range. linear 0 100 ))
64+
65+ impl
66+ :: forall dom a . (HiddenClockResetEnable dom , NFDataX a )
67+ => Circuit (Df dom a ) (Df dom a )
68+ impl = circuit $ \ req -> do
69+ (biDf, resp) <- BiDf. fromDfs -< req
70+ BiDf. loopback id <| BiDf. fanin @ 1 -< [biDf]
71+ idC -< resp
72+
73+ -- | Test that 'BiDf.fanin' on a number of 'BiDf' channels behaves as an
74+ -- identity on each channel.
75+ prop_fanin :: Property
76+ prop_fanin =
77+ idWithModelSingleDomain @ System expectOpts
78+ (gen @ 3 )
79+ (\ _ _ _ -> id )
80+ (exposeClockResetEnable impl)
81+ where
82+ expectOpts = defExpectOptions
83+
84+ gen :: forall n . KnownNat n => Gen (Vec n [(Index n , Int )])
85+ gen = do
86+ xs <- genVec @ Gen @ n $ Gen. list (Range. linear 0 10 ) (Gen. integral (Range. linear 0 100 ))
87+ return $ C. zipWith (\ i -> fmap (\ x -> (i,x))) indicesI xs
88+
89+ impl
90+ :: forall n dom a .
91+ (HiddenClockResetEnable dom , KnownNat n , 1 <= n , NFDataX a )
92+ => Circuit (Vec n (Df dom a )) (Vec n (Df dom a ))
93+ impl = circuit $ \ reqs -> do
94+ (biDfs, resps) <- unbundleC <| repeatC BiDf. fromDfs -< reqs
95+ BiDf. loopback id <| BiDf. fanin @ n -< biDfs
96+ idC -< resps
97+
98+ unbundleC :: forall n a b . Circuit (Vec n (a , b )) (Vec n a , Vec n b )
99+ unbundleC = fromSignals $ \ (fwd, (bwdA, bwdB)) ->
100+ let fwdA :: Vec n (Fwd a )
101+ fwdB :: Vec n (Fwd b )
102+ (fwdA, fwdB) = Vector. unzip fwd
103+ in (Vector. zip bwdA bwdB, (fwdA, fwdB))
104+
54105tests :: TestTree
55106tests =
56107 $ (testGroupGenerator)
0 commit comments