Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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 one

It is also a standalone vyges-dpl binary 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, and checkBlockedLayers. 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_gaps has no equivalent on purpose: upstream deprecated it and derives the setting from hasOneSiteMaster(), 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).