in theory bus is now complete

This commit is contained in:
Yehowshua Immanuel 2025-04-16 17:58:29 -04:00
parent c28425f10c
commit ece1f86574

View file

@ -11,21 +11,16 @@ import FIFOF
import SpecialFIFOs import SpecialFIFOs
import Printf import Printf
clientRequest :: Arbiter.ArbiterClient_IFC -> Action
clientRequest ifc = ifc.request
busRequestToAddr :: BusRequest -> Addr busRequestToAddr :: BusRequest -> Addr
busRequestToAddr req = case req of busRequestToAddr req = case req of
BusReadRequest (ReadRequest addr _) -> addr BusReadRequest (ReadRequest addr _) -> addr
BusWriteRequest (WriteRequest addr _) -> addr BusWriteRequest (WriteRequest addr _) -> addr
dummyRule :: Rules -- Create a Bus Module that supports multiple clients and servers
dummyRule = -- submitting requests and simultaneously returning responses.
rules -- Responses can be consumed by clients out of order as all client
"test rule": when True ==> do -- submitted requests are tagged - and servers keep that tag
$display "test rule" -- when responding.
-- we need a way to make serverMap safer...
mkBus :: (Add n (TLog numServers) (TLog (TAdd numServers 1))) mkBus :: (Add n (TLog numServers) (TLog (TAdd numServers 1)))
=> (Addr -> Maybe (MkServerIdx numServers)) => (Addr -> Maybe (MkServerIdx numServers))
-> Module (Bus inFlightTransactions numClients numServers) -> Module (Bus inFlightTransactions numClients numServers)
@ -71,7 +66,12 @@ mkBus serverMap = do
) )
consumeRequestQueues <- replicateM mkBypassFIFOF consumeRequestQueues <- replicateM mkBypassFIFOF
submitResponseQueues :: Vector numServers (FIFOF (TaggedBusResponse inFlightTransactions)) submitResponseQueues :: Vector numServers (
FIFOF (
MkClientTagType numClients,
TaggedBusResponse inFlightTransactions
)
)
submitResponseQueues <- replicateM mkBypassFIFOF submitResponseQueues <- replicateM mkBypassFIFOF
let clientRules :: Vector numClients (Rules) let clientRules :: Vector numClients (Rules)
@ -157,12 +157,15 @@ mkBus serverMap = do
grantedServerIdx :: MkServerIdx numServers grantedServerIdx :: MkServerIdx numServers
grantedServerIdx = truncate grantedIdx grantedServerIdx = truncate grantedIdx
selectedSubmitResponseQueue :: FIFOF (TaggedBusResponse inFlightTransactions) selectedSubmitResponseQueue :: FIFOF (
MkClientTagType numClients,
TaggedBusResponse inFlightTransactions
)
selectedSubmitResponseQueue = (select submitResponseQueues grantedServerIdx) selectedSubmitResponseQueue = (select submitResponseQueues grantedServerIdx)
response :: TaggedBusResponse inFlightTransactions response :: (MkClientTagType numClients, TaggedBusResponse inFlightTransactions)
response = selectedSubmitResponseQueue.first response = selectedSubmitResponseQueue.first
selectedClientResponseQueue.enq response selectedClientResponseQueue.enq response.snd
selectedSubmitResponseQueue.deq selectedSubmitResponseQueue.deq
let serverRules :: Vector numServers (Rules) let serverRules :: Vector numServers (Rules)
@ -178,7 +181,7 @@ mkBus serverMap = do
selectedConsumeRequestQueue = (select consumeRequestQueues serverIdx) selectedConsumeRequestQueue = (select consumeRequestQueues serverIdx)
in in
rules rules
(sprintf "server[%d] handle request" serverIdx): when True ==> do (sprintf "server[%d] arbit requests" serverIdx): when True ==> do
let let
grantedClientIdx :: MkClientTagType numClients grantedClientIdx :: MkClientTagType numClients
grantedClientIdx = unpack selectedServerArbiter.grant_id grantedClientIdx = unpack selectedServerArbiter.grant_id
@ -192,7 +195,29 @@ mkBus serverMap = do
selectedConsumeRequestQueue.enq (grantedClientIdx, clientRequest) selectedConsumeRequestQueue.enq (grantedClientIdx, clientRequest)
selectedClientRequestQueue.deq 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
-- Client interface vector -- Client interface vector
let clients :: Vector numClients (BusClient inFlightTransactions) let clients :: Vector numClients (BusClient inFlightTransactions)
@ -248,7 +273,13 @@ mkBus serverMap = do
TaggedBusResponse inFlightTransactions TaggedBusResponse inFlightTransactions
) -> Action ) -> Action
submitResponse (clientTag, taggedBusResponse) = do submitResponse (clientTag, taggedBusResponse) = do
dummyVar := (not dummyVar) let
selectedSubmitResponseQueue :: FIFOF (
MkClientTagType numClients,
TaggedBusResponse inFlightTransactions
)
selectedSubmitResponseQueue = (select submitResponseQueues serverIdx)
selectedSubmitResponseQueue.enq (clientTag, taggedBusResponse)
return $ return $
interface Bus interface Bus