diff --git a/vpi/libvpi.c b/vpi/libvpi.c index 100d6f084..cf4c2ee72 100644 --- a/vpi/libvpi.c +++ b/vpi/libvpi.c @@ -218,6 +218,11 @@ PLI_INT32 vpi_free_object(vpiHandle ref) assert(vpip_routines); return vpip_routines->free_object(ref); } +PLI_INT32 vpi_release_handle(vpiHandle ref) +{ + assert(vpip_routines); + return vpip_routines->release_handle(ref); +} PLI_INT32 vpi_get_vlog_info(p_vpi_vlog_info info) { assert(vpip_routines); diff --git a/vpi/sys_sdf.c b/vpi/sys_sdf.c index 1f2658b45..830837a48 100644 --- a/vpi/sys_sdf.c +++ b/vpi/sys_sdf.c @@ -207,6 +207,7 @@ void sdf_interconnect_delays(struct interconnect_port_s port1, struct interconne if (!iter) { vpi_printf("SDF ERROR: %s:%d: Could not find vpiBit iterator for port1!\n", sdf_fname, sdf_lineno); + return; } while ((vpi_port_bit = vpi_scan(iter))) { @@ -216,6 +217,7 @@ void sdf_interconnect_delays(struct interconnect_port_s port1, struct interconne if (port1.index == bit) { if (sdf_flag_inform) vpi_printf("SDF INFO: %s:%d: Substituting vpiPort with vpiPortBit for port1\n", sdf_fname, sdf_lineno); port1_handle = vpi_port_bit; + vpi_release_handle(iter); // Free the iterator break; } } @@ -228,6 +230,7 @@ void sdf_interconnect_delays(struct interconnect_port_s port1, struct interconne if (!iter) { vpi_printf("SDF ERROR: %s:%d: Could not find vpiBit iterator for port2!\n", sdf_fname, sdf_lineno); + return; } while ((vpi_port_bit = vpi_scan(iter))) { @@ -237,6 +240,7 @@ void sdf_interconnect_delays(struct interconnect_port_s port1, struct interconne if (port2.index == bit) { if (sdf_flag_inform) vpi_printf("SDF INFO: %s:%d: Substituting vpiPort with vpiPortBit for port2\n", sdf_fname, sdf_lineno); port2_handle = vpi_port_bit; + vpi_release_handle(iter); // Free the iterator break; } } diff --git a/vpi_modules.cc b/vpi_modules.cc index ab8f86f7c..26ccd395f 100644 --- a/vpi_modules.cc +++ b/vpi_modules.cc @@ -96,6 +96,7 @@ PLI_INT32 vpi_vprintf(const char*, va_list) { return 0; } PLI_INT32 vpi_chk_error(p_vpi_error_info) { return 0; } PLI_INT32 vpi_compare_objects(vpiHandle, vpiHandle) { return 0; } PLI_INT32 vpi_free_object(vpiHandle) { return 0; } +PLI_INT32 vpi_release_handle(vpiHandle) { return 0; } PLI_INT32 vpi_get_vlog_info(p_vpi_vlog_info info) { info->argc = 0; diff --git a/vpi_user.h b/vpi_user.h index a35ce5d15..40bf4879d 100644 --- a/vpi_user.h +++ b/vpi_user.h @@ -567,6 +567,7 @@ extern vpiHandle vpi_put_value(vpiHandle obj, p_vpi_value value, p_vpi_time when, PLI_INT32 flags); extern PLI_INT32 vpi_free_object(vpiHandle ref); +extern PLI_INT32 vpi_release_handle(vpiHandle ref); extern PLI_INT32 vpi_get_vlog_info(p_vpi_vlog_info vlog_info_p); /* @@ -724,6 +725,7 @@ typedef struct { PLI_INT32 (*chk_error)(p_vpi_error_info); PLI_INT32 (*compare_objects)(vpiHandle, vpiHandle); PLI_INT32 (*free_object)(vpiHandle); + PLI_INT32 (*release_handle)(vpiHandle); PLI_INT32 (*get_vlog_info)(p_vpi_vlog_info info) ; void (*vcontrol)(PLI_INT32, va_list); PLI_INT32 (*fopen)(const char*, const char*); diff --git a/vvp/vpi_priv.cc b/vvp/vpi_priv.cc index f92fdeea1..6d6422d56 100644 --- a/vvp/vpi_priv.cc +++ b/vvp/vpi_priv.cc @@ -291,6 +291,14 @@ PLI_INT32 vpi_free_object(vpiHandle ref) return rtn; } +PLI_INT32 vpi_release_handle(vpiHandle ref) +{ + // Since SystemVerilog vpi_free_object() has been + // renamed vpi_release_handle(), and thus + // vpi_free_object() has been deprecated. + return vpi_free_object(ref); +} + static int vpip_get_global(int property) { switch (property) { @@ -1575,7 +1583,7 @@ bool check_connected_to_concat8(vvp_net_t* current_net, vvp_net_t* net2) // net2 is connected if (cur.ptr() == net2) { - return true; + return true; } // Next net in linked list @@ -2002,6 +2010,7 @@ vpip_routines_s vpi_routines = { .chk_error = vpi_chk_error, .compare_objects = vpi_compare_objects, .free_object = vpi_free_object, + .release_handle = vpi_release_handle, .get_vlog_info = vpi_get_vlog_info, .vcontrol = vpi_sim_vcontrol, .fopen = vpi_fopen, diff --git a/vvp/vvp.def b/vvp/vvp.def index 7e7da212c..cbc478bbb 100644 --- a/vvp/vvp.def +++ b/vvp/vvp.def @@ -32,6 +32,7 @@ vpi_put_userdata vpi_put_value vpi_register_cb vpi_register_systf +vpi_release_handle vpi_remove_cb vpi_scan vpi_sim_control