package TagEngineTester(mkTagEngineTester) where import TagEngine import ActionSeq import Printf import Util type NumTags = 5 mkTagEngineTester :: Module Empty mkTagEngineTester = do tagEngine :: TagEngine 5 <- mkTagEngine runOnce :: Reg Bool <- mkReg False s :: ActionSeq s <- let requestTagAction :: Action requestTagAction = do tag <- tagEngine.requestTag $display $time " got tag : " (fshow tag) retireTagAction :: UInt 3 -> Action retireTagAction tag = do res <- tagEngine.retireTag tag $display $time " retiring tag : " (fshow tag) " " (fshow res) action {} in actionSeq $ do let expectedTag = 4 tag <- tagEngine.requestTag dynamicAssert (tag == expectedTag) "" |> do let expectedTag = 3 tag <- tagEngine.requestTag dynamicAssert (tag == expectedTag) "" |> do let expectedTag = 2 tag <- tagEngine.requestTag dynamicAssert (tag == expectedTag) "" |> do let expectedTag = 1 tag <- tagEngine.requestTag dynamicAssert (tag == expectedTag) "" |> do let expectedTag = 0 tag <- tagEngine.requestTag dynamicAssert (tag == expectedTag) "" |> do retireTagAction 2 |> do retireTagAction 4 let expectedTag :: MkTagType NumTags expectedTag = 2 tag <- tagEngine.requestTag dynamicAssert (tag == expectedTag) "" |> do retireTagAction 2 let expectedTag = 3 tag <- tagEngine.requestTag dynamicAssert (tag == expectedTag) "" |> do terminateSimNoError addRules $ rules "start unit test": when (runOnce == False) ==> do s.start runOnce := True