vyges-mpl — macro 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 mpl # just this oneIt is also a standalone
vyges-mplbinary on your PATH, which is what the dispatch calls and what a flow author targets directly. Source: vyges-tools/mpl.
vyges-mpl places hard macros onto a floorplan — the SRAMs, the CPU core, the crossbars —
before standard cells are placed around them. Everything after it is positioned against where the
macros landed, so a macro in the wrong place is not something a later stage recovers from.
Place macros where the design says
vyges mpl place-macro design.odb \
--macro u_cpu=1353,2096,N \
--macro u_sram0=100,2520 \
--out-odb placed.odb
X,Y is the macro origin in microns, as a floorplan config states it; pass --dbu to give
database units instead. The orientation is R0/R90/R180/R270/MX/MY/MXR90/MYR90, and
defaults to R0. Each macro is left FIXED, which is the status a harden flow expects so later
placement cannot move it.
This is the manual placement a real flow uses: it corresponds to LibreLane Classic’s
Odb.ManualMacroPlacement, not to OpenROAD’s place_macro, and it therefore does no track
snapping and no overlap check.
⛔ Macros must arrive UNPLACED
A macro read from a DEF as + FIXED is LOCKED, and OpenDB refuses to move a locked instance —
you get ODB-0359 Attempt to change the origin of LOCKED instance. Strip the placement first, or
place onto a database that never had one. That is what a floorplan flow hands this step.
What this engine does NOT do yet
runis not wired. The hierarchical RTL macro placer is implemented and correlated against OpenROAD — nine gates, byte-exact DEFs — but it is driven by thecluster-dumpbinary the correlation gates use.--describeadvertises arunentry point this binary does not yet keep, and says so.- TritonPart (
par) is not implemented yet. A flat cluster over the level threshold is refused, never approximated. That is published as alimitsfield so a caller can test for it rather than meet it mid-run. It matters on a flat synthesized netlist: a design read from a single-module netlist puts every cell in one cluster and reaches that path.
Both are in --describe, which is the contract — read it rather than inferring from this page.
Where it sits
ifp -> mpl -> tap -> pdn
ifp makes the rows; mpl puts the macros on them; tap cuts the rows around what landed and
inserts taps and endcaps; pdn builds the grid over the result.