diff --git a/Changes b/Changes index 404f0f62c..fe3708f38 100644 --- a/Changes +++ b/Changes @@ -61,6 +61,8 @@ indicates the contributor was also the author of the fix; Thanks! **** Fix tracing with --pins-bv 1, bug195. [Michael S] +**** Fix MSVC++ 2008 compile issues, bug209. [Amir Gonnen] + **** Fix MinGW compilation, bug184. [by Shankar Giri] **** Fix Cygwin 1.7.x compiler error with uint32_t, bug204. [Ivan Djordjevic] diff --git a/include/verilated.cpp b/include/verilated.cpp index 1f96a9d3a..0487deb41 100644 --- a/include/verilated.cpp +++ b/include/verilated.cpp @@ -409,7 +409,8 @@ void _vl_vsformat(string& output, const char* formatp, va_list ap) { } static inline bool _vl_vsss_eof(FILE* fp, int& floc) { - return fp ? feof(fp) : (floc<0); + if (fp) return feof(fp) ? 1 : 0; // 1:0 to prevent MSVC++ warning + else return (floc<0); } static inline void _vl_vsss_advance(FILE* fp, int& floc) { if (fp) fgetc(fp); @@ -540,7 +541,7 @@ IData _vl_vsscanf(FILE* fp, // If a fscanf _vl_vsss_skipspace(fp,floc,fromp); _vl_vsss_read(fp,floc,fromp, tmp, NULL); if (!tmp[0]) goto done; - int pos = strlen(tmp)-1; + int pos = ((int)strlen(tmp))-1; int lsb = 0; for (int i=0; i=0; pos--) { _vl_vsss_setbit(owp,obits,lsb, 8, tmp[pos]); lsb+=8; @@ -570,21 +571,21 @@ IData _vl_vsscanf(FILE* fp, // If a fscanf _vl_vsss_skipspace(fp,floc,fromp); _vl_vsss_read(fp,floc,fromp, tmp, "01xXzZ?_"); if (!tmp[0]) goto done; - _vl_vsss_based(owp,obits, 1, tmp, 0, strlen(tmp)); + _vl_vsss_based(owp,obits, 1, tmp, 0, (int)strlen(tmp)); break; } case 'o': { _vl_vsss_skipspace(fp,floc,fromp); _vl_vsss_read(fp,floc,fromp, tmp, "01234567xXzZ?_"); if (!tmp[0]) goto done; - _vl_vsss_based(owp,obits, 3, tmp, 0, strlen(tmp)); + _vl_vsss_based(owp,obits, 3, tmp, 0, (int)strlen(tmp)); break; } case 'x': { _vl_vsss_skipspace(fp,floc,fromp); _vl_vsss_read(fp,floc,fromp, tmp, "0123456789abcdefABCDEFxXzZ?_"); if (!tmp[0]) goto done; - _vl_vsss_based(owp,obits, 4, tmp, 0, strlen(tmp)); + _vl_vsss_based(owp,obits, 4, tmp, 0, (int)strlen(tmp)); break; } default: @@ -689,7 +690,7 @@ void VL_SFORMAT_X(int obits, void* destp, const char* formatp, ...) { _vl_vsformat(output, formatp, ap); va_end(ap); - _VL_STRING_TO_VINT(obits, destp, output.length(), output.c_str()); + _VL_STRING_TO_VINT(obits, destp, (int)output.length(), output.c_str()); } string VL_SFORMATF_NX(const char* formatp, ...) { @@ -845,7 +846,7 @@ void VL_READMEM_W(bool hex, int width, int depth, int array_lsb, int fnwords, } else { WDataOutP datap = &((WDataOutP)(memp))[ entry*VL_WORDS_I(width) ]; if (!innum) { VL_ZERO_RESET_W(width, datap); } - _VL_SHIFTL_INPLACE_W(width, datap, shift); + _VL_SHIFTL_INPLACE_W(width, datap, (IData)shift); datap[0] |= value; } if (value>=(1<=0; pos--) { + for (int i=0, lsb=0, pos=((int)strlen(dp))-1; i=0; pos--) { _vl_vsss_setbit(rwp,rbits,lsb, 8, dp[pos]); lsb+=8; } break; @@ -942,8 +943,8 @@ const char* Verilated::catName(const char* n1, const char* n2) { // Returns new'ed data // Used by symbol table creation to make module names static char* strp = NULL; - static int len = -1; - int newlen = strlen(n1)+strlen(n2)+2; + static size_t len = 0; + size_t newlen = strlen(n1)+strlen(n2)+2; if (newlen > len) { if (strp) delete [] strp; strp = new char[newlen]; diff --git a/include/verilated.h b/include/verilated.h index fc7747610..7c3663657 100644 --- a/include/verilated.h +++ b/include/verilated.h @@ -305,8 +305,8 @@ extern IData VL_VALUEPLUSARGS_IW(int rbits, const char* prefixp, char fmt, WData #define VL_BITISSETLIMIT_W(data,width,bit) (((bit)<(width)) && data[VL_BITWORD_I(bit)] & (VL_UL(1)<>VL_WORDSIZE); } -#define VL_SET_WI(owp,data) { owp[0]=(data); owp[1]=0; } +#define VL_SET_WQ(owp,data) { owp[0]=(IData)(data); owp[1]=(IData)((data)>>VL_WORDSIZE); } +#define VL_SET_WI(owp,data) { owp[0]=(IData)(data); owp[1]=0; } #define VL_SET_QW(lwp) ( ((QData)(lwp[0])) | ((QData)(lwp[1])<<((QData)(VL_WORDSIZE)) )) #define _VL_SET_QII(ld,rd) ( ((QData)(ld)<20011000) -# define VL_TIME_I(ign) ((IData)(sc_time_stamp().to_default_time_units()*VL_TIME_MULTIPLIER)) -# define VL_TIME_Q(ign) ((QData)(sc_time_stamp().to_default_time_units()*VL_TIME_MULTIPLIER)) +# define VL_TIME_I() ((IData)(sc_time_stamp().to_default_time_units()*VL_TIME_MULTIPLIER)) +# define VL_TIME_Q() ((QData)(sc_time_stamp().to_default_time_units()*VL_TIME_MULTIPLIER)) #else -# define VL_TIME_I(ign) ((IData)(sc_time_stamp()*VL_TIME_MULTIPLIER)) -# define VL_TIME_Q(ign) ((QData)(sc_time_stamp()*VL_TIME_MULTIPLIER)) +# define VL_TIME_I() ((IData)(sc_time_stamp()*VL_TIME_MULTIPLIER)) +# define VL_TIME_Q() ((QData)(sc_time_stamp()*VL_TIME_MULTIPLIER)) extern double sc_time_stamp(); #endif @@ -610,7 +610,7 @@ static inline IData VL_REDXOR_64(QData r) { return __builtin_parityll(r); #else r=(r^(r>>1)); r=(r^(r>>2)); r=(r^(r>>4)); r=(r^(r>>8)); r=(r^(r>>16)); r=(r^(r>>32)); - return r; + return (IData)r; #endif } static inline IData VL_REDXOR_W(int words, WDataInP lwp) { @@ -629,7 +629,7 @@ static inline IData VL_COUNTONES_I(IData lhs) { return r; } static inline IData VL_COUNTONES_Q(QData lhs) { - return VL_COUNTONES_I(lhs) + VL_COUNTONES_I(lhs>>32); + return VL_COUNTONES_I((IData)lhs) + VL_COUNTONES_I((IData)(lhs>>32)); } static inline IData VL_COUNTONES_W(int words, WDataInP lwp) { IData r = 0; @@ -876,7 +876,7 @@ static inline WDataOutP VL_ADD_W(int words, WDataOutP owp,WDataInP lwp,WDataInP static inline WDataOutP VL_SUB_W(int words, WDataOutP owp,WDataInP lwp,WDataInP rwp){ QData carry = 0; for (int i=0; i> VL_ULL(32)) & VL_ULL(0xffffffff); @@ -896,7 +896,7 @@ static inline QData VL_UNARYMIN_Q(QData data) { return -data; } static inline WDataOutP VL_UNARYMIN_W(int words, WDataOutP owp,WDataInP lwp){ QData carry = 0; for (int i=0; i> VL_ULL(32)) & VL_ULL(0xffffffff); @@ -954,7 +954,7 @@ static inline WDataOutP VL_MULS_WWW(int,int lbits,int, WDataOutP owp,WDataInP lw if ((lneg ^ rneg) & 1) { // Negate output (not using UNARYMIN, as owp==lwp) QData carry = 0; for (int i=0; i> VL_ULL(32)) & VL_ULL(0xffffffff); @@ -1501,15 +1501,15 @@ inline IData VL_VALUEPLUSARGS_IQ(int rbits, const char* prefixp, char fmt, QData return v; } inline IData VL_VALUEPLUSARGS_II(int rbits, const char* prefixp, char fmt, CData& ldr) { - QData qd; IData v=VL_VALUEPLUSARGS_IQ(rbits,prefixp,fmt,qd); if (v) ldr=qd; + QData qd; IData v=VL_VALUEPLUSARGS_IQ(rbits,prefixp,fmt,qd); if (v) ldr=(CData)qd; return v; } inline IData VL_VALUEPLUSARGS_II(int rbits, const char* prefixp, char fmt, SData& ldr) { - QData qd; IData v=VL_VALUEPLUSARGS_IQ(rbits,prefixp,fmt,qd); if (v) ldr=qd; + QData qd; IData v=VL_VALUEPLUSARGS_IQ(rbits,prefixp,fmt,qd); if (v) ldr=(SData)qd; return v; } inline IData VL_VALUEPLUSARGS_II(int rbits, const char* prefixp, char fmt, IData& ldr) { - QData qd; IData v=VL_VALUEPLUSARGS_IQ(rbits,prefixp,fmt,qd); if (v) ldr=qd; + QData qd; IData v=VL_VALUEPLUSARGS_IQ(rbits,prefixp,fmt,qd); if (v) ldr=(IData)qd; return v; } diff --git a/include/verilateddpi.cpp b/include/verilateddpi.cpp index 5f669c6c2..4bc8da179 100644 --- a/include/verilateddpi.cpp +++ b/include/verilateddpi.cpp @@ -26,6 +26,12 @@ #define _VERILATEDDPI_CPP_ #include "verilatedos.h" #include "verilatedimp.h" + +// On MSVC++ we need svdpi.h to declare exports, not imports +#define DPI_PROTOTYPES +#define XXTERN DPI_EXTERN DPI_DLLESPEC +#define EETERN DPI_EXTERN DPI_DLLESPEC + #include "svdpi.h" //====================================================================== @@ -33,7 +39,7 @@ // Not supported yet #define _VL_SVDPI_UNIMP() \ - vl_fatal(__FILE__,__LINE__,"",Verilated::catName("%%Error: Unsupported DPI function: ",__func__)) + vl_fatal(__FILE__,__LINE__,"",Verilated::catName("%%Error: Unsupported DPI function: ",VL_FUNC)) // Function requires a "context" in the import declaration #define _VL_SVDPI_CONTEXT_WARN() \ @@ -44,8 +50,6 @@ //====================================================================== // DPI ROUTINES -// Version - const char* svDpiVersion() { return "1800-2005"; } diff --git a/include/verilatedimp.h b/include/verilatedimp.h index 0c70f6578..7ad0651c0 100644 --- a/include/verilatedimp.h +++ b/include/verilatedimp.h @@ -80,7 +80,7 @@ public: // But only for verilated*.cpp s_s.m_argVecLoaded = true; // Can't just test later for empty vector, no arguments is ok } static string argPlusMatch(const char* prefixp) { - int len = strlen(prefixp); + size_t len = strlen(prefixp); if (VL_UNLIKELY(!s_s.m_argVecLoaded)) { s_s.m_argVecLoaded = true; // Complain only once vl_fatal("unknown",0,"", diff --git a/include/verilatedos.h b/include/verilatedos.h index 37d4f49aa..0e3647a45 100644 --- a/include/verilatedos.h +++ b/include/verilatedos.h @@ -74,6 +74,21 @@ // This is not necessarily the same as #UL, depending on what the IData typedef is. #define VL_UL(c) ((IData)(c##UL)) ///< Add appropriate suffix to 32-bit constant +//========================================================================= +// Warning disabled + +#ifndef VL_WARNINGS +# ifdef _MSC_VER +# pragma warning(disable:4100) // C4100: unreferenced formal parameter (L4) +# pragma warning(disable:4127) // C4127: conditional expression is constant (L4) +# pragma warning(disable:4146) // C4146: unary minus operator applied to unsigned type, result still unsigned +# pragma warning(disable:4189) // C4189: local variable is initialized but not referenced (L4) +# pragma warning(disable:4244) // C4244: conversion from 'uint64_t' to 'uint_32_t', possible loss of data +# pragma warning(disable:4245) // C4245: conversion from 'int' to 'unsigned', signed/unsigned mismatch +# pragma warning(disable:4996) // C4996: sscanf/fopen/etc may be unsafe +# endif +#endif + //========================================================================= // Basic integer types @@ -98,15 +113,15 @@ typedef unsigned long long vluint64_t; ///< 64-bit unsigned type #elif defined(_WIN32) && defined(_MSC_VER) -typedef unsigned char uint8_t; ///< 8-bit unsigned type (backward compatibility) -typedef unsigned short int uint16_t; ///< 16-bit unsigned type (backward compatibility) -typedef unsigned int uint32_t; ///< 32-bit unsigned type (backward compatibility) -typedef unsigned char vluint8_t; ///< 8-bit unsigned type -typedef unsigned short int vluint16_t; ///< 16-bit unsigned type -typedef int vlsint32_t; ///< 32-bit signed type -typedef unsigned int vluint32_t; ///< 32-bit unsigned type -typedef __int64 vlsint64_t; ///< 64-bit signed type -typedef unsigned __int64 vluint64_t; ///< 64-bit unsigned type +typedef unsigned __int8 uint8_t; ///< 8-bit unsigned type (backward compatibility) +typedef unsigned __int16 uint16_t; ///< 16-bit unsigned type (backward compatibility) +typedef unsigned __int32 uint32_t; ///< 32-bit unsigned type (backward compatibility) +typedef unsigned __int8 vluint8_t; ///< 8-bit unsigned type +typedef unsigned __int16 vluint16_t; ///< 16-bit unsigned type +typedef signed __int32 vlsint32_t; ///< 32-bit signed type +typedef unsigned __int32 vluint32_t; ///< 32-bit unsigned type +typedef signed __int64 vlsint64_t; ///< 64-bit signed type +typedef unsigned __int64 vluint64_t; ///< 64-bit unsigned type #else // Linux or compliant Unix flavors, -m64