Add control to enable function evaluation at compile time.
Pure functions with constant operands can be evaluated at compile time rather than at run time. This patch provides a global control to enable this optimisation. Until constant function support is complete, by default it is disabled.
This commit is contained in:
parent
5929a00845
commit
09f90ab4e1
|
|
@ -104,6 +104,15 @@ extern bool debug_elaborate;
|
|||
extern bool debug_synth2;
|
||||
extern bool debug_optimizer;
|
||||
|
||||
/* Control evaluation of functions at compile time:
|
||||
* 0 = only for functions in constant expressions
|
||||
* 1 = only for automatic functions
|
||||
* 2 = for all functions
|
||||
* Level 2 should only be used if the user can guarantee that a
|
||||
* function's local variables are never accessed from outside the
|
||||
* function. */
|
||||
extern unsigned opt_const_func;
|
||||
|
||||
/* Possibly temporary flag to control virtualization of pin arrays */
|
||||
extern bool disable_virtual_pins;
|
||||
|
||||
|
|
|
|||
14
eval_tree.cc
14
eval_tree.cc
|
|
@ -1985,10 +1985,16 @@ NetExpr* NetEUFunc::eval_tree()
|
|||
if (!func()->is_const_func())
|
||||
return 0;
|
||||
|
||||
// If we neither want nor need to evaluate the function at
|
||||
// compile time, give up now.
|
||||
if (!opt_const_func && !need_const_)
|
||||
return 0;
|
||||
|
||||
// Variables inside static functions can be accessed from outside
|
||||
// the function, so we can't be sure they are constant unless the
|
||||
// function was called in a constant context.
|
||||
if (!func()->is_auto() && !need_const_)
|
||||
// function was called in a constant context or the user has told
|
||||
// us this is safe.
|
||||
if (!func()->is_auto() && !need_const_ && (opt_const_func < 2))
|
||||
return 0;
|
||||
|
||||
// Run through the input parameters to check they are constants.
|
||||
|
|
@ -2000,7 +2006,6 @@ NetExpr* NetEUFunc::eval_tree()
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (need_const_) {
|
||||
NetFuncDef*def = func_->func_def();
|
||||
ivl_assert(*this, def);
|
||||
|
||||
|
|
@ -2010,7 +2015,4 @@ NetExpr* NetEUFunc::eval_tree()
|
|||
|
||||
NetExpr*res = def->evaluate_function(*this, args);
|
||||
return res;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue