Cleanup the eval_tree.cc constant system function code.

This patch adds asserts after new to verify that memory was allocated
correctly and adds a warning if some of the routines are called with
an invalid function name.
This commit is contained in:
Cary R 2010-11-05 11:32:30 -07:00 committed by Stephen Williams
parent ab8557eaf0
commit a52c066f66
1 changed files with 90 additions and 39 deletions

View File

@ -1816,7 +1816,7 @@ NetEConst* NetEUReduce::eval_tree(int)
return tmp; return tmp;
} }
NetExpr* evaluate_clog2(NetExpr*&arg_) static NetEConst* evaluate_clog2(NetExpr*&arg_)
{ {
eval_expr(arg_); eval_expr(arg_);
@ -1875,11 +1875,15 @@ NetExpr* evaluate_clog2(NetExpr*&arg_)
return rtn; return rtn;
} }
NetExpr* evaluate_math_one_arg(NetExpr*&arg_, const char*name) static NetECReal* evaluate_math_one_arg(NetExpr*&arg_, const char*name)
{ {
eval_expr(arg_); eval_expr(arg_);
NetEConst*tmpi = dynamic_cast<NetEConst *>(arg_); NetEConst*tmpi = dynamic_cast<NetEConst *>(arg_);
NetECReal*tmpr = dynamic_cast<NetECReal *>(arg_); NetECReal*tmpr = dynamic_cast<NetECReal *>(arg_);
NetECReal*res = 0;
if (tmpi || tmpr) { if (tmpi || tmpr) {
double arg; double arg;
if (tmpi) { if (tmpi) {
@ -1889,55 +1893,81 @@ NetExpr* evaluate_math_one_arg(NetExpr*&arg_, const char*name)
} }
if (strcmp(name, "$ln") == 0) { if (strcmp(name, "$ln") == 0) {
return new NetECReal(verireal(log(arg))); res = new NetECReal(verireal(log(arg)));
ivl_assert(*arg_, res);
} else if (strcmp(name, "$log10") == 0) { } else if (strcmp(name, "$log10") == 0) {
return new NetECReal(verireal(log10(arg))); res = new NetECReal(verireal(log10(arg)));
ivl_assert(*arg_, res);
} else if (strcmp(name, "$exp") == 0) { } else if (strcmp(name, "$exp") == 0) {
return new NetECReal(verireal(exp(arg))); res = new NetECReal(verireal(exp(arg)));
ivl_assert(*arg_, res);
} else if (strcmp(name, "$sqrt") == 0) { } else if (strcmp(name, "$sqrt") == 0) {
return new NetECReal(verireal(sqrt(arg))); res = new NetECReal(verireal(sqrt(arg)));
ivl_assert(*arg_, res);
} else if (strcmp(name, "$floor") == 0) { } else if (strcmp(name, "$floor") == 0) {
return new NetECReal(verireal(floor(arg))); res = new NetECReal(verireal(floor(arg)));
ivl_assert(*arg_, res);
} else if (strcmp(name, "$ceil") == 0) { } else if (strcmp(name, "$ceil") == 0) {
return new NetECReal(verireal(ceil(arg))); res = new NetECReal(verireal(ceil(arg)));
ivl_assert(*arg_, res);
} else if (strcmp(name, "$sin") == 0) { } else if (strcmp(name, "$sin") == 0) {
return new NetECReal(verireal(sin(arg))); res = new NetECReal(verireal(sin(arg)));
ivl_assert(*arg_, res);
} else if (strcmp(name, "$cos") == 0) { } else if (strcmp(name, "$cos") == 0) {
return new NetECReal(verireal(cos(arg))); res = new NetECReal(verireal(cos(arg)));
ivl_assert(*arg_, res);
} else if (strcmp(name, "$tan") == 0) { } else if (strcmp(name, "$tan") == 0) {
return new NetECReal(verireal(tan(arg))); res = new NetECReal(verireal(tan(arg)));
ivl_assert(*arg_, res);
} else if (strcmp(name, "$asin") == 0) { } else if (strcmp(name, "$asin") == 0) {
return new NetECReal(verireal(asin(arg))); res = new NetECReal(verireal(asin(arg)));
ivl_assert(*arg_, res);
} else if (strcmp(name, "$acos") == 0) { } else if (strcmp(name, "$acos") == 0) {
return new NetECReal(verireal(acos(arg))); res = new NetECReal(verireal(acos(arg)));
ivl_assert(*arg_, res);
} else if (strcmp(name, "$atan") == 0) { } else if (strcmp(name, "$atan") == 0) {
return new NetECReal(verireal(atan(arg))); res = new NetECReal(verireal(atan(arg)));
ivl_assert(*arg_, res);
} else if (strcmp(name, "$sinh") == 0) { } else if (strcmp(name, "$sinh") == 0) {
return new NetECReal(verireal(sinh(arg))); res = new NetECReal(verireal(sinh(arg)));
ivl_assert(*arg_, res);
} else if (strcmp(name, "$cosh") == 0) { } else if (strcmp(name, "$cosh") == 0) {
return new NetECReal(verireal(cosh(arg))); res = new NetECReal(verireal(cosh(arg)));
ivl_assert(*arg_, res);
} else if (strcmp(name, "$tanh") == 0) { } else if (strcmp(name, "$tanh") == 0) {
return new NetECReal(verireal(tanh(arg))); res = new NetECReal(verireal(tanh(arg)));
ivl_assert(*arg_, res);
} else if (strcmp(name, "$asinh") == 0) { } else if (strcmp(name, "$asinh") == 0) {
return new NetECReal(verireal(asinh(arg))); res = new NetECReal(verireal(asinh(arg)));
ivl_assert(*arg_, res);
} else if (strcmp(name, "$acosh") == 0) { } else if (strcmp(name, "$acosh") == 0) {
return new NetECReal(verireal(acosh(arg))); res = new NetECReal(verireal(acosh(arg)));
ivl_assert(*arg_, res);
} else if (strcmp(name, "$atanh") == 0) { } else if (strcmp(name, "$atanh") == 0) {
return new NetECReal(verireal(atanh(arg))); res = new NetECReal(verireal(atanh(arg)));
ivl_assert(*arg_, res);
} else {
cerr << arg_->get_fileline() << ": warning: Unhandled"
"constant system function " << name << "." << endl;
} }
} }
return 0; return res;
} }
NetExpr* evaluate_math_two_args(NetExpr*&arg0_, NetExpr*&arg1_, const char*name) static NetECReal* evaluate_math_two_args(NetExpr*&arg0_, NetExpr*&arg1_,
const char*name)
{ {
eval_expr(arg0_); eval_expr(arg0_);
eval_expr(arg1_); eval_expr(arg1_);
NetEConst*tmpi0 = dynamic_cast<NetEConst *>(arg0_); NetEConst*tmpi0 = dynamic_cast<NetEConst *>(arg0_);
NetECReal*tmpr0 = dynamic_cast<NetECReal *>(arg0_); NetECReal*tmpr0 = dynamic_cast<NetECReal *>(arg0_);
NetEConst*tmpi1 = dynamic_cast<NetEConst *>(arg1_); NetEConst*tmpi1 = dynamic_cast<NetEConst *>(arg1_);
NetECReal*tmpr1 = dynamic_cast<NetECReal *>(arg1_); NetECReal*tmpr1 = dynamic_cast<NetECReal *>(arg1_);
NetECReal*res = 0;
if ((tmpi0 || tmpr0) && (tmpi1 || tmpr1)) { if ((tmpi0 || tmpr0) && (tmpi1 || tmpr1)) {
double arg0, arg1; double arg0, arg1;
if (tmpi0) { if (tmpi0) {
@ -1952,57 +1982,73 @@ NetExpr* evaluate_math_two_args(NetExpr*&arg0_, NetExpr*&arg1_, const char*name)
} }
if (strcmp(name, "$pow") == 0) { if (strcmp(name, "$pow") == 0) {
return new NetECReal(verireal(pow(arg0, arg1))); res = new NetECReal(verireal(pow(arg0, arg1)));
ivl_assert(*arg0_, res);
} else if (strcmp(name, "$atan2") == 0) { } else if (strcmp(name, "$atan2") == 0) {
return new NetECReal(verireal(atan2(arg0, arg1))); res = new NetECReal(verireal(atan2(arg0, arg1)));
ivl_assert(*arg0_, res);
} else if (strcmp(name, "$hypot") == 0) { } else if (strcmp(name, "$hypot") == 0) {
return new NetECReal(verireal(hypot(arg0, arg1))); res = new NetECReal(verireal(hypot(arg0, arg1)));
ivl_assert(*arg0_, res);
} else {
cerr << arg0_->get_fileline() << ": warning: Unhandled"
"constant system function " << name << "." << endl;
} }
} }
return 0; return res;
} }
NetExpr* evaluate_abs(NetExpr*&arg_) static NetExpr* evaluate_abs(NetExpr*&arg_)
{ {
eval_expr(arg_); eval_expr(arg_);
NetExpr*res = 0;
NetEConst*tmpi = dynamic_cast<NetEConst *>(arg_); NetEConst*tmpi = dynamic_cast<NetEConst *>(arg_);
if (tmpi) { if (tmpi) {
verinum arg = tmpi->value(); verinum arg = tmpi->value();
if (arg.is_negative()) { if (arg.is_negative()) {
arg = v_not(arg) + verinum(1); arg = v_not(arg) + verinum(1);
} }
return new NetEConst(arg); res = new NetEConst(arg);
ivl_assert(*arg_, res);
} }
NetECReal*tmpr = dynamic_cast<NetECReal *>(arg_); NetECReal*tmpr = dynamic_cast<NetECReal *>(arg_);
if (tmpr) { if (tmpr) {
double arg = tmpr->value().as_double(); double arg = tmpr->value().as_double();
return new NetECReal(verireal(fabs(arg))); res = new NetECReal(verireal(fabs(arg)));
ivl_assert(*arg_, res);
} }
return 0; return res;
} }
NetExpr* evaluate_min_max(NetExpr*&arg0_, NetExpr*&arg1_, const char*name) static NetExpr* evaluate_min_max(NetExpr*&arg0_, NetExpr*&arg1_,
const char*name)
{ {
eval_expr(arg0_); eval_expr(arg0_);
eval_expr(arg1_); eval_expr(arg1_);
NetEConst*tmpi0 = dynamic_cast<NetEConst *>(arg0_); NetEConst*tmpi0 = dynamic_cast<NetEConst *>(arg0_);
NetECReal*tmpr0 = dynamic_cast<NetECReal *>(arg0_); NetECReal*tmpr0 = dynamic_cast<NetECReal *>(arg0_);
NetEConst*tmpi1 = dynamic_cast<NetEConst *>(arg1_); NetEConst*tmpi1 = dynamic_cast<NetEConst *>(arg1_);
NetECReal*tmpr1 = dynamic_cast<NetECReal *>(arg1_); NetECReal*tmpr1 = dynamic_cast<NetECReal *>(arg1_);
NetExpr*res = 0;
if (tmpi0 && tmpi1) { if (tmpi0 && tmpi1) {
verinum arg0 = tmpi0->value(); verinum arg0 = tmpi0->value();
verinum arg1 = tmpi1->value(); verinum arg1 = tmpi1->value();
if (strcmp(name, "$min") == 0) { if (strcmp(name, "$min") == 0) {
return new NetEConst( arg0 < arg1 ? arg0 : arg1); res = new NetEConst( arg0 < arg1 ? arg0 : arg1);
ivl_assert(*arg0_, res);
} else if (strcmp(name, "$max") == 0) { } else if (strcmp(name, "$max") == 0) {
return new NetEConst( arg0 < arg1 ? arg1 : arg0); res = new NetEConst( arg0 < arg1 ? arg1 : arg0);
ivl_assert(*arg0_, res);
} }
} } else if ((tmpi0 || tmpr0) && (tmpi1 || tmpr1)) {
if ((tmpi0 || tmpr0) && (tmpi1 || tmpr1)) {
double arg0, arg1; double arg0, arg1;
if (tmpi0) { if (tmpi0) {
arg0 = tmpi0->value().as_double(); arg0 = tmpi0->value().as_double();
@ -2015,13 +2061,18 @@ NetExpr* evaluate_min_max(NetExpr*&arg0_, NetExpr*&arg1_, const char*name)
arg1 = tmpr1->value().as_double(); arg1 = tmpr1->value().as_double();
} }
if (strcmp(name, "$min") == 0) { if (strcmp(name, "$min") == 0) {
return new NetECReal(verireal(arg0 < arg1 ? arg0 : arg1)); res = new NetECReal(verireal(arg0 < arg1 ? arg0 : arg1));
ivl_assert(*arg0_, res);
} else if (strcmp(name, "$max") == 0) { } else if (strcmp(name, "$max") == 0) {
return new NetECReal(verireal(arg0 < arg1 ? arg1 : arg0)); res = new NetECReal(verireal(arg0 < arg1 ? arg1 : arg0));
ivl_assert(*arg0_, res);
} else {
cerr << arg0_->get_fileline() << ": warning: Unhandled"
"constant system function " << name << "." << endl;
} }
} }
return 0; return res;
} }
NetExpr* NetESFunc::eval_tree(int prune_to_width) NetExpr* NetESFunc::eval_tree(int prune_to_width)