package TagEngine(TagEngine(..), mkTagEngine) where import Vector import Util #define UIntLog2N(n) (UInt (TLog n)) data Tag numTags = Next UIntLog2N(numTags) | Tail deriving (Bits, Eq, FShow) interface (TagEngine :: # -> *) numTags = requestTag :: ActionValue UIntLog2N(numTags) retireTag :: UIntLog2N(numTags) -> Action instance FShow (Reg (Tag numTags)) where fshow value = fshow (readReg value) 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 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 fileHandle :: Handle <- openFile "compile.log" WriteMode debugOnce <- mkReg True addRules $ rules "display": when (debugOnce == True) ==> do $display (fshow tagVec) debugOnce := False 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