vyges-dpl — detailed placement
Physical construction — opt-in, and not part of
vyges install loom. These engines build the design database that the sign-off and verification engines read, so they install as their own group:vyges install physical # all of them vyges install dpl # just this oneIt is also a standalone
vyges-dplbinary on your PATH, which is what the dispatch calls and what a flow author targets directly. Source: vyges-tools/dpl.
vyges-dpl does two related things: it checks whether a placement is legal, and it
legalizes one that is not. Global placement leaves cells overlapping and off-grid; detailed
placement snaps every cell onto a site, into a row whose power rails match, without overlapping a
neighbour — and moves it as little as it can while doing so.
Run it
vyges dpl check-placement design.odb # is this placement legal?
vyges dpl detailed-placement design.odb --out-odb legal.odb # make it legal
The checker needs no legalizer to be useful — it is the oracle you point at somebody else’s placement — which is why it is a command in its own right rather than a stage of the other one.
Two legalizers, and the default matters
Negotiated congestion is the default, because it is what upstream defaults to. Cells are allowed
to overlap; contested sites accumulate a history cost; each iteration rips every active cell up
and re-places it, until nothing overlaps. --use-diamond-legalizer selects the other one — a
diamond search outward from each cell’s own position, seating each cell once.
⚠️ The two produce different placements. The report names which ran, because comparing one legalizer’s output against the other’s expected result measures nothing.
The tunables are upstream’s, with upstream’s defaults: --max-displacement (500 sites, 100
rows), --site-search-window (20), --row-search-window (5), --drc-penalty (5) and
--disable-window-extension.
Where it sits
Placed database in, legalized database out. It runs after global placement and again after any stage that moves cells — buffer insertion, gate sizing, hold repair — because each of those puts cells back on top of one another.
Verdicts that are not verdicts
check-placement reports clean, violations, vacuous or error; detailed-placement
reports legalized, failed, vacuous or error. vacuous is not a pass: it means the run
examined or moved no cell at all, and a design with no instances is an absent placement rather
than a legal one.
Two fields are emitted on every run, empty or not:
not_done/not_checked— the families this engine does not implement. A clean verdict from a partial tool must not read as a complete one.filtered_out— every instance the model filter excluded, counted by master type and placement status. A filter that drops instances silently is indistinguishable from a design that has none of them, and one that dropped 255 tap cells once cost three correct fixes before it was noticed.
Correlation
Legalization matches OpenROAD on 28 of 28 comparable cases from its own regression suite at
pin 945a9f48dc6e5cc91d865daa92c45a1094cb682c, including aes (21,340 components), ibex
(34,184) and gcd (549).
🔑 The agreement is sweep-level, not final-placement only: the reference’s own per-iteration debug trace and this engine’s match line for line — same cell, same order, same chosen position, every iteration. A matching output can be coincidence; a matching decision sequence is the algorithm.
⛔ That is a claim about what the corpus asks, not about every design. 35 of upstream’s 63
detailed_placement cases are outside it and are not scored: 12 ship no golden, 8 need filler
placement, 7 declare regions or groups, 7 need placement padding values, 1 needs both.
⚠️ Every score is scoped to one upstream commit. A score quoted without its pin says nothing: the reference moves.
Known bounds
- Regions and groups are not modelled, so a design declaring them is refused rather than placed approximately.
- Placement padding values (
set_placement_padding) are not implemented. The padding rule runs, with zero padding, so class-pair conflicts are still caught. - Two of the four DRC terms are not evaluated —
checkEdgeSpacing, which needs each master’s LEF58 cell-edge list, andcheckBlockedLayers. Nothing in the comparable corpus exercises either, so their absence is invisible to the score rather than shown to be harmless. - Incremental placement (
-incremental) is not implemented. -disallow_one_site_gapshas no equivalent on purpose: upstream deprecated it and derives the setting fromhasOneSiteMaster(), so the flag cannot change the result. Passing it here is refused with that explanation rather than accepted and ignored.
See the full CLI reference (generated from --help and --describe).