Update functional memory to have a response event
authorRon Dreslinski <rdreslin@umich.edu>
Thu, 23 Feb 2006 18:51:54 +0000 (13:51 -0500)
committerRon Dreslinski <rdreslin@umich.edu>
Thu, 23 Feb 2006 18:51:54 +0000 (13:51 -0500)
Clean out old memory python files, move them into old_mem directory.  Maybe we should just delete them, they are under revision control.

Add new py files for new objects.

SConscript:
    Update because memory is just a header file now
base/chunk_generator.hh:
    Make Chunk Generator return the entire size if the chunk_size is set to zero.  Useful when trying to chunck on blocksize of memory, which can write large pieces of data.
cpu/simple/cpu.cc:
    Make sure to delete the pkt.
mem/physical.cc:
mem/physical.hh:
    Set up response event.
mem/port.cc:
    Rename rqst to req to conform to same standard naming convention.
python/m5/objects/PhysicalMemory.py:
    Update the params, inheritence

--HG--
extra : convert_revision : 857154ec256522baf423b715833930497999549b

SConscript
base/chunk_generator.hh
cpu/simple/cpu.cc
mem/physical.cc
mem/physical.hh
mem/port.cc
python/m5/objects/MemObject.py [new file with mode: 0644]
python/m5/objects/PhysicalMemory.py

index 1c13a930762a95118d290f49a1dbce9ad8436d03..078b1e831360c636743a810885ce3e8f3c98baa0 100644 (file)
@@ -91,7 +91,6 @@ base_sources = Split('''
        cpu/static_inst.cc
         cpu/sampler/sampler.cc
 
-        mem/memory.cc
         mem/page_table.cc
         mem/physical.cc
         mem/port.cc
index 83caaca8897ab79caa9ef8481927629d88839bd0..afd577814a48768881f1eb146e18afaf43f664d3 100644 (file)
@@ -82,11 +82,18 @@ class ChunkGenerator
         // set up initial chunk.
         curAddr = startAddr;
 
-        // nextAddr should be *next* chunk start
-        nextAddr = roundUp(startAddr, chunkSize);
-        if (curAddr == nextAddr) {
-            // ... even if startAddr is already chunk-aligned
-            nextAddr += chunkSize;
+        if (chunkSize == 0) //Special Case, if we see 0, assume no chuncking
+        {
+            nextAddr = startAddr + totalSize;
+        }
+        else
+        {
+            // nextAddr should be *next* chunk start
+            nextAddr = roundUp(startAddr, chunkSize);
+            if (curAddr == nextAddr) {
+                // ... even if startAddr is already chunk-aligned
+                nextAddr += chunkSize;
+            }
         }
 
         // how many bytes are left between curAddr and the end of this chunk?
index 469fad270c0825a7b7565cbe03467314dc3ac48c..c34cf9079bb3e4a9d17e3f45ac3da7431ced5908 100644 (file)
@@ -674,6 +674,8 @@ SimpleCPU::sendIcacheRequest()
     icacheStallCycles += latency;
 
     _status = IcacheAccessComplete;
+
+    delete pkt;
 #endif
 }
 
index beebb65c8a0dd7dbf20c050cff811c8cf59193d7..58c9ea408b807521204bfdedcddbfdb1be35fb5e 100644 (file)
 #include "mem/physical.hh"
 #include "sim/host.hh"
 #include "sim/builder.hh"
+#include "sim/eventq.hh"
 #include "targetarch/isa_traits.hh"
 
 
 using namespace std;
 
+PhysicalMemory::MemResponseEvent::MemResponseEvent(Packet &pkt, MemoryPort* _m)
+    : Event(&mainEventQueue, CPU_Tick_Pri), pkt(pkt), memoryPort(_m)
+{
+
+    this->setFlags(AutoDelete);
+}
+
+void
+PhysicalMemory::MemResponseEvent::process()
+{
+    memoryPort->sendTiming(pkt);
+}
+
+const char *
+PhysicalMemory::MemResponseEvent::description()
+{
+    return "Physical Memory Timing Access respnse event";
+}
+
 #if FULL_SYSTEM
 PhysicalMemory::PhysicalMemory(const string &n, Range<Addr> range,
                                MemoryController *mmu, const std::string &fname)
@@ -157,7 +177,10 @@ bool
 PhysicalMemory::doTimingAccess (Packet &pkt)
 {
     doFunctionalAccess(pkt);
-    //Schedule a response event at curTick + lat;
+
+    MemResponseEvent* response = new MemResponseEvent(pkt, &memoryPort);
+    response->schedule(curTick + lat);
+
     return true;
 }
 
@@ -213,6 +236,11 @@ PhysicalMemory::MemoryPort::getDeviceAddressRanges(AddrRangeList &range_list,
     panic("??");
 }
 
+int
+PhysicalMemory::MemoryPort::deviceBlockSize()
+{
+    return memory->deviceBlockSize();
+}
 
 bool
 PhysicalMemory::MemoryPort::recvTiming(Packet &pkt)
index bac7e3d46ba28ee7c9bd70330c4dea105e3fe9a0..b31e45ac52abfdb40f370d8b146823e102fd3058 100644 (file)
@@ -35,6 +35,8 @@
 #include "base/range.hh"
 #include "mem/memory.hh"
 #include "mem/packet.hh"
+#include "mem/port.hh"
+#include "sim/eventq.hh"
 
 //
 // Functional model for a contiguous block of physical memory. (i.e. RAM)
@@ -63,7 +65,6 @@ class PhysicalMemory : public Memory
                                             bool &owner);
 
         virtual int deviceBlockSize();
-
     };
 
     MemoryPort memoryPort;
@@ -72,7 +73,15 @@ class PhysicalMemory : public Memory
 
     int lat;
 
-    //event to send response needs to be here
+    struct MemResponseEvent : public Event
+    {
+        Packet pkt;
+        MemoryPort *memoryPort;
+
+        MemResponseEvent(Packet &pkt, MemoryPort *memoryPort);
+        void process();
+        const char *description();
+    };
 
   private:
     // prevent copying of a MainMemory object
@@ -98,7 +107,7 @@ class PhysicalMemory : public Memory
     void prot_access_error(Addr addr, int size, Command func);
 
   public:
-    virtual int deviceBlockSize();
+    int deviceBlockSize();
 
     void prot_memset(Addr addr, uint8_t val, int size);
 
index 640b72a0e7905ee2dadca589643e9be20060a381..8c4b3810c1b96916b1fadea684b8da4a220ffb56 100644 (file)
 void
 Port::blobHelper(Addr addr, uint8_t *p, int size, Command cmd)
 {
-    Request rqst;
+    Request req;
     Packet pkt;
-    pkt.req = &rqst;
+    pkt.req = &req;
     pkt.cmd = cmd;
 
     for (ChunkGenerator gen(addr, size, peerBlockSize());
          !gen.done(); gen.next()) {
-        pkt.addr = rqst.paddr = gen.addr();
-        pkt.size = rqst.size = gen.size();
+        pkt.addr = req.paddr = gen.addr();
+        pkt.size = req.size = gen.size();
         pkt.data = p;
         sendFunctional(pkt);
         p += gen.size();
diff --git a/python/m5/objects/MemObject.py b/python/m5/objects/MemObject.py
new file mode 100644 (file)
index 0000000..4d68243
--- /dev/null
@@ -0,0 +1,5 @@
+from m5 import *
+
+class MemObject(SimObject):
+    type = 'MemObject'
+    abstract = True
index f50937ee6f9c2185eb860e1c0f21539f77501801..ab2714a6f5d3d0bdd0f3f6159b7b4c793fe4e096 100644 (file)
@@ -1,7 +1,7 @@
 from m5 import *
-from FunctionalMemory import FunctionalMemory
+from Memory import Memory
 
-class PhysicalMemory(FunctionalMemory):
+class PhysicalMemory(Memory):
     type = 'PhysicalMemory'
     range = Param.AddrRange("Device Address")
     file = Param.String('', "memory mapped file")