112027Sjungma@eit.uni-kl.de/*****************************************************************************
212027Sjungma@eit.uni-kl.de
312027Sjungma@eit.uni-kl.de  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
412027Sjungma@eit.uni-kl.de  more contributor license agreements.  See the NOTICE file distributed
512027Sjungma@eit.uni-kl.de  with this work for additional information regarding copyright ownership.
612027Sjungma@eit.uni-kl.de  Accellera licenses this file to you under the Apache License, Version 2.0
712027Sjungma@eit.uni-kl.de  (the "License"); you may not use this file except in compliance with the
812027Sjungma@eit.uni-kl.de  License.  You may obtain a copy of the License at
912027Sjungma@eit.uni-kl.de
1012027Sjungma@eit.uni-kl.de    http://www.apache.org/licenses/LICENSE-2.0
1112027Sjungma@eit.uni-kl.de
1212027Sjungma@eit.uni-kl.de  Unless required by applicable law or agreed to in writing, software
1312027Sjungma@eit.uni-kl.de  distributed under the License is distributed on an "AS IS" BASIS,
1412027Sjungma@eit.uni-kl.de  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
1512027Sjungma@eit.uni-kl.de  implied.  See the License for the specific language governing
1612027Sjungma@eit.uni-kl.de  permissions and limitations under the License.
1712027Sjungma@eit.uni-kl.de
1812027Sjungma@eit.uni-kl.de *****************************************************************************/
1912027Sjungma@eit.uni-kl.de
2012027Sjungma@eit.uni-kl.de/*****************************************************************************
2112027Sjungma@eit.uni-kl.de
2212027Sjungma@eit.uni-kl.de  sc_time.cpp --
2312027Sjungma@eit.uni-kl.de
2412027Sjungma@eit.uni-kl.de  Original Author: Martin Janssen, Synopsys, Inc., 2001-05-21
2512027Sjungma@eit.uni-kl.de
2612027Sjungma@eit.uni-kl.de  CHANGE LOG AT THE END OF THE FILE
2712027Sjungma@eit.uni-kl.de *****************************************************************************/
2812027Sjungma@eit.uni-kl.de
2912027Sjungma@eit.uni-kl.de
3012027Sjungma@eit.uni-kl.de#include <math.h>
3112027Sjungma@eit.uni-kl.de#include <stdio.h>
3212027Sjungma@eit.uni-kl.de
3312027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_kernel_ids.h"
3412027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_simcontext.h"
3512027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_time.h"
3612027Sjungma@eit.uni-kl.de#include "sysc/utils/sc_utils_ids.h"
3712027Sjungma@eit.uni-kl.de
3812027Sjungma@eit.uni-kl.de#if !defined(PRIu64)
3912027Sjungma@eit.uni-kl.de#   if defined(_MSC_VER) || defined(__MINGW32__)
4012027Sjungma@eit.uni-kl.de#       define PRIu64 "I64u"
4112027Sjungma@eit.uni-kl.de#   else
4212027Sjungma@eit.uni-kl.de#       define PRIu64 "llu"
4312027Sjungma@eit.uni-kl.de#   endif
4412027Sjungma@eit.uni-kl.de#endif // PRIu64
4512027Sjungma@eit.uni-kl.de
4612027Sjungma@eit.uni-kl.de#ifdef SC_ENABLE_EARLY_MAXTIME_CREATION
4712027Sjungma@eit.uni-kl.de#  define SC_MAXTIME_ALLOWED_ 1
4812027Sjungma@eit.uni-kl.de#else
4912027Sjungma@eit.uni-kl.de#  define SC_MAXTIME_ALLOWED_ 0
5012027Sjungma@eit.uni-kl.de#endif
5112027Sjungma@eit.uni-kl.de
5212027Sjungma@eit.uni-kl.denamespace sc_core {
5312027Sjungma@eit.uni-kl.de
5412027Sjungma@eit.uni-kl.destatic
5512027Sjungma@eit.uni-kl.dedouble time_values[] = {
5612027Sjungma@eit.uni-kl.de    1,       // fs
5712027Sjungma@eit.uni-kl.de    1e3,     // ps
5812027Sjungma@eit.uni-kl.de    1e6,     // ns
5912027Sjungma@eit.uni-kl.de    1e9,     // us
6012027Sjungma@eit.uni-kl.de    1e12,    // ms
6112027Sjungma@eit.uni-kl.de    1e15     // s
6212027Sjungma@eit.uni-kl.de};
6312027Sjungma@eit.uni-kl.de
6412027Sjungma@eit.uni-kl.destatic
6512027Sjungma@eit.uni-kl.deconst char* time_units[] = {
6612027Sjungma@eit.uni-kl.de    "fs",
6712027Sjungma@eit.uni-kl.de    "ps",
6812027Sjungma@eit.uni-kl.de    "ns",
6912027Sjungma@eit.uni-kl.de    "us",
7012027Sjungma@eit.uni-kl.de    "ms",
7112027Sjungma@eit.uni-kl.de    "s"
7212027Sjungma@eit.uni-kl.de};
7312027Sjungma@eit.uni-kl.de
7412027Sjungma@eit.uni-kl.de
7512027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
7612027Sjungma@eit.uni-kl.de//  CLASS : sc_time
7712027Sjungma@eit.uni-kl.de//
7812027Sjungma@eit.uni-kl.de//  The time class.
7912027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
8012027Sjungma@eit.uni-kl.de
8112027Sjungma@eit.uni-kl.de// constructors
8212027Sjungma@eit.uni-kl.de
8312027Sjungma@eit.uni-kl.desc_time::sc_time( double v, sc_time_unit tu )
8412027Sjungma@eit.uni-kl.de: m_value( 0 )
8512027Sjungma@eit.uni-kl.de{
8612027Sjungma@eit.uni-kl.de    if( v != 0 ) {
8712027Sjungma@eit.uni-kl.de	sc_time_params* time_params = sc_get_curr_simcontext()->m_time_params;
8812027Sjungma@eit.uni-kl.de	double scale_fac = time_values[tu] / time_params->time_resolution;
8912027Sjungma@eit.uni-kl.de	// linux bug workaround; don't change next two lines
9012027Sjungma@eit.uni-kl.de	volatile double tmp = v * scale_fac + 0.5;
9112027Sjungma@eit.uni-kl.de	m_value = SCAST<sc_dt::int64>( tmp );
9212027Sjungma@eit.uni-kl.de	time_params->time_resolution_fixed = true;
9312027Sjungma@eit.uni-kl.de    }
9412027Sjungma@eit.uni-kl.de}
9512027Sjungma@eit.uni-kl.de
9612027Sjungma@eit.uni-kl.desc_time::sc_time( double v, sc_time_unit tu, sc_simcontext* simc )
9712027Sjungma@eit.uni-kl.de: m_value( 0 )
9812027Sjungma@eit.uni-kl.de{
9912027Sjungma@eit.uni-kl.de    if( v != 0 ) {
10012027Sjungma@eit.uni-kl.de	sc_time_params* time_params = simc->m_time_params;
10112027Sjungma@eit.uni-kl.de	double scale_fac = time_values[tu] / time_params->time_resolution;
10212027Sjungma@eit.uni-kl.de	// linux bug workaround; don't change next two lines
10312027Sjungma@eit.uni-kl.de	volatile double tmp = v * scale_fac + 0.5;
10412027Sjungma@eit.uni-kl.de	m_value = SCAST<sc_dt::int64>( tmp );
10512027Sjungma@eit.uni-kl.de	time_params->time_resolution_fixed = true;
10612027Sjungma@eit.uni-kl.de    }
10712027Sjungma@eit.uni-kl.de}
10812027Sjungma@eit.uni-kl.de
10912027Sjungma@eit.uni-kl.desc_time::sc_time( double v, bool scale )
11012027Sjungma@eit.uni-kl.de: m_value( 0 )
11112027Sjungma@eit.uni-kl.de{
11212027Sjungma@eit.uni-kl.de    static bool warn_constructor=true;
11312027Sjungma@eit.uni-kl.de    if ( warn_constructor ) {
11412027Sjungma@eit.uni-kl.de        warn_constructor=false;
11512027Sjungma@eit.uni-kl.de        SC_REPORT_INFO(SC_ID_IEEE_1666_DEPRECATION_,
11612027Sjungma@eit.uni-kl.de            "deprecated constructor: sc_time(double,bool)");
11712027Sjungma@eit.uni-kl.de    }
11812027Sjungma@eit.uni-kl.de
11912027Sjungma@eit.uni-kl.de    if( v != 0 ) {
12012027Sjungma@eit.uni-kl.de	sc_time_params* time_params = sc_get_curr_simcontext()->m_time_params;
12112027Sjungma@eit.uni-kl.de	if( scale ) {
12212027Sjungma@eit.uni-kl.de	    double scale_fac = sc_dt::uint64_to_double(
12312027Sjungma@eit.uni-kl.de		time_params->default_time_unit );
12412027Sjungma@eit.uni-kl.de	    // linux bug workaround; don't change next two lines
12512027Sjungma@eit.uni-kl.de	    volatile double tmp = v * scale_fac + 0.5;
12612027Sjungma@eit.uni-kl.de	    m_value = SCAST<sc_dt::int64>( tmp );
12712027Sjungma@eit.uni-kl.de	} else {
12812027Sjungma@eit.uni-kl.de	    // linux bug workaround; don't change next two lines
12912027Sjungma@eit.uni-kl.de	    volatile double tmp = v + 0.5;
13012027Sjungma@eit.uni-kl.de	    m_value = SCAST<sc_dt::int64>( tmp );
13112027Sjungma@eit.uni-kl.de	}
13212027Sjungma@eit.uni-kl.de	time_params->time_resolution_fixed = true;
13312027Sjungma@eit.uni-kl.de    }
13412027Sjungma@eit.uni-kl.de}
13512027Sjungma@eit.uni-kl.de
13612027Sjungma@eit.uni-kl.desc_time::sc_time( value_type v, bool scale )
13712027Sjungma@eit.uni-kl.de: m_value( 0 )
13812027Sjungma@eit.uni-kl.de{
13912027Sjungma@eit.uni-kl.de    static bool warn_constructor=true;
14012027Sjungma@eit.uni-kl.de    if ( warn_constructor ) {
14112027Sjungma@eit.uni-kl.de        warn_constructor=false;
14212027Sjungma@eit.uni-kl.de        SC_REPORT_INFO(SC_ID_IEEE_1666_DEPRECATION_,
14312027Sjungma@eit.uni-kl.de            "deprecated constructor: sc_time(uint64,bool)");
14412027Sjungma@eit.uni-kl.de    }
14512027Sjungma@eit.uni-kl.de
14612027Sjungma@eit.uni-kl.de    if( v != 0 ) {
14712027Sjungma@eit.uni-kl.de	sc_time_params* time_params = sc_get_curr_simcontext()->m_time_params;
14812027Sjungma@eit.uni-kl.de	if( scale ) {
14912027Sjungma@eit.uni-kl.de	    double scale_fac = sc_dt::uint64_to_double(
15012027Sjungma@eit.uni-kl.de		time_params->default_time_unit );
15112027Sjungma@eit.uni-kl.de	    // linux bug workaround; don't change next two lines
15212027Sjungma@eit.uni-kl.de	    volatile double tmp = sc_dt::uint64_to_double( v ) *
15312027Sjungma@eit.uni-kl.de		                  scale_fac + 0.5;
15412027Sjungma@eit.uni-kl.de	    m_value = SCAST<sc_dt::int64>( tmp );
15512027Sjungma@eit.uni-kl.de	} else {
15612027Sjungma@eit.uni-kl.de	    m_value = v;
15712027Sjungma@eit.uni-kl.de	}
15812027Sjungma@eit.uni-kl.de	time_params->time_resolution_fixed = true;
15912027Sjungma@eit.uni-kl.de    }
16012027Sjungma@eit.uni-kl.de}
16112027Sjungma@eit.uni-kl.de
16212027Sjungma@eit.uni-kl.desc_time
16312027Sjungma@eit.uni-kl.desc_time::from_value( value_type v )
16412027Sjungma@eit.uni-kl.de{
16512027Sjungma@eit.uni-kl.de    sc_time t;
16612027Sjungma@eit.uni-kl.de    if( v != 0 && !(SC_MAXTIME_ALLOWED_ && v == ~sc_dt::UINT64_ZERO) ) {
16712027Sjungma@eit.uni-kl.de        sc_time_params* time_params = sc_get_curr_simcontext()->m_time_params;
16812027Sjungma@eit.uni-kl.de        time_params->time_resolution_fixed = true;
16912027Sjungma@eit.uni-kl.de    }
17012027Sjungma@eit.uni-kl.de    t.m_value = v;
17112027Sjungma@eit.uni-kl.de    return t;
17212027Sjungma@eit.uni-kl.de}
17312027Sjungma@eit.uni-kl.de
17412027Sjungma@eit.uni-kl.de
17512027Sjungma@eit.uni-kl.de// conversion functions
17612027Sjungma@eit.uni-kl.de
17712027Sjungma@eit.uni-kl.dedouble
17812027Sjungma@eit.uni-kl.desc_time::to_default_time_units() const
17912027Sjungma@eit.uni-kl.de{
18012027Sjungma@eit.uni-kl.de    sc_time_params* time_params = sc_get_curr_simcontext()->m_time_params;
18112027Sjungma@eit.uni-kl.de#   if SC_MAXTIME_ALLOWED_
18212027Sjungma@eit.uni-kl.de        if( m_value == 0 )
18312027Sjungma@eit.uni-kl.de            return 0.0;
18412027Sjungma@eit.uni-kl.de        time_params->time_resolution_fixed = true;
18512027Sjungma@eit.uni-kl.de#   endif // SC_MAXTIME_ALLOWED_
18612027Sjungma@eit.uni-kl.de    return ( sc_dt::uint64_to_double( m_value ) /
18712027Sjungma@eit.uni-kl.de	     sc_dt::uint64_to_double( time_params->default_time_unit ) );
18812027Sjungma@eit.uni-kl.de}
18912027Sjungma@eit.uni-kl.de
19012027Sjungma@eit.uni-kl.dedouble
19112027Sjungma@eit.uni-kl.desc_time::to_seconds() const
19212027Sjungma@eit.uni-kl.de{
19312027Sjungma@eit.uni-kl.de    sc_time_params* time_params = sc_get_curr_simcontext()->m_time_params;
19412027Sjungma@eit.uni-kl.de#   if SC_MAXTIME_ALLOWED_
19512027Sjungma@eit.uni-kl.de        if( m_value == 0 )
19612027Sjungma@eit.uni-kl.de            return 0.0;
19712027Sjungma@eit.uni-kl.de        time_params->time_resolution_fixed = true;
19812027Sjungma@eit.uni-kl.de#   endif // SC_MAXTIME_ALLOWED_
19912027Sjungma@eit.uni-kl.de    return ( sc_dt::uint64_to_double( m_value ) *
20012027Sjungma@eit.uni-kl.de	     time_params->time_resolution * 1e-15 );
20112027Sjungma@eit.uni-kl.de}
20212027Sjungma@eit.uni-kl.de
20312027Sjungma@eit.uni-kl.deconst std::string
20412027Sjungma@eit.uni-kl.desc_time::to_string() const
20512027Sjungma@eit.uni-kl.de{
20612027Sjungma@eit.uni-kl.de    value_type val = m_value;
20712027Sjungma@eit.uni-kl.de    if( val == 0 ) {
20812027Sjungma@eit.uni-kl.de	return std::string( "0 s" );
20912027Sjungma@eit.uni-kl.de    }
21012027Sjungma@eit.uni-kl.de    sc_time_params* time_params = sc_get_curr_simcontext()->m_time_params;
21112027Sjungma@eit.uni-kl.de#   if SC_MAXTIME_ALLOWED_
21212027Sjungma@eit.uni-kl.de        time_params->time_resolution_fixed = true;
21312027Sjungma@eit.uni-kl.de#   endif // SC_MAXTIME_ALLOWED_
21412027Sjungma@eit.uni-kl.de    value_type tr = SCAST<sc_dt::int64>( time_params->time_resolution );
21512027Sjungma@eit.uni-kl.de    int n = 0;
21612027Sjungma@eit.uni-kl.de    while( ( tr % 10 ) == 0 ) {
21712027Sjungma@eit.uni-kl.de	tr /= 10;
21812027Sjungma@eit.uni-kl.de	n ++;
21912027Sjungma@eit.uni-kl.de    }
22012027Sjungma@eit.uni-kl.de    assert( tr == 1 );
22112027Sjungma@eit.uni-kl.de    while( ( val % 10 ) == 0 ) {
22212027Sjungma@eit.uni-kl.de	val /= 10;
22312027Sjungma@eit.uni-kl.de	n ++;
22412027Sjungma@eit.uni-kl.de    }
22512027Sjungma@eit.uni-kl.de    char buf[BUFSIZ];
22612027Sjungma@eit.uni-kl.de    std::sprintf( buf, "%" PRIu64, val );
22712027Sjungma@eit.uni-kl.de    std::string result( buf );
22812027Sjungma@eit.uni-kl.de    if( n >= 15 ) {
22912027Sjungma@eit.uni-kl.de	for( int i = n - 15; i > 0; -- i ) {
23012027Sjungma@eit.uni-kl.de	    result += "0";
23112027Sjungma@eit.uni-kl.de	}
23212027Sjungma@eit.uni-kl.de	result += " s";
23312027Sjungma@eit.uni-kl.de    } else {
23412027Sjungma@eit.uni-kl.de	for( int i = n % 3; i > 0; -- i ) {
23512027Sjungma@eit.uni-kl.de	    result += "0";
23612027Sjungma@eit.uni-kl.de	}
23712027Sjungma@eit.uni-kl.de	result += " ";
23812027Sjungma@eit.uni-kl.de	result += time_units[n / 3];
23912027Sjungma@eit.uni-kl.de    }
24012027Sjungma@eit.uni-kl.de    return result;
24112027Sjungma@eit.uni-kl.de}
24212027Sjungma@eit.uni-kl.de
24312027Sjungma@eit.uni-kl.de
24412027Sjungma@eit.uni-kl.de// print function
24512027Sjungma@eit.uni-kl.de
24612027Sjungma@eit.uni-kl.devoid
24712027Sjungma@eit.uni-kl.desc_time::print( ::std::ostream& os ) const
24812027Sjungma@eit.uni-kl.de{
24912027Sjungma@eit.uni-kl.de    os << to_string();
25012027Sjungma@eit.uni-kl.de}
25112027Sjungma@eit.uni-kl.de
25212027Sjungma@eit.uni-kl.de
25312027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
25412027Sjungma@eit.uni-kl.de//  STRUCT : sc_time_params
25512027Sjungma@eit.uni-kl.de//
25612027Sjungma@eit.uni-kl.de//  Struct that holds the time resolution and default time unit.
25712027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
25812027Sjungma@eit.uni-kl.de
25912027Sjungma@eit.uni-kl.desc_time_params::sc_time_params()
26012027Sjungma@eit.uni-kl.de: time_resolution( 1000 ),		// default 1 ps
26112027Sjungma@eit.uni-kl.de  time_resolution_specified( false ),
26212027Sjungma@eit.uni-kl.de  time_resolution_fixed( false ),
26312027Sjungma@eit.uni-kl.de  default_time_unit( 1000 ),		// default 1 ns
26412027Sjungma@eit.uni-kl.de  default_time_unit_specified( false )
26512027Sjungma@eit.uni-kl.de{}
26612027Sjungma@eit.uni-kl.de
26712027Sjungma@eit.uni-kl.desc_time_params::~sc_time_params()
26812027Sjungma@eit.uni-kl.de{}
26912027Sjungma@eit.uni-kl.de
27012027Sjungma@eit.uni-kl.de
27112027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
27212027Sjungma@eit.uni-kl.de
27312027Sjungma@eit.uni-kl.de// functions for accessing the time resolution and default time unit
27412027Sjungma@eit.uni-kl.de
27512027Sjungma@eit.uni-kl.devoid
27612027Sjungma@eit.uni-kl.desc_set_time_resolution( double v, sc_time_unit tu )
27712027Sjungma@eit.uni-kl.de{
27812027Sjungma@eit.uni-kl.de    // first perform the necessary checks
27912027Sjungma@eit.uni-kl.de
28012027Sjungma@eit.uni-kl.de    // must be positive
28112027Sjungma@eit.uni-kl.de    if( v < 0.0 ) {
28212027Sjungma@eit.uni-kl.de	SC_REPORT_ERROR( SC_ID_SET_TIME_RESOLUTION_, "value not positive" );
28312027Sjungma@eit.uni-kl.de    }
28412027Sjungma@eit.uni-kl.de
28512027Sjungma@eit.uni-kl.de    // must be a power of ten
28612027Sjungma@eit.uni-kl.de    double dummy;
28712027Sjungma@eit.uni-kl.de#if defined( __HP_aCC ) || defined(__ppc__)
28812027Sjungma@eit.uni-kl.de    // aCC seems to have a bug in modf()
28912027Sjungma@eit.uni-kl.de    if( modf( log10( v < 1.0 ? 1.0/v : v ), &dummy ) != 0.0 ) {
29012027Sjungma@eit.uni-kl.de#else
29112027Sjungma@eit.uni-kl.de    if( modf( log10( v ), &dummy ) != 0.0 ) {
29212027Sjungma@eit.uni-kl.de#endif
29312027Sjungma@eit.uni-kl.de	SC_REPORT_ERROR( SC_ID_SET_TIME_RESOLUTION_,
29412027Sjungma@eit.uni-kl.de			 "value not a power of ten" );
29512027Sjungma@eit.uni-kl.de    }
29612027Sjungma@eit.uni-kl.de
29712027Sjungma@eit.uni-kl.de    sc_simcontext* simc = sc_get_curr_simcontext();
29812027Sjungma@eit.uni-kl.de
29912027Sjungma@eit.uni-kl.de    // can only be specified during elaboration
30012027Sjungma@eit.uni-kl.de    if( sc_is_running() ) {
30112027Sjungma@eit.uni-kl.de	SC_REPORT_ERROR( SC_ID_SET_TIME_RESOLUTION_, "simulation running" );
30212027Sjungma@eit.uni-kl.de    }
30312027Sjungma@eit.uni-kl.de
30412027Sjungma@eit.uni-kl.de    sc_time_params* time_params = simc->m_time_params;
30512027Sjungma@eit.uni-kl.de
30612027Sjungma@eit.uni-kl.de    // can be specified only once
30712027Sjungma@eit.uni-kl.de    if( time_params->time_resolution_specified ) {
30812027Sjungma@eit.uni-kl.de	SC_REPORT_ERROR( SC_ID_SET_TIME_RESOLUTION_, "already specified" );
30912027Sjungma@eit.uni-kl.de    }
31012027Sjungma@eit.uni-kl.de
31112027Sjungma@eit.uni-kl.de    // can only be specified before any sc_time is constructed
31212027Sjungma@eit.uni-kl.de    if( time_params->time_resolution_fixed ) {
31312027Sjungma@eit.uni-kl.de	SC_REPORT_ERROR( SC_ID_SET_TIME_RESOLUTION_,
31412027Sjungma@eit.uni-kl.de			 "sc_time object(s) constructed" );
31512027Sjungma@eit.uni-kl.de    }
31612027Sjungma@eit.uni-kl.de
31712027Sjungma@eit.uni-kl.de    // must be larger than or equal to 1 fs
31812027Sjungma@eit.uni-kl.de    volatile double resolution = v * time_values[tu];
31912027Sjungma@eit.uni-kl.de    if( resolution < 1.0 ) {
32012027Sjungma@eit.uni-kl.de	SC_REPORT_ERROR( SC_ID_SET_TIME_RESOLUTION_,
32112027Sjungma@eit.uni-kl.de			 "value smaller than 1 fs" );
32212027Sjungma@eit.uni-kl.de    }
32312027Sjungma@eit.uni-kl.de
32412027Sjungma@eit.uni-kl.de    // recalculate the default time unit
32512027Sjungma@eit.uni-kl.de    volatile double time_unit = sc_dt::uint64_to_double(
32612027Sjungma@eit.uni-kl.de	time_params->default_time_unit ) *
32712027Sjungma@eit.uni-kl.de	( time_params->time_resolution / resolution );
32812027Sjungma@eit.uni-kl.de    if( time_unit < 1.0 ) {
32912027Sjungma@eit.uni-kl.de	SC_REPORT_WARNING( SC_ID_DEFAULT_TIME_UNIT_CHANGED_, 0 );
33012027Sjungma@eit.uni-kl.de	time_params->default_time_unit = 1;
33112027Sjungma@eit.uni-kl.de    } else {
33212027Sjungma@eit.uni-kl.de	time_params->default_time_unit = SCAST<sc_dt::int64>( time_unit );
33312027Sjungma@eit.uni-kl.de    }
33412027Sjungma@eit.uni-kl.de
33512027Sjungma@eit.uni-kl.de    time_params->time_resolution = resolution;
33612027Sjungma@eit.uni-kl.de    time_params->time_resolution_specified = true;
33712027Sjungma@eit.uni-kl.de}
33812027Sjungma@eit.uni-kl.de
33912027Sjungma@eit.uni-kl.desc_time
34012027Sjungma@eit.uni-kl.desc_get_time_resolution()
34112027Sjungma@eit.uni-kl.de{
34212027Sjungma@eit.uni-kl.de    return sc_time::from_value( sc_dt::UINT64_ONE );
34312027Sjungma@eit.uni-kl.de}
34412027Sjungma@eit.uni-kl.de
34512027Sjungma@eit.uni-kl.de
34612027Sjungma@eit.uni-kl.devoid
34712027Sjungma@eit.uni-kl.desc_set_default_time_unit( double v, sc_time_unit tu )
34812027Sjungma@eit.uni-kl.de{
34912027Sjungma@eit.uni-kl.de    static bool warn_default_time_unit=true;
35012027Sjungma@eit.uni-kl.de    if ( warn_default_time_unit )
35112027Sjungma@eit.uni-kl.de    {
35212027Sjungma@eit.uni-kl.de        warn_default_time_unit=false;
35312027Sjungma@eit.uni-kl.de        SC_REPORT_INFO(SC_ID_IEEE_1666_DEPRECATION_,
35412027Sjungma@eit.uni-kl.de	    "deprecated function: sc_set_default_time_unit");
35512027Sjungma@eit.uni-kl.de    }
35612027Sjungma@eit.uni-kl.de
35712027Sjungma@eit.uni-kl.de    // first perform the necessary checks
35812027Sjungma@eit.uni-kl.de
35912027Sjungma@eit.uni-kl.de    // must be positive
36012027Sjungma@eit.uni-kl.de    if( v < 0.0 ) {
36112027Sjungma@eit.uni-kl.de	SC_REPORT_ERROR( SC_ID_SET_DEFAULT_TIME_UNIT_, "value not positive" );
36212027Sjungma@eit.uni-kl.de    }
36312027Sjungma@eit.uni-kl.de
36412027Sjungma@eit.uni-kl.de    // must be a power of ten
36512027Sjungma@eit.uni-kl.de    double dummy;
36612027Sjungma@eit.uni-kl.de    if( modf( log10( v ), &dummy ) != 0.0 ) {
36712027Sjungma@eit.uni-kl.de	SC_REPORT_ERROR( SC_ID_SET_DEFAULT_TIME_UNIT_,
36812027Sjungma@eit.uni-kl.de			 "value not a power of ten" );
36912027Sjungma@eit.uni-kl.de    }
37012027Sjungma@eit.uni-kl.de
37112027Sjungma@eit.uni-kl.de    sc_simcontext* simc = sc_get_curr_simcontext();
37212027Sjungma@eit.uni-kl.de
37312027Sjungma@eit.uni-kl.de    // can only be specified during elaboration
37412027Sjungma@eit.uni-kl.de    if( sc_is_running() ) {
37512027Sjungma@eit.uni-kl.de	SC_REPORT_ERROR( SC_ID_SET_DEFAULT_TIME_UNIT_, "simulation running" );
37612027Sjungma@eit.uni-kl.de    }
37712027Sjungma@eit.uni-kl.de
37812027Sjungma@eit.uni-kl.de    sc_time_params* time_params = simc->m_time_params;
37912027Sjungma@eit.uni-kl.de
38012027Sjungma@eit.uni-kl.de    // can only be specified before any sc_time is constructed
38112027Sjungma@eit.uni-kl.de    if( time_params->time_resolution_fixed ) {
38212027Sjungma@eit.uni-kl.de        SC_REPORT_ERROR( SC_ID_SET_DEFAULT_TIME_UNIT_,
38312027Sjungma@eit.uni-kl.de                         "sc_time object(s) constructed" );
38412027Sjungma@eit.uni-kl.de    }
38512027Sjungma@eit.uni-kl.de
38612027Sjungma@eit.uni-kl.de    // can be specified only once
38712027Sjungma@eit.uni-kl.de    if( time_params->default_time_unit_specified ) {
38812027Sjungma@eit.uni-kl.de	SC_REPORT_ERROR( SC_ID_SET_DEFAULT_TIME_UNIT_, "already specified" );
38912027Sjungma@eit.uni-kl.de    }
39012027Sjungma@eit.uni-kl.de
39112027Sjungma@eit.uni-kl.de    // must be larger than or equal to the time resolution
39212027Sjungma@eit.uni-kl.de    volatile double time_unit = ( v * time_values[tu] ) /
39312027Sjungma@eit.uni-kl.de	                        time_params->time_resolution;
39412027Sjungma@eit.uni-kl.de    if( time_unit < 1.0 ) {
39512027Sjungma@eit.uni-kl.de	SC_REPORT_ERROR( SC_ID_SET_DEFAULT_TIME_UNIT_,
39612027Sjungma@eit.uni-kl.de			 "value smaller than time resolution" );
39712027Sjungma@eit.uni-kl.de    }
39812027Sjungma@eit.uni-kl.de
39912027Sjungma@eit.uni-kl.de    time_params->default_time_unit = SCAST<sc_dt::int64>( time_unit );
40012027Sjungma@eit.uni-kl.de    time_params->default_time_unit_specified = true;
40112027Sjungma@eit.uni-kl.de}
40212027Sjungma@eit.uni-kl.de
40312027Sjungma@eit.uni-kl.desc_time
40412027Sjungma@eit.uni-kl.desc_get_default_time_unit()
40512027Sjungma@eit.uni-kl.de{
40612027Sjungma@eit.uni-kl.de    static bool warn_get_default_time_unit = true;
40712027Sjungma@eit.uni-kl.de    if ( warn_get_default_time_unit )
40812027Sjungma@eit.uni-kl.de    {
40912027Sjungma@eit.uni-kl.de        warn_get_default_time_unit=false;
41012027Sjungma@eit.uni-kl.de        SC_REPORT_INFO(SC_ID_IEEE_1666_DEPRECATION_,
41112027Sjungma@eit.uni-kl.de            "deprecated function: sc_get_default_time_unit");
41212027Sjungma@eit.uni-kl.de    }
41312027Sjungma@eit.uni-kl.de    return sc_time::from_value(
41412027Sjungma@eit.uni-kl.de              sc_get_curr_simcontext()->m_time_params->default_time_unit
41512027Sjungma@eit.uni-kl.de           );
41612027Sjungma@eit.uni-kl.de}
41712027Sjungma@eit.uni-kl.de
41812027Sjungma@eit.uni-kl.de
41912027Sjungma@eit.uni-kl.de// ----------------------------------------------------------------------------
42012027Sjungma@eit.uni-kl.de
42112027Sjungma@eit.uni-kl.deconst sc_time SC_ZERO_TIME;
42212027Sjungma@eit.uni-kl.de
42312027Sjungma@eit.uni-kl.de#undef SC_MAXTIME_ALLOWED_
42412027Sjungma@eit.uni-kl.de
42512027Sjungma@eit.uni-kl.de} // namespace sc_core
42612027Sjungma@eit.uni-kl.de
42712027Sjungma@eit.uni-kl.de// $Log: sc_time.cpp,v $
42812027Sjungma@eit.uni-kl.de// Revision 1.7  2011/08/26 20:46:11  acg
42912027Sjungma@eit.uni-kl.de//  Andy Goodrich: moved the modification log to the end of the file to
43012027Sjungma@eit.uni-kl.de//  eliminate source line number skew when check-ins are done.
43112027Sjungma@eit.uni-kl.de//
43212027Sjungma@eit.uni-kl.de// Revision 1.6  2011/07/24 16:08:36  acg
43312027Sjungma@eit.uni-kl.de//  Philipp A. Hartmann: fix C99 format specifiers for Solaris.
43412027Sjungma@eit.uni-kl.de//
43512027Sjungma@eit.uni-kl.de// Revision 1.5  2011/02/18 20:27:14  acg
43612027Sjungma@eit.uni-kl.de//  Andy Goodrich: Updated Copyrights.
43712027Sjungma@eit.uni-kl.de//
43812027Sjungma@eit.uni-kl.de// Revision 1.4  2011/02/13 21:47:38  acg
43912027Sjungma@eit.uni-kl.de//  Andy Goodrich: update copyright notice.
44012027Sjungma@eit.uni-kl.de//
44112027Sjungma@eit.uni-kl.de// Revision 1.3  2011/01/19 23:21:50  acg
44212027Sjungma@eit.uni-kl.de//  Andy Goodrich: changes for IEEE 1666 2011
44312027Sjungma@eit.uni-kl.de//
44412027Sjungma@eit.uni-kl.de// Revision 1.2  2008/05/22 17:06:27  acg
44512027Sjungma@eit.uni-kl.de//  Andy Goodrich: updated copyright notice to include 2008.
44612027Sjungma@eit.uni-kl.de//
44712027Sjungma@eit.uni-kl.de// Revision 1.1.1.1  2006/12/15 20:20:05  acg
44812027Sjungma@eit.uni-kl.de// SystemC 2.3
44912027Sjungma@eit.uni-kl.de//
45012027Sjungma@eit.uni-kl.de// Revision 1.6  2006/01/26 21:04:55  acg
45112027Sjungma@eit.uni-kl.de//  Andy Goodrich: deprecation message changes and additional messages.
45212027Sjungma@eit.uni-kl.de//
45312027Sjungma@eit.uni-kl.de// Revision 1.5  2006/01/25 00:31:19  acg
45412027Sjungma@eit.uni-kl.de//  Andy Goodrich: Changed over to use a standard message id of
45512027Sjungma@eit.uni-kl.de//  SC_ID_IEEE_1666_DEPRECATION for all deprecation messages.
45612027Sjungma@eit.uni-kl.de//
45712027Sjungma@eit.uni-kl.de// Revision 1.4  2006/01/24 20:49:05  acg
45812027Sjungma@eit.uni-kl.de// Andy Goodrich: changes to remove the use of deprecated features within the
45912027Sjungma@eit.uni-kl.de// simulator, and to issue warning messages when deprecated features are used.
46012027Sjungma@eit.uni-kl.de//
46112027Sjungma@eit.uni-kl.de// Revision 1.3  2006/01/13 18:44:30  acg
46212027Sjungma@eit.uni-kl.de// Added $Log to record CVS changes into the source.
46312027Sjungma@eit.uni-kl.de//
46412027Sjungma@eit.uni-kl.de
46512027Sjungma@eit.uni-kl.de// Taf!
466