first attempt at server rule, also implemented consumeRequest of the server part of the Bus interface
This commit is contained in:
parent
a58c836981
commit
c28425f10c
3 changed files with 62 additions and 18 deletions
65
bs/Bus.bs
65
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
|
||||
|
|
|
@ -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
|
||||
|
|
Reference in a new issue