Skip to content

rsz: detect cross-clock-domain hold violations on clock-as-data endpoints (#8075)#10718

Open
saurav-fermions wants to merge 1 commit into
The-OpenROAD-Project:masterfrom
Fermions-ASI:fix/8075
Open

rsz: detect cross-clock-domain hold violations on clock-as-data endpoints (#8075)#10718
saurav-fermions wants to merge 1 commit into
The-OpenROAD-Project:masterfrom
Fermions-ASI:fix/8075

Conversation

@saurav-fermions

Copy link
Copy Markdown
Contributor

Summary

RepairHold::findHoldViolations skipped endpoints whose pin is a clock pin, so a hold violation on a clock-as-data endpoint was never repaired. This detects cross-clock-domain hold violations on clock-as-data endpoints.

Type of Change

  • Bug fix

Impact

Hold violations on clock-as-data endpoints are now detected and repaired.

Verification

  • Local build succeeds.
  • Relevant tests pass (rebuilt from source): ctest -R '^rsz\.' 239/239; real fail/pass via repair_hold_clock_as_data.
  • Code follows the repository's formatting guidelines.
  • I have signed my commits (DCO).

Related Issues

Fixes #8075


Developed with SAIGE, Fermions' autonomous RTL/EDA debugging agent; root-caused, tested, and signed off by the submitter (@saurav-fermions).

…ints (The-OpenROAD-Project#8075)

findHoldViolations excluded every endpoint for which Sta::isClock() is
true. isClock() reports any pin in a clock network's combinational
fanout, which also includes register data (D) pins that sample a signal
sourced from a clock -- e.g. a clock used as data that crosses into a
different sampling-clock domain. Those D pins are legitimate hold
endpoints, so repair_timing -hold silently reported "No hold violations
found" while a real hold violation remained (issue The-OpenROAD-Project#8075).

Refine the exclusion to skip only true clock-tree pins: pins that are on
the clock network AND carry no timing check (!Vertex::hasChecks()).
Register data pins that hold a setup/hold check are kept, so cross-clock
-domain hold violations are detected and repaired. Clock-tree pins are
still excluded as before.

Add regression test repair_hold_clock_as_data where clk1 is used both as
a clock (for r1) and as data into r2/D (r2 clocked by clk2). On the
unfixed code RSZ reports "No hold violations found" and r2/D stays at
-0.59; with the fix the endpoint is detected and repaired to >= 0.
Registered in both CMake and Bazel.

Signed-off-by: Saurav Singh <saurav.singh@fermions.co>
@saurav-fermions saurav-fermions requested a review from a team as a code owner June 21, 2026 05:16

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request addresses OpenROAD issue #8075 by updating RepairHold::findHoldViolations to ensure that register data pins sampling a signal sourced from a clock (cross-clock-domain endpoints) are not incorrectly skipped during hold repair. This is achieved by only excluding clock tree endpoints that do not have timing checks. Additionally, a new integration test (repair_hold_clock_as_data) has been added to verify this behavior. I have no feedback to provide as there are no review comments.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

repair_timing -hold ignores registers sampling clocks

1 participant