00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047 #ifndef SC_VCD_TRACE_H
00048 #define SC_VCD_TRACE_H
00049
00050
00051 #include <cstdio>
00052 #include "sysc/tracing/sc_trace.h"
00053
00054 namespace sc_core {
00055
00056 class vcd_trace;
00057 template<class T> class vcd_T_trace;
00058
00059
00060
00061
00062
00063
00064
00065
00066 class vcd_trace_file
00067 : public sc_trace_file
00068 {
00069 public:
00070
00071 enum vcd_enum {VCD_WIRE=0, VCD_REAL=1, VCD_LAST};
00072
00073 inline void sc_set_vcd_time_unit(int exponent10_seconds)
00074 { set_time_unit(exponent10_seconds); }
00075
00076
00077
00078 vcd_trace_file(const char *name);
00079
00080
00081 ~vcd_trace_file();
00082
00083 protected:
00084
00085
00086
00087
00088
00089 void trace(const bool& object, const std::string& name);
00090
00091
00092 virtual void trace( const sc_dt::sc_bit& object,
00093 const std::string& name);
00094
00095
00096 void trace(const sc_dt::sc_logic& object, const std::string& name);
00097
00098
00099 void trace(const unsigned char& object, const std::string& name,
00100 int width);
00101
00102
00103 void trace(const unsigned short& object, const std::string& name,
00104 int width);
00105
00106
00107 void trace(const unsigned int& object, const std::string& name,
00108 int width);
00109
00110
00111 void trace(const unsigned long& object, const std::string& name,
00112 int width);
00113
00114
00115 void trace(const char& object, const std::string& name, int width);
00116
00117
00118 void trace(const short& object, const std::string& name, int width);
00119
00120
00121 void trace(const int& object, const std::string& name, int width);
00122
00123
00124 void trace(const long& object, const std::string& name, int width);
00125
00126
00127 void trace(const sc_dt::int64& object, const std::string& name,
00128 int width);
00129
00130
00131 void trace(const sc_dt::uint64& object, const std::string& name,
00132 int width);
00133
00134
00135 void trace(const float& object, const std::string& name);
00136
00137
00138 void trace(const double& object, const std::string& name);
00139
00140
00141 void trace (const sc_dt::sc_uint_base& object,
00142 const std::string& name);
00143
00144
00145 void trace (const sc_dt::sc_int_base& object,
00146 const std::string& name);
00147
00148
00149 void trace (const sc_dt::sc_unsigned& object,
00150 const std::string& name);
00151
00152
00153 void trace (const sc_dt::sc_signed& object, const std::string& name);
00154
00155
00156 void trace( const sc_dt::sc_fxval& object, const std::string& name );
00157
00158
00159 void trace( const sc_dt::sc_fxval_fast& object,
00160 const std::string& name );
00161
00162
00163 void trace( const sc_dt::sc_fxnum& object, const std::string& name );
00164
00165
00166 void trace( const sc_dt::sc_fxnum_fast& object,
00167 const std::string& name );
00168
00169 template<class T>
00170 void traceT(const T& object, const std::string& name,
00171 vcd_enum type=VCD_WIRE)
00172 {
00173 if(initialized)
00174 put_error_message("No traces can be added once simulation has"
00175 " started.\nTo add traces, create a new vcd trace file.", false);
00176 else
00177 traces.push_back(new vcd_T_trace<T>(object, name, obtain_name(),type));
00178 }
00179
00180
00181 virtual void trace(const sc_dt::sc_bv_base& object,
00182 const std::string& name);
00183
00184
00185 virtual void trace(const sc_dt::sc_lv_base& object,
00186 const std::string& name);
00187
00188
00189
00190 void trace(const unsigned& object, const std::string& name,
00191 const char** enum_literals);
00192
00193
00194 void write_comment(const std::string& comment);
00195
00196
00197 void delta_cycles(bool flag);
00198
00199
00200 void cycle(bool delta_cycle);
00201
00202 private:
00203
00204
00205 void initialize();
00206
00207 void create_vcd_name(std::string* p_destination);
00208
00209
00210 FILE* fp;
00211
00212 bool trace_delta_cycles;
00213
00214 unsigned vcd_name_index;
00215
00216 unsigned previous_time_units_low, previous_time_units_high;
00217
00218 public:
00219
00220
00221 std::vector<vcd_trace*> traces;
00222
00223 std::string obtain_name();
00224 };
00225
00226
00227
00228
00229
00230 extern sc_trace_file *sc_create_vcd_trace_file(const char* name);
00231 extern void sc_close_vcd_trace_file( sc_trace_file* tf );
00232
00233 }
00234 #endif