package TagEngineTester(mkTagEngineTester) where import TagEngine import ActionSeq mkTagEngineTester :: Module Empty mkTagEngineTester = do tagEngine :: TagEngine 5 <- mkTagEngine count :: Reg (UInt 32) <- mkReg 0; runOnce :: Reg Bool <- mkReg False s :: ActionSeq s <- let requestTagAction :: Action requestTagAction = do tag <- tagEngine.requestTag $display "got tag : " (fshow tag) retireTagAction :: UInt 3 -> Action retireTagAction tag = do res <- tagEngine.retireTag tag $display "retiring tag : " (fshow tag) " " (fshow res) action {} in actionSeq $ do requestTagAction |> do requestTagAction |> do requestTagAction |> do requestTagAction |> do requestTagAction |> do retireTagAction 2 -- |> do $display "BEGIN TRY SIMULTANEOUS RETIRE and REQUEST" |> do retireTagAction 4 requestTagAction -- |> do $display "END TRY SIMULTANEOUS RETIRE and REQUEST" -- |> do $display "BEGIN TRY SIMULTANEOUS RETIRE and REQUEST" |> do retireTagAction 4 requestTagAction -- |> do $display "END TRY SIMULTANEOUS RETIRE and REQUEST" |> do $finish -- |> do retireTagAction 4 -- |> do retireTagAction 4 -- |> do retireTagAction 0 -- |> do requestTagAction -- |> do requestTagAction -- |> do retireTagAction 1 -- |> do requestTagAction -- |> do $finish addRules $ rules "counter": when True ==> do count := count + 1 $display "count : " (fshow count) "testIncrement": when (runOnce == False) ==> do s.start runOnce := True