113 lines
4 KiB
Haskell
113 lines
4 KiB
Haskell
package BusTypes(
|
|
Bus(..),
|
|
ServerIdx,
|
|
MkClientTagType,
|
|
BusClient(..), BusServer(..),
|
|
BusRequest(..), BusResponse(..),
|
|
ReadRequest(..), ReadResponse(..), WriteRequest(..), WriteResponse(..),
|
|
BusVal(..), BusError(..), TransactionSize(..),
|
|
TaggedBusRequest(..), TaggedBusResponse(..)
|
|
) where
|
|
|
|
import Types
|
|
import Vector
|
|
import TagEngine
|
|
|
|
type MkClientTagType numClients = (UInt (TLog numClients))
|
|
type ServerIdx = Integer
|
|
|
|
data BusError
|
|
= UnMapped
|
|
| UnAligned
|
|
deriving (Bits, Eq, FShow)
|
|
|
|
data TransactionSize
|
|
= SizeByte
|
|
| SizeHalfWord
|
|
| SizeFullWord
|
|
| SizeDoubleWord
|
|
| SizeQuadWord
|
|
deriving (Bits, Eq, FShow)
|
|
|
|
data BusVal
|
|
= BusByte Byte
|
|
| BusHalfWord HalfWord
|
|
| BusFullWord FullWord
|
|
| BusDoubleWord DoubleWord
|
|
| BusQuadWord QuadWord
|
|
deriving (Bits, Eq, FShow)
|
|
|
|
data ReadRequest = ReadRequest Addr TransactionSize
|
|
deriving (Bits, Eq, FShow)
|
|
|
|
data WriteRequest = WriteRequest Addr BusVal
|
|
deriving (Bits, Eq, FShow)
|
|
|
|
type ReadResponse = Either BusError BusVal
|
|
type WriteResponse = Either BusError ()
|
|
|
|
data BusRequest
|
|
= BusReadRequest ReadRequest
|
|
| BusWriteRequest WriteRequest
|
|
deriving (Bits, Eq, FShow)
|
|
|
|
data BusResponse
|
|
= BusReadResponse ReadResponse
|
|
| BusWriteResponse WriteResponse
|
|
deriving (Bits, Eq, FShow)
|
|
|
|
struct TaggedBusRequest inFlightTransactions =
|
|
{ tag :: (MkTagType inFlightTransactions);
|
|
busRequest :: BusRequest
|
|
}
|
|
deriving (Bits, Eq, FShow)
|
|
|
|
struct TaggedBusResponse inFlightTransactions =
|
|
{ tag :: (MkTagType inFlightTransactions);
|
|
busResponse :: BusResponse
|
|
}
|
|
deriving (Bits, Eq, FShow)
|
|
|
|
-- # BusClient.submitRequest
|
|
-- * The bus client calls the `submitRequest` method of the `BusClient` interface
|
|
-- with the `BusRequest` it wishes to submit and immediately recieves back
|
|
-- a transaction-duration-unqiue tag that it can later correlate with the
|
|
-- returned response should responses arrive out of order(OOO). OOO can
|
|
-- happen if a bus server is is able to process bus requests faster than
|
|
-- other bus servers for example.
|
|
-- # BusClient.consumeResponse
|
|
-- * The bus client is able to consume a response when a response is available.
|
|
-- Responses are tagged with the tag given to bus client when it called
|
|
-- `submitRequest`
|
|
interface (BusClient :: # -> *) inFlightTransactions =
|
|
submitRequest :: BusRequest
|
|
-> ActionValue (MkTagType inFlightTransactions)
|
|
consumeResponse :: ActionValue (TaggedBusResponse inFlightTransactions)
|
|
|
|
-- # BusServer.consumeRequest
|
|
-- * The bus server calls the `consumeRequest` method of the `BusServer` interface
|
|
-- to retrieve a pending bus request initiated by a client. It immediately
|
|
-- receives a tuple containing a transaction-duration-unique tag
|
|
-- (associated with the original request) and the `BusRequest` itself. This
|
|
-- tag is used to track the transaction and correlate it with the eventual
|
|
-- response.
|
|
-- # BusServer.submitResponse
|
|
-- * The bus server calls the `submitResponse` method to send a `BusResponse`
|
|
-- back to the originating client. The method takes a tuple containing:
|
|
-- - A client tag (of type `MkClientTagType numClients`) identifying the
|
|
-- client that submitted the request.
|
|
-- - The `BusResponse` containing the result of the request (either a read
|
|
-- or write response).
|
|
-- - The transaction tag (of type `transactionTagType`) that matches the tag
|
|
-- received from `consumeRequest`, ensuring the response is correctly
|
|
-- associated with the original request.
|
|
interface (BusServer :: # -> # -> *) inFlightTransactions numClients =
|
|
consumeRequest :: ActionValue (MkTagType inFlightTransactions, BusRequest)
|
|
submitResponse :: ( MkClientTagType numClients,
|
|
TaggedBusResponse inFlightTransactions
|
|
) -> Action
|
|
|
|
interface (Bus :: # -> # -> # -> *) inFlightTransactions numClients numServers =
|
|
clients :: Vector numClients (BusClient inFlightTransactions)
|
|
servers :: Vector numServers (BusServer inFlightTransactions numClients)
|