refactored server functions as well
This commit is contained in:
parent
2fee6a3bd8
commit
a58c908763
|
@ -3,7 +3,9 @@ package Bus(mkBus, Bus(..)) where
|
||||||
import Types
|
import Types
|
||||||
import BusTypes
|
import BusTypes
|
||||||
import Client
|
import Client
|
||||||
|
import Server
|
||||||
import TagEngine
|
import TagEngine
|
||||||
|
|
||||||
import Vector
|
import Vector
|
||||||
import Util
|
import Util
|
||||||
import Arbiter
|
import Arbiter
|
||||||
|
@ -76,7 +78,7 @@ mkBus serverMap = do
|
||||||
submitResponseQueues <- replicateM mkBypassFIFOF
|
submitResponseQueues <- replicateM mkBypassFIFOF
|
||||||
|
|
||||||
let clientRules :: Vector numClients (Rules)
|
let clientRules :: Vector numClients (Rules)
|
||||||
clientRules = genWith $ \clientIdx ->
|
clientRules = genWith |> \clientIdx ->
|
||||||
let selectedClientReqQueue :: FIFOF (TaggedBusRequest inFlightTransactions)
|
let selectedClientReqQueue :: FIFOF (TaggedBusRequest inFlightTransactions)
|
||||||
selectedClientReqQueue = select clientRequestQueues clientIdx
|
selectedClientReqQueue = select clientRequestQueues clientIdx
|
||||||
|
|
||||||
|
@ -105,59 +107,37 @@ mkBus serverMap = do
|
||||||
clientRouterRule <+> clientArbiterRule
|
clientRouterRule <+> clientArbiterRule
|
||||||
|
|
||||||
let serverRules :: Vector numServers (Rules)
|
let serverRules :: Vector numServers (Rules)
|
||||||
serverRules = genWith $ \serverIdx ->
|
serverRules = genWith |> \serverIdx ->
|
||||||
let
|
let selectedServerArbiter :: Arbiter.Arbiter_IFC numClients
|
||||||
selectedServerArbiter :: Arbiter.Arbiter_IFC numClients
|
selectedServerArbiter = select requestArbiterByServer serverIdx
|
||||||
selectedServerArbiter = (select requestArbiterByServer serverIdx)
|
|
||||||
|
|
||||||
selectedConsumeRequestQueue :: FIFOF (
|
selectedConsumeReqQueue :: FIFOF (MkClientTagType numClients, TaggedBusRequest inFlightTransactions)
|
||||||
MkClientTagType numClients,
|
selectedConsumeReqQueue = select consumeRequestQueues serverIdx
|
||||||
TaggedBusRequest inFlightTransactions
|
|
||||||
)
|
selectedSubmitRespQueue :: FIFOF (MkClientTagType numClients, TaggedBusResponse inFlightTransactions)
|
||||||
selectedConsumeRequestQueue = (select consumeRequestQueues serverIdx)
|
selectedSubmitRespQueue = select submitResponseQueues serverIdx
|
||||||
|
|
||||||
|
serverRouterRule :: Rules
|
||||||
|
serverRouterRule = serverRouteResponse
|
||||||
|
serverIdx
|
||||||
|
selectedSubmitRespQueue
|
||||||
|
responseArbiterByClient
|
||||||
|
|
||||||
|
serverArbiterRule :: Rules
|
||||||
|
serverArbiterRule = serverArbitRequests
|
||||||
|
serverIdx
|
||||||
|
selectedServerArbiter
|
||||||
|
selectedConsumeReqQueue
|
||||||
|
clientRequestQueues
|
||||||
in
|
in
|
||||||
rules
|
serverRouterRule <+> serverArbiterRule
|
||||||
(sprintf "server[%d] arbit requests" 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
|
|
||||||
|
|
||||||
(sprintf "server[%d] route response" serverIdx): when True ==> do
|
|
||||||
let
|
|
||||||
selectedSubmitResponseQueue :: FIFOF (
|
|
||||||
MkClientTagType numClients,
|
|
||||||
TaggedBusResponse inFlightTransactions
|
|
||||||
)
|
|
||||||
selectedSubmitResponseQueue = (select submitResponseQueues serverIdx)
|
|
||||||
|
|
||||||
response :: (MkClientTagType numClients, TaggedBusResponse inFlightTransactions)
|
|
||||||
response = selectedSubmitResponseQueue.first
|
|
||||||
|
|
||||||
clientTag :: MkClientTagType numClients
|
|
||||||
clientTag = response.fst
|
|
||||||
|
|
||||||
targetClientResponseArbiter :: Arbiter.Arbiter_IFC (TAdd numServers 1)
|
|
||||||
targetClientResponseArbiter = (select responseArbiterByClient clientTag)
|
|
||||||
|
|
||||||
arbiterClientSlot :: Arbiter.ArbiterClient_IFC
|
|
||||||
arbiterClientSlot = (select targetClientResponseArbiter.clients serverIdx)
|
|
||||||
arbiterClientSlot.request
|
|
||||||
|
|
||||||
addRules |> foldr (<+>) (rules {}) clientRules
|
addRules |> foldr (<+>) (rules {}) clientRules
|
||||||
addRules |> foldr (<+>) (rules {}) serverRules
|
addRules |> foldr (<+>) (rules {}) serverRules
|
||||||
|
|
||||||
-- Client interface vector
|
-- Client interface vector
|
||||||
let clients :: Vector numClients (BusClient inFlightTransactions)
|
let clients :: Vector numClients (BusClient inFlightTransactions)
|
||||||
clients = genWith $ \clientIdx ->
|
clients = genWith |> \clientIdx ->
|
||||||
let
|
let
|
||||||
selectedClientRequestQueue :: FIFOF (TaggedBusRequest inFlightTransactions)
|
selectedClientRequestQueue :: FIFOF (TaggedBusRequest inFlightTransactions)
|
||||||
selectedClientRequestQueue = (select clientRequestQueues clientIdx)
|
selectedClientRequestQueue = (select clientRequestQueues clientIdx)
|
||||||
|
@ -188,7 +168,7 @@ mkBus serverMap = do
|
||||||
|
|
||||||
-- Server interface vector
|
-- Server interface vector
|
||||||
let servers :: Vector numServers (BusServer inFlightTransactions numClients)
|
let servers :: Vector numServers (BusServer inFlightTransactions numClients)
|
||||||
servers = genWith $ \serverIdx ->
|
servers = genWith |> \serverIdx ->
|
||||||
let
|
let
|
||||||
selectedConsumeRequestQueue :: FIFOF (
|
selectedConsumeRequestQueue :: FIFOF (
|
||||||
MkClientTagType numClients,
|
MkClientTagType numClients,
|
||||||
|
@ -217,7 +197,7 @@ mkBus serverMap = do
|
||||||
selectedSubmitResponseQueue = (select submitResponseQueues serverIdx)
|
selectedSubmitResponseQueue = (select submitResponseQueues serverIdx)
|
||||||
selectedSubmitResponseQueue.enq (clientTag, taggedBusResponse)
|
selectedSubmitResponseQueue.enq (clientTag, taggedBusResponse)
|
||||||
|
|
||||||
return $
|
return |>
|
||||||
interface Bus
|
interface Bus
|
||||||
clients = clients
|
clients = clients
|
||||||
servers = servers
|
servers = servers
|
||||||
|
|
54
bs/Bus/Server.bs
Normal file
54
bs/Bus/Server.bs
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
package Server(
|
||||||
|
serverArbitRequests,
|
||||||
|
serverRouteResponse
|
||||||
|
) where
|
||||||
|
|
||||||
|
import Types
|
||||||
|
import BusTypes
|
||||||
|
import TagEngine
|
||||||
|
import Vector
|
||||||
|
import Util
|
||||||
|
import Arbiter
|
||||||
|
import FIFO
|
||||||
|
import FIFOF
|
||||||
|
import SpecialFIFOs
|
||||||
|
import Printf
|
||||||
|
|
||||||
|
serverArbitRequests :: Integer
|
||||||
|
-> Arbiter.Arbiter_IFC numClients
|
||||||
|
-> FIFOF (MkClientTagType numClients, TaggedBusRequest inFlightTransactions)
|
||||||
|
-> Vector numClients (FIFOF (TaggedBusRequest inFlightTransactions))
|
||||||
|
-> Rules
|
||||||
|
serverArbitRequests serverIdx serverArbiter consumeReqQueue clientReqQueues =
|
||||||
|
rules
|
||||||
|
(sprintf "server[%d] arbit requests" serverIdx): when True ==> do
|
||||||
|
let grantedClientIdx :: MkClientTagType numClients
|
||||||
|
grantedClientIdx = unpack serverArbiter.grant_id
|
||||||
|
|
||||||
|
selectedClientReqQueue :: FIFOF (TaggedBusRequest inFlightTransactions)
|
||||||
|
selectedClientReqQueue = select clientReqQueues grantedClientIdx
|
||||||
|
|
||||||
|
clientRequest :: TaggedBusRequest inFlightTransactions
|
||||||
|
clientRequest = selectedClientReqQueue.first
|
||||||
|
consumeReqQueue.enq (grantedClientIdx, clientRequest)
|
||||||
|
selectedClientReqQueue.deq
|
||||||
|
|
||||||
|
serverRouteResponse :: Integer
|
||||||
|
-> FIFOF (MkClientTagType numClients, TaggedBusResponse inFlightTransactions)
|
||||||
|
-> Vector numClients (Arbiter.Arbiter_IFC (TAdd numServers 1))
|
||||||
|
-> Rules
|
||||||
|
serverRouteResponse serverIdx submitRespQueue responseArbiterByClient =
|
||||||
|
rules
|
||||||
|
(sprintf "server[%d] route response" serverIdx): when True ==> do
|
||||||
|
let response :: (MkClientTagType numClients, TaggedBusResponse inFlightTransactions)
|
||||||
|
response = submitRespQueue.first
|
||||||
|
|
||||||
|
clientTag :: MkClientTagType numClients
|
||||||
|
clientTag = response.fst
|
||||||
|
|
||||||
|
targetClientRespArbiter :: Arbiter.Arbiter_IFC (TAdd numServers 1)
|
||||||
|
targetClientRespArbiter = select responseArbiterByClient clientTag
|
||||||
|
|
||||||
|
arbiterClientSlot :: Arbiter.ArbiterClient_IFC
|
||||||
|
arbiterClientSlot = select targetClientRespArbiter.clients serverIdx
|
||||||
|
arbiterClientSlot.request
|
Loading…
Reference in a new issue