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