diff --git a/vvp/logic.cc b/vvp/logic.cc index c42673b4b..617f11215 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.24 2005/06/02 16:02:11 steve Exp $" +#ident "$Id: logic.cc,v 1.25 2005/06/12 00:44:49 steve Exp $" #endif # include "logic.h" @@ -260,12 +260,6 @@ void compile_functor(char*label, char*type, } else if (strcmp(type, "BUFZ") == 0) { obj = new vvp_fun_bufz(); #if 0 - } else if (strcmp(type, "PMOS") == 0) { - obj = new vvp_pmos_s; - - } else if (strcmp(type, "NMOS") == 0) { - obj= new vvp_nmos_s; - } else if (strcmp(type, "RPMOS") == 0) { obj = new vvp_rpmos_s; @@ -278,6 +272,12 @@ void compile_functor(char*label, char*type, } else if (strcmp(type, "MUXZ") == 0) { obj = new vvp_fun_muxz(); + } else if (strcmp(type, "NMOS") == 0) { + obj = new vvp_fun_pmos(true); + + } else if (strcmp(type, "PMOS") == 0) { + obj = new vvp_fun_pmos(false); + } else if (strcmp(type, "EEQ") == 0) { obj = new table_functor_s(ft_EEQ); @@ -346,6 +346,9 @@ void compile_functor(char*label, char*type, /* * $Log: logic.cc,v $ + * Revision 1.25 2005/06/12 00:44:49 steve + * Implement nmos and pmos devices. + * * Revision 1.24 2005/06/02 16:02:11 steve * Add support for notif0/1 gates. * Make delay nodes support inertial delay. diff --git a/vvp/npmos.cc b/vvp/npmos.cc index 2b170d9fe..3169098e9 100644 --- a/vvp/npmos.cc +++ b/vvp/npmos.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001 Stephen Williams (steve@icarus.com) + * Copyright (c) 2005 Stephen Williams (steve@icarus.com) * * This source code is free software; you can redistribute it * and/or modify it in source code form under the terms of the GNU @@ -17,119 +17,85 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: npmos.cc,v 1.10 2005/04/28 04:59:53 steve Exp $" +#ident "$Id: npmos.cc,v 1.11 2005/06/12 00:44:49 steve Exp $" #endif # include "npmos.h" -# include "schedule.h" -void vvp_pmos_s::set(vvp_ipoint_t ptr, bool push, unsigned v, unsigned s) +vvp_fun_pmos::vvp_fun_pmos(bool enable_invert) { -#if 0 - put(ptr, v); + inv_en_ = enable_invert; +} - unsigned pp = ipoint_port(ptr); - if (pp == 0) { - - /* from IEEE 1384-1995 Table 7-8 */ - static const unsigned char rmos_table[8] - = { 0, 1, 1, 2, 2, 3, 5, 5 }; - /* just reduce SUPPLY to STRONG */ - static const unsigned char mos_table[8] - = { 0, 1, 2, 3, 4, 5, 6, 6 }; - - const unsigned char *table = res ? rmos_table : mos_table; - - unsigned vals = s & 0x88; - unsigned s1 = table[s & 0x7]; - unsigned s2 = table[(s & 0x70) >> 4]; - - istr = vals | s1 | (s2 << 4); +void vvp_fun_pmos::recv_vec4(vvp_net_ptr_t ptr, vvp_vector4_t bit) +{ + /* Data input is processed throught eh recv_vec8 method, + because the strength most be preserved. */ + if (ptr.port() == 0) { + vvp_vector8_t tmp = bit; + recv_vec8(ptr, tmp); + return; } - unsigned in0 = ival & 0x03; - unsigned in1 = (ival >> 2) & 0x03; + if (ptr.port() != 1) + return; - unsigned char outH = 0x88 | ((istr & 7)<<4) | (0); - unsigned char outL = 0x00 | ((istr & 7)<<0) | (0); - unsigned char outX = 0x80 | (istr & 7) | (istr & 0x70); + en_ = inv_en_? ~bit : bit; + generate_output_(ptr); +} - in1 ^= pol; +void vvp_fun_pmos::recv_vec8(vvp_net_ptr_t ptr, vvp_vector8_t bit) +{ + if (ptr.port() == 1) { + recv_vec4(ptr, reduce4(bit)); + return; + } - unsigned char val; - unsigned char str; + if (ptr.port() != 0) + return; - if (in1 == 0) { - // gate on; output follows input - val = in0; - str = istr; - } else if (in0 == 3) { - val = 3; - str = HiZ; - } else if (in1 == 2 || in1 == 3) { - // gate X or Z; output is undefined - val = 2; - switch (in0) { - case 0: - str = outL; + bit_ = bit; + generate_output_(ptr); +} + +void vvp_fun_pmos::generate_output_(vvp_net_ptr_t ptr) +{ + vvp_vector8_t out (bit_.size()); + + for (unsigned idx = 0 ; idx < out.size() ; idx += 1) { + vvp_bit4_t b_en = en_.value(idx); + vvp_scalar_t b_bit = bit_.value(idx); + + switch (b_en) { + case BIT4_0: + out.set_bit(idx, b_bit); break; - case 1: - str = outH; + case BIT4_1: + out.set_bit(idx, vvp_scalar_t(BIT4_Z,0,0)); break; default: - str = outX; + switch (b_bit.value()) { + case BIT4_0: + b_bit = vvp_scalar_t(BIT4_X,b_bit.strength0(),0); + break; + case BIT4_1: + b_bit = vvp_scalar_t(BIT4_X,0,b_bit.strength1()); + break; + default: + break; + } + out.set_bit(idx, b_bit); break; } - } else { - // gate off; output is high impedance - val = 3; - str = HiZ; } - put_ostr(val, str, push); -#else - assert(0); // not implemented. -#endif + vvp_send_vec8(ptr.ptr()->out, out); } /* * $Log: npmos.cc,v $ - * Revision 1.10 2005/04/28 04:59:53 steve - * Remove dead functor code. - * - * Revision 1.9 2004/10/04 01:10:59 steve - * Clean up spurious trailing white space. - * - * Revision 1.8 2002/08/12 01:35:08 steve - * conditional ident string using autoconfig. - * - * Revision 1.7 2001/12/06 03:31:24 steve - * Support functor delays for gates and UDP devices. - * (Stephan Boettcher) - * - * Revision 1.6 2001/11/07 03:34:42 steve - * Use functor pointers where vvp_ipoint_t is unneeded. - * - * Revision 1.5 2001/10/31 04:27:47 steve - * Rewrite the functor type to have fewer functor modes, - * and use objects to manage the different types. - * (Stephan Boettcher) - * - * Revision 1.4 2001/10/24 03:18:52 steve - * npmos outputs have 3bit strengths, not 2. - * - * Revision 1.3 2001/10/18 17:30:26 steve - * Support rnpmos devices. (Philip Blundell) - * - * Revision 1.2 2001/10/11 18:20:51 steve - * npmos devices pass strength. - * - * Revision 1.1 2001/10/09 02:28:17 steve - * Add the PMOS and NMOS functor types. - * - * Revision 1.1 2001/05/31 04:12:43 steve - * Make the bufif0 and bufif1 gates strength aware, - * and accurately propagate strengths of outputs. + * Revision 1.11 2005/06/12 00:44:49 steve + * Implement nmos and pmos devices. * */ diff --git a/vvp/npmos.h b/vvp/npmos.h index 546cbb017..57c3894dc 100644 --- a/vvp/npmos.h +++ b/vvp/npmos.h @@ -1,7 +1,7 @@ #ifndef __npmos_H #define __npmos_H /* - * Copyright (c) 2001 Stephen Williams (steve@icarus.com) + * Copyright (c) 2005 Stephen Williams (steve@icarus.com) * * This source code is free software; you can redistribute it * and/or modify it in source code form under the terms of the GNU @@ -19,62 +19,53 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: npmos.h,v 1.5 2004/10/04 01:10:59 steve Exp $" +#ident "$Id: npmos.h,v 1.6 2005/06/12 00:44:49 steve Exp $" #endif -# include "functor.h" +# include "vvp_net.h" -class vvp_pmos_s : public functor_s { +/* + * The vvp_fun_pmos functor is similar to the vvp_fun_bufif. The + * principle difference is that it has no drive of its own, instead + * taking drive strength from its data input. In other words, it is + * not a buffer but a uni-directional switch. + * + * The truth table for the PMOS device is: + * + * Q = D C (D is port0, C is port1) + * ------- + * 0 | 0 0 + * Z | 0 1 + * L | 0 x + * 1 | 1 0 + * Z | 1 1 + * H | 1 x + * + * This class also implements the NMOS device, which is the same as + * the PMOS device, but the Control input inverted. The enable_invert + * flag to the costructor activates this invertion. + */ + +class vvp_fun_pmos : public vvp_net_fun_t { public: - vvp_pmos_s() : istr(StX), pol(0), res(0) {} - virtual void set(vvp_ipoint_t i, bool push, unsigned val, unsigned str); + explicit vvp_fun_pmos(bool enable_invert); - protected: - unsigned char istr; - unsigned pol : 1; - unsigned res : 1; -}; + void recv_vec4(vvp_net_ptr_t port, vvp_vector4_t bit); + void recv_vec8(vvp_net_ptr_t port, vvp_vector8_t bit); -class vvp_nmos_s : public vvp_pmos_s { + private: + void generate_output_(vvp_net_ptr_t port); - public: - vvp_nmos_s() { pol = 1; res = 0; } -}; - -class vvp_rpmos_s : public vvp_pmos_s { - - public: - vvp_rpmos_s() { pol = 0; res = 1; } -}; - -class vvp_rnmos_s : public vvp_pmos_s { - - public: - vvp_rnmos_s() { pol = 1; res = 1; } + vvp_vector8_t bit_; + vvp_vector4_t en_; + bool inv_en_; }; /* * $Log: npmos.h,v $ - * Revision 1.5 2004/10/04 01:10:59 steve - * Clean up spurious trailing white space. - * - * Revision 1.4 2002/08/12 01:35:08 steve - * conditional ident string using autoconfig. - * - * Revision 1.3 2001/10/31 04:27:47 steve - * Rewrite the functor type to have fewer functor modes, - * and use objects to manage the different types. - * (Stephan Boettcher) - * - * Revision 1.2 2001/10/18 17:30:26 steve - * Support rnpmos devices. (Philip Blundell) - * Revision 1.1 2001/10/09 02:28:17 steve Add the - * PMOS and NMOS functor types. - * - * Revision 1.1 2001/05/31 04:12:43 steve - * Make the bufif0 and bufif1 gates strength aware, - * and accurately propagate strengths of outputs. + * Revision 1.6 2005/06/12 00:44:49 steve + * Implement nmos and pmos devices. * */ #endif diff --git a/vvp/vvp_net.h b/vvp/vvp_net.h index 54d3f0e3b..eccb68637 100644 --- a/vvp/vvp_net.h +++ b/vvp/vvp_net.h @@ -18,7 +18,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ -#ident "$Id: vvp_net.h,v 1.29 2005/06/02 16:02:11 steve Exp $" +#ident "$Id: vvp_net.h,v 1.30 2005/06/12 00:44:49 steve Exp $" # include "config.h" # include @@ -211,14 +211,16 @@ extern ostream& operator<< (ostream&, vvp_scalar_t); * * a vvp_vector8_t object can be created from a vvp_vector4_t and a * strength value. The vvp_vector8_t bits have the values of the input - * vector, all with the strength specified. + * vector, all with the strength specified. If no strength is + * specified, then the conversion from bit4 to a scalar will use the + * Verilog convention default of strong (6). */ class vvp_vector8_t { public: explicit vvp_vector8_t(unsigned size =0); // Make a vvp_vector8_t from a vector4 and a specified strength. - explicit vvp_vector8_t(const vvp_vector4_t&that, unsigned str); + vvp_vector8_t(const vvp_vector4_t&that, unsigned str =6); explicit vvp_vector8_t(const vvp_vector4_t&that, unsigned str0, unsigned str1); @@ -744,6 +746,9 @@ class vvp_wide_fun_t : public vvp_net_fun_t { /* * $Log: vvp_net.h,v $ + * Revision 1.30 2005/06/12 00:44:49 steve + * Implement nmos and pmos devices. + * * Revision 1.29 2005/06/02 16:02:11 steve * Add support for notif0/1 gates. * Make delay nodes support inertial delay.