diff --git a/vvp/vpi_callback.cc b/vvp/vpi_callback.cc index 93df4aae6..e18bf00c7 100644 --- a/vvp/vpi_callback.cc +++ b/vvp/vpi_callback.cc @@ -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; diff --git a/vvp/vpi_priv.cc b/vvp/vpi_priv.cc index d8b370b61..27fe86210 100644 --- a/vvp/vpi_priv.cc +++ b/vvp/vpi_priv.cc @@ -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; diff --git a/vvp/vpi_priv.h b/vvp/vpi_priv.h index 7917112d8..55b26d5d3 100644 --- a/vvp/vpi_priv.h +++ b/vvp/vpi_priv.h @@ -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);