sc_wif_trace.cpp
来自「基于4个mips核的noc设计」· C++ 代码 · 共 1,863 行 · 第 1/4 页
CPP
1,863 行
}bool wif_unsigned_long_trace::changed(){ return object != old_value;}void wif_unsigned_long_trace::write(FILE* f){ char buf[1000]; int bitindex; // Check for overflow if ((object & mask) != object) { for (bitindex = 0; bitindex < bit_width; bitindex++){ buf[bitindex]='0'; } } else{ unsigned bit_mask = 1 << (bit_width-1); for (bitindex = 0; bitindex < bit_width; bitindex++) { buf[bitindex] = (object & bit_mask)? '1' : '0'; bit_mask = bit_mask >> 1; } } buf[bitindex] = '\0'; fprintf(f, "assign %s \"%s\" ;\n", (const char *) wif_name, buf); old_value = object;}/*****************************************************************************/class wif_signed_int_trace: public wif_trace {public: wif_signed_int_trace(const int& object_, const sc_string& name_, const sc_string& wif_name_, int width_); void write(FILE* f); bool changed();protected: const int& object; int old_value; unsigned mask; };wif_signed_int_trace::wif_signed_int_trace(const signed& object_, const sc_string& name_, const sc_string& wif_name_, int width_) : wif_trace(name_, wif_name_), object(object_){ bit_width = width_; if (bit_width < 32) { mask = ~(-1 << bit_width); } else { mask = 0xffffffff; } old_value = object; wif_type = "BIT";}bool wif_signed_int_trace::changed(){ return object != old_value;}void wif_signed_int_trace::write(FILE* f){ char buf[1000]; int bitindex; // Check for overflow if (((unsigned) object & mask) != (unsigned) object) { for (bitindex = 0; bitindex < bit_width; bitindex++){ buf[bitindex]='0'; } } else{ unsigned bit_mask = 1 << (bit_width-1); for (bitindex = 0; bitindex < bit_width; bitindex++) { buf[bitindex] = (object & bit_mask)? '1' : '0'; bit_mask = bit_mask >> 1; } } buf[bitindex] = '\0'; fprintf(f, "assign %s \"%s\" ;\n", (const char *) wif_name, buf); old_value = object;}/*****************************************************************************/class wif_signed_short_trace: public wif_trace {public: wif_signed_short_trace(const short& object_, const sc_string& name_, const sc_string& wif_name_, int width_); void write(FILE* f); bool changed();protected: const short& object; short old_value; unsigned short mask; };wif_signed_short_trace::wif_signed_short_trace(const short& object_, const sc_string& name_, const sc_string& wif_name_, int width_) : wif_trace(name_, wif_name_), object(object_){ bit_width = width_; if (bit_width < 16) { mask = ~(-1 << bit_width); } else { mask = 0xffff; } old_value = object; wif_type = "BIT";}bool wif_signed_short_trace::changed(){ return object != old_value;}void wif_signed_short_trace::write(FILE* f){ char buf[1000]; int bitindex; // Check for overflow if (((unsigned short) object & mask) != (unsigned short) object) { for (bitindex = 0; bitindex < bit_width; bitindex++){ buf[bitindex]='0'; } } else{ unsigned bit_mask = 1 << (bit_width-1); for (bitindex = 0; bitindex < bit_width; bitindex++) { buf[bitindex] = (object & bit_mask)? '1' : '0'; bit_mask = bit_mask >> 1; } } buf[bitindex] = '\0'; fprintf(f, "assign %s \"%s\" ;\n", (const char *) wif_name, buf); old_value = object;}/*****************************************************************************/class wif_signed_char_trace: public wif_trace {public: wif_signed_char_trace(const char& object_, const sc_string& name_, const sc_string& wif_name_, int width_); void write(FILE* f); bool changed();protected: const char& object; char old_value; unsigned char mask; };wif_signed_char_trace::wif_signed_char_trace(const char& object_, const sc_string& name_, const sc_string& wif_name_, int width_) : wif_trace(name_, wif_name_), object(object_){ bit_width = width_; if (bit_width < 8) { mask = ~(-1 << bit_width); } else { mask = 0xff; } old_value = object; wif_type = "BIT";}bool wif_signed_char_trace::changed(){ return object != old_value;}void wif_signed_char_trace::write(FILE* f){ char buf[1000]; int bitindex; // Check for overflow if (((unsigned char) object & mask) != (unsigned char) object) { for (bitindex = 0; bitindex < bit_width; bitindex++){ buf[bitindex]='0'; } } else{ unsigned bit_mask = 1 << (bit_width-1); for (bitindex = 0; bitindex < bit_width; bitindex++) { buf[bitindex] = (object & bit_mask)? '1' : '0'; bit_mask = bit_mask >> 1; } } buf[bitindex] = '\0'; fprintf(f, "assign %s \"%s\" ;\n", (const char *) wif_name, buf); old_value = object;}/*****************************************************************************/class wif_signed_long_trace: public wif_trace {public: wif_signed_long_trace(const long& object_, const sc_string& name_, const sc_string& wif_name_, int width_); void write(FILE* f); bool changed();protected: const long& object; long old_value; unsigned long mask; };wif_signed_long_trace::wif_signed_long_trace(const long& object_, const sc_string& name_, const sc_string& wif_name_, int width_) : wif_trace(name_, wif_name_), object(object_){ bit_width = width_; if (bit_width < 32) { mask = ~(-1 << bit_width); } else { mask = 0xffffffff; } old_value = object; wif_type = "BIT";}bool wif_signed_long_trace::changed(){ return object != old_value;}void wif_signed_long_trace::write(FILE* f){ char buf[1000]; int bitindex; // Check for overflow if (((unsigned long) object & mask) != (unsigned long) object) { for (bitindex = 0; bitindex < bit_width; bitindex++){ buf[bitindex]='0'; } } else { unsigned bit_mask = 1 << (bit_width-1); for (bitindex = 0; bitindex < bit_width; bitindex++) { buf[bitindex] = (object & bit_mask)? '1' : '0'; bit_mask = bit_mask >> 1; } } buf[bitindex] = '\0'; fprintf(f, "assign %s \"%s\" ;\n", (const char *) wif_name, buf); old_value = object;}/*****************************************************************************/class wif_float_trace: public wif_trace {public: wif_float_trace(const float& object_, const sc_string& name_, const sc_string& wif_name_); void write(FILE* f); bool changed();protected: const float& object; float old_value;};wif_float_trace::wif_float_trace(const float& object_, const sc_string& name_, const sc_string& wif_name_): wif_trace(name_, wif_name_), object(object_){ bit_width = 0; old_value = object; wif_type = "real";}bool wif_float_trace::changed(){ return object != old_value;}void wif_float_trace::write(FILE* f){ fprintf(f,"assign %s %f ; \n", (const char *) wif_name, object); old_value = object;}/*****************************************************************************/class wif_double_trace: public wif_trace {public: wif_double_trace(const double& object_, const sc_string& name_, const sc_string& wif_name_); void write(FILE* f); bool changed();protected: const double& object; double old_value;};wif_double_trace::wif_double_trace(const double& object_, const sc_string& name_, const sc_string& wif_name_): wif_trace(name_, wif_name_), object(object_){ bit_width = 0; old_value = object; wif_type = "real";}bool wif_double_trace::changed(){ return object != old_value;}void wif_double_trace::write(FILE* f){ fprintf(f,"assign %s %f ; \n", (const char *) wif_name, object); old_value = object;}/*****************************************************************************/class wif_enum_trace : public wif_trace {public: wif_enum_trace(const unsigned& object_, const sc_string& name_, const sc_string& wif_name_, const char** enum_literals); void write(FILE* f); bool changed(); // Hides the definition of the same (virtual) function in wif_trace void print_variable_declaration_line(FILE* f);protected: const unsigned& object; unsigned old_value; const char** literals; unsigned nliterals; sc_string type_name; ~wif_enum_trace();};wif_enum_trace::wif_enum_trace(const unsigned& object_, const sc_string& name_, const sc_string& wif_name_, const char** enum_literals_) : wif_trace(name_, wif_name_), object(object_), literals(enum_literals_){ // find number of enumeration literals - counting loop for (nliterals = 0; enum_literals_[nliterals]; nliterals++); bit_width = 0; old_value = object; type_name = name_ + "__type__"; wif_type = (const char *) type_name;} void wif_enum_trace::print_variable_declaration_line(FILE* f){ fprintf(f, "type scalar \"%s\" enum ", wif_type); for (unsigned i = 0; i < nliterals; i++) fprintf(f, "\"%s\", ", literals[i]); fprintf(f, "\"SC_WIF_UNDEF\" ;\n"); fprintf(f, "declare %s \"%s\" \"%s\" ", (const char *) wif_name, (const char *) name, wif_type); fprintf(f, "variable ;\n"); fprintf(f, "start_trace %s ;\n", (const char *) wif_name);}bool wif_enum_trace::changed(){ return object != old_value;}void wif_enum_trace::write(FILE* f){ char buf[2000]; static bool warning_issued = false; if (object >= nliterals) { // Note unsigned value is always greater than 0 if (!warning_issued) { sprintf(buf, "Tracing error: Value of enumerated type undefined"); wif_put_error_message(buf, false); warning_issued = true; } fprintf(f, "assign %s \"%s\" ;\n", (const char *) wif_name, "SC_WIF_UNDEF"); } else fprintf(f, "assign %s \"%s\" ;\n", (const char *) wif_name, literals[object]); old_value = object;}wif_enum_trace::~wif_enum_trace(){ /* Intentionally blank */}template <class T>class wif_T_trace: public wif_trace{public: wif_T_trace( const T& object_, const sc_string& name_, const sc_string& wif_name_, wif_trace_file::wif_enum type_ ) : wif_trace( name_, wif_name_), object( object_ ), old_value( object_ ) { wif_type = wif_names[type_]; } void write( FILE* f )
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?