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>
This commit is contained in:
Gabe Black
2018-09-27 01:20:28 -07:00
parent 5bdeb1a432
commit 34a9b8628f
4 changed files with 45 additions and 2 deletions

View 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

View 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,

View File

@@ -36,6 +36,7 @@ namespace sc_gem5
{
extern const char *TimeUnitNames[];
extern const char *TimeUnitConstantNames[];
extern double TimeUnitScale[];
extern Tick TimeUnitFrequency[];

View 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);