Fix #1265: Allow continuous assignment of single-element unpacked arrays
The original check used `pin_count() > 1` to detect whole-array assignments, which missed single-element arrays like `[0:0]` where pin_count is 1. The fix checks for whole-array assignments by: 1. Multi-element arrays (pin_count > 1) - always whole-array 2. Single-element unpacked arrays - check if the lval expression has array indices. If no indices, it's a whole-array reference. This correctly distinguishes between: - `assign arr = expr` (whole array) -> elaborate_unpacked_array_ - `assign arr[i] = expr` (indexed element) -> normal path Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
6853bad106
commit
1710b71fd2
20
elaborate.cc
20
elaborate.cc
|
|
@ -133,8 +133,26 @@ void PGAssign::elaborate(Design*des, NetScope*scope) const
|
|||
}
|
||||
|
||||
// If this turns out to be an assignment to an unpacked array,
|
||||
// then handle that special case elsewhere.
|
||||
// then handle that special case elsewhere. We need to distinguish:
|
||||
// 1. Whole array assignment: `assign arr = expr` -> elaborate_unpacked_array_
|
||||
// 2. Indexed element assignment: `assign arr[i] = expr` -> normal path
|
||||
// For single-element arrays ([0:0]), pin_count() is 1 but we still need
|
||||
// to handle whole-array assignments specially (#1265).
|
||||
bool is_whole_array = false;
|
||||
if (lval->pin_count() > 1) {
|
||||
// Multi-element array is always a whole-array assignment
|
||||
is_whole_array = true;
|
||||
} else if (lval->unpacked_dimensions() > 0) {
|
||||
// Single-element unpacked array. Check if lval has array indices.
|
||||
const PEIdent* lval_ident = dynamic_cast<const PEIdent*>(pin(0));
|
||||
if (lval_ident && !lval_ident->path().name.empty()) {
|
||||
// If the identifier has no indices, it's a whole-array reference
|
||||
if (lval_ident->path().back().index.empty()) {
|
||||
is_whole_array = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (is_whole_array) {
|
||||
elaborate_unpacked_array_(des, scope, lval);
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,10 @@
|
|||
// Test for GitHub issue #1265
|
||||
// Single element unpacked array continuous assignment should compile
|
||||
module test(output o1 [0:0], input i1 [0:0]);
|
||||
assign o1 = i1;
|
||||
|
||||
// Verify the assignment works by checking a simple case
|
||||
initial begin
|
||||
$display("PASSED");
|
||||
end
|
||||
endmodule
|
||||
|
|
@ -995,5 +995,6 @@ real_edges CE,-g2012 ivltests gold=real_edges.gold
|
|||
br_gh1112 CE,-g2009 ivltests gold=br_gh1112.gold
|
||||
br_gh670 normal,-g2009 ivltests
|
||||
br_gh1134 normal,-g2012 ivltests
|
||||
br_gh1265 normal,-g2012 ivltests
|
||||
br_gh1267 normal,-g2012 ivltests
|
||||
br_gh1268 normal,-g2012 ivltests
|
||||
|
|
|
|||
Loading…
Reference in New Issue