diff options
author | Gabe Black <gabeblack@google.com> | 2018-09-27 01:20:28 -0700 |
---|---|---|
committer | Gabe Black <gabeblack@google.com> | 2018-10-16 00:38:49 +0000 |
commit | 34a9b8628f2a0b001a57deed73f887c92d5ffef6 (patch) | |
tree | 89f1732dfcf980e5b1c30c7355999cded6c1c90a /src/systemc/core | |
parent | 5bdeb1a432430dcb265cef77fa9365eceddce7d7 (diff) | |
download | gem5-34a9b8628f2a0b001a57deed73f887c92d5ffef6.tar.xz |
systemc: Add a non-standard sc_time constructor and from_string.
The sc_time constructor was being called, but because of implicit type
conversions, a const char * was being treated as a bool and totally
unrelated constructor was being called.
This change adds and implements the missing but non-standard
constructor. It also implements the from_string function which uses
that constructor.
Change-Id: I21e7e40fd1a8d1c579b1abdc2036d016501f510c
Reviewed-on: https://gem5-review.googlesource.com/c/13191
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>
Diffstat (limited to 'src/systemc/core')
-rw-r--r-- | src/systemc/core/sc_time.cc | 34 | ||||
-rw-r--r-- | src/systemc/core/time.cc | 9 | ||||
-rw-r--r-- | src/systemc/core/time.hh | 1 |
3 files changed, 42 insertions, 2 deletions
diff --git a/src/systemc/core/sc_time.cc b/src/systemc/core/sc_time.cc index acc3c0805..88058a733 100644 --- a/src/systemc/core/sc_time.cc +++ b/src/systemc/core/sc_time.cc @@ -153,6 +153,25 @@ sc_time::sc_time(const sc_time &t) val = t.val; } +sc_time::sc_time(double d, const char *unit) +{ + sc_time_unit tu; + for (tu = SC_FS; tu <= SC_SEC; tu = (sc_time_unit)(tu + 1)) { + if (strcmp(unit, sc_gem5::TimeUnitNames[tu]) == 0 || + strcmp(unit, sc_gem5::TimeUnitConstantNames[tu]) == 0) { + break; + } + } + + if (tu > SC_SEC) { + SC_REPORT_ERROR("(E567) sc_time conversion failed", + "invalid unit given"); + val = 0; + return; + } + set(this, d, tu); +} + sc_time::sc_time(double d, bool scale) { double scaler = scale ? defaultUnit : SimClock::Float::Hz; @@ -288,8 +307,19 @@ sc_time::from_seconds(double d) sc_time sc_time::from_string(const char *str) { - warn("%s not implemented.\n", __PRETTY_FUNCTION__); - return sc_time(); + char *end = nullptr; + + double d = str ? std::strtod(str, &end) : 0.0; + if (str == end || d < 0.0) { + SC_REPORT_ERROR("(E567) sc_time conversion failed", + "invalid value given"); + return SC_ZERO_TIME; + } + + while (*end && std::isspace(*end)) + end++; + + return sc_time(d, end); } const sc_time diff --git a/src/systemc/core/time.cc b/src/systemc/core/time.cc index 4c9086447..587d8cbf4 100644 --- a/src/systemc/core/time.cc +++ b/src/systemc/core/time.cc @@ -43,6 +43,15 @@ const char *TimeUnitNames[] = { [::sc_core::SC_SEC] = "s" }; +const char *TimeUnitConstantNames[] = { + [::sc_core::SC_FS] = "SC_FS", + [::sc_core::SC_PS] = "SC_PS", + [::sc_core::SC_NS] = "SC_NS", + [::sc_core::SC_US] = "SC_US", + [::sc_core::SC_MS] = "SC_MS", + [::sc_core::SC_SEC] = "SC_SEC" +}; + double TimeUnitScale[] = { [::sc_core::SC_FS] = 1.0e-15, [::sc_core::SC_PS] = 1.0e-12, diff --git a/src/systemc/core/time.hh b/src/systemc/core/time.hh index 4357fbd91..dca965e79 100644 --- a/src/systemc/core/time.hh +++ b/src/systemc/core/time.hh @@ -36,6 +36,7 @@ namespace sc_gem5 { extern const char *TimeUnitNames[]; +extern const char *TimeUnitConstantNames[]; extern double TimeUnitScale[]; extern Tick TimeUnitFrequency[]; |