Use more precise pow function to scale time by units.
This commit is contained in:
parent
de4c73abcb
commit
971cd51d76
|
|
@ -17,13 +17,14 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#ifdef HAVE_CVS_IDENT
|
#ifdef HAVE_CVS_IDENT
|
||||||
#ident "$Id: sys_time.c,v 1.6 2003/01/27 00:14:37 steve Exp $"
|
#ident "$Id: sys_time.c,v 1.7 2003/01/28 04:41:55 steve Exp $"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# include "config.h"
|
# include "config.h"
|
||||||
|
|
||||||
# include "vpi_user.h"
|
# include "vpi_user.h"
|
||||||
# include <string.h>
|
# include <string.h>
|
||||||
|
# include <math.h>
|
||||||
# include <assert.h>
|
# include <assert.h>
|
||||||
|
|
||||||
static vpiHandle module_of_function(vpiHandle obj)
|
static vpiHandle module_of_function(vpiHandle obj)
|
||||||
|
|
@ -96,7 +97,6 @@ static int sys_realtime_calltf(char*name)
|
||||||
vpiHandle call_handle;
|
vpiHandle call_handle;
|
||||||
vpiHandle mod;
|
vpiHandle mod;
|
||||||
int units, prec;
|
int units, prec;
|
||||||
double scale;
|
|
||||||
|
|
||||||
call_handle = vpi_handle(vpiSysTfCall, 0);
|
call_handle = vpi_handle(vpiSysTfCall, 0);
|
||||||
assert(call_handle);
|
assert(call_handle);
|
||||||
|
|
@ -106,27 +106,13 @@ static int sys_realtime_calltf(char*name)
|
||||||
now.type = vpiSimTime;
|
now.type = vpiSimTime;
|
||||||
vpi_get_time(0, &now);
|
vpi_get_time(0, &now);
|
||||||
|
|
||||||
/* All the variants but $simtime return the time in units of
|
units = vpi_get(vpiTimeUnit, mod);
|
||||||
the local scope. The $simtime function returns the
|
|
||||||
simulation time. */
|
|
||||||
if (strcmp(name, "$simtime") == 0)
|
|
||||||
units = vpi_get(vpiTimePrecision, 0);
|
|
||||||
else
|
|
||||||
units = vpi_get(vpiTimeUnit, mod);
|
|
||||||
|
|
||||||
prec = vpi_get(vpiTimePrecision, 0);
|
prec = vpi_get(vpiTimePrecision, 0);
|
||||||
scale = 1;
|
|
||||||
while (units > prec) {
|
|
||||||
scale *= 10;
|
|
||||||
units -= 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
val.format = vpiRealVal;
|
val.format = vpiRealVal;
|
||||||
val.value.real = now.low;
|
val.value.real = pow(10.0, prec-units) * now.low;
|
||||||
assert(now.high == 0);
|
assert(now.high == 0);
|
||||||
|
|
||||||
val.value.real /= scale;
|
|
||||||
|
|
||||||
vpi_put_value(call_handle, &val, 0, vpiNoDelay);
|
vpi_put_value(call_handle, &val, 0, vpiNoDelay);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -171,6 +157,9 @@ void sys_time_register()
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: sys_time.c,v $
|
* $Log: sys_time.c,v $
|
||||||
|
* Revision 1.7 2003/01/28 04:41:55 steve
|
||||||
|
* Use more precise pow function to scale time by units.
|
||||||
|
*
|
||||||
* Revision 1.6 2003/01/27 00:14:37 steve
|
* Revision 1.6 2003/01/27 00:14:37 steve
|
||||||
* Support in various contexts the $realtime
|
* Support in various contexts the $realtime
|
||||||
* system task.
|
* system task.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue