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