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