From e11f4cf69ebe09f33102e172524f55f5fe6cedc5 Mon Sep 17 00:00:00 2001 From: Cary R Date: Mon, 7 Jun 2010 13:52:19 -0700 Subject: [PATCH] Don't crash if parameter/localparam defined from constant user function. This patch avoids a crash when trying to use a parameter/localparam that has been assigned a value from a constant user function. Icarus does not currently support constant user functions so it creates a parameter with a NULL value. This patch fixes a few places where this could crash the compiler. (cherry picked from commit 3f203c4363cd4f0915eda709c743640ac418f023) --- elab_pexpr.cc | 2 +- eval_tree.cc | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/elab_pexpr.cc b/elab_pexpr.cc index 553e776c2..1231119a7 100644 --- a/elab_pexpr.cc +++ b/elab_pexpr.cc @@ -508,7 +508,7 @@ void NetEParam::resolve_pexpr_type(void) if (reference_->second.signed_flag) { cast_signed_base_(true); - } else { + } else if (reference_->second.expr) { cast_signed_base_( reference_->second.expr->has_sign() ); } } diff --git a/eval_tree.cc b/eval_tree.cc index 38c37dca3..6f744f452 100644 --- a/eval_tree.cc +++ b/eval_tree.cc @@ -1231,7 +1231,15 @@ NetExpr* NetEParam::eval_tree(int prune_to_width) assert(scope_); perm_string name = (*reference_).first; const NetExpr*expr = (*reference_).second.expr; - ivl_assert(*this, expr); + // Since constant user functions are not supported we can get + // parameters/localparams that are not defined. For now generate + // an appropriate error message. + if (expr == NULL) { + cerr << get_fileline() << ": internal error: parameter/localparam " + << *this << " cannot be evaluated." << endl; + return 0; + } +// ivl_assert(*this, expr); NetExpr*nexpr = expr->dup_expr(); assert(nexpr);