Fix casting to integer not to cause integer overflow. (#2930)
This commit is contained in:
parent
b2139f65d8
commit
1e4839e5d1
|
|
@ -646,17 +646,16 @@ std::string _vl_vsformat_time(char* tmp, double ld, bool left, size_t width) {
|
|||
int shift = prec - userUnits + fracDigits; // 0..-15
|
||||
double shiftd = vl_time_multiplier(shift);
|
||||
double scaled = ld * shiftd;
|
||||
QData fracDiv = static_cast<QData>(vl_time_multiplier(fracDigits));
|
||||
QData whole = static_cast<QData>(scaled) / fracDiv;
|
||||
QData fraction = static_cast<QData>(scaled) % fracDiv;
|
||||
const double fracDiv = vl_time_multiplier(fracDigits);
|
||||
const double whole = scaled / fracDiv;
|
||||
int digits = 0;
|
||||
if (!fracDigits) {
|
||||
digits = VL_SNPRINTF(tmp, VL_VALUE_STRING_MAX_WIDTH, "%" VL_PRI64 "u%s", whole,
|
||||
suffix.c_str());
|
||||
digits = VL_SNPRINTF(tmp, VL_VALUE_STRING_MAX_WIDTH, "%.0f%s", whole, suffix.c_str());
|
||||
} else {
|
||||
digits = VL_SNPRINTF(tmp, VL_VALUE_STRING_MAX_WIDTH, "%" VL_PRI64 "u.%0*" VL_PRI64 "u%s",
|
||||
whole, fracDigits, fraction, suffix.c_str());
|
||||
digits = VL_SNPRINTF(tmp, VL_VALUE_STRING_MAX_WIDTH, "%.*f%s", fracDigits, whole,
|
||||
suffix.c_str());
|
||||
}
|
||||
|
||||
int needmore = width - digits;
|
||||
std::string padding;
|
||||
if (needmore > 0) padding.append(needmore, ' '); // Pad with spaces
|
||||
|
|
|
|||
|
|
@ -3,11 +3,11 @@ Time scale of t is 100s / 10ms
|
|||
[100000000] time%0d=10000 123%0t=1230000
|
||||
dig%0t=0 dig%0d=0
|
||||
rdig%0t=543 rdig%0f=0.054321
|
||||
[0.000000ns] time%0d=10000 123%0t=12300000000000.000000ns
|
||||
[1000000000000000.000000ns] time%0d=10000 123%0t=12300000000000.000000ns
|
||||
dig%0t=0.000000ns dig%0d=0
|
||||
rdig%0t=5432109876.543210ns rdig%0f=0.054321
|
||||
[0.000000ns] stime%0t=0.000000ns stime%0d=10000 stime%0f=10000.000000
|
||||
[0.000000ns] rtime%0t=0.000000ns rtime%0d=10000 rtime%0f=10000.000000
|
||||
[1000000000000000.000000ns] stime%0t=1000000000000000.000000ns stime%0d=10000 stime%0f=10000.000000
|
||||
[1000000000000000.000000ns] rtime%0t=1000000000000000.000000ns rtime%0d=10000 rtime%0f=10000.000000
|
||||
global vpiSimTime = 0,100000000 vpiScaledRealTime = 1e+08
|
||||
global vpiTimeUnit = -2 vpiTimePrecision = -2
|
||||
top.t vpiSimTime = 0,100000000 vpiScaledRealTime = 10000
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
Time scale of t is 10ms / 10ns
|
||||
[60000000] time%0d=60 123%0t=123000000
|
||||
dig%0t=543000000 dig%0d=543
|
||||
rdig%0t=543210987 rdig%0f=543.210988
|
||||
rdig%0t=543210988 rdig%0f=543.210988
|
||||
[600000000.000000ns] time%0d=60 123%0t=1230000000.000000ns
|
||||
dig%0t=5430000000.000000ns dig%0d=543
|
||||
rdig%0t=5432109876.543210ns rdig%0f=543.210988
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
Time scale of t is 1ms / 10ns
|
||||
[6000000] time%0d=60 123%0t=12300000
|
||||
dig%0t=543200000 dig%0d=5432
|
||||
rdig%0t=543210987 rdig%0f=5432.109877
|
||||
rdig%0t=543210988 rdig%0f=5432.109877
|
||||
[60000000.000000ns] time%0d=60 123%0t=123000000.000000ns
|
||||
dig%0t=5432000000.000000ns dig%0d=5432
|
||||
rdig%0t=5432109876.543210ns rdig%0f=5432.109877
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
Time scale of t is 1ns / 1ns
|
||||
[60] time%0d=60 123%0t=123
|
||||
dig%0t=5432109877 dig%0d=5432109877
|
||||
rdig%0t=5432109876 rdig%0f=5432109876.543210
|
||||
rdig%0t=5432109877 rdig%0f=5432109876.543210
|
||||
[60.000000ns] time%0d=60 123%0t=123.000000ns
|
||||
dig%0t=5432109877.000000ns dig%0d=5432109877
|
||||
rdig%0t=5432109876.543210ns rdig%0f=5432109876.543210
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ Time scale of t is 1ps / 1fs
|
|||
dig%0t=5432109876.543000ns dig%0d=5432109876543
|
||||
rdig%0t=5432109876.543209ns rdig%0f=5432109876543.209961
|
||||
[0.060000ns] stime%0t=0.060000ns stime%0d=60 stime%0f=60.000000
|
||||
[0.060000ns] rtime%0t=0.059999ns rtime%0d=60 rtime%0f=60.000000
|
||||
[0.060000ns] rtime%0t=0.060000ns rtime%0d=60 rtime%0f=60.000000
|
||||
global vpiSimTime = 0,60000 vpiScaledRealTime = 60000
|
||||
global vpiTimeUnit = -12 vpiTimePrecision = -15
|
||||
top.t vpiSimTime = 0,60000 vpiScaledRealTime = 60
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
Time scale of t is 1s / 10ns
|
||||
[6000000000] time%0d=60 123%0t=12300000000
|
||||
dig%0t=500000000 dig%0d=5
|
||||
rdig%0t=543210987 rdig%0f=5.432110
|
||||
rdig%0t=543210988 rdig%0f=5.432110
|
||||
[60000000000.000000ns] time%0d=60 123%0t=123000000000.000000ns
|
||||
dig%0t=5000000000.000000ns dig%0d=5
|
||||
rdig%0t=5432109876.543210ns rdig%0f=5.432110
|
||||
|
|
|
|||
|
|
@ -2,12 +2,12 @@
|
|||
Time scale of t is 1us / 1ns
|
||||
[60000] time%0d=60 123%0t=123000
|
||||
dig%0t=5432110000 dig%0d=5432110
|
||||
rdig%0t=5432109876 rdig%0f=5432109.876543
|
||||
rdig%0t=5432109877 rdig%0f=5432109.876543
|
||||
[60000.000000ns] time%0d=60 123%0t=123000.000000ns
|
||||
dig%0t=5432110000.000000ns dig%0d=5432110
|
||||
rdig%0t=5432109876.543209ns rdig%0f=5432109.876543
|
||||
[60000.000000ns] stime%0t=60000.000000ns stime%0d=60 stime%0f=60.000000
|
||||
[60000.000000ns] rtime%0t=59999.999999ns rtime%0d=60 rtime%0f=60.000000
|
||||
[60000.000000ns] rtime%0t=60000.000000ns rtime%0d=60 rtime%0f=60.000000
|
||||
global vpiSimTime = 0,60000 vpiScaledRealTime = 60000
|
||||
global vpiTimeUnit = -6 vpiTimePrecision = -9
|
||||
top.t vpiSimTime = 0,60000 vpiScaledRealTime = 60
|
||||
|
|
|
|||
Loading…
Reference in New Issue