Rewire signal callback support for fast lookup. (Stephan Boettcher)
This commit is contained in:
parent
15a952a143
commit
a7328ecce1
|
|
@ -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.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -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; i<wid; i++) {
|
||||
vvp_ipoint_t ii = ipoint_index(obj->bits, 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.
|
||||
*
|
||||
|
|
|
|||
Loading…
Reference in New Issue