vvp: Add support for vpiScaledRealTime in VPI simulation time callbacks.
Factor out the common code for the four different sync callback types and extend it.
This commit is contained in:
parent
c363231b9c
commit
8e754d180e
|
|
@ -445,6 +445,28 @@ void sync_cb::run_run()
|
|||
delete cur;
|
||||
}
|
||||
|
||||
static vvp_time64_t get_sync_cb_time(sync_callback*obj)
|
||||
{
|
||||
vvp_time64_t tv = 0;
|
||||
switch (obj->cb_time.type) {
|
||||
case vpiSimTime:
|
||||
tv = vpip_timestruct_to_time(&obj->cb_time);
|
||||
break;
|
||||
|
||||
case vpiScaledRealTime:
|
||||
tv = vpip_scaled_real_to_time64(obj->cb_time.real,
|
||||
vpip_timescale_scope_from_handle(obj->cb_data.obj));
|
||||
break;
|
||||
|
||||
default:
|
||||
fprintf(stderr, "get_sync_cb_time: Unsupported time type %d.\n",
|
||||
(int)obj->cb_time.type);
|
||||
assert(0);
|
||||
break;
|
||||
}
|
||||
return tv;
|
||||
}
|
||||
|
||||
static sync_callback* make_sync(p_cb_data data, bool readonly_flag)
|
||||
{
|
||||
if (!check_callback_time(data, false))
|
||||
|
|
@ -457,18 +479,7 @@ static sync_callback* make_sync(p_cb_data data, bool readonly_flag)
|
|||
cb->handle = obj;
|
||||
obj->cb_sync = cb;
|
||||
|
||||
vvp_time64_t tv = 0;
|
||||
switch (obj->cb_time.type) {
|
||||
case vpiSimTime:
|
||||
tv = vpip_timestruct_to_time(&obj->cb_time);
|
||||
break;
|
||||
|
||||
default:
|
||||
fprintf(stderr, "Unsupported time type %d.\n",
|
||||
(int)obj->cb_time.type);
|
||||
assert(0);
|
||||
break;
|
||||
}
|
||||
vvp_time64_t tv = get_sync_cb_time(obj);
|
||||
schedule_generic(cb, tv, true, readonly_flag);
|
||||
|
||||
return obj;
|
||||
|
|
@ -485,18 +496,7 @@ static struct __vpiCallback* make_afterdelay(p_cb_data data)
|
|||
cb->handle = obj;
|
||||
obj->cb_sync = cb;
|
||||
|
||||
vvp_time64_t tv = 0;
|
||||
switch (obj->cb_time.type) {
|
||||
case vpiSimTime:
|
||||
tv = vpip_timestruct_to_time(&obj->cb_time);
|
||||
break;
|
||||
|
||||
default:
|
||||
fprintf(stderr, "Unsupported time type %d.\n",
|
||||
(int)obj->cb_time.type);
|
||||
assert(0);
|
||||
break;
|
||||
}
|
||||
vvp_time64_t tv = get_sync_cb_time(obj);
|
||||
schedule_generic(cb, tv, false);
|
||||
|
||||
return obj;
|
||||
|
|
@ -513,19 +513,7 @@ static struct __vpiCallback* make_at_start_of_sim_time(p_cb_data data)
|
|||
cb->handle = obj;
|
||||
obj->cb_sync = cb;
|
||||
|
||||
vvp_time64_t tv = 0;
|
||||
switch (obj->cb_time.type) {
|
||||
case vpiSimTime:
|
||||
tv = vpip_timestruct_to_time(&obj->cb_time);
|
||||
break;
|
||||
|
||||
default:
|
||||
fprintf(stderr, "Unsupported time type %d.\n",
|
||||
(int)obj->cb_time.type);
|
||||
assert(0);
|
||||
break;
|
||||
}
|
||||
|
||||
vvp_time64_t tv = get_sync_cb_time(obj);
|
||||
vvp_time64_t cur = schedule_simtime();
|
||||
if (cur > tv) {
|
||||
tv = 0;
|
||||
|
|
@ -551,19 +539,7 @@ static struct __vpiCallback* make_at_end_of_sim_time(p_cb_data data)
|
|||
cb->handle = obj;
|
||||
obj->cb_sync = cb;
|
||||
|
||||
vvp_time64_t tv = 0;
|
||||
switch (obj->cb_time.type) {
|
||||
case vpiSimTime:
|
||||
tv = vpip_timestruct_to_time(&obj->cb_time);
|
||||
break;
|
||||
|
||||
default:
|
||||
fprintf(stderr, "Unsupported time type %d.\n",
|
||||
(int)obj->cb_time.type);
|
||||
assert(0);
|
||||
break;
|
||||
}
|
||||
|
||||
vvp_time64_t tv = get_sync_cb_time(obj);
|
||||
vvp_time64_t cur = schedule_simtime();
|
||||
if (cur > tv) {
|
||||
tv = 0;
|
||||
|
|
|
|||
|
|
@ -495,7 +495,7 @@ char* vpi_get_str(PLI_INT32 property, vpiHandle ref)
|
|||
return res;
|
||||
}
|
||||
|
||||
static __vpiScope*vpip_timescale_scope_from_handle(vpiHandle obj)
|
||||
__vpiScope*vpip_timescale_scope_from_handle(vpiHandle obj)
|
||||
{
|
||||
struct __vpiSysTaskCall*task;
|
||||
struct __vpiSignal*signal;
|
||||
|
|
|
|||
|
|
@ -1076,6 +1076,8 @@ vpiHandle vpip_sim_realtime(__vpiScope*scope);
|
|||
extern int vpip_get_time_precision(void);
|
||||
extern void vpip_set_time_precision(int pres);
|
||||
|
||||
extern __vpiScope*vpip_timescale_scope_from_handle(vpiHandle obj);
|
||||
|
||||
extern int vpip_time_units_from_handle(vpiHandle obj);
|
||||
extern int vpip_time_precision_from_handle(vpiHandle obj);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue