systemc: Add a non-standard sc_time constructor and from_string.
authorGabe Black <gabeblack@google.com>
Thu, 27 Sep 2018 08:20:28 +0000 (01:20 -0700)
committerGabe Black <gabeblack@google.com>
Tue, 16 Oct 2018 00:38:49 +0000 (00:38 +0000)
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>

src/systemc/core/sc_time.cc
src/systemc/core/time.cc
src/systemc/core/time.hh
src/systemc/ext/core/sc_time.hh

index acc3c08057c51d0f1183dcb28665ffa7a92eb260..88058a733ab56b02e68323610a2da8e0893ae1cd 100644 (file)
@@ -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
index 4c90864471a274058375b4d49ca54e530b4e948a..587d8cbf4a31ea977e9c9ee8cabf56ba16b0640e 100644 (file)
@@ -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,
index 4357fbd9146d1e35aed50dc1f15125f40aa90185..dca965e798b6684ca3984d173234842dd8dcbdb8 100644 (file)
@@ -36,6 +36,7 @@ namespace sc_gem5
 {
 
 extern const char *TimeUnitNames[];
+extern const char *TimeUnitConstantNames[];
 extern double TimeUnitScale[];
 extern Tick TimeUnitFrequency[];
 
index 0a31a655a992b96a198974036ce7e4a45f105d2a..d2b1e985dc25da62bb64836a6e94f59ee7bdfae0 100644 (file)
@@ -55,6 +55,9 @@ class sc_time
     sc_time(double, sc_time_unit);
     sc_time(const sc_time &);
 
+    // Nonstandard
+    sc_time(double, const char *);
+
     // Deprecated
     sc_time(double, bool);
     sc_time(sc_dt::uint64, bool);