diff --git a/eval_tree.cc b/eval_tree.cc index a69c3b07e..8076eae36 100644 --- a/eval_tree.cc +++ b/eval_tree.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999-2000 Stephen Williams (steve@icarus.com) + * Copyright (c) 1999-2003 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,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: eval_tree.cc,v 1.53 2003/06/04 01:26:17 steve Exp $" +#ident "$Id: eval_tree.cc,v 1.54 2003/06/05 04:28:24 steve Exp $" #endif # include "config.h" @@ -241,8 +241,69 @@ NetEConst* NetEBComp::eval_less_() return new NetEConst(result); } +NetEConst* NetEBComp::eval_leeq_real_() +{ + NetEConst*vtmp; + NetECReal*rtmp; + double lv, rv; + + switch (left_->expr_type()) { + case ET_REAL: + rtmp = dynamic_cast (left_); + if (rtmp == 0) + return 0; + + lv = rtmp->value().as_double(); + break; + + case ET_VECTOR: + vtmp = dynamic_cast (left_); + if (vtmp == 0) + return 0; + + lv = vtmp->value().as_long(); + break; + + default: + assert(0); + } + + + switch (right_->expr_type()) { + case ET_REAL: + rtmp = dynamic_cast (right_); + if (rtmp == 0) + return 0; + + rv = rtmp->value().as_double(); + break; + + case ET_VECTOR: + vtmp = dynamic_cast (right_); + if (vtmp == 0) + return 0; + + rv = vtmp->value().as_long(); + break; + + default: + assert(0); + } + + verinum result((lv <= rv)? verinum::V1 : verinum::V0, 1); + vtmp = new NetEConst(result); + vtmp->set_line(*this); + + return vtmp; +} + NetEConst* NetEBComp::eval_leeq_() { + if (right_->expr_type() == ET_REAL) + return eval_leeq_real_(); + if (left_->expr_type() == ET_REAL) + return eval_leeq_real_(); + NetEConst*r = dynamic_cast(right_); if (r == 0) return 0; @@ -252,9 +313,8 @@ NetEConst* NetEBComp::eval_leeq_() return new NetEConst(result); } - if (left_->expr_width() == 0) { - cerr << get_line() << ": internal error: Something wrong" + cerr << get_line() << ": internal error: Something wrong " << "with the left side width of <= ?" << endl; cerr << get_line() << ": : " << *this << endl; } @@ -1398,6 +1458,9 @@ NetEConst* NetEUReduce::eval_tree() /* * $Log: eval_tree.cc,v $ + * Revision 1.54 2003/06/05 04:28:24 steve + * Evaluate <= with real operands. + * * Revision 1.53 2003/06/04 01:26:17 steve * internal error for <= expression errors. * @@ -1412,173 +1475,5 @@ NetEConst* NetEUReduce::eval_tree() * Revision 1.50 2003/04/14 03:40:21 steve * Make some effort to preserve bits while * operating on constant values. - * - * Revision 1.49 2003/03/15 18:07:58 steve - * More resilient WRT right expression width of GT. - * - * Revision 1.48 2003/03/10 23:40:53 steve - * Keep parameter constants for the ivl_target API. - * - * Revision 1.47 2003/02/07 02:47:58 steve - * NetEBDiv handles real value constant expressions. - * - * Revision 1.46 2003/01/30 16:23:07 steve - * Spelling fixes. - * - * Revision 1.45 2003/01/27 05:09:17 steve - * Spelling fixes. - * - * Revision 1.44 2002/12/05 02:14:33 steve - * Support bit select in constant expressions. - * - * Revision 1.43 2002/11/09 01:40:19 steve - * Postpone parameter width check to evaluation. - * - * Revision 1.42 2002/10/19 22:59:49 steve - * Redo the parameter vector support to allow - * parameter names in range expressions. - * - * Revision 1.41 2002/08/12 01:34:59 steve - * conditional ident string using autoconfig. - * - * Revision 1.40 2002/05/25 16:43:47 steve - * Eval ^ and &0 expressions. - * - * Revision 1.39 2002/05/06 02:30:27 steve - * Allow parameters in concatenation of widths are defined. - * - * Revision 1.38 2002/05/05 21:11:50 steve - * Put off evaluation of concatenation repeat expresions - * until after parameters are defined. This allows parms - * to be used in repeat expresions. - * - * Add the builtin $signed system function. - * - * Revision 1.37 2002/04/27 05:03:46 steve - * Preserve stringiness string part select and concatenation. - * - * Revision 1.36 2002/04/27 03:17:15 steve - * Fixup eval of signed constants. - * - * Revision 1.35 2002/04/24 02:47:02 steve - * Fix compile time eval of signed <= signed. - * - * Revision 1.34 2002/04/14 19:28:47 steve - * Fix constant evaluation of unary - * - * Revision 1.33 2002/02/01 05:09:14 steve - * Propagate sign in unary minus. - * - * Revision 1.32 2002/01/22 01:40:04 steve - * Precalculate constant results of memory index expressions. - * - * Revision 1.31 2001/12/30 00:39:25 steve - * Evaluate constant unary minus. - * - * Revision 1.30 2001/12/03 04:47:15 steve - * Parser and pform use hierarchical names as hname_t - * objects instead of encoded strings. - * - * Revision 1.29 2001/11/19 01:54:14 steve - * Port close cropping behavior from mcrgb - * Move window array reset to libmc. - * - * Revision 1.28 2001/10/22 15:31:21 steve - * fix constant overrun in | operands. - * - * Revision 1.27 2001/10/20 00:11:24 steve - * Evaluate constant == when operands differ in width. - * - * Revision 1.26 2001/07/25 03:10:49 steve - * Create a config.h.in file to hold all the config - * junk, and support gcc 3.0. (Stephan Boettcher) - * - * Revision 1.25 2001/07/16 20:41:41 steve - * Handle 0 counts in repeat concatenation. - * - * Revision 1.24 2001/02/10 20:29:39 steve - * In the context of range declarations, use elab_and_eval instead - * of the less robust eval_const methods. - * - * Revision 1.23 2001/02/09 05:44:23 steve - * support evaluation of constant < in expressions. - * - * Revision 1.22 2001/02/07 02:46:31 steve - * Support constant evaluation of / and % (PR#124) - * - * Revision 1.21 2001/01/14 23:04:56 steve - * Generalize the evaluation of floating point delays, and - * get it working with delay assignment statements. - * - * Allow parameters to be referenced by hierarchical name. - * - * Revision 1.20 2001/01/04 16:49:50 steve - * Evaluate constant === and !== expressions. - * - * Revision 1.19 2001/01/04 04:28:42 steve - * Evaluate constant logical && and ||. - * - * Revision 1.18 2001/01/02 04:21:14 steve - * Support a bunch of unary operators in parameter expressions. - * - * Revision 1.17 2001/01/02 03:23:40 steve - * Evaluate constant &, | and unary ~. - * - * Revision 1.16 2001/01/01 21:49:33 steve - * Fix shift and ternary operators in parameter expressions (PR#86) - * - * Revision 1.15 2000/12/16 20:00:17 steve - * Handle non-constant l-values. - * - * Revision 1.14 2000/12/16 19:03:30 steve - * Evaluate <= and ?: in parameter expressions (PR#81) - * - * 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. - * - * Revision 1.11 2000/07/07 04:53:54 steve - * Add support for non-constant delays in delay statements, - * Support evaluating ! in constant expressions, and - * move some code from netlist.cc to net_proc.cc. - * - * Revision 1.10 2000/04/28 18:43:23 steve - * integer division in expressions properly get width. - * - * Revision 1.9 2000/03/08 04:36:53 steve - * Redesign the implementation of scopes and parameters. - * I now generate the scopes and notice the parameters - * in a separate pass over the pform. Once the scopes - * are generated, I can process overrides and evalutate - * paremeters before elaboration begins. - * - * Revision 1.8 2000/02/23 02:56:54 steve - * Macintosh compilers do not support ident. - * - * Revision 1.7 2000/01/13 03:35:35 steve - * Multiplication all the way to simulation. - * - * Revision 1.6 1999/10/22 23:57:53 steve - * do the <= in bits, not numbers. - * - * Revision 1.5 1999/10/10 23:29:37 steve - * Support evaluating + operator at compile time. - * - * Revision 1.4 1999/09/23 03:56:57 steve - * Support shift operators. - * - * Revision 1.3 1999/09/23 00:21:54 steve - * Move set_width methods into a single file, - * Add the NetEBLogic class for logic expressions, - * Fix error setting with of && in if statements. - * - * Revision 1.2 1999/09/21 00:13:40 steve - * Support parameters that reference other paramters. - * - * Revision 1.1 1999/09/20 02:21:10 steve - * Elaborate parameters in phases. - * */ diff --git a/netlist.h b/netlist.h index 4eda9ed17..37857bb20 100644 --- a/netlist.h +++ b/netlist.h @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CVS_IDENT -#ident "$Id: netlist.h,v 1.288 2003/05/30 02:55:32 steve Exp $" +#ident "$Id: netlist.h,v 1.289 2003/06/05 04:28:24 steve Exp $" #endif /* @@ -2477,6 +2477,7 @@ class NetEBComp : public NetEBinary { NetEConst*eval_eqeq_(); NetEConst*eval_less_(); NetEConst*eval_leeq_(); + NetEConst*eval_leeq_real_(); NetEConst*eval_gt_(); NetEConst*eval_gteq_(); NetEConst*eval_neeq_(); @@ -3303,6 +3304,9 @@ extern ostream& operator << (ostream&, NetNet::Type); /* * $Log: netlist.h,v $ + * Revision 1.289 2003/06/05 04:28:24 steve + * Evaluate <= with real operands. + * * Revision 1.288 2003/05/30 02:55:32 steve * Support parameters in real expressions and * as real expressions, and fix multiply and