bridge.hh revision 8975
12568SN/A/* 28922Swilliam.wang@arm.com * Copyright (c) 2011-2012 ARM Limited 38713Sandreas.hansson@arm.com * All rights reserved 48713Sandreas.hansson@arm.com * 58713Sandreas.hansson@arm.com * The license below extends only to copyright in the software and shall 68713Sandreas.hansson@arm.com * not be construed as granting a license to any other intellectual 78713Sandreas.hansson@arm.com * property including but not limited to intellectual property relating 88713Sandreas.hansson@arm.com * to a hardware implementation of the functionality of the software 98713Sandreas.hansson@arm.com * licensed hereunder. You may use the software subject to the license 108713Sandreas.hansson@arm.com * terms below provided that you ensure that this notice is replicated 118713Sandreas.hansson@arm.com * unmodified and in its entirety in all distributions of the software, 128713Sandreas.hansson@arm.com * modified or unmodified, in source code or in binary form. 138713Sandreas.hansson@arm.com * 142568SN/A * Copyright (c) 2006 The Regents of The University of Michigan 152568SN/A * All rights reserved. 162568SN/A * 172568SN/A * Redistribution and use in source and binary forms, with or without 182568SN/A * modification, are permitted provided that the following conditions are 192568SN/A * met: redistributions of source code must retain the above copyright 202568SN/A * notice, this list of conditions and the following disclaimer; 212568SN/A * redistributions in binary form must reproduce the above copyright 222568SN/A * notice, this list of conditions and the following disclaimer in the 232568SN/A * documentation and/or other materials provided with the distribution; 242568SN/A * neither the name of the copyright holders nor the names of its 252568SN/A * contributors may be used to endorse or promote products derived from 262568SN/A * this software without specific prior written permission. 272568SN/A * 282568SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 292568SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 302568SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 312568SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 322568SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 332568SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 342568SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 352568SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 362568SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 372568SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 382568SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 392665Ssaidi@eecs.umich.edu * 402665Ssaidi@eecs.umich.edu * Authors: Ali Saidi 412665Ssaidi@eecs.umich.edu * Steve Reinhardt 428713Sandreas.hansson@arm.com * Andreas Hansson 432568SN/A */ 442568SN/A 452568SN/A/** 462982Sstever@eecs.umich.edu * @file 478713Sandreas.hansson@arm.com * Declaration of a memory-mapped bus bridge that connects a master 488713Sandreas.hansson@arm.com * and a slave through a request and response queue. 492568SN/A */ 502568SN/A 512568SN/A#ifndef __MEM_BRIDGE_HH__ 522568SN/A#define __MEM_BRIDGE_HH__ 532568SN/A 542568SN/A#include <list> 552568SN/A#include <queue> 568229Snate@binkert.org#include <string> 572568SN/A 585386Sstever@gmail.com#include "base/fast_alloc.hh" 596215Snate@binkert.org#include "base/types.hh" 602568SN/A#include "mem/mem_object.hh" 612568SN/A#include "mem/packet.hh" 622568SN/A#include "mem/port.hh" 634762Snate@binkert.org#include "params/Bridge.hh" 642568SN/A#include "sim/eventq.hh" 652568SN/A 668713Sandreas.hansson@arm.com/** 678713Sandreas.hansson@arm.com * A bridge is used to interface two different busses (or in general a 688713Sandreas.hansson@arm.com * memory-mapped master and slave), with buffering for requests and 698713Sandreas.hansson@arm.com * responses. The bridge has a fixed delay for packets passing through 708713Sandreas.hansson@arm.com * it and responds to a fixed set of address ranges. 718713Sandreas.hansson@arm.com * 728713Sandreas.hansson@arm.com * The bridge comprises a slave port and a master port, that buffer 738713Sandreas.hansson@arm.com * outgoing responses and requests respectively. Buffer space is 748713Sandreas.hansson@arm.com * reserved when a request arrives, also reserving response space 758713Sandreas.hansson@arm.com * before forwarding the request. An incoming request is always 768713Sandreas.hansson@arm.com * accepted (recvTiming returns true), but is potentially NACKed if 778713Sandreas.hansson@arm.com * there is no request space or response space. 788713Sandreas.hansson@arm.com */ 792568SN/Aclass Bridge : public MemObject 802568SN/A{ 812568SN/A protected: 828713Sandreas.hansson@arm.com 838713Sandreas.hansson@arm.com /** 848713Sandreas.hansson@arm.com * A packet buffer stores packets along with their sender state 858713Sandreas.hansson@arm.com * and scheduled time for transmission. 868713Sandreas.hansson@arm.com */ 878713Sandreas.hansson@arm.com class PacketBuffer : public Packet::SenderState, public FastAlloc { 888713Sandreas.hansson@arm.com 898713Sandreas.hansson@arm.com public: 908713Sandreas.hansson@arm.com Tick ready; 918713Sandreas.hansson@arm.com PacketPtr pkt; 928713Sandreas.hansson@arm.com bool nackedHere; 938713Sandreas.hansson@arm.com Packet::SenderState *origSenderState; 948949Sandreas.hansson@arm.com Packet::NodeID origSrc; 958713Sandreas.hansson@arm.com bool expectResponse; 968713Sandreas.hansson@arm.com 978713Sandreas.hansson@arm.com PacketBuffer(PacketPtr _pkt, Tick t, bool nack = false) 988713Sandreas.hansson@arm.com : ready(t), pkt(_pkt), nackedHere(nack), 998713Sandreas.hansson@arm.com origSenderState(_pkt->senderState), 1008713Sandreas.hansson@arm.com origSrc(nack ? _pkt->getDest() : _pkt->getSrc() ), 1018713Sandreas.hansson@arm.com expectResponse(_pkt->needsResponse() && !nack) 1028713Sandreas.hansson@arm.com 1038713Sandreas.hansson@arm.com { 1048713Sandreas.hansson@arm.com if (!pkt->isResponse() && !nack) 1058713Sandreas.hansson@arm.com pkt->senderState = this; 1068713Sandreas.hansson@arm.com } 1078713Sandreas.hansson@arm.com 1088713Sandreas.hansson@arm.com void fixResponse(PacketPtr pkt) 1098713Sandreas.hansson@arm.com { 1108713Sandreas.hansson@arm.com assert(pkt->senderState == this); 1118713Sandreas.hansson@arm.com pkt->setDest(origSrc); 1128713Sandreas.hansson@arm.com pkt->senderState = origSenderState; 1138713Sandreas.hansson@arm.com } 1148713Sandreas.hansson@arm.com }; 1158713Sandreas.hansson@arm.com 1168713Sandreas.hansson@arm.com // Forward declaration to allow the slave port to have a pointer 1178713Sandreas.hansson@arm.com class BridgeMasterPort; 1188713Sandreas.hansson@arm.com 1198713Sandreas.hansson@arm.com /** 1208713Sandreas.hansson@arm.com * The port on the side that receives requests and sends 1218713Sandreas.hansson@arm.com * responses. The slave port has a set of address ranges that it 1228713Sandreas.hansson@arm.com * is responsible for. The slave port also has a buffer for the 1238713Sandreas.hansson@arm.com * responses not yet sent. 1248713Sandreas.hansson@arm.com */ 1258922Swilliam.wang@arm.com class BridgeSlavePort : public SlavePort 1262568SN/A { 1278713Sandreas.hansson@arm.com 1288713Sandreas.hansson@arm.com private: 1298713Sandreas.hansson@arm.com 1302643Sstever@eecs.umich.edu /** A pointer to the bridge to which this port belongs. */ 1312568SN/A Bridge *bridge; 1322568SN/A 1332643Sstever@eecs.umich.edu /** 1348851Sandreas.hansson@arm.com * Master port on the other side of the bridge 1352643Sstever@eecs.umich.edu * (connected to the other bus). 1362643Sstever@eecs.umich.edu */ 1378851Sandreas.hansson@arm.com BridgeMasterPort& masterPort; 1388713Sandreas.hansson@arm.com 1398713Sandreas.hansson@arm.com /** Minimum request delay though this bridge. */ 1408713Sandreas.hansson@arm.com Tick delay; 1418713Sandreas.hansson@arm.com 1428713Sandreas.hansson@arm.com /** Min delay to respond with a nack. */ 1438713Sandreas.hansson@arm.com Tick nackDelay; 1448713Sandreas.hansson@arm.com 1458713Sandreas.hansson@arm.com /** Address ranges to pass through the bridge */ 1468713Sandreas.hansson@arm.com AddrRangeList ranges; 1478713Sandreas.hansson@arm.com 1488713Sandreas.hansson@arm.com /** 1498713Sandreas.hansson@arm.com * Response packet queue. Response packets are held in this 1508713Sandreas.hansson@arm.com * queue for a specified delay to model the processing delay 1518713Sandreas.hansson@arm.com * of the bridge. 1528713Sandreas.hansson@arm.com */ 1538713Sandreas.hansson@arm.com std::list<PacketBuffer*> responseQueue; 1548713Sandreas.hansson@arm.com 1558713Sandreas.hansson@arm.com /** Counter to track the outstanding responses. */ 1568713Sandreas.hansson@arm.com unsigned int outstandingResponses; 1578713Sandreas.hansson@arm.com 1588713Sandreas.hansson@arm.com /** If we're waiting for a retry to happen. */ 1598713Sandreas.hansson@arm.com bool inRetry; 1608713Sandreas.hansson@arm.com 1618713Sandreas.hansson@arm.com /** Max queue size for reserved responses. */ 1628713Sandreas.hansson@arm.com unsigned int respQueueLimit; 1638713Sandreas.hansson@arm.com 1648713Sandreas.hansson@arm.com /** 1658713Sandreas.hansson@arm.com * Is this side blocked from accepting new response packets. 1668713Sandreas.hansson@arm.com * 1678713Sandreas.hansson@arm.com * @return true if the reserved space has reached the set limit 1688713Sandreas.hansson@arm.com */ 1698713Sandreas.hansson@arm.com bool respQueueFull(); 1708713Sandreas.hansson@arm.com 1718713Sandreas.hansson@arm.com /** 1728713Sandreas.hansson@arm.com * Turn the request packet into a NACK response and put it in 1738713Sandreas.hansson@arm.com * the response queue and schedule its transmission. 1748713Sandreas.hansson@arm.com * 1758713Sandreas.hansson@arm.com * @param pkt the request packet to NACK 1768713Sandreas.hansson@arm.com */ 1778713Sandreas.hansson@arm.com void nackRequest(PacketPtr pkt); 1788713Sandreas.hansson@arm.com 1798713Sandreas.hansson@arm.com /** 1808713Sandreas.hansson@arm.com * Handle send event, scheduled when the packet at the head of 1818713Sandreas.hansson@arm.com * the response queue is ready to transmit (for timing 1828713Sandreas.hansson@arm.com * accesses only). 1838713Sandreas.hansson@arm.com */ 1848713Sandreas.hansson@arm.com void trySend(); 1858713Sandreas.hansson@arm.com 1868713Sandreas.hansson@arm.com /** 1878713Sandreas.hansson@arm.com * Private class for scheduling sending of responses from the 1888713Sandreas.hansson@arm.com * response queue. 1898713Sandreas.hansson@arm.com */ 1908713Sandreas.hansson@arm.com class SendEvent : public Event 1918713Sandreas.hansson@arm.com { 1928851Sandreas.hansson@arm.com BridgeSlavePort& port; 1938713Sandreas.hansson@arm.com 1948713Sandreas.hansson@arm.com public: 1958851Sandreas.hansson@arm.com SendEvent(BridgeSlavePort& p) : port(p) {} 1968851Sandreas.hansson@arm.com virtual void process() { port.trySend(); } 1978713Sandreas.hansson@arm.com virtual const char *description() const { return "bridge send"; } 1988713Sandreas.hansson@arm.com }; 1998713Sandreas.hansson@arm.com 2008713Sandreas.hansson@arm.com /** Send event for the response queue. */ 2018713Sandreas.hansson@arm.com SendEvent sendEvent; 2028713Sandreas.hansson@arm.com 2038713Sandreas.hansson@arm.com public: 2048713Sandreas.hansson@arm.com 2058713Sandreas.hansson@arm.com /** 2068713Sandreas.hansson@arm.com * Constructor for the BridgeSlavePort. 2078713Sandreas.hansson@arm.com * 2088713Sandreas.hansson@arm.com * @param _name the port name including the owner 2098713Sandreas.hansson@arm.com * @param _bridge the structural owner 2108713Sandreas.hansson@arm.com * @param _masterPort the master port on the other side of the bridge 2118713Sandreas.hansson@arm.com * @param _delay the delay from seeing a response to sending it 2128713Sandreas.hansson@arm.com * @param _nack_delay the delay from a NACK to sending the response 2138713Sandreas.hansson@arm.com * @param _resp_limit the size of the response queue 2148713Sandreas.hansson@arm.com * @param _ranges a number of address ranges to forward 2158713Sandreas.hansson@arm.com */ 2168713Sandreas.hansson@arm.com BridgeSlavePort(const std::string &_name, Bridge *_bridge, 2178851Sandreas.hansson@arm.com BridgeMasterPort& _masterPort, int _delay, 2188713Sandreas.hansson@arm.com int _nack_delay, int _resp_limit, 2198713Sandreas.hansson@arm.com std::vector<Range<Addr> > _ranges); 2208713Sandreas.hansson@arm.com 2218713Sandreas.hansson@arm.com /** 2228713Sandreas.hansson@arm.com * Queue a response packet to be sent out later and also schedule 2238713Sandreas.hansson@arm.com * a send if necessary. 2248713Sandreas.hansson@arm.com * 2258713Sandreas.hansson@arm.com * @param pkt a response to send out after a delay 2268713Sandreas.hansson@arm.com */ 2278713Sandreas.hansson@arm.com void queueForSendTiming(PacketPtr pkt); 2288713Sandreas.hansson@arm.com 2298713Sandreas.hansson@arm.com protected: 2308713Sandreas.hansson@arm.com 2318713Sandreas.hansson@arm.com /** When receiving a timing request from the peer port, 2328713Sandreas.hansson@arm.com pass it to the bridge. */ 2338975Sandreas.hansson@arm.com virtual bool recvTimingReq(PacketPtr pkt); 2348713Sandreas.hansson@arm.com 2358713Sandreas.hansson@arm.com /** When receiving a retry request from the peer port, 2368713Sandreas.hansson@arm.com pass it to the bridge. */ 2378713Sandreas.hansson@arm.com virtual void recvRetry(); 2388713Sandreas.hansson@arm.com 2398713Sandreas.hansson@arm.com /** When receiving a Atomic requestfrom the peer port, 2408713Sandreas.hansson@arm.com pass it to the bridge. */ 2418713Sandreas.hansson@arm.com virtual Tick recvAtomic(PacketPtr pkt); 2428713Sandreas.hansson@arm.com 2438713Sandreas.hansson@arm.com /** When receiving a Functional request from the peer port, 2448713Sandreas.hansson@arm.com pass it to the bridge. */ 2458713Sandreas.hansson@arm.com virtual void recvFunctional(PacketPtr pkt); 2468713Sandreas.hansson@arm.com 2478713Sandreas.hansson@arm.com /** When receiving a address range request the peer port, 2488713Sandreas.hansson@arm.com pass it to the bridge. */ 2498713Sandreas.hansson@arm.com virtual AddrRangeList getAddrRanges(); 2508713Sandreas.hansson@arm.com }; 2518713Sandreas.hansson@arm.com 2528713Sandreas.hansson@arm.com 2538713Sandreas.hansson@arm.com /** 2548713Sandreas.hansson@arm.com * Port on the side that forwards requests and receives 2558713Sandreas.hansson@arm.com * responses. The master port has a buffer for the requests not 2568713Sandreas.hansson@arm.com * yet sent. 2578713Sandreas.hansson@arm.com */ 2588922Swilliam.wang@arm.com class BridgeMasterPort : public MasterPort 2598713Sandreas.hansson@arm.com { 2608713Sandreas.hansson@arm.com 2618713Sandreas.hansson@arm.com private: 2628713Sandreas.hansson@arm.com 2638713Sandreas.hansson@arm.com /** A pointer to the bridge to which this port belongs. */ 2648713Sandreas.hansson@arm.com Bridge* bridge; 2658713Sandreas.hansson@arm.com 2668713Sandreas.hansson@arm.com /** 2678713Sandreas.hansson@arm.com * Pointer to the slave port on the other side of the bridge 2688713Sandreas.hansson@arm.com * (connected to the other bus). 2698713Sandreas.hansson@arm.com */ 2708851Sandreas.hansson@arm.com BridgeSlavePort& slavePort; 2712643Sstever@eecs.umich.edu 2722643Sstever@eecs.umich.edu /** Minimum delay though this bridge. */ 2732643Sstever@eecs.umich.edu Tick delay; 2742643Sstever@eecs.umich.edu 2758713Sandreas.hansson@arm.com /** 2768713Sandreas.hansson@arm.com * Request packet queue. Request packets are held in this 2778713Sandreas.hansson@arm.com * queue for a specified delay to model the processing delay 2788713Sandreas.hansson@arm.com * of the bridge. 2798713Sandreas.hansson@arm.com */ 2808713Sandreas.hansson@arm.com std::list<PacketBuffer*> requestQueue; 2814435Ssaidi@eecs.umich.edu 2828713Sandreas.hansson@arm.com /** If we're waiting for a retry to happen. */ 2834435Ssaidi@eecs.umich.edu bool inRetry; 2844435Ssaidi@eecs.umich.edu 2858713Sandreas.hansson@arm.com /** Max queue size for request packets */ 2868713Sandreas.hansson@arm.com unsigned int reqQueueLimit; 2874433Ssaidi@eecs.umich.edu 2882643Sstever@eecs.umich.edu /** 2892643Sstever@eecs.umich.edu * Handle send event, scheduled when the packet at the head of 2902643Sstever@eecs.umich.edu * the outbound queue is ready to transmit (for timing 2912643Sstever@eecs.umich.edu * accesses only). 2922643Sstever@eecs.umich.edu */ 2932643Sstever@eecs.umich.edu void trySend(); 2942643Sstever@eecs.umich.edu 2958713Sandreas.hansson@arm.com /** 2968713Sandreas.hansson@arm.com * Private class for scheduling sending of requests from the 2978713Sandreas.hansson@arm.com * request queue. 2988713Sandreas.hansson@arm.com */ 2992643Sstever@eecs.umich.edu class SendEvent : public Event 3002643Sstever@eecs.umich.edu { 3018851Sandreas.hansson@arm.com BridgeMasterPort& port; 3022643Sstever@eecs.umich.edu 3032643Sstever@eecs.umich.edu public: 3048851Sandreas.hansson@arm.com SendEvent(BridgeMasterPort& p) : port(p) {} 3058851Sandreas.hansson@arm.com virtual void process() { port.trySend(); } 3065336Shines@cs.fsu.edu virtual const char *description() const { return "bridge send"; } 3072643Sstever@eecs.umich.edu }; 3082643Sstever@eecs.umich.edu 3098713Sandreas.hansson@arm.com /** Send event for the request queue. */ 3102643Sstever@eecs.umich.edu SendEvent sendEvent; 3112568SN/A 3122568SN/A public: 3138713Sandreas.hansson@arm.com 3148713Sandreas.hansson@arm.com /** 3158713Sandreas.hansson@arm.com * Constructor for the BridgeMasterPort. 3168713Sandreas.hansson@arm.com * 3178713Sandreas.hansson@arm.com * @param _name the port name including the owner 3188713Sandreas.hansson@arm.com * @param _bridge the structural owner 3198713Sandreas.hansson@arm.com * @param _slavePort the slave port on the other side of the bridge 3208713Sandreas.hansson@arm.com * @param _delay the delay from seeing a request to sending it 3218713Sandreas.hansson@arm.com * @param _req_limit the size of the request queue 3228713Sandreas.hansson@arm.com */ 3238713Sandreas.hansson@arm.com BridgeMasterPort(const std::string &_name, Bridge *_bridge, 3248851Sandreas.hansson@arm.com BridgeSlavePort& _slavePort, int _delay, 3258713Sandreas.hansson@arm.com int _req_limit); 3268713Sandreas.hansson@arm.com 3278713Sandreas.hansson@arm.com /** 3288713Sandreas.hansson@arm.com * Is this side blocked from accepting new request packets. 3298713Sandreas.hansson@arm.com * 3308713Sandreas.hansson@arm.com * @return true if the occupied space has reached the set limit 3318713Sandreas.hansson@arm.com */ 3328713Sandreas.hansson@arm.com bool reqQueueFull(); 3338713Sandreas.hansson@arm.com 3348713Sandreas.hansson@arm.com /** 3358713Sandreas.hansson@arm.com * Queue a request packet to be sent out later and also schedule 3368713Sandreas.hansson@arm.com * a send if necessary. 3378713Sandreas.hansson@arm.com * 3388713Sandreas.hansson@arm.com * @param pkt a request to send out after a delay 3398713Sandreas.hansson@arm.com */ 3408713Sandreas.hansson@arm.com void queueForSendTiming(PacketPtr pkt); 3418713Sandreas.hansson@arm.com 3428713Sandreas.hansson@arm.com /** 3438713Sandreas.hansson@arm.com * Check a functional request against the packets in our 3448713Sandreas.hansson@arm.com * request queue. 3458713Sandreas.hansson@arm.com * 3468713Sandreas.hansson@arm.com * @param pkt packet to check against 3478713Sandreas.hansson@arm.com * 3488713Sandreas.hansson@arm.com * @return true if we find a match 3498713Sandreas.hansson@arm.com */ 3508713Sandreas.hansson@arm.com bool checkFunctional(PacketPtr pkt); 3512568SN/A 3522568SN/A protected: 3532568SN/A 3542643Sstever@eecs.umich.edu /** When receiving a timing request from the peer port, 3552643Sstever@eecs.umich.edu pass it to the bridge. */ 3568975Sandreas.hansson@arm.com virtual bool recvTimingResp(PacketPtr pkt); 3572568SN/A 3582643Sstever@eecs.umich.edu /** When receiving a retry request from the peer port, 3592568SN/A pass it to the bridge. */ 3602657Ssaidi@eecs.umich.edu virtual void recvRetry(); 3612568SN/A }; 3622568SN/A 3638713Sandreas.hansson@arm.com /** Slave port of the bridge. */ 3648713Sandreas.hansson@arm.com BridgeSlavePort slavePort; 3658713Sandreas.hansson@arm.com 3668713Sandreas.hansson@arm.com /** Master port of the bridge. */ 3678713Sandreas.hansson@arm.com BridgeMasterPort masterPort; 3682568SN/A 3692568SN/A /** If this bridge should acknowledge writes. */ 3702568SN/A bool ackWrites; 3712568SN/A 3722568SN/A public: 3734762Snate@binkert.org typedef BridgeParams Params; 3744435Ssaidi@eecs.umich.edu 3754435Ssaidi@eecs.umich.edu protected: 3764435Ssaidi@eecs.umich.edu Params *_params; 3774435Ssaidi@eecs.umich.edu 3784435Ssaidi@eecs.umich.edu public: 3794435Ssaidi@eecs.umich.edu const Params *params() const { return _params; } 3802568SN/A 3818922Swilliam.wang@arm.com virtual MasterPort& getMasterPort(const std::string& if_name, 3828922Swilliam.wang@arm.com int idx = -1); 3838922Swilliam.wang@arm.com virtual SlavePort& getSlavePort(const std::string& if_name, int idx = -1); 3842568SN/A 3852568SN/A virtual void init(); 3862568SN/A 3874435Ssaidi@eecs.umich.edu Bridge(Params *p); 3882568SN/A}; 3892568SN/A 3902568SN/A#endif //__MEM_BUS_HH__ 391