From 37795b104d93a48b319074fbef770d88820d554a Mon Sep 17 00:00:00 2001 From: Nathan Binkert Date: Sun, 28 Jan 2007 10:26:59 -0800 Subject: [PATCH] Stick the conversion of python to unix time with all of the other param code so that other functions can use it as well. --HG-- extra : convert_revision : a8becdeadc70af0b64bff5b0770788dfba6e1857 --- src/dev/alpha/tsunami_io.cc | 73 +++++++++---------------------------- src/dev/alpha/tsunami_io.hh | 3 -- src/dev/sparc/dtod.cc | 10 +++-- src/dev/sparc/dtod.hh | 4 +- src/sim/param.cc | 24 ++++++++++++ src/sim/param.hh | 1 + 6 files changed, 52 insertions(+), 63 deletions(-) diff --git a/src/dev/alpha/tsunami_io.cc b/src/dev/alpha/tsunami_io.cc index d701dc98f..58933428c 100644 --- a/src/dev/alpha/tsunami_io.cc +++ b/src/dev/alpha/tsunami_io.cc @@ -65,69 +65,32 @@ TsunamiIO::RTC::RTC(const string &n, Tsunami* tsunami, const vector &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 diff --git a/src/dev/alpha/tsunami_io.hh b/src/dev/alpha/tsunami_io.hh index f42af4197..f4fa62a68 100644 --- a/src/dev/alpha/tsunami_io.hh +++ b/src/dev/alpha/tsunami_io.hh @@ -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. diff --git a/src/dev/sparc/dtod.cc b/src/dev/sparc/dtod.cc index 30c7baaf5..50e158c12 100644 --- a/src/dev/sparc/dtod.cc +++ b/src/dev/sparc/dtod.cc @@ -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 pio_latency; SimObjectParam platform; SimObjectParam system; - Param time; + VectorParam 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) diff --git a/src/dev/sparc/dtod.hh b/src/dev/sparc/dtod.hh index 7d3a9f628..26d4ecc08 100644 --- a/src/dev/sparc/dtod.hh +++ b/src/dev/sparc/dtod.hh @@ -36,6 +36,8 @@ #ifndef __DEV_SPARC_DTOD_HH__ #define __DEV_SPARC_DTOD_HH__ +#include + #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 init_time; }; protected: const Params *params() const { return (const Params *)_params; } diff --git a/src/sim/param.cc b/src/sim/param.cc index b1c50946b..5cc69b161 100644 --- a/src/sim/param.cc +++ b/src/sim/param.cc @@ -777,3 +777,27 @@ ParamContext::describeAllContexts(ostream &os) os << endl; } } + +void +parseTime(const std::vector &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; +} diff --git a/src/sim/param.hh b/src/sim/param.hh index 2aa0456da..8a4670e27 100644 --- a/src/sim/param.hh +++ b/src/sim/param.hh @@ -781,4 +781,5 @@ SimObjectVectorParam::showType(std::ostream &os) const \ template bool parseParam(const std::string &str, T &data); template void showParam(std::ostream &os, const T &data); +void parseTime(const std::vector &time, struct tm *tm); #endif // _SIM_PARAM_HH_