diff --git a/elab_expr.cc b/elab_expr.cc index d7d6c35de..4bffc326e 100644 --- a/elab_expr.cc +++ b/elab_expr.cc @@ -3293,6 +3293,12 @@ NetExpr* PEIdent::elaborate_expr_net_idx_up_(Design*des, NetScope*scope, return ss; } + if (net->sig()->packed_dims().size() > 1) { + cerr << get_fileline() << ": sorry: Indexed part select of packed arrays not supported here." << endl; + des->errors += 1; + return net; + } + base = normalize_variable_base(base, net->msi(), net->lsi(), wid, true); NetESelect*ss = new NetESelect(net, base, wid, IVL_SEL_IDX_UP); @@ -3551,7 +3557,7 @@ NetExpr* PEIdent::elaborate_expr_net(Design*des, NetScope*scope, list prefix_indices; bool rc = evaluate_index_prefix(des, scope, prefix_indices, path_.back().index); - ivl_assert(*this, rc); + if (!rc) return 0; // If this is a part select of a signal, then make a new // temporary signal that is connected to just the diff --git a/elab_lval.cc b/elab_lval.cc index b34143a80..95c0167c6 100644 --- a/elab_lval.cc +++ b/elab_lval.cc @@ -359,7 +359,7 @@ bool PEIdent::elaborate_lval_net_bit_(Design*des, { listprefix_indices; bool rc = calculate_packed_indices_(des, scope, lv->sig(), prefix_indices); - ivl_assert(*this, rc); + if (!rc) return false; const name_component_t&name_tail = path_.back(); ivl_assert(*this, !name_tail.index.empty()); @@ -597,6 +597,13 @@ bool PEIdent::elaborate_lval_net_idx_(Design*des, } } } else { + if (reg->packed_dims().size() > 1) { + cerr << get_fileline() << ": sorry: " + << "Indexed part select of packed arrays not supported nere." << endl; + des->errors += 1; + return false; + } + /* Correct the mux for the range of the vector. */ if (use_sel == index_component_t::SEL_IDX_UP) { base = normalize_variable_base(base, reg->packed_dims(), diff --git a/netmisc.cc b/netmisc.cc index d4285c82e..8a08a48ff 100644 --- a/netmisc.cc +++ b/netmisc.cc @@ -937,13 +937,13 @@ bool evaluate_index_prefix(Design*des, NetScope*scope, assert(icur != indices.end()); assert(icur->sel == index_component_t::SEL_BIT); NetExpr*texpr = elab_and_eval(des, scope, icur->msb, -1, true); - ivl_assert(*icur->msb, texpr); + long tmp; - if (!eval_as_long(tmp, texpr)) { + if (texpr == 0 || !eval_as_long(tmp, texpr)) { cerr << icur->msb->get_fileline() << ": error: " - "Array index expressions must be constant." << endl; + "Array index expressions must be constant here." << endl; des->errors += 1; - return 0; + return false; } prefix_indices .push_back(tmp);