mem: Clean up the xbars a little.

Get rid of comments which just restate the code, get rid of redundant
"virtual" keywords, add "override"s, fix style, and get rid of
xbar::init which was empty and hiding the parent class init.

Change-Id: I8ce20abee340baa88084d142f2fb8c633ee54ba9
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/17592
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>
This commit is contained in:
Gabe Black
2019-03-22 14:23:21 -07:00
parent fcc4c4fed9
commit 599d2c91f8
5 changed files with 145 additions and 199 deletions

View File

@@ -71,8 +71,8 @@ CoherentXBar::CoherentXBar(const CoherentXBarParams *p)
masterPorts.push_back(bp);
reqLayers.push_back(new ReqLayer(*bp, *this,
csprintf(".reqLayer%d", i)));
snoopLayers.push_back(new SnoopRespLayer(*bp, *this,
csprintf(".snoopLayer%d", i)));
snoopLayers.push_back(
new SnoopRespLayer(*bp, *this, csprintf(".snoopLayer%d", i)));
}
// see if we have a default slave device connected and if so add
@@ -81,10 +81,10 @@ CoherentXBar::CoherentXBar(const CoherentXBarParams *p)
defaultPortID = masterPorts.size();
std::string portName = name() + ".default";
MasterPort* bp = new CoherentXBarMasterPort(portName, *this,
defaultPortID);
defaultPortID);
masterPorts.push_back(bp);
reqLayers.push_back(new ReqLayer(*bp, *this, csprintf(".reqLayer%d",
defaultPortID)));
defaultPortID)));
snoopLayers.push_back(new SnoopRespLayer(*bp, *this,
csprintf(".snoopLayer%d",
defaultPortID)));

View File

@@ -108,35 +108,35 @@ class CoherentXBar : public BaseXBar
protected:
/**
* When receiving a timing request, pass it to the crossbar.
*/
virtual bool recvTimingReq(PacketPtr pkt)
{ return xbar.recvTimingReq(pkt, id); }
bool
recvTimingReq(PacketPtr pkt) override
{
return xbar.recvTimingReq(pkt, id);
}
/**
* When receiving a timing snoop response, pass it to the crossbar.
*/
virtual bool recvTimingSnoopResp(PacketPtr pkt)
{ return xbar.recvTimingSnoopResp(pkt, id); }
bool
recvTimingSnoopResp(PacketPtr pkt) override
{
return xbar.recvTimingSnoopResp(pkt, id);
}
/**
* When receiving an atomic request, pass it to the crossbar.
*/
virtual Tick recvAtomic(PacketPtr pkt)
{ return xbar.recvAtomic(pkt, id); }
Tick
recvAtomic(PacketPtr pkt) override
{
return xbar.recvAtomic(pkt, id);
}
/**
* When receiving a functional request, pass it to the crossbar.
*/
virtual void recvFunctional(PacketPtr pkt)
{ xbar.recvFunctional(pkt, id); }
void
recvFunctional(PacketPtr pkt) override
{
xbar.recvFunctional(pkt, id);
}
/**
* Return the union of all adress ranges seen by this crossbar.
*/
virtual AddrRangeList getAddrRanges() const
{ return xbar.getAddrRanges(); }
AddrRangeList
getAddrRanges() const override
{
return xbar.getAddrRanges();
}
};
@@ -166,42 +166,34 @@ class CoherentXBar : public BaseXBar
*
* @return a boolean that is true if this port is snooping
*/
virtual bool isSnooping() const
{ return true; }
bool isSnooping() const override { return true; }
/**
* When receiving a timing response, pass it to the crossbar.
*/
virtual bool recvTimingResp(PacketPtr pkt)
{ return xbar.recvTimingResp(pkt, id); }
bool
recvTimingResp(PacketPtr pkt) override
{
return xbar.recvTimingResp(pkt, id);
}
/**
* When receiving a timing snoop request, pass it to the crossbar.
*/
virtual void recvTimingSnoopReq(PacketPtr pkt)
{ return xbar.recvTimingSnoopReq(pkt, id); }
void
recvTimingSnoopReq(PacketPtr pkt) override
{
return xbar.recvTimingSnoopReq(pkt, id);
}
/**
* When receiving an atomic snoop request, pass it to the crossbar.
*/
virtual Tick recvAtomicSnoop(PacketPtr pkt)
{ return xbar.recvAtomicSnoop(pkt, id); }
Tick
recvAtomicSnoop(PacketPtr pkt) override
{
return xbar.recvAtomicSnoop(pkt, id);
}
/**
* When receiving a functional snoop request, pass it to the crossbar.
*/
virtual void recvFunctionalSnoop(PacketPtr pkt)
{ xbar.recvFunctionalSnoop(pkt, id); }
void
recvFunctionalSnoop(PacketPtr pkt) override
{
xbar.recvFunctionalSnoop(pkt, id);
}
/** When reciving a range change from the peer port (at id),
pass it to the crossbar. */
virtual void recvRangeChange()
{ xbar.recvRangeChange(id); }
/** When reciving a retry from the peer port (at id),
pass it to the crossbar. */
virtual void recvReqRetry()
{ xbar.recvReqRetry(id); }
void recvRangeChange() override { xbar.recvRangeChange(id); }
void recvReqRetry() override { xbar.recvReqRetry(id); }
};
@@ -231,23 +223,23 @@ class CoherentXBar : public BaseXBar
* Override the sending of retries and pass them on through
* the mirrored slave port.
*/
void sendRetryResp() {
void
sendRetryResp() override
{
// forward it as a snoop response retry
slavePort.sendRetrySnoopResp();
}
/**
* Provided as necessary.
*/
void recvReqRetry() { panic("SnoopRespPort should never see retry\n"); }
/**
* Provided as necessary.
*/
bool recvTimingResp(PacketPtr pkt)
void
recvReqRetry() override
{
panic("SnoopRespPort should never see timing response\n");
return false;
panic("SnoopRespPort should never see retry");
}
bool
recvTimingResp(PacketPtr pkt) override
{
panic("SnoopRespPort should never see timing response");
}
};
@@ -280,13 +272,8 @@ class CoherentXBar : public BaseXBar
* broadcast needed for probes. NULL denotes an absent filter. */
SnoopFilter *snoopFilter;
/** Cycles of snoop response latency.*/
const Cycles snoopResponseLatency;
/** Is this crossbar the point of coherency? **/
const bool pointOfCoherency;
/** Is this crossbar the point of unification? **/
const bool pointOfUnification;
/**
@@ -295,24 +282,10 @@ class CoherentXBar : public BaseXBar
*/
std::unique_ptr<Packet> pendingDelete;
/** Function called by the port when the crossbar is recieving a Timing
request packet.*/
bool recvTimingReq(PacketPtr pkt, PortID slave_port_id);
/** Function called by the port when the crossbar is recieving a Timing
response packet.*/
bool recvTimingResp(PacketPtr pkt, PortID master_port_id);
/** Function called by the port when the crossbar is recieving a timing
snoop request.*/
void recvTimingSnoopReq(PacketPtr pkt, PortID master_port_id);
/** Function called by the port when the crossbar is recieving a timing
snoop response.*/
bool recvTimingSnoopResp(PacketPtr pkt, PortID slave_port_id);
/** Timing function called by port when it is once again able to process
* requests. */
void recvReqRetry(PortID master_port_id);
/**
@@ -323,7 +296,9 @@ class CoherentXBar : public BaseXBar
* @param pkt Packet to forward
* @param exclude_slave_port_id Id of slave port to exclude
*/
void forwardTiming(PacketPtr pkt, PortID exclude_slave_port_id) {
void
forwardTiming(PacketPtr pkt, PortID exclude_slave_port_id)
{
forwardTiming(pkt, exclude_slave_port_id, snoopPorts);
}
@@ -339,12 +314,7 @@ class CoherentXBar : public BaseXBar
void forwardTiming(PacketPtr pkt, PortID exclude_slave_port_id,
const std::vector<QueuedSlavePort*>& dests);
/** Function called by the port when the crossbar is recieving a Atomic
transaction.*/
Tick recvAtomic(PacketPtr pkt, PortID slave_port_id);
/** Function called by the port when the crossbar is recieving an
atomic snoop transaction.*/
Tick recvAtomicSnoop(PacketPtr pkt, PortID master_port_id);
/**
@@ -357,8 +327,8 @@ class CoherentXBar : public BaseXBar
*
* @return a pair containing the snoop response and snoop latency
*/
std::pair<MemCmd, Tick> forwardAtomic(PacketPtr pkt,
PortID exclude_slave_port_id)
std::pair<MemCmd, Tick>
forwardAtomic(PacketPtr pkt, PortID exclude_slave_port_id)
{
return forwardAtomic(pkt, exclude_slave_port_id, InvalidPortID,
snoopPorts);
@@ -423,7 +393,8 @@ class CoherentXBar : public BaseXBar
*
* @return Whether the memory below is the destination for the packet
*/
bool isDestination(const PacketPtr pkt) const
bool
isDestination(const PacketPtr pkt) const
{
return (pkt->req->isToPOC() && pointOfCoherency) ||
(pkt->req->isToPOU() && pointOfUnification);

View File

@@ -104,30 +104,29 @@ class NoncoherentXBar : public BaseXBar
protected:
/**
* When receiving a timing request, pass it to the crossbar.
*/
virtual bool recvTimingReq(PacketPtr pkt)
{ return xbar.recvTimingReq(pkt, id); }
bool
recvTimingReq(PacketPtr pkt) override
{
return xbar.recvTimingReq(pkt, id);
}
/**
* When receiving an atomic request, pass it to the crossbar.
*/
virtual Tick recvAtomic(PacketPtr pkt)
{ return xbar.recvAtomic(pkt, id); }
Tick
recvAtomic(PacketPtr pkt) override
{
return xbar.recvAtomic(pkt, id);
}
/**
* When receiving a functional request, pass it to the crossbar.
*/
virtual void recvFunctional(PacketPtr pkt)
{ xbar.recvFunctional(pkt, id); }
/**
* Return the union of all adress ranges seen by this crossbar.
*/
virtual AddrRangeList getAddrRanges() const
{ return xbar.getAddrRanges(); }
void
recvFunctional(PacketPtr pkt) override
{
xbar.recvFunctional(pkt, id);
}
AddrRangeList
getAddrRanges() const override
{
return xbar.getAddrRanges();
}
};
/**
@@ -151,42 +150,29 @@ class NoncoherentXBar : public BaseXBar
protected:
/**
* When receiving a timing response, pass it to the crossbar.
*/
virtual bool recvTimingResp(PacketPtr pkt)
{ return xbar.recvTimingResp(pkt, id); }
bool
recvTimingResp(PacketPtr pkt) override
{
return xbar.recvTimingResp(pkt, id);
}
/** When reciving a range change from the peer port (at id),
pass it to the crossbar. */
virtual void recvRangeChange()
{ xbar.recvRangeChange(id); }
/** When reciving a retry from the peer port (at id),
pass it to the crossbar. */
virtual void recvReqRetry()
{ xbar.recvReqRetry(id); }
void
recvRangeChange() override
{
xbar.recvRangeChange(id);
}
void
recvReqRetry() override
{
xbar.recvReqRetry(id);
}
};
/** Function called by the port when the crossbar is recieving a Timing
request packet.*/
virtual bool recvTimingReq(PacketPtr pkt, PortID slave_port_id);
/** Function called by the port when the crossbar is recieving a Timing
response packet.*/
virtual bool recvTimingResp(PacketPtr pkt, PortID master_port_id);
/** Timing function called by port when it is once again able to process
* requests. */
void recvReqRetry(PortID master_port_id);
/** Function called by the port when the crossbar is recieving a Atomic
transaction.*/
Tick recvAtomic(PacketPtr pkt, PortID slave_port_id);
/** Function called by the port when the crossbar is recieving a Functional
transaction.*/
void recvFunctional(PacketPtr pkt, PortID slave_port_id);
public:
@@ -195,10 +181,7 @@ class NoncoherentXBar : public BaseXBar
virtual ~NoncoherentXBar();
/**
* stats
*/
virtual void regStats();
void regStats() override;
Stats::Scalar totPktSize;
};

View File

@@ -76,11 +76,6 @@ BaseXBar::~BaseXBar()
delete s;
}
void
BaseXBar::init()
{
}
Port &
BaseXBar::getPort(const std::string &if_name, PortID idx)
{
@@ -136,7 +131,7 @@ BaseXBar::calcPacketTiming(PacketPtr pkt, Tick header_delay)
}
template <typename SrcType, typename DstType>
BaseXBar::Layer<SrcType,DstType>::Layer(DstType& _port, BaseXBar& _xbar,
BaseXBar::Layer<SrcType, DstType>::Layer(DstType& _port, BaseXBar& _xbar,
const std::string& _name) :
port(_port), xbar(_xbar), _name(_name), state(IDLE),
waitingForPeer(NULL), releaseEvent([this]{ releaseLayer(); }, name())
@@ -144,7 +139,7 @@ BaseXBar::Layer<SrcType,DstType>::Layer(DstType& _port, BaseXBar& _xbar,
}
template <typename SrcType, typename DstType>
void BaseXBar::Layer<SrcType,DstType>::occupyLayer(Tick until)
void BaseXBar::Layer<SrcType, DstType>::occupyLayer(Tick until)
{
// ensure the state is busy at this point, as the layer should
// transition from idle as soon as it has decided to forward the
@@ -165,7 +160,7 @@ void BaseXBar::Layer<SrcType,DstType>::occupyLayer(Tick until)
template <typename SrcType, typename DstType>
bool
BaseXBar::Layer<SrcType,DstType>::tryTiming(SrcType* src_port)
BaseXBar::Layer<SrcType, DstType>::tryTiming(SrcType* src_port)
{
// if we are in the retry state, we will not see anything but the
// retrying port (or in the case of the snoop ports the snoop
@@ -196,7 +191,7 @@ BaseXBar::Layer<SrcType,DstType>::tryTiming(SrcType* src_port)
template <typename SrcType, typename DstType>
void
BaseXBar::Layer<SrcType,DstType>::succeededTiming(Tick busy_time)
BaseXBar::Layer<SrcType, DstType>::succeededTiming(Tick busy_time)
{
// we should have gone from idle or retry to busy in the tryTiming
// test
@@ -208,7 +203,7 @@ BaseXBar::Layer<SrcType,DstType>::succeededTiming(Tick busy_time)
template <typename SrcType, typename DstType>
void
BaseXBar::Layer<SrcType,DstType>::failedTiming(SrcType* src_port,
BaseXBar::Layer<SrcType, DstType>::failedTiming(SrcType* src_port,
Tick busy_time)
{
// ensure no one got in between and tried to send something to
@@ -230,7 +225,7 @@ BaseXBar::Layer<SrcType,DstType>::failedTiming(SrcType* src_port,
template <typename SrcType, typename DstType>
void
BaseXBar::Layer<SrcType,DstType>::releaseLayer()
BaseXBar::Layer<SrcType, DstType>::releaseLayer()
{
// releasing the bus means we should now be idle
assert(state == BUSY);
@@ -254,7 +249,7 @@ BaseXBar::Layer<SrcType,DstType>::releaseLayer()
template <typename SrcType, typename DstType>
void
BaseXBar::Layer<SrcType,DstType>::retryWaiting()
BaseXBar::Layer<SrcType, DstType>::retryWaiting()
{
// this should never be called with no one waiting
assert(!waitingForLayer.empty());
@@ -289,7 +284,7 @@ BaseXBar::Layer<SrcType,DstType>::retryWaiting()
template <typename SrcType, typename DstType>
void
BaseXBar::Layer<SrcType,DstType>::recvRetry()
BaseXBar::Layer<SrcType, DstType>::recvRetry()
{
// we should never get a retry without having failed to forward
// something to this port
@@ -573,7 +568,7 @@ BaseXBar::regStats()
template <typename SrcType, typename DstType>
DrainState
BaseXBar::Layer<SrcType,DstType>::drain()
BaseXBar::Layer<SrcType, DstType>::drain()
{
//We should check that we're not "doing" anything, and that noone is
//waiting. We might be idle but have someone waiting if the device we
@@ -588,7 +583,7 @@ BaseXBar::Layer<SrcType,DstType>::drain()
template <typename SrcType, typename DstType>
void
BaseXBar::Layer<SrcType,DstType>::regStats()
BaseXBar::Layer<SrcType, DstType>::regStats()
{
using namespace Stats;
@@ -611,5 +606,5 @@ BaseXBar::Layer<SrcType,DstType>::regStats()
* file, but since there are only two given options (MasterPort and
* SlavePort) it seems a bit excessive at this point.
*/
template class BaseXBar::Layer<SlavePort,MasterPort>;
template class BaseXBar::Layer<MasterPort,SlavePort>;
template class BaseXBar::Layer<SlavePort, MasterPort>;
template class BaseXBar::Layer<MasterPort, SlavePort>;

View File

@@ -116,9 +116,6 @@ class BaseXBar : public MemObject
*/
DrainState drain() override;
/**
* Get the crossbar layer's name
*/
const std::string name() const { return xbar.name() + _name; }
@@ -154,7 +151,6 @@ class BaseXBar : public MemObject
*/
void failedTiming(SrcType* src_port, Tick busy_time);
/** Occupy the layer until until */
void occupyLayer(Tick until);
/**
@@ -170,9 +166,6 @@ class BaseXBar : public MemObject
*/
void recvRetry();
/**
* Register stats for the layer
*/
void regStats();
protected:
@@ -193,7 +186,6 @@ class BaseXBar : public MemObject
/** The crossbar this layer is a part of. */
BaseXBar& xbar;
/** A name for this layer. */
std::string _name;
/**
@@ -214,7 +206,6 @@ class BaseXBar : public MemObject
*/
enum State { IDLE, BUSY, RETRY };
/** track the state of the layer */
State state;
/**
@@ -235,8 +226,6 @@ class BaseXBar : public MemObject
* potential waiting port, or drain if asked to do so.
*/
void releaseLayer();
/** event used to schedule a release of the layer */
EventFunctionWrapper releaseEvent;
/**
@@ -249,7 +238,7 @@ class BaseXBar : public MemObject
};
class ReqLayer : public Layer<SlavePort,MasterPort>
class ReqLayer : public Layer<SlavePort, MasterPort>
{
public:
/**
@@ -260,15 +249,18 @@ class BaseXBar : public MemObject
* @param _name the layer's name
*/
ReqLayer(MasterPort& _port, BaseXBar& _xbar, const std::string& _name) :
Layer(_port, _xbar, _name) {}
Layer(_port, _xbar, _name)
{}
protected:
void sendRetry(SlavePort* retry_port)
{ retry_port->sendRetryReq(); }
void
sendRetry(SlavePort* retry_port) override
{
retry_port->sendRetryReq();
}
};
class RespLayer : public Layer<MasterPort,SlavePort>
class RespLayer : public Layer<MasterPort, SlavePort>
{
public:
/**
@@ -278,16 +270,20 @@ class BaseXBar : public MemObject
* @param _xbar the crossbar this layer belongs to
* @param _name the layer's name
*/
RespLayer(SlavePort& _port, BaseXBar& _xbar, const std::string& _name) :
Layer(_port, _xbar, _name) {}
RespLayer(SlavePort& _port, BaseXBar& _xbar,
const std::string& _name) :
Layer(_port, _xbar, _name)
{}
protected:
void sendRetry(MasterPort* retry_port)
{ retry_port->sendRetryResp(); }
void
sendRetry(MasterPort* retry_port) override
{
retry_port->sendRetryResp();
}
};
class SnoopRespLayer : public Layer<SlavePort,MasterPort>
class SnoopRespLayer : public Layer<SlavePort, MasterPort>
{
public:
/**
@@ -299,12 +295,16 @@ class BaseXBar : public MemObject
*/
SnoopRespLayer(MasterPort& _port, BaseXBar& _xbar,
const std::string& _name) :
Layer(_port, _xbar, _name) {}
Layer(_port, _xbar, _name)
{}
protected:
void sendRetry(SlavePort* retry_port)
{ retry_port->sendRetrySnoopResp(); }
void
sendRetry(SlavePort* retry_port) override
{
retry_port->sendRetrySnoopResp();
}
};
/**
@@ -312,9 +312,7 @@ class BaseXBar : public MemObject
* and to decode the address.
*/
const Cycles frontendLatency;
/** Cycles of forward latency */
const Cycles forwardLatency;
/** Cycles of response latency */
const Cycles responseLatency;
/** the width of the xbar in bytes */
const uint32_t width;
@@ -417,7 +415,6 @@ class BaseXBar : public MemObject
PortID idx=InvalidPortID) override;
void regStats() override;
};
#endif //__MEM_XBAR_HH__