sc_time.cc revision 13151
12623SN/A/* 28948Sandreas.hansson@arm.com * Copyright 2018 Google, Inc. 37725SAli.Saidi@ARM.com * 47725SAli.Saidi@ARM.com * Redistribution and use in source and binary forms, with or without 57725SAli.Saidi@ARM.com * modification, are permitted provided that the following conditions are 67725SAli.Saidi@ARM.com * met: redistributions of source code must retain the above copyright 77725SAli.Saidi@ARM.com * notice, this list of conditions and the following disclaimer; 87725SAli.Saidi@ARM.com * redistributions in binary form must reproduce the above copyright 97725SAli.Saidi@ARM.com * notice, this list of conditions and the following disclaimer in the 107725SAli.Saidi@ARM.com * documentation and/or other materials provided with the distribution; 117725SAli.Saidi@ARM.com * neither the name of the copyright holders nor the names of its 127725SAli.Saidi@ARM.com * contributors may be used to endorse or promote products derived from 137725SAli.Saidi@ARM.com * this software without specific prior written permission. 142623SN/A * 152623SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 162623SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 172623SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 182623SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 192623SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 202623SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 212623SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 222623SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 232623SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 242623SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 252623SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 262623SN/A * 272623SN/A * Authors: Gabe Black 282623SN/A */ 292623SN/A 302623SN/A#include <vector> 312623SN/A 322623SN/A#include "base/logging.hh" 332623SN/A#include "base/types.hh" 342623SN/A#include "python/pybind11/pybind.hh" 352623SN/A#include "systemc/core/python.hh" 362623SN/A#include "systemc/ext/core/sc_main.hh" 372623SN/A#include "systemc/ext/core/sc_time.hh" 382623SN/A#include "systemc/ext/utils/sc_report_handler.hh" 392665Ssaidi@eecs.umich.edu 402665Ssaidi@eecs.umich.edunamespace sc_core 412623SN/A{ 422623SN/A 433170Sstever@eecs.umich.edunamespace 448105Sgblack@eecs.umich.edu{ 452623SN/A 464040Ssaidi@eecs.umich.educonst char *TimeUnitNames[] = { 476658Snate@binkert.org [SC_FS] = "fs", 488229Snate@binkert.org [SC_PS] = "ps", 492623SN/A [SC_NS] = "ns", 508232Snate@binkert.org [SC_US] = "us", 519152Satgutier@umich.edu [SC_MS] = "ms", 528232Snate@binkert.org [SC_SEC] = "s" 538232Snate@binkert.org}; 543348Sbinkertn@umich.edu 553348Sbinkertn@umich.edudouble TimeUnitScale[] = { 564762Snate@binkert.org [SC_FS] = 1.0e-15, 577678Sgblack@eecs.umich.edu [SC_PS] = 1.0e-12, 588779Sgblack@eecs.umich.edu [SC_NS] = 1.0e-9, 592901Ssaidi@eecs.umich.edu [SC_US] = 1.0e-6, 602623SN/A [SC_MS] = 1.0e-3, 612623SN/A [SC_SEC] = 1.0 622623SN/A}; 632623SN/A 642623SN/Abool timeFixed = false; 652623SN/Abool pythonReady = false; 662623SN/A 672623SN/Astruct SetInfo 688921Sandreas.hansson@arm.com{ 698921Sandreas.hansson@arm.com SetInfo(::sc_core::sc_time *time, double d, ::sc_core::sc_time_unit tu) : 708921Sandreas.hansson@arm.com time(time), d(d), tu(tu) 718921Sandreas.hansson@arm.com {} 729058Satgutier@umich.edu 738779Sgblack@eecs.umich.edu ::sc_core::sc_time *time; 748779Sgblack@eecs.umich.edu double d; 758779Sgblack@eecs.umich.edu ::sc_core::sc_time_unit tu; 768779Sgblack@eecs.umich.edu}; 778779Sgblack@eecs.umich.edustd::vector<SetInfo> toSet; 782623SN/A 792623SN/Avoid 802623SN/AsetWork(sc_time *time, double d, ::sc_core::sc_time_unit tu) 812623SN/A{ 828707Sandreas.hansson@arm.com //XXX Assuming the time resolution is 1ps. 832948Ssaidi@eecs.umich.edu double scale = TimeUnitScale[tu] / TimeUnitScale[SC_PS]; 842948Ssaidi@eecs.umich.edu // Accellera claims there is a linux bug, and that these next two 855606Snate@binkert.org // lines work around them. 862948Ssaidi@eecs.umich.edu volatile double tmp = d * scale + 0.5; 872948Ssaidi@eecs.umich.edu *time = sc_time::from_value(static_cast<uint64_t>(tmp)); 885529Snate@binkert.org} 898707Sandreas.hansson@arm.com 909179Sandreas.hansson@arm.comvoid 919179Sandreas.hansson@arm.comfixTime() 922623SN/A{ 932623SN/A auto ticks = pybind11::module::import("m5.ticks"); 943647Srdreslin@umich.edu auto fix_global_frequency = ticks.attr("fixGlobalFrequency"); 952901Ssaidi@eecs.umich.edu fix_global_frequency(); 967897Shestness@cs.utexas.edu 972623SN/A for (auto &t: toSet) 982623SN/A setWork(t.time, t.d, t.tu); 992623SN/A toSet.clear(); 1002623SN/A} 1012623SN/A 1022623SN/Avoid 1032623SN/AsetGlobalFrequency(Tick ticks_per_second) 1042623SN/A{ 1052623SN/A auto ticks = pybind11::module::import("m5.ticks"); 1062623SN/A auto set_global_frequency = ticks.attr("setGlobalFrequency"); 1072915Sktlim@umich.edu set_global_frequency(ticks_per_second); 1082915Sktlim@umich.edu fixTime(); 1092623SN/A} 1102623SN/A 1112623SN/Avoid 1122623SN/Aset(::sc_core::sc_time *time, double d, ::sc_core::sc_time_unit tu) 1132623SN/A{ 1142623SN/A // Only fix time once. 1152915Sktlim@umich.edu if (!timeFixed) { 1162915Sktlim@umich.edu timeFixed = true; 1172623SN/A 1182798Sktlim@umich.edu // If we've run, python is working and we haven't fixed time yet. 1192798Sktlim@umich.edu if (pythonReady) 1202901Ssaidi@eecs.umich.edu fixTime(); 1212839Sktlim@umich.edu } 1222798Sktlim@umich.edu if (pythonReady) { 1232839Sktlim@umich.edu // Time should be working. Set up this sc_time. 1242798Sktlim@umich.edu setWork(time, d, tu); 1255496Ssaidi@eecs.umich.edu } else { 1262901Ssaidi@eecs.umich.edu // Time isn't set up yet. Defer setting up this sc_time. 1272901Ssaidi@eecs.umich.edu toSet.emplace_back(time, d, tu); 1282798Sktlim@umich.edu } 1292839Sktlim@umich.edu} 1302839Sktlim@umich.edu 1319152Satgutier@umich.educlass TimeSetter : public ::sc_gem5::PythonReadyFunc 1322901Ssaidi@eecs.umich.edu{ 1332798Sktlim@umich.edu public: 1342623SN/A TimeSetter() : ::sc_gem5::PythonReadyFunc() {} 1352623SN/A 1362623SN/A void 1372798Sktlim@umich.edu run() override 1382623SN/A { 1395221Ssaidi@eecs.umich.edu // Record that we've run and python/pybind should be usable. 1402798Sktlim@umich.edu pythonReady = true; 1414762Snate@binkert.org 1423201Shsul@eecs.umich.edu // If time is already fixed, let python know. 1435710Scws3k@cs.virginia.edu if (timeFixed) 1445710Scws3k@cs.virginia.edu fixTime(); 1452915Sktlim@umich.edu } 1465710Scws3k@cs.virginia.edu} timeSetter; 1472623SN/A 1482798Sktlim@umich.edudouble defaultUnit = 1.0e-9; 1492901Ssaidi@eecs.umich.edu 1502798Sktlim@umich.edu} // anonymous namespace 1512798Sktlim@umich.edu 1522798Sktlim@umich.edusc_time::sc_time() : val(0) {} 1532798Sktlim@umich.edu 1542798Sktlim@umich.edusc_time::sc_time(double d, sc_time_unit tu) 1555496Ssaidi@eecs.umich.edu{ 1562798Sktlim@umich.edu val = 0; 1579179Sandreas.hansson@arm.com if (d != 0) 1582867Sktlim@umich.edu set(this, d, tu); 1592867Sktlim@umich.edu} 1602867Sktlim@umich.edu 1615710Scws3k@cs.virginia.edusc_time::sc_time(const sc_time &t) 1625606Snate@binkert.org{ 1632623SN/A val = t.val; 1642623SN/A} 1652623SN/A 1662623SN/Asc_time::sc_time(double d, bool scale) 1672623SN/A{ 1682623SN/A //XXX Assuming the time resolution is 1ps. 1698737Skoansin.tan@gmail.com if (scale) 1702623SN/A set(this, d * defaultUnit, SC_SEC); 1712680Sktlim@umich.edu else 1722623SN/A set(this, d, SC_PS); 1732680Sktlim@umich.edu} 1742680Sktlim@umich.edu 1752680Sktlim@umich.edusc_time::sc_time(sc_dt::uint64 v, bool scale) 1762623SN/A{ 1772623SN/A //XXX Assuming the time resolution is 1ps. 1782623SN/A if (scale) 1792623SN/A set(this, static_cast<double>(v) * defaultUnit, SC_SEC); 1803201Shsul@eecs.umich.edu else 1813201Shsul@eecs.umich.edu set(this, static_cast<double>(v), SC_PS); 1823201Shsul@eecs.umich.edu} 1833201Shsul@eecs.umich.edu 1845169Ssaidi@eecs.umich.edusc_time & 1859179Sandreas.hansson@arm.comsc_time::operator = (const sc_time &t) 1862623SN/A{ 1872623SN/A val = t.val; 1882623SN/A return *this; 1892623SN/A} 1909180Sandreas.hansson@arm.com 1912623SN/Asc_dt::uint64 1925221Ssaidi@eecs.umich.edusc_time::value() const 1935221Ssaidi@eecs.umich.edu{ 1942623SN/A return val; 1952683Sktlim@umich.edu} 1962623SN/A 1972623SN/Adouble 1982623SN/Asc_time::to_double() const 1992623SN/A{ 2002623SN/A return static_cast<double>(val); 2013686Sktlim@umich.edu} 2022623SN/Adouble 2039179Sandreas.hansson@arm.comsc_time::to_seconds() const 2042623SN/A{ 2052623SN/A double d = to_double(); 2062623SN/A //XXX Assuming the time resolution is 1ps. 2072623SN/A double scale = TimeUnitScale[SC_PS] / TimeUnitScale[SC_SEC]; 2088737Skoansin.tan@gmail.com return d * scale; 2092623SN/A} 2105221Ssaidi@eecs.umich.edu 2115221Ssaidi@eecs.umich.educonst std::string 2122623SN/Asc_time::to_string() const 2132683Sktlim@umich.edu{ 2142623SN/A warn("%s not implemented.\n", __PRETTY_FUNCTION__); 2156043Sgblack@eecs.umich.edu return ""; 2166043Sgblack@eecs.umich.edu} 2176043Sgblack@eecs.umich.edu 2182644Sstever@eecs.umich.edubool 2192623SN/Asc_time::operator == (const sc_time &t) const 2202644Sstever@eecs.umich.edu{ 2212644Sstever@eecs.umich.edu return val == t.val; 2222623SN/A} 2232623SN/A 2242623SN/Abool 2252623SN/Asc_time::operator != (const sc_time &t) const 2262623SN/A{ 2275728Sgblack@eecs.umich.edu return val != t.val; 2285728Sgblack@eecs.umich.edu} 2295728Sgblack@eecs.umich.edu 2305728Sgblack@eecs.umich.edubool 2318105Sgblack@eecs.umich.edusc_time::operator < (const sc_time &t) const 2329180Sandreas.hansson@arm.com{ 2339179Sandreas.hansson@arm.com return val < t.val; 2345728Sgblack@eecs.umich.edu} 2355728Sgblack@eecs.umich.edu 2368975Sandreas.hansson@arm.combool 2375728Sgblack@eecs.umich.edusc_time::operator <= (const sc_time &t) const 2385728Sgblack@eecs.umich.edu{ 2395728Sgblack@eecs.umich.edu return val <= t.val; 2405728Sgblack@eecs.umich.edu} 2415728Sgblack@eecs.umich.edu 2425728Sgblack@eecs.umich.edubool 2435728Sgblack@eecs.umich.edusc_time::operator > (const sc_time &t) const 2445728Sgblack@eecs.umich.edu{ 2455728Sgblack@eecs.umich.edu return val > t.val; 2462623SN/A} 2475894Sgblack@eecs.umich.edu 2486973Stjones1@inf.ed.ac.ukbool 2496973Stjones1@inf.ed.ac.uksc_time::operator >= (const sc_time &t) const 2505744Sgblack@eecs.umich.edu{ 2515894Sgblack@eecs.umich.edu return val >= t.val; 2525894Sgblack@eecs.umich.edu} 2537691SAli.Saidi@ARM.com 2545894Sgblack@eecs.umich.edusc_time & 2555894Sgblack@eecs.umich.edusc_time::operator += (const sc_time &t) 2565894Sgblack@eecs.umich.edu{ 2575894Sgblack@eecs.umich.edu val += t.val; 2585894Sgblack@eecs.umich.edu return *this; 2595894Sgblack@eecs.umich.edu} 2605894Sgblack@eecs.umich.edu 2615894Sgblack@eecs.umich.edusc_time & 2625894Sgblack@eecs.umich.edusc_time::operator -= (const sc_time &t) 2636102Sgblack@eecs.umich.edu{ 2645894Sgblack@eecs.umich.edu val -= t.val; 2655894Sgblack@eecs.umich.edu return *this; 2665894Sgblack@eecs.umich.edu} 2675894Sgblack@eecs.umich.edu 2685894Sgblack@eecs.umich.edusc_time & 2695894Sgblack@eecs.umich.edusc_time::operator *= (double d) 2705894Sgblack@eecs.umich.edu{ 2715894Sgblack@eecs.umich.edu val = static_cast<int64_t>(static_cast<double>(val) * d + 0.5); 2725894Sgblack@eecs.umich.edu return *this; 2735894Sgblack@eecs.umich.edu} 2745894Sgblack@eecs.umich.edu 2755894Sgblack@eecs.umich.edusc_time & 2765894Sgblack@eecs.umich.edusc_time::operator /= (double d) 2775894Sgblack@eecs.umich.edu{ 2785894Sgblack@eecs.umich.edu val = static_cast<int64_t>(static_cast<double>(val) / d + 0.5); 2795894Sgblack@eecs.umich.edu return *this; 2805894Sgblack@eecs.umich.edu} 2816973Stjones1@inf.ed.ac.uk 2826973Stjones1@inf.ed.ac.ukvoid 2835894Sgblack@eecs.umich.edusc_time::print(std::ostream &os) const 2845894Sgblack@eecs.umich.edu{ 2855894Sgblack@eecs.umich.edu if (val == 0) { 2865894Sgblack@eecs.umich.edu os << "0 s"; 2875894Sgblack@eecs.umich.edu } else { 2885894Sgblack@eecs.umich.edu //XXX Assuming the time resolution is 1ps. 2895894Sgblack@eecs.umich.edu sc_time_unit tu = SC_PS; 2905894Sgblack@eecs.umich.edu uint64_t scaled = val; 2917911Shestness@cs.utexas.edu while (tu < SC_SEC && (scaled % 1000) == 0) { 2927911Shestness@cs.utexas.edu tu = (sc_time_unit)((int)tu + 1); 2935894Sgblack@eecs.umich.edu scaled /= 1000; 2945894Sgblack@eecs.umich.edu } 2957911Shestness@cs.utexas.edu 2967911Shestness@cs.utexas.edu os << scaled << ' ' << TimeUnitNames[tu]; 2975894Sgblack@eecs.umich.edu } 2985894Sgblack@eecs.umich.edu} 2995894Sgblack@eecs.umich.edu 3005894Sgblack@eecs.umich.edusc_time 3015894Sgblack@eecs.umich.edusc_time::from_value(sc_dt::uint64 u) 3025894Sgblack@eecs.umich.edu{ 3037911Shestness@cs.utexas.edu sc_time t; 3047911Shestness@cs.utexas.edu t.val = u; 3055894Sgblack@eecs.umich.edu return t; 3065894Sgblack@eecs.umich.edu} 3075894Sgblack@eecs.umich.edu 3087911Shestness@cs.utexas.edusc_time 3097911Shestness@cs.utexas.edusc_time::from_seconds(double d) 3105894Sgblack@eecs.umich.edu{ 3115894Sgblack@eecs.umich.edu sc_time t; 3125894Sgblack@eecs.umich.edu set(&t, d, SC_SEC); 3135894Sgblack@eecs.umich.edu return t; 3145894Sgblack@eecs.umich.edu} 3155894Sgblack@eecs.umich.edu 3165894Sgblack@eecs.umich.edusc_time 3175894Sgblack@eecs.umich.edusc_time::from_string(const char *str) 3185894Sgblack@eecs.umich.edu{ 3195894Sgblack@eecs.umich.edu warn("%s not implemented.\n", __PRETTY_FUNCTION__); 3206739Sgblack@eecs.umich.edu return sc_time(); 3216739Sgblack@eecs.umich.edu} 3229179Sandreas.hansson@arm.com 3239179Sandreas.hansson@arm.comconst sc_time 3245894Sgblack@eecs.umich.eduoperator + (const sc_time &a, const sc_time &b) 3255894Sgblack@eecs.umich.edu{ 3265894Sgblack@eecs.umich.edu return sc_time::from_value(a.value() + b.value()); 3275894Sgblack@eecs.umich.edu} 3285894Sgblack@eecs.umich.edu 3295744Sgblack@eecs.umich.educonst sc_time 3305744Sgblack@eecs.umich.eduoperator - (const sc_time &a, const sc_time &b) 3315894Sgblack@eecs.umich.edu{ 3325894Sgblack@eecs.umich.edu return sc_time::from_value(a.value() - b.value()); 3335894Sgblack@eecs.umich.edu} 3345894Sgblack@eecs.umich.edu 3355894Sgblack@eecs.umich.educonst sc_time 3365894Sgblack@eecs.umich.eduoperator * (const sc_time &t, double d) 3375894Sgblack@eecs.umich.edu{ 3385894Sgblack@eecs.umich.edu volatile double tmp = static_cast<double>(t.value()) * d + 0.5; 3395894Sgblack@eecs.umich.edu return sc_time::from_value(static_cast<int64_t>(tmp)); 3405894Sgblack@eecs.umich.edu} 3415894Sgblack@eecs.umich.edu 3425894Sgblack@eecs.umich.educonst sc_time 3435894Sgblack@eecs.umich.eduoperator * (double d, const sc_time &t) 3445894Sgblack@eecs.umich.edu{ 3455894Sgblack@eecs.umich.edu volatile double tmp = d * static_cast<double>(t.value()) + 0.5; 3465894Sgblack@eecs.umich.edu return sc_time::from_value(static_cast<int64_t>(tmp)); 3476102Sgblack@eecs.umich.edu} 3485894Sgblack@eecs.umich.edu 3495894Sgblack@eecs.umich.educonst sc_time 3505894Sgblack@eecs.umich.eduoperator / (const sc_time &t, double d) 3516102Sgblack@eecs.umich.edu{ 3525894Sgblack@eecs.umich.edu volatile double tmp = static_cast<double>(t.value()) / d + 0.5; 3535894Sgblack@eecs.umich.edu return sc_time::from_value(static_cast<int64_t>(tmp)); 3545894Sgblack@eecs.umich.edu} 3555894Sgblack@eecs.umich.edu 3565894Sgblack@eecs.umich.edudouble 3578949Sandreas.hansson@arm.comoperator / (const sc_time &t1, const sc_time &t2) 3585894Sgblack@eecs.umich.edu{ 3595894Sgblack@eecs.umich.edu return t1.to_double() / t2.to_double(); 3605894Sgblack@eecs.umich.edu} 3615894Sgblack@eecs.umich.edu 3625894Sgblack@eecs.umich.edustd::ostream & 3635894Sgblack@eecs.umich.eduoperator << (std::ostream &os, const sc_time &t) 3645894Sgblack@eecs.umich.edu{ 3655894Sgblack@eecs.umich.edu t.print(os); 3665894Sgblack@eecs.umich.edu return os; 3678105Sgblack@eecs.umich.edu} 3685744Sgblack@eecs.umich.edu 3695894Sgblack@eecs.umich.educonst sc_time SC_ZERO_TIME; 3705894Sgblack@eecs.umich.edu 3715894Sgblack@eecs.umich.eduvoid 3725894Sgblack@eecs.umich.edusc_set_time_resolution(double d, sc_time_unit tu) 3735894Sgblack@eecs.umich.edu{ 3745894Sgblack@eecs.umich.edu if (d <= 0.0) { 3755894Sgblack@eecs.umich.edu SC_REPORT_ERROR("(E514) set time resolution failed", 3765894Sgblack@eecs.umich.edu "value not positive"); 3778832SAli.Saidi@ARM.com } 3788949Sandreas.hansson@arm.com double dummy; 3795744Sgblack@eecs.umich.edu if (modf(log10(d), &dummy) != 0.0) { 3807691SAli.Saidi@ARM.com SC_REPORT_ERROR("(E514) set time resolution failed", 3815744Sgblack@eecs.umich.edu "value not a power of ten"); 3825744Sgblack@eecs.umich.edu } 3835744Sgblack@eecs.umich.edu if (sc_is_running()) { 3845744Sgblack@eecs.umich.edu SC_REPORT_ERROR("(E514) set time resolution failed", 3855744Sgblack@eecs.umich.edu "simulation running"); 3865744Sgblack@eecs.umich.edu } 3875744Sgblack@eecs.umich.edu static bool specified = false; 3885744Sgblack@eecs.umich.edu if (specified) { 3895744Sgblack@eecs.umich.edu SC_REPORT_ERROR("(E514) set time resolution failed", 3905744Sgblack@eecs.umich.edu "already specified"); 3915744Sgblack@eecs.umich.edu } 3925744Sgblack@eecs.umich.edu // This won't detect the timescale being fixed outside of systemc, but 3932623SN/A // it's at least some protection. 3948444Sgblack@eecs.umich.edu if (timeFixed) { 3958444Sgblack@eecs.umich.edu SC_REPORT_ERROR("(E514) set time resolution failed", 3962623SN/A "sc_time object(s) constructed"); 3975728Sgblack@eecs.umich.edu } 3985728Sgblack@eecs.umich.edu 3996221Snate@binkert.org // Normalize d to seconds. 4007720Sgblack@eecs.umich.edu d *= TimeUnitScale[tu]; 4016227Snate@binkert.org if (d < TimeUnitScale[SC_FS]) { 4026973Stjones1@inf.ed.ac.uk SC_REPORT_ERROR("(E514) set time resolution failed", 4032623SN/A "value smaller than 1 fs"); 4047045Ssteve.reinhardt@amd.com } 4057045Ssteve.reinhardt@amd.com // Change d from a period to a frequency. 4067045Ssteve.reinhardt@amd.com d = 1 / d; 4077045Ssteve.reinhardt@amd.com // Convert to integer ticks. 4087520Sgblack@eecs.umich.edu Tick ticks_per_second = static_cast<Tick>(d); 4098832SAli.Saidi@ARM.com setGlobalFrequency(ticks_per_second); 4105728Sgblack@eecs.umich.edu specified = true; 4117520Sgblack@eecs.umich.edu} 4125744Sgblack@eecs.umich.edu 4135728Sgblack@eecs.umich.edusc_time 4145894Sgblack@eecs.umich.edusc_get_time_resolution() 4155744Sgblack@eecs.umich.edu{ 4165894Sgblack@eecs.umich.edu return sc_time::from_value(1); 4176102Sgblack@eecs.umich.edu} 4185894Sgblack@eecs.umich.edu 4195894Sgblack@eecs.umich.educonst sc_time & 4206973Stjones1@inf.ed.ac.uksc_max_time() 4217520Sgblack@eecs.umich.edu{ 4226973Stjones1@inf.ed.ac.uk static const sc_time MaxScTime = sc_time::from_value(MaxTick); 4238486Sgblack@eecs.umich.edu return MaxScTime; 4248486Sgblack@eecs.umich.edu} 4258486Sgblack@eecs.umich.edu 4268486Sgblack@eecs.umich.eduvoid 4276973Stjones1@inf.ed.ac.uksc_set_default_time_unit(double d, sc_time_unit tu) 4286973Stjones1@inf.ed.ac.uk{ 4296973Stjones1@inf.ed.ac.uk if (d < 0.0) { 4305744Sgblack@eecs.umich.edu SC_REPORT_ERROR("(E515) set default time unit failed", 4316973Stjones1@inf.ed.ac.uk "value not positive"); 4327520Sgblack@eecs.umich.edu } 4338486Sgblack@eecs.umich.edu double dummy; 4348486Sgblack@eecs.umich.edu if (modf(log10(d), &dummy) != 0.0) { 4356973Stjones1@inf.ed.ac.uk SC_REPORT_ERROR("(E515) set default time unit failed", 4362623SN/A "value not a power of ten"); 4372623SN/A } 4385728Sgblack@eecs.umich.edu if (sc_is_running()) { 4392623SN/A SC_REPORT_ERROR("(E515) set default time unit failed", 4402623SN/A "simulation running"); 4415728Sgblack@eecs.umich.edu } 4425728Sgblack@eecs.umich.edu static bool specified = false; 4435728Sgblack@eecs.umich.edu if (specified) { 4445728Sgblack@eecs.umich.edu SC_REPORT_ERROR("(E515) set default time unit failed", 4458105Sgblack@eecs.umich.edu "already specified"); 4469180Sandreas.hansson@arm.com } 4479179Sandreas.hansson@arm.com // This won't detect the timescale being fixed outside of systemc, but 4485728Sgblack@eecs.umich.edu // it's at least some protection. 4495728Sgblack@eecs.umich.edu if (timeFixed) { 4508975Sandreas.hansson@arm.com SC_REPORT_ERROR("(E515) set default time unit failed", 4515728Sgblack@eecs.umich.edu "sc_time object(s) constructed"); 4525728Sgblack@eecs.umich.edu } 4535728Sgblack@eecs.umich.edu 4545728Sgblack@eecs.umich.edu // Normalize d to seconds. 4555728Sgblack@eecs.umich.edu defaultUnit = d * TimeUnitScale[tu]; 4565728Sgblack@eecs.umich.edu specified = true; 4575728Sgblack@eecs.umich.edu} 4585728Sgblack@eecs.umich.edu 4592623SN/Asc_time 4602623SN/Asc_get_default_time_unit() 4618444Sgblack@eecs.umich.edu{ 4628444Sgblack@eecs.umich.edu return sc_time(defaultUnit, SC_SEC); 4632623SN/A} 4648443Sgblack@eecs.umich.edu 4658443Sgblack@eecs.umich.edusc_time_tuple::sc_time_tuple(const sc_time &) 4668443Sgblack@eecs.umich.edu{ 4675728Sgblack@eecs.umich.edu warn("%s not implemented.\n", __PRETTY_FUNCTION__); 4686221Snate@binkert.org} 4697720Sgblack@eecs.umich.edu 4706227Snate@binkert.orgbool 4716973Stjones1@inf.ed.ac.uksc_time_tuple::has_value() const 4723169Sstever@eecs.umich.edu{ 4737045Ssteve.reinhardt@amd.com warn("%s not implemented.\n", __PRETTY_FUNCTION__); 4747045Ssteve.reinhardt@amd.com return false; 4757045Ssteve.reinhardt@amd.com} 4767045Ssteve.reinhardt@amd.com 4777520Sgblack@eecs.umich.edusc_dt::uint64 4788832SAli.Saidi@ARM.comsc_time_tuple::value() const 4795728Sgblack@eecs.umich.edu{ 4807520Sgblack@eecs.umich.edu warn("%s not implemented.\n", __PRETTY_FUNCTION__); 4815744Sgblack@eecs.umich.edu return 0; 4825728Sgblack@eecs.umich.edu} 4835894Sgblack@eecs.umich.edu 4845744Sgblack@eecs.umich.educonst char * 4855894Sgblack@eecs.umich.edusc_time_tuple::unit_symbol() const 4866102Sgblack@eecs.umich.edu{ 4875894Sgblack@eecs.umich.edu warn("%s not implemented.\n", __PRETTY_FUNCTION__); 4885894Sgblack@eecs.umich.edu return ""; 4896973Stjones1@inf.ed.ac.uk} 4908443Sgblack@eecs.umich.edu 4918486Sgblack@eecs.umich.edudouble 4928486Sgblack@eecs.umich.edusc_time_tuple::to_double() const 4938486Sgblack@eecs.umich.edu{ 4948486Sgblack@eecs.umich.edu warn("%s not implemented.\n", __PRETTY_FUNCTION__); 4956973Stjones1@inf.ed.ac.uk return 0.0; 4966973Stjones1@inf.ed.ac.uk} 4976973Stjones1@inf.ed.ac.uk 4985744Sgblack@eecs.umich.edustd::string 4996973Stjones1@inf.ed.ac.uksc_time_tuple::to_string() const 5008443Sgblack@eecs.umich.edu{ 5018486Sgblack@eecs.umich.edu warn("%s not implemented.\n", __PRETTY_FUNCTION__); 5028486Sgblack@eecs.umich.edu return ""; 5036973Stjones1@inf.ed.ac.uk} 5042623SN/A 5052623SN/A} // namespace sc_core 5067045Ssteve.reinhardt@amd.com