112837Sgabeblack@google.com/* 212837Sgabeblack@google.com * Copyright 2018 Google, Inc. 312837Sgabeblack@google.com * 412837Sgabeblack@google.com * Redistribution and use in source and binary forms, with or without 512837Sgabeblack@google.com * modification, are permitted provided that the following conditions are 612837Sgabeblack@google.com * met: redistributions of source code must retain the above copyright 712837Sgabeblack@google.com * notice, this list of conditions and the following disclaimer; 812837Sgabeblack@google.com * redistributions in binary form must reproduce the above copyright 912837Sgabeblack@google.com * notice, this list of conditions and the following disclaimer in the 1012837Sgabeblack@google.com * documentation and/or other materials provided with the distribution; 1112837Sgabeblack@google.com * neither the name of the copyright holders nor the names of its 1212837Sgabeblack@google.com * contributors may be used to endorse or promote products derived from 1312837Sgabeblack@google.com * this software without specific prior written permission. 1412837Sgabeblack@google.com * 1512837Sgabeblack@google.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1612837Sgabeblack@google.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1712837Sgabeblack@google.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1812837Sgabeblack@google.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 1912837Sgabeblack@google.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2012837Sgabeblack@google.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2112837Sgabeblack@google.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2212837Sgabeblack@google.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2312837Sgabeblack@google.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2412837Sgabeblack@google.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2512837Sgabeblack@google.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2612837Sgabeblack@google.com * 2712837Sgabeblack@google.com * Authors: Gabe Black 2812837Sgabeblack@google.com */ 2912837Sgabeblack@google.com 3012837Sgabeblack@google.com#ifndef __SYSTEMC_EXT_CORE_SC_TIME_HH__ 3112837Sgabeblack@google.com#define __SYSTEMC_EXT_CORE_SC_TIME_HH__ 3212837Sgabeblack@google.com 3312837Sgabeblack@google.com#include <stdint.h> 3412837Sgabeblack@google.com 3512837Sgabeblack@google.com#include <iostream> 3612837Sgabeblack@google.com 3712837Sgabeblack@google.com#include "../dt/int/sc_nbdefs.hh" 3812837Sgabeblack@google.com 3912837Sgabeblack@google.comnamespace sc_core 4012837Sgabeblack@google.com{ 4112837Sgabeblack@google.com 4212837Sgabeblack@google.comenum sc_time_unit { 4312837Sgabeblack@google.com SC_FS = 0, 4412837Sgabeblack@google.com SC_PS, 4512837Sgabeblack@google.com SC_NS, 4612837Sgabeblack@google.com SC_US, 4712837Sgabeblack@google.com SC_MS, 4812837Sgabeblack@google.com SC_SEC 4912837Sgabeblack@google.com}; 5012837Sgabeblack@google.com 5112837Sgabeblack@google.comclass sc_time 5212837Sgabeblack@google.com{ 5312837Sgabeblack@google.com public: 5412837Sgabeblack@google.com sc_time(); 5512837Sgabeblack@google.com sc_time(double, sc_time_unit); 5612837Sgabeblack@google.com sc_time(const sc_time &); 5712837Sgabeblack@google.com 5813265Sgabeblack@google.com // Nonstandard 5913265Sgabeblack@google.com sc_time(double, const char *); 6013265Sgabeblack@google.com 6112925Sgabeblack@google.com // Deprecated 6212925Sgabeblack@google.com sc_time(double, bool); 6312925Sgabeblack@google.com sc_time(sc_dt::uint64, bool); 6412925Sgabeblack@google.com 6512837Sgabeblack@google.com sc_time &operator = (const sc_time &); 6612837Sgabeblack@google.com 6712837Sgabeblack@google.com sc_dt::uint64 value() const; 6812837Sgabeblack@google.com double to_double() const; 6912837Sgabeblack@google.com double to_seconds() const; 7012837Sgabeblack@google.com const std::string to_string() const; 7112837Sgabeblack@google.com 7212837Sgabeblack@google.com bool operator == (const sc_time &) const; 7312837Sgabeblack@google.com bool operator != (const sc_time &) const; 7412837Sgabeblack@google.com bool operator < (const sc_time &) const; 7512837Sgabeblack@google.com bool operator <= (const sc_time &) const; 7612837Sgabeblack@google.com bool operator > (const sc_time &) const; 7712837Sgabeblack@google.com bool operator >= (const sc_time &) const; 7812837Sgabeblack@google.com 7912837Sgabeblack@google.com sc_time &operator += (const sc_time &); 8012837Sgabeblack@google.com sc_time &operator -= (const sc_time &); 8112837Sgabeblack@google.com sc_time &operator *= (double); 8212837Sgabeblack@google.com sc_time &operator /= (double); 8312837Sgabeblack@google.com 8412837Sgabeblack@google.com void print(std::ostream & =std::cout) const; 8512923Sgabeblack@google.com 8612923Sgabeblack@google.com // Deprecated 8712923Sgabeblack@google.com static sc_time from_value(sc_dt::uint64); 8812923Sgabeblack@google.com static sc_time from_seconds(double); 8912923Sgabeblack@google.com static sc_time from_string(const char *str); 9012983Sgabeblack@google.com 9112983Sgabeblack@google.com private: 9212983Sgabeblack@google.com uint64_t val; 9312837Sgabeblack@google.com}; 9412837Sgabeblack@google.com 9512837Sgabeblack@google.comconst sc_time operator + (const sc_time &, const sc_time &); 9612837Sgabeblack@google.comconst sc_time operator - (const sc_time &, const sc_time &); 9712837Sgabeblack@google.com 9812837Sgabeblack@google.comconst sc_time operator * (const sc_time &, double); 9912837Sgabeblack@google.comconst sc_time operator * (double, const sc_time &); 10012837Sgabeblack@google.comconst sc_time operator / (const sc_time &, double); 10112837Sgabeblack@google.comdouble operator / (const sc_time &, const sc_time &); 10212837Sgabeblack@google.com 10312837Sgabeblack@google.comstd::ostream &operator << (std::ostream &, const sc_time &); 10412837Sgabeblack@google.com 10512837Sgabeblack@google.comextern const sc_time SC_ZERO_TIME; 10612837Sgabeblack@google.com 10712837Sgabeblack@google.comvoid sc_set_time_resolution(double, sc_time_unit); 10812837Sgabeblack@google.comsc_time sc_get_time_resolution(); 10912837Sgabeblack@google.comconst sc_time &sc_max_time(); 11012837Sgabeblack@google.com 11112916Sgabeblack@google.com// Deprecated 11212916Sgabeblack@google.comvoid sc_set_default_time_unit(double, sc_time_unit); 11312916Sgabeblack@google.comsc_time sc_get_default_time_unit(); 11412916Sgabeblack@google.com 11512927Sgabeblack@google.com// Nonstandard 11612927Sgabeblack@google.comclass sc_time_tuple 11712927Sgabeblack@google.com{ 11812927Sgabeblack@google.com public: 11913263Sgabeblack@google.com sc_time_tuple() : _value(), _unit(SC_SEC), _set(false) {} 12012927Sgabeblack@google.com sc_time_tuple(const sc_time &); 12112927Sgabeblack@google.com 12212927Sgabeblack@google.com bool has_value() const; 12312927Sgabeblack@google.com sc_dt::uint64 value() const; 12412927Sgabeblack@google.com // Normalized unit. 12512927Sgabeblack@google.com sc_time_unit unit() const { return _unit; } 12612927Sgabeblack@google.com // Normalized unit symbol. 12712927Sgabeblack@google.com const char *unit_symbol() const; 12812927Sgabeblack@google.com 12912927Sgabeblack@google.com operator sc_time() const { return sc_time(to_double(), _unit); } 13012927Sgabeblack@google.com 13112927Sgabeblack@google.com double to_double() const; // Relative to the normalized unit. 13212927Sgabeblack@google.com std::string to_string() const; 13312927Sgabeblack@google.com 13412927Sgabeblack@google.com private: 13512927Sgabeblack@google.com sc_dt::uint64 _value; 13612927Sgabeblack@google.com sc_time_unit _unit; 13713263Sgabeblack@google.com bool _set; 13812927Sgabeblack@google.com}; 13912927Sgabeblack@google.com 14012837Sgabeblack@google.com} // namespace sc_core 14112837Sgabeblack@google.com 14212837Sgabeblack@google.com#endif //__SYSTEMC_EXT_CORE_SC_TIME_HH__ 143