change set for support of nmos, pmos, rnmos, rpmos, notif0, and notif1
change set to correct behavior of bufif0 and bufif1 (Tim Leight) Also includes fix for PR#27
This commit is contained in:
parent
197ed46b26
commit
28bc621f11
|
|
@ -17,7 +17,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT) && !defined(macintosh)
|
||||
#ident "$Id: design_dump.cc,v 1.103 2000/11/11 00:03:36 steve Exp $"
|
||||
#ident "$Id: design_dump.cc,v 1.104 2000/11/11 01:52:09 steve Exp $"
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
@ -276,15 +276,33 @@ void NetLogic::dump_node(ostream&o, unsigned ind) const
|
|||
case NAND:
|
||||
o << "nand";
|
||||
break;
|
||||
case NMOS:
|
||||
o << "nmos";
|
||||
break;
|
||||
case NOR:
|
||||
o << "nor";
|
||||
break;
|
||||
case NOT:
|
||||
o << "not";
|
||||
break;
|
||||
case NOTIF0:
|
||||
o << "notif0";
|
||||
break;
|
||||
case NOTIF1:
|
||||
o << "notif1";
|
||||
break;
|
||||
case OR:
|
||||
o << "or";
|
||||
break;
|
||||
case RNMOS:
|
||||
o << "rnmos";
|
||||
break;
|
||||
case RPMOS:
|
||||
o << "rpmos";
|
||||
break;
|
||||
case PMOS:
|
||||
o << "pmos";
|
||||
break;
|
||||
case XNOR:
|
||||
o << "xnor";
|
||||
break;
|
||||
|
|
@ -977,6 +995,13 @@ void Design::dump(ostream&o) const
|
|||
|
||||
/*
|
||||
* $Log: design_dump.cc,v $
|
||||
* Revision 1.104 2000/11/11 01:52:09 steve
|
||||
* change set for support of nmos, pmos, rnmos, rpmos, notif0, and notif1
|
||||
* change set to correct behavior of bufif0 and bufif1
|
||||
* (Tim Leight)
|
||||
*
|
||||
* Also includes fix for PR#27
|
||||
*
|
||||
* Revision 1.103 2000/11/11 00:03:36 steve
|
||||
* Add support for the t-dll backend grabing flip-flops.
|
||||
*
|
||||
|
|
|
|||
33
elaborate.cc
33
elaborate.cc
|
|
@ -17,7 +17,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT) && !defined(macintosh)
|
||||
#ident "$Id: elaborate.cc,v 1.196 2000/11/05 06:05:59 steve Exp $"
|
||||
#ident "$Id: elaborate.cc,v 1.197 2000/11/11 01:52:09 steve Exp $"
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
@ -296,6 +296,10 @@ void PGBuiltin::elaborate(Design*des, const string&path) const
|
|||
cur[idx] = new NetLogic(scope, inm, pin_count(),
|
||||
NetLogic::NAND);
|
||||
break;
|
||||
case NMOS:
|
||||
cur[idx] = new NetLogic(scope, inm, pin_count(),
|
||||
NetLogic::NMOS);
|
||||
break;
|
||||
case NOR:
|
||||
cur[idx] = new NetLogic(scope, inm, pin_count(),
|
||||
NetLogic::NOR);
|
||||
|
|
@ -304,10 +308,30 @@ void PGBuiltin::elaborate(Design*des, const string&path) const
|
|||
cur[idx] = new NetLogic(scope, inm, pin_count(),
|
||||
NetLogic::NOT);
|
||||
break;
|
||||
case NOTIF0:
|
||||
cur[idx] = new NetLogic(scope, inm, pin_count(),
|
||||
NetLogic::NOTIF0);
|
||||
break;
|
||||
case NOTIF1:
|
||||
cur[idx] = new NetLogic(scope, inm, pin_count(),
|
||||
NetLogic::NOTIF1);
|
||||
break;
|
||||
case OR:
|
||||
cur[idx] = new NetLogic(scope, inm, pin_count(),
|
||||
NetLogic::OR);
|
||||
break;
|
||||
case RNMOS:
|
||||
cur[idx] = new NetLogic(scope, inm, pin_count(),
|
||||
NetLogic::RNMOS);
|
||||
break;
|
||||
case RPMOS:
|
||||
cur[idx] = new NetLogic(scope, inm, pin_count(),
|
||||
NetLogic::RPMOS);
|
||||
break;
|
||||
case PMOS:
|
||||
cur[idx] = new NetLogic(scope, inm, pin_count(),
|
||||
NetLogic::PMOS);
|
||||
break;
|
||||
case XNOR:
|
||||
cur[idx] = new NetLogic(scope, inm, pin_count(),
|
||||
NetLogic::XNOR);
|
||||
|
|
@ -2300,6 +2324,13 @@ Design* elaborate(const map<string,Module*>&modules,
|
|||
|
||||
/*
|
||||
* $Log: elaborate.cc,v $
|
||||
* Revision 1.197 2000/11/11 01:52:09 steve
|
||||
* change set for support of nmos, pmos, rnmos, rpmos, notif0, and notif1
|
||||
* change set to correct behavior of bufif0 and bufif1
|
||||
* (Tim Leight)
|
||||
*
|
||||
* Also includes fix for PR#27
|
||||
*
|
||||
* Revision 1.196 2000/11/05 06:05:59 steve
|
||||
* Handle connectsion to internally unconnected modules (PR#38)
|
||||
*
|
||||
|
|
|
|||
13
ivl_target.h
13
ivl_target.h
|
|
@ -19,7 +19,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT) && !defined(macintosh)
|
||||
#ident "$Id: ivl_target.h,v 1.27 2000/11/11 00:03:36 steve Exp $"
|
||||
#ident "$Id: ivl_target.h,v 1.28 2000/11/11 01:52:09 steve Exp $"
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
@ -165,11 +165,15 @@ typedef enum ivl_logic_e {
|
|||
IVL_LO_BUFIF1,
|
||||
IVL_LO_BUFZ,
|
||||
IVL_LO_NAND,
|
||||
IVL_LO_NMOS,
|
||||
IVL_LO_NOR,
|
||||
IVL_LO_NOT,
|
||||
IVL_LO_NOTIF0,
|
||||
IVL_LO_NOTIF1,
|
||||
IVL_LO_OR,
|
||||
IVL_LO_RNMOS,
|
||||
IVL_LO_RPMOS,
|
||||
IVL_LO_PMOS,
|
||||
IVL_LO_XNOR,
|
||||
IVL_LO_XOR
|
||||
} ivl_logic_t;
|
||||
|
|
@ -594,6 +598,13 @@ _END_DECL
|
|||
|
||||
/*
|
||||
* $Log: ivl_target.h,v $
|
||||
* Revision 1.28 2000/11/11 01:52:09 steve
|
||||
* change set for support of nmos, pmos, rnmos, rpmos, notif0, and notif1
|
||||
* change set to correct behavior of bufif0 and bufif1
|
||||
* (Tim Leight)
|
||||
*
|
||||
* Also includes fix for PR#27
|
||||
*
|
||||
* Revision 1.27 2000/11/11 00:03:36 steve
|
||||
* Add support for the t-dll backend grabing flip-flops.
|
||||
*
|
||||
|
|
|
|||
13
netlist.h
13
netlist.h
|
|
@ -19,7 +19,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT) && !defined(macintosh)
|
||||
#ident "$Id: netlist.h,v 1.178 2000/11/11 00:03:36 steve Exp $"
|
||||
#ident "$Id: netlist.h,v 1.179 2000/11/11 01:52:09 steve Exp $"
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
@ -975,8 +975,8 @@ class NetConst : public NetNode {
|
|||
class NetLogic : public NetNode {
|
||||
|
||||
public:
|
||||
enum TYPE { AND, BUF, BUFIF0, BUFIF1, NAND, NOR, NOT, NOTIF0,
|
||||
NOTIF1, OR, XNOR, XOR };
|
||||
enum TYPE { AND, BUF, BUFIF0, BUFIF1, NAND, NMOS, NOR, NOT, NOTIF0,
|
||||
NOTIF1, OR, RNMOS, RPMOS, PMOS, XNOR, XOR };
|
||||
|
||||
explicit NetLogic(NetScope*s, const string&n, unsigned pins, TYPE t);
|
||||
|
||||
|
|
@ -2812,6 +2812,13 @@ extern ostream& operator << (ostream&, NetNet::Type);
|
|||
|
||||
/*
|
||||
* $Log: netlist.h,v $
|
||||
* Revision 1.179 2000/11/11 01:52:09 steve
|
||||
* change set for support of nmos, pmos, rnmos, rpmos, notif0, and notif1
|
||||
* change set to correct behavior of bufif0 and bufif1
|
||||
* (Tim Leight)
|
||||
*
|
||||
* Also includes fix for PR#27
|
||||
*
|
||||
* Revision 1.178 2000/11/11 00:03:36 steve
|
||||
* Add support for the t-dll backend grabing flip-flops.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT) && !defined(macintosh)
|
||||
#ident "$Id: pform_dump.cc,v 1.62 2000/10/14 02:23:02 steve Exp $"
|
||||
#ident "$Id: pform_dump.cc,v 1.63 2000/11/11 01:52:09 steve Exp $"
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
@ -297,9 +297,27 @@ void PGBuiltin::dump(ostream&out) const
|
|||
case PGBuiltin::BUFIF1:
|
||||
out << " bufif1 ";
|
||||
break;
|
||||
case PGBuiltin::NOTIF0:
|
||||
out << " bufif0 ";
|
||||
break;
|
||||
case PGBuiltin::NOTIF1:
|
||||
out << " bufif1 ";
|
||||
break;
|
||||
case PGBuiltin::NAND:
|
||||
out << " nand ";
|
||||
break;
|
||||
case PGBuiltin::NMOS:
|
||||
out << " nmos ";
|
||||
break;
|
||||
case PGBuiltin::RNMOS:
|
||||
out << " rnmos ";
|
||||
break;
|
||||
case PGBuiltin::RPMOS:
|
||||
out << " rpmos ";
|
||||
break;
|
||||
case PGBuiltin::PMOS:
|
||||
out << " pmos ";
|
||||
break;
|
||||
default:
|
||||
out << " builtin gate ";
|
||||
}
|
||||
|
|
@ -783,6 +801,13 @@ void PUdp::dump(ostream&out) const
|
|||
|
||||
/*
|
||||
* $Log: pform_dump.cc,v $
|
||||
* Revision 1.63 2000/11/11 01:52:09 steve
|
||||
* change set for support of nmos, pmos, rnmos, rpmos, notif0, and notif1
|
||||
* change set to correct behavior of bufif0 and bufif1
|
||||
* (Tim Leight)
|
||||
*
|
||||
* Also includes fix for PR#27
|
||||
*
|
||||
* Revision 1.62 2000/10/14 02:23:02 steve
|
||||
* Check for missing concat subexpressions (PR#11)
|
||||
*
|
||||
|
|
|
|||
27
t-vvm.cc
27
t-vvm.cc
|
|
@ -17,7 +17,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT) && !defined(macintosh)
|
||||
#ident "$Id: t-vvm.cc,v 1.183 2000/11/04 06:36:24 steve Exp $"
|
||||
#ident "$Id: t-vvm.cc,v 1.184 2000/11/11 01:52:09 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include <iostream>
|
||||
|
|
@ -1786,6 +1786,9 @@ void target_vvm::logic(const NetLogic*gate)
|
|||
case NetLogic::NAND:
|
||||
out << "static vvm_nand" << "<" << gate->pin_count()-1 << "> ";
|
||||
break;
|
||||
case NetLogic::NMOS:
|
||||
out << "static vvm_nmos ";
|
||||
break;
|
||||
case NetLogic::NOR:
|
||||
if ((gate->pin_count()-1) == 2)
|
||||
out << "static vvm_nor2 ";
|
||||
|
|
@ -1795,9 +1798,24 @@ void target_vvm::logic(const NetLogic*gate)
|
|||
case NetLogic::NOT:
|
||||
out << "static vvm_not ";
|
||||
break;
|
||||
case NetLogic::NOTIF0:
|
||||
out << "static vvm_notif0 ";
|
||||
break;
|
||||
case NetLogic::NOTIF1:
|
||||
out << "static vvm_notif1 ";
|
||||
break;
|
||||
case NetLogic::OR:
|
||||
out << "static vvm_or" << "<" << gate->pin_count()-1 << "> ";
|
||||
break;
|
||||
case NetLogic::RNMOS:
|
||||
out << "static vvm_rnmos ";
|
||||
break;
|
||||
case NetLogic::RPMOS:
|
||||
out << "static vvm_rpmos ";
|
||||
break;
|
||||
case NetLogic::PMOS:
|
||||
out << "static vvm_pmos ";
|
||||
break;
|
||||
case NetLogic::XNOR:
|
||||
out << "static vvm_xnor" << "<" << gate->pin_count()-1 << "> ";
|
||||
break;
|
||||
|
|
@ -3329,6 +3347,13 @@ extern const struct target tgt_vvm = {
|
|||
};
|
||||
/*
|
||||
* $Log: t-vvm.cc,v $
|
||||
* Revision 1.184 2000/11/11 01:52:09 steve
|
||||
* change set for support of nmos, pmos, rnmos, rpmos, notif0, and notif1
|
||||
* change set to correct behavior of bufif0 and bufif1
|
||||
* (Tim Leight)
|
||||
*
|
||||
* Also includes fix for PR#27
|
||||
*
|
||||
* Revision 1.183 2000/11/04 06:36:24 steve
|
||||
* Apply sequential UDP rework from Stephan Boettcher (PR#39)
|
||||
*
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT) && !defined(macintosh)
|
||||
#ident "$Id: vpi_priv.h,v 1.29 2000/10/28 00:51:42 steve Exp $"
|
||||
#ident "$Id: vpi_priv.h,v 1.30 2000/11/11 01:52:09 steve Exp $"
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
@ -70,22 +70,37 @@ struct __vpirt;
|
|||
*/
|
||||
typedef unsigned char vpip_bit_t;
|
||||
|
||||
# define Su1 0xff
|
||||
# define St1 0xee
|
||||
# define Pu1 0xdd
|
||||
# define La1 0xcc
|
||||
# define We1 0xbb
|
||||
# define Me1 0xaa
|
||||
# define Sm1 0x99
|
||||
# define Su0 0x77
|
||||
# define St0 0x66
|
||||
# define Pu0 0x55
|
||||
# define La0 0x44
|
||||
# define We0 0x33
|
||||
# define Me0 0x22
|
||||
# define Sm0 0x11
|
||||
# define StX 0xe6
|
||||
# define HiZ 0x08
|
||||
# define Su1 0xff //supply1
|
||||
# define St1 0xee //strong1
|
||||
# define Pu1 0xdd //pull1
|
||||
# define La1 0xcc //large1
|
||||
# define We1 0xbb //weak1
|
||||
# define Me1 0xaa //medium1
|
||||
# define Sm1 0x99 //samll1
|
||||
|
||||
# define Su0 0x77 //supply0
|
||||
# define St0 0x66 //strong0
|
||||
# define Pu0 0x55 //pull0
|
||||
# define La0 0x44 //large0
|
||||
# define We0 0x33 //weak0
|
||||
# define Me0 0x22 //medium0
|
||||
# define Sm0 0x11 //small0
|
||||
|
||||
# define SuX 0xf7 //supplyx
|
||||
# define StX 0xe6 //strongx
|
||||
# define PuX 0xd5 //pullx
|
||||
# define LaX 0xc4 //largex
|
||||
# define WeX 0xb3 //weakx
|
||||
# define MeX 0xa2 //mediumx
|
||||
# define SmX 0x91 //smallx
|
||||
|
||||
# define HiZ 0x08 //highz
|
||||
# define HiZ0 0x08 //highz
|
||||
# define HiZ1 0x08 //highz
|
||||
|
||||
# define StH 0xe8 //strong 1 highz
|
||||
# define StL 0x06 //highz strong0
|
||||
|
||||
|
||||
/* Compare the logic values of two vpip_bit_t variables. This
|
||||
is like the === operator of Verilog, it ignored strengths. */
|
||||
|
|
@ -392,6 +407,13 @@ extern int vpip_finished();
|
|||
|
||||
/*
|
||||
* $Log: vpi_priv.h,v $
|
||||
* Revision 1.30 2000/11/11 01:52:09 steve
|
||||
* change set for support of nmos, pmos, rnmos, rpmos, notif0, and notif1
|
||||
* change set to correct behavior of bufif0 and bufif1
|
||||
* (Tim Leight)
|
||||
*
|
||||
* Also includes fix for PR#27
|
||||
*
|
||||
* Revision 1.29 2000/10/28 00:51:42 steve
|
||||
* Add scope to threads in vvm, pass that scope
|
||||
* to vpi sysTaskFunc objects, and add vpi calls
|
||||
|
|
|
|||
365
vvm/vvm_gates.cc
365
vvm/vvm_gates.cc
|
|
@ -17,10 +17,16 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT) && !defined(macintosh)
|
||||
#ident "$Id: vvm_gates.cc,v 1.18 2000/07/11 23:08:33 steve Exp $"
|
||||
#ident "$Id: vvm_gates.cc,v 1.19 2000/11/11 01:52:09 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "vvm_gates.h"
|
||||
# include <stdlib.h>
|
||||
# include <typeinfo>
|
||||
# include <string>
|
||||
# include <map>
|
||||
# include <sys/time.h>
|
||||
# include <unistd.h>
|
||||
|
||||
vvm_out_event::vvm_out_event(vpip_bit_t v, vvm_nexus::drive_t*o)
|
||||
: output_(o), val_(v)
|
||||
|
|
@ -68,15 +74,6 @@ void vvm_1bit_out::driveZ(vpip_bit_t v)
|
|||
|
||||
void vvm_1bit_out::output(vpip_bit_t val)
|
||||
{
|
||||
if (B_IS0(val))
|
||||
val = drive0_;
|
||||
else if (B_IS1(val))
|
||||
val = drive1_;
|
||||
else if (B_ISZ(val))
|
||||
val = driveZ_;
|
||||
else
|
||||
val = driveX_;
|
||||
|
||||
if (delay_) {
|
||||
vvm_event*ev = new vvm_out_event(val, this);
|
||||
ev -> schedule(delay_);
|
||||
|
|
@ -128,6 +125,55 @@ vpip_bit_t compute_xnor(const vpip_bit_t*inp, unsigned count)
|
|||
return B_NOT(compute_xor(inp,count));
|
||||
}
|
||||
|
||||
vpip_bit_t reduce_strength(vpip_bit_t val)
|
||||
{
|
||||
if (B_IS0(val)) {
|
||||
|
||||
if ((val == Su0) ||
|
||||
(val == St0))
|
||||
return(Pu0);
|
||||
else if (val == Pu0)
|
||||
return(We0);
|
||||
else if ((val == We0) ||
|
||||
(val == La0))
|
||||
return(Me0);
|
||||
else if ((val == Me0) ||
|
||||
(val == Sm0))
|
||||
return(Sm0);
|
||||
|
||||
} else if (B_IS1(val)) {
|
||||
|
||||
if ((val == Su1) ||
|
||||
(val == St1))
|
||||
return(Pu1);
|
||||
else if (val == Pu1)
|
||||
return(We1);
|
||||
else if ((val == We1) ||
|
||||
(val == La1))
|
||||
return(Me1);
|
||||
else if ((val == Me1) ||
|
||||
(val == Sm1))
|
||||
return(Sm1);
|
||||
|
||||
} else if (B_ISX(val)) {
|
||||
|
||||
if ((val == SuX) ||
|
||||
(val == StX))
|
||||
return(PuX);
|
||||
else if (val == PuX)
|
||||
return(WeX);
|
||||
else if ((val == WeX) ||
|
||||
(val == LaX))
|
||||
return(MeX);
|
||||
else if ((val == MeX) ||
|
||||
(val == SmX))
|
||||
return(SmX);
|
||||
|
||||
}
|
||||
|
||||
return(HiZ);
|
||||
}
|
||||
|
||||
vvm_and2::vvm_and2(unsigned long d)
|
||||
: vvm_1bit_out(d)
|
||||
{
|
||||
|
|
@ -205,14 +251,24 @@ void vvm_bufif0::take_value(unsigned key, vpip_bit_t val)
|
|||
if (input_[key] == val) return;
|
||||
input_[key] = val;
|
||||
|
||||
if (! B_IS0(input_[1]))
|
||||
if ( B_IS1(input_[1]))
|
||||
output(HiZ);
|
||||
else if (B_ISXZ(input_[0]))
|
||||
else if ( B_ISX(input_[0]) ||
|
||||
B_ISZ(input_[0]))
|
||||
output(StX);
|
||||
else if (B_IS1(input_[0]))
|
||||
output(St1);
|
||||
else
|
||||
output(St0);
|
||||
else if (B_IS0(input_[0])) {
|
||||
if (B_IS0(input_[1])) {
|
||||
output(St0);
|
||||
} else {
|
||||
output(StL);
|
||||
}
|
||||
} else {
|
||||
if (B_IS0(input_[1])) {
|
||||
output(St1);
|
||||
} else {
|
||||
output(StH);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
vvm_bufif1::vvm_bufif1(unsigned long d)
|
||||
|
|
@ -237,14 +293,24 @@ void vvm_bufif1::take_value(unsigned key, vpip_bit_t val)
|
|||
if (input_[key] == val) return;
|
||||
input_[key] = val;
|
||||
|
||||
if (! B_IS1(input_[1]))
|
||||
if ( B_IS0(input_[1]))
|
||||
output(HiZ);
|
||||
else if (B_ISXZ(input_[0]))
|
||||
else if ( B_ISX(input_[0]) ||
|
||||
B_ISZ(input_[0]))
|
||||
output(StX);
|
||||
else if (B_IS1(input_[0]))
|
||||
output(St1);
|
||||
else
|
||||
output(St0);
|
||||
else if (B_IS0(input_[0])) {
|
||||
if (B_IS1(input_[1])) {
|
||||
output(St0);
|
||||
} else {
|
||||
output(StL);
|
||||
}
|
||||
} else {
|
||||
if (B_IS1(input_[1])) {
|
||||
output(St1);
|
||||
} else {
|
||||
output(StH);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
vvm_bufz::vvm_bufz()
|
||||
|
|
@ -301,13 +367,165 @@ vpip_bit_t vvm_eeq::compute_() const
|
|||
return outval;
|
||||
}
|
||||
|
||||
vvm_nor2::vvm_nor2(unsigned long d)
|
||||
vvm_nmos::vvm_nmos(unsigned long d)
|
||||
: vvm_1bit_out(d)
|
||||
{
|
||||
input_[0] = StX;
|
||||
input_[1] = StX;
|
||||
}
|
||||
|
||||
vvm_nor2::~vvm_nor2()
|
||||
void vvm_nmos::init_I(unsigned key, vpip_bit_t val)
|
||||
{
|
||||
assert(key < 2);
|
||||
input_[key] = val;
|
||||
}
|
||||
|
||||
void vvm_nmos::take_value(unsigned key, vpip_bit_t val)
|
||||
{
|
||||
|
||||
if (input_[key] == val) {
|
||||
return;
|
||||
}
|
||||
input_[key] = val;
|
||||
|
||||
if ( B_IS0(input_[1])) {
|
||||
output(HiZ);
|
||||
} else if (B_ISX(input_[0]))
|
||||
output(StX);
|
||||
else if (B_ISZ(input_[0])) {
|
||||
output(HiZ);
|
||||
} else if (B_IS0(input_[0])) {
|
||||
if (B_IS1(input_[1])) {
|
||||
output(St0);
|
||||
} else {
|
||||
output(StL);
|
||||
}
|
||||
} else {
|
||||
if (B_IS1(input_[1])) {
|
||||
output(St1);
|
||||
} else {
|
||||
output(StH);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
vvm_rnmos::vvm_rnmos(unsigned long d)
|
||||
: vvm_1bit_out(d)
|
||||
{
|
||||
input_[0] = StX;
|
||||
input_[1] = StX;
|
||||
}
|
||||
|
||||
void vvm_rnmos::init_I(unsigned key, vpip_bit_t val)
|
||||
{
|
||||
assert(key < 2);
|
||||
input_[key] = val;
|
||||
}
|
||||
|
||||
void vvm_rnmos::take_value(unsigned key, vpip_bit_t val)
|
||||
{
|
||||
if (input_[key] == val) return;
|
||||
input_[key] = val;
|
||||
|
||||
if ( B_IS0(input_[1]))
|
||||
output(HiZ);
|
||||
else if (B_ISX(input_[0]))
|
||||
output(reduce_strength(input_[0]));
|
||||
else if (B_ISZ(input_[0]))
|
||||
output(HiZ);
|
||||
else if (B_IS0(input_[0])) {
|
||||
if (B_IS1(input_[1])) {
|
||||
output(reduce_strength(input_[0]));
|
||||
} else {
|
||||
output(StL);
|
||||
}
|
||||
} else {
|
||||
if (B_IS1(input_[1])) {
|
||||
output(reduce_strength(input_[0]));
|
||||
} else {
|
||||
output(StH);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
vvm_pmos::vvm_pmos(unsigned long d)
|
||||
: vvm_1bit_out(d)
|
||||
{
|
||||
input_[0] = StX;
|
||||
input_[1] = StX;
|
||||
}
|
||||
|
||||
|
||||
void vvm_pmos::init_I(unsigned key, vpip_bit_t val)
|
||||
{
|
||||
assert(key < 2);
|
||||
input_[key] = val;
|
||||
}
|
||||
|
||||
void vvm_pmos::take_value(unsigned key, vpip_bit_t val)
|
||||
{
|
||||
if (input_[key] == val) return;
|
||||
input_[key] = val;
|
||||
|
||||
if ( B_IS1(input_[1]))
|
||||
output(HiZ);
|
||||
else if (B_ISX(input_[0]))
|
||||
output(StX);
|
||||
else if (B_ISZ(input_[0]))
|
||||
output(HiZ);
|
||||
else if (B_IS0(input_[0])) {
|
||||
if (B_IS0(input_[1])) {
|
||||
output(St0);
|
||||
} else {
|
||||
output(StL);
|
||||
}
|
||||
} else {
|
||||
if (B_IS0(input_[1])) {
|
||||
output(St1);
|
||||
} else {
|
||||
output(StH);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
vvm_rpmos::vvm_rpmos(unsigned long d)
|
||||
: vvm_1bit_out(d)
|
||||
{
|
||||
input_[0] = StX;
|
||||
input_[1] = StX;
|
||||
}
|
||||
|
||||
|
||||
void vvm_rpmos::init_I(unsigned key, vpip_bit_t val)
|
||||
{
|
||||
assert(key < 2);
|
||||
input_[key] = val;
|
||||
}
|
||||
|
||||
void vvm_rpmos::take_value(unsigned key, vpip_bit_t val)
|
||||
{
|
||||
if (input_[key] == val) return;
|
||||
input_[key] = val;
|
||||
|
||||
if ( B_IS1(input_[1]))
|
||||
output(HiZ);
|
||||
else if (B_ISX(input_[0]))
|
||||
output(reduce_strength(input_[0]));
|
||||
else if (B_ISZ(input_[0]))
|
||||
output(HiZ);
|
||||
else if (B_IS0(input_[0])) {
|
||||
if (B_IS0(input_[1])) {
|
||||
output(reduce_strength(input_[0]));
|
||||
} else {
|
||||
output(StL);
|
||||
}
|
||||
} else {
|
||||
if (B_IS0(input_[1])) {
|
||||
output(reduce_strength(input_[0]));
|
||||
} else {
|
||||
output(StH);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void vvm_nor2::init_I(unsigned idx, vpip_bit_t val)
|
||||
|
|
@ -321,6 +539,15 @@ void vvm_nor2::start()
|
|||
output(B_NOT(B_OR(input_[0], input_[1])));
|
||||
}
|
||||
|
||||
vvm_nor2::vvm_nor2(unsigned long d)
|
||||
: vvm_1bit_out(d)
|
||||
{
|
||||
}
|
||||
|
||||
vvm_nor2::~vvm_nor2()
|
||||
{
|
||||
}
|
||||
|
||||
void vvm_nor2::take_value(unsigned key, vpip_bit_t val)
|
||||
{
|
||||
if (input_[key] == val)
|
||||
|
|
@ -352,9 +579,99 @@ void vvm_not::take_value(unsigned, vpip_bit_t val)
|
|||
output(B_NOT(val));
|
||||
}
|
||||
|
||||
vvm_notif0::vvm_notif0(unsigned long d)
|
||||
: vvm_1bit_out(d)
|
||||
{
|
||||
input_[0] = StX;
|
||||
input_[1] = StX;
|
||||
}
|
||||
|
||||
vvm_notif0::~vvm_notif0()
|
||||
{
|
||||
}
|
||||
|
||||
void vvm_notif0::init_I(unsigned key, vpip_bit_t val)
|
||||
{
|
||||
assert(key < 2);
|
||||
input_[key] = val;
|
||||
}
|
||||
|
||||
void vvm_notif0::take_value(unsigned key, vpip_bit_t val)
|
||||
{
|
||||
if (input_[key] == val) return;
|
||||
input_[key] = val;
|
||||
|
||||
if ( B_IS1(input_[1]))
|
||||
output(HiZ);
|
||||
else if ( B_ISX(input_[0]) ||
|
||||
B_ISZ(input_[0]))
|
||||
output(StX);
|
||||
else if (B_IS0(input_[0])) {
|
||||
if (B_IS0(input_[1])) {
|
||||
output(St1);
|
||||
} else {
|
||||
output(StH);
|
||||
}
|
||||
} else {
|
||||
if (B_IS0(input_[1])) {
|
||||
output(St0);
|
||||
} else {
|
||||
output(StL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
vvm_notif1::vvm_notif1(unsigned long d)
|
||||
: vvm_1bit_out(d)
|
||||
{
|
||||
input_[0] = StX;
|
||||
input_[1] = StX;
|
||||
}
|
||||
|
||||
vvm_notif1::~vvm_notif1()
|
||||
{
|
||||
}
|
||||
|
||||
void vvm_notif1::init_I(unsigned key, vpip_bit_t val)
|
||||
{
|
||||
assert(key < 2);
|
||||
input_[key] = val;
|
||||
}
|
||||
|
||||
void vvm_notif1::take_value(unsigned key, vpip_bit_t val)
|
||||
{
|
||||
if (input_[key] == val) return;
|
||||
input_[key] = val;
|
||||
|
||||
if ( B_IS0(input_[1]))
|
||||
output(HiZ);
|
||||
else if ( B_ISX(input_[0]) ||
|
||||
B_ISZ(input_[0]))
|
||||
output(StX);
|
||||
else if (B_IS0(input_[0])) {
|
||||
if (B_IS1(input_[1])) {
|
||||
output(St1);
|
||||
} else {
|
||||
output(StH);
|
||||
}
|
||||
} else {
|
||||
if (B_IS1(input_[1])) {
|
||||
output(St0);
|
||||
} else {
|
||||
output(StL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* $Log: vvm_gates.cc,v $
|
||||
* Revision 1.19 2000/11/11 01:52:09 steve
|
||||
* change set for support of nmos, pmos, rnmos, rpmos, notif0, and notif1
|
||||
* change set to correct behavior of bufif0 and bufif1
|
||||
* (Tim Leight)
|
||||
*
|
||||
* Also includes fix for PR#27
|
||||
*
|
||||
* Revision 1.18 2000/07/11 23:08:33 steve
|
||||
* proper init method for bufz devices.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@
|
|||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
#if !defined(WINNT) && !defined(macintosh)
|
||||
#ident "$Id: vvm_gates.h,v 1.66 2000/11/04 06:36:24 steve Exp $"
|
||||
#ident "$Id: vvm_gates.h,v 1.67 2000/11/11 01:52:09 steve Exp $"
|
||||
#endif
|
||||
|
||||
# include "vvm.h"
|
||||
|
|
@ -33,6 +33,8 @@ extern vpip_bit_t compute_or(const vpip_bit_t*inp, unsigned count);
|
|||
extern vpip_bit_t compute_xor(const vpip_bit_t*inp, unsigned count);
|
||||
extern vpip_bit_t compute_xnor(const vpip_bit_t*inp, unsigned count);
|
||||
|
||||
extern vpip_bit_t reduce_strength(vpip_bit_t);
|
||||
|
||||
extern void compute_mux(vpip_bit_t*out, unsigned wid,
|
||||
const vpip_bit_t*sel, unsigned swid,
|
||||
const vpip_bit_t*dat, unsigned size);
|
||||
|
|
@ -641,6 +643,34 @@ class vvm_bufif1 : public vvm_1bit_out, public vvm_nexus::recvr_t {
|
|||
void take_value(unsigned key, vpip_bit_t val);
|
||||
};
|
||||
|
||||
class vvm_notif0 : public vvm_1bit_out, public vvm_nexus::recvr_t {
|
||||
|
||||
public:
|
||||
explicit vvm_notif0(unsigned long d);
|
||||
~vvm_notif0();
|
||||
|
||||
void init_I(unsigned, vpip_bit_t);
|
||||
void start() { }
|
||||
|
||||
private:
|
||||
vpip_bit_t input_[2];
|
||||
void take_value(unsigned key, vpip_bit_t val);
|
||||
};
|
||||
|
||||
class vvm_notif1 : public vvm_1bit_out, public vvm_nexus::recvr_t {
|
||||
|
||||
public:
|
||||
explicit vvm_notif1(unsigned long d);
|
||||
~vvm_notif1();
|
||||
|
||||
void init_I(unsigned, vpip_bit_t);
|
||||
void start() { }
|
||||
|
||||
private:
|
||||
vpip_bit_t input_[2];
|
||||
void take_value(unsigned key, vpip_bit_t val);
|
||||
};
|
||||
|
||||
template <unsigned WIDTH>
|
||||
class vvm_nand : public vvm_1bit_out, public vvm_nexus::recvr_t {
|
||||
|
||||
|
|
@ -682,6 +712,58 @@ class vvm_not : public vvm_1bit_out, public vvm_nexus::recvr_t {
|
|||
void take_value(unsigned key, vpip_bit_t val);
|
||||
};
|
||||
|
||||
class vvm_nmos : public vvm_1bit_out, public vvm_nexus::recvr_t {
|
||||
|
||||
public:
|
||||
explicit vvm_nmos(unsigned long d);
|
||||
|
||||
void init_I(unsigned, vpip_bit_t);
|
||||
void start() { }
|
||||
|
||||
private:
|
||||
vpip_bit_t input_[2];
|
||||
void take_value(unsigned key, vpip_bit_t val);
|
||||
};
|
||||
|
||||
class vvm_rnmos : public vvm_1bit_out, public vvm_nexus::recvr_t {
|
||||
|
||||
public:
|
||||
explicit vvm_rnmos(unsigned long d);
|
||||
|
||||
void init_I(unsigned, vpip_bit_t);
|
||||
void start() { }
|
||||
|
||||
private:
|
||||
vpip_bit_t input_[2];
|
||||
void take_value(unsigned key, vpip_bit_t val);
|
||||
};
|
||||
|
||||
class vvm_pmos : public vvm_1bit_out, public vvm_nexus::recvr_t {
|
||||
|
||||
public:
|
||||
explicit vvm_pmos(unsigned long d);
|
||||
|
||||
void init_I(unsigned, vpip_bit_t);
|
||||
void start() { }
|
||||
|
||||
private:
|
||||
vpip_bit_t input_[2];
|
||||
void take_value(unsigned key, vpip_bit_t val);
|
||||
};
|
||||
|
||||
class vvm_rpmos : public vvm_1bit_out, public vvm_nexus::recvr_t {
|
||||
|
||||
public:
|
||||
explicit vvm_rpmos(unsigned long d);
|
||||
|
||||
void init_I(unsigned, vpip_bit_t);
|
||||
void start() { }
|
||||
|
||||
private:
|
||||
vpip_bit_t input_[2];
|
||||
void take_value(unsigned key, vpip_bit_t val);
|
||||
};
|
||||
|
||||
|
||||
template <unsigned WIDTH>
|
||||
class vvm_xnor : public vvm_1bit_out, public vvm_nexus::recvr_t {
|
||||
|
|
@ -924,6 +1006,13 @@ class vvm_posedge : public vvm_nexus::recvr_t {
|
|||
|
||||
/*
|
||||
* $Log: vvm_gates.h,v $
|
||||
* Revision 1.67 2000/11/11 01:52:09 steve
|
||||
* change set for support of nmos, pmos, rnmos, rpmos, notif0, and notif1
|
||||
* change set to correct behavior of bufif0 and bufif1
|
||||
* (Tim Leight)
|
||||
*
|
||||
* Also includes fix for PR#27
|
||||
*
|
||||
* Revision 1.66 2000/11/04 06:36:24 steve
|
||||
* Apply sequential UDP rework from Stephan Boettcher (PR#39)
|
||||
*
|
||||
|
|
|
|||
Loading…
Reference in New Issue