Skip to content

sync - #2

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

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

Conversation

@nanocoh

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]

malibertyand others added 25 commits August 10, 2026 23:47
rcx: create struct for the spef header to avoid duplicated code on 3D pass
Include the sequential register/latch classification in the MBFF compatibility mask. This prevents edge-triggered flops from being packed into level-sensitive latch trays while preserving valid tray matches.
Extend the GPL MBFF unit library and regression to cover equivalent register-bank and latch-bank interfaces.
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Signed-off-by: Eder Monteiro <emrmonteiro@precisioninno.com>
…culateAreas
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>
Replace the lone static_cast in Mask::to_string with the surrounding C-style cast form. This keeps the formatting arguments consistent without changing the bool-to-int conversion.
Signed-off-by: Jaehyun Kim <jhkim@precisioninno.com>
Signed-off-by: dsengupta0628 <dsengupta@precisioninno.com>
Signed-off-by: Eder Monteiro <emrmonteiro@precisioninno.com>
Signed-off-by: dsengupta0628 <dsengupta@precisioninno.com>
FastRouteCore::routeMonotonic pre-sized every tree edge's route.grids to
x_range_ + y_range_ -- the Manhattan diameter of the whole routing grid --
and then shrank it with resize(cnt) once the route was walked. resize()
downward keeps the capacity, and route.grids lives in sttrees_ for the
whole global route, so every edge held a worst-case buffer for the entire
run while the routes themselves are a handful of points.
On a large die that is many GPoint3D (6 bytes each) per edge, landing in
a large size class: many live blocks, many GB of which essentially all is
unused capacity.
Size the buffer from the mid point the cost search just picked instead.
walkSegment appends exactly |dx| + |dy| points per L-segment whichever
branch it takes, plus the trailing end point, so the new size is exact.
The trailing resize(cnt) is therefore a no-op and is replaced by assert()
checks that the walk doesn't write out-of-bounds and wrote exactly the
points the size was computed for.
Note the size is not |x2-x1| + |y2-y1| + 1: xmin/xmax and ymin/ymax grow
the search window by 'enlarge' (10, +5 per iteration) beyond the edge
bounding box, so bestp1 can fall outside it and the route is not always
monotonic. Bounding by the bounding box would overflow the buffer.
Co-authored-by: Olle Fredriksson <olle@ascenium.com>
Signed-off-by: Øyvind Harboe <oyvind@ascenium.com>
Signed-off-by: dsengupta0628 <dsengupta@precisioninno.com>
Signed-off-by: Eder Monteiro <emrmonteiro@precisioninno.com>
grt: size monotonic route buffer to the actual route length
…rting point
Signed-off-by: Arthur Koucher <arthurkoucher@precisioninno.com>
…ngestion
GRT: Fix FastRoute blocked tracks computation
Signed-off-by: dsengupta0628 <dsengupta@precisioninno.com>
dpl: check edge spacing DRC on opt_mirror
…ff-register-latch-mask
gpl: Separate registers and latches in MBFF masks
malibertyand others added 30 commits August 20, 2026 20:45
…compression-level
Revert "utl: Use 64KB buffer for gzip compression and decompression"
Signed-off-by: Mike Inouye <mikeinouye@google.com>
…ncurrent-io-e5
gpl: concurrent IO pin + cell placement in global placement
The test reports whether each report writer created its output file, and
asserts write_pg_spice creates nothing before a solution exists. Since
make_result_file only builds a path, output from an earlier run in the
same results/ was still present, so the pre-analysis check read 1 and the
test failed on every run after the first.
Delete the three output files up front so the checks start from a known
absent state. Bazel gives each run a fresh TEST_TMPDIR, so this only
affected repeated local ctest runs.
Signed-off-by: Matt Liberty <mliberty@precisioninno.com>
The bazel flow tests ran the RTL-to-GDS flow but checked only the exit
code: BIG_TESTS get check_log=False, and PASSFAIL_TESTS is just
commands_without_load, so check_passfail was False too. The
<design>.metrics_limits files were read only by flow_metrics.tcl, which
only ./regression sources, so a green bazel run said nothing about QoR.
Add a check_metrics attribute to regression_rule_test. When set,
regression_test.sh passes -metrics so openroad writes the result json,
then compares it against <design>.metrics_limits and fails the test on a
violation. Enabled for the 13 BIG_TESTS that have a limits file, derived
from a glob so a new design opts in by adding one.
The comparison reuses the metric table and margins from flow_metrics.tcl
via a new compare_metrics_files, so bazel and ./regression apply the same
limits and report the same message. It reads the json with a new
read_flat_json rather than tcllib's json package, which the bazel-built
openroad does not carry; the metrics files are machine written flat
objects of scalars, and nested json is rejected rather than guessed at.
read_flat_json returns dicts identical to json::json2dict for all 31
metrics and limits files in the tree.
This surfaces four pre-existing QoR violations under bazel: aes_asap7
(also fails ./regression, so its limit is genuinely stale), plus
aes_nangate45, aes_sky130hs and jpeg_sky130hs, which pass ./regression
and differ only because the bazel binary's QoR differs from cmake's. The
limits are unchanged here; these tests stay tagged manual, so default CI
is unaffected.
Signed-off-by: Matt Liberty <mliberty@precisioninno.com>
…eport-writers-test-idempotency
psm: clear stale outputs in report_writers_require_solution test
Turning on the bazel metrics check surfaced four designs whose QoR was
outside their limits: aes_asap7, aes_nangate45, aes_sky130hs and
jpeg_sky130hs. Their limits were last derived from cmake ./regression
runs, but CI runs the flow tests under bazel, whose -O3 -flto binary
produces different QoR.
Regenerate the metrics and limits for those four from bazel runs, using
the metrics json the check now writes as an undeclared test output. All
22 gated metrics are still present in each limits file, so the gate is
not weakened; the limits move both ways, tightening where bazel is
better (aes_nangate45 max_capacitance_slack -33% -> -20%) and loosening
where it is worse (aes_asap7 max_slew_slack -11% -> -38%).
Deriving limits from bazel means ./regression can now fail these designs
where cmake QoR is worse than bazel's: aes_nangate45 on
max_capacitance_slack, aes_sky130hs on clock_skew and ANT errors, and
jpeg_sky130hs on ANT errors. One set of limits cannot satisfy both
binaries for these designs, and bazel is what CI gates on.
Signed-off-by: Matt Liberty <mliberty@precisioninno.com>
gcd_sky130hd_fast_slow was registered only in test/BUILD, not in
regression_tests.tcl or CMakeLists.txt. CI runs it as its own bazel flow
stage, but with check_log and check_passfail both false and no
metrics_limits file it asserted nothing beyond openroad exiting 0,
leaving it the one flow design with no output checked at all.
It had no limits file because the limits tooling could not produce one:
save_metric_limits indexes test_langs($test), so
save_flow_metrics_limits reported 'test not found'. Add it to
record_flow_tests, which lets the tooling generate its limits and makes
./regression able to run it like the other flow designs, then save its
metrics and limits from a bazel run. It agrees between the two binaries,
passing under both bazel and ./regression.
Every BIG_TEST now has a limits file, so drop FLOW_METRIC_TESTS and
check metrics for all of them. Selecting on the presence of a limits
file would silently leave a new design unchecked, which is how this one
went unnoticed; without a limits file the check now fails with 'missing
metrics limits file' instead.
Signed-off-by: Matt Liberty <mliberty@precisioninno.com>
…rite_bytes
Signed-off-by: Debayan Bandyopadhyay <dbandyopadhyay@google.com>
odb: Modernize dbOStream and dbIStream with C++20 concepts and 64KB buffering
Signed-off-by: Peter Gadfort <gadfort@zeroasic.com>
grt: persist routing engine choice for cross-session repair_antennas
dpl: remove negotiation standalone padding check
Signed-off-by: Eder Monteiro <emrmonteiro@precisioninno.com>
Signed-off-by: Eder Monteiro <emrmonteiro@precisioninno.com>
…check
Signed-off-by: Matt Liberty <mliberty@precisioninno.com>
Signed-off-by: Mike Inouye <mikeinouye@google.com>
Signed-off-by: Mike Inouye <mikeinouye@google.com>
…ayer
grt/cugr: support pins above the max routing layer
rsz: Fix UB in performEarlySizingRound
pad: reorganize RDLRoute into per net to allow to better route continuity checking
gui: avoid call to sortItems since that triggers from bazel segfault
place_macro validated the core-containment rectangle using the
instance's
bounding box *before* the requested orientation was applied. The four
right-angle orientations (R90, R270, MXR90, MYR90)
swap width and height, so whenever the requested orientation differed
from the current one in right-angle-ness the check used the wrong
footprint: it rejected legal placements of rotated macros with
MPL-0034, and symmetrically would accept ones that do not fit.
Compute the width and height the macro will actually have once
`orientation` is applied, and validate that instead. The comparison is
made against the instance's current orientation rather than assuming
R0, so a macro that has already been rotated is handled correctly too.
The new test places a 100x400um macro at R90 in a 499.89x198.80um
core, where the rotated footprint (400x100) fits and the unrotated one
(100x400) does not. It also asserts the same origin is still rejected
at R0, so the fix cannot silently over-correct.
Signed-off-by: sfmth <sfmth0@gmail.com>
The new test was added to COMPULSORY_TESTS but not to the per-test
resource dict. src/mpl/test/BUILD does not glob the testcases/
directory -- the filegroup globs only `test_name + ".*"`, which picks up
the .tcl, .ok and .defok, so each test's LEF and DEF have to be listed
explicitly.
The Bazel target therefore resolved and ran without
testcases/place_macro_rotated.{lef,def}, while the CMake build passed
because it collects test inputs differently.
bazel query deps(//src/mpl/test:place_macro_rotated_resources) now lists
all six required inputs, and
bazel test //src/mpl/test:place_macro_rotated-tcl_test passes.
Signed-off-by: sfmth <sfmth0@gmail.com>
Set the orientation before building the containment rectangle instead of
computing the post-orientation footprint by hand, per review. getBBox()
then already reports the footprint the macro will have, so the explicit
width/height swap and its right-angle-ness comparison are unnecessary.
setOrient() had to precede setLocation() in any case; it now precedes
the
core-containment check as well.
Rename the test to place_macro_with_right_angle_rotation and reduce it
to
the single R90 placement. The negative case it also asserted is no
longer
sound: with setOrient() ahead of the check, a rejected placement leaves
the instance rotated, so catching MPL-0034 and then writing the DEF
would
serialize the macro at the rejected orientation.
Signed-off-by: sfmth <sfmth0@gmail.com>
Rename the test and all five of its files to
place_macro_right_angle_rotation, so the CMake test name, the Bazel
targets, the .tcl/.ok/.defok and the testcases LEF/DEF agree. The
half-applied rename currently on the PR branch renamed only the Bazel
entries, which fails the package load -- "Error in glob: glob pattern
'place_macro_with_right_angle_rotation.*' didn't match anything" -- and
takes all of Jenkins down with it.
Reword the comment above setOrient() and cut the test down to its header
line, both verbatim as requested in review.
Signed-off-by: sfmth <sfmth0@gmail.com>
mpl: check core containment against the post-orientation footprint
…w-metrics-check
test: check flow metrics under bazel
Sign up for freeto 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.

20 participants

@nanocoh@maliberty@jhkim-pii@eder-matheus@dsengupta0628@oharboe@jfgava@AcKoucher@bnmfw@osamahammad21@mikesinouye@minjukim55@precisionmoon@gadfort@shivarammysore@vvbandeira@tmarhguy@gudeh@hzeller@joaomai