1/***************************************************************************** 2 3 Licensed to Accellera Systems Initiative Inc. (Accellera) under one or 4 more contributor license agreements. See the NOTICE file distributed 5 with this work for additional information regarding copyright ownership. 6 Accellera licenses this file to you under the Apache License, Version 2.0 7 (the "License"); you may not use this file except in compliance with the 8 License. You may obtain a copy of the License at 9 10 http://www.apache.org/licenses/LICENSE-2.0 11 12 Unless required by applicable law or agreed to in writing, software 13 distributed under the License is distributed on an "AS IS" BASIS, 14 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 15 implied. See the License for the specific language governing 16 permissions and limitations under the License. 17 18 *****************************************************************************/ 19 20/***************************************************************************** 21 22 sc_trace.cpp - Functions for tracing signals and variables. 23 24 Original Author: Abhijit Ghosh, Synopsys, Inc. 25 26 *****************************************************************************/ 27 28/***************************************************************************** 29 30 MODIFICATION LOG - modifiers, enter your name, affiliation, date and 31 changes you are making here. 32 33 Name, Affiliation, Date: 34 Description of Modification: 35 36 *****************************************************************************/ 37 38/***************************************************************************** 39 40 Acknowledgement: The tracing mechanism is based on the tracing 41 mechanism developed at Infineon (formerly Siemens HL). Though this 42 code is somewhat different, the basics are identical to what was 43 originally contributed by Infineon. The contribution of Infineon 44 in the development of this tracing technology is hereby 45 acknowledged. 46 47 *****************************************************************************/ 48 49#include <stdarg.h> 50#include <stdio.h> 51 52#include "sysc/tracing/sc_trace.h" 53#include "sysc/tracing/sc_tracing_ids.h" 54#include "sysc/communication/sc_signal_ifs.h" 55#include "sysc/utils/sc_report.h" 56#include "sysc/utils/sc_utils_ids.h" 57 58namespace sc_core { 59 60// Trace file common functions. 61 62sc_trace_file::sc_trace_file() 63{ 64 /* Intentionally blank */ 65} 66 67void tprintf(sc_trace_file* tf, const char* format, ...) 68{ 69 static char buffer[4096]; 70 va_list ap; 71 va_start(ap, format); 72 (void) vsprintf(buffer, format, ap); 73 va_end(ap); 74 if (tf) tf->write_comment(buffer); 75} 76 77void sc_trace_file::space(int) 78{ 79 /* Intentionally blank */ 80} 81 82void sc_trace_file::delta_cycles(bool) 83{ 84 /* Intentionally blank */ 85} 86 87 88void 89sc_trace( sc_trace_file* tf, 90 const sc_signal_in_if<char>& object, 91 const std::string& name, 92 int width ) 93{ 94 if( tf ) { 95 tf->trace( object.read(), name, width ); 96 } 97} 98 99void 100sc_trace( sc_trace_file* tf, 101 const sc_signal_in_if<short>& object, 102 const std::string& name, 103 int width ) 104{ 105 if( tf ) { 106 tf->trace( object.read(), name, width ); 107 } 108} 109 110void 111sc_trace( sc_trace_file* tf, 112 const sc_signal_in_if<int>& object, 113 const std::string& name, 114 int width ) 115{ 116 if( tf ) { 117 tf->trace( object.read(), name, width ); 118 } 119} 120 121void 122sc_trace( sc_trace_file* tf, 123 const sc_signal_in_if<long>& object, 124 const std::string& name, 125 int width ) 126{ 127 if( tf ) { 128 tf->trace( object.read(), name, width ); 129 } 130} 131 132 133void 134sc_trace(sc_trace_file* /* not used */, 135 const void* /* not used */, 136 const std::string& name) 137{ 138 SC_REPORT_WARNING( SC_ID_TRACING_OBJECT_IGNORED_, name.c_str() ); 139} 140 141 142 143void double_to_special_int64(double in, unsigned* high, unsigned* low) 144{ 145 double invar = in; 146 if(invar > 5e17) invar = 5e17; // Saturation limit 147 if(invar < 0.0) invar = 0.0; 148 invar += .5; 149 *high = (unsigned)(invar / 1e9); 150 double rest = invar - 1e9 * (*high); 151 if(rest < 0) *low = 0; 152 else *low = (unsigned)rest; 153} 154 155 156// ---------------------------------------------------------------------------- 157 158#define DEFN_TRACE_FUNC_REF_A(tp) \ 159void \ 160sc_trace( sc_trace_file* tf, const tp& object, const std::string& name ) \ 161{ \ 162 if( tf ) { \ 163 tf->trace( object, name ); \ 164 } \ 165} 166 167#define DEFN_TRACE_FUNC_PTR_A(tp) \ 168void \ 169sc_trace( sc_trace_file* tf, const tp* object, const std::string& name ) \ 170{ \ 171 if( tf ) { \ 172 tf->trace( *object, name ); \ 173 } \ 174} 175 176#define DEFN_TRACE_FUNC_A(tp) \ 177DEFN_TRACE_FUNC_REF_A(tp) \ 178DEFN_TRACE_FUNC_PTR_A(tp) 179 180 181DEFN_TRACE_FUNC_A( sc_dt::sc_bit ) 182DEFN_TRACE_FUNC_A( sc_dt::sc_logic ) 183 184DEFN_TRACE_FUNC_A( sc_dt::sc_int_base ) 185DEFN_TRACE_FUNC_A( sc_dt::sc_uint_base ) 186DEFN_TRACE_FUNC_A( sc_dt::sc_signed ) 187DEFN_TRACE_FUNC_A( sc_dt::sc_unsigned ) 188 189DEFN_TRACE_FUNC_REF_A( sc_dt::sc_bv_base ) 190DEFN_TRACE_FUNC_REF_A( sc_dt::sc_lv_base ) 191 192 193#undef DEFN_TRACE_FUNC_REF_A 194#undef DEFN_TRACE_FUNC_PTR_A 195#undef DEFN_TRACE_FUNC_A 196 197 198void 199sc_trace( sc_trace_file* tf, 200 const unsigned int& object, 201 const std::string& name, 202 const char** enum_literals ) 203{ 204 static bool warn_sc_trace_literals=true; 205 if ( warn_sc_trace_literals ) 206 { 207 warn_sc_trace_literals=false; 208 SC_REPORT_INFO(SC_ID_IEEE_1666_DEPRECATION_, 209 "tracing of enumerated literals is deprecated" ); 210 } 211 212 if( tf ) tf->trace( object, name, enum_literals ); 213} 214 215} // namespace sc_core 216 217// Taf! 218