The-OpenROAD-Project / The-OpenROAD-Project/OpenROAD
mpl: all-fixed macros skip temporary std-cell placement, so injected placements diverge from generating runs
@AcKoucher is already working on this.
Since Sep 4, 2026.
- Dominant language
- Verilog
- Stars
- 3.1k
- Forks
- 1k
- Avg merge
- 2d 23h
- Merged PRs (30d)
- 136
Description
Describe the bug
When every macro is fixed (e.g. a placement re-injected through MACRO_PLACEMENT_TCL, where place_macro LOCKs each macro), rtl_macro_placer skips the whole pipeline with MPL-0013 — including generateTemporaryStdCellsPlacement() and the soft blockages around macros. A full run with unfixed macros always seeds every standard cell at the center of its cluster before global placement reads the database, so an injected placement diverges from the run that generated it even with bit-identical macro geometry. We measured ~2% achieved-period offset from this on a macro-array design: the injection arm and the generation arm of an A/B are not comparable.
To reproduce
From src/mpl/test (uses only in-repo test files):
read_lef Nangate45/Nangate45.lef
read_lef testcases/orientation_improve1.lef
read_def testcases/fixed_macros1.def
set_thread_count 0
set block [ord::get_db_block]
foreach inst [$block getInsts] {
if { [[$inst getMaster] isBlock] } { $inst setPlacementStatus LOCKED }
}
rtl_macro_placer -report_directory rtlmp_rpt
set placed 0
set unplaced 0
foreach inst [$block getInsts] {
if { ![[$inst getMaster] isBlock] } {
if { [$inst isPlaced] } { incr placed } else { incr unplaced }
}
}
puts "std cells placed: $placed unplaced: $unplaced"
puts "blockages: [llength [$block getBlockages]]"
Observed:
[INFO MPL-0013] Skipping macro placement.
std cells placed: 0 unplaced: 150
blockages: 0
Running the same design with the macros unfixed leaves all 150 standard cells PLACED (at their cluster centers) and soft blockages around the macros. Expected: the all-fixed path still runs clustering, shaping and the soft-macro annealing (fixed macros as fixed obstacles, exactly as mixed fixed/unfixed designs already do), so a re-injected placement is production-equivalent. Macro-only designs with no standard cells can keep skipping.
Environment
OpenROAD master 3ca581e384324a1d09a53d29b00d4fad1c365e70, Linux x86_64, bazel build.
We currently carry a fix downstream as a patch in bazel-orfs and can upstream it once the ongoing mpl churn settles.
🤖 Generated with Claude Code
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.