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 
00048 
00049 
00050 
00051 
00052 
00053 
00054 
00055 
00056 
00057 #ifndef SC_WIF_TRACE_H
00058 #define SC_WIF_TRACE_H
00059 
00060 #include <cstdio>
00061 #include "sysc/datatypes/int/sc_nbdefs.h"
00062 #include "sysc/tracing/sc_trace_file_base.h"
00063 
00064 namespace sc_core {
00065 
00066 class wif_trace;  
00067 template<class T> class wif_T_trace;
00068 
00069 class wif_trace_file
00070   : public sc_trace_file_base
00071 {
00072 public:
00073     enum wif_enum {WIF_BIT=0, WIF_MVL=1, WIF_REAL=2, WIF_LAST};
00074 
00075     
00076     
00077     explicit wif_trace_file(const char *name);
00078 
00079     ~wif_trace_file();
00080 
00081 protected:
00082     
00083     
00084 
00085     
00086      void trace(const bool& object, const std::string& name);
00087 
00088     
00089      void trace(const sc_dt::sc_bit& object, const std::string& name);
00090 
00091     
00092      void trace(const sc_dt::sc_logic& object, const std::string& name);
00093     
00094     
00095      void trace(const unsigned char& object, const std::string& name, 
00096         int width);
00097 
00098     
00099      void trace(const unsigned short& object, const std::string& name, 
00100          int width);
00101 
00102     
00103      void trace(const unsigned int& object, const std::string& name, 
00104          int width);
00105 
00106     
00107      void trace(const unsigned long& object, const std::string& name, 
00108          int width);
00109 
00110     
00111      void trace(const char& object, const std::string& name, int width);
00112 
00113     
00114      void trace(const short& object, const std::string& name, int width);
00115 
00116     
00117      void trace(const int& object, const std::string& name, int width);
00118 
00119     
00120      void trace(const long& object, const std::string& name, int width);
00121     
00122     
00123      void trace(const sc_dt::int64& object, const std::string& name, 
00124          int width);
00125     
00126     
00127      void trace(const sc_dt::uint64& object, const std::string& name, 
00128          int width);
00129     
00130     
00131      void trace(const float& object, const std::string& name);
00132 
00133     
00134      void trace(const double& object, const std::string& name);
00135 
00136     
00137      void trace (const sc_dt::sc_unsigned& object, 
00138          const std::string& name);
00139 
00140     
00141      void trace (const sc_dt::sc_signed& object, 
00142          const std::string& name);
00143 
00144     
00145      void trace (const sc_dt::sc_uint_base& object, 
00146          const std::string& name);
00147 
00148     
00149      void trace (const sc_dt::sc_int_base& object, const std::string& name);
00150 
00151     
00152     void trace( const sc_dt::sc_fxval& object, const std::string& name );
00153 
00154     
00155     void trace( const sc_dt::sc_fxval_fast& object, 
00156         const std::string& name );
00157 
00158     
00159     void trace( const sc_dt::sc_fxnum& object, const std::string& name );
00160 
00161     
00162     void trace( const sc_dt::sc_fxnum_fast& object, 
00163         const std::string& name );
00164 
00165     template<class T>
00166     void traceT(const T& object, const std::string& name, wif_enum type)
00167     {
00168         if( add_trace_check(name) )
00169             traces.push_back( new wif_T_trace<T>( object, name
00170                                                 , obtain_name(),type ) );
00171     }
00172 
00173     
00174     virtual void trace( const sc_dt::sc_bv_base& object, 
00175         const std::string& name );
00176 
00177     
00178     virtual void trace( const sc_dt::sc_lv_base& object, 
00179         const std::string& name );
00180 
00181     
00182     
00183     
00184      void trace(const unsigned& object, const std::string& name, 
00185          const char** enum_literals);
00186 
00187     
00188      void write_comment(const std::string& comment);
00189 
00190     
00191      void cycle(bool delta_cycle);
00192 
00193 private:
00194 
00195 #if SC_TRACING_PHASE_CALLBACKS_
00196     
00197     virtual void trace( sc_trace_file* ) const { sc_assert(false); }
00198 #endif // SC_TRACING_PHASE_CALLBACKS_
00199 
00200     
00201     virtual void do_initialize();
00202 
00203     unsigned wif_name_index;           
00204 
00205     unsigned previous_time_units_low;  
00206     unsigned previous_time_units_high;
00207     double   previous_time;            
00208 
00209 public:
00210     
00211     std::string obtain_name();
00212 
00213     
00214     std::vector<wif_trace*> traces;
00215 };
00216 
00217 } 
00218 
00219 #endif // SC_WIF_TRACE_H
00220