SystemC  2.3.1
Accellera SystemC proof-of-concept library
sc_time.h
Go to the documentation of this file.
1 /*****************************************************************************
2 
3  The following code is derived, directly or indirectly, from the SystemC
4  source code Copyright (c) 1996-2014 by all Contributors.
5  All Rights reserved.
6 
7  The contents of this file are subject to the restrictions and limitations
8  set forth in the SystemC Open Source License (the "License");
9  You may not use this file except in compliance with such restrictions and
10  limitations. You may obtain instructions on how to receive a copy of the
11  License at http://www.accellera.org/. Software distributed by Contributors
12  under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
13  ANY KIND, either express or implied. See the License for the specific
14  language governing rights and limitations under the License.
15 
16  *****************************************************************************/
17 
18 /*****************************************************************************
19 
20  sc_time.h -- The time class.
21 
22  Original Author: Martin Janssen, Synopsys, Inc., 2001-05-21
23 
24  CHANGE LOG AT THE END OF THE FILE
25  *****************************************************************************/
26 
27 
28 #ifndef SC_TIME_H
29 #define SC_TIME_H
30 
31 
34 #include "sysc/utils/sc_iostream.h"
35 
36 namespace sc_core {
37 
38 class sc_simcontext;
39 
40 // friend operator declarations
41 
42  const sc_time operator + ( const sc_time&, const sc_time& );
43  const sc_time operator - ( const sc_time&, const sc_time& );
44  const sc_time operator * ( const sc_time&, double );
45  const sc_time operator * ( double, const sc_time& );
46  const sc_time operator / ( const sc_time&, double );
47  double operator / ( const sc_time&, const sc_time& );
48 
49 
50 // ----------------------------------------------------------------------------
51 // ENUM : sc_time_unit
52 //
53 // Enumeration of time units.
54 // ----------------------------------------------------------------------------
55 
57 {
58  SC_FS = 0,
64 };
65 
66 
67 // ----------------------------------------------------------------------------
68 // CLASS : sc_time
69 //
70 // The time class.
71 // ----------------------------------------------------------------------------
72 
73 class sc_time
74 {
75 public:
76 
78 
79  // constructors
80 
81  sc_time();
82  sc_time( double, sc_time_unit );
83  sc_time( double, sc_time_unit, sc_simcontext* );
84  sc_time( const sc_time& );
85 
86  static sc_time from_value( value_type );
87 
88  // deprecated, use from_value(v)
89  sc_time( double, bool scale );
90  sc_time( value_type, bool scale );
91 
92  // assignment operator
93 
94  sc_time& operator = ( const sc_time& );
95 
96 
97  // conversion functions
98 
99  value_type value() const; // relative to the time resolution
100  double to_double() const; // relative to the time resolution
101  double to_default_time_units() const;
102  double to_seconds() const;
103  const std::string to_string() const;
104 
105 
106  // relational operators
107 
108  bool operator == ( const sc_time& ) const;
109  bool operator != ( const sc_time& ) const;
110  bool operator < ( const sc_time& ) const;
111  bool operator <= ( const sc_time& ) const;
112  bool operator > ( const sc_time& ) const;
113  bool operator >= ( const sc_time& ) const;
114 
115 
116  // arithmetic operators
117 
118  sc_time& operator += ( const sc_time& );
119  sc_time& operator -= ( const sc_time& );
120 
121  friend const sc_time operator + ( const sc_time&, const sc_time& );
122  friend const sc_time operator - ( const sc_time&, const sc_time& );
123 
124  sc_time& operator *= ( double );
125  sc_time& operator /= ( double );
126  sc_time& operator %= ( const sc_time& );
127 
128  friend const sc_time operator * ( const sc_time&, double );
129  friend const sc_time operator * ( double, const sc_time& );
130  friend const sc_time operator / ( const sc_time&, double );
131  friend double operator / ( const sc_time&, const sc_time& );
132  friend const sc_time operator % ( const sc_time&, const sc_time& );
133 
134 
135  // print function
136 
137  void print( ::std::ostream& os = std::cout ) const;
138 
139 private:
140 
141  value_type m_value;
142 };
143 
144 
145 // print operator
146 
147 inline ::std::ostream& operator << ( ::std::ostream&, const sc_time& );
148 
149 
150 // IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
151 
152 // constructors
153 
154 inline
156 : m_value( 0 )
157 {}
158 
159 inline
161 : m_value( t.m_value )
162 {}
163 
164 
165 // assignment operator
166 
167 inline
168 sc_time&
170 {
171  m_value = t.m_value;
172  return *this;
173 }
174 
175 
176 // conversion functions
177 
178 inline
180 sc_time::value() const // relative to the time resolution
181 {
182  return m_value;
183 }
184 
185 
186 inline
187 double
188 sc_time::to_double() const // relative to the time resolution
189 {
190  return sc_dt::uint64_to_double( m_value );
191 }
192 
193 
194 // relational operators
195 
196 inline
197 bool
199 {
200  return ( m_value == t.m_value );
201 }
202 
203 inline
204 bool
206 {
207  return ( m_value != t.m_value );
208 }
209 
210 inline
211 bool
212 sc_time::operator < ( const sc_time& t ) const
213 {
214  return ( m_value < t.m_value );
215 }
216 
217 inline
218 bool
220 {
221  return ( m_value <= t.m_value );
222 }
223 
224 inline
225 bool
226 sc_time::operator > ( const sc_time& t ) const
227 {
228  return ( m_value > t.m_value );
229 }
230 
231 inline
232 bool
234 {
235  return ( m_value >= t.m_value );
236 }
237 
238 
239 // arithmetic operators
240 
241 inline
242 sc_time&
244 {
245  m_value += t.m_value;
246  return *this;
247 }
248 
249 inline
250 sc_time&
252 {
253  m_value -= t.m_value;
254  return *this;
255 }
256 
257 
258 inline
259 const sc_time
260 operator + ( const sc_time& t1, const sc_time& t2 )
261 {
262  return sc_time( t1 ) += t2;
263 }
264 
265 inline
266 const sc_time
267 operator - ( const sc_time& t1, const sc_time& t2 )
268 {
269  return sc_time( t1 ) -= t2;
270 }
271 
272 
273 inline
274 sc_time&
276 {
277  // linux bug workaround; don't change next two lines
278  volatile double tmp = sc_dt::uint64_to_double( m_value ) * d + 0.5;
279  m_value = SCAST<sc_dt::int64>( tmp );
280  return *this;
281 }
282 
283 inline
284 sc_time&
286 {
287  // linux bug workaround; don't change next two lines
288  volatile double tmp = sc_dt::uint64_to_double( m_value ) / d + 0.5;
289  m_value = SCAST<sc_dt::int64>( tmp );
290  return *this;
291 }
292 
293 inline
294 sc_time&
296 {
297  m_value %= t.m_value;
298  return *this;
299 }
300 
301 inline
302 const sc_time
303 operator * ( const sc_time& t, double d )
304 {
305  sc_time tmp( t );
306  return tmp *= d;
307 }
308 
309 inline
310 const sc_time
311 operator * ( double d, const sc_time& t )
312 {
313  sc_time tmp( t );
314  return tmp *= d;
315 }
316 
317 inline
318 const sc_time
319 operator / ( const sc_time& t, double d )
320 {
321  sc_time tmp( t );
322  return tmp /= d;
323 }
324 
325 inline
326 double
327 operator / ( const sc_time& t1, const sc_time& t2 )
328 {
329  return ( t1.to_double() / t2.to_double() );
330 }
331 
332 inline
333 const sc_time
334 operator % ( const sc_time& t1, const sc_time& t2 )
335 {
336  sc_time tmp(t1);
337  return tmp %= t2;
338 }
339 
340 // print operator
341 
342 inline
343 ::std::ostream&
344 operator << ( ::std::ostream& os, const sc_time& t )
345 {
346  t.print( os );
347  return os;
348 }
349 
350 
351 // ----------------------------------------------------------------------------
352 // STRUCT : sc_time_params
353 //
354 // Struct that holds the time resolution and default time unit.
355 // ----------------------------------------------------------------------------
356 
358 {
359  double time_resolution; // in femto seconds
362 
363  sc_time::value_type default_time_unit; // in time resolution
365 
366  sc_time_params();
367  ~sc_time_params();
368 };
369 
370 
371 // ----------------------------------------------------------------------------
372 
373 extern const sc_time SC_ZERO_TIME;
374 
375 
376 // functions for accessing the time resolution and default time unit
377 
378 extern void sc_set_time_resolution( double, sc_time_unit );
380 
381 extern void sc_set_default_time_unit( double, sc_time_unit );
383 
384 } // namespace sc_core
385 
386 #endif
387 
388 // $Log: sc_time.h,v $
389 // Revision 1.5 2011/08/26 20:46:11 acg
390 // Andy Goodrich: moved the modification log to the end of the file to
391 // eliminate source line number skew when check-ins are done.
392 //
393 // Revision 1.4 2011/02/18 20:27:14 acg
394 // Andy Goodrich: Updated Copyrights.
395 //
396 // Revision 1.3 2011/02/13 21:47:38 acg
397 // Andy Goodrich: update copyright notice.
398 //
399 // Revision 1.2 2008/05/22 17:06:27 acg
400 // Andy Goodrich: updated copyright notice to include 2008.
401 //
402 // Revision 1.1.1.1 2006/12/15 20:20:05 acg
403 // SystemC 2.3
404 //
405 // Revision 1.4 2006/05/08 18:02:06 acg
406 // Andy Goodrich: added David Long's forward declarations for friend
407 // functions, methods, and operators to keep the Microsoft compiler happy.
408 //
409 // Revision 1.3 2006/01/13 18:44:30 acg
410 // Added $Log to record CVS changes into the source.
411 
412 // Taf!
const sc_time operator%(const sc_time &t1, const sc_time &t2)
Definition: sc_time.h:334
value_type value() const
Definition: sc_time.h:180
void print(::std::ostream &os=std::cout) const
sc_time & operator-=(const sc_time &)
Definition: sc_time.h:251
inline::std::ostream & operator<<(::std::ostream &os, const sc_fifo< T > &a)
Definition: sc_fifo.h:424
sc_time_unit
Definition: sc_time.h:56
sc_dt::uint64 value_type
Definition: sc_time.h:77
friend const sc_time operator-(const sc_time &, const sc_time &)
Definition: sc_time.h:267
bool operator<(const sc_time &) const
Definition: sc_time.h:212
uint64_t uint64
Definition: sc_nbdefs.h:183
sc_time & operator*=(double)
Definition: sc_time.h:275
sc_time & operator=(const sc_time &)
Definition: sc_time.h:169
sc_time::value_type default_time_unit
Definition: sc_time.h:363
static sc_time from_value(value_type)
sc_time & operator%=(const sc_time &)
Definition: sc_time.h:295
double uint64_to_double(uint64 a)
Definition: scfx_ieee.h:682
friend const sc_time operator%(const sc_time &, const sc_time &)
Definition: sc_time.h:334
const sc_time operator+(const sc_time &, const sc_time &)
Definition: sc_time.h:260
bool operator<=(const sc_time &) const
Definition: sc_time.h:219
bool time_resolution_specified
Definition: sc_time.h:360
const sc_time operator/(const sc_time &, double)
Definition: sc_time.h:319
double to_double() const
Definition: sc_time.h:188
sc_time & operator/=(double)
Definition: sc_time.h:285
double to_seconds() const
sc_time & operator+=(const sc_time &)
Definition: sc_time.h:243
const sc_time operator-(const sc_time &, const sc_time &)
Definition: sc_time.h:267
bool default_time_unit_specified
Definition: sc_time.h:364
const sc_time SC_ZERO_TIME
sc_time sc_get_time_resolution()
bool operator==(const sc_time &) const
Definition: sc_time.h:198
void sc_set_time_resolution(double, sc_time_unit)
bool operator!=(const sc_time &) const
Definition: sc_time.h:205
const std::string to_string() const
double to_default_time_units() const
bool operator>=(const sc_time &) const
Definition: sc_time.h:233
void sc_set_default_time_unit(double, sc_time_unit)
sc_time sc_get_default_time_unit()
friend const sc_time operator*(const sc_time &, double)
Definition: sc_time.h:303
friend const sc_time operator/(const sc_time &, double)
Definition: sc_time.h:319
const sc_time operator*(const sc_time &, double)
Definition: sc_time.h:303
friend const sc_time operator+(const sc_time &, const sc_time &)
Definition: sc_time.h:260
bool operator>(const sc_time &) const
Definition: sc_time.h:226