sc_time.cc revision 12983
12330SN/A/* 22330SN/A * Copyright 2018 Google, Inc. 32330SN/A * 42330SN/A * Redistribution and use in source and binary forms, with or without 52330SN/A * modification, are permitted provided that the following conditions are 62330SN/A * met: redistributions of source code must retain the above copyright 72330SN/A * notice, this list of conditions and the following disclaimer; 82330SN/A * redistributions in binary form must reproduce the above copyright 92330SN/A * notice, this list of conditions and the following disclaimer in the 102330SN/A * documentation and/or other materials provided with the distribution; 112330SN/A * neither the name of the copyright holders nor the names of its 122330SN/A * contributors may be used to endorse or promote products derived from 132330SN/A * this software without specific prior written permission. 142330SN/A * 152330SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 162330SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 172330SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 182330SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 192330SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 202330SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 212330SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 222330SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 232330SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 242330SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 252330SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 262330SN/A * 272330SN/A * Authors: Gabe Black 282292SN/A */ 292292SN/A 302292SN/A#include "base/logging.hh" 312292SN/A#include "systemc/ext/core/sc_time.hh" 322683Sktlim@umich.edu 332680Sktlim@umich.edunamespace sc_core 342292SN/A{ 352678Sktlim@umich.edu 362683Sktlim@umich.edunamespace 372678Sktlim@umich.edu{ 382683Sktlim@umich.edu 392678Sktlim@umich.educonst char *TimeUnitNames[] = { 402678Sktlim@umich.edu [SC_FS] = "fs", 412292SN/A [SC_PS] = "ps", 422292SN/A [SC_NS] = "ns", 432292SN/A [SC_US] = "us", 442292SN/A [SC_MS] = "ms", 452330SN/A [SC_SEC] = "s" 462330SN/A}; 472330SN/A 482292SN/Adouble TimeUnitScale[] = { 492292SN/A [SC_FS] = 1.0e-15, 502330SN/A [SC_PS] = 1.0e-12, 512330SN/A [SC_NS] = 1.0e-9, 522330SN/A [SC_US] = 1.0e-6, 532330SN/A [SC_MS] = 1.0e-3, 542330SN/A [SC_SEC] = 1.0 552330SN/A}; 562292SN/A 572683Sktlim@umich.edu} // anonymous namespace 582683Sktlim@umich.edu 592292SN/Asc_time::sc_time() : val(0) {} 602683Sktlim@umich.edu 612292SN/Asc_time::sc_time(double d, sc_time_unit tu) 622678Sktlim@umich.edu{ 632683Sktlim@umich.edu val = 0; 642292SN/A if (d != 0) { 652683Sktlim@umich.edu //XXX Assuming the time resolution is 1ps. 662683Sktlim@umich.edu double scale = TimeUnitScale[tu] / TimeUnitScale[SC_PS]; 672683Sktlim@umich.edu // Accellera claims there is a linux bug, and that these next two 682683Sktlim@umich.edu // lines work around them. 692683Sktlim@umich.edu volatile double tmp = d * scale + 0.5; 702683Sktlim@umich.edu val = static_cast<uint64_t>(tmp); 712683Sktlim@umich.edu } 722683Sktlim@umich.edu} 732683Sktlim@umich.edu 742683Sktlim@umich.edusc_time::sc_time(const sc_time &t) 752683Sktlim@umich.edu{ 762683Sktlim@umich.edu val = t.val; 772683Sktlim@umich.edu} 782683Sktlim@umich.edu 792683Sktlim@umich.edusc_time::sc_time(double, bool) 802683Sktlim@umich.edu{ 812683Sktlim@umich.edu warn("%s not implemented.\n", __PRETTY_FUNCTION__); 822683Sktlim@umich.edu} 832683Sktlim@umich.edu 842683Sktlim@umich.edusc_time::sc_time(sc_dt::uint64, bool) 852683Sktlim@umich.edu{ 862683Sktlim@umich.edu warn("%s not implemented.\n", __PRETTY_FUNCTION__); 872683Sktlim@umich.edu} 882683Sktlim@umich.edu 892683Sktlim@umich.edusc_time & 902683Sktlim@umich.edusc_time::operator = (const sc_time &t) 912683Sktlim@umich.edu{ 922683Sktlim@umich.edu val = t.val; 932683Sktlim@umich.edu return *this; 942683Sktlim@umich.edu} 952683Sktlim@umich.edu 962683Sktlim@umich.edusc_dt::uint64 972683Sktlim@umich.edusc_time::value() const 982683Sktlim@umich.edu{ 992683Sktlim@umich.edu return val; 1002683Sktlim@umich.edu} 1012678Sktlim@umich.edu 1022292SN/Adouble 1032683Sktlim@umich.edusc_time::to_double() const 1042683Sktlim@umich.edu{ 1052292SN/A warn("%s not implemented.\n", __PRETTY_FUNCTION__); 1062683Sktlim@umich.edu return 0.0; 1072683Sktlim@umich.edu} 1082683Sktlim@umich.edudouble 1092683Sktlim@umich.edusc_time::to_seconds() const 1102683Sktlim@umich.edu{ 1112683Sktlim@umich.edu warn("%s not implemented.\n", __PRETTY_FUNCTION__); 1122683Sktlim@umich.edu return 0.0; 1132683Sktlim@umich.edu} 1142683Sktlim@umich.edu 1152683Sktlim@umich.educonst std::string 1162683Sktlim@umich.edusc_time::to_string() const 1172683Sktlim@umich.edu{ 1182683Sktlim@umich.edu warn("%s not implemented.\n", __PRETTY_FUNCTION__); 1192683Sktlim@umich.edu return ""; 1202683Sktlim@umich.edu} 1212683Sktlim@umich.edu 1222683Sktlim@umich.edubool 1232683Sktlim@umich.edusc_time::operator == (const sc_time &t) const 1242683Sktlim@umich.edu{ 1252683Sktlim@umich.edu return val == t.val; 1262683Sktlim@umich.edu} 1272683Sktlim@umich.edu 1282683Sktlim@umich.edubool 1292683Sktlim@umich.edusc_time::operator != (const sc_time &t) const 1302683Sktlim@umich.edu{ 1312683Sktlim@umich.edu return val != t.val; 1322683Sktlim@umich.edu} 1332683Sktlim@umich.edu 1342683Sktlim@umich.edubool 1352683Sktlim@umich.edusc_time::operator < (const sc_time &t) const 1362683Sktlim@umich.edu{ 1372683Sktlim@umich.edu return val < t.val; 1382683Sktlim@umich.edu} 1392683Sktlim@umich.edu 1402683Sktlim@umich.edubool 1412683Sktlim@umich.edusc_time::operator <= (const sc_time &t) const 1422683Sktlim@umich.edu{ 1432683Sktlim@umich.edu return val <= t.val; 1442683Sktlim@umich.edu} 1452292SN/A 1462292SN/Abool 1472292SN/Asc_time::operator > (const sc_time &t) const 1482292SN/A{ 1492292SN/A return val > t.val; 1502683Sktlim@umich.edu} 1512683Sktlim@umich.edu 1522292SN/Abool 1532683Sktlim@umich.edusc_time::operator >= (const sc_time &t) const 1542683Sktlim@umich.edu{ 1552292SN/A return val >= t.val; 1562292SN/A} 1572683Sktlim@umich.edu 1582292SN/Asc_time & 1592292SN/Asc_time::operator += (const sc_time &t) 1602292SN/A{ 1612292SN/A val += t.val; 1622292SN/A return *this; 1632330SN/A} 1642683Sktlim@umich.edu 1652683Sktlim@umich.edusc_time & 1662683Sktlim@umich.edusc_time::operator -= (const sc_time &t) 1672683Sktlim@umich.edu{ 1682683Sktlim@umich.edu val -= t.val; 1692683Sktlim@umich.edu return *this; 1702683Sktlim@umich.edu} 1712683Sktlim@umich.edu 1722292SN/Asc_time & 1732678Sktlim@umich.edusc_time::operator *= (double) 1742678Sktlim@umich.edu{ 1752292SN/A warn("%s not implemented.\n", __PRETTY_FUNCTION__); 1762292SN/A return *this; 1772292SN/A} 1782292SN/A 1792292SN/Asc_time & 1802292SN/Asc_time::operator /= (double) 1812683Sktlim@umich.edu{ 1822292SN/A warn("%s not implemented.\n", __PRETTY_FUNCTION__); 1832683Sktlim@umich.edu return *this; 1842683Sktlim@umich.edu} 1852683Sktlim@umich.edu 1862683Sktlim@umich.eduvoid 1872292SN/Asc_time::print(std::ostream &os) const 1882292SN/A{ 1892292SN/A if (val == 0) { 1902292SN/A os << "0 s"; 1912292SN/A } else { 1922292SN/A //XXX Assuming the time resolution is 1ps. 1932292SN/A sc_time_unit tu = SC_PS; 1942292SN/A uint64_t scaled = val; 1952292SN/A while (tu < SC_SEC && (scaled % 1000) == 0) { 1962292SN/A tu = (sc_time_unit)((int)tu + 1); 1972292SN/A scaled /= 1000; 1982292SN/A } 1992292SN/A 2002683Sktlim@umich.edu os << scaled << ' ' << TimeUnitNames[tu]; 2012292SN/A } 2022292SN/A} 2032292SN/A 2042292SN/Asc_time 2052292SN/Asc_time::from_value(sc_dt::uint64 u) 2062292SN/A{ 2072292SN/A sc_time t; 2082292SN/A t.val = u; 2092292SN/A return t; 2102292SN/A} 2112292SN/A 2122292SN/Asc_time 2132292SN/Asc_time::from_seconds(double) 214{ 215 warn("%s not implemented.\n", __PRETTY_FUNCTION__); 216 return sc_time(); 217} 218 219sc_time 220sc_time::from_string(const char *str) 221{ 222 warn("%s not implemented.\n", __PRETTY_FUNCTION__); 223 return sc_time(); 224} 225 226const sc_time 227operator + (const sc_time &, const sc_time &) 228{ 229 warn("%s not implemented.\n", __PRETTY_FUNCTION__); 230 return sc_time(); 231} 232 233const sc_time 234operator - (const sc_time &, const sc_time &) 235{ 236 warn("%s not implemented.\n", __PRETTY_FUNCTION__); 237 return sc_time(); 238} 239 240const sc_time 241operator * (const sc_time &, double) 242{ 243 warn("%s not implemented.\n", __PRETTY_FUNCTION__); 244 return sc_time(); 245} 246 247const sc_time 248operator * (double, const sc_time &) 249{ 250 warn("%s not implemented.\n", __PRETTY_FUNCTION__); 251 return sc_time(); 252} 253 254const sc_time 255operator / (const sc_time &, double) 256{ 257 warn("%s not implemented.\n", __PRETTY_FUNCTION__); 258 return sc_time(); 259} 260 261double 262operator / (const sc_time &, const sc_time &) 263{ 264 warn("%s not implemented.\n", __PRETTY_FUNCTION__); 265 return 0.0; 266} 267 268std::ostream & 269operator << (std::ostream &os, const sc_time &t) 270{ 271 t.print(os); 272 return os; 273} 274 275const sc_time SC_ZERO_TIME; 276 277void 278sc_set_time_resolution(double, sc_time_unit) 279{ 280 warn("%s not implemented.\n", __PRETTY_FUNCTION__); 281} 282 283sc_time 284sc_get_time_resolution() 285{ 286 warn("%s not implemented.\n", __PRETTY_FUNCTION__); 287 return sc_time(); 288} 289 290const sc_time & 291sc_max_time() 292{ 293 warn("%s not implemented.\n", __PRETTY_FUNCTION__); 294 return *(const sc_time *)nullptr; 295} 296 297void 298sc_set_default_time_unit(double, sc_time_unit) 299{ 300 warn("%s not implemented.\n", __PRETTY_FUNCTION__); 301} 302 303sc_time 304sc_get_default_time_unit() 305{ 306 warn("%s not implemented.\n", __PRETTY_FUNCTION__); 307 return *(sc_time *)nullptr; 308} 309 310sc_time_tuple::sc_time_tuple(const sc_time &) 311{ 312 warn("%s not implemented.\n", __PRETTY_FUNCTION__); 313} 314 315bool 316sc_time_tuple::has_value() const 317{ 318 warn("%s not implemented.\n", __PRETTY_FUNCTION__); 319 return false; 320} 321 322sc_dt::uint64 323sc_time_tuple::value() const 324{ 325 warn("%s not implemented.\n", __PRETTY_FUNCTION__); 326 return 0; 327} 328 329const char * 330sc_time_tuple::unit_symbol() const 331{ 332 warn("%s not implemented.\n", __PRETTY_FUNCTION__); 333 return ""; 334} 335 336double 337sc_time_tuple::to_double() const 338{ 339 warn("%s not implemented.\n", __PRETTY_FUNCTION__); 340 return 0.0; 341} 342 343std::string 344sc_time_tuple::to_string() const 345{ 346 warn("%s not implemented.\n", __PRETTY_FUNCTION__); 347 return ""; 348} 349 350} // namespace sc_core 351