Repository navigation
Conversation
tnf-cost-sweep has been green on main while no arm was ever placed and routed. Two harness defects, one behind the other: - The per-arm XDC (W928) was written to the runner's /tmp, which the container cannot see. Run 37263184079 put e4m9 in routing-pending on "failed to open XDC file", twelve attempts in seconds. The XDC now lives under build/tnfcost/, seen as /work/build/tnfcost/. - With only IOSTANDARD set, nextpnr-xilinx auto-placed an output on a GTP pad: "No Bel named OPAD_X0Y11/IOB33/OUTBUF", placing failed (run 34448747524, branch tnf-publication-readiness). The new tools/sweep_pin_xdc.py pins every port bit to a general-purpose IOB from the image's own package_pins.csv, clk on an MRCC P pin, bank 34 (the AX7203 DDR3 bank) excluded. Selftest 13/13; on a locally synthesized e3m33 it pins 123 pads with no pin used twice. An arm whose log never reaches the router (no "Routing.." or "Running router2") is now recorded as harness-failure and fails the job, so a sweep cannot be green with nothing routed. Routing failures proper stay routing-pending and do not fail it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
X Brain Health CheckScore: 100.0/100 X Brain is above merge threshold |
🧪 Brain Stress Test ResultsScore: not measured (no stress test prints a Score: line) X Stress test passed |
The wns field grepped for 'Max delay|worst slack|Slack' and caught the
two "Info: Slack histogram:" headers, so every routed arm recorded
"wns=Info: Slack histogram:;Info: Slack histogram:;" and no number
(run 37266625622, all 5 arms). nextpnr-xilinx prints no worst-slack
line. Record the post-route critical path's logic/routing split
("11.2 ns logic, 44.5 ns routing" for e4m29), which is what the Fmax
line is computed from. Nothing reads wns: refit_cost_model.py reads
lc, status, luts and fmax only.
The comment above it named corona_decode_ax7203.xdc; the sweep writes
its own XDC with pins and IOSTANDARD and no create_clock.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Two updates. 8d4ba98 fixes a second empty metric in the same step. Conflict with #852. The 5-arm results are on #896, and the refit defects they exposed are in #898. 🤖 Generated with Claude Code |
|
Verify run 37267724500 on No metric field in the artifact is empty now. Before this commit, 🤖 Generated with Claude Code |
8d4ba98 to
cf77fd2
Compare
Summary by t27-beesThe PR fixes two harness defects that kept the cost-sweep workflow green while no arm actually routed: (1) the per-arm XDC was written to the runner’s Worth a look
Read: 2 files, +244 -13, the whole diff. Head |
Closes #896.
What was wrong
tnf-cost-sweep.ymlhas been green on main with no arm placed and routed since the per-arm XDC landed (W928, 8b165f5). Two defects, one behind the other:/tmp; the container mounts only$PWD:/work, so nextpnr could not open it (failed to open XDC file, run 37263184079).IOSTANDARDin the XDC, nextpnr-xilinx auto-placed an output on a GTP pad and placement failed (No Bel named 'OPAD_X0Y11/IOB33/OUTBUF', run 34448747524, which already had defect 1 fixed on its branch).Both runs ended
successwith every arm recorded asrouting-pending, which reads like a fabric limit.Change
build/tnfcost/, which the container sees as/work/build/tnfcost/.tools/sweep_pin_xdc.pygives every port bit aPACKAGE_PINfrom the pinned image's ownxc7a200tfbg484-2/package_pins.csv: general-purpose IOB sites only,clkon an MRCC P pin, bank 34 (the AX7203 DDR3 bank) excluded, no pin used twice.--selftest: 13/13, run in the workflow before the arms.Info: Routing..norInfo: Running router2is recorded asharness-failureand fails the job after all arms are tried. A real routing failure, after the router started, staysrouting-pendingand does not fail the job.refitalready ran underif: always(), so a harness failure still leaves a report.Verification
Run 37265666318 on this branch (
6a9292434),pnr_arms=tnf_cost_e4m9_add_top,tnf_cost_e3m33_add_top, image eced1cdd as before:tnf_cost_e4m9_add_toptnf_cost_e3m33_add_topControls on the router-start marker the new gate uses:
failed to open XDCnorNo Bel named(0 each);tnfcost-pnrartifact (e4m9, e4m11) contain it 0 times, so that run would now fail the job instead of passing.speed.py wflint(the build-speed loop's workflow linter) gained a check for this defect class: a host/tmppath written on the runner and then read by adocker runthat does not mount/tmp. It flags main's file at the XDC line and does not flag this branch. Across all 122 workflows on main it fires only on this one.Caveat on the Fmax column
The two numbers are not the same kind of measurement. Arms with
M < 25instantiategf_adder_paramwithPIPELINE=0, so the adder datapath runs from input pads to the output register and is not an FF-to-FF path; nextpnr's clock Fmax does not time it. e4m9's critical path is 3 cells on theout_validcontrol logic. e3m33 (M >= 25,PIPELINE=1) has a 50-cell stage-2 datapath between registers, so its 28.41 MHz is a datapath number. Read the e4m9 Fmax as "not measured" for the adder. Making the narrow arms comparable would mean registering their inputs, which changes the arm definitions, so it is left out of this PR.Left as they were
speed.py wflintstill reports three bareifs in this file (PNR_ARMS, the routed check andCLEAN). They predate this branch and are untouched here.The image stays pinned to eced1cdd (W945). That image fails DSP multipliers with
$PACKER_GND_NET(cross run 37264809032); the_add_toparms do not use a DSP. Repinning is the owner's call, see #851.Not measured
🤖 Generated with Claude Code