From cd029fe35d99d0096c9b477083ad583e4cd86e7c Mon Sep 17 00:00:00 2001 From: Martin Whitaker Date: Sun, 5 Aug 2012 11:37:13 +0100 Subject: [PATCH] Fix time scaling in PLI TF routines for MinGW. When built with MinGW, pow() may not always generate an exact integer result when supplied with integer operands. Converting the result to an integer before we use it seems to be enough to work round this issue. --- libveriuser/getsimtime.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/libveriuser/getsimtime.c b/libveriuser/getsimtime.c index 716480f4d..2100867a0 100644 --- a/libveriuser/getsimtime.c +++ b/libveriuser/getsimtime.c @@ -29,6 +29,15 @@ * some TF time routines implemented using VPI interface */ +// On some platforms (e.g. MinGW), pow() may not always generate an +// exact integer result when supplied with integer operands. Converting +// the result to an integer before we use it seems to be enough to work +// round this issue. +static ivl_u64_t pow10u(PLI_INT32 val) +{ + return (ivl_u64_t)pow(10, val); +} + static ivl_u64_t scale(int high, int low, void*obj) { vpiHandle hand = vpi_handle(vpiScope, vpi_handle(vpiSysTfCall,0)); @@ -36,8 +45,8 @@ scale(int high, int low, void*obj) { scaled = high; scaled = (scaled << 32) | low; - scaled /= pow(10, vpi_get(vpiTimeUnit,obj ? (vpiHandle)obj : hand) - - vpi_get(vpiTimePrecision,0)); + scaled /= pow10u(vpi_get(vpiTimeUnit,obj ? (vpiHandle)obj : hand) - + vpi_get(vpiTimePrecision,0)); return scaled; }