diff --git a/bs/Bus.bs b/bs/Bus.bs index 73f9e76..51e5784 100644 --- a/bs/Bus.bs +++ b/bs/Bus.bs @@ -13,14 +13,14 @@ import SpecialFIFOs clientRequest :: Arbiter.ArbiterClient_IFC -> Action clientRequest ifc = ifc.request -busRequestToAddr :: BusRequest -> Maybe Addr +busRequestToAddr :: BusRequest -> Addr busRequestToAddr req = case req of BusReadRequest (ReadRequest addr _) -> addr BusWriteRequest (WriteRequest addr _) -> addr mkBus :: (Addr -> Maybe Integer) -> Module (Bus inFlightTransactions numClients numServers) -mkBus addrToServerTranslation = do +mkBus busMap = do -- Tag engines for each client to manage transaction tags tagEngineByClientVec :: Vector numClients (TagEngine inFlightTransactions) tagEngineByClientVec <- replicateM mkTagEngine @@ -33,7 +33,7 @@ mkBus addrToServerTranslation = do dummyVar <- mkReg False -- Queues to hold requests from clients to servers - requestQueues :: Vector numServers (FIFOF BusRequest) + requestQueues :: Vector numServers (FIFOF (TaggedBusRequest inFlightTransactions)) requestQueues <- replicateM (mkSizedBypassFIFOF (valueOf inFlightTransactions)) -- Queues to hold responses from servers to clients @@ -43,25 +43,39 @@ mkBus addrToServerTranslation = do -- Client interface vector let clients :: Vector numClients (BusClient inFlightTransactions) clients = genWith $ \clientIdx -> - interface BusClient - submitRequest req = do - dummyVar := (not dummyVar) - return 0 + let + selectedClientRequestQueue :: FIFOF (TaggedBusRequest inFlightTransactions) + selectedClientRequestQueue = (select requestQueues clientIdx) - consumeResponse = do - dummyVar := (not dummyVar) - let dummyResponse = BusReadResponse (Left UnMapped) - return (dummyResponse, 0) + selectedTagEngine :: TagEngine inFlightTransactions + selectedTagEngine = (select tagEngineByClientVec clientIdx) + in + interface BusClient + submitRequest :: BusRequest + -> ActionValue (MkTagType inFlightTransactions) + submitRequest busRequest = do + tag <- selectedTagEngine.requestTag + selectedClientRequestQueue.enq (TaggedBusRequest tag busRequest) + return tag + + consumeResponse :: ActionValue (TaggedBusResponse inFlightTransactions) + consumeResponse = do + dummyVar := (not dummyVar) + let dummyResponse = BusReadResponse (Left UnMapped) + return (TaggedBusResponse 0 dummyResponse) -- Server interface vector let servers :: Vector numServers (BusServer inFlightTransactions numClients) servers = genWith $ \serverIdx -> interface BusServer + consumeRequest :: ActionValue (MkTagType inFlightTransactions, BusRequest) consumeRequest = do dummyVar := (not dummyVar) let dummyBusRequest = BusReadRequest (ReadRequest 0 SizeByte) return (0, dummyBusRequest) + submitResponse :: (MkClientTagType numClients, BusResponse, transactionTagType) + -> Action submitResponse (clientTag, busResponse, transactionTag) = do dummyVar := (not dummyVar) diff --git a/bs/BusTypes.bs b/bs/BusTypes.bs index f0ae7fa..cf11af0 100644 --- a/bs/BusTypes.bs +++ b/bs/BusTypes.bs @@ -4,7 +4,8 @@ package BusTypes( BusClient(..), BusServer(..), BusRequest(..), BusResponse(..), ReadRequest(..), ReadResponse(..), WriteRequest(..), WriteResponse(..), - BusVal(..), BusError(..), TransactionSize(..) + BusVal(..), BusError(..), TransactionSize(..), + TaggedBusRequest(..), TaggedBusResponse(..) ) where import Types @@ -53,6 +54,14 @@ data BusResponse | BusWriteResponse WriteResponse deriving (Bits, Eq, FShow) +data TaggedBusRequest inFlightTransactions = + TaggedBusRequest (MkTagType inFlightTransactions) BusRequest + deriving (Bits, Eq, FShow) + +data TaggedBusResponse inFlightTransactions = + TaggedBusResponse (MkTagType inFlightTransactions) 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 @@ -67,7 +76,7 @@ data BusResponse interface (BusClient :: # -> *) inFlightTransactions = submitRequest :: BusRequest -> ActionValue (MkTagType inFlightTransactions) - consumeResponse :: ActionValue (BusResponse, MkTagType inFlightTransactions) + consumeResponse :: ActionValue (TaggedBusResponse inFlightTransactions) -- # BusServer.consumeRequest -- * The bus server calls the `consumeRequest` method of the `BusServer` interface