From a7328ecce1fbab961ec5e80c4585ee76fddad6f5 Mon Sep 17 00:00:00 2001 From: steve Date: Fri, 13 Jul 2001 03:02:34 +0000 Subject: [PATCH] Rewire signal callback support for fast lookup. (Stephan Boettcher) --- vvp/functor.h | 7 ++- vvp/vpi_callback.cc | 48 ++++++++++++++++++--- vvp/vpi_signal.cc | 102 +++++++++----------------------------------- 3 files changed, 67 insertions(+), 90 deletions(-) diff --git a/vvp/functor.h b/vvp/functor.h index 38b5791a6..5ce4f18f3 100644 --- a/vvp/functor.h +++ b/vvp/functor.h @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: functor.h,v 1.26 2001/06/21 22:54:12 steve Exp $" +#ident "$Id: functor.h,v 1.27 2001/07/13 03:02:34 steve Exp $" #endif # include "pointers.h" @@ -152,6 +152,8 @@ struct functor_s { union { unsigned char old_ival; // mode 3 }; + /* Which signal are we representing */ + struct __vpiSignal *sig; }; typedef struct functor_s *functor_t; @@ -295,6 +297,9 @@ extern const unsigned char ft_var[]; /* * $Log: functor.h,v $ + * Revision 1.27 2001/07/13 03:02:34 steve + * Rewire signal callback support for fast lookup. (Stephan Boettcher) + * * Revision 1.26 2001/06/21 22:54:12 steve * Support cbValueChange callbacks. * diff --git a/vvp/vpi_callback.cc b/vvp/vpi_callback.cc index 18ec7cdb2..8160a379c 100644 --- a/vvp/vpi_callback.cc +++ b/vvp/vpi_callback.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: vpi_callback.cc,v 1.3 2001/07/11 02:27:21 steve Exp $" +#ident "$Id: vpi_callback.cc,v 1.4 2001/07/13 03:02:34 steve Exp $" #endif /* @@ -47,6 +47,39 @@ const struct __vpirt callback_rt = { 0 }; +static struct __vpiCallback* free_callback_root = 0x0; + +inline static struct __vpiCallback* new_vpi_callback() +{ + struct __vpiCallback* obj; + if (!free_callback_root) { + obj = new __vpiCallback; + obj->base.vpi_type = &callback_rt; + } else { + obj = free_callback_root; + free_callback_root = obj->next; + } + obj->next = 0x0; + return obj; +} + +#if 1 + +inline static void free_vpi_callback(struct __vpiCallback* obj) +{ + obj->next = free_callback_root; + free_callback_root = obj; +} + +#else + +inline static void free_vpi_callback(struct __vpiCallback* obj) +{ + delete obj; +} + +#endif + /* * A value change callback is tripped when a bit of a signal * changes. This function creates that value change callback and @@ -55,8 +88,7 @@ const struct __vpirt callback_rt = { */ static struct __vpiCallback* make_value_change(p_cb_data data) { - struct __vpiCallback*obj = new __vpiCallback; - obj->base.vpi_type = &callback_rt; + struct __vpiCallback*obj = new_vpi_callback(); obj->cb_data = *data; obj->cb_time = *(data->time); obj->cb_data.time = &obj->cb_time; @@ -101,13 +133,12 @@ static void make_sync_run(vvp_gen_event_t obj, unsigned char) cur->cb_data.time->high = 0; (cur->cb_data.cb_rtn)(&cur->cb_data); - delete cur; + free_vpi_callback(cur); } static struct __vpiCallback* make_sync(p_cb_data data) { - struct __vpiCallback*obj = new __vpiCallback; - obj->base.vpi_type = &callback_rt; + struct __vpiCallback*obj = new_vpi_callback(); obj->cb_data = *data; obj->cb_time = *(data->time); obj->cb_data.time = &obj->cb_time; @@ -188,7 +219,7 @@ void vpip_trip_functor_callbacks(vvp_ipoint_t ptr) cur->cb_data.time->low = schedule_simtime(); cur->cb_data.time->high = 0; (cur->cb_data.cb_rtn)(&cur->cb_data); - delete cur; + free_vpi_callback(cur); } } @@ -199,6 +230,9 @@ void vpip_trip_monitor_callbacks(void) /* * $Log: vpi_callback.cc,v $ + * Revision 1.4 2001/07/13 03:02:34 steve + * Rewire signal callback support for fast lookup. (Stephan Boettcher) + * * Revision 1.3 2001/07/11 02:27:21 steve * Add support for REadOnlySync and monitors. * diff --git a/vvp/vpi_signal.cc b/vvp/vpi_signal.cc index ee41f9e0c..8239fdde7 100644 --- a/vvp/vpi_signal.cc +++ b/vvp/vpi_signal.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: vpi_signal.cc,v 1.18 2001/06/29 00:44:56 steve Exp $" +#ident "$Id: vpi_signal.cc,v 1.19 2001/07/13 03:02:34 steve Exp $" #endif /* @@ -374,64 +374,10 @@ static vpiHandle signal_put_value(vpiHandle ref, s_vpi_value*vp, return ref; } - -/* - * Signals that are created for the design are kept in a table sorted - * by the functor address so that I cal look up that functor given the - * functor address. This is used by callbacks, for example. - * - * XXXX NOTE: I need to balance this tree someday. - */ -static struct __vpiSignal*by_bits_root = 0; -static void by_bits_insert(struct __vpiSignal*sig) -{ - if (by_bits_root == 0) { - by_bits_root = sig; - return; - } - - struct __vpiSignal*cur = by_bits_root; - for (;;) { - if (cur->bits > sig->bits) { - if (cur->by_bits[0] == 0) { - cur->by_bits[0] = sig; - break; - } - cur = cur->by_bits[0]; - - } else { - if (cur->by_bits[1] == 0) { - cur->by_bits[1] = sig; - break; - } - cur = cur->by_bits[1]; - } - } -} - struct __vpiSignal* vpip_sig_from_ptr(vvp_ipoint_t ptr) { - struct __vpiSignal*cur = by_bits_root; - - while (cur) { - if (ptr < cur->bits) { - cur = cur->by_bits[0]; - continue; - } - - unsigned wid = (cur->msb > cur->lsb) - ? cur->msb - cur->lsb - : cur->lsb - cur->msb; - - if (ptr > ipoint_index(cur->bits, wid)) { - cur = cur->by_bits[1]; - continue; - } - - return cur; - } - - return cur; + functor_t fu = functor_index(ptr); + return fu->sig; } static const struct __vpirt vpip_reg_rt = { @@ -455,34 +401,18 @@ static const struct __vpirt vpip_net_rt = { }; /* - * Construct a vpiReg object. Give the object specified dimensions, - * and point to the specified functor for the lsb. + * Construct a vpiReg object. It's like a net, except for the type. */ vpiHandle vpip_make_reg(char*name, int msb, int lsb, bool signed_flag, vvp_ipoint_t base) { - struct __vpiSignal*obj = (struct __vpiSignal*) - malloc(sizeof(struct __vpiSignal)); - obj->base.vpi_type = &vpip_reg_rt; - obj->name = name; - obj->msb = msb; - obj->lsb = lsb; - obj->signed_flag = signed_flag? 1 : 0; - obj->bits = base; - obj->callbacks = 0; - obj->by_bits[0] = 0; - obj->by_bits[1] = 0; - - obj->scope = vpip_peek_current_scope(); - - by_bits_insert(obj); - - return &obj->base; + vpiHandle obj = vpip_make_net(name, msb,lsb, signed_flag, base); + obj->vpi_type = &vpip_reg_rt; + return obj; } - /* - * Construct a vpiReg object. Give the object specified dimensions, + * Construct a vpiNet object. Give the object specified dimensions, * and point to the specified functor for the lsb. */ vpiHandle vpip_make_net(char*name, int msb, int lsb, bool signed_flag, @@ -497,19 +427,27 @@ vpiHandle vpip_make_net(char*name, int msb, int lsb, bool signed_flag, obj->signed_flag = signed_flag? 1 : 0; obj->bits = base; obj->callbacks = 0; - obj->by_bits[0] = 0; - obj->by_bits[1] = 0; obj->scope = vpip_peek_current_scope(); - by_bits_insert(obj); - + unsigned wid = (obj->msb > obj->lsb) + ? obj->msb - obj->lsb + 1 + : obj->lsb - obj->msb + 1; + for (unsigned i=0; ibits, i); + functor_t fu = functor_index(ii); + fu->sig = obj; + } + return &obj->base; } /* * $Log: vpi_signal.cc,v $ + * Revision 1.19 2001/07/13 03:02:34 steve + * Rewire signal callback support for fast lookup. (Stephan Boettcher) + * * Revision 1.18 2001/06/29 00:44:56 steve * Properly support signal full names. *