⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sc_vcd_trace.cpp

📁 system C源码 一种替代verilog的语言
💻 CPP
📖 第 1 页 / 共 4 页
字号:
    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 + -