Conversation
…epair OpenROAD (new pin from #71, tested at 5f1bd87f) crashes deterministically in cts.tcl's post-CTS repair_timing on this netlist: [ERROR ODB-1200] InsertBufferBeforeLoads: Load pin '_34829_/SN' is not connected to net '_03825_'. Error: cts.tcl, 82 ODB-1200 The new RSZ-0100 move sequence puts UnbufferMove first; an unbuffer step orphans a load pin before a subsequent InsertBufferBeforeLoads pass tries to reference it, tripping an ODB consistency check at iter ~141 of a 347-endpoint hold-violation sweep. The worst-slack endpoint (the reset synchronizer's D pin) is only a spurious display artifact — the churn is on the datapath hold-violations, not reset. Workarounds attempted and ruled out: - set_dont_touch on reset net pattern: doesn't shrink the STA endpoint set, and Yosys flat-synth renames the net anyway. No-op. - set_false_path -from sys_reset + -through reset net candidates: RSZ-0046 dropped 347 -> 346 (one endpoint removed), confirming the 346 others aren't on the reset cone. Same crash. Only SKIP_CTS_REPAIR_TIMING=1 bypasses the bug. Downstream GRT and route still run their own hold-repair passes, so final QoR remains reasonable (41% util, 14886 um^2 on asap7, clean 6_final). Also keep a principled set_false_path -from sys_reset in the SDC (sys_reset is an async input synchronized internally by udpcore_int_rst; the port-to-synchronizer path shouldn't be timed). Tracking re-enable: #75
This was referenced Apr 30, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
SKIP_CTS_REPAIR_TIMING=1ondesigns/asap7/liteeth/liteeth_udp_stream_sgmiito bypass a deterministic OpenROAD crash in post-CTS hold-repair (tested at OR commit5f1bd87f, bazel-orfs pin from Bazel flow: source-built OpenROAD via pinned bazel-orfs submodule #71).set_false_path -from [get_ports sys_reset]to the SDC (async reset input synchronized internally; port-to-synchronizer path shouldn't be timed).The bug
The new RSZ-0100 move sequence (UnbufferMove first) orphans a load pin, then a later
InsertBufferBeforeLoadspass trips an ODB consistency check. Fires at iter ~141 of a 347-endpoint hold-violation sweep. Bit-for-bit reproducible across runs.Workarounds I tried and ruled out (see #75 and commit message for details):
set_dont_touchon reset net pattern — no-op (name didn't survive Yosys flat-synth).set_false_pathon reset cone —RSZ-0046dropped only 347 → 346; the 346 other violations are datapath, not reset.SKIP_CTS_REPAIR_TIMING=1is the only thing that works. Downstream GRT and route still run their own hold-repair passes.Test plan
./k8s/run.sh --branch liteeth --upload-artifacts asap7 liteeth_udp_stream_sgmii— full k8s flow now completes end-to-end (41% util, 14886 µm², clean6_final.gdson asap7).