diff --git a/eval_tree.cc b/eval_tree.cc index 7559c36ad..99e408a60 100644 --- a/eval_tree.cc +++ b/eval_tree.cc @@ -1614,7 +1614,6 @@ NetExpr* evaluate_clog2(NetExpr*arg) { NetEConst*tmpi = dynamic_cast(arg); NetECReal*tmpr = dynamic_cast(arg); - bool is_neg = false; if (tmpi || tmpr) { verinum arg; if (tmpi) { @@ -1631,9 +1630,17 @@ NetExpr* evaluate_clog2(NetExpr*arg) return rtn; } + bool is_neg = false; uint64_t res = 0; - if (arg.is_negative()) is_neg = true; + if (arg.is_negative()) { + is_neg = true; + // If the length is not defined, then work with + // the trimmed version of the number. + if (! arg.has_len()) + arg = trim_vnum(arg); + } arg.has_sign(false); // $unsigned() + if (!arg.is_zero()) { arg = arg - verinum((uint64_t)1, 1); while (!arg.is_zero()) { @@ -1641,9 +1648,11 @@ NetExpr* evaluate_clog2(NetExpr*arg) arg = arg >> 1; } } - if (is_neg && res < 32) res = 32; + + if (is_neg && res < integer_width) + res = integer_width; + verinum tmp (res, 32); - tmp.has_sign(true); NetEConst*rtn = new NetEConst(tmp); return rtn; }