diff --git a/vvp/vpi_priv.cc b/vvp/vpi_priv.cc index 26d59ac55..72b0e08f2 100644 --- a/vvp/vpi_priv.cc +++ b/vvp/vpi_priv.cc @@ -565,9 +565,18 @@ int vpip_time_precision_from_handle(vpiHandle obj) } } +double vpip_scaled_time_from_handle(vvp_time64_t time, vpiHandle obj) +{ + int scale = vpip_get_time_precision() - + vpip_time_units_from_handle(obj); + if (scale >= 0) + return (double)time * pow(10.0, scale); + else + return (double)time / pow(10.0, -scale); +} + void vpi_get_time(vpiHandle obj, s_vpi_time*vp) { - int scale; vvp_time64_t time; assert(vp); @@ -581,10 +590,7 @@ void vpi_get_time(vpiHandle obj, s_vpi_time*vp) break; case vpiScaledRealTime: - scale = vpip_get_time_precision() - - vpip_time_units_from_handle(obj); - if (scale >= 0) vp->real = (double)time * pow(10.0, scale); - else vp->real = (double)time / pow(10.0, -scale); + vp->real = vpip_scaled_time_from_handle(time, obj); break; default: diff --git a/vvp/vpi_priv.h b/vvp/vpi_priv.h index 1c5f01652..7917112d8 100644 --- a/vvp/vpi_priv.h +++ b/vvp/vpi_priv.h @@ -1079,6 +1079,8 @@ extern void vpip_set_time_precision(int pres); extern int vpip_time_units_from_handle(vpiHandle obj); extern int vpip_time_precision_from_handle(vpiHandle obj); +extern double vpip_scaled_time_from_handle(vvp_time64_t time, vpiHandle obj); + extern void vpip_time_to_timestruct(struct t_vpi_time*ts, vvp_time64_t ti); extern vvp_time64_t vpip_timestruct_to_time(const struct t_vpi_time*ts);