diff --git a/vvp/delay.cc b/vvp/delay.cc index 6a10f5e6d..37432137d 100644 --- a/vvp/delay.cc +++ b/vvp/delay.cc @@ -17,10 +17,11 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: delay.cc,v 1.4 2005/04/03 05:45:51 steve Exp $" +#ident "$Id: delay.cc,v 1.5 2005/05/14 19:43:23 steve Exp $" #endif #include "delay.h" +#include "schedule.h" #include #include #include @@ -91,8 +92,42 @@ vvp_time64_t vvp_delay_t::get_delay(vvp_bit4_t from, vvp_bit4_t to) return 0; } +vvp_fun_delay::vvp_fun_delay(vvp_bit4_t init, const vvp_delay_t&d) +: delay_(d), cur_(1) +{ + cur_.set_bit(0, init); +} + +vvp_fun_delay::~vvp_fun_delay() +{ +} + +/* + * FIXME: This implementation currently only uses the LSB to determine + * the delay type for the entire vector. It needs to be upgraded to + * account for different delays for different bits by generating a + * stream of vectors that lead up to the actual value. + */ +void vvp_fun_delay::recv_vec4(vvp_net_ptr_t port, vvp_vector4_t bit) +{ + if (cur_.eeq(bit)) + return; + + vvp_time64_t use_delay; + use_delay = delay_.get_delay(cur_.value(0), bit.value(0)); + + cur_ = bit; + if (use_delay == 0) + vvp_send_vec4(port.ptr()->out, cur_); + else + schedule_assign_vector(port.ptr()->out, cur_, use_delay); +} + /* * $Log: delay.cc,v $ + * Revision 1.5 2005/05/14 19:43:23 steve + * Move functor delays to vvp_delay_fun object. + * * Revision 1.4 2005/04/03 05:45:51 steve * Rework the vvp_delay_t class. * diff --git a/vvp/delay.h b/vvp/delay.h index 8356e0f98..a08cc5ff7 100644 --- a/vvp/delay.h +++ b/vvp/delay.h @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: delay.h,v 1.5 2005/04/03 05:45:51 steve Exp $" +#ident "$Id: delay.h,v 1.6 2005/05/14 19:43:23 steve Exp $" #endif /* @@ -46,8 +46,31 @@ class vvp_delay_t { vvp_time64_t min_delay_; }; +/* vvp_fun_delay + * This is a lighter weight version of vvp_fun_drive, that only + * carries delays. The output that it propagates is vvp_vector4_t so + * drive strengths are lost, but then again it doesn't go through the + * effort of calculating strength values either. + */ +class vvp_fun_delay : public vvp_net_fun_t { + + public: + vvp_fun_delay(vvp_bit4_t init, const vvp_delay_t&d); + ~vvp_fun_delay(); + + void recv_vec4(vvp_net_ptr_t port, vvp_vector4_t bit); + //void recv_long(vvp_net_ptr_t port, long bit); + + private: + vvp_delay_t delay_; + vvp_vector4_t cur_; +}; + /* * $Log: delay.h,v $ + * Revision 1.6 2005/05/14 19:43:23 steve + * Move functor delays to vvp_delay_fun object. + * * Revision 1.5 2005/04/03 05:45:51 steve * Rework the vvp_delay_t class. * diff --git a/vvp/logic.cc b/vvp/logic.cc index 8623f1188..926be8bfd 100644 --- a/vvp/logic.cc +++ b/vvp/logic.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: logic.cc,v 1.22 2005/05/13 05:13:12 steve Exp $" +#ident "$Id: logic.cc,v 1.23 2005/05/14 19:43:23 steve Exp $" #endif # include "logic.h" @@ -110,8 +110,7 @@ void vvp_fun_and::recv_vec4(vvp_net_ptr_t ptr, vvp_vector4_t bit) vvp_send_vec4(ptr.ptr()->out, result); } -vvp_fun_buf::vvp_fun_buf(vvp_time64_t del) -: delay_(del) +vvp_fun_buf::vvp_fun_buf() { count_functors_table += 1; } @@ -130,14 +129,10 @@ void vvp_fun_buf::recv_vec4(vvp_net_ptr_t ptr, vvp_vector4_t bit) bit.set_bit(idx, BIT4_X); } - if (delay_ > 0) - schedule_assign_vector(ptr.ptr()->out, bit, delay_); - else - vvp_send_vec4(ptr.ptr()->out, bit); + vvp_send_vec4(ptr.ptr()->out, bit); } -vvp_fun_bufz::vvp_fun_bufz(vvp_time64_t del) -: delay_(del) +vvp_fun_bufz::vvp_fun_bufz() { count_functors_table += 1; } @@ -151,10 +146,7 @@ void vvp_fun_bufz::recv_vec4(vvp_net_ptr_t ptr, vvp_vector4_t bit) if (ptr.port() != 0) return; - if (delay_ > 0) - schedule_assign_vector(ptr.ptr()->out, bit, delay_); - else - vvp_send_vec4(ptr.ptr()->out, bit); + vvp_send_vec4(ptr.ptr()->out, bit); } vvp_fun_muxz::vvp_fun_muxz() @@ -240,8 +232,6 @@ void compile_functor(char*label, char*type, vvp_net_fun_t* obj = 0; bool strength_aware = false; - vvp_time64_t delay64 = delay? delay->get_delay(BIT4_0,BIT4_1) : 0; - if (strcmp(type, "OR") == 0) { obj = new table_functor_s(ft_OR); @@ -249,7 +239,7 @@ void compile_functor(char*label, char*type, obj = new vvp_fun_and(); } else if (strcmp(type, "BUF") == 0) { - obj = new vvp_fun_buf(delay64); + obj = new vvp_fun_buf(); } else if (strcmp(type, "BUFIF0") == 0) { obj = new vvp_fun_bufif(true,false, ostr0, ostr1); @@ -260,7 +250,7 @@ void compile_functor(char*label, char*type, strength_aware = true; } else if (strcmp(type, "BUFZ") == 0) { - obj = new vvp_fun_bufz(delay64); + obj = new vvp_fun_bufz(); #if 0 } else if (strcmp(type, "PMOS") == 0) { obj = new vvp_pmos_s; @@ -324,13 +314,19 @@ void compile_functor(char*label, char*type, /* If both the strengths are the default strong drive, then there is no need for a specialized driver. Attach the label to this node and we are finished. */ - if (strength_aware || ostr0 == 6 && ostr1 == 6) { + if (strength_aware || ostr0 == 6 && ostr1 == 6 && delay == 0) { define_functor_symbol(label, net); free(label); return; } - vvp_fun_drive*obj_drv = new vvp_fun_drive(BIT4_X, ostr0, ostr1); + vvp_net_fun_t*obj_drv; + + if (ostr0 == 6 && ostr1 == 6 && delay != 0) { + obj_drv = new vvp_fun_delay(BIT4_X, *delay); + } else { + obj_drv = new vvp_fun_drive(BIT4_X, ostr0, ostr1); + } vvp_net_t*net_drv = new vvp_net_t; net_drv->fun = obj_drv; @@ -348,6 +344,9 @@ void compile_functor(char*label, char*type, /* * $Log: logic.cc,v $ + * Revision 1.23 2005/05/14 19:43:23 steve + * Move functor delays to vvp_delay_fun object. + * * Revision 1.22 2005/05/13 05:13:12 steve * Give buffers support for simple delays. * diff --git a/vvp/logic.h b/vvp/logic.h index e40d0a43b..67f053b19 100644 --- a/vvp/logic.h +++ b/vvp/logic.h @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: logic.h,v 1.15 2005/05/13 05:13:12 steve Exp $" +#ident "$Id: logic.h,v 1.16 2005/05/14 19:43:23 steve Exp $" #endif # include "vvp_net.h" @@ -72,13 +72,12 @@ class vvp_fun_and : public vvp_fun_boolean_ { class vvp_fun_buf: public vvp_net_fun_t { public: - explicit vvp_fun_buf(vvp_time64_t del); + explicit vvp_fun_buf(); virtual ~vvp_fun_buf(); void recv_vec4(vvp_net_ptr_t p, vvp_vector4_t bit); private: - vvp_time64_t delay_; }; /* @@ -88,13 +87,12 @@ class vvp_fun_buf: public vvp_net_fun_t { class vvp_fun_bufz: public vvp_net_fun_t { public: - explicit vvp_fun_bufz(vvp_time64_t delay); + explicit vvp_fun_bufz(); virtual ~vvp_fun_bufz(); void recv_vec4(vvp_net_ptr_t p, vvp_vector4_t bit); private: - vvp_time64_t delay_; }; /* @@ -140,6 +138,9 @@ extern const unsigned char ft_var[]; /* * $Log: logic.h,v $ + * Revision 1.16 2005/05/14 19:43:23 steve + * Move functor delays to vvp_delay_fun object. + * * Revision 1.15 2005/05/13 05:13:12 steve * Give buffers support for simple delays. *