Stick the conversion of python to unix time with all of
authorNathan Binkert <binkertn@umich.edu>
Sun, 28 Jan 2007 18:26:59 +0000 (10:26 -0800)
committerNathan Binkert <binkertn@umich.edu>
Sun, 28 Jan 2007 18:26:59 +0000 (10:26 -0800)
the other param code so that other functions can use it
as well.

--HG--
extra : convert_revision : a8becdeadc70af0b64bff5b0770788dfba6e1857

src/dev/alpha/tsunami_io.cc
src/dev/alpha/tsunami_io.hh
src/dev/sparc/dtod.cc
src/dev/sparc/dtod.hh
src/sim/param.cc
src/sim/param.hh

index d701dc98f27144110609d9b9ef200833a5d79695..58933428c3bf14f6a52ddd33c61a5899b9f9b7cf 100644 (file)
@@ -65,69 +65,32 @@ TsunamiIO::RTC::RTC(const string &n, Tsunami* tsunami, const vector<int> &t,
     stat_regA = RTCA_32768HZ | RTCA_1024HZ;
     stat_regB = RTCB_PRDC_IE |RTCB_BIN | RTCB_24HR;
 
-    if (year_is_bcd) {
-        // The RTC uses BCD for the last two digits in the year.
-        // They python year is a full year.
-        int _year = t[0] % 100;
-        int tens = _year / 10;
-        int ones = _year % 10;
-
-        year = (tens << 4) + ones;
-    } else {
-        // Even though the datasheet says that the year field should be
-        // interpreted as BCD, we just enter the number of years since
-        // 1900 since linux seems to be happy with that (and I believe
-        // that Tru64 was as well)
-        year = t[0] - 1900;
-    }
-
-    mon = t[1];
-    mday = t[2];
-    hour = t[3];
-    min = t[4];
-    sec = t[5];
-
-    // wday is defined to be in the range from 1 - 7 with 1 being Sunday.
-    // the value coming from python is in the range from 0 - 6 with 0 being
-    // Monday.  Fix that here.
-    wday = t[6]  + 2;
-    if (wday > 7)
-        wday -= 7;
-
-    DPRINTFN("Real-time clock set to %s", getDateString());
-}
-
-std::string
-TsunamiIO::RTC::getDateString()
-{
     struct tm tm;
+    parseTime(t, &tm);
 
-    memset(&tm, 0, sizeof(tm));
+    year = tm.tm_year;
 
     if (year_is_bcd) {
-        // undo the BCD and conver to years since 1900 guessing that
-        // anything before 1970 is actually after 2000
-        int _year = (year >> 4) * 10 + (year & 0xf);
-        if (_year < 70)
-            _year += 100;
-
-        tm.tm_year = _year;
-    } else {
-        // number of years since 1900
-        tm.tm_year = year;
+        // The datasheet says that the year field can be either BCD or
+        // years since 1900.  Linux seems to be happy with years since
+        // 1900.
+        year = year % 100;
+        int tens = year / 10;
+        int ones = year % 10;
+        year = (tens << 4) + ones;
     }
 
-    // unix is 0-11 for month
-    tm.tm_mon = mon - 1;
-    tm.tm_mday = mday;
-    tm.tm_hour = hour;
-    tm.tm_min = min;
-    tm.tm_sec = sec;
+    // Unix is 0-11 for month, data seet says start at 1
+    mon = tm.tm_mon + 1;
+    mday = tm.tm_mday;
+    hour = tm.tm_hour;
+    min = tm.tm_min;
+    sec = tm.tm_sec;
 
-    // to add more annoyance unix is 0 - 6 with 0 as sunday
-    tm.tm_wday = wday - 1;
+    // Datasheet says 1 is sunday
+    wday = tm.tm_wday + 1;
 
-    return asctime(&tm);
+    DPRINTFN("Real-time clock set to %s", asctime(&tm));
 }
 
 void
index f42af4197637d3c3b6b95e2718e8025d96873d22..f4fa62a6825e95789b5123a015e5551f2a8bfa62 100644 (file)
@@ -125,9 +125,6 @@ class TsunamiIO : public BasicPioDevice
         /** RTC read data */
         uint8_t readData();
 
-        /** RTC get the date */
-        std::string getDateString();
-
         /**
           * Serialize this object to the given output stream.
           * @param base The base name of the counter object.
index 30c7baaf5fd88ddbfb46d17c99669d0d4b508f66..50e158c120830892b107de3cf854983e557dd849 100644 (file)
@@ -49,12 +49,14 @@ using namespace std;
 using namespace TheISA;
 
 DumbTOD::DumbTOD(Params *p)
-    : BasicPioDevice(p), todTime(p->init_time)
+    : BasicPioDevice(p)
 {
     pioSize = 0x08;
 
     struct tm tm;
-    gmtime_r((time_t*)&todTime, &tm);
+    parseTime(p->init_time, &tm);
+    todTime = timegm(&tm);
+
     DPRINTFN("Real-time clock set to %s\n", asctime(&tm));
     DPRINTFN("Real-time clock set to %d\n", todTime);
 }
@@ -86,7 +88,7 @@ BEGIN_DECLARE_SIM_OBJECT_PARAMS(DumbTOD)
     Param<Tick> pio_latency;
     SimObjectParam<Platform *> platform;
     SimObjectParam<System *> system;
-    Param<time_t> time;
+    VectorParam<int> time;
 
 END_DECLARE_SIM_OBJECT_PARAMS(DumbTOD)
 
@@ -96,7 +98,7 @@ BEGIN_INIT_SIM_OBJECT_PARAMS(DumbTOD)
     INIT_PARAM(pio_latency, "Programmed IO latency"),
     INIT_PARAM(platform, "platform"),
     INIT_PARAM(system, "system object"),
-    INIT_PARAM(time, "System time to use (0 for actual time")
+    INIT_PARAM(time, "")
 
 END_INIT_SIM_OBJECT_PARAMS(DumbTOD)
 
index 7d3a9f628a4cf93d0be2f750611eb3f0e479e6e3..26d4ecc087a304f5ceb82d8781ec491dae259a3b 100644 (file)
@@ -36,6 +36,8 @@
 #ifndef __DEV_SPARC_DTOD_HH__
 #define __DEV_SPARC_DTOD_HH__
 
+#include <vector>
+
 #include "base/range.hh"
 #include "dev/io_device.hh"
 
@@ -52,7 +54,7 @@ class DumbTOD : public BasicPioDevice
   public:
     struct Params : public BasicPioDevice::Params
     {
-        time_t init_time;
+        std::vector<int> init_time;
     };
   protected:
     const Params *params() const { return (const Params *)_params; }
index b1c50946be166bdc18582cd3b289b11f3ea3c566..5cc69b1618c1ebc3fdf348b3d51af201ec64cee1 100644 (file)
@@ -777,3 +777,27 @@ ParamContext::describeAllContexts(ostream &os)
         os << endl;
     }
 }
+
+void
+parseTime(const std::vector<int> &time, struct tm *tm)
+{
+    memset(tm, 0, sizeof(struct tm));
+
+    // UNIX is years since 1900
+    tm->tm_year = time[0] - 1900;
+
+    // Python starts at 1, UNIX starts at 0
+    tm->tm_mon = time[1] - 1;
+    tm->tm_mday = time[2];
+    tm->tm_hour = time[3];
+    tm->tm_min = time[4];
+    tm->tm_sec = time[5];
+
+    // Python has 0 as Monday, UNIX is 0 as sunday
+    tm->tm_wday = time[6] + 1;
+    if (tm->tm_wday > 6)
+        tm->tm_wday -= 7;
+
+    // Python starts at 1, Unix starts at 0
+    tm->tm_yday = time[7] - 1;
+}
index 2aa0456da934d358f6e08eea5aa882b2945ad511..8a4670e27f6e5a8640b3edab12f2facb9636e3c0 100644 (file)
@@ -781,4 +781,5 @@ SimObjectVectorParam<OBJ_CLASS *>::showType(std::ostream &os) const \
 template <class T> bool parseParam(const std::string &str, T &data);
 template <class T> void showParam(std::ostream &os, const T &data);
 
+void parseTime(const std::vector<int> &time, struct tm *tm);
 #endif // _SIM_PARAM_HH_