52 lines
1.2 KiB
Haskell
52 lines
1.2 KiB
Haskell
package TagEngine() where
|
|
|
|
import Vector
|
|
import Util
|
|
|
|
#define UIntLog2N(n) (UInt (TLog n))
|
|
|
|
data Tag a
|
|
= Next (UInt a)
|
|
| Empty
|
|
deriving (Bits, Eq, FShow)
|
|
|
|
initTagNext :: Integer -> Module(Reg (Tag a))
|
|
initTagNext i = do
|
|
t :: Reg (Tag a)
|
|
t <- mkReg (Next (fromInteger i))
|
|
return t
|
|
|
|
initTagEmpty :: Integer -> Module(Reg (Tag a))
|
|
initTagEmpty i = do
|
|
t :: Reg (Tag a)
|
|
t <- mkReg Empty
|
|
return t
|
|
|
|
interface (TagEngine :: # -> *) numTags =
|
|
requestTag :: ActionValue UIntLog2N(numTags)
|
|
retireTag :: UIntLog2N(numTags) -> Action
|
|
|
|
|
|
mkTagEngine :: Module (TagEngine numTags)
|
|
mkTagEngine =
|
|
do
|
|
let v :: Vector numTags Integer = genVector
|
|
-- placeholder
|
|
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"
|
|
|
|
a :: Integer
|
|
a = 3
|