vyges physical dpl — CLI reference
Generated from vyges physical dpl --help — this page is the tool’s own output, verbatim.
vyges physical dpl — detailed placement: legality checking and legalization over the design database
USAGE:
vyges physical dpl check-placement <design.odb> [--json] [-o FILE] [--padding-* ...] [--pdn-aware]
vyges physical dpl detailed-placement <design.odb> [--out-odb FILE] [--dry-run] [OPTIONS]
vyges physical dpl filler-placement <design.odb> PATTERN... [--prefix P] [--out-odb FILE]
vyges physical dpl remove-fillers <design.odb> [--out-odb FILE]
vyges physical dpl optimize-mirroring <design.odb> [--out-odb FILE] [--pdn-aware]
vyges physical dpl improve-placement <design.odb> [--out-odb FILE] [--random-seed N] [--max-displacement X[,Y]]
(in progress: mis/gs/vs/ro not built; --rng-skip N stands in)
vyges physical dpl --describe | --help | --version
OPTIONS:
--out-odb FILE write the legalized database here (default: nothing is written)
--dry-run legalize and report, write no database
--use-diamond-legalizer use the diamond search instead of negotiation (the reference's flag)
--max-displacement N[,M] cap the move at N sites and M rows (default: 500,100)
--site-search-window N base search width along the row, in sites (default: 20)
--row-search-window N base search height, in rows (default: 5)
--drc-penalty F cost added per DRC violation at a candidate site (default: 5)
--disable-window-extension do not widen the search window past a macro or a wall
--pdn-aware keep cells clear of fixed supply (PDN) vias; also accepted by
check-placement and optimize-mirroring, which then check them too
(the reference's -pdn_aware, which later commands inherit)
-o FILE write the report to FILE instead of stdout
--json emit JSON (the default)
--describe print a machine-readable JSON description of the command
EXIT STATUS:
0 legalized every cell was seated; the database was written unless --dry-run
0 clean check-placement found no violation
0 vacuous the run placed nothing -- NOT a completed legalization; read the count
1 failed a cell could not be seated, or a check family found violations
2 error usage error, an unreadable database, or a failed write
⛔ SCOPE: legalization runs the NEGOTIATION legalizer, which is the reference's default path;
`--use-diamond-legalizer` selects the diamond one, as the reference's own flag does. Whichever
runs, what it does NOT implement is named in `not_done` on every run rather than omitted,
and every instance the model filter excluded is named in `filtered_out`.
⚠️ All nine of the reference's check families are evaluated. A family that cannot run on a design
is reported in `not_checked` rather than passed over in silence, and a family that ran under
a restriction says so in `limitations`.
ℹ️ `-disallow_one_site_gaps` has no equivalent here ON PURPOSE: the reference deprecated it and
derives the setting from `hasOneSiteMaster()`, so the flag cannot change the result.
`-incremental` is not implemented and is named in `not_done`.
Contract
Generated from vyges physical dpl --describe.
dpl
detailed placement: legality checking and legalization over the design database
Maturity: structured
check-placement {odb}
| Input | Type | Required | Description |
|---|---|---|---|
odb | string | yes | the design database to check |
out | string | no | write the report to FILE instead of stdout |
pdn_aware | boolean | no | also check every cell against the fixed supply (PDN) vias, as after detailed_placement -pdn_aware |
Consumes: odb
Artifacts: placement_check (report_path), odb (out_odb)
Assertion: placement-legal — passes when status equals clean
Provenance limitations
- input_hash covers the argument vector, not the content of the .odb it names.
- LEGALIZATION is implemented and is the default path: the NEGOTIATION legalizer, which is what the reference’s
detailed_placementruns when-use_diamond_legalizeris absent.--use-diamond-legalizerselects the other one. The two produce DIFFERENT placements, so the report names which ran. - At pin 4155ac31,
detailed_placementmatches the reference on 83 of 83 comparable cases (log 71 of 71), including the six pdn_via cases run with -pdn_aware (fixed supply vias: a pin or obstruction of the cell may not come within the via layer’s spacing of a supply via, unless the pin is on the via’s own net). Earlier, at pin 27288f5c90265ae5296b2f5a9fa6e8714fa191ad,detailed_placementmatched the reference on 78 of 78 comparable cases, including the 2 cases the reference added in that window for pins under power-via-stack metal (blocked_via_layers; blocked_via_pins, decided byoptimize_mirroring): a pin shape that would touch power via or patch metal outside the stripes, grown by the layer’s min spacing less one, is a blocked-layers violation in the legalizer, the checker and mirroring alike. Earlier, at pin da9f29f18b6487825aa880597176e0fa97110b31, with placement padding modelled,detailed_placementmatched the reference on 67 of 67 comparable cases – a case with no archived golden is scored against a fresh reference run of its own flow – including aes (21340 components), cases followed byfiller_placementorremove_fillersand scored with them, eight region (fence) designs on both legalizers, and everyoptimize_mirroringcase (mirror1-3 on gcd, 138-140 cells flipped; mirror_edge_spacing, where the edge-spacing rule vetoes a flip). Skipped, and named: the 9 cases that run onlyimprove_placement(NOT implemented), and 3 whose input file is not in the reference checkout. Earlier, at pin 7d490b8ecd357199c0c0e9f3e32becd5eb507c34, it matched 28 of 28 comparable cases from its own regression suite, including aes (21340 components), ibex (34184) and gcd (549). The agreement is SWEEP-LEVEL, not final-placement only – the reference’s per-iteration debug trace and this engine’s match line for line, every cell, every iteration, on simple05, simple07, gcd (574 lines) and hybrid_cells. - It read 18 of 28 when the pin first moved from 945a9f48dc6e5cc91d865daa92c45a1094cb682c, because the reference reworked the negotiation legalizer’s INITIAL SNAPPING across 7 commits and refreshed 24 of its own goldens. Four mechanisms were transcribed to recover it:
Grid::gridRoundX(initial x ROUNDS to the nearest site rather than truncating),displacementInSites/rowDispInSitesreplacing the deletedNegCell::displacement()so displacement is site widths on BOTH axes,initialSnap()’s diamond search in place of a four-direction scan, and – the one that mattered most – running that snap as its OWN pass after every fixed cell is blockaded, testing grid CAPACITY rather than merely whether a site exists. - BUT 35 of the reference’s 63
detailed_placementcases are OUTSIDE that number and are not scored at all: 12 ship no golden, 8 need filler placement, 7 declare REGIONS/GROUPS, 7 need placement padding values, 1 needs both.18 of 28is a claim about what the corpus asks, not about every design. - AND THE DENOMINATOR IS SHORT: the reference ships 69 .tcl cases calling
detailed_placement, not 63. Five of them – report_failures, fragmented_row03, pad02, fillers8, obstruction2 – wrap the call ascatch { detailed_placement }, so the harness’s command filter does not see them and they are scored by nothing. All five are error-path cases. - All four of
countDRCViolationsterms are evaluated by the legalizer: edge spacing, padding, one-site gaps andcheckBlockedLayers– both its stages, the vertical M2/M3 stripe mask against the layers a cell’s pins use (and the one above, for via access), and the power via / patch metal against each pin shape placed at the candidate position and orientation.checkEdgeSpacingreads each master’s LEF58 cell edges and the technology’s cell-edge spacing table from the database; the reference’s edge_spacing case matches component for component, its sweep trace identical. - Every instance the model filter excluded is named and counted in
filtered_outon every run. A filter that drops instances silently is indistinguishable from a design that has none of them. -disallow_one_site_gapsis NOT accepted: the reference deprecated it (DPL-3/DPL-4) and derives the setting fromhasOneSiteMaster(), so the flag cannot change the result.-incrementalis not implemented and is named innot_done.- All NINE of the reference’s check families are evaluated: site alignment, placed, overlap, in_rows, region_placement, padding, edge_spacing, blocked_layers and one_site_gap. A family that cannot run on a design is named in the report’s
not_checkedfield, because a clean verdict from a partial checker must not read as a complete one. Families that ran under a restriction are named inlimitationsrather than left to be inferred. - Site alignment is CORE-RELATIVE: the reference compares
cell->getLeft() % siteWidthwhere getLeft() is relative to core_.xMin(). Measured on aes.defok, reading it as an absolute coordinate reports every one of 21340 cells misaligned on a design the reference calls clean. - A site-alignment failure removes the cell from the overlap comparison entirely. That is a side effect of the reference’s
continue, not a separate rule: checkOverlap is what paints a cell into its pixels, so a cell that was skipped is never there for a later cell to collide with. - OVERLAP is the reference’s pixel walk, in the reference’s visit order (instances sorted by NAME): a cell fails only when a square it covers already holds an EARLIER cell it genuinely overlaps, so only the later cell of a pair is reported. An earlier rectangle sweep reported both, and its claim that the failing set matched was wrong – the checker gate measured it on check2.
- status is one of clean, violations, vacuous or error. VACUOUS IS NOT CLEAN: it means the run examined no cell, and a design with no instances is an absent placement rather than a legal one.
- check-placement is scored by a gate over every reference case that calls check_placement: the reference places the design, our checker reads that database, and its failing cells per family are compared with a fresh reference run’s own warnings. At pin 4155ac31, 85 of 85 comparable cases agree, and 85 of 85 with –raw; –pdn-aware adds the fixed supply vias family. At pin 27288f5c90265ae5296b2f5a9fa6e8714fa191ad, 77 of 78 comparable cases agree; in the one that differs, blocked_via_layers (added to the reference in that window), the reference reports 2 blocked-layer cells and this checker none, because the reference now also blocks pins under power-via-stack metal. At pin da9f29f18b6487825aa880597176e0fa97110b31, 76 of 76 comparable cases agreed, set_placement_padding passed as –padding-* flags. Skipped, and named: 3 whose input file is not in the reference checkout. Every case is legalized before it is checked, so a second run (–raw) checks the INPUT placement instead, where the families actually fail: 76 of 76 agree there too, region_placement failing on all 8 region designs. One-site gaps are checked in a second pass after every cell is painted, with the checker’s own checkOneSiteGaps; no comparable case reports one, so that rule is pinned by constructed cases only. Earlier, at pin 945a9f48dc6e5cc91d865daa92c45a1094cb682c, it was correlated by hand on three designs.
dpl.detailed_placement
legalize the placement – negotiated congestion by default
detailed-placement {odb}
| Input | Type | Required | Description |
|---|---|---|---|
odb | string | yes | the design database (.odb) |
out_odb | string | no | write the legalized database here |
dry_run | boolean | no | legalize and report, write nothing |
use_diamond_legalizer | boolean | no | use the diamond search instead of negotiation |
max_displacement | string | no | cap the move at N sites and M rows, ‘N’ or ‘N,M’ (default 500,100) |
site_search_window | integer | no | base search width along the row, in sites (default 20) |
row_search_window | integer | no | base search height, in rows (default 5) |
drc_penalty | number | no | cost added per DRC violation at a candidate site (default 5) |
disable_window_extension | boolean | no | do not widen the search past a macro or a wall |
pdn_aware | boolean | no | keep cells clear of fixed supply (PDN) vias |
Assertion: placement-legalized — passes when status equals legalized
dpl.filler_placement
fill every empty site run with filler masters
filler-placement {odb} {patterns}
| Input | Type | Required | Description |
|---|---|---|---|
odb | string | yes | the design database (.odb) |
patterns | [‘string’, ‘array’] | yes | filler master name patterns, one per entry (glob, e.g. sky130_fd_sc_hd__fill_*) |
out_odb | string | no | write the filled database here |
prefix | string | no | filler instance name prefix (default FILLER_) |
Assertion: placement-filled — passes when status equals filled
dpl.remove_fillers
destroy every filler instance (an unlocked CORE_SPACER)
remove-fillers {odb}
| Input | Type | Required | Description |
|---|---|---|---|
odb | string | yes | the design database (.odb) |
out_odb | string | no | write the database here |
Assertion: fillers-removed — passes when status equals removed
dpl.optimize_mirroring
flip placed cells about Y where that does not lengthen their nets
optimize-mirroring {odb}
| Input | Type | Required | Description |
|---|---|---|---|
odb | string | yes | the design database (.odb) |
out_odb | string | no | write the database here |
pdn_aware | boolean | no | also reject a flip that comes too close to a fixed supply (PDN) via |
Assertion: mirroring-optimized — passes when status equals optimized
dpl.improve_placement
detailed placement improvement (mis, global/vertical swap, reorder, random moves, orient)
improve-placement {odb}
| Input | Type | Required | Description |
|---|---|---|---|
odb | string | yes | the design database (.odb) |
dump_setup | boolean | no | print the manager state after the shift legalizer |
out_odb | string | no | write the improved database here |
random_seed | integer | no | the optimizers’ random seed (default 1) |
max_displacement | string | no | move cap in ROW HEIGHTS, ‘X’ or ‘X,Y’ (the reference’s -max_displacement) |
trace_stages | boolean | no | print each stage’s generator state and cell positions |
report_one_site_gaps | boolean | no | print the cells the one-site-gap check would record, on any design |
inject_stage | string | no | correlation aid: place the cells as FILE’s VYGS begin record for the start stage says |
start_stage | string | no | correlation aid: skip the stages before this one |
stop_stage | string | no | correlation aid: stop after this stage |
rng_skip | integer | no | correlation aid: discard N draws before the start stage |
Assertion: placement-improved — passes when status equals improved