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
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT)
|
#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
|
#endif
|
||||||
|
|
||||||
# include "pointers.h"
|
# include "pointers.h"
|
||||||
|
|
@ -152,6 +152,8 @@ struct functor_s {
|
||||||
union {
|
union {
|
||||||
unsigned char old_ival; // mode 3
|
unsigned char old_ival; // mode 3
|
||||||
};
|
};
|
||||||
|
/* Which signal are we representing */
|
||||||
|
struct __vpiSignal *sig;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct functor_s *functor_t;
|
typedef struct functor_s *functor_t;
|
||||||
|
|
@ -295,6 +297,9 @@ extern const unsigned char ft_var[];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: functor.h,v $
|
* $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
|
* Revision 1.26 2001/06/21 22:54:12 steve
|
||||||
* Support cbValueChange callbacks.
|
* Support cbValueChange callbacks.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT)
|
#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
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -47,6 +47,39 @@ const struct __vpirt callback_rt = {
|
||||||
0
|
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
|
* A value change callback is tripped when a bit of a signal
|
||||||
* changes. This function creates that value change callback and
|
* 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)
|
static struct __vpiCallback* make_value_change(p_cb_data data)
|
||||||
{
|
{
|
||||||
struct __vpiCallback*obj = new __vpiCallback;
|
struct __vpiCallback*obj = new_vpi_callback();
|
||||||
obj->base.vpi_type = &callback_rt;
|
|
||||||
obj->cb_data = *data;
|
obj->cb_data = *data;
|
||||||
obj->cb_time = *(data->time);
|
obj->cb_time = *(data->time);
|
||||||
obj->cb_data.time = &obj->cb_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.time->high = 0;
|
||||||
(cur->cb_data.cb_rtn)(&cur->cb_data);
|
(cur->cb_data.cb_rtn)(&cur->cb_data);
|
||||||
|
|
||||||
delete cur;
|
free_vpi_callback(cur);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct __vpiCallback* make_sync(p_cb_data data)
|
static struct __vpiCallback* make_sync(p_cb_data data)
|
||||||
{
|
{
|
||||||
struct __vpiCallback*obj = new __vpiCallback;
|
struct __vpiCallback*obj = new_vpi_callback();
|
||||||
obj->base.vpi_type = &callback_rt;
|
|
||||||
obj->cb_data = *data;
|
obj->cb_data = *data;
|
||||||
obj->cb_time = *(data->time);
|
obj->cb_time = *(data->time);
|
||||||
obj->cb_data.time = &obj->cb_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->low = schedule_simtime();
|
||||||
cur->cb_data.time->high = 0;
|
cur->cb_data.time->high = 0;
|
||||||
(cur->cb_data.cb_rtn)(&cur->cb_data);
|
(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 $
|
* $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
|
* Revision 1.3 2001/07/11 02:27:21 steve
|
||||||
* Add support for REadOnlySync and monitors.
|
* Add support for REadOnlySync and monitors.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT)
|
#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
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -374,64 +374,10 @@ static vpiHandle signal_put_value(vpiHandle ref, s_vpi_value*vp,
|
||||||
return ref;
|
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* vpip_sig_from_ptr(vvp_ipoint_t ptr)
|
||||||
{
|
{
|
||||||
struct __vpiSignal*cur = by_bits_root;
|
functor_t fu = functor_index(ptr);
|
||||||
|
return fu->sig;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct __vpirt vpip_reg_rt = {
|
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,
|
* Construct a vpiReg object. It's like a net, except for the type.
|
||||||
* and point to the specified functor for the lsb.
|
|
||||||
*/
|
*/
|
||||||
vpiHandle vpip_make_reg(char*name, int msb, int lsb, bool signed_flag,
|
vpiHandle vpip_make_reg(char*name, int msb, int lsb, bool signed_flag,
|
||||||
vvp_ipoint_t base)
|
vvp_ipoint_t base)
|
||||||
{
|
{
|
||||||
struct __vpiSignal*obj = (struct __vpiSignal*)
|
vpiHandle obj = vpip_make_net(name, msb,lsb, signed_flag, base);
|
||||||
malloc(sizeof(struct __vpiSignal));
|
obj->vpi_type = &vpip_reg_rt;
|
||||||
obj->base.vpi_type = &vpip_reg_rt;
|
return obj;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 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.
|
* and point to the specified functor for the lsb.
|
||||||
*/
|
*/
|
||||||
vpiHandle vpip_make_net(char*name, int msb, int lsb, bool signed_flag,
|
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->signed_flag = signed_flag? 1 : 0;
|
||||||
obj->bits = base;
|
obj->bits = base;
|
||||||
obj->callbacks = 0;
|
obj->callbacks = 0;
|
||||||
obj->by_bits[0] = 0;
|
|
||||||
obj->by_bits[1] = 0;
|
|
||||||
|
|
||||||
obj->scope = vpip_peek_current_scope();
|
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;
|
return &obj->base;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: vpi_signal.cc,v $
|
* $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
|
* Revision 1.18 2001/06/29 00:44:56 steve
|
||||||
* Properly support signal full names.
|
* Properly support signal full names.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue