package TagEngine() where import Vector import Util #define UIntLog2N(n) (UInt (TLog n)) data Tag numTags = Next UIntLog2N(numTags) | Tail deriving (Bits, Eq, FShow) initTagNext :: Integer -> Module(Reg (Tag numTags)) initTagNext i = do t :: Reg (Tag numTags) t <- mkReg (Next (fromInteger i)) return t initTagTail :: Module(Reg (Tag numTags)) initTagTail = do t :: Reg (Tag numTags) t <- mkReg Tail return t interface (TagEngine :: # -> *) numTags = requestTag :: ActionValue UIntLog2N(numTags) retireTag :: UIntLog2N(numTags) -> Action initTagVec :: Module(Vector numTags (Reg (Tag numTags))) initTagVec = do tagVecSequential :: Vector numTags (Reg (Tag numTags)) tagVecSequential <- mapM (\idx -> initTagNext (idx+1)) genVector let idxLast :: Integer = (fromInteger |> valueOf numTags) - 1 tailTag <- initTagTail -- the tail of our TagVec should be `Tail` not `Next` let finalTagVec = update tagVecSequential idxLast tailTag return finalTagVec mkTagEngine :: Module (TagEngine numTags) mkTagEngine = do tagVec :: Vector numTags (Reg (Tag numTags)) tagVec <- initTagVec counter <- mkReg(0 :: UIntLog2N(numTags)) return $ interface TagEngine requestTag :: ActionValue UIntLog2N(numTags) requestTag = do -- placeholder counter := counter + 1 return counter retireTag :: UIntLog2N(numTags) -> Action retireTag tag = do -- placeholder counter := 0 where a = "Hello" idx_last :: Integer = (fromInteger |> valueOf numTags) - 1 a :: Integer a = 3