diff --git a/eval_tree.cc b/eval_tree.cc index f1ff325b6..e2d2b0f15 100644 --- a/eval_tree.cc +++ b/eval_tree.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) && !defined(macintosh) -#ident "$Id: eval_tree.cc,v 1.12 2000/09/27 18:28:37 steve Exp $" +#ident "$Id: eval_tree.cc,v 1.13 2000/09/29 04:42:56 steve Exp $" #endif # include "netlist.h" @@ -115,7 +115,91 @@ NetEConst* NetEBComp::eval_leeq_() return 0; } - +NetEConst* NetEBComp::eval_neeq_() +{ + NetEConst*l = dynamic_cast(left_); + if (l == 0) return 0; + NetEConst*r = dynamic_cast(right_); + if (r == 0) return 0; + + const verinum&lv = l->value(); + const verinum&rv = r->value(); + + verinum::V res = verinum::V0; + unsigned top = lv.len(); + if (rv.len() < top) + top = rv.len(); + + for (unsigned idx = 0 ; idx < top ; idx += 1) { + + switch (lv.get(idx)) { + + case verinum::Vx: + case verinum::Vz: + res = verinum::Vx; + break; + + default: + break; + } + + switch (rv.get(idx)) { + + case verinum::Vx: + case verinum::Vz: + res = verinum::Vx; + break; + + default: + break; + } + + if (res == verinum::Vx) + break; + + if (rv.get(idx) != lv.get(idx)) + res = verinum::V1; + } + + if (res != verinum::Vx) { + for (unsigned idx = top ; idx < lv.len() ; idx += 1) + switch (lv.get(idx)) { + + case verinum::Vx: + case verinum::Vz: + res = verinum::Vx; + break; + + case verinum::V1: + if (res != verinum::Vx) + res = verinum::V1; + break; + + default: + break; + } + + for (unsigned idx = top ; idx < rv.len() ; idx += 1) + switch (rv.get(idx)) { + + case verinum::Vx: + case verinum::Vz: + res = verinum::Vx; + break; + + case verinum::V1: + if (res != verinum::Vx) + res = verinum::V1; + break; + + default: + break; + } + } + + return new NetEConst(verinum(res)); +} + NetEConst* NetEBComp::eval_tree() { eval_sub_tree_(); @@ -127,6 +211,9 @@ NetEConst* NetEBComp::eval_tree() case 'L': return eval_leeq_(); + case 'n': + return eval_neeq_(); + default: return 0; } @@ -326,6 +413,9 @@ NetEConst* NetEUnary::eval_tree() /* * $Log: eval_tree.cc,v $ + * Revision 1.13 2000/09/29 04:42:56 steve + * Cnstant evaluation of NE. + * * Revision 1.12 2000/09/27 18:28:37 steve * multiply in parameter expressions. * diff --git a/netlist.h b/netlist.h index 80ac577c5..68017ab19 100644 --- a/netlist.h +++ b/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.168 2000/09/26 05:05:58 steve Exp $" +#ident "$Id: netlist.h,v 1.169 2000/09/29 04:43:09 steve Exp $" #endif /* @@ -2151,6 +2151,7 @@ class NetEBComp : public NetEBinary { private: NetEConst*eval_eqeq_(); NetEConst*eval_leeq_(); + NetEConst*eval_neeq_(); }; @@ -2795,6 +2796,9 @@ extern ostream& operator << (ostream&, NetNet::Type); /* * $Log: netlist.h,v $ + * Revision 1.169 2000/09/29 04:43:09 steve + * Cnstant evaluation of NE. + * * Revision 1.168 2000/09/26 05:05:58 steve * Detect indefinite widths where definite widths are required. *