sc_isdb_trace.cpp
来自「基于4个mips核的noc设计」· C++ 代码 · 共 1,876 行 · 第 1/4 页
CPP
1,876 行
{ isdb_id = ISDB_DefineSignal (database, ISDB_Integer, name); write(database);}bool isdb_signed_int_trace::changed(){ return object != old_value;}void isdb_signed_int_trace::write(ISDB_Conn database){ ISDB_SetValue (database, isdb_id, object); old_value = object;}/*****************************************************************************/class isdb_signed_short_trace : public isdb_trace {public: isdb_signed_short_trace(const short& object, const sc_string& name_, const sc_string& isdb_name_, int width_); void declare_variable(ISDB_Conn database); void write(ISDB_Conn database); bool changed();protected: const short& object; short old_value; unsigned short mask; };isdb_signed_short_trace::isdb_signed_short_trace(const short& object_, const sc_string& name_, const sc_string& isdb_name_, int width_) : isdb_trace( name_, isdb_name_), object( object_){ bit_width = width_; if (bit_width < 16) { mask = static_cast<unsigned short>( ~(-1 << bit_width) ); } else { mask = static_cast<unsigned short>( -1 ); // 0xffff } isdb_var_typ_name = "wire"; old_value = object;}void isdb_signed_short_trace::declare_variable (ISDB_Conn database){ isdb_id = ISDB_DefineSignal (database, ISDB_Integer, name); write(database);}bool isdb_signed_short_trace::changed(){ return object != old_value;}void isdb_signed_short_trace::write(ISDB_Conn database){ ISDB_SetValue (database, isdb_id, object); old_value = object;}/*****************************************************************************/class isdb_signed_char_trace : public isdb_trace {public: isdb_signed_char_trace(const char& object, const sc_string& name_, const sc_string& isdb_name_, int width_); void declare_variable(ISDB_Conn database); void write(ISDB_Conn database); bool changed();protected: const char& object; char old_value; unsigned char mask; };isdb_signed_char_trace::isdb_signed_char_trace(const char& object_, const sc_string& name_, const sc_string& isdb_name_, int width_) : isdb_trace( name_, isdb_name_), object( object_){ bit_width = width_; if (bit_width < 8) { mask = static_cast<unsigned char>( ~(-1 << bit_width) ); } else { mask = static_cast<unsigned char>( -1 ); // 0xff } isdb_var_typ_name = "wire"; old_value = object;}void isdb_signed_char_trace::declare_variable (ISDB_Conn database){ isdb_id = ISDB_DefineSignal (database, ISDB_Integer, name); write(database);}bool isdb_signed_char_trace::changed(){ return object != old_value;}void isdb_signed_char_trace::write(ISDB_Conn database){ ISDB_SetValue (database, isdb_id, object); old_value = object;}/*****************************************************************************/class isdb_signed_long_trace : public isdb_trace {public: isdb_signed_long_trace(const long& object, const sc_string& name_, const sc_string& isdb_name_, int width_); void declare_variable(ISDB_Conn database); void write(ISDB_Conn database); bool changed();protected: const long& object; long old_value; unsigned long mask; };isdb_signed_long_trace::isdb_signed_long_trace(const long& object_, const sc_string& name_, const sc_string& isdb_name_, int width_) : isdb_trace( name_, isdb_name_), object( object_){ bit_width = width_; if (bit_width < 32) { mask = ~(-1 << bit_width); } else { mask = static_cast<unsigned long>( -1 ); // 0xffffffff } isdb_var_typ_name = "wire"; old_value = object;}void isdb_signed_long_trace::declare_variable (ISDB_Conn database){ isdb_id = ISDB_DefineSignal (database, ISDB_Integer, name); write(database);}bool isdb_signed_long_trace::changed(){ return object != old_value;}void isdb_signed_long_trace::write(ISDB_Conn database){ ISDB_SetValue (database, isdb_id, object); old_value = object;}/*****************************************************************************/class isdb_float_trace : public isdb_trace {public: isdb_float_trace(const float& object, const sc_string& name_, const sc_string& isdb_name_); void declare_variable(ISDB_Conn database); void write(ISDB_Conn database); bool changed();protected: const float& object; float old_value;};isdb_float_trace::isdb_float_trace(const float& object_, const sc_string& name_, const sc_string& isdb_name_) : isdb_trace( name_, isdb_name_), object( object_){ isdb_var_typ_name = "real"; bit_width = 1; old_value = object;}void isdb_float_trace::declare_variable (ISDB_Conn database){ isdb_id = ISDB_DefineSignal (database, ISDB_Float, name); write(database);}bool isdb_float_trace::changed(){ return object != old_value;}void isdb_float_trace::write(ISDB_Conn database){ ISDB_SetValue (database, isdb_id, object); old_value = object;}/*****************************************************************************/class isdb_double_trace : public isdb_trace {public: isdb_double_trace(const double& object, const sc_string& name_, const sc_string& isdb_name_); void declare_variable(ISDB_Conn database); void write(ISDB_Conn database); bool changed();protected: const double& object; double old_value;};isdb_double_trace::isdb_double_trace(const double& object_, const sc_string& name_, const sc_string& isdb_name_) : isdb_trace( name_, isdb_name_), object( object_){ isdb_var_typ_name = "real"; bit_width = 1; old_value = object;}void isdb_double_trace::declare_variable (ISDB_Conn database){ isdb_id = ISDB_DefineSignal (database, ISDB_Float, name); write(database);}bool isdb_double_trace::changed(){ return object != old_value;}void isdb_double_trace::write(ISDB_Conn database){ ISDB_SetValue (database, isdb_id, object); old_value = object;}/*****************************************************************************/class isdb_enum_trace : public isdb_trace {public: isdb_enum_trace(const unsigned& object_, const sc_string& name_, const sc_string& isdb_name_, const char** enum_literals); void declare_variable(ISDB_Conn database); void write(ISDB_Conn database); bool changed();protected: const unsigned& object; unsigned old_value; unsigned mask; const char** literals; unsigned nliterals;};isdb_enum_trace::isdb_enum_trace(const unsigned& object_, const sc_string& name_, const sc_string& isdb_name_, const char** enum_literals_) : isdb_trace( name_, isdb_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 = static_cast<unsigned int>( -1 ); // 0xffffffff } isdb_var_typ_name = "wire"; old_value = object;} void isdb_enum_trace::declare_variable (ISDB_Conn database){ isdb_id = ISDB_DefineSignal (database, ISDB_Integer, name); write(database);}bool isdb_enum_trace::changed(){ return object != old_value;}void isdb_enum_trace::write(ISDB_Conn database){ /* TBD: this may be not good enough. Do we need to consider the mask? */ ISDB_SetValue (database, isdb_id, object); old_value = object;}/***************************************************************************** isdb_trace_file functions *****************************************************************************/void isdb_trace_error_handler (ISDB_Conn /* database */, ISDB_ErrorType /* type */, char *msg){ cout << "WARNING: error reported from ISDB: " << msg << endl;}isdb_trace_file::isdb_trace_file(const char *name){ sc_string file_name = name ; file_name += ".isdb"; // // Establish an error handler // ISDB_InstallErrorHandler (isdb_trace_error_handler); // ISDB_CreateDB takes only char* but not const char*, // therefore must perform a dreaded conversion to char* int len = file_name.length(); char* fname = (char*)malloc(len+1 *sizeof(char)); for (int n=0; n<len; n++) { fname[n] = file_name[n]; } fname[len] = '\0'; database = ISDB_CreateDB (fname, ISDB_IncludeDeltaCycle); free(fname); if (!database) { sc_string msg = sc_string("Cannot write trace file '") + file_name + "'"; cerr << "FATAL: " << msg << "\n"; exit(1); } trace_delta_cycles = false; initialized = false; isdb_name_index = 0; //default timestep = 1 sec timescale_unit = 1; timescale_set_by_user = false;}void isdb_trace_file::initialize(){ char timescale[10]; ISDB_Time isdb_time; // // convert timescale into string // if (timescale_unit == 1e-15) sprintf(timescale, "1fs"); else if(timescale_unit == 1e-14) sprintf(timescale, "10fs"); else if(timescale_unit == 1e-13) sprintf(timescale, "100fs"); else if(timescale_unit == 1e-12) sprintf(timescale, "1ps"); else if(timescale_unit == 1e-11) sprintf(timescale, "10ps"); else if(timescale_unit == 1e-10) sprintf(timescale, "100ps"); else if(timescale_unit == 1e-9) sprintf(timescale, "1ns"); else if(timescale_unit == 1e-8) sprintf(timescale, "10ns"); else if(timescale_unit == 1e-7) sprintf(timescale, "100ns"); else if(timescale_unit == 1e-6) sprintf(timescale, "1us"); else if(timescale_unit == 1e-5) sprintf(timescale, "10us"); else if(timescale_unit == 1e-4) sprintf(timescale, "100us"); else if(timescale_unit == 1e-3) sprintf(timescale, "1ms"); else if(timescale_unit == 1e-2) sprintf(timescale, "10ms"); else if(timescale_unit == 1e-1) sprintf(timescale, "100ms"); else if(timescale_unit == 1e0) sprintf(timescale, "1s"); else if(timescale_unit == 1e1) sprintf(timescale, "10s"); else if(timescale_unit == 1e2) sprintf(timescale, "100s"); // // Set previous-time // Convert init time to ISDB_Time // // double inittime = sc_simulation_time(); double inittime = sc_time_stamp().to_double(); double_to_special_int64(inittime/timescale_unit, &previous_time_units_high, &previous_time_units_low ); isdb_time.low = previous_time_units_low; isdb_time.high = previous_time_units_high; // // Configure ISDB database // ISDB_Configure (database, ISDB_TimeUnits, timescale, ISDB_StartTime, &isdb_time, ISDB_PathSeparator, "/", ISDB_StructSeparator, "/", NULL); running_regression = ( getenv( "SYSTEMC_REGRESSION" ) != NULL ); // Don't print message if running regression if( ! timescale_set_by_user && ! running_regression ) { cout << "WARNING: Default time step is used for ISDB tracing." << endl; } // Define variables int i; for (i = 0; i < traces.size(); i++) { isdb_trace* t = traces[i]; t->set_width(); // needed for all vectors t->declare_variable(database); }}void isdb_trace_file::sc_set_isdb_time_unit(int exponent10_seconds){ /* TBD: save the exponent, exponent10_seconds, internally and use it later to compute the TimeScale_string more easily */ if(initialized){ isdb_put_error_message("ISDB trace timescale unit cannot be changed once tracing has begun.\n" "To change the scale, create a new trace file.", false); return; } if(exponent10_seconds < -15 || exponent10_seconds > 2){ isdb_put_error_message("set_isdb_time_unit() has valid exponent range -15...+2.", false); return; } if (exponent10_seconds == -15) timescale_unit = 1e-15; else if(exponent10_seconds == -14) timescale_unit = 1e-14; else if(exponent10_seconds == -13) timescale_unit = 1e-13; else if(exponent10_seconds == -12) timescale_unit = 1e-12; else if(exponent10_seconds == -11) timescale_unit = 1e-11; else if(exponent10_seconds == -10) timescale_unit = 1e-10; else if(exponent10_seconds == -9) timescale_unit = 1e-9; else if(exponent10_seconds == -8) timescale_unit = 1e-8; else if(exponent10_seconds == -7) timescale_unit = 1e-7; else if(exponent10_seconds == -6) timescale_unit = 1e-6; else if(exponent10_seconds == -5) timescale_unit = 1e-5; else if(exponent10_seconds == -4) timescale_unit = 1e-4; else if(exponent10_seconds == -3) timescale_unit = 1e-3; else if(exponent10_seconds == -2) timescale_unit = 1e-2; else if(exponent10_seconds == -1) timescale_unit = 1e-1; else if(exponent10_seconds == 0) timescale_unit = 1e0;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?