From 24da00bd5ac620bc01d0a755503e14cec57a3121 Mon Sep 17 00:00:00 2001 From: Stephen Williams Date: Wed, 11 Jun 2008 21:28:21 -0700 Subject: [PATCH] Add value change callback for vpiPartSelect. The __vpiPV objects express themselves as vpiPartSelect objects. Add support for value change callbacks by attaching the callback to the signal that we part select from. --- vpi/sys_display.c | 1 + vvp/vpi_callback.cc | 4 ++++ vvp/vpi_priv.h | 4 ++++ vvp/vpi_signal.cc | 21 +++++++++++++++++++++ 4 files changed, 30 insertions(+) diff --git a/vpi/sys_display.c b/vpi/sys_display.c index 20106952e..c03da8606 100644 --- a/vpi/sys_display.c +++ b/vpi/sys_display.c @@ -1119,6 +1119,7 @@ static PLI_INT32 sys_monitor_calltf(PLI_BYTE8*name) case vpiReg: case vpiIntegerVar: case vpiRealVar: + case vpiPartSelect: /* Monitoring reg and net values involves setting a callback for value changes. Pass the storage pointer for the callback itself as user_data so diff --git a/vvp/vpi_callback.cc b/vvp/vpi_callback.cc index 0c03e27d2..931d92d39 100644 --- a/vvp/vpi_callback.cc +++ b/vvp/vpi_callback.cc @@ -164,6 +164,10 @@ static struct __vpiCallback* make_value_change(p_cb_data data) vpip_array_word_change(obj, data->obj); break; + case vpiPartSelect: + vpip_part_select_value_change(obj, data->obj); + break; + case vpiModule: case vpiConstant: case vpiParameter: diff --git a/vvp/vpi_priv.h b/vvp/vpi_priv.h index fc47fd4b8..af8927417 100644 --- a/vvp/vpi_priv.h +++ b/vvp/vpi_priv.h @@ -234,6 +234,10 @@ struct __vpiPV { extern vpiHandle vpip_make_PV(char*name, int base, int width); extern vpiHandle vpip_make_PV(char*name, int tbase, int twid, int width); +extern struct __vpiPV* vpip_PV_from_handle(vpiHandle obj); +extern void vpip_part_select_value_change(struct __vpiCallback*cbh, vpiHandle obj); + + /* * This function safely converts a vpiHandle back to a * __vpiSignal. Return a nil if the type is not appropriate. diff --git a/vvp/vpi_signal.cc b/vvp/vpi_signal.cc index e0633bef3..539d0f990 100644 --- a/vvp/vpi_signal.cc +++ b/vvp/vpi_signal.cc @@ -1146,6 +1146,14 @@ static const struct __vpirt vpip_PV_rt = { 0 }; +struct __vpiPV* vpip_PV_from_handle(vpiHandle obj) +{ + if (obj->vpi_type->type_code == vpiPartSelect) + return (__vpiPV*) obj; + else + return 0; +} + vpiHandle vpip_make_PV(char*var, int base, int width) { @@ -1174,3 +1182,16 @@ vpiHandle vpip_make_PV(char*var, int tbase, int twid, int width) return &obj->base; } + +void vpip_part_select_value_change(struct __vpiCallback*cbh, vpiHandle ref) +{ + struct __vpiPV*obj = vpip_PV_from_handle(ref); + assert(obj); + + vvp_fun_signal_base*sig_fun; + sig_fun = dynamic_cast(obj->net->fun); + assert(sig_fun); + + /* Attach the __vpiCallback object to the signal. */ + sig_fun->add_vpi_callback(cbh); +}