refactored server functions as well

This commit is contained in:
Yehowshua Immanuel 2025-04-16 22:47:50 -04:00
parent 2fee6a3bd8
commit a58c908763
2 changed files with 82 additions and 48 deletions

View file

@ -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
View 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