virtex7: 053-pip-ctrlin / 055-pip-gnd — 2*N tile reservation

Both fuzzers crashed in Vivado with 'ERROR: [Common 17-69] Missing
name/value pair in -dict argument' at the set_property -dict 'LOC ...
BEL ...' line. Cause: generate.tcl reserves 3*todo_lines INT tiles
via randsample_list (utils.tcl), which samples without replacement
and pads with empty strings once exhausted. The off-edge virtex7 ROI
holds only ~150 INT_L/INT_R tiles, but 053 has 64 todo lines, so
3*64=192 > 150 and the tail of the sample is empty entries; high-idx
todo lines (tile_idx = idx*3) get empty tiles -> empty driver_site
-> odd-length -dict -> error.

Reduce the per-todo-line retry window from 3 to 2 (set tiles
expr 2*todo_lines, tile_idx idx*2, retry limit tries>=2). 2*64=128
fits comfortably in ~150 pool. Other pip fuzzers use a different
indexing pattern; only these two use idx*K. For larger-ROI families
the pool still exceeds 2*N as it did 3*N, so no regression.

Verified: 053 single-specimen run reaches all 64 todo lines (idx 63
previously died at 50), emits segdata_int_l/r; 055 likewise.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Dr Jonathan Richard Robert Kimmitt 2026-05-27 14:27:08 +01:00
parent 88f6f61d10
commit 5347c5152d
2 changed files with 16 additions and 8 deletions

View File

@ -65,8 +65,11 @@ for {gets $fp line} {$line != ""} {gets $fp line} {
}
close $fp
# each run can fail up to three times so we need to prepare 3*todo_lines tiles to work on
set tiles [expr 3 * [llength $todo_lines]]
# Each todo line gets a 2-tile window for routing retries, so reserve
# 2*todo_lines tiles. The off-edge Virtex-7 ROI holds fewer INT tiles than the
# 3*N the upstream fuzzer assumed (randsample_list then padded the list with
# empty entries, breaking the -dict below); 2*N fits this ROI.
set tiles [expr 2 * [llength $todo_lines]]
set int_l_tiles [randsample_list $tiles [filter [pblock_tiles roi] {TYPE == INT_L}]]
set int_r_tiles [randsample_list $tiles [filter [pblock_tiles roi] {TYPE == INT_R}]]
@ -84,7 +87,7 @@ for {set idx 0} {$idx < [llength $todo_lines]} {incr idx} {
set tries 0
while {1} {
set tile_idx [expr $tries + [expr $idx * 3]]
set tile_idx [expr $tries + [expr $idx * 2]]
incr tries
if {$tile_type == "INT_L"} {set tile [lindex $int_l_tiles $tile_idx]; set other_tile [lindex $int_r_tiles $tile_idx]}
@ -121,7 +124,8 @@ for {set idx 0} {$idx < [llength $todo_lines]} {incr idx} {
route_design -unroute -nets $mynet
# sometimes it gets stuck in specific src -> dst locations
if {$tries >= 3} {
# 2-tile window per todo line (see tile reservation above)
if {$tries >= 2} {
error "ERROR: failed to route net after $tries tries"
}
}

View File

@ -35,8 +35,11 @@ for {gets $fp line} {$line != ""} {gets $fp line} {
}
close $fp
# each run can fail up to three times so we need to prepare 3*todo_lines tiles to work on
set tiles [expr 3 * [llength $todo_lines]]
# Each todo line gets a 2-tile window for routing retries, so reserve
# 2*todo_lines tiles. The off-edge Virtex-7 ROI holds fewer INT tiles than the
# 3*N the upstream fuzzer assumed (randsample_list then padded the list with
# empty entries, breaking the -dict below); 2*N fits this ROI.
set tiles [expr 2 * [llength $todo_lines]]
set int_l_tiles [randsample_list $tiles [filter [pblock_tiles roi] {TYPE == INT_L}]]
set int_r_tiles [randsample_list $tiles [filter [pblock_tiles roi] {TYPE == INT_R}]]
@ -65,7 +68,7 @@ for {set idx 0} {$idx < [llength $todo_lines]} {incr idx} {
set tries 0
while {1} {
set tile_idx [expr $tries + [expr $idx * 3]]
set tile_idx [expr $tries + [expr $idx * 2]]
incr tries
if {$tile_type == "INT_L"} {set tile [lindex $int_l_tiles $tile_idx]; set other_tile [lindex $int_r_tiles $tile_idx]}
@ -93,7 +96,8 @@ for {set idx 0} {$idx < [llength $todo_lines]} {incr idx} {
route_design -unroute -nets $mynet
# sometimes it gets stuck in specific src -> dst locations
if {$tries >= 3} {
# 2-tile window per todo line (see tile reservation above)
if {$tries >= 2} {
error "ERROR: failed to route net after $tries tries"
}
}