Skip to content

sync - #2

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

sync#2
nanocoh wants to merge 2780 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]

jfgava and others added 25 commits August 6, 2026 18:49
This reverts commit dd6e7b2.

Signed-off-by: Jonas Gava <jfgava@precisioninno.com>
…m li1

Signed-off-by: Jonas Gava <jfgava@precisioninno.com>
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)
Signed-off-by: Jonas Gava <jfgava@precisioninno.com>
clang-format fix
typo fix

Signed-off-by: Jeff Ng <jeffng@precisioninno.com>
…ge-2

added layer name to min pitch message - take 2
…C by tech

Rename isIdealClockPin/isIdealClockNet to isSkipPin/isSkipNet and
broaden the skip criterion used during incremental parasitic updates.
A net is skipped when its driver pin carries no parasitic-dependent
timing: it is an ideal clock, or it is constant or has a disabled
timing constraint. The reasons are evaluated per mode and combined, so
a pin that is constant in one mode and disabled in another is still
skipped, while the ideal-clock reason keeps its cross-mode semantics
(a clock in at least one mode and ideal in every mode where it is a
clock, ignoring non-clock modes). Skipping avoids both wire RC
re-estimation and delaysInvalidFromFanin() for these nets.

Convert the estimateWireParasiticSteiner guard to an early return and
key wire RC by technology so multi-tech designs resolve per-tech
values with a default fallback.

Add unit tests exercising the skip logic through the public parasitics
API: ideal-clock and scan-clock (via arrival validity), and constant,
disabled, and mixed constant/disabled nets (via reduced pi-Elmore
presence), plus per-tech wire RC resolution.

Signed-off-by: Matt Liberty <mliberty@precisioninno.com>
…irrelevant-nets-per-tech-rc

est: skip parasitic estimation for timing-irrelevant nets
Extracts DSE optimization function theory, early-stopping strategies,
rung management (ladder of estimates), custom signal misconceptions, and
framework inversion concepts into a dedicated DesignSpaceExploration.md
guide.

Also includes a Literature & Prior Art section connecting these EDA
DSE methods to Multi-Fidelity Optimization (MFO) and Hyperparameter
Optimization (ASHA/Hyperband).

DeveloperGuide.md now correctly focuses strictly on the core flow
futility policy for developers, with a link out to the new comprehensive guide.

Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
Signed-off-by: Jonas Gava <jfgava@precisioninno.com>
Signed-off-by: Jonas Gava <jfgava@precisioninno.com>
Signed-off-by: Jonas Gava <jfgava@precisioninno.com>
Address PR comments by clarifying the text is about an advanced
use-case and descriptive in nature, rather than an overarching
rule to be strictly followed by all OpenROAD users.

Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
The pull request lock file check compared MODULE.bazel against itself
instead of MODULE.bazel.lock, so it has been blind since it was rewritten
in #10690. Compare MODULE.bazel.lock, and emit a GitHub error annotation
with the exact regeneration command so the diff is actionable.

Regenerate MODULE.bazel.lock, which drifted once the rules_python pip
extension was invalidated and re-queried pypi.org/simple, adding
dist_hashes facts for markdown-it-py, pygments, rich and setuptools.

Drop the lock file update from the master push auto-format job: master is
protected, so its push is rejected with GH006 whenever the job produces a
diff, which is why every master push has been red since 2026-08-04.

Signed-off-by: Joao Luis Sombrio <sombrio@sombrasoft.dev>
…or one site gaps

Signed-off-by: Augusto Berndt <augusto.berndt@precisioninno.com>
Signed-off-by: bnmfw <bernardoborgessandoval@gmail.com>
…exists before checking for one site gap

Signed-off-by: Augusto Berndt <augusto.berndt@precisioninno.com>
design_powergrid__drop__average carried results.avg_voltage, so on a power net
it reported the supply voltage rather than the drop. avg_ir_drop was already
computed and used in the text report, but never reached the metric.

The mistake was invisible on a ground net, where net_voltage is 0 and
getSolution() sets avg_ir_drop = avg_voltage, so half of every run looked
correct. On a 1.8 V power net the metric read 1.79999 where the average drop
was 6.41e-06.

Also adds design_powergrid__voltage__average, so the value that metric used to
carry is still available and is named for what it is, alongside the existing
design_powergrid__voltage__worst.

Fixes #11096

Signed-off-by: Shivaram Mysore <shivaram.mysore@gmail.com>
…k-check-fix

ci: fix MODULE.bazel.lock gate and regenerate the lock file
Signed-off-by: Peter Gadfort <gadfort@zeroasic.com>
psm: report the average IR drop under the drop__average metric
maliberty and others added 30 commits August 18, 2026 05:01
…ey wire RC by tech"

This reverts commit ab4f320.

Signed-off-by: Matt Liberty <mliberty@precisioninno.com>
Allow users to specify the compression level when writing the database. This helps speed up checkpointing in performance-critical flows by allowing lower compression levels (e.g., level 1 or 2) which are significantly faster while keeping file size increase acceptable. Also migrates compression_level parameters in C++ APIs to std::optional to avoid sentinel values, and updates C++/Python bindings in ord::Design for consistency.

Signed-off-by: Debayan Bandyopadhyay <dbandyopadhyay@google.com>
grt/cugr: use stt builder instead of flute by default
The //docs:man_pages action emitted 2.5 MB of stdout, past Bazel's
--experimental_ui_max_stdouterr_bytes, so the whole log was dropped
along with any real diagnostic in it. Silencing it exposed several
problems underneath.

Page selection
- Module READMEs are symlinked into md/man2 so md_roff_compat.py can
  read them, and the Makefile excluded them from page generation via a
  hard-coded list of 24 module names. Eight newer modules were missing
  from it, so their whole READMEs rendered as man pages: an untitled
  "()" page with MyST markup leaking through. Derive the list from
  src/*/README.md so a new module cannot regress this.
- That exclusion used an unanchored suffix pattern, so %pad.md also
  matched place_pad.md and place_bondpad.md, %upf.md matched
  read_upf.md and write_upf.md, and %cts.md matched report_cts.md.
  Those five command pages were silently dropped; match exact paths.
- cgt, est, exa, ram, syn and web were absent from the tools list, so
  their commands never got pages at all. Register them, which adds 12
  command pages and 187 message pages.

README parsing
- Headings were matched without regard to code fences, so the Tcl
  comments in a synopsis block ("# Either run") read as level-1
  headings and misplaced every heading after them.
- Every ```tcl block counted as a command, so a README with a worked
  example under "#### Examples" reported more names and synopses than
  descriptions and options, and the parity assert aborted the build.
  Take the first block in each ### section; a synopsis may follow
  "####" prose, as in rsz's Optimizing Arithmetic Modules.
- extract_arguments needed a trailing "##" heading to bound the final
  command section and raised IndexError without one; run to EOF.

Reproducibility and noise
- Pages stamped the build date, so every page differed from one day to
  the next and the build never hit its cache across a date boundary.
  Prefer SOURCE_DATE_EPOCH, then the source document's mtime.
- docs_srcs globbed md/**, which are this rule's own preprocess
  outputs. The input set varied with leftover files from previous
  builds, and rewriting them tripped --guard_against_concurrent_changes
  on every run. Glob only the checked-in md/man1.
- sphinx_build_test swept the same generated directories into its data,
  making its cache key depend on whether man pages had been built.
- Silence make's per-recipe echo and the per-README parse report. The
  report is the golden output of the readme_msgs_check tests, which
  call the translators directly, so it stays on by default and only the
  whole-tree drivers pass quiet=True.

Documentation
- cut, est, exa, stt, syn, tst and web READMEs were in no toc.yml
  entry, so their module-level prose was rendered nowhere once the
  accidental man pages went away. Add them, and nest stt above its own
  Flute sub-README rather than leaving Flute parented to grt.
- cgt's "### Clock gating" had no prose between heading and synopsis,
  leaving the page description empty.

Command pages go from 230 to 247 and message pages from 3128 to 3315.
Every page common to both builds is byte-identical apart from the date.

Signed-off-by: Matt Liberty <mliberty@precisioninno.com>
Review feedback on #11172.

extract_arguments embedded header text in regexes unescaped, while
extract_description already escaped it. odb's `## C++` reads as a
possessive quantifier and captures the wrong span; par's `## How to
partition a hypergraph (min-cut partitioning)` reads as a group so the
section does not match at all and match[0] raises IndexError. Neither
bounds a last command section today, so nothing fails yet, but a README
reorder would break the build. Escape in both the level3-to-level3 and
the level3-to-level2 patterns.

page_date treats a whitespace-only SOURCE_DATE_EPOCH as unset and
rejects a non-numeric one instead of crashing in int(); a malformed
reproducibility pin should stop the build rather than silently yield a
per-machine date. The no-source fallback is now UTC like the other two
branches, so the stamp does not depend on the builder's timezone.

Signed-off-by: Matt Liberty <mliberty@precisioninno.com>
Codex review feedback on #11172.

preprocess now removes md/man2 and md/man3 before regenerating them.
Rename or delete a command and its stale .md would otherwise linger for
the cat/web $(wildcard md/man*/*.md) to pick up, keeping an obsolete
page alive; //docs:man_pages runs unsandboxed in a persistent execroot
and no longer declares those files as inputs, so nothing else removed
them. Verified by injecting a stale page into the execroot: it no
longer reaches the output. md/man1 is checked in and is left alone.

//src/syn:messages_txt used the macro's default non-recursive
src/*.{cc,cpp,h,hh,tcl} glob, but synthesis keeps most logger calls in
src/flow (this package) and src/elab and src/ir (their own packages),
so the target declared only 29 of 73 messages and edits below src/
would not invalidate the docs action. Add message_srcs filegroups to
the two sub-packages, following the odb precedent, and glob src/flow
here. Extraction now matches a recursive scan exactly.

Signed-off-by: Matt Liberty <mliberty@precisioninno.com>
…ression-level

ord: Add customizable gzip compression level to write_db
mpl: ensure that macros inside a module are kept out of a std cell group
Signed-off-by: Eder Monteiro <emrmonteiro@precisioninno.com>
Signed-off-by: Eder Monteiro <emrmonteiro@precisioninno.com>
Signed-off-by: Eder Monteiro <emrmonteiro@precisioninno.com>
Signed-off-by: Eder Monteiro <emrmonteiro@precisioninno.com>
Signed-off-by: Eder Monteiro <emrmonteiro@precisioninno.com>
docs: fix stale references and broken links
…page-coverage

docs: fix man page generation coverage, noise and reproducibility
Signed-off-by: Bernardo Borges Sandoval <39677852+bnmfw@users.noreply.github.com>
…-est

Reapply "est: skip parasitic estimation for timing-irrelevant nets; k…
…e on 3D pass

Signed-off-by: Arthur Koucher <arthurkoucher@precisioninno.com>
…attern_tieh

drt: violation access points take precedent when returning from patterns
Signed-off-by: Arthur Koucher <arthurkoucher@precisioninno.com>
web: add rudy heatmap view as save_image -web display option
Signed-off-by: Minju Kim <mkim@precisioninno.com>
…_sta_update_0814

Update sta ptr to 08/14
//docs:man_pages produced no man3 pages at all. md_roff_compat.py read
../src/<module>/messages.txt from the source tree, but those files are
generated: CMake writes them in-tree while bazel writes them under
bazel-out, and the unsandboxed action sees only declared inputs. Every
message page was skipped with "doesn't exist. Continuing". cat3 and html3
now hold 3408 pages each, up from 0.

md_roff_compat.py takes the layout root from MESSAGES_ROOT_DIR, defaulting
to the repository root so the CMake paths are unchanged, and man_pages.bzl
points it at the bin dir, whose layout already matches.

Two inputs had nowhere to come from: the ORD messages, which live in src/
itself and had no bazel target, and //src/gui:messages_txt, which existed
but was not visible to //docs.

The generated messages.txt were incomplete as well. The messages_txt glob
was not recursive and omitted .cxx and .i, so modules keeping logger calls
below src/ lost them: 311 in drt, 90 in grt, 74 in dpl, 21 in rsz, 18 in
utl, 15 in gui. The default glob now recurses over the extension set
find_messages.py scans, and sub-packages hand their sources over through a
shared message_srcs macro, new for dft's seven and replacing three
divergent hand-written extension lists in odb and syn.

cut and tst join the documented modules. cut's messages() call was the only
one in a src/<module>/src/CMakeLists.txt without OUTPUT_DIR .., so CMake
wrote src/cut/src/messages.txt where every other module writes
src/<module>/messages.txt; tst had no messages() call. Neither exposes Tcl
commands, so both are excluded from man2. tst's one logger call named
utl::RSZ 0, which is not a resizer message, and is now utl::TST 1.

//:dup_id_test passed unconditionally. It ran find_messages.py -d src from
its runfiles directory, which holds only the script, so it walked a
nonexistent path, found zero messages and exited 0; an injected duplicate
left it green. It now resolves the workspace through its MODULE.bazel
runfiles symlink, the handle the lint tests already use. That single walk
also covers cross-module collisions, which the per-module genrules cannot
see: each module's messages.txt is individually duplicate-free when the two
sites sit in different modules.

The lint and format tests shared the resulting caching hole. They scan the
git worktree rather than declared inputs, so nothing invalidates a cached
result and all five reported "(cached) PASSED" after a source edit. Tagging
them external forces a re-run.

Signed-off-by: Matt Liberty <mliberty@precisioninno.com>
…3-messages

docs: generate man3 pages in the bazel man page build
rcx: fix bench_wires segfault on duplicate pattern names
Causes excessive QoR loss.

This reverts commit 8328314, reversing
changes made to c536d9d.

Signed-off-by: Matt Liberty <mliberty@precisioninno.com>
rcx: create struct for the unit scale factors to avoid duplicated code on 3D pass
Revert "Merge pull request #11066 from oharboe/rsz-futility-limit"
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.