Skip to content

sync - #2

Open
nanocoh wants to merge 2433 commits into
keplertech:masterfrom
The-OpenROAD-Project:master
Open

sync#2
nanocoh wants to merge 2433 commits into
keplertech:masterfrom
The-OpenROAD-Project:master

Conversation

@nanocoh

@nanocoh nanocoh commented May 23, 2026

Copy link
Copy Markdown

Summary

[Describe your changes here]

Type of Change

  • Bug fix
  • New feature
  • Breaking change
  • Refactoring
  • Documentation update

Impact

[How does this change the tool's behavior?]

Verification

  • I have verified that the local build succeeds (./etc/Build.sh).
  • I have run the relevant tests and they pass.
  • My code follows the repository's formatting guidelines.
  • I have included tests to prevent regressions.
  • I have signed my commits (DCO).

Related Issues

[Link issues here]

eder-matheus and others added 25 commits July 22, 2026 15:40
Signed-off-by: Eder Monteiro <emrmonteiro@precisioninno.com>
Signed-off-by: Eder Monteiro <emrmonteiro@precisioninno.com>
Signed-off-by: Arthur Koucher <arthurkoucher@precisioninno.com>
Signed-off-by: Arthur Koucher <arthurkoucher@precisioninno.com>
Signed-off-by: Arthur Koucher <arthurkoucher@precisioninno.com>
Signed-off-by: João Mai <jmai@precisioninno.com>
There are some superfluous dependencies in this target.
Fixed with

```
. <(etc/run-build-cleaner.sh //src/rsz/test:TestRepairHoldRollback)
```

Signed-off-by: Henner Zeller <h.zeller@acm.org>
…yers

When a removed buffer has both pins in the same gcell, connectRouting
concatenates the two nets' routes assuming co-located pins imply the
routes touch. If the pins are accessed on disjoint layer ranges (e.g.
input pin on M1 and output pin access on M3), the merged routing is
left with no shared layer at the junction, later failing with GRT-0267
disconnected segments.

Compute each route's layer range over the shared position and insert
bridging vias when the ranges are disjoint.

Signed-off-by: Eder Monteiro <emrmonteiro@precisioninno.com>
netIsCovered() alone allows a merged routing made of disjoint clusters
that each cover their own pins, which previously survived the merge and
failed later as GRT-0267 in updateDirtyNets. Require a single connected
component at the end of connectRouting, failing with the new GRT-0298
error at merge time and reporting each disconnected component's segments
to make the gap diagnosable. Also guard isConnected against empty
routes.

Signed-off-by: Eder Monteiro <emrmonteiro@precisioninno.com>
Removes a buffer (BUF_M3X1, input pin on metal1 and output pin on
metal3) whose pins share a gcell, merging a local net routed on
metal1-metal2 with a metal3 net. Verifies connectRouting bridges the
layer gap with a via instead of leaving the merged net with
disconnected segments (GRT-0267/GRT-0298). Registered in both CMake
and Bazel.

Signed-off-by: Eder Monteiro <emrmonteiro@precisioninno.com>
replace std::unordered_set with std::vector for pixel history-cost dedup

Signed-off-by: Augusto Berndt <augusto.berndt@precisioninno.com>
…ition

Replace the hand-rolled minmax/containment check with
odb::Rect::intersects(Point), which has the same inclusive-boundary
semantics.

Signed-off-by: Eder Monteiro <emrmonteiro@precisioninno.com>
findInstNetsMatching had two branches: glob went through netIterator
(scoped, correct), exact went through findNet. For a non-top instance,
findNet falls back to a flat block lookup of pathName(instance)+"/"+name,
so get_nets -hierarchical <name> could return a top-scope net like u1/foo
while visiting leaf instance u1, even though u1 has no local net foo.

Collapse to the scoped iterator for both cases. PatternMatch::match does
an exact compare when there are no wildcards, so the branch was redundant
and the source of the false match.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
isConnected decremented the group counter for every intersecting
segment pair, even when both segments already shared the same
union-find root. Cycles in the segment connectivity graph (multi-fanout
junctions) therefore over-decremented the counter, masking genuinely
disconnected segments elsewhere in the net. Decrement only when
uniteGroups merges two distinct groups.

Add read_segments_error6 test: the read_segments1.segs clock route plus
one isolated segment, which previously passed validation silently and
now fails with GRT-0262.

Signed-off-by: Eder Monteiro <emrmonteiro@precisioninno.com>
Signed-off-by: Eder Monteiro <emrmonteiro@precisioninno.com>
…_nets

grt: fix layer stack when merging nets
Signed-off-by: Arthur Koucher <arthurkoucher@precisioninno.com>
Signed-off-by: Arthur Koucher <arthurkoucher@precisioninno.com>
cmake: fix a redundant flag causing the build to fail with newer GCC versions
syn: Add gate remapping by Ashenhurst-Curtis decomposition with shared set
…rhold

Fix dependencies for //src/rsz/test:TestRepairHoldRollback
oharboe and others added 30 commits August 4, 2026 19:28
Fixes an issue where bazel test and run commands fail to locate the bazel/git_ls_files.sh
script after cd'ing into the downstream workspace root, by resolving the helper script path
using realpath upfront and adding it to the fix_lint data deps.

Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
- Use temporary directory for formatting check to avoid workspace pollution
- Fix runfiles resolution for yamlfix by preserving TOOL path
- Resolve MODULE.bazel runfiles to find WORKSPACE
- Handle case where no files are found to format to prevent infinite loops

Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
bazel: exclude git submodules from file discovery in tidy and lint scripts
Signed-off-by: Arthur Koucher <arthurkoucher@precisioninno.com>
… linter

- Create yamlfix.toml as Source of Truth for OpenROAD YAML formatting
- Create yamlfix.ignore as single Source of Truth (DRI) for blacklisted YAML files
- Update yaml_fmt_test.sh and yaml_tidy.sh to filter files via yamlfix.ignore
- Include yamlfix.toml and yamlfix.ignore in BUILD.bazel data dependencies for fmt_yaml_test, tidy_yaml, and fix_lint

Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
bazel: add yamlfix support to fix_lint and lint_test
…e_rsz

rsz: build equivalence classes without the liberty dont_use filter
…eeds limit

Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
…ty guards

Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
Both paths rendered a flat 256 px tile whatever the display was doing, so on a
HiDPI screen they were upscaled and soft over layer tiles that are now crisp,
and their highlights sat fractionally off the shapes they annotate.

They take the same sizing contract as layer tiles: the client states the exact
device-pixel square the tile will occupy (`tile_px`), and the ratio scales what
is authored in CSS px.  0 falls back to 256*dpr, so a client that names no count
is unaffected.

Pixel-authored sizes follow the display too, via a px_per_css on TileFrame:
heat-map bin labels (14 CSS px) and overlay pen widths (3 CSS px) were fixed
counts of physical pixels, so they shrank to a third of their intended size on a
3x display.  Layer-tile overlays pick this up as well, since they share the
helpers.

Tested across the same ratio matrix as the layer path: exact pixel counts,
registration against the layer tile grid, the fallback path, clamping at the
request handler, label scaling (which fails if the font height stops following
the ratio), and that both client layers actually put the fields on the wire --
a helper that is never called is the failure mode the layer path already had.

Signed-off-by: Peter Gadfort <gadfort@zeroasic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
rcx: handle track grids with tracks in only one direction
CI:

- Security scan: renamed the `arm` helper in watchDevicePixelRatio, which is a
  blocked word.  It is now `listen`, and the comments describing it no longer
  use the term either.
- Clang-format: the CI runs 18.1.3, which formats pointer-to-member declarations
  differently from newer releases (`::*field`, not `::* field`).  The one line
  affected predates this branch; it fails the check only because touching the
  file brings it under review.  Every changed C++ file has been formatted with
  18.1.3 rather than a local version, which also caught two stream-operator
  breaks in the tests that a newer clang-format left alone.

Review:

- quantizeTilePx clamped the value AFTER rounding it, so a client sending a
  double past the range of long long reached std::llround with it — undefined
  behaviour.  Clamped first, in double.
- watchDevicePixelRatio's unsubscribe left the pending listener attached.  The
  `once` option retires a handler that has fired; the one still waiting on the
  current ratio has not, and outlived the caller.  Removed explicitly, and the
  fake in the test now records removals so this is asserted rather than assumed.
- snapContainerToDeviceGrid takes the real measurement by default instead of
  requiring every caller to inject one.

Also refreshed a stale comment in device-pixels.js: it still described the tile
size as 256 and called a fractional pitch an out-of-reach residual, which the
device-exact tile size fixed.

Signed-off-by: Peter Gadfort <gadfort@zeroasic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
docs: add DSE and autotuner support guidelines for zero-config futility guards
GCC builds with -Werror=unused-variable; the clang build CI runs first does
not, so this only surfaced on the Jenkins job.

The expected coverage is now derived from the bin size and the design bounds
rather than hardcoded as a third of the tile, which uses the bounds the test
had already fetched and states where the number comes from.

Signed-off-by: Peter Gadfort <gadfort@zeroasic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
web: Fix tile seams and HiDPI rendering in the web viewer
Optimize EstimateParasitics::layerRC to query layer resistance and
capacitance via layer-number-indexed vectors rather than std::unordered_map
lookups per layer on every wire segment during parasitics estimation.

Use assert(layer != nullptr) in setLayerRC and layerRC.

Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
odb, est: optimize layer lookups in dbTech and EstimateParasitics
Signed-off-by: Arthur Koucher <arthurkoucher@precisioninno.com>
dbSta: add SWIG interface to allow dbNet -> sta::Net conversion
Adds the four display-control overlays of parity table 2.5 to the web viewer —
access-point markers, dbRegion boundaries, the manufacturing grid and the GCell
grid — plus the Misc toggles that go with them: "Flywires only", "Focused nets
guides" and "Highlight selected".

Each overlay is a self-painting pseudo layer registered in one table
(PseudoLayerDef), which is the single source of truth for the tile dispatch, the
pseudo-layer guard and the order saveImage composites them in.  That order
mirrors the zIndex the client gives each layer, so a saved PNG is the view on
screen; compositing in registry order instead put the manufacturing grid over
the routing and the pin markers over the tech layers.

Two overlays needed a deliberate deviation from Qt.  The manufacturing grid is
decimated adaptively rather than hidden below the legibility limit: a 10 DBU
grid on a 9.3 mm die only clears a 5 px spacing at z=15, so Qt's rule makes the
overlay unreachable in practice.  Access points are culled by the marker's
extent rather than its centre, because the X reaches half a marker past the
point and a centre-based cull chopped it along every tile seam.

"Flywires only" suppresses the routed wire and guide shapes but keeps the
terminal pin boxes and the special (geometric) routing, matching what the GUI
draws in that mode — without the SWires a selected supply net came back with no
highlight at all.  The flywire fan is capped at 4096 lines: the GUI draws
straight to the screen, but here the driver x sink product is materialized in
the session and copied per overlay tile.

Oblique segments convert to pixels in double and are clipped by drawLine rather
than going through the clamped integer conversion, whose per-axis saturation
rotates a segment instead of shortening it once one axis overflows.

Includes the review feedback from PR #10806: highlights are re-derived from the
selection they came from so a "Flywires only" flip cannot drop a multi-selection,
the per-block overlay caches are invalidated on a design change and hand out
shared ownership instead of a reference that outlives its lock, and the
supersampled render path is honored throughout.

Signed-off-by: Jorge Ferreira <jorge.ferreira@precisioninno.com>
…ebGUI-display-controls-overlays-grids-misc1

web: add display-control overlays from parity table 2.5 (#10619)
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.