Vyges Loom · Optimizer
Gate sizing — pick a better drive strength for each cell to close setup timing or recover area. Where sign-off says what's wrong, this fixes it.
Used by: anyone closing timing on a synthesized or placed netlist — or trimming area/power once it's met.
vyges-resize reads a netlist + Liberty + constraints and picks a better drive strength for each cell — upsizing cells on the critical path to close setup violations, downsizing cells with slack to recover area — then emits the resized netlist and a before/after timing report. The logic never changes; only the cell variant does. Every candidate is scored by the vyges-sta-si timer — it's pure Rust, so you can experiment with GPUs too via rust-gpu. It picks sizes, not locations: placement and routing stay the flow's job.
.lib + constraints ──► vyges-resize ──► resized netlist + before/after timing
Run it two ways:
spef: and every candidate is scored against the real wire RC the placed design presents. That's where sizing earns its keep: the gate driving a long, heavily-loaded net is the one that actually needs the stronger variant.Exercised on real OpenROAD-routed sky130 with its extracted SPEF, and on built-in examples it closes a setup violation end-to-end. Sign-off is still the golden timer — vyges-resize's numbers are a fast, license-free guide.
A .resize file is a superset of a timing job: it adds the interchangeable cell families (weakest → strongest), the objective (timing or area), an effort budget, and dont_touch globs. Add a spef: for post-place ECO. The legal moves come entirely from your .lib — nothing foundry-confidential.
Standard CLI: --json, --quiet, --verbose, and a --fail-on-violation exit code that gates CI.
Sizing is driven entirely by your Liberty — the legal variants and their delay/power — so vyges-resize carries no foundry-confidential data and runs out of the box on open PDKs. See all the engines & the data spine →