MEM: Add the PortId type and a corresponding id field to Port
authorAndreas Hansson <andreas.hansson@arm.com>
Wed, 25 Apr 2012 14:41:23 +0000 (10:41 -0400)
committerAndreas Hansson <andreas.hansson@arm.com>
Wed, 25 Apr 2012 14:41:23 +0000 (10:41 -0400)
This patch introduces the PortId type, moves the definition of
INVALID_PORT_ID to the Port class, and also gives every port an id to
reflect the fact that each element in a vector port has an
identifier/index.

Previously the bus and Ruby testers (and potentially other users of
the vector ports) added the id field in their port subclasses, and now
this functionality is always present as it is moved to the base class.

src/cpu/testers/directedtest/RubyDirectedTester.cc
src/cpu/testers/directedtest/RubyDirectedTester.hh
src/cpu/testers/rubytest/RubyTester.cc
src/cpu/testers/rubytest/RubyTester.hh
src/mem/bus.cc
src/mem/bus.hh
src/mem/port.cc
src/mem/port.hh

index a6dc257d5c251b2d667b2515376a1ee2817ec1f2..b5fe662af4a6b28ddac917f154296fcc3856bac5 100644 (file)
@@ -93,7 +93,7 @@ RubyDirectedTester::getMasterPort(const std::string &if_name, int idx)
 bool
 RubyDirectedTester::CpuPort::recvTiming(PacketPtr pkt)
 {
-    tester->hitCallback(idx, pkt->getAddr());
+    tester->hitCallback(id, pkt->getAddr());
     
     //
     // Now that the tester has completed, delete the packet, then return
index bd0b52a906dd6b868c2d9e04463bf126a5e314b8..08b034d3f5de98a58d92a76c22b14dadb40ec356 100644 (file)
@@ -54,12 +54,10 @@ class RubyDirectedTester : public MemObject
 
       public:
         CpuPort(const std::string &_name, RubyDirectedTester *_tester,
-                uint32_t _idx)
-            : MasterPort(_name, _tester), tester(_tester), idx(_idx)
+                Port::PortId _id)
+            : MasterPort(_name, _tester, _id), tester(_tester)
         {}
 
-        uint32_t idx;
-
       protected:
         virtual bool recvTiming(PacketPtr pkt);
         virtual void recvRetry()
index 1e98275154ba2d4471c3c938093040bebc14b865..2862a261d440dc1bb0d68cbc05e31e718bbc5e61 100644 (file)
@@ -156,7 +156,7 @@ RubyTester::CpuPort::recvTiming(PacketPtr pkt)
     // pop the sender state from the packet
     pkt->senderState = senderState->saved;
 
-    tester->hitCallback(idx, subblock);
+    tester->hitCallback(id, subblock);
 
     // Now that the tester has completed, delete the senderState
     // (includes sublock) and the packet, then return
index 266209b8f42b509ecbbf65203ec3f4a293897229..5d2202f65b438d1dea33cfb89cdadb3516b2da1d 100644 (file)
@@ -57,12 +57,10 @@ class RubyTester : public MemObject
         // RubyPorts that support both types of requests, separate InstOnly
         // and DataOnly CpuPorts will map to that RubyPort
 
-        CpuPort(const std::string &_name, RubyTester *_tester, int _idx)
-            : MasterPort(_name, _tester), tester(_tester), idx(_idx)
+        CpuPort(const std::string &_name, RubyTester *_tester, PortId _id)
+            : MasterPort(_name, _tester, _id), tester(_tester)
         {}
 
-        int idx;
-
       protected:
         virtual bool recvTiming(PacketPtr pkt);
         virtual void recvRetry()
index daf69c6df8b394e8b6ffb5fec292ab0e6261e790..488c3c4cb5badb56f42cc5a4fa90126eb70e1af7 100644 (file)
@@ -57,7 +57,8 @@ Bus::Bus(const BusParams *p)
     : MemObject(p), clock(p->clock),
       headerCycles(p->header_cycles), width(p->width), tickNextIdle(0),
       drainEvent(NULL), busIdleEvent(this), inRetry(false),
-      defaultPortId(INVALID_PORT_ID), useDefaultRange(p->use_default_range),
+      defaultPortId(Port::INVALID_PORT_ID),
+      useDefaultRange(p->use_default_range),
       defaultBlockSize(p->block_size),
       cachedBlockSize(0), cachedBlockSizeValid(false)
 {
@@ -304,7 +305,7 @@ Bus::recvTimingSnoop(PacketPtr pkt)
         assert(pkt->isExpressSnoop());
 
         // forward to all snoopers
-        forwardTiming(pkt, INVALID_PORT_ID);
+        forwardTiming(pkt, Port::INVALID_PORT_ID);
 
         // a snoop request came from a connected slave device (one of
         // our master ports), and if it is not coming from the slave
@@ -403,7 +404,7 @@ Bus::forwardTiming(PacketPtr pkt, int exclude_slave_port_id)
         // (corresponding to our own slave port that is also in
         // snoopPorts) and should not send it back to where it came
         // from
-        if (exclude_slave_port_id == INVALID_PORT_ID ||
+        if (exclude_slave_port_id == Port::INVALID_PORT_ID ||
             p->getId() != exclude_slave_port_id) {
             // cache is not allowed to refuse snoop
             bool success M5_VAR_USED = p->sendTimingSnoop(pkt);
@@ -467,7 +468,7 @@ Bus::retryWaiting()
 }
 
 void
-Bus::recvRetry(int id)
+Bus::recvRetry(Port::PortId id)
 {
     // we got a retry from a peer that we tried to send something to
     // and failed, but we sent it on the account of someone else, and
@@ -493,7 +494,7 @@ Bus::findPort(Addr addr)
     int dest_id;
 
     dest_id = checkPortCache(addr);
-    if (dest_id != INVALID_PORT_ID)
+    if (dest_id != Port::INVALID_PORT_ID)
         return dest_id;
 
     // Check normal port ranges
@@ -513,7 +514,7 @@ Bus::findPort(Addr addr)
                 return defaultPortId;
             }
         }
-    } else if (defaultPortId != INVALID_PORT_ID) {
+    } else if (defaultPortId != Port::INVALID_PORT_ID) {
         DPRINTF(Bus, "Unable to find destination for addr %#llx, "
                 "will use default port\n", addr);
         return defaultPortId;
@@ -570,7 +571,8 @@ Bus::recvAtomicSnoop(PacketPtr pkt)
     assert(pkt->isRequest());
 
     // forward to all snoopers
-    std::pair<MemCmd, Tick> snoop_result = forwardAtomic(pkt, INVALID_PORT_ID);
+    std::pair<MemCmd, Tick> snoop_result =
+        forwardAtomic(pkt, Port::INVALID_PORT_ID);
     MemCmd snoop_response_cmd = snoop_result.first;
     Tick snoop_response_latency = snoop_result.second;
 
@@ -599,7 +601,7 @@ Bus::forwardAtomic(PacketPtr pkt, int exclude_slave_port_id)
         // (corresponding to our own slave port that is also in
         // snoopPorts) and should not send it back to where it came
         // from
-        if (exclude_slave_port_id == INVALID_PORT_ID ||
+        if (exclude_slave_port_id == Port::INVALID_PORT_ID ||
             p->getId() != exclude_slave_port_id) {
             Tick latency = p->sendAtomicSnoop(pkt);
             // in contrast to a functional access, we have to keep on
@@ -668,7 +670,7 @@ Bus::recvFunctionalSnoop(PacketPtr pkt)
     assert(pkt->isRequest());
 
     // forward to all snoopers
-    forwardFunctional(pkt, INVALID_PORT_ID);
+    forwardFunctional(pkt, Port::INVALID_PORT_ID);
 }
 
 void
@@ -681,7 +683,7 @@ Bus::forwardFunctional(PacketPtr pkt, int exclude_slave_port_id)
         // (corresponding to our own slave port that is also in
         // snoopPorts) and should not send it back to where it came
         // from
-        if (exclude_slave_port_id == INVALID_PORT_ID ||
+        if (exclude_slave_port_id == Port::INVALID_PORT_ID ||
             p->getId() != exclude_slave_port_id)
             p->sendFunctionalSnoop(pkt);
 
@@ -694,7 +696,7 @@ Bus::forwardFunctional(PacketPtr pkt, int exclude_slave_port_id)
 
 /** Function called by the port when the bus is receiving a range change.*/
 void
-Bus::recvRangeChange(int id)
+Bus::recvRangeChange(Port::PortId id)
 {
     AddrRangeList ranges;
     AddrRangeIter iter;
@@ -758,7 +760,7 @@ Bus::recvRangeChange(int id)
 }
 
 AddrRangeList
-Bus::getAddrRanges(int id)
+Bus::getAddrRanges(Port::PortId id)
 {
     AddrRangeList ranges;
 
@@ -799,14 +801,14 @@ Bus::getAddrRanges(int id)
 }
 
 bool
-Bus::isSnooping(int id) const
+Bus::isSnooping(Port::PortId id) const
 {
     // in essence, answer the question if there are snooping ports
     return !snoopPorts.empty();
 }
 
 unsigned
-Bus::findBlockSize(int id)
+Bus::findBlockSize(Port::PortId id)
 {
     if (cachedBlockSizeValid)
         return cachedBlockSize;
index 8a06763531f7ed240e6585b03f95b825e68b24a6..2c05b6025641c0a83356d90633b183ac2a923e58 100644 (file)
@@ -77,18 +77,13 @@ class Bus : public MemObject
         /** A pointer to the bus to which this port belongs. */
         Bus *bus;
 
-        /** A id to keep track of the interface ID of this port. */
-        int id;
-
       public:
 
         /** Constructor for the BusSlavePort.*/
-        BusSlavePort(const std::string &_name, Bus *_bus, int _id)
-            : SlavePort(_name, _bus), bus(_bus), id(_id)
+        BusSlavePort(const std::string &_name, Bus *_bus, Port::PortId _id)
+            : SlavePort(_name, _bus, _id), bus(_bus)
         { }
 
-        int getId() const { return id; }
-
       protected:
 
         /**
@@ -147,18 +142,13 @@ class Bus : public MemObject
         /** A pointer to the bus to which this port belongs. */
         Bus *bus;
 
-        /** A id to keep track of the interface ID of this port. */
-        int id;
-
       public:
 
         /** Constructor for the BusMasterPort.*/
-        BusMasterPort(const std::string &_name, Bus *_bus, int _id)
-            : MasterPort(_name, _bus), bus(_bus), id(_id)
+        BusMasterPort(const std::string &_name, Bus *_bus, Port::PortId _id)
+            : MasterPort(_name, _bus, _id), bus(_bus)
         { }
 
-        int getId() const { return id; }
-
         /**
          * Determine if this port should be considered a snooper. This
          * is determined by the bus.
@@ -254,7 +244,7 @@ class Bus : public MemObject
      * @param pkt Packet to forward
      * @param exclude_slave_port_id Id of slave port to exclude
      */
-    void forwardTiming(PacketPtr pkt, int exclude_slave_port_id);
+    void forwardTiming(PacketPtr pkt, Port::PortId exclude_slave_port_id);
 
     /**
      * Determine if the bus is to be considered occupied when being
@@ -296,7 +286,7 @@ class Bus : public MemObject
      * @return a pair containing the snoop response and snoop latency
      */
     std::pair<MemCmd, Tick> forwardAtomic(PacketPtr pkt,
-                                          int exclude_slave_port_id);
+                                          Port::PortId exclude_slave_port_id);
 
     /** Function called by the port when the bus is recieving a Functional
         transaction.*/
@@ -314,14 +304,14 @@ class Bus : public MemObject
      * @param pkt Packet to forward
      * @param exclude_slave_port_id Id of slave port to exclude
      */
-    void forwardFunctional(PacketPtr pkt, int exclude_slave_port_id);
+    void forwardFunctional(PacketPtr pkt, Port::PortId exclude_slave_port_id);
 
     /** Timing function called by port when it is once again able to process
      * requests. */
-    void recvRetry(int id);
+    void recvRetry(Port::PortId id);
 
     /** Function called by the port when the bus is recieving a range change.*/
-    void recvRangeChange(int id);
+    void recvRangeChange(Port::PortId id);
 
     /** Find which port connected to this bus (if any) should be given a packet
      * with this address.
@@ -333,7 +323,7 @@ class Bus : public MemObject
     // Cache for the findPort function storing recently used ports from portMap
     struct PortCache {
         bool valid;
-        int  id;
+        Port::PortId id;
         Addr start;
         Addr end;
     };
@@ -356,7 +346,7 @@ class Bus : public MemObject
             return portCache[2].id;
         }
 
-        return INVALID_PORT_ID;
+        return Port::INVALID_PORT_ID;
     }
 
     // Clears the earliest entry of the cache and inserts a new port entry
@@ -391,7 +381,7 @@ class Bus : public MemObject
      *
      * @return a list of non-overlapping address ranges
      */
-    AddrRangeList getAddrRanges(int id);
+    AddrRangeList getAddrRanges(Port::PortId id);
 
     /**
      * Determine if the bus port is snooping or not.
@@ -400,7 +390,7 @@ class Bus : public MemObject
      *
      * @return a boolean indicating if this port is snooping or not
      */
-    bool isSnooping(int id) const;
+    bool isSnooping(Port::PortId id) const;
 
     /** Calculate the timing parameters for the packet.  Updates the
      * firstWordTime and finishTime fields of the packet object.
@@ -429,13 +419,13 @@ class Bus : public MemObject
      * @param id id of the busport that made the request
      * @return the max of all the sizes
      */
-    unsigned findBlockSize(int id);
+    unsigned findBlockSize(Port::PortId id);
 
     // event used to schedule a release of the bus
     EventWrapper<Bus, &Bus::releaseBus> busIdleEvent;
 
     bool inRetry;
-    std::set<int> inRecvRangeChange;
+    std::set<Port::PortId> inRecvRangeChange;
 
     /** The master and slave ports of the bus */
     std::vector<BusSlavePort*> slavePorts;
@@ -467,9 +457,6 @@ class Bus : public MemObject
     /** Port that handles requests that don't match any of the interfaces.*/
     short defaultPortId;
 
-    /** A symbolic name for a port id that denotes no port. */
-    static const short INVALID_PORT_ID = -1;
-
     /** If true, use address range provided by default device.  Any
        address not handled by another port and not in default device's
        range will cause a fatal error.  If false, just send all
index 4b7b040cbdd647668de1d6830340a69038b36a64..fc3a42c022df4b2398784039ae3305123370ee5d 100644 (file)
@@ -50,8 +50,8 @@
 #include "mem/mem_object.hh"
 #include "mem/port.hh"
 
-Port::Port(const std::string &_name, MemObject& _owner)
-    : portName(_name), peer(NULL), owner(_owner)
+Port::Port(const std::string &_name, MemObject& _owner, PortId _id)
+    : portName(_name), id(_id), peer(NULL), owner(_owner)
 {
 }
 
@@ -62,8 +62,8 @@ Port::~Port()
 /**
  * Master port
  */
-MasterPort::MasterPort(const std::string& name, MemObject* owner)
-    : Port(name, *owner), _slavePort(NULL)
+MasterPort::MasterPort(const std::string& name, MemObject* owner, PortId _id)
+    : Port(name, *owner, _id), _slavePort(NULL)
 {
 }
 
@@ -130,8 +130,8 @@ MasterPort::printAddr(Addr a)
 /**
  * Slave port
  */
-SlavePort::SlavePort(const std::string& name, MemObject* owner)
-    : Port(name, *owner), _masterPort(NULL)
+SlavePort::SlavePort(const std::string& name, MemObject* owner, PortId id)
+    : Port(name, *owner, id), _masterPort(NULL)
 {
 }
 
index 61c92d8e4388654e9d513474602deec2c803e58f..e1f643e8e554883793e39e76a701a3989d4edca9 100644 (file)
@@ -79,6 +79,14 @@ class MemObject;
 class Port
 {
 
+  public:
+
+    /** A type name for the port identifier. */
+    typedef int PortId;
+
+    /** A symbolic name for the absence of a port id. */
+    static const PortId INVALID_PORT_ID = -1;
+
   private:
 
     /** Descriptive name (for DPRINTF output) */
@@ -86,6 +94,12 @@ class Port
 
   protected:
 
+    /**
+     * A numeric identifier to distinguish ports in a vector, and set
+     * to INVALID_PORT_ID in case this port is not part of a vector.
+     */
+    const PortId id;
+
     /** A pointer to the peer port.  */
     Port* peer;
 
@@ -97,8 +111,9 @@ class Port
      *
      * @param _name Port name including the owners name
      * @param _owner The MemObject that is the structural owner of this port
+     * @param _id A port identifier for vector ports
      */
-    Port(const std::string& _name, MemObject& _owner);
+    Port(const std::string& _name, MemObject& _owner, PortId _id);
 
     /**
      * Virtual destructor due to inheritance.
@@ -110,6 +125,9 @@ class Port
     /** Return port name (for DPRINTF). */
     const std::string name() const { return portName; }
 
+    /** Get the port id. */
+    PortId getId() const { return id; }
+
   protected:
 
     /** These functions are protected because they should only be
@@ -190,7 +208,8 @@ class MasterPort : public Port
 
   public:
 
-    MasterPort(const std::string& name, MemObject* owner);
+    MasterPort(const std::string& name, MemObject* owner,
+               PortId id = INVALID_PORT_ID);
     virtual ~MasterPort();
 
     void bind(SlavePort& slave_port);
@@ -286,7 +305,8 @@ class SlavePort : public Port
 
   public:
 
-    SlavePort(const std::string& name, MemObject* owner);
+    SlavePort(const std::string& name, MemObject* owner,
+              PortId id = INVALID_PORT_ID);
     virtual ~SlavePort();
 
     void bind(MasterPort& master_port);