Properly detect wire arrays in l-values.
Wires are not allowed as l-values of procedural assignments, even if the wire is an array. Fix the checker to detect this case event when the l-value is an array.
This commit is contained in:
parent
8e4952d753
commit
6828620977
28
elab_lval.cc
28
elab_lval.cc
|
|
@ -179,6 +179,19 @@ NetAssign_* PEIdent::elaborate_lval(Design*des,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Get the signal referenced by the identifier, and make sure
|
||||||
|
it is a register. Wires are not allows in this context,
|
||||||
|
unless this is the l-value of a force. */
|
||||||
|
if ((reg->type() != NetNet::REG) && !is_force) {
|
||||||
|
cerr << get_fileline() << ": error: " << path_ <<
|
||||||
|
" is not a valid l-value in " << scope_path(scope) <<
|
||||||
|
"." << endl;
|
||||||
|
cerr << reg->get_fileline() << ": : " << path_ <<
|
||||||
|
" is declared here as " << reg->type() << "." << endl;
|
||||||
|
des->errors += 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (reg->array_dimensions() > 0)
|
if (reg->array_dimensions() > 0)
|
||||||
return elaborate_lval_net_word_(des, scope, reg);
|
return elaborate_lval_net_word_(des, scope, reg);
|
||||||
|
|
||||||
|
|
@ -195,19 +208,6 @@ NetAssign_* PEIdent::elaborate_lval(Design*des,
|
||||||
return lv;
|
return lv;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the signal referenced by the identifier, and make sure
|
|
||||||
it is a register. Wires are not allows in this context,
|
|
||||||
unless this is the l-value of a force. */
|
|
||||||
if ((reg->type() != NetNet::REG) && !is_force) {
|
|
||||||
cerr << get_fileline() << ": error: " << path_ <<
|
|
||||||
" is not a valid l-value in " << scope_path(scope) <<
|
|
||||||
"." << endl;
|
|
||||||
cerr << reg->get_fileline() << ": : " << path_ <<
|
|
||||||
" is declared here as " << reg->type() << "." << endl;
|
|
||||||
des->errors += 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (use_sel == index_component_t::SEL_BIT) {
|
if (use_sel == index_component_t::SEL_BIT) {
|
||||||
NetAssign_*lv = new NetAssign_(reg);
|
NetAssign_*lv = new NetAssign_(reg);
|
||||||
|
|
@ -274,7 +274,7 @@ NetAssign_* PEIdent::elaborate_lval_net_word_(Design*des,
|
||||||
if (NetEConst*word_const = dynamic_cast<NetEConst*>(word)) {
|
if (NetEConst*word_const = dynamic_cast<NetEConst*>(word)) {
|
||||||
verinum word_val = word_const->value();
|
verinum word_val = word_const->value();
|
||||||
long index = word_val.as_long();
|
long index = word_val.as_long();
|
||||||
assert (reg->array_count() <= LONG_MAX);
|
|
||||||
if (index < 0 || index >= (long) reg->array_count()) {
|
if (index < 0 || index >= (long) reg->array_count()) {
|
||||||
cerr << get_fileline() << ": warning: Constant array index "
|
cerr << get_fileline() << ": warning: Constant array index "
|
||||||
<< (index + reg->array_first())
|
<< (index + reg->array_first())
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue