Improve python output support
authorNathan Binkert <binkertn@umich.edu>
Sun, 28 Dec 2003 17:48:13 +0000 (12:48 -0500)
committerNathan Binkert <binkertn@umich.edu>
Sun, 28 Dec 2003 17:48:13 +0000 (12:48 -0500)
fix some bugs

base/statistics.cc:
    -  Move the python dump stream stuff into the statistics package
    because it needs more control over the file when there
    are multiple dumps
    -  add a subname to the output
    -  make all of the stats a list instead of variable arguments to
    get around the 255 argument limit
    -  the description needs to be triple quoted
    -  avoid errors for formulas that don't have any root element
    set up.
base/statistics.hh:
    -  get rid of mode_python and just separate python dumping from
    regular stats dumping
    -  fix a huge bug that made a Formula use a VectorData instead
    of a FormulaData

--HG--
extra : convert_revision : 7303cff3ccdcc3d306ab17375219fc7fecac7e5e

base/statistics.cc
base/statistics.hh

index 04d4032d3f5d78a5982858ecf13806bc2c6e44d5..5c9a2bc6541c5b7d64afe0b9a47cd6481ada7f80 100644 (file)
@@ -27,7 +27,7 @@
  */
 
 #include <iomanip>
-#include <iostream>
+#include <fstream>
 #include <list>
 #include <map>
 #include <string>
@@ -82,11 +82,19 @@ namespace Database
         list_t printStats;
         map_t statMap;
 
+        ofstream *stream;
+        Python *py;
+
       public:
-        void dump(ostream &stream, const string &name, DisplayMode mode);
+        Data();
+        ~Data();
+
+        void dump(ostream &stream, DisplayMode mode);
         void display(ostream &stream, DisplayMode mode);
-        void python(ostream &stream, const string &name);
-        void python(Python &py, const string &name, const string &bin);
+        void python_start(const string &file);
+        void python_dump(const string &name, const string &subname);
+        void python(const string &name, const string &subname,
+                    const string &bin);
 
         StatData *find(void *stat);
         void mapStat(void *stat, StatData *data);
@@ -99,16 +107,28 @@ namespace Database
         static std::string name() { return "Statistics Database"; }
     };
 
+Data::Data()
+    : stream(0), py(0)
+{
+}
+
+Data::~Data()
+{
+    if (stream) {
+        delete py;
+        ccprintf(*stream, "if __name__ == '__main__':\n");
+        ccprintf(*stream, "    program_display()\n");
+        stream->close();
+        delete stream;
+    }
+}
 
 void
-Data::dump(ostream &stream, const string &name, DisplayMode mode)
+Data::dump(ostream &stream, DisplayMode mode)
 {
     MainBin *orig = MainBin::curBin();
 
     switch (mode) {
-      case mode_python:
-        python(stream, name);
-        break;
       case mode_m5:
       case mode_simplescalar:
         display(stream, mode);
@@ -158,50 +178,61 @@ Data::display(ostream &stream, DisplayMode mode)
 }
 
 void
-Data::python(ostream &stream, const string &name)
+Data::python_start(const string &file)
 {
-    Python py(stream);
+    if (stream)
+        panic("can't start python twice!");
 
-    ccprintf(stream, "import sys\n");
-    ccprintf(stream, "sys.path.append('.')\n");
-    ccprintf(stream, "from m5stats import *\n\n");
+    stream = new ofstream(file.c_str(), ios::trunc);
+    py = new Python(*stream);
+
+    ccprintf(*stream, "import sys\n");
+    ccprintf(*stream, "sys.path.append('.')\n");
+    ccprintf(*stream, "from m5stats import *\n\n");
+}
+
+void
+Data::python_dump(const string &name, const string &subname)
+{
+    if (!py)
+        panic("Can't dump python without first opening the file");
 
     if (bins.empty()) {
-        python(py, name, "");
+        python(name, subname, "");
     } else {
         list<MainBin *>::iterator i = bins.begin();
         list<MainBin *>::iterator end = bins.end();
 
         while (i != end) {
             (*i)->activate();
-            python(py, name, (*i)->name());
+            python(name, subname, (*i)->name());
             ++i;
         }
     }
-
-    py.next();
-    ccprintf(stream, "if __name__ == '__main__':\n");
-    ccprintf(stream, "    program_display()\n");
+    py->next();
 }
 
 void
-Data::python(Python &py, const string &name, const string &bin)
+Data::python(const string &name, const string &subname, const string &bin)
 {
-    py.start("collections.append");
-    py.start("Collection");
-    py.qarg(name);
-    py.qarg(bin);
-    py.qarg(hostname());
-    py.qarg(Time::start.date());
+    py->start("collections.append");
+    py->start("Collection");
+    py->qarg(name);
+    py->qarg(subname);
+    py->qarg(bin);
+    py->qarg(hostname());
+    py->qarg(Time::start.date());
+    py->startList();
     list_t::iterator i = allStats.begin();
     list_t::iterator end = allStats.end();
     while (i != end) {
         StatData *stat = *i;
-        stat->python(py);
+        stat->python(*py);
         ++i;
     }
-    py.end();
-    py.end();
+    py->endList();
+    py->end();
+    py->end();
 }
 
 StatData *
@@ -967,7 +998,7 @@ ScalarDataBase::python(Python &py) const
 {
     py.start("Scalar");
     py.qarg(name);
-    py.qarg(desc);
+    py.qqqarg(desc);
     py.kwarg("binned", binned());
     py.kwarg("precision", precision);
     py.kwarg("flags", flags);
@@ -984,7 +1015,7 @@ VectorDataBase::python(Python &py) const
 
     py.start("Vector");
     py.qarg(name);
-    py.qarg(desc);
+    py.qqqarg(desc);
     py.kwarg("binned", binned());
     py.kwarg("precision", precision);
     py.kwarg("flags", flags);
@@ -1033,7 +1064,7 @@ FormulaDataBase::python(Python &py) const
 
     py.start("Formula");
     py.qarg(name);
-    py.qarg(desc);
+    py.qqqarg(desc);
     py.kwarg("binned", binned());
     py.kwarg("precision", precision);
     py.kwarg("flags", flags);
@@ -1054,7 +1085,7 @@ DistDataBase::python(Python &py) const
 
     py.start("Dist");
     py.qarg(name);
-    py.qarg(desc);
+    py.qqqarg(desc);
     py.kwarg("binned", binned());
     py.kwarg("precision", precision);
     py.kwarg("flags", flags);
@@ -1071,7 +1102,7 @@ VectorDistDataBase::python(Python &py) const
 
     py.start("VectorDist");
     py.qarg(name);
-    py.qarg(desc);
+    py.qqqarg(desc);
     py.kwarg("binned", binned());
     py.kwarg("precision", precision);
     py.kwarg("flags", flags);
@@ -1101,7 +1132,7 @@ Vector2dDataBase::python(Python &py) const
 
     py.start("Vector2d");
     py.qarg(name);
-    py.qarg(desc);
+    py.qqqarg(desc);
     py.kwarg("binned", binned());
     py.kwarg("precision", precision);
     py.kwarg("flags", flags);
@@ -1124,13 +1155,14 @@ Vector2dDataBase::python(Python &py) const
 void
 FormulaBase::val(rvec_t &vec) const
 {
-    vec = root->val();
+    if (root)
+        vec = root->val();
 }
 
 result_t
 FormulaBase::total() const
 {
-    return root->total();
+    return root ? root->total() : 0.0;
 }
 
 size_t
@@ -1240,11 +1272,24 @@ check()
 }
 
 void
-dump(ostream &stream, const string &name, DisplayMode mode)
+dump(ostream &stream, DisplayMode mode)
+{
+    Database::StatDB().dump(stream, mode);
+}
+
+void
+python_start(const string &file)
 {
-    Database::StatDB().dump(stream, name, mode);
+    Database::StatDB().python_start(file);
 }
 
+void
+python_dump(const string &name, const string &subname)
+{
+    Database::StatDB().python_dump(name, subname);
+}
+
+
 CallbackQueue resetQueue;
 
 void
index 8c7566391cd2f50944ed6c4291151f3255eec41f..ce20043a32618c30c1f41af38ea88c2f148e4798 100644 (file)
@@ -120,8 +120,7 @@ const StatFlags __reserved =        init | print | __substat;
 enum DisplayMode
 {
     mode_m5,
-    mode_simplescalar,
-    mode_python
+    mode_simplescalar
 };
 
 extern DisplayMode DefaultMode;
@@ -2931,7 +2930,7 @@ class Temp;
 class Formula
     : public WrapVec<Formula,
                      FormulaBase,
-                     VectorData>
+                     FormulaData>
 {
   public:
     /**
@@ -3132,8 +3131,9 @@ class Temp
  */
 
 void check();
-void dump(std::ostream &stream, const std::string &name = "",
-          DisplayMode mode = DefaultMode);
+void dump(std::ostream &stream, DisplayMode mode = DefaultMode);
+void python_start(const std::string &file);
+void python_dump(const std::string &name, const std::string &subname);
 void reset();
 void registerResetCallback(Callback *cb);