Implement nmos and pmos devices.

This commit is contained in:
steve 2005-06-12 00:44:49 +00:00
parent dd4f765b06
commit a59f3b1fa6
4 changed files with 111 additions and 146 deletions

View File

@ -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.

View File

@ -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.
*
*/

View File

@ -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

View File

@ -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 <assert.h>
@ -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.