vyges physical tap — CLI reference
Generated from vyges physical tap --help — this page is the tool’s own output, verbatim.
vyges physical tap — row cutting and physical-cell insertion
USAGE:
vyges physical tap cut-rows <design.odb> [--halo-x UM] [--halo-y UM] [--row-min-width UM]
[--endcap-master NAME]
vyges physical tap place-tapcells <design.odb> --master NAME [--distance UM] [--tap-prefix P]
vyges physical tap place-endcaps <design.odb> [--corner NAME] [--edge-corner NAME]
[--endcap-horizontal A,B] [--endcap-vertical NAME]
[--left-top-corner NAME] ... [--prefix P]
vyges physical tap tapcell <design.odb> --tapcell-master NAME --endcap-master NAME
[--distance UM] [--halo-width-x UM] [--halo-width-y UM]
[--cnrcap-nwin-master NAME] [--tap-nwintie-master NAME] ...
vyges physical tap ripup <design.odb> [--tap-prefix TAP_] [--endcap-prefix PHY_]
vyges physical tap boundary <design.odb>
vyges physical tap --describe
vyges physical tap --help
OPTIONS:
--halo-x UM keep-out around a macro, horizontally, in MICRONS (default 2)
--halo-y UM keep-out around a macro, vertically, in MICRONS (default 2)
--row-min-width UM do not leave a row narrower than this, in MICRONS
--row-min-height UM do not leave a row region shorter than this, in MICRONS
--endcap-master NAME reserve room for one endcap at each end of every row
--out-odb FILE write the database here (default: IN PLACE, over the input)
--out-def FILE also write the result as DEF (for diffing against a golden)
--dry-run report what would be cut, write nothing
-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 applied rows were cut and the database written
0 vacuous the run changed nothing -- NOT a transformation; read the count
1 refused the design cannot be processed as asked
2 error usage error, unreadable database, no DBU scale, or a failed write
Contract
Generated from vyges physical tap --describe.
tap
row cutting around macros, and physical-cell insertion (well taps, endcaps)
Maturity: structured
cut-rows {odb}
| Input | Type | Required | Description |
|---|---|---|---|
odb | string | yes | path to the design database (.odb) |
out_odb | string | no | write the database here instead of in place |
out | string | no | write the report to FILE instead of stdout |
Consumes: odb
Artifacts: tap_report (report_path)
Assertion: rows-cut — passes when status equals applied
Provenance limitations
- input_hash covers the argument vector, not the content of the .odb it names.
- The
boundaryverb is INSPECT-ONLY: it reports the row-region, edge and corner classification and writes nothing. Every other verb that places (place-endcaps,place-tapcells,tapcell) does mutate the design – they create physical instances, orient, locate, lock and mark them – as doescut-rows, andripupremoves them. This line previously read “NOTHING IS PLACED from it yet, ONLY cut-rows mutates”, which was true of an early build and stayed here after placement shipped and was measured exact; it is corrected rather than deleted because a reader who saw the old text needs to know it moved, not wonder which of two claims to believe. - Unnamed endcap positions are filled from the library’s own LEF58 master types (odb reports these as space-separated strings like “ENDCAP LEFTBOTTOMCORNER”, not the enum spelling). Two masters claiming one position is an ERROR naming both, not a coin flip: a wrong endcap is a well-tie fault nobody sees until silicon. A position nothing fills stays empty and places nothing.
- Taps and endcaps use DIFFERENT default name prefixes – TAP_ and PHY_ – because they are separate namespaces that can be ripped up independently.
- MEASURED 2026-09-03 against the reference goldens at pin 7d490b8ecd357199c0c0e9f3e32becd5eb507c34: cut_rows 10 of 10 comparable cases exact (DEF ROW diff), endcap placement 9 of 9 exact, and combined tapcell 20 of 20 – every physical cell matching the golden in master, position and orientation. Unchanged from the previous pin 945a9f48dc6e5cc91d865daa92c45a1094cb682c. The pin is spelled out rather than substituted: a MEASUREMENT names the commit it was taken at, not whatever this binary was later built against.
- –row-min-height is scored: the cut_rows regression case that sets a minimum row height (
cut_rows_short_core) is exact at pin 27288f5c90265ae5296b2f5a9fa6e8714fa191ad (measured 2026-10-12), as it was at pin da9f29f18b6487825aa880597176e0fa97110b31 (2026-10-02). The minimum height is the larger of twice the endcap height plus the tallest core cell and the option; this line previously said the engine passed 0, which was true of the harness, not the engine. - status is one of applied, planned, vacuous or error. VACUOUS IS NOT APPLIED: it means the run changed nothing – no row cut, no cell inserted, none removed – and the declared assertion passes only on applied, so a no-op fails it rather than reporting a transformation that did not happen. Zero may still be the right answer for the design; read the count and decide. A dry run reports planned, which never claimed to have applied anything.
- All five commands are implemented: cut-rows, place-endcaps, place-tapcells, the combined tapcell, and ripup. Rip-up matches by NAME PREFIX, which is the only mark these cells carry – they are physical-only instances with no nets. An EMPTY prefix removes nothing rather than everything, which is the difference between undoing a tap step and destroying the design.
- COMBINED TAPCELL IS 20 OF 20 AT THIS PIN. It was 16 of 16 at the previous pin b5624809f29048e1f9ce9e83eb562620c652e084 and read 14 of 20 the moment the pin moved, with nothing in this engine changed: the reference had reworked endcap placement across sixteen commits and added four regression cases. A SCORE IS ONLY TRUE OF ONE COMMIT – quote the pin beside it. The last case closed by walking a hole the way the reference walks it: the reference receives holes wound like outer boundaries and walks every ring counter-clockwise, while this engine winds holes clockwise, so the classification agreed and the placement ORDER did not – and where two cells contend for one position, whichever is walked to first keeps it.
- Row cutting itself is odb’s own cutRows from odb/util.h, not a reimplementation: it is odb’s algorithm on odb’s rows, and OpenDB is the substrate. What this engine decides is the policy around it – which instances are blockages, the halo, and the minimum row width.
- Blockages are placed macros (dbInst::isBlock). A macro that is NOT placed is skipped and reported by name (the reference’s TAP-32), never silently ignored, because rows would otherwise be left crossing wherever it lands.
- The minimum row width is the LARGER of two endcap widths and any –row-min-width given, so a caller’s floor cannot quietly produce rows too narrow to cap.
- Halos and widths are given in MICRONS and converted with the database’s dbu_per_micron. A database with no DBU scale is an error rather than an assumed scale.
- Written against the reference tap regression goldens at pin 4155ac31014923e0fa721b691d222511adc7d8c3 (reference build 2026.08.0). Conformance for the implemented subset is measured by diffing the DEF ROWS section against each case’s .defok: 10 of 10 comparable cases exact. ⚠️ A correlation result is a statement about ONE reference commit – this one was re-measured when the pin moved, and combined tapcell regressed from exact.
- The corner classification is no longer checked by a separate harness. That check compared this engine’s corner CENSUS against the corner CELLS a golden holds and reported 4 exact and 6 unresolved; it was retired on 2026-08-23 because those 6 could never resolve – the reference classifies every corner too and filters only at placement (getRow), so a corner no row reaches leaves no trace in any golden on either side. All 10 of its cases are compared cell by cell by the DEF gates instead, and the corner TYPE is part of the instance name those compare (PHY_CORNER_ROW_0_OuterBottomLeft_0), alongside master, position and orientation.
- The default output is IN PLACE, over the input database. Pass –out-odb to write elsewhere, or –dry-run to report without writing.
tap.tapcell
cut the rows, place endcaps at both ends of every row and well taps along it
tapcell {odb} --tapcell-master {tapcell_master} --endcap-master {endcap_master}
| Input | Type | Required | Description |
|---|---|---|---|
odb | string | yes | path to a floorplanned design database (.odb) |
tapcell_master | string | yes | the well-tap cell master |
endcap_master | string | yes | the endcap cell master |
distance | number | no | tap spacing along a row, in MICRONS |
halo_width_x | number | no | keep-out around a macro, horizontally, in MICRONS |
halo_width_y | number | no | keep-out around a macro, vertically, in MICRONS |
row_min_width | number | no | do not leave a row narrower than this, in MICRONS |
tap_prefix | string | no | instance-name prefix for taps (default TAP_) |
endcap_prefix | string | no | instance-name prefix for endcaps (default PHY_) |
out_odb | string | no | write the database here instead of in place |
out_def | string | no | also write the result as DEF |
Assertion: cells-placed — passes when status equals applied