diff --git a/design_dump.cc b/design_dump.cc index 75505a180..b1b43d6ce 100644 --- a/design_dump.cc +++ b/design_dump.cc @@ -77,6 +77,8 @@ void NetNet::dump_net(ostream&o, unsigned ind) const o << " (local)"; if (signed_) o << " signed"; + if (mref_) + o << " mref_=" << mref_->name(); switch (port_type_) { case NetNet::NOT_A_PORT: break; @@ -464,7 +466,7 @@ void NetProcTop::dump(ostream&o, unsigned ind) const void NetAssign_::dump_lval(ostream&o) const { if (sig_) { - o << sig_->name(); + o << "sig=" << sig_->name(); if (bmux_) { o << "[" << *bmux_ << "]"; @@ -475,7 +477,7 @@ void NetAssign_::dump_lval(ostream&o) const // Is there an obvious way to flag memories in the dump // as different from the _real_ bit mux case? // o << "**memory**"; - o << mem_->name() << "["; + o << "mem=" << mem_->name() << "["; if (bmux_) o << *bmux_; else o << "**oops**"; o << "]"; diff --git a/elab_expr.cc b/elab_expr.cc index 252a9b92b..336cdb60b 100644 --- a/elab_expr.cc +++ b/elab_expr.cc @@ -500,6 +500,17 @@ NetExpr* PEIdent::elaborate_expr(Design*des, NetScope*scope, NetScope*found_in = symbol_search(des, scope, path_, net, mem, var, par, eve); + if (net && mem) { + assert(net == mem->reg_from_explode()); + net = 0; + } + + if (net && net->mref()) { + mem = net->mref(); + assert(net == mem->reg_from_explode()); + net = 0; + } + // If the identifier name is a parameter name, then return // a reference to the parameter expression. if (par != 0) { diff --git a/elab_net.cc b/elab_net.cc index 959a7347d..6e443b923 100644 --- a/elab_net.cc +++ b/elab_net.cc @@ -499,7 +499,7 @@ NetNet* PEBinary::elaborate_net_cmp_(Design*des, NetScope*scope, use of the situation, or 0 if it cannot. */ if (NetEConst*tmp = dynamic_cast(rexp)) { - lsig = lexp->synthesize(des); + lsig = left_->elaborate_net(des, scope, 0, 0, 0, 0); if (lsig == 0) { cerr << get_line() << ": internal error: " "Cannot elaborate net for " << *lexp << endl; @@ -519,7 +519,7 @@ NetNet* PEBinary::elaborate_net_cmp_(Design*des, NetScope*scope, if (NetEConst*tmp = dynamic_cast(lexp)) { - rsig = rexp->synthesize(des); + rsig = right_->elaborate_net(des, scope, 0, 0, 0, 0); assert(rsig); delete rexp; @@ -533,13 +533,13 @@ NetNet* PEBinary::elaborate_net_cmp_(Design*des, NetScope*scope, } if (lsig == 0) { - lsig = lexp->synthesize(des); + lsig = left_->elaborate_net(des, scope, 0, 0, 0, 0); assert(lsig); delete lexp; } if (rsig == 0) { - rsig = rexp->synthesize(des); + rsig = right_->elaborate_net(des, scope, 0, 0, 0, 0); assert(rsig); delete rexp; } diff --git a/expr_synth.cc b/expr_synth.cc index 9f29937ac..7e19be80d 100644 --- a/expr_synth.cc +++ b/expr_synth.cc @@ -62,6 +62,7 @@ NetNet* NetEBitSel::synthesize(Design*des) NetMux*mux = new NetMux(scope, scope->local_symbol(), 1, net->pin_count(), adr->pin_count()); + mux->set_line(*this); des->add_node(mux); for (unsigned idx = 0 ; idx < net->pin_count() ; idx += 1) diff --git a/netlist.cc b/netlist.cc index 3b1376c46..b903f6014 100644 --- a/netlist.cc +++ b/netlist.cc @@ -2226,6 +2226,7 @@ NetNet* NetMemory::explode_to_reg() return explode_; explode_ = new NetNet(scope_, name_, NetNet::REG, count()*width_); + explode_->mref(this); //explode_->incr_lref(); return explode_; }