diff --git a/elab_expr.cc b/elab_expr.cc index 83ce858f3..840db97d1 100644 --- a/elab_expr.cc +++ b/elab_expr.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) && !defined(macintosh) -#ident "$Id: elab_expr.cc,v 1.56 2002/04/27 02:38:04 steve Exp $" +#ident "$Id: elab_expr.cc,v 1.57 2002/04/27 05:03:46 steve Exp $" #endif # include "config.h" @@ -442,6 +442,8 @@ NetExpr* PEIdent::elaborate_expr(Design*des, NetScope*scope, for (long idx = lsb ; idx <= msb ; idx += 1) { if (idx < exl.len()) result.set(idx-lsb, exl.get(idx)); + else if (exl.is_string()) + result.set(idx-lsb, verinum::V0); else if (exl.has_len()) result.set(idx-lsb, verinum::Vx); else if (exl.has_sign()) @@ -450,6 +452,14 @@ NetExpr* PEIdent::elaborate_expr(Design*des, NetScope*scope, result.set(idx-lsb, verinum::V0); } + /* If the input is a string, and the part select + is working on byte boundaries, then the result + can be made into a string. */ + if (exl.is_string() + && (lsb%8 == 0) + && (result.len()%8 == 0)) + result = verinum(result.as_string()); + delete tmp; tmp = new NetEConst(result); @@ -832,6 +842,9 @@ NetExpr* PEUnary::elaborate_expr(Design*des, NetScope*scope, bool) const /* * $Log: elab_expr.cc,v $ + * Revision 1.57 2002/04/27 05:03:46 steve + * Preserve stringiness string part select and concatenation. + * * Revision 1.56 2002/04/27 02:38:04 steve * Support selecting bits from parameters. * diff --git a/eval_tree.cc b/eval_tree.cc index fb8e92be0..d3e856f7e 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.36 2002/04/27 03:17:15 steve Exp $" +#ident "$Id: eval_tree.cc,v 1.37 2002/04/27 05:03:46 steve Exp $" #endif # include "config.h" @@ -743,19 +743,28 @@ NetEConst* NetEConcat::eval_tree() unsigned gap = expr_width() / repeat_; verinum val (verinum::Vx, repeat_ * gap); - // build up the result from least significant to most. unsigned cur = 0; + bool is_string_flag = true; for (unsigned idx = parms_.count() ; idx > 0 ; idx -= 1) { NetEConst*expr = dynamic_cast(parms_[idx-1]); if (expr == 0) return 0; verinum tmp = expr->value(); - for (unsigned bit = 0 ; bit < tmp.len() ; bit += 1, cur += 1) + for (unsigned bit = 0; bit < tmp.len(); bit += 1, cur += 1) for (unsigned rep = 0 ; rep < repeat_ ; rep += 1) val.set(rep*gap+cur, tmp[bit]); + + is_string_flag = is_string_flag && tmp.is_string(); + } + + /* If all the values were strings, then re-stringify this + constant. This might be useful information in the code + generator or other optimizer steps. */ + if (is_string_flag) { + val = verinum(val.as_string()); } NetEConst*res = new NetEConst(val); @@ -1070,6 +1079,9 @@ NetEConst* NetEUReduce::eval_tree() /* * $Log: eval_tree.cc,v $ + * 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. *