From 90fbac6e3375b212f014595094271bfe9b355c48 Mon Sep 17 00:00:00 2001 From: Cary R Date: Thu, 4 Sep 2008 20:19:07 -0700 Subject: [PATCH] Add callbacks to vpiMemory objects. This patch adds the ability to set a global array callback. These type of callbacks will be called when any element of the array changes. --- vvp/array.cc | 19 +++++++++++++++++-- vvp/array.h | 1 + vvp/vpi_callback.cc | 4 ++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/vvp/array.cc b/vvp/array.cc index 41fa517aa..8ff092ade 100644 --- a/vvp/array.cc +++ b/vvp/array.cc @@ -977,12 +977,18 @@ void array_word_change(vvp_array_t array, unsigned long addr) struct __vpiCallback*cur = next; next = cur->next; - // Skip callbacks for callbacks not for me. - if (cur->extra_data != (long)addr) { + // Skip callbacks that are not for me. -1 is for every element. + if (cur->extra_data != (long)addr && cur->extra_data != -1) { prev = cur; continue; } + // For whole array callbacks we need to set the index. + if (cur->extra_data == -1) { + cur->cb_data.index = (PLI_INT32) ((int)addr + + array->first_addr.value); + } + if (cur->cb_data.cb_rtn != 0) { if (cur->cb_data.value) vpip_vec4_get_value(array->vals->get_word(addr), @@ -1058,6 +1064,15 @@ void vpip_array_word_change(struct __vpiCallback*cb, vpiHandle obj) parent->vpi_callbacks = cb; } +void vpip_array_change(struct __vpiCallback*cb, vpiHandle obj) +{ + + struct __vpiArray*arr = ARRAY_HANDLE(obj); + cb->extra_data = -1; // This is a callback for every element. + cb->next = arr->vpi_callbacks; + arr->vpi_callbacks = cb; +} + void compile_array_port(char*label, char*array, char*addr) { array_port_resolv_list_t*resolv_mem diff --git a/vvp/array.h b/vvp/array.h index d3f79378a..1407fee76 100644 --- a/vvp/array.h +++ b/vvp/array.h @@ -48,6 +48,7 @@ extern vvp_vector4_t array_get_word(vvp_array_t array, unsigned address); /* VPI hooks */ extern void vpip_array_word_change(struct __vpiCallback*cb, vpiHandle word); +extern void vpip_array_change(struct __vpiCallback*cb, vpiHandle word); /* Compile hooks */ extern void compile_variablew(char*label, vvp_array_t array, diff --git a/vvp/vpi_callback.cc b/vvp/vpi_callback.cc index 6607cbcf2..a422399fa 100644 --- a/vvp/vpi_callback.cc +++ b/vvp/vpi_callback.cc @@ -170,6 +170,10 @@ static struct __vpiCallback* make_value_change(p_cb_data data) vpip_array_word_change(obj, data->obj); break; + case vpiMemory: + vpip_array_change(obj, data->obj); + break; + case vpiPartSelect: vpip_part_select_value_change(obj, data->obj); break;