Fix memory leak and add vpi_release_handle()

This commit is contained in:
mole99 2023-09-04 15:20:31 +02:00
parent 18f6dcb6ba
commit d7c6d7ce76
6 changed files with 23 additions and 1 deletions

View File

@ -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);

View File

@ -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;
}
}

View File

@ -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;

View File

@ -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*);

View File

@ -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,

View File

@ -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