From 5347c5152d360147f8bed38da0bc4e699f75efa0 Mon Sep 17 00:00:00 2001 From: Dr Jonathan Richard Robert Kimmitt Date: Wed, 27 May 2026 14:27:08 +0100 Subject: [PATCH] =?UTF-8?q?virtex7:=20053-pip-ctrlin=20/=20055-pip-gnd=20?= =?UTF-8?q?=E2=80=94=202*N=20tile=20reservation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- fuzzers/053-pip-ctrlin/generate.tcl | 12 ++++++++---- fuzzers/055-pip-gnd/generate.tcl | 12 ++++++++---- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/fuzzers/053-pip-ctrlin/generate.tcl b/fuzzers/053-pip-ctrlin/generate.tcl index e2946a38..fcbc58c4 100644 --- a/fuzzers/053-pip-ctrlin/generate.tcl +++ b/fuzzers/053-pip-ctrlin/generate.tcl @@ -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" } } diff --git a/fuzzers/055-pip-gnd/generate.tcl b/fuzzers/055-pip-gnd/generate.tcl index ccc4a574..ccc5e0f9 100644 --- a/fuzzers/055-pip-gnd/generate.tcl +++ b/fuzzers/055-pip-gnd/generate.tcl @@ -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" } }