Vyges Loom · Physical construction

vyges-ifp

Turn a die rectangle into a floorplan a tool can place into.

Die area, core area, the site grid, and the rows every later stage fills — including hybrid sites and row parity.

View source on GitHub →

What it does

Used by: anyone starting a block — this is the first thing that runs, and everything downstream inherits whatever it decides.

A floorplan is not a rectangle. It is a core area snapped to a site grid, tiled with rows of a definite height, orientation and phase — and every placer, every tap inserter and every power grid after it is built on those rows. Get the grid wrong and nothing downstream is legal.

vyges-ifp takes the die and core rectangles in microns, resolves the site set, and builds the rows. Hybrid sites tile from their declared row pattern; row parity trims the count where a design needs an even or odd number of rows.

.odb + die/core rectangles + site  ──►  vyges-ifp  ──►  rows, core area, instance census

The core you get back is not always the core you asked for

The core’s lower-left corner is snapped up to the site grid; the upper right is left alone. What finally gets stored is what the rows cover — not the rectangle you passed in.

That is deliberate, and it is load-bearing. A caller that reads the core area back will not always see its own argument, because the honest answer is the area the design actually has. An engine that echoed your input would be easier to explain and wrong.

Rows are numbered globally across sites, so adding a site renumbers the rows after it — stated up front rather than discovered downstream.

Refusals come before writes

A macro larger than the core is refused before anything is snapped or written, and a design with both an empty die and an oversized macro reports the die first — the checks run in a fixed order so the same input always produces the same complaint.

A database with no DBU scale is an error, not an assumed scale. Guessing the units of a floorplan is how a block ends up a thousand times too big.

Scope, stated plainly: this implements the explicit-rectangle form. The utilization / aspect-ratio form, which derives the die from placed cell area, is not built — pass rectangles. UPF power domains are a known gap: the floorplan geometry matches, the power-domain instances are not inserted.

Try it

$ vyges install physical   # one-time: fetch the construction engines into ~/.vyges/bin
$ vyges physical ifp run design.odb --die-area '0 0 200 200' \
    --core-area '10 10 190 190' --site unithd   # build the floorplan
$ vyges physical ifp run design.odb ... --row-parity EVEN   # trim the rows to an even count
$ vyges physical ifp run design.odb ... --dry-run   # plan it, write nothing

Exit status is the verdict: 0 applied · 1 refused (empty die, core outside it, no row fits) · 2 error — so CI gates on the exit code without parsing prose.

Where it sits in the flow

First. vyges-tap cuts the rows this builds, vyges-pdn runs its follow pins along them, and every placer downstream fills them. Output is in place over the input database by default — pass --out-odb to write elsewhere.

Open core · Apache-2.0

A clean-room Rust engine writing the shared design database through vyges-opendb, so the block you check is the block you built. See all the engines & the data spine →