diff --git a/vpi/sys_vcd.c b/vpi/sys_vcd.c index 091d4aa89..8ab74cbf3 100644 --- a/vpi/sys_vcd.c +++ b/vpi/sys_vcd.c @@ -245,6 +245,7 @@ static PLI_INT32 dumpvars_cb(p_cb_data cause) static PLI_INT32 finish_cb(p_cb_data cause) { + struct vcd_info *cur, *next; if (finish_status != 0) return 0; @@ -257,6 +258,12 @@ static PLI_INT32 finish_cb(p_cb_data cause) } fclose(dump_file); + + for (cur = vcd_list ; cur ; cur = next) { + next = cur->next; + free(cur->ident); + free(cur); + } vcd_names_delete(&vcd_tab); vcd_names_delete(&vcd_var); nexus_ident_delete(); diff --git a/vvp/array.cc b/vvp/array.cc index 918177259..f29bc2d39 100644 --- a/vvp/array.cc +++ b/vvp/array.cc @@ -1556,6 +1556,21 @@ void memory_delete(vpiHandle item) void A_delete(vpiHandle item) { struct __vpiArrayVthrA*obj = (struct __vpiArrayVthrA*) item; + if (obj->address_handle) { + switch (obj->address_handle->vpi_type->type_code) { + case vpiMemoryWord: + if (vpi_get(_vpiFromThr, obj->address_handle) == _vpi_at_A) { + A_delete(obj->address_handle); + } + break; + case vpiPartSelect: + assert(vpi_get(_vpiFromThr, obj->address_handle) == + _vpi_at_PV); + PV_delete(obj->address_handle); + break; + } + } + free(obj); } #endif diff --git a/vvp/vpi_signal.cc b/vvp/vpi_signal.cc index 3944438d6..d48c48a6d 100644 --- a/vvp/vpi_signal.cc +++ b/vvp/vpi_signal.cc @@ -1292,6 +1292,19 @@ void vpip_part_select_value_change(struct __vpiCallback*cbh, vpiHandle ref) void PV_delete(vpiHandle item) { struct __vpiPV *obj = (__vpiPV *) item; + if (obj->sbase) { + switch (obj->sbase->vpi_type->type_code) { + case vpiMemoryWord: + if (vpi_get(_vpiFromThr, obj->sbase) == _vpi_at_A) { + A_delete(obj->sbase); + } + break; + case vpiPartSelect: + assert(vpi_get(_vpiFromThr, obj->sbase) == _vpi_at_PV); + PV_delete(obj->sbase); + break; + } + } vvp_fun_signal_base*sig_fun; sig_fun = (vvp_fun_signal_base*) obj->net->fun; sig_fun->clear_all_callbacks(); diff --git a/vvp/vpi_tasks.cc b/vvp/vpi_tasks.cc index 8614a7787..245c95575 100644 --- a/vvp/vpi_tasks.cc +++ b/vvp/vpi_tasks.cc @@ -653,7 +653,7 @@ void vpi_call_delete(vpiHandle item) thread_word_delete(obj->args[arg]); break; default: - assert(0);; + assert(0); } break; case vpiMemoryWord: