stats: this makes some fixes to AverageStat and AverageVector.
authorLisa Hsu <Lisa.Hsu@amd.com>
Tue, 23 Feb 2010 17:33:18 +0000 (09:33 -0800)
committerLisa Hsu <Lisa.Hsu@amd.com>
Tue, 23 Feb 2010 17:33:18 +0000 (09:33 -0800)
Also, make Formulas work on AverageVector.  First, Stat::Average (and thus
Stats::AverageVector) was broken when coming out of a checkpoint and on resets,
this fixes that.  Formulas also didn't work with AverageVector, but added
support for that.

src/base/statistics.hh
src/python/m5/simulate.py

index 0f001dccb6d43efcb8cd7ecf67df620ec96cd9c2..06a9d465dbf32c078ba352f94436ac8c4c6d5aaa 100644 (file)
@@ -492,6 +492,8 @@ class AvgStor
   private:
     /** The current count. */
     Counter current;
+    /** The tick of the last reset */
+    Tick lastReset;
     /** The total count for all tick. */
     mutable Result total;
     /** The tick that current last changed. */
@@ -505,7 +507,7 @@ class AvgStor
      * Build and initializes this stat storage.
      */
     AvgStor(Info *info)
-        : current(0), total(0), last(0)
+        : current(0), lastReset(0), total(0), last(0)
     { }
 
     /**
@@ -547,7 +549,7 @@ class AvgStor
     result() const
     {
         assert(last == curTick);
-        return (Result)(total + current) / (Result)(curTick + 1);
+        return (Result)(total + current) / (Result)(curTick - lastReset + 1);
     }
 
     /**
@@ -573,6 +575,7 @@ class AvgStor
     {
         total = 0.0;
         last = curTick;
+        lastReset = curTick;
     }
 
 };
@@ -2551,6 +2554,10 @@ class Temp
         : node(new VectorStatNode(s.info()))
     { }
 
+    Temp(const AverageVector &s)
+        : node(new VectorStatNode(s.info()))
+    { }
+
     /**
      *
      */
index 092bd03395dab12c431689333ada813c42e10cca..291fdc7b7930e1de1e3a55312a0856b267641f91 100644 (file)
@@ -148,6 +148,7 @@ def restoreCheckpoint(root, dir):
     print "Restoring from checkpoint"
     internal.core.unserializeAll(dir)
     need_resume.append(root)
+    stats.reset()
 
 def changeToAtomic(system):
     if not isinstance(system, (objects.Root, objects.System)):