Vyges Loom · Optimizer

vyges-hold-fix

Post-route hold-fix ECO — data reaching a capture flop too early? Insert a delay cell in series on the offending pin, deepening a chain only where hold stays negative, until the hold constraint is met.

View source on GitHub →

What it does

Used by: anyone left with hold violations after detailed routing — the ones the setup-side ECOs can't touch.

The hold counterpart to resize, vt-swap and buffer-insert — all of which fix the late / setup corner. Hold is the opposite problem: data arrives at a capture flop too early on the min-delay path. vyges-hold-fix reads the timer's per-endpoint hold slacks, inserts a delay cell in series on each hold-violating capture pin, grows a delay chain only where hold stays negative, and keeps a move only if the worst hold slack improved without pushing setup negative — so a slow clock's ample setup slack pays for hold closure, never the reverse.

routed netlist + .lib + .spef + constraints  ──►  vyges-hold-fix  ──►  hold-fixed netlist + before/after WHS & WNS

A post-route ECO — scored on real parasitics

Open place-and-route flows repair hold before detailed routing; the parasitics that detailed routing adds can then re-open it, with no later repair stage. vyges-hold-fix works after routing: with a .spef it scores against the real routed interconnect, targeting the residual hold the flow leaves behind. Each round is scored by a full timing build on the mutated netlist, and a move is kept only if worst hold improves and setup stays met. It decides which capture pins to delay and how deep a chain each needs; placement and routing of the inserted cells go back to the flow.

The built-in demo closes a two-flop hold violation (worst hold slack −0.20 → +0.10 ns, met) with a short delay chain while setup stays met. Sign-off is still the golden timer — these numbers are a fast, license-free guide.

One declarative job

A .holdfix file is a superset of a sta-si timing job — the same design/netlist/lib/sdc/spef keys — plus the hold knobs: the buffer: delay cell to insert, a hold_margin: target, rounds: (low/medium/high), and dont_touch globs.

Standard CLI: --json, --quiet, --verbose, --fail-on-violation for CI.

Try it

$ vyges install loom   # one-time: fetch the Loom suite into ~/.vyges/bin
$ vyges loom hold-fix demo   # instant — built-in example closes a two-flop hold violation, no setup
$ vyges loom hold-fix run top.holdfix -o fixed.v   # delay → hold-fixed netlist
$ vyges loom hold-fix run top.holdfix --json   # before/after WHS + WNS

Open core · Apache-2.0

Driven entirely by your Liberty + constraints — no foundry-confidential data, runs out of the box on open PDKs. See all the engines & the data spine →