From 34719c3163a823777918070bff269f03eafc0845 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; }