From 45191a2abd11acd4788580eeadd3d3fe1350ce91 Mon Sep 17 00:00:00 2001 From: Yehowshua Immanuel Date: Fri, 11 Apr 2025 07:54:47 -0400 Subject: [PATCH] WIP : client request should handle unmapped case --- bs/Bus.bs | 32 ++++++++++++++++++-------------- bs/BusTypes.bs | 12 ++++++++---- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/bs/Bus.bs b/bs/Bus.bs index 69034ae..4bb081b 100644 --- a/bs/Bus.bs +++ b/bs/Bus.bs @@ -32,12 +32,14 @@ mkBus serverMap = do tagEngineByClientVec :: Vector numClients (TagEngine inFlightTransactions) tagEngineByClientVec <- replicateM mkTagEngine - -- each - clientArbiters :: Arbiter.Arbiter_IFC numServers - clientArbiters <- mkArbiter False + -- There are `numClients` clients, each of which needs its own + -- arbiter as there are up to `numServer` servers that may wish + -- to submit a response to a given client. + clientArbiters :: Vector numClients (Arbiter.Arbiter_IFC numServers) + clientArbiters <- replicateM (mkArbiter False) - serverArbiters :: Arbiter.Arbiter_IFC numClients - serverArbiters <- mkArbiter False + serverArbiters :: Vector numServers (Arbiter.Arbiter_IFC numClients) + serverArbiters <- replicateM (mkArbiter False) dummyVar :: Reg(Bool) dummyVar <- mkReg False @@ -50,27 +52,28 @@ mkBus serverMap = do clientResponseQueues :: Vector numClients (FIFOF (TaggedBusResponse inFlightTransactions)) clientResponseQueues <- replicateM (mkSizedBypassFIFOF (valueOf inFlightTransactions)) - let clientRouter :: Vector numClients (Rules) - clientRouter = genWith $ \clientIdx -> + let clientRules :: Vector numClients (Rules) + clientRules = genWith $ \clientIdx -> let selectedClientRequestQueue :: FIFOF (TaggedBusRequest inFlightTransactions) selectedClientRequestQueue = (select clientRequestQueues clientIdx) in rules - "route request": when True ==> do + "request": when True ==> do let - clientRequest :: (TaggedBusRequest inFlightTransactions) + clientRequest :: TaggedBusRequest inFlightTransactions clientRequest = selectedClientRequestQueue.first - -- targetAddr :: Addr = busRequestToAddr clientRequest - -- targetServerIdx :: (Maybe ServerIdx) = serverMap targetAddr + targetAddr :: Addr = busRequestToAddr |> clientRequest.busRequest + targetServerIdx :: (Maybe ServerIdx) = serverMap targetAddr -- case targetServerIdx of -- Just serverIdx -> do - -- targetServerArbiter :: + -- targetServerArbiter :: Arbiter.Arbiter_IFC numClients + -- targetServerArbiter = (select serverArbiters serverIdx) $display "client test rule " (fromInteger clientIdx) - addRules |> foldr (<+>) (rules {}) clientRouter + addRules |> foldr (<+>) (rules {}) clientRules addRules |> rules @@ -95,7 +98,8 @@ mkBus serverMap = do -> ActionValue (MkTagType inFlightTransactions) submitRequest busRequest = do tag <- selectedTagEngine.requestTag - selectedClientRequestQueue.enq (TaggedBusRequest tag busRequest) + let taggedReuqest = TaggedBusRequest {tag = tag; busRequest = busRequest} + selectedClientRequestQueue.enq taggedReuqest return tag consumeResponse :: ActionValue (TaggedBusResponse inFlightTransactions) diff --git a/bs/BusTypes.bs b/bs/BusTypes.bs index 112e923..ed6de3b 100644 --- a/bs/BusTypes.bs +++ b/bs/BusTypes.bs @@ -56,12 +56,16 @@ data BusResponse | BusWriteResponse WriteResponse deriving (Bits, Eq, FShow) -data TaggedBusRequest inFlightTransactions = - TaggedBusRequest (MkTagType inFlightTransactions) BusRequest +struct TaggedBusRequest inFlightTransactions = + { tag :: (MkTagType inFlightTransactions); + busRequest :: BusRequest + } deriving (Bits, Eq, FShow) -data TaggedBusResponse inFlightTransactions = - TaggedBusResponse (MkTagType inFlightTransactions) BusResponse +struct TaggedBusResponse inFlightTransactions = + { tag :: (MkTagType inFlightTransactions); + busResponse :: BusResponse + } deriving (Bits, Eq, FShow) -- # BusClient.submitRequest