From c9356eecfdb890db0684b58368a4b78ec2411731 Mon Sep 17 00:00:00 2001 From: Yehowshua Immanuel Date: Thu, 10 Apr 2025 01:27:33 -0400 Subject: [PATCH] client methods presumably finished --- bs/Bus.bs | 22 ++++++++++++++-------- bs/BusTypes.bs | 7 +++++-- bs/TagEngine.bs | 3 +-- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/bs/Bus.bs b/bs/Bus.bs index 51e5784..58ad27e 100644 --- a/bs/Bus.bs +++ b/bs/Bus.bs @@ -18,7 +18,7 @@ busRequestToAddr req = case req of BusReadRequest (ReadRequest addr _) -> addr BusWriteRequest (WriteRequest addr _) -> addr -mkBus :: (Addr -> Maybe Integer) +mkBus :: (Addr -> Maybe ServerIdx) -> Module (Bus inFlightTransactions numClients numServers) mkBus busMap = do -- Tag engines for each client to manage transaction tags @@ -37,7 +37,7 @@ mkBus busMap = do requestQueues <- replicateM (mkSizedBypassFIFOF (valueOf inFlightTransactions)) -- Queues to hold responses from servers to clients - responseQueues :: Vector numClients (FIFOF (BusResponse, MkTagType inFlightTransactions)) + responseQueues :: Vector numClients (FIFOF (TaggedBusResponse inFlightTransactions)) responseQueues <- replicateM (mkSizedBypassFIFOF (valueOf inFlightTransactions)) -- Client interface vector @@ -47,6 +47,9 @@ mkBus busMap = do selectedClientRequestQueue :: FIFOF (TaggedBusRequest inFlightTransactions) selectedClientRequestQueue = (select requestQueues clientIdx) + selectedClientResponseQueue :: FIFOF (TaggedBusResponse inFlightTransactions) + selectedClientResponseQueue = (select responseQueues clientIdx) + selectedTagEngine :: TagEngine inFlightTransactions selectedTagEngine = (select tagEngineByClientVec clientIdx) in @@ -60,9 +63,11 @@ mkBus busMap = do consumeResponse :: ActionValue (TaggedBusResponse inFlightTransactions) consumeResponse = do - dummyVar := (not dummyVar) - let dummyResponse = BusReadResponse (Left UnMapped) - return (TaggedBusResponse 0 dummyResponse) + let + busResponse :: (TaggedBusResponse inFlightTransactions) + busResponse = selectedClientResponseQueue.first + selectedClientResponseQueue.deq + return busResponse -- Server interface vector let servers :: Vector numServers (BusServer inFlightTransactions numClients) @@ -74,9 +79,10 @@ mkBus busMap = do let dummyBusRequest = BusReadRequest (ReadRequest 0 SizeByte) return (0, dummyBusRequest) - submitResponse :: (MkClientTagType numClients, BusResponse, transactionTagType) - -> Action - submitResponse (clientTag, busResponse, transactionTag) = do + submitResponse :: ( MkClientTagType numClients, + TaggedBusResponse inFlightTransactions + ) -> Action + submitResponse (clientTag, taggedBusResponse) = do dummyVar := (not dummyVar) return $ diff --git a/bs/BusTypes.bs b/bs/BusTypes.bs index cf11af0..e91626c 100644 --- a/bs/BusTypes.bs +++ b/bs/BusTypes.bs @@ -1,5 +1,6 @@ package BusTypes( Bus(..), + ServerIdx, MkClientTagType, BusClient(..), BusServer(..), BusRequest(..), BusResponse(..), @@ -13,6 +14,7 @@ import Vector import TagEngine type MkClientTagType a = (UInt (TLog a)) +type ServerIdx = Integer data BusError = UnMapped @@ -97,8 +99,9 @@ interface (BusClient :: # -> *) inFlightTransactions = -- associated with the original request. interface (BusServer :: # -> # -> *) inFlightTransactions numClients = consumeRequest :: ActionValue (MkTagType inFlightTransactions, BusRequest) - submitResponse :: (MkClientTagType numClients, BusResponse, transactionTagType) - -> Action + submitResponse :: ( MkClientTagType numClients, + TaggedBusResponse inFlightTransactions + ) -> Action interface (Bus :: # -> # -> # -> *) inFlightTransactions numClients numServers = clients :: Vector numClients (BusClient inFlightTransactions) diff --git a/bs/TagEngine.bs b/bs/TagEngine.bs index 2ddb304..f86c811 100644 --- a/bs/TagEngine.bs +++ b/bs/TagEngine.bs @@ -7,7 +7,6 @@ package TagEngine( import Vector import Util import FIFO -import FIFOF import SpecialFIFOs type MkTagType numTags = (UInt (TLog numTags)) @@ -35,7 +34,7 @@ mkTagEngine = do -- to TagEngine where `n := maxTagCount`. initialTagDistributor <- mkReg (Just (maxTagCount - 1)) -- Distributes initial tags retireQueue <- mkBypassFIFO -- Queue for tags being retired - freeTagQueue <- mkSizedFIFOF maxTagCount -- Queue of available tags + freeTagQueue <- mkSizedFIFO maxTagCount -- Queue of available tags -- Signals retireSignal <- mkRWire -- Signals a tag retirement