From 85d9ebded81b0edd8938b39ae4c26a64786be892 Mon Sep 17 00:00:00 2001 From: steve Date: Sat, 12 Feb 2005 22:50:52 +0000 Subject: [PATCH] Implement the vvp_fun_muxz functor. --- vvp/draw_tt.c | 8 ++++-- vvp/logic.cc | 77 +++++++++++++++++++++++++++++++++++++++++++++++++-- vvp/logic.h | 26 ++++++++++++++--- 3 files changed, 103 insertions(+), 8 deletions(-) diff --git a/vvp/draw_tt.c b/vvp/draw_tt.c index 955e689e0..ec78cee68 100644 --- a/vvp/draw_tt.c +++ b/vvp/draw_tt.c @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: draw_tt.c,v 1.18 2005/01/29 17:52:06 steve Exp $" +#ident "$Id: draw_tt.c,v 1.19 2005/02/12 22:50:52 steve Exp $" #endif # include @@ -328,6 +328,7 @@ static void draw_MUXX(void) printf("};\n"); } +#if 0 static void draw_MUXZ(void) { unsigned i0, i1, i2, i3; @@ -368,6 +369,7 @@ static void draw_MUXZ(void) printf("};\n"); } +#endif static void draw_EEQ(void) { @@ -744,7 +746,6 @@ main() draw_PMOS(); draw_NMOS(); draw_MUXX(); - draw_MUXZ(); draw_EEQ(); draw_NAND(); draw_NOR(); @@ -761,6 +762,9 @@ main() /* * $Log: draw_tt.c,v $ + * Revision 1.19 2005/02/12 22:50:52 steve + * Implement the vvp_fun_muxz functor. + * * Revision 1.18 2005/01/29 17:52:06 steve * move AND to buitin instead of table. * diff --git a/vvp/logic.cc b/vvp/logic.cc index e24c26c92..d439fbeb4 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.18 2005/02/07 22:42:42 steve Exp $" +#ident "$Id: logic.cc,v 1.19 2005/02/12 22:50:52 steve Exp $" #endif # include "logic.h" @@ -148,6 +148,76 @@ void vvp_fun_bufz::recv_vec4(vvp_net_ptr_t ptr, vvp_vector4_t bit) vvp_send_vec4(ptr.ptr()->out, bit); } +vvp_fun_muxz::vvp_fun_muxz() +{ + count_functors_table += 1; + select_ = 2; +} + +vvp_fun_muxz::~vvp_fun_muxz() +{ +} + +void vvp_fun_muxz::recv_vec4(vvp_net_ptr_t ptr, vvp_vector4_t bit) +{ + switch (ptr.port()) { + case 0: + a_ = bit; + break; + case 1: + b_ = bit; + break; + case 2: + assert(bit.size() == 1); + switch (bit.value(0)) { + case BIT4_0: + select_ = 0; + break; + case BIT4_1: + select_ = 1; + break; + default: + select_ = 2; + } + break; + default: + return; + } + + switch (select_) { + case 0: + vvp_send_vec4(ptr.ptr()->out, a_); + break; + case 1: + vvp_send_vec4(ptr.ptr()->out, b_); + break; + default: + { + unsigned min_size = a_.size(); + unsigned max_size = a_.size(); + if (b_.size() < min_size) + min_size = b_.size(); + if (b_.size() > max_size) + max_size = b_.size(); + + vvp_vector4_t res (max_size); + + for (unsigned idx = 0 ; idx < min_size ; idx += 1) { + if (a_.value(idx) == b_.value(idx)) + res.set_bit(idx, a_.value(idx)); + else + res.set_bit(idx, BIT4_X); + } + + for (unsigned idx = min_size ; idx < max_size ; idx += 1) + res.set_bit(idx, BIT4_X); + + vvp_send_vec4(ptr.ptr()->out, res); + } + break; + } +} + /* * The parser calls this function to create a logic functor. I allocate a * functor, and map the name to the vvp_ipoint_t address for the @@ -194,7 +264,7 @@ void compile_functor(char*label, char*type, obj = new table_functor_s(ft_MUXX); } else if (strcmp(type, "MUXZ") == 0) { - obj = new table_functor_s(ft_MUXZ); + obj = new vvp_fun_muxz(); } else if (strcmp(type, "EEQ") == 0) { obj = new table_functor_s(ft_EEQ); @@ -244,6 +314,9 @@ void compile_functor(char*label, char*type, /* * $Log: logic.cc,v $ + * Revision 1.19 2005/02/12 22:50:52 steve + * Implement the vvp_fun_muxz functor. + * * Revision 1.18 2005/02/07 22:42:42 steve * Add .repeat functor and BIFIF functors. * diff --git a/vvp/logic.h b/vvp/logic.h index 09a9ad155..eb6b02fd1 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.11 2005/01/29 17:52:06 steve Exp $" +#ident "$Id: logic.h,v 1.12 2005/02/12 22:50:52 steve Exp $" #endif # include "vvp_net.h" @@ -91,13 +91,28 @@ class vvp_fun_bufz: public vvp_net_fun_t { private: }; +/* + * The muxz functor is an A-B mux device, with the data inputs on + * ports 0 and 1. port 2 is the select input. + */ +class vvp_fun_muxz : public vvp_net_fun_t { + + public: + explicit vvp_fun_muxz(); + virtual ~vvp_fun_muxz(); + + void recv_vec4(vvp_net_ptr_t p, vvp_vector4_t bit); + + private: + vvp_vector4_t a_; + vvp_vector4_t b_; + int select_; +}; + // table functor types -extern const unsigned char ft_AND[]; -extern const unsigned char ft_BUF[]; extern const unsigned char ft_BUFIF0[]; extern const unsigned char ft_BUFIF1[]; -extern const unsigned char ft_BUFZ[]; extern const unsigned char ft_PMOS[]; extern const unsigned char ft_NMOS[]; extern const unsigned char ft_MUXX[]; @@ -115,6 +130,9 @@ extern const unsigned char ft_var[]; /* * $Log: logic.h,v $ + * Revision 1.12 2005/02/12 22:50:52 steve + * Implement the vvp_fun_muxz functor. + * * Revision 1.11 2005/01/29 17:52:06 steve * move AND to buitin instead of table. *