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:
parent
ab8557eaf0
commit
a52c066f66
129
eval_tree.cc
129
eval_tree.cc
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue