📄 sc_vcd_trace.cpp
字号:
rawdata[bitindex] = '\0'; compose_data_line(rawdata, compdata); std::fputs(compdata, f); old_value = object;}/*****************************************************************************/class vcd_signed_int_trace : public vcd_trace {public: vcd_signed_int_trace(const int& object, const std::string& name_, const std::string& vcd_name_, int width_); void write(FILE* f); bool changed();protected: const int& object; int old_value; unsigned mask; };vcd_signed_int_trace::vcd_signed_int_trace(const signed& object_, const std::string& name_, const std::string& vcd_name_, int width_): vcd_trace(name_, vcd_name_), object(object_){ bit_width = width_; if (bit_width < 32) { mask = ~(-1 << bit_width); } else { mask = 0xffffffff; } vcd_var_typ_name = "wire"; old_value = object;}bool vcd_signed_int_trace::changed(){ return object != old_value;}void vcd_signed_int_trace::write(FILE* f){ char rawdata[1000]; char compdata[1000]; int bitindex; // Check for overflow if (((unsigned) object & mask) != (unsigned) object) { for (bitindex = 0; bitindex < bit_width; bitindex++){ rawdata[bitindex] = 'x'; } } else{ unsigned bit_mask = 1 << (bit_width-1); for (bitindex = 0; bitindex < bit_width; bitindex++) { rawdata[bitindex] = (object & bit_mask)? '1' : '0'; bit_mask = bit_mask >> 1; } } rawdata[bitindex] = '\0'; compose_data_line(rawdata, compdata); std::fputs(compdata, f); old_value = object;}/*****************************************************************************/class vcd_signed_short_trace : public vcd_trace {public: vcd_signed_short_trace(const short& object, const std::string& name_, const std::string& vcd_name_, int width_); void write(FILE* f); bool changed();protected: const short& object; short old_value; unsigned short mask; };vcd_signed_short_trace::vcd_signed_short_trace( const short& object_, const std::string& name_, const std::string& vcd_name_, int width_): vcd_trace(name_, vcd_name_), object(object_){ bit_width = width_; if (bit_width < 16) { mask = ~(-1 << bit_width); } else { mask = 0xffff; } vcd_var_typ_name = "wire"; old_value = object;}bool vcd_signed_short_trace::changed(){ return object != old_value;}void vcd_signed_short_trace::write(FILE* f){ char rawdata[1000]; char compdata[1000]; int bitindex; // Check for overflow if (((unsigned short) object & mask) != (unsigned short) object) { for (bitindex = 0; bitindex < bit_width; bitindex++){ rawdata[bitindex] = 'x'; } } else{ unsigned bit_mask = 1 << (bit_width-1); for (bitindex = 0; bitindex < bit_width; bitindex++) { rawdata[bitindex] = (object & bit_mask)? '1' : '0'; bit_mask = bit_mask >> 1; } } rawdata[bitindex] = '\0'; compose_data_line(rawdata, compdata); std::fputs(compdata, f); old_value = object;}/*****************************************************************************/class vcd_signed_char_trace : public vcd_trace {public: vcd_signed_char_trace(const char& object, const std::string& name_, const std::string& vcd_name_, int width_); void write(FILE* f); bool changed();protected: const char& object; char old_value; unsigned char mask; };vcd_signed_char_trace::vcd_signed_char_trace(const char& object_, const std::string& name_, const std::string& vcd_name_, int width_): vcd_trace(name_, vcd_name_), object(object_){ bit_width = width_; if (bit_width < 8) { mask = ~(-1 << bit_width); } else { mask = 0xff; } vcd_var_typ_name = "wire"; old_value = object;}bool vcd_signed_char_trace::changed(){ return object != old_value;}void vcd_signed_char_trace::write(FILE* f){ char rawdata[1000]; char compdata[1000]; int bitindex; // Check for overflow if (((unsigned char) object & mask) != (unsigned char) object) { for (bitindex = 0; bitindex < bit_width; bitindex++){ rawdata[bitindex] = 'x'; } } else{ unsigned bit_mask = 1 << (bit_width-1); for (bitindex = 0; bitindex < bit_width; bitindex++) { rawdata[bitindex] = (object & bit_mask)? '1' : '0'; bit_mask = bit_mask >> 1; } } rawdata[bitindex] = '\0'; compose_data_line(rawdata, compdata); std::fputs(compdata, f); old_value = object;}/*****************************************************************************/class vcd_int64_trace : public vcd_trace {public: vcd_int64_trace(const sc_dt::int64& object, const std::string& name_, const std::string& vcd_name_, int width_); void write(FILE* f); bool changed();protected: const sc_dt::int64& object; sc_dt::int64 old_value; sc_dt::uint64 mask; };vcd_int64_trace::vcd_int64_trace(const sc_dt::int64& object_, const std::string& name_, const std::string& vcd_name_, int width_): vcd_trace(name_, vcd_name_), object(object_){ bit_width = width_; mask = (sc_dt::uint64)-1; if (bit_width < 64) mask = ~(mask << bit_width); vcd_var_typ_name = "wire"; old_value = object;}bool vcd_int64_trace::changed(){ return object != old_value;}void vcd_int64_trace::write(FILE* f){ char rawdata[1000]; char compdata[1000]; int bitindex; // Check for overflow if (((sc_dt::uint64) object & mask) != (sc_dt::uint64) object) { for (bitindex = 0; bitindex < bit_width; bitindex++) { rawdata[bitindex] = 'x'; } } else { sc_dt::uint64 bit_mask = 1; bit_mask = bit_mask << (bit_width-1); for (bitindex = 0; bitindex < bit_width; bitindex++) { rawdata[bitindex] = (object & bit_mask)? '1' : '0'; bit_mask = bit_mask >> 1; } } rawdata[bitindex] = '\0'; compose_data_line(rawdata, compdata); std::fputs(compdata, f); old_value = object;}/*****************************************************************************/class vcd_uint64_trace : public vcd_trace {public: vcd_uint64_trace(const sc_dt::uint64& object, const std::string& name_, const std::string& vcd_name_, int width_); void write(FILE* f); bool changed();protected: const sc_dt::uint64& object; sc_dt::uint64 old_value; sc_dt::uint64 mask; };vcd_uint64_trace::vcd_uint64_trace( const sc_dt::uint64& object_, const std::string& name_, const std::string& vcd_name_, int width_): vcd_trace(name_, vcd_name_), object(object_){ bit_width = width_; mask = (sc_dt::uint64)-1; if ( bit_width < 64 ) mask = ~(mask << bit_width); vcd_var_typ_name = "wire"; old_value = object;}bool vcd_uint64_trace::changed(){ return object != old_value;}void vcd_uint64_trace::write(FILE* f){ char rawdata[1000]; char compdata[1000]; int bitindex; // Check for overflow if ((object & mask) != object) { for (bitindex = 0; bitindex < bit_width; bitindex++){ rawdata[bitindex] = 'x'; } } else { sc_dt::uint64 bit_mask = 1; bit_mask = bit_mask << (bit_width-1); for (bitindex = 0; bitindex < bit_width; bitindex++) { rawdata[bitindex] = (object & bit_mask)? '1' : '0'; bit_mask = bit_mask >> 1; } } rawdata[bitindex] = '\0'; compose_data_line(rawdata, compdata); std::fputs(compdata, f); old_value = object;}/*****************************************************************************/class vcd_signed_long_trace : public vcd_trace {public: vcd_signed_long_trace(const long& object, const std::string& name_, const std::string& vcd_name_, int width_); void write(FILE* f); bool changed();protected: const long& object; long old_value; unsigned long mask; };vcd_signed_long_trace::vcd_signed_long_trace(const long& object_, const std::string& name_, const std::string& vcd_name_, int width_): vcd_trace(name_, vcd_name_), object(object_){ bit_width = width_; if (bit_width < 32) { mask = ~(-1 << bit_width); } else { mask = 0xffffffff; } vcd_var_typ_name = "wire"; old_value = object;}bool vcd_signed_long_trace::changed(){ return object != old_value;}void vcd_signed_long_trace::write(FILE* f){ char rawdata[1000]; char compdata[1000]; int bitindex; // Check for overflow if (((unsigned long) object & mask) != (unsigned long) object) { for (bitindex = 0; bitindex < bit_width; bitindex++){ rawdata[bitindex] = 'x'; } } else{ unsigned bit_mask = 1 << (bit_width-1); for (bitindex = 0; bitindex < bit_width; bitindex++) { rawdata[bitindex] = (object & bit_mask)? '1' : '0'; bit_mask = bit_mask >> 1; } } rawdata[bitindex] = '\0'; compose_data_line(rawdata, compdata); std::fputs(compdata, f); old_value = object;}/*****************************************************************************/class vcd_float_trace : public vcd_trace {public: vcd_float_trace(const float& object, const std::string& name_, const std::string& vcd_name_); void write(FILE* f); bool changed();protected: const float& object; float old_value;};vcd_float_trace::vcd_float_trace(const float& object_, const std::string& name_, const std::string& vcd_name_): vcd_trace(name_, vcd_name_), object(object_){ vcd_var_typ_name = "real"; bit_width = 1; old_value = object;}bool vcd_float_trace::changed(){ return object != old_value;}void vcd_float_trace::write(FILE* f){ std::fprintf(f, "r%.16g %s", object, vcd_name.c_str()); old_value = object;}/*****************************************************************************/class vcd_double_trace : public vcd_trace {public: vcd_double_trace(const double& object, const std::string& name_, const std::string& vcd_name_); void write(FILE* f); bool changed();protected: const double& object; double old_value;};vcd_double_trace::vcd_double_trace(const double& object_, const std::string& name_, const std::string& vcd_name_): vcd_trace(name_, vcd_name_), object(object_){ vcd_var_typ_name = "real"; bit_width = 1; old_value = object;}bool vcd_double_trace::changed(){ return object != old_value;}void vcd_double_trace::write(FILE* f){ std::fprintf(f, "r%.16g %s", object, vcd_name.c_str()); old_value = object;}/*****************************************************************************/class vcd_enum_trace : public vcd_trace {public: vcd_enum_trace(const unsigned& object_, const std::string& name_, const std::string& vcd_name_, const char** enum_literals); void write(FILE* f); bool changed();protected: const unsigned& object; unsigned old_value; unsigned mask; const char** literals; unsigned nliterals;};vcd_enum_trace::vcd_enum_trace(const unsigned& object_, const std::string& name_, const std::string& vcd_name_, const char** enum_literals_): vcd_trace(name_, vcd_name_), object(object_), literals(enum_literals_){ // find number of bits required to represent enumeration literal - counting loop for (nliterals = 0; enum_literals_[nliterals]; nliterals++); // Figure out number of bits required to represent the number of literals bit_width = 0; unsigned shifted_maxindex = nliterals-1; while(shifted_maxindex != 0){ shifted_maxindex >>= 1; bit_width++; } // Set the mask if (bit_width < 32) { mask = ~(-1 << bit_width); } else { mask = 0xffffffff; } vcd_var_typ_name = "wire"; old_value = object;} bool vcd_enum_trace::changed(){ return object != old_value;}void vcd_enum_trace::write(FILE* f){ char rawdata[1000]; char compdata[1000]; int bitindex; // Check for overflow if ((object & mask) != object) { for (bitindex = 0; bitindex < bit_width; bitindex++){ rawdata[bitindex] = 'x'; } } else { unsigned bit_mask = 1 << (bit_width-1); for (bitindex = 0; bitindex < bit_width; bitindex++) { rawdata[bitindex] = (object & bit_mask)? '1' : '0'; bit_mask = bit_mask >> 1; } } rawdata[bitindex] = '\0'; compose_data_line(rawdata, compdata); std::fputs(compdata, f); old_value = object;}/***************************************************************************** vcd_trace_file functions *****************************************************************************/vcd_trace_file::vcd_trace_file(const char *name)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -