Add the bus and connector objects to scons
authorAli Saidi <saidi@eecs.umich.edu>
Mon, 27 Mar 2006 02:44:22 +0000 (21:44 -0500)
committerAli Saidi <saidi@eecs.umich.edu>
Mon, 27 Mar 2006 02:44:22 +0000 (21:44 -0500)
change getPort parameter from char* to string
Add an extra phase between construction and init called connect

SConscript:
    Add the bus and connector objects to scons
cpu/simple/cpu.cc:
cpu/simple/cpu.hh:
    the connection to memory shouldn't be made until we know the memory
    object exists (e.g. after construction)
dev/io_device.hh:
    change to const string
mem/bus.hh:
    change getPort parameter from char* to string
    initialize num_interfaces
mem/mem_object.hh:
    change getPort parameter from char* to string
mem/physical.cc:
mem/physical.hh:
    change getPort parameter from char* to string
    get rid of the bus object I created last time
python/m5/objects/PhysicalMemory.py:
    get rid of the bus object I created last time
sim/main.cc:
sim/sim_object.cc:
sim/sim_object.hh:
    Add an extra phase between construction and init called connect

--HG--
extra : convert_revision : 0e994f93374fa72a06d291655c440ff1b8e155a9

12 files changed:
SConscript
cpu/simple/cpu.cc
cpu/simple/cpu.hh
dev/io_device.hh
mem/bus.hh
mem/mem_object.hh
mem/physical.cc
mem/physical.hh
python/m5/objects/PhysicalMemory.py
sim/main.cc
sim/sim_object.cc
sim/sim_object.hh

index ae77cbbc60682496832d6bba4a0ac3adb2a13642..d891f0d6d026075a43ae6cf28b09e54cf073bd5f 100644 (file)
@@ -88,11 +88,13 @@ base_sources = Split('''
        cpu/static_inst.cc
         cpu/sampler/sampler.cc
 
+        mem/connector.cc
         mem/mem_object.cc
         mem/page_table.cc
         mem/physical.cc
         mem/port.cc
         mem/translating_port.cc
+        mem/bus.cc
 
         python/pyconfig.cc
         python/embedded_py.cc
index d188074d42f944efda328c5edd528ad8de9abf14..8a9e41d532a04bf68f0c5b41b0c4063fb426f9a5 100644 (file)
@@ -86,6 +86,15 @@ SimpleCPU::TickEvent::TickEvent(SimpleCPU *c, int w)
 void
 SimpleCPU::init()
 {
+    //Create Memory Ports (conect them up)
+    Port *mem_dport = mem->getPort("");
+    dcachePort.setPeer(mem_dport);
+    mem_dport->setPeer(&dcachePort);
+
+    Port *mem_iport = mem->getPort("");
+    icachePort.setPeer(mem_iport);
+    mem_iport->setPeer(&icachePort);
+
     BaseCPU::init();
 #if FULL_SYSTEM
     for (int i = 0; i < execContexts.size(); ++i) {
@@ -146,20 +155,11 @@ SimpleCPU::CpuPort::recvRetry()
 }
 
 SimpleCPU::SimpleCPU(Params *p)
-    : BaseCPU(p), icachePort(this),
+    : BaseCPU(p), mem(p->mem), icachePort(this),
       dcachePort(this), tickEvent(this, p->width), cpuXC(NULL)
 {
     _status = Idle;
 
-    //Create Memory Ports (conect them up)
-    Port *mem_dport = p->mem->getPort();
-    dcachePort.setPeer(mem_dport);
-    mem_dport->setPeer(&dcachePort);
-
-    Port *mem_iport = p->mem->getPort();
-    icachePort.setPeer(mem_iport);
-    mem_iport->setPeer(&icachePort);
-
 #if FULL_SYSTEM
     cpuXC = new CPUExecContext(this, 0, p->system, p->itb, p->dtb, p->mem);
 #else
index dc07027f984dee9d1be55a894bfdd3d710bec5f5..43287a33b3eb40a4d564b1acef5222dde2a077bc 100644 (file)
@@ -105,6 +105,7 @@ class SimpleCPU : public BaseCPU
         virtual Packet *recvRetry();
     };
 
+    MemObject *mem;
     CpuPort icachePort;
     CpuPort dcachePort;
 
index b25048e3ddcbe43f80fa382c1f9967718fbc7754..ba16372cc181ded014becbc594c1951bdad2eab6 100644 (file)
@@ -203,7 +203,7 @@ class PioDevice : public SimObject
 
     virtual ~PioDevice();
 
-    virtual Port *getPort(std::string if_name)
+    virtual Port *getPort(const std::string &if_name)
     {
         if (if_name == "pio")
             return pioPort;
@@ -223,7 +223,7 @@ class DmaDevice : public PioDevice
     DmaDevice(const std::string &name, Platform *p);
     virtual ~DmaDevice();
 
-    virtual Port *getPort(std::string if_name)
+    virtual Port *getPort(const std::string &if_name)
     {
         if (if_name == "pio")
             return pioPort;
index 7790bdce38f7c24f2771ab0fcd30b2b9e82faab0..54de8aa1ec963a404e2e6e632ae88590df7b98bf 100644 (file)
@@ -137,7 +137,7 @@ class Bus : public MemObject
   public:
 
     /** A function used to return the port associated with this bus object. */
-    virtual Port *getPort(const char *if_name)
+    virtual Port *getPort(const std::string &if_name)
     {
         // if_name ignored?  forced to be empty?
         int id = num_interfaces++;
@@ -145,7 +145,7 @@ class Bus : public MemObject
         return interfaces[id];
     }
     Bus(const std::string &n)
-        : MemObject(n) {}
+        : MemObject(n), num_interfaces(0) {}
 
 };
 
index 7b3d942a4dba5012660d17aa2637005f50b5e0be..58930ecccf303645b00ce807eca3f21dd9eb89e2 100644 (file)
@@ -48,7 +48,7 @@ class MemObject : public SimObject
 
   public:
     /** Additional function to return the Port of a memory object. */
-    virtual Port *getPort(const char *if_name = NULL) = 0;
+    virtual Port *getPort(const std::string &if_name) = 0;
 };
 
 #endif //__MEM_MEM_OBJECT_HH__
index e6d1f1662d2ea4f19271df73ad3dbf09914a4cce..f16b79a8d85fa6aaaec0671c1bab42c021cfdd6e 100644 (file)
@@ -69,8 +69,8 @@ PhysicalMemory::MemResponseEvent::description()
     return "Physical Memory Timing Access respnse event";
 }
 
-PhysicalMemory::PhysicalMemory(const string &n, MemObject *bus)
-    : MemObject(n), memPort(this), base_addr(0), pmem_addr(NULL)
+PhysicalMemory::PhysicalMemory(const string &n)
+    : MemObject(n), base_addr(0), pmem_addr(NULL)
 {
     // Hardcoded to 128 MB for now.
     pmem_size = 1 << 27;
@@ -88,14 +88,6 @@ PhysicalMemory::PhysicalMemory(const string &n, MemObject *bus)
     }
 
     page_ptr = 0;
-
-    Port *peer_port;
-    peer_port = bus->getPort();
-    memPort.setPeer(peer_port);
-    peer_port->setPeer(&memPort);
-
-
-
 }
 
 PhysicalMemory::~PhysicalMemory()
@@ -160,10 +152,13 @@ PhysicalMemory::doFunctionalAccess(Packet &pkt)
 }
 
 Port *
-PhysicalMemory::getPort(const char *if_name)
+PhysicalMemory::getPort(const std::string &if_name)
 {
-    if (if_name == NULL) {
-        return new MemoryPort(this);
+    if (if_name == "") {
+        if (port != NULL)
+           panic("PhysicalMemory::getPort: additional port requested to memory!");
+        port = new MemoryPort(this);
+        return port;
     } else {
         panic("PhysicalMemory::getPort: unknown port %s requested", if_name);
     }
@@ -341,7 +336,6 @@ BEGIN_DECLARE_SIM_OBJECT_PARAMS(PhysicalMemory)
     SimObjectParam<MemoryController *> mmu;
 #endif
     Param<Range<Addr> > range;
-    SimObjectParam<MemObject*> bus;
 
 END_DECLARE_SIM_OBJECT_PARAMS(PhysicalMemory)
 
@@ -351,8 +345,7 @@ BEGIN_INIT_SIM_OBJECT_PARAMS(PhysicalMemory)
 #if FULL_SYSTEM
     INIT_PARAM(mmu, "Memory Controller"),
 #endif
-    INIT_PARAM(range, "Device Address Range"),
-    INIT_PARAM(bus, "bus object memory connects to")
+    INIT_PARAM(range, "Device Address Range")
 
 END_INIT_SIM_OBJECT_PARAMS(PhysicalMemory)
 
@@ -364,7 +357,7 @@ CREATE_SIM_OBJECT(PhysicalMemory)
     }
 #endif
 
-    return new PhysicalMemory(getInstanceName(), bus);
+    return new PhysicalMemory(getInstanceName());
 }
 
 REGISTER_SIM_OBJECT("PhysicalMemory", PhysicalMemory)
index 2087bf763a3d506ae28e5d29b14b883372e3b885..6d7d809a12bdb7d764a172298b3d0d4e293d3ae5 100644 (file)
@@ -69,9 +69,7 @@ class PhysicalMemory : public MemObject
         virtual int deviceBlockSize();
     };
 
-    MemoryPort memPort;
-
-    virtual Port * getPort(const char *if_name);
+    virtual Port *getPort(const std::string &if_name);
 
     int numPorts;
 
@@ -96,6 +94,7 @@ class PhysicalMemory : public MemObject
     Addr base_addr;
     Addr pmem_size;
     uint8_t *pmem_addr;
+    MemoryPort *port;
     int page_ptr;
 
   public:
@@ -103,13 +102,13 @@ class PhysicalMemory : public MemObject
     uint64_t size() { return pmem_size; }
 
   public:
-    PhysicalMemory(const std::string &n, MemObject *bus);
+    PhysicalMemory(const std::string &n);
     virtual ~PhysicalMemory();
 
   public:
     int deviceBlockSize();
     void getAddressRanges(AddrRangeList &rangeList, bool &owner);
-    void virtual init() { memPort.sendStatusChange(Port::RangeChange); }
+    void virtual init() { port->sendStatusChange(Port::RangeChange); }
 
     // fast back-door memory access for vtophys(), remote gdb, etc.
     // uint64_t phys_read_qword(Addr addr) const;
index 7c5a0c5175c62a6ef981463a69749a421b776267..b0aba1a7d05f477f55b91ef1b7548fc7cec45e0b 100644 (file)
@@ -5,6 +5,5 @@ class PhysicalMemory(Memory):
     type = 'PhysicalMemory'
     range = Param.AddrRange("Device Address")
     file = Param.String('', "memory mapped file")
-    bus = Param.MemObject("Bus to attach to")
     if build_env['FULL_SYSTEM']:
         mmu = Param.MemoryController(Parent.any, "Memory Controller")
index 6f6143506aa06857ef42a544ca1f47b4a88514ff..aecc171ed3c41656d26c3d79c0b73e299fa4df1c 100644 (file)
@@ -355,6 +355,10 @@ main(int argc, char **argv)
     echoCommandLine(argc, argv, *outputStream);
     ParamContext::showAllContexts(*configStream);
 
+    // Any objects that can't connect themselves until after construction should
+    // do so now
+    SimObject::connectAll();
+
     // Do a second pass to finish initializing the sim objects
     SimObject::initAll();
 
index f34e17fe608286a43d1af8ef1b511f336e3357d7..151ba68a7d60be050f12a678129188e96d7719bd 100644 (file)
@@ -87,6 +87,11 @@ SimObject::SimObject(const string &_name)
     simObjectList.push_back(this);
 }
 
+void
+SimObject::connect()
+{
+}
+
 void
 SimObject::init()
 {
@@ -150,6 +155,21 @@ SimObject::regAllStats()
     Stats::registerResetCallback(&StatResetCB);
 }
 
+//
+// static function: call connect() on all SimObjects.
+//
+void
+SimObject::connectAll()
+{
+    SimObjectList::iterator i = simObjectList.begin();
+    SimObjectList::iterator end = simObjectList.end();
+
+    for (; i != end; ++i) {
+        SimObject *obj = *i;
+        obj->connect();
+    }
+}
+
 //
 // static function: call init() on all SimObjects.
 //
index 59d9daf454bed49b508fa3bd83df93e61cd1ebfe..5db62dd5158b323c7d4326ce838d11a172fe7551 100644 (file)
@@ -78,7 +78,9 @@ class SimObject : public Serializable, protected StartupCallback
     // initialization pass of all objects.
     // Gets invoked after construction, before unserialize.
     virtual void init();
+    virtual void connect();
     static void initAll();
+    static void connectAll();
 
     // register statistics for this object
     virtual void regStats();