From c28425f10c137c86adfd571c0e943c8472ed7328 Mon Sep 17 00:00:00 2001 From: Yehowshua Immanuel Date: Wed, 16 Apr 2025 16:55:45 -0400 Subject: [PATCH] first attempt at server rule, also implemented consumeRequest of the server part of the Bus interface --- bs/Bus.bs | 65 ++++++++++++++++++++++++++++++++++++--------- bs/BusTypes.bs | 5 +++- diagrams/bus.drawio | 10 +++---- 3 files changed, 62 insertions(+), 18 deletions(-) diff --git a/bs/Bus.bs b/bs/Bus.bs index e2545f9..680eb57 100644 --- a/bs/Bus.bs +++ b/bs/Bus.bs @@ -63,7 +63,12 @@ mkBus serverMap = do -- The following two vectors of FIFOs make it easier to push/pull data to/from internal -- server methods: - consumeRequestQueues :: Vector numServers (FIFOF (TaggedBusResponse inFlightTransactions)) + consumeRequestQueues :: Vector numServers ( + FIFOF ( + MkClientTagType numClients, + TaggedBusRequest inFlightTransactions + ) + ) consumeRequestQueues <- replicateM mkBypassFIFOF submitResponseQueues :: Vector numServers (FIFOF (TaggedBusResponse inFlightTransactions)) @@ -160,6 +165,33 @@ mkBus serverMap = do selectedClientResponseQueue.enq response selectedSubmitResponseQueue.deq + let serverRules :: Vector numServers (Rules) + serverRules = genWith $ \serverIdx -> + let + selectedServerArbiter :: Arbiter.Arbiter_IFC numClients + selectedServerArbiter = (select requestArbiterByServer serverIdx) + + selectedConsumeRequestQueue :: FIFOF ( + MkClientTagType numClients, + TaggedBusRequest inFlightTransactions + ) + selectedConsumeRequestQueue = (select consumeRequestQueues serverIdx) + in + rules + (sprintf "server[%d] handle request" serverIdx): when True ==> do + let + grantedClientIdx :: MkClientTagType numClients + grantedClientIdx = unpack selectedServerArbiter.grant_id + + selectedClientRequestQueue :: FIFOF (TaggedBusRequest inFlightTransactions) + selectedClientRequestQueue = (select clientRequestQueues grantedClientIdx) + + clientRequest :: TaggedBusRequest inFlightTransactions + clientRequest = selectedClientRequestQueue.first + + selectedConsumeRequestQueue.enq (grantedClientIdx, clientRequest) + selectedClientRequestQueue.deq + addRules |> foldr (<+>) (rules {}) clientRules -- Client interface vector @@ -196,18 +228,27 @@ mkBus serverMap = do -- Server interface vector let servers :: Vector numServers (BusServer inFlightTransactions numClients) servers = genWith $ \serverIdx -> - interface BusServer - consumeRequest :: ActionValue (TaggedBusRequest inFlightTransactions) - consumeRequest = do - dummyVar := (not dummyVar) - let dummyBusRequest = BusReadRequest (ReadRequest 0 SizeByte) - return (TaggedBusRequest {tag = 0; busRequest = dummyBusRequest}) + let + selectedConsumeRequestQueue :: FIFOF ( + MkClientTagType numClients, + TaggedBusRequest inFlightTransactions + ) + selectedConsumeRequestQueue = (select consumeRequestQueues serverIdx) + in + interface BusServer + consumeRequest :: ActionValue ( + MkClientTagType numClients, + TaggedBusRequest inFlightTransactions + ) + consumeRequest = do + selectedConsumeRequestQueue.deq + return selectedConsumeRequestQueue.first - submitResponse :: ( MkClientTagType numClients, - TaggedBusResponse inFlightTransactions - ) -> Action - submitResponse (clientTag, taggedBusResponse) = do - dummyVar := (not dummyVar) + submitResponse :: ( MkClientTagType numClients, + TaggedBusResponse inFlightTransactions + ) -> Action + submitResponse (clientTag, taggedBusResponse) = do + dummyVar := (not dummyVar) return $ interface Bus diff --git a/bs/BusTypes.bs b/bs/BusTypes.bs index ed8838e..a5f344f 100644 --- a/bs/BusTypes.bs +++ b/bs/BusTypes.bs @@ -102,7 +102,10 @@ interface (BusClient :: # -> *) inFlightTransactions = -- received from `consumeRequest`, ensuring the response is correctly -- associated with the original request. interface (BusServer :: # -> # -> *) inFlightTransactions numClients = - consumeRequest :: ActionValue (TaggedBusRequest inFlightTransactions) + consumeRequest :: ActionValue ( + MkClientTagType numClients, + TaggedBusRequest inFlightTransactions + ) submitResponse :: ( MkClientTagType numClients, TaggedBusResponse inFlightTransactions ) -> Action diff --git a/diagrams/bus.drawio b/diagrams/bus.drawio index 1d3ed48..7f93ffd 100644 --- a/diagrams/bus.drawio +++ b/diagrams/bus.drawio @@ -1,6 +1,6 @@ - + @@ -91,7 +91,7 @@ - + @@ -117,7 +117,7 @@ - + @@ -223,7 +223,7 @@ - + @@ -248,7 +248,7 @@ - +