Fix for GitHub issue #277 - incorrect sensitivity calculation.
The fix for the compiler hang when calculating the sensitivity list for an always_comb construct containing recursive function calls could cause the compiler to ignore sequential calls to the same function, and thus not add the arguments of those calls to the sensitivity list.
This commit is contained in:
parent
df38460d26
commit
16e8563c6e
184
net_nex_input.cc
184
net_nex_input.cc
|
|
@ -27,7 +27,7 @@
|
|||
# include "netlist.h"
|
||||
# include "netmisc.h"
|
||||
|
||||
NexusSet* NetExpr::nex_input(bool, bool) const
|
||||
NexusSet* NetExpr::nex_input(bool, bool, bool) const
|
||||
{
|
||||
cerr << get_fileline()
|
||||
<< ": internal error: nex_input not implemented: "
|
||||
|
|
@ -35,7 +35,7 @@ NexusSet* NetExpr::nex_input(bool, bool) const
|
|||
return new NexusSet;
|
||||
}
|
||||
|
||||
NexusSet* NetProc::nex_input(bool, bool) const
|
||||
NexusSet* NetProc::nex_input(bool, bool, bool) const
|
||||
{
|
||||
cerr << get_fileline()
|
||||
<< ": internal error: NetProc::nex_input not implemented"
|
||||
|
|
@ -43,13 +43,13 @@ NexusSet* NetProc::nex_input(bool, bool) const
|
|||
return new NexusSet;
|
||||
}
|
||||
|
||||
NexusSet* NetEArrayPattern::nex_input(bool rem_out, bool always_sens) const
|
||||
NexusSet* NetEArrayPattern::nex_input(bool rem_out, bool always_sens, bool nested_func) const
|
||||
{
|
||||
NexusSet*result = new NexusSet;
|
||||
for (size_t idx = 0 ; idx < items_.size() ; idx += 1) {
|
||||
if (items_[idx]==0) continue;
|
||||
|
||||
NexusSet*tmp = items_[idx]->nex_input(rem_out, always_sens);
|
||||
NexusSet*tmp = items_[idx]->nex_input(rem_out, always_sens, nested_func);
|
||||
if (tmp == 0) continue;
|
||||
|
||||
result->add(*tmp);
|
||||
|
|
@ -58,32 +58,32 @@ NexusSet* NetEArrayPattern::nex_input(bool rem_out, bool always_sens) const
|
|||
return result;
|
||||
}
|
||||
|
||||
NexusSet* NetEBinary::nex_input(bool rem_out, bool always_sens) const
|
||||
NexusSet* NetEBinary::nex_input(bool rem_out, bool always_sens, bool nested_func) const
|
||||
{
|
||||
NexusSet*result = left_->nex_input(rem_out, always_sens);
|
||||
NexusSet*tmp = right_->nex_input(rem_out, always_sens);
|
||||
NexusSet*result = left_->nex_input(rem_out, always_sens, nested_func);
|
||||
NexusSet*tmp = right_->nex_input(rem_out, always_sens, nested_func);
|
||||
result->add(*tmp);
|
||||
delete tmp;
|
||||
return result;
|
||||
}
|
||||
|
||||
NexusSet* NetEConcat::nex_input(bool rem_out, bool always_sens) const
|
||||
NexusSet* NetEConcat::nex_input(bool rem_out, bool always_sens, bool nested_func) const
|
||||
{
|
||||
if (parms_[0] == NULL) return new NexusSet;
|
||||
NexusSet*result = parms_[0]->nex_input(rem_out, always_sens);
|
||||
NexusSet*result = parms_[0]->nex_input(rem_out, always_sens, nested_func);
|
||||
for (unsigned idx = 1 ; idx < parms_.size() ; idx += 1) {
|
||||
if (parms_[idx] == NULL) {
|
||||
delete result;
|
||||
return new NexusSet;
|
||||
}
|
||||
NexusSet*tmp = parms_[idx]->nex_input(rem_out, always_sens);
|
||||
NexusSet*tmp = parms_[idx]->nex_input(rem_out, always_sens, nested_func);
|
||||
result->add(*tmp);
|
||||
delete tmp;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
NexusSet* NetEAccess::nex_input(bool, bool) const
|
||||
NexusSet* NetEAccess::nex_input(bool, bool, bool) const
|
||||
{
|
||||
return new NexusSet;
|
||||
}
|
||||
|
|
@ -91,62 +91,63 @@ NexusSet* NetEAccess::nex_input(bool, bool) const
|
|||
/*
|
||||
* A constant has not inputs, so always return an empty set.
|
||||
*/
|
||||
NexusSet* NetEConst::nex_input(bool, bool) const
|
||||
NexusSet* NetEConst::nex_input(bool, bool, bool) const
|
||||
{
|
||||
return new NexusSet;
|
||||
}
|
||||
|
||||
NexusSet* NetECReal::nex_input(bool, bool) const
|
||||
NexusSet* NetECReal::nex_input(bool, bool, bool) const
|
||||
{
|
||||
return new NexusSet;
|
||||
}
|
||||
|
||||
NexusSet* NetEEvent::nex_input(bool, bool) const
|
||||
NexusSet* NetEEvent::nex_input(bool, bool, bool) const
|
||||
{
|
||||
return new NexusSet;
|
||||
}
|
||||
|
||||
NexusSet* NetELast::nex_input(bool, bool) const
|
||||
NexusSet* NetELast::nex_input(bool, bool, bool) const
|
||||
{
|
||||
return new NexusSet;
|
||||
}
|
||||
|
||||
NexusSet* NetENetenum::nex_input(bool, bool) const
|
||||
NexusSet* NetENetenum::nex_input(bool, bool, bool) const
|
||||
{
|
||||
return new NexusSet;
|
||||
}
|
||||
|
||||
NexusSet* NetENew::nex_input(bool, bool) const
|
||||
NexusSet* NetENew::nex_input(bool, bool, bool) const
|
||||
{
|
||||
return new NexusSet;
|
||||
}
|
||||
|
||||
NexusSet* NetENull::nex_input(bool, bool) const
|
||||
NexusSet* NetENull::nex_input(bool, bool, bool) const
|
||||
{
|
||||
return new NexusSet;
|
||||
}
|
||||
|
||||
NexusSet* NetEProperty::nex_input(bool, bool) const
|
||||
NexusSet* NetEProperty::nex_input(bool, bool, bool) const
|
||||
{
|
||||
return new NexusSet;
|
||||
}
|
||||
|
||||
NexusSet* NetEScope::nex_input(bool, bool) const
|
||||
NexusSet* NetEScope::nex_input(bool, bool, bool) const
|
||||
{
|
||||
return new NexusSet;
|
||||
}
|
||||
|
||||
NexusSet* NetESelect::nex_input(bool rem_out, bool always_sens) const
|
||||
NexusSet* NetESelect::nex_input(bool rem_out, bool always_sens, bool nested_func) const
|
||||
{
|
||||
NexusSet*result = base_? base_->nex_input(rem_out, always_sens) : new NexusSet();
|
||||
NexusSet*tmp = expr_->nex_input(rem_out, always_sens);
|
||||
NexusSet*result = base_? base_->nex_input(rem_out, always_sens, nested_func) : new NexusSet();
|
||||
NexusSet*tmp = expr_->nex_input(rem_out, always_sens, nested_func);
|
||||
bool const_select = result->size() == 0;
|
||||
if (always_sens && const_select) {
|
||||
if (NetEConst *val = dynamic_cast <NetEConst*> (base_)) {
|
||||
assert(select_type() == IVL_SEL_OTHER);
|
||||
if (NetESignal *sig = dynamic_cast<NetESignal*> (expr_)) {
|
||||
delete tmp;
|
||||
tmp = sig->nex_input_base(rem_out, always_sens, val->value().as_unsigned(), expr_width());
|
||||
tmp = sig->nex_input_base(rem_out, always_sens, nested_func,
|
||||
val->value().as_unsigned(), expr_width());
|
||||
} else {
|
||||
cerr << get_fileline() << ": Sorry, cannot determine the sensitivity "
|
||||
<< "for the select of " << *expr_ << ", using all bits." << endl;
|
||||
|
|
@ -166,7 +167,7 @@ NexusSet* NetESelect::nex_input(bool rem_out, bool always_sens) const
|
|||
/*
|
||||
* The $fread, etc. system functions can have NULL arguments.
|
||||
*/
|
||||
NexusSet* NetESFunc::nex_input(bool rem_out, bool always_sens) const
|
||||
NexusSet* NetESFunc::nex_input(bool rem_out, bool always_sens, bool nested_func) const
|
||||
{
|
||||
NexusSet*result = new NexusSet;
|
||||
|
||||
|
|
@ -174,7 +175,7 @@ NexusSet* NetESFunc::nex_input(bool rem_out, bool always_sens) const
|
|||
|
||||
for (unsigned idx = 0 ; idx < parms_.size() ; idx += 1) {
|
||||
if (parms_[idx]) {
|
||||
NexusSet*tmp = parms_[idx]->nex_input(rem_out, always_sens);
|
||||
NexusSet*tmp = parms_[idx]->nex_input(rem_out, always_sens, nested_func);
|
||||
result->add(*tmp);
|
||||
delete tmp;
|
||||
}
|
||||
|
|
@ -183,17 +184,18 @@ NexusSet* NetESFunc::nex_input(bool rem_out, bool always_sens) const
|
|||
return result;
|
||||
}
|
||||
|
||||
NexusSet* NetEShallowCopy::nex_input(bool, bool) const
|
||||
NexusSet* NetEShallowCopy::nex_input(bool, bool, bool) const
|
||||
{
|
||||
return new NexusSet;
|
||||
}
|
||||
|
||||
NexusSet* NetESignal::nex_input(bool rem_out, bool always_sens) const
|
||||
NexusSet* NetESignal::nex_input(bool rem_out, bool always_sens, bool nested_func) const
|
||||
{
|
||||
return nex_input_base(rem_out, always_sens, 0, 0);
|
||||
return nex_input_base(rem_out, always_sens, nested_func, 0, 0);
|
||||
}
|
||||
|
||||
NexusSet* NetESignal::nex_input_base(bool rem_out, bool always_sens, unsigned base, unsigned width) const
|
||||
NexusSet* NetESignal::nex_input_base(bool rem_out, bool always_sens, bool nested_func,
|
||||
unsigned base, unsigned width) const
|
||||
{
|
||||
/*
|
||||
* This is not what I would expect for the various selects (bit,
|
||||
|
|
@ -209,7 +211,7 @@ NexusSet* NetESignal::nex_input_base(bool rem_out, bool always_sens, unsigned ba
|
|||
/* If we have an array index add it to the sensitivity list. */
|
||||
if (word_) {
|
||||
NexusSet*tmp;
|
||||
tmp = word_->nex_input(rem_out, always_sens);
|
||||
tmp = word_->nex_input(rem_out, always_sens, nested_func);
|
||||
result->add(*tmp);
|
||||
delete tmp;
|
||||
if (!always_sens && warn_sens_entire_arr) {
|
||||
|
|
@ -235,42 +237,44 @@ NexusSet* NetESignal::nex_input_base(bool rem_out, bool always_sens, unsigned ba
|
|||
return result;
|
||||
}
|
||||
|
||||
NexusSet* NetETernary::nex_input(bool rem_out, bool always_sens) const
|
||||
NexusSet* NetETernary::nex_input(bool rem_out, bool always_sens, bool nested_func) const
|
||||
{
|
||||
NexusSet*tmp;
|
||||
NexusSet*result = cond_->nex_input(rem_out, always_sens);
|
||||
NexusSet*result = cond_->nex_input(rem_out, always_sens, nested_func);
|
||||
|
||||
tmp = true_val_->nex_input(rem_out, always_sens);
|
||||
tmp = true_val_->nex_input(rem_out, always_sens, nested_func);
|
||||
result->add(*tmp);
|
||||
delete tmp;
|
||||
|
||||
tmp = false_val_->nex_input(rem_out, always_sens);
|
||||
tmp = false_val_->nex_input(rem_out, always_sens, nested_func);
|
||||
result->add(*tmp);
|
||||
delete tmp;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
NexusSet* NetEUFunc::nex_input(bool rem_out, bool always_sens) const
|
||||
NexusSet* NetEUFunc::nex_input(bool rem_out, bool always_sens, bool nested_func) const
|
||||
{
|
||||
static set<string> func_set;
|
||||
NexusSet*result = new NexusSet;
|
||||
string func_name;
|
||||
|
||||
// Avoid recursive function calls.
|
||||
func_name = scope_->fullname().peek_name();
|
||||
if (! scope_->parent()) func_set.clear();
|
||||
if (! func_set.insert(func_name).second) return result;
|
||||
|
||||
for (unsigned idx = 0 ; idx < parms_.size() ; idx += 1) {
|
||||
NexusSet*tmp = parms_[idx]->nex_input(rem_out, always_sens);
|
||||
NexusSet*tmp = parms_[idx]->nex_input(rem_out, always_sens, nested_func);
|
||||
result->add(*tmp);
|
||||
delete tmp;
|
||||
}
|
||||
|
||||
if (always_sens) {
|
||||
NetFuncDef*func = func_->func_def();
|
||||
NexusSet*tmp = func->proc()->nex_input(rem_out, always_sens);
|
||||
|
||||
// Avoid recursive function calls.
|
||||
static set<NetFuncDef*> func_set;
|
||||
if (!nested_func)
|
||||
func_set.clear();
|
||||
|
||||
if (!func_set.insert(func).second)
|
||||
return result;
|
||||
|
||||
NexusSet*tmp = func->proc()->nex_input(rem_out, always_sens, true);
|
||||
// Remove the function inputs
|
||||
NexusSet*in = new NexusSet;
|
||||
for (unsigned idx = 0 ; idx < func->port_count() ; idx += 1) {
|
||||
|
|
@ -288,28 +292,28 @@ NexusSet* NetEUFunc::nex_input(bool rem_out, bool always_sens) const
|
|||
return result;
|
||||
}
|
||||
|
||||
NexusSet* NetEUnary::nex_input(bool rem_out, bool always_sens) const
|
||||
NexusSet* NetEUnary::nex_input(bool rem_out, bool always_sens, bool nested_func) const
|
||||
{
|
||||
return expr_->nex_input(rem_out, always_sens);
|
||||
return expr_->nex_input(rem_out, always_sens, nested_func);
|
||||
}
|
||||
|
||||
NexusSet* NetAlloc::nex_input(bool, bool) const
|
||||
NexusSet* NetAlloc::nex_input(bool, bool, bool) const
|
||||
{
|
||||
return new NexusSet;
|
||||
}
|
||||
|
||||
NexusSet* NetAssign_::nex_input(bool rem_out, bool always_sens) const
|
||||
NexusSet* NetAssign_::nex_input(bool rem_out, bool always_sens, bool nested_func) const
|
||||
{
|
||||
assert(! nest_);
|
||||
NexusSet*result = new NexusSet;
|
||||
|
||||
if (word_) {
|
||||
NexusSet*tmp = word_->nex_input(rem_out, always_sens);
|
||||
NexusSet*tmp = word_->nex_input(rem_out, always_sens, nested_func);
|
||||
result->add(*tmp);
|
||||
delete tmp;
|
||||
}
|
||||
if (base_) {
|
||||
NexusSet*tmp = base_->nex_input(rem_out, always_sens);
|
||||
NexusSet*tmp = base_->nex_input(rem_out, always_sens, nested_func);
|
||||
result->add(*tmp);
|
||||
delete tmp;
|
||||
}
|
||||
|
|
@ -317,12 +321,12 @@ NexusSet* NetAssign_::nex_input(bool rem_out, bool always_sens) const
|
|||
return result;
|
||||
}
|
||||
|
||||
NexusSet* NetAssignBase::nex_input(bool rem_out, bool always_sens) const
|
||||
NexusSet* NetAssignBase::nex_input(bool rem_out, bool always_sens, bool nested_func) const
|
||||
{
|
||||
NexusSet*result = new NexusSet;
|
||||
// For the deassign and release statements there is no R-value.
|
||||
if (rval_) {
|
||||
NexusSet*tmp = rval_->nex_input(rem_out, always_sens);
|
||||
NexusSet*tmp = rval_->nex_input(rem_out, always_sens, nested_func);
|
||||
result->add(*tmp);
|
||||
delete tmp;
|
||||
}
|
||||
|
|
@ -331,7 +335,7 @@ NexusSet* NetAssignBase::nex_input(bool rem_out, bool always_sens) const
|
|||
particular, index expressions are statement inputs as well,
|
||||
so should be addressed here. */
|
||||
for (NetAssign_*cur = lval_ ; cur ; cur = cur->more) {
|
||||
NexusSet*tmp = cur->nex_input(rem_out, always_sens);
|
||||
NexusSet*tmp = cur->nex_input(rem_out, always_sens, nested_func);
|
||||
result->add(*tmp);
|
||||
delete tmp;
|
||||
}
|
||||
|
|
@ -356,7 +360,7 @@ NexusSet* NetAssignBase::nex_input(bool rem_out, bool always_sens) const
|
|||
* In this example, "t" should not be in the input set because it is
|
||||
* used by the sequence as a temporary value.
|
||||
*/
|
||||
NexusSet* NetBlock::nex_input(bool rem_out, bool always_sens) const
|
||||
NexusSet* NetBlock::nex_input(bool rem_out, bool always_sens, bool nested_func) const
|
||||
{
|
||||
if (last_ == 0) return new NexusSet;
|
||||
|
||||
|
|
@ -375,7 +379,7 @@ NexusSet* NetBlock::nex_input(bool rem_out, bool always_sens) const
|
|||
|
||||
do {
|
||||
/* Get the inputs for the current statement. */
|
||||
NexusSet*tmp = cur->nex_input(rem_out, always_sens);
|
||||
NexusSet*tmp = cur->nex_input(rem_out, always_sens, nested_func);
|
||||
|
||||
/* Add the current input set to the accumulated input set. */
|
||||
result->add(*tmp);
|
||||
|
|
@ -402,9 +406,9 @@ NexusSet* NetBlock::nex_input(bool rem_out, bool always_sens) const
|
|||
* the inputs to all the guards, and the inputs to all the guarded
|
||||
* statements.
|
||||
*/
|
||||
NexusSet* NetCase::nex_input(bool rem_out, bool always_sens) const
|
||||
NexusSet* NetCase::nex_input(bool rem_out, bool always_sens, bool nested_func) const
|
||||
{
|
||||
NexusSet*result = expr_->nex_input(rem_out, always_sens);
|
||||
NexusSet*result = expr_->nex_input(rem_out, always_sens, nested_func);
|
||||
|
||||
for (size_t idx = 0 ; idx < items_.size() ; idx += 1) {
|
||||
|
||||
|
|
@ -412,7 +416,7 @@ NexusSet* NetCase::nex_input(bool rem_out, bool always_sens) const
|
|||
if (items_[idx].statement == 0)
|
||||
continue;
|
||||
|
||||
NexusSet*tmp = items_[idx].statement->nex_input(rem_out, always_sens);
|
||||
NexusSet*tmp = items_[idx].statement->nex_input(rem_out, always_sens, nested_func);
|
||||
result->add(*tmp);
|
||||
delete tmp;
|
||||
|
||||
|
|
@ -420,7 +424,7 @@ NexusSet* NetCase::nex_input(bool rem_out, bool always_sens) const
|
|||
case is special and is identified by a null
|
||||
guard. The default guard obviously has no input. */
|
||||
if (items_[idx].guard) {
|
||||
tmp = items_[idx].guard->nex_input(rem_out, always_sens);
|
||||
tmp = items_[idx].guard->nex_input(rem_out, always_sens, nested_func);
|
||||
result->add(*tmp);
|
||||
delete tmp;
|
||||
}
|
||||
|
|
@ -429,18 +433,18 @@ NexusSet* NetCase::nex_input(bool rem_out, bool always_sens) const
|
|||
return result;
|
||||
}
|
||||
|
||||
NexusSet* NetCondit::nex_input(bool rem_out, bool always_sens) const
|
||||
NexusSet* NetCondit::nex_input(bool rem_out, bool always_sens, bool nested_func) const
|
||||
{
|
||||
NexusSet*result = expr_->nex_input(rem_out, always_sens);
|
||||
NexusSet*result = expr_->nex_input(rem_out, always_sens, nested_func);
|
||||
|
||||
if (if_ != 0) {
|
||||
NexusSet*tmp = if_->nex_input(rem_out, always_sens);
|
||||
NexusSet*tmp = if_->nex_input(rem_out, always_sens, nested_func);
|
||||
result->add(*tmp);
|
||||
delete tmp;
|
||||
}
|
||||
|
||||
if (else_ != 0) {
|
||||
NexusSet*tmp = else_->nex_input(rem_out, always_sens);
|
||||
NexusSet*tmp = else_->nex_input(rem_out, always_sens, nested_func);
|
||||
result->add(*tmp);
|
||||
delete tmp;
|
||||
}
|
||||
|
|
@ -448,17 +452,17 @@ NexusSet* NetCondit::nex_input(bool rem_out, bool always_sens) const
|
|||
return result;
|
||||
}
|
||||
|
||||
NexusSet* NetDisable::nex_input(bool, bool) const
|
||||
NexusSet* NetDisable::nex_input(bool, bool, bool) const
|
||||
{
|
||||
return new NexusSet;
|
||||
}
|
||||
|
||||
NexusSet* NetDoWhile::nex_input(bool rem_out, bool always_sens) const
|
||||
NexusSet* NetDoWhile::nex_input(bool rem_out, bool always_sens, bool nested_func) const
|
||||
{
|
||||
NexusSet*result = cond_->nex_input(rem_out, always_sens);
|
||||
NexusSet*result = cond_->nex_input(rem_out, always_sens, nested_func);
|
||||
|
||||
if (proc_) {
|
||||
NexusSet*tmp = proc_->nex_input(rem_out, always_sens);
|
||||
NexusSet*tmp = proc_->nex_input(rem_out, always_sens, nested_func);
|
||||
result->add(*tmp);
|
||||
delete tmp;
|
||||
}
|
||||
|
|
@ -466,17 +470,17 @@ NexusSet* NetDoWhile::nex_input(bool rem_out, bool always_sens) const
|
|||
return result;
|
||||
}
|
||||
|
||||
NexusSet* NetEvTrig::nex_input(bool, bool) const
|
||||
NexusSet* NetEvTrig::nex_input(bool, bool, bool) const
|
||||
{
|
||||
return new NexusSet;
|
||||
}
|
||||
|
||||
NexusSet* NetEvWait::nex_input(bool rem_out, bool always_sens) const
|
||||
NexusSet* NetEvWait::nex_input(bool rem_out, bool always_sens, bool nested_func) const
|
||||
{
|
||||
NexusSet*result = new NexusSet;
|
||||
|
||||
if (statement_) {
|
||||
NexusSet*tmp = statement_->nex_input(rem_out, always_sens);
|
||||
NexusSet*tmp = statement_->nex_input(rem_out, always_sens, nested_func);
|
||||
result->add(*tmp);
|
||||
delete tmp;
|
||||
}
|
||||
|
|
@ -484,12 +488,12 @@ NexusSet* NetEvWait::nex_input(bool rem_out, bool always_sens) const
|
|||
return result;
|
||||
}
|
||||
|
||||
NexusSet* NetForever::nex_input(bool rem_out, bool always_sens) const
|
||||
NexusSet* NetForever::nex_input(bool rem_out, bool always_sens, bool nested_func) const
|
||||
{
|
||||
NexusSet*result = new NexusSet;
|
||||
|
||||
if (statement_) {
|
||||
NexusSet*tmp = statement_->nex_input(rem_out, always_sens);
|
||||
NexusSet*tmp = statement_->nex_input(rem_out, always_sens, nested_func);
|
||||
result->add(*tmp);
|
||||
delete tmp;
|
||||
}
|
||||
|
|
@ -497,30 +501,30 @@ NexusSet* NetForever::nex_input(bool rem_out, bool always_sens) const
|
|||
return result;
|
||||
}
|
||||
|
||||
NexusSet* NetForLoop::nex_input(bool rem_out, bool always_sens) const
|
||||
NexusSet* NetForLoop::nex_input(bool rem_out, bool always_sens, bool nested_func) const
|
||||
{
|
||||
NexusSet*result = new NexusSet;
|
||||
|
||||
if (init_expr_) {
|
||||
NexusSet*tmp = init_expr_->nex_input(rem_out, always_sens);
|
||||
NexusSet*tmp = init_expr_->nex_input(rem_out, always_sens, nested_func);
|
||||
result->add(*tmp);
|
||||
delete tmp;
|
||||
}
|
||||
|
||||
if (condition_) {
|
||||
NexusSet*tmp = condition_->nex_input(rem_out, always_sens);
|
||||
NexusSet*tmp = condition_->nex_input(rem_out, always_sens, nested_func);
|
||||
result->add(*tmp);
|
||||
delete tmp;
|
||||
}
|
||||
|
||||
if (step_statement_) {
|
||||
NexusSet*tmp = step_statement_->nex_input(rem_out, always_sens);
|
||||
NexusSet*tmp = step_statement_->nex_input(rem_out, always_sens, nested_func);
|
||||
result->add(*tmp);
|
||||
delete tmp;
|
||||
}
|
||||
|
||||
if (statement_) {
|
||||
NexusSet*tmp = statement_->nex_input(rem_out, always_sens);
|
||||
NexusSet*tmp = statement_->nex_input(rem_out, always_sens, nested_func);
|
||||
result->add(*tmp);
|
||||
delete tmp;
|
||||
}
|
||||
|
|
@ -537,7 +541,7 @@ NexusSet* NetForLoop::nex_input(bool rem_out, bool always_sens) const
|
|||
return result;
|
||||
}
|
||||
|
||||
NexusSet* NetFree::nex_input(bool, bool) const
|
||||
NexusSet* NetFree::nex_input(bool, bool, bool) const
|
||||
{
|
||||
return new NexusSet;
|
||||
}
|
||||
|
|
@ -551,12 +555,12 @@ NexusSet* NetFree::nex_input(bool, bool) const
|
|||
* include the input set of the <expr> because it does not affect the
|
||||
* result. The statement can be omitted.
|
||||
*/
|
||||
NexusSet* NetPDelay::nex_input(bool rem_out, bool always_sens) const
|
||||
NexusSet* NetPDelay::nex_input(bool rem_out, bool always_sens, bool nested_func) const
|
||||
{
|
||||
NexusSet*result = new NexusSet;
|
||||
|
||||
if (statement_) {
|
||||
NexusSet*tmp = statement_->nex_input(rem_out, always_sens);
|
||||
NexusSet*tmp = statement_->nex_input(rem_out, always_sens, nested_func);
|
||||
result->add(*tmp);
|
||||
delete tmp;
|
||||
}
|
||||
|
|
@ -564,12 +568,12 @@ NexusSet* NetPDelay::nex_input(bool rem_out, bool always_sens) const
|
|||
return result;
|
||||
}
|
||||
|
||||
NexusSet* NetRepeat::nex_input(bool rem_out, bool always_sens) const
|
||||
NexusSet* NetRepeat::nex_input(bool rem_out, bool always_sens, bool nested_func) const
|
||||
{
|
||||
NexusSet*result = expr_->nex_input(rem_out, always_sens);
|
||||
NexusSet*result = expr_->nex_input(rem_out, always_sens, nested_func);
|
||||
|
||||
if (statement_) {
|
||||
NexusSet*tmp = statement_->nex_input(rem_out, always_sens);
|
||||
NexusSet*tmp = statement_->nex_input(rem_out, always_sens, nested_func);
|
||||
result->add(*tmp);
|
||||
delete tmp;
|
||||
}
|
||||
|
|
@ -580,7 +584,7 @@ NexusSet* NetRepeat::nex_input(bool rem_out, bool always_sens) const
|
|||
/*
|
||||
* The $display, etc. system tasks can have NULL arguments.
|
||||
*/
|
||||
NexusSet* NetSTask::nex_input(bool rem_out, bool always_sens) const
|
||||
NexusSet* NetSTask::nex_input(bool rem_out, bool always_sens, bool nested_func) const
|
||||
{
|
||||
NexusSet*result = new NexusSet;
|
||||
|
||||
|
|
@ -588,7 +592,7 @@ NexusSet* NetSTask::nex_input(bool rem_out, bool always_sens) const
|
|||
|
||||
for (unsigned idx = 0 ; idx < parms_.size() ; idx += 1) {
|
||||
if (parms_[idx]) {
|
||||
NexusSet*tmp = parms_[idx]->nex_input(rem_out, always_sens);
|
||||
NexusSet*tmp = parms_[idx]->nex_input(rem_out, always_sens, nested_func);
|
||||
result->add(*tmp);
|
||||
delete tmp;
|
||||
}
|
||||
|
|
@ -602,17 +606,17 @@ NexusSet* NetSTask::nex_input(bool rem_out, bool always_sens) const
|
|||
* parameters to consider, because the compiler already removed them
|
||||
* and converted them to blocking assignments.
|
||||
*/
|
||||
NexusSet* NetUTask::nex_input(bool, bool) const
|
||||
NexusSet* NetUTask::nex_input(bool, bool, bool) const
|
||||
{
|
||||
return new NexusSet;
|
||||
}
|
||||
|
||||
NexusSet* NetWhile::nex_input(bool rem_out, bool always_sens) const
|
||||
NexusSet* NetWhile::nex_input(bool rem_out, bool always_sens, bool nested_func) const
|
||||
{
|
||||
NexusSet*result = cond_->nex_input(rem_out, always_sens);
|
||||
NexusSet*result = cond_->nex_input(rem_out, always_sens, nested_func);
|
||||
|
||||
if (proc_) {
|
||||
NexusSet*tmp = proc_->nex_input(rem_out, always_sens);
|
||||
NexusSet*tmp = proc_->nex_input(rem_out, always_sens, nested_func);
|
||||
result->add(*tmp);
|
||||
delete tmp;
|
||||
}
|
||||
|
|
|
|||
122
netlist.h
122
netlist.h
|
|
@ -2054,7 +2054,8 @@ class NetExpr : public LineInfo {
|
|||
// Get the Nexus that are the input to this
|
||||
// expression. Normally this descends down to the reference to
|
||||
// a signal that reads from its input.
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const =0;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const =0;
|
||||
|
||||
// Return a version of myself that is structural. This is used
|
||||
// for converting expressions to gates. The arguments are:
|
||||
|
|
@ -2097,7 +2098,8 @@ class NetEArrayPattern : public NetExpr {
|
|||
void dump(ostream&) const;
|
||||
|
||||
NetEArrayPattern* dup_expr() const;
|
||||
NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
|
||||
private:
|
||||
std::vector<NetExpr*> items_;
|
||||
|
|
@ -2130,7 +2132,8 @@ class NetEConst : public NetExpr {
|
|||
|
||||
virtual NetEConst* dup_expr() const;
|
||||
virtual NetNet*synthesize(Design*, NetScope*scope, NetExpr*);
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
|
||||
virtual NetExpr*evaluate_function(const LineInfo&loc,
|
||||
map<perm_string,LocalVar>&ctx) const;
|
||||
|
|
@ -2202,7 +2205,8 @@ class NetECReal : public NetExpr {
|
|||
|
||||
virtual NetECReal* dup_expr() const;
|
||||
virtual NetNet*synthesize(Design*, NetScope*scope, NetExpr*);
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
|
||||
virtual NetExpr*evaluate_function(const LineInfo&loc,
|
||||
map<perm_string,LocalVar>&ctx) const;
|
||||
|
|
@ -2646,7 +2650,8 @@ class NetProc : public virtual LineInfo {
|
|||
// Find the nexa that are input by the statement. This is used
|
||||
// for example by @* to find the inputs to the process for the
|
||||
// sensitivity list.
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
|
||||
// Find the nexa that are set by the statement. Add the output
|
||||
// values to the set passed as a parameter.
|
||||
|
|
@ -2754,7 +2759,8 @@ class NetAlloc : public NetProc {
|
|||
|
||||
const NetScope* scope() const;
|
||||
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
virtual void nex_output(NexusSet&);
|
||||
virtual bool emit_proc(struct target_t*) const;
|
||||
virtual void dump(ostream&, unsigned ind) const;
|
||||
|
|
@ -2863,7 +2869,8 @@ class NetAssign_ {
|
|||
// being outputs. For example foo[idx] = ... is the l-value
|
||||
// (NetAssign_ object) with a foo l-value and the input
|
||||
// expression idx.
|
||||
NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
|
||||
// Figuring out nex_output to process ultimately comes down to
|
||||
// this method.
|
||||
|
|
@ -2911,7 +2918,8 @@ class NetAssignBase : public NetProc {
|
|||
void set_delay(NetExpr*);
|
||||
const NetExpr* get_delay() const;
|
||||
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
virtual void nex_output(NexusSet&o);
|
||||
|
||||
|
||||
|
|
@ -3029,7 +3037,8 @@ class NetBlock : public NetProc {
|
|||
// for sequential blocks.
|
||||
void emit_recurse(struct target_t*) const;
|
||||
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
virtual void nex_output(NexusSet&);
|
||||
virtual bool emit_proc(struct target_t*) const;
|
||||
virtual int match_proc(struct proc_match_t*);
|
||||
|
|
@ -3078,7 +3087,8 @@ class NetCase : public NetProc {
|
|||
inline const NetExpr*expr(unsigned idx) const { return items_[idx].guard;}
|
||||
inline const NetProc*stat(unsigned idx) const { return items_[idx].statement; }
|
||||
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
virtual void nex_output(NexusSet&out);
|
||||
|
||||
bool synth_async(Design*des, NetScope*scope,
|
||||
|
|
@ -3159,7 +3169,8 @@ class NetCondit : public NetProc {
|
|||
bool emit_recurse_if(struct target_t*) const;
|
||||
bool emit_recurse_else(struct target_t*) const;
|
||||
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
virtual void nex_output(NexusSet&o);
|
||||
|
||||
bool is_asynchronous();
|
||||
|
|
@ -3250,7 +3261,8 @@ class NetDisable : public NetProc {
|
|||
|
||||
const NetScope*target() const;
|
||||
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
virtual void nex_output(NexusSet&);
|
||||
virtual bool emit_proc(struct target_t*) const;
|
||||
virtual void dump(ostream&, unsigned ind) const;
|
||||
|
|
@ -3281,7 +3293,8 @@ class NetDoWhile : public NetProc {
|
|||
|
||||
void emit_proc_recurse(struct target_t*) const;
|
||||
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
virtual void nex_output(NexusSet&);
|
||||
virtual bool emit_proc(struct target_t*) const;
|
||||
virtual void dump(ostream&, unsigned ind) const;
|
||||
|
|
@ -3415,7 +3428,8 @@ class NetEvTrig : public NetProc {
|
|||
|
||||
const NetEvent*event() const;
|
||||
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
virtual void nex_output(NexusSet&);
|
||||
virtual bool emit_proc(struct target_t*) const;
|
||||
virtual void dump(ostream&, unsigned ind) const;
|
||||
|
|
@ -3457,7 +3471,8 @@ class NetEvWait : public NetProc {
|
|||
// process? This method checks.
|
||||
virtual bool is_synchronous();
|
||||
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
virtual void nex_output(NexusSet&out);
|
||||
|
||||
virtual bool synth_async(Design*des, NetScope*scope,
|
||||
|
|
@ -3543,7 +3558,8 @@ class NetForever : public NetProc {
|
|||
|
||||
void emit_recurse(struct target_t*) const;
|
||||
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
virtual void nex_output(NexusSet&);
|
||||
virtual bool emit_proc(struct target_t*) const;
|
||||
virtual void dump(ostream&, unsigned ind) const;
|
||||
|
|
@ -3567,7 +3583,8 @@ class NetForLoop : public NetProc {
|
|||
|
||||
void emit_recurse(struct target_t*) const;
|
||||
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
virtual void nex_output(NexusSet&);
|
||||
virtual bool emit_proc(struct target_t*) const;
|
||||
virtual void dump(ostream&, unsigned ind) const;
|
||||
|
|
@ -3605,7 +3622,8 @@ class NetFree : public NetProc {
|
|||
|
||||
const NetScope* scope() const;
|
||||
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
virtual void nex_output(NexusSet&);
|
||||
virtual bool emit_proc(struct target_t*) const;
|
||||
virtual void dump(ostream&, unsigned ind) const;
|
||||
|
|
@ -3670,7 +3688,8 @@ class NetPDelay : public NetProc {
|
|||
uint64_t delay() const;
|
||||
const NetExpr*expr() const;
|
||||
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
virtual void nex_output(NexusSet&);
|
||||
|
||||
virtual bool emit_proc(struct target_t*) const;
|
||||
|
|
@ -3698,7 +3717,8 @@ class NetRepeat : public NetProc {
|
|||
const NetExpr*expr() const;
|
||||
void emit_recurse(struct target_t*) const;
|
||||
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
virtual void nex_output(NexusSet&);
|
||||
virtual bool emit_proc(struct target_t*) const;
|
||||
virtual void dump(ostream&, unsigned ind) const;
|
||||
|
|
@ -3752,7 +3772,8 @@ class NetSTask : public NetProc {
|
|||
|
||||
const NetExpr* parm(unsigned idx) const;
|
||||
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
virtual void nex_output(NexusSet&);
|
||||
virtual bool emit_proc(struct target_t*) const;
|
||||
virtual void dump(ostream&, unsigned ind) const;
|
||||
|
|
@ -3813,7 +3834,8 @@ class NetELast : public NetExpr {
|
|||
|
||||
virtual void expr_scan(struct expr_scan_t*) const;
|
||||
virtual NetELast*dup_expr() const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
|
||||
private:
|
||||
NetNet*sig_;
|
||||
|
|
@ -3842,7 +3864,8 @@ class NetEUFunc : public NetExpr {
|
|||
|
||||
virtual void expr_scan(struct expr_scan_t*) const;
|
||||
virtual NetEUFunc*dup_expr() const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
virtual NetExpr* eval_tree();
|
||||
virtual NetExpr*evaluate_function(const LineInfo&loc,
|
||||
map<perm_string,LocalVar>&ctx) const;
|
||||
|
|
@ -3878,7 +3901,8 @@ class NetEAccess : public NetExpr {
|
|||
|
||||
virtual void expr_scan(struct expr_scan_t*) const;
|
||||
virtual NetEAccess*dup_expr() const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
|
||||
private:
|
||||
NetBranch*branch_;
|
||||
|
|
@ -3900,7 +3924,8 @@ class NetUTask : public NetProc {
|
|||
|
||||
const NetScope* task() const;
|
||||
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
virtual void nex_output(NexusSet&);
|
||||
virtual bool emit_proc(struct target_t*) const;
|
||||
virtual void dump(ostream&, unsigned ind) const;
|
||||
|
|
@ -3926,7 +3951,8 @@ class NetWhile : public NetProc {
|
|||
|
||||
void emit_proc_recurse(struct target_t*) const;
|
||||
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
virtual void nex_output(NexusSet&);
|
||||
virtual bool emit_proc(struct target_t*) const;
|
||||
virtual void dump(ostream&, unsigned ind) const;
|
||||
|
|
@ -4070,7 +4096,8 @@ class NetEBinary : public NetExpr {
|
|||
virtual NetExpr* eval_tree();
|
||||
virtual NetExpr* evaluate_function(const LineInfo&loc,
|
||||
map<perm_string,LocalVar>&ctx) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
|
||||
virtual void expr_scan(struct expr_scan_t*) const;
|
||||
virtual void dump(ostream&) const;
|
||||
|
|
@ -4324,7 +4351,8 @@ class NetEConcat : public NetExpr {
|
|||
NetExpr* parm(unsigned idx) const { return parms_[idx]; }
|
||||
|
||||
virtual ivl_variable_type_t expr_type() const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
virtual bool has_width() const;
|
||||
virtual NetEConcat* dup_expr() const;
|
||||
virtual NetEConst* eval_tree();
|
||||
|
|
@ -4372,7 +4400,8 @@ class NetESelect : public NetExpr {
|
|||
// sub-expression.
|
||||
virtual ivl_variable_type_t expr_type() const;
|
||||
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
virtual bool has_width() const;
|
||||
virtual void expr_scan(struct expr_scan_t*) const;
|
||||
virtual NetEConst* eval_tree();
|
||||
|
|
@ -4401,7 +4430,8 @@ class NetEEvent : public NetExpr {
|
|||
|
||||
virtual void expr_scan(struct expr_scan_t*) const;
|
||||
virtual NetEEvent* dup_expr() const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
|
||||
virtual void dump(ostream&os) const;
|
||||
|
||||
|
|
@ -4424,7 +4454,8 @@ class NetENetenum : public NetExpr {
|
|||
|
||||
virtual void expr_scan(struct expr_scan_t*) const;
|
||||
virtual NetENetenum* dup_expr() const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
|
||||
virtual void dump(ostream&os) const;
|
||||
|
||||
|
|
@ -4448,7 +4479,8 @@ class NetENew : public NetExpr {
|
|||
|
||||
virtual void expr_scan(struct expr_scan_t*) const;
|
||||
virtual NetENew* dup_expr() const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
|
||||
virtual void dump(ostream&os) const;
|
||||
|
||||
|
|
@ -4470,7 +4502,8 @@ class NetENull : public NetExpr {
|
|||
|
||||
virtual void expr_scan(struct expr_scan_t*) const;
|
||||
virtual NetENull* dup_expr() const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
|
||||
virtual void dump(ostream&os) const;
|
||||
};
|
||||
|
|
@ -4496,7 +4529,8 @@ class NetEProperty : public NetExpr {
|
|||
ivl_variable_type_t expr_type() const;
|
||||
virtual void expr_scan(struct expr_scan_t*) const;
|
||||
virtual NetEProperty* dup_expr() const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
|
||||
virtual void dump(ostream&os) const;
|
||||
|
||||
|
|
@ -4521,7 +4555,8 @@ class NetEScope : public NetExpr {
|
|||
|
||||
virtual void expr_scan(struct expr_scan_t*) const;
|
||||
virtual NetEScope* dup_expr() const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
|
||||
virtual void dump(ostream&os) const;
|
||||
|
||||
|
|
@ -4555,7 +4590,8 @@ class NetESFunc : public NetExpr {
|
|||
map<perm_string,LocalVar>&ctx) const;
|
||||
|
||||
virtual ivl_variable_type_t expr_type() const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
virtual const netenum_t* enumeration() const;
|
||||
virtual void dump(ostream&) const;
|
||||
|
||||
|
|
@ -4690,7 +4726,8 @@ class NetEShallowCopy : public NetExpr {
|
|||
|
||||
virtual void expr_scan(struct expr_scan_t*) const;
|
||||
virtual NetEShallowCopy* dup_expr() const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
|
||||
virtual void dump(ostream&os) const;
|
||||
|
||||
|
|
@ -4722,7 +4759,8 @@ class NetETernary : public NetExpr {
|
|||
virtual NetExpr*evaluate_function(const LineInfo&loc,
|
||||
map<perm_string,LocalVar>&ctx) const;
|
||||
virtual ivl_variable_type_t expr_type() const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
virtual void expr_scan(struct expr_scan_t*) const;
|
||||
virtual void dump(ostream&) const;
|
||||
virtual NetNet*synthesize(Design*, NetScope*scope, NetExpr*root);
|
||||
|
|
@ -4777,7 +4815,8 @@ class NetEUnary : public NetExpr {
|
|||
virtual NetNet* synthesize(Design*, NetScope*scope, NetExpr*root);
|
||||
|
||||
virtual ivl_variable_type_t expr_type() const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
virtual NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
virtual void expr_scan(struct expr_scan_t*) const;
|
||||
virtual void dump(ostream&) const;
|
||||
|
||||
|
|
@ -4853,8 +4892,9 @@ class NetESignal : public NetExpr {
|
|||
|
||||
virtual NetESignal* dup_expr() const;
|
||||
NetNet* synthesize(Design*des, NetScope*scope, NetExpr*root);
|
||||
NexusSet* nex_input(bool rem_out = true, bool always_sens = false) const;
|
||||
NexusSet* nex_input_base(bool rem_out, bool always_sens,
|
||||
NexusSet* nex_input(bool rem_out = true, bool always_sens = false,
|
||||
bool nested_func = false) const;
|
||||
NexusSet* nex_input_base(bool rem_out, bool always_sens, bool nested_func,
|
||||
unsigned base, unsigned width) const;
|
||||
const netenum_t*enumeration() const;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue