Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 57 additions & 0 deletions flow/designs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
# ORFS designs

## Findings: how accurate are early-stage WNS estimates?

Reading the committed `rules-base.json` baselines, normalized by each design's clock
period (parsed from its `.sdc`), the picture across the 67 designs / 8 PDKs that expose
`cts` and `globalroute` slack is:

- **Global route usually tightens the estimate.** For most PDKs the mean absolute error
drops from `cts` to `globalroute` — dramatically for `sky130hs` (10.5% → 1.9%) and
`gt2n` (3.3% → 0.0%), and clearly for `gf12` (2.2% → 1.1%) and `ihp-sg13g2`
(0.6% → 0.0%). `ihp-sg13g2` and `gf180` are already accurate at `cts`.

- **`cts` is biased optimistic; `globalroute` often overshoots into pessimism.** Every
PDK's `cts` bias is ≥ 0 (cts reports more slack than the design finally closes with),
whereas `globalroute` bias flips negative for `sky130hd` (−3.5%), `sky130hs` (−1.9%),
`gf12` (−1.1%) and `nangate45` (−0.5%). Global route tends to *over-correct*.

- **`sky130hd` is the exception where routing makes the estimate worse**, not better:
`globalroute` MAE (3.5%) exceeds `cts` MAE (2.9%), and it is consistently pessimistic.

- **Outliers are design-specific, not PDK-wide.** `sky130hs/gcd` has `cts` +45.9%
(wildly optimistic, fully corrected by `globalroute`), and `asap7/swerv_wrapper` is
+14.9% optimistic at *both* stages — the cases most likely to mislead an early-stage
go/no-go decision.

Practical reading: `cts` slack is a usable optimistic rank-ordering; `globalroute` is the
first estimate within a few % of final for most PDKs, but on `sky130hd` (and for specific
designs elsewhere) even `globalroute` can be off by 3–10% of the clock period. This is the
design-level companion to the per-net GRT-vs-RCX divergence in
[`flow/docs/rcx`](../docs/rcx/README.md) (PR #4302). Per-PDK design breakdowns:
[asap7](asap7/README.md), [nangate45](nangate45/README.md), [sky130hd](sky130hd/README.md),
[sky130hs](sky130hs/README.md), [gf12](gf12/README.md), [gf180](gf180/README.md),
[gt2n](gt2n/README.md), [ihp-sg13g2](ihp-sg13g2/README.md).

<!-- BEGIN WNS-ACCURACY (generated by flow/util/plot_wns.py) -->
## WNS estimate accuracy across PDKs

How closely the earlier-stage worst-slack estimates (`cts`, `globalroute`) match the final (`finish`) WNS, per design, normalized by that design's clock period so PDKs with different timing units are comparable. Error is `(stage − finish) / clock_period`; **positive = optimistic** (the stage reported more slack than the design actually closes with), negative = pessimistic. Clock period is parsed from each design's `.sdc`; designs whose period could not be parsed are omitted.

![WNS estimate accuracy by stage, across PDKs](wns_accuracy.png)

Mean absolute error (MAE) and mean signed error (bias), in % of clock period:

| PDK | designs | cts MAE | cts bias | grt MAE | grt bias | worst (design) |
| --- | ---: | ---: | ---: | ---: | ---: | --- |
| asap7 | 16 | 2.8% | +1.5% | 2.9% | +1.1% | +14.9% (swerv_wrapper globalroute) |
| gf12 | 9 | 2.2% | -2.2% | 1.1% | -1.1% | -14.2% (jpeg cts) |
| gf180 | 5 | 1.0% | +1.0% | 0.4% | +0.3% | +4.3% (aes cts) |
| gt2n | 3 | 3.3% | +3.3% | 0.0% | +0.0% | +10.0% (aes cts) |
| ihp-sg13g2 | 7 | 0.6% | +0.6% | 0.0% | +0.0% | +4.5% (spi cts) |
| nangate45 | 15 | 0.8% | +0.6% | 1.0% | -0.5% | -3.2% (black_parrot globalroute) |
| sky130hd | 7 | 2.9% | +2.0% | 3.5% | -3.5% | -10.0% (gcd globalroute) |
| sky130hs | 5 | 10.5% | +10.5% | 1.9% | -1.9% | +45.9% (gcd cts) |

_Generated by `flow/util/plot_wns.py`; regenerate with `python3 flow/util/plot_wns.py`._
<!-- END WNS-ACCURACY -->
68 changes: 68 additions & 0 deletions flow/designs/asap7/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# asap7 designs

## Findings: worst negative slack (WNS) across asap7

These notes read the committed `rules-base.json` baselines — the worst setup slack each
design reaches at clock-tree synthesis (`cts`), global route (`globalroute`) and `finish`.
The plot and table below are regenerated from that data by
[`flow/util/plot_wns.py`](../../util/plot_wns.py); no flow run is needed, so the numbers
are exactly what CI checks against.

What stands out:

- **Every asap7 design closes with negative setup slack.** All 18 baselines have
`finish` WNS < 0, so the committed asap7 constraints target clocks the flow does not
actually meet — these baselines track *how far short* each design lands, not timing
closure. `swerv_wrapper` (≈ −318) and `mock-alu` (≈ −300) are the extreme cases, an
order of magnitude worse than the cluster around −15 … −50 (`aes*`, `mock-cpu`,
`uart`, `jpeg`).

- **Worst slack is often not stable across stages.** Some designs pin their critical
path early and barely move (`cva6`, `jpeg`, `mock-cpu`: `cts ≈ globalroute ≈ finish`).
Others move a lot: `swerv_wrapper` degrades from −80 at cts/globalroute to −318 at
finish, and `riscv32i`/`riscv32i-mock-sram` slip from ≈ −47 (cts) to ≈ −81 (finish) —
routing and final extraction make the path materially worse than CTS predicted.

- **Global route is sometimes more pessimistic than finish.** For `gcd`
(cts −85.9 → globalroute −110 → finish −96.7) and `aes-block`
(cts −84 → globalroute −31 → finish −57) the worst-slack estimate swings between
stages rather than monotonically worsening. This is the same GRT-vs-post-route
estimate gap explored in [`flow/docs/rcx`](../../docs/rcx/README.md) (PR #4302), here
visible at the design level rather than per net.

The takeaway for anyone using cts-stage slack as a proxy for the final result: for asap7
it is a usable rank ordering but not a reliable magnitude — several designs move tens of
units (and `swerv_wrapper` hundreds) between cts and finish.

<!-- BEGIN WNS (generated by flow/util/plot_wns.py) -->
## WNS

Worst setup slack per design at three flow stages — clock-tree synthesis (`cts`), global route (`globalroute`) and `finish` — read from each design's `rules-base.json`. Negative means setup timing is not met. Values are in this PDK's native timing unit (ps for `asap7`, ns for most others), so they are comparable within this PDK but not across PDKs.

The bar is the `finish` slack; the markers show the `cts` and `globalroute` slack for the same design, so stage-to-stage movement is visible.

![WNS by design — asap7](wns.png)

| design | cts | globalroute | finish |
| --- | ---: | ---: | ---: |
| swerv_wrapper | -80 | -80 | -318 |
| mock-alu | -289 | -303 | -300 |
| gcd | -85.9 | -110 | -96.7 |
| gcd-ccs | -101 | -93.7 | -96.4 |
| ethmac | -88.6 | -103 | -93.3 |
| riscv32i-mock-sram | -47.5 | -52.8 | -81.3 |
| riscv32i | -47.5 | -49.8 | -81.2 |
| jpeg_lvt | -30 | -30 | -63.9 |
| aes-block | -84.1 | -31.1 | -56.6 |
| ibex | -79.4 | -74.3 | -52.5 |
| cva6 | -50 | -50 | -50 |
| uart | -47.6 | -58.7 | -49.1 |
| jpeg | -34 | -34 | -34 |
| aes_lvt | -18 | -18 | -26.1 |
| aes | -28.9 | -28 | -24.2 |
| aes-mbff | -20.8 | -19 | -20.8 |
| mock-cpu | -16.6 | -16.6 | -16.6 |
| ethmac_lvt | -19 | -29.5 | -15.2 |

_Generated by `flow/util/plot_wns.py` from `rules-base.json`; regenerate with `python3 flow/util/plot_wns.py`._
<!-- END WNS -->
Binary file added flow/designs/asap7/wns.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
29 changes: 29 additions & 0 deletions flow/designs/gf12/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# gf12 designs

<!-- BEGIN WNS (generated by flow/util/plot_wns.py) -->
## WNS

Worst setup slack per design at three flow stages — clock-tree synthesis (`cts`), global route (`globalroute`) and `finish` — read from each design's `rules-base.json`. Negative means setup timing is not met. Values are in this PDK's native timing unit (ps for `asap7`, ns for most others), so they are comparable within this PDK but not across PDKs.

The bar is the `finish` slack; the markers show the `cts` and `globalroute` slack for the same design, so stage-to-stage movement is visible.

![WNS by design — gf12](wns.png)

| design | cts | globalroute | finish |
| --- | ---: | ---: | ---: |
| bp_single | -632 | -470 | -227 |
| bp_quad | -375 | -223 | -225 |
| ariane | -257 | -214 | -212 |
| coyote | -200 | -200 | -200 |
| bp_dual | -758 | -100 | -165 |
| ca53 | -100 | -100 | -100 |
| swerv_wrapper | -75 | -75 | -75 |
| ibex | -51 | -51 | -51 |
| tinyRocket | -40 | -40 | -40 |
| jpeg | -96 | -53.2 | -25 |
| aes | -21 | -21 | -21 |
| gcd | -21.5 | -26.3 | -14 |
| ariane133 | -20.2409 | 0 | 0 |

_Generated by `flow/util/plot_wns.py` from `rules-base.json`; regenerate with `python3 flow/util/plot_wns.py`._
<!-- END WNS -->
Binary file added flow/designs/gf12/wns.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
22 changes: 22 additions & 0 deletions flow/designs/gf180/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# gf180 designs

<!-- BEGIN WNS (generated by flow/util/plot_wns.py) -->
## WNS

Worst setup slack per design at three flow stages — clock-tree synthesis (`cts`), global route (`globalroute`) and `finish` — read from each design's `rules-base.json`. Negative means setup timing is not met. Values are in this PDK's native timing unit (ps for `asap7`, ns for most others), so they are comparable within this PDK but not across PDKs.

The bar is the `finish` slack; the markers show the `cts` and `globalroute` slack for the same design, so stage-to-stage movement is visible.

![WNS by design — gf180](wns.png)

| design | cts | globalroute | finish |
| --- | ---: | ---: | ---: |
| aes-hybrid | -0.967 | -1.1 | -1.1 |
| aes | -0.789 | -0.876 | -0.918 |
| riscv32i | -0.586 | -0.659 | -0.63 |
| ibex | -0.5 | -0.5 | -0.539 |
| jpeg | -0.375 | -0.375 | -0.375 |
| uart-blocks | -0.3 | -0.3 | -0.3 |

_Generated by `flow/util/plot_wns.py` from `rules-base.json`; regenerate with `python3 flow/util/plot_wns.py`._
<!-- END WNS -->
Binary file added flow/designs/gf180/wns.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
17 changes: 17 additions & 0 deletions flow/designs/gf55/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# gf55 designs

<!-- BEGIN WNS (generated by flow/util/plot_wns.py) -->
## WNS

Worst setup slack per design at three flow stages — clock-tree synthesis (`cts`), global route (`globalroute`) and `finish` — read from each design's `rules-base.json`. Negative means setup timing is not met. Values are in this PDK's native timing unit (ps for `asap7`, ns for most others), so they are comparable within this PDK but not across PDKs.

The bar is the `finish` slack; the markers show the `cts` and `globalroute` slack for the same design, so stage-to-stage movement is visible.

![WNS by design — gf55](wns.png)

| design | cts | globalroute | finish |
| --- | ---: | ---: | ---: |
| aes | | | 0 |

_Generated by `flow/util/plot_wns.py` from `rules-base.json`; regenerate with `python3 flow/util/plot_wns.py`._
<!-- END WNS -->
Binary file added flow/designs/gf55/wns.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
19 changes: 19 additions & 0 deletions flow/designs/gt2n/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# gt2n designs

<!-- BEGIN WNS (generated by flow/util/plot_wns.py) -->
## WNS

Worst setup slack per design at three flow stages — clock-tree synthesis (`cts`), global route (`globalroute`) and `finish` — read from each design's `rules-base.json`. Negative means setup timing is not met. Values are in this PDK's native timing unit (ps for `asap7`, ns for most others), so they are comparable within this PDK but not across PDKs.

The bar is the `finish` slack; the markers show the `cts` and `globalroute` slack for the same design, so stage-to-stage movement is visible.

![WNS by design — gt2n](wns.png)

| design | cts | globalroute | finish |
| --- | ---: | ---: | ---: |
| aes | -25 | -75.2 | -75.2 |
| jpeg | -50 | -50 | -50 |
| gcd | -25 | -25 | -25 |

_Generated by `flow/util/plot_wns.py` from `rules-base.json`; regenerate with `python3 flow/util/plot_wns.py`._
<!-- END WNS -->
Binary file added flow/designs/gt2n/wns.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
23 changes: 23 additions & 0 deletions flow/designs/ihp-sg13g2/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# ihp-sg13g2 designs

<!-- BEGIN WNS (generated by flow/util/plot_wns.py) -->
## WNS

Worst setup slack per design at three flow stages — clock-tree synthesis (`cts`), global route (`globalroute`) and `finish` — read from each design's `rules-base.json`. Negative means setup timing is not met. Values are in this PDK's native timing unit (ps for `asap7`, ns for most others), so they are comparable within this PDK but not across PDKs.

The bar is the `finish` slack; the markers show the `cts` and `globalroute` slack for the same design, so stage-to-stage movement is visible.

![WNS by design — ihp-sg13g2](wns.png)

| design | cts | globalroute | finish |
| --- | ---: | ---: | ---: |
| i2c-gpio-expander | -1 | -1 | -1 |
| ibex | -0.4 | -0.4 | -0.4 |
| jpeg | -0.4 | -0.4 | -0.4 |
| riscv32i | -0.3 | -0.3 | -0.3 |
| aes | -0.225 | -0.225 | -0.225 |
| gcd | -0.13 | -0.13 | -0.13 |
| spi | 0 | -0.0426 | -0.045 |

_Generated by `flow/util/plot_wns.py` from `rules-base.json`; regenerate with `python3 flow/util/plot_wns.py`._
<!-- END WNS -->
Binary file added flow/designs/ihp-sg13g2/wns.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
32 changes: 32 additions & 0 deletions flow/designs/nangate45/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# nangate45 designs

<!-- BEGIN WNS (generated by flow/util/plot_wns.py) -->
## WNS

Worst setup slack per design at three flow stages — clock-tree synthesis (`cts`), global route (`globalroute`) and `finish` — read from each design's `rules-base.json`. Negative means setup timing is not met. Values are in this PDK's native timing unit (ps for `asap7`, ns for most others), so they are comparable within this PDK but not across PDKs.

The bar is the `finish` slack; the markers show the `cts` and `globalroute` slack for the same design, so stage-to-stage movement is visible.

![WNS by design — nangate45](wns.png)

| design | cts | globalroute | finish |
| --- | ---: | ---: | ---: |
| bp_quad | -150 | -150 | -150 |
| black_parrot | -3.31 | -3.45 | -3.26 |
| mempool_group | -2.31 | -2.31 | -2.31 |
| swerv | -0.671 | -0.719 | -0.677 |
| ariane133 | -0.579 | -0.569 | -0.595 |
| swerv_wrapper | -0.344 | -0.357 | -0.35 |
| dynamic_node | -0.362 | -0.38 | -0.344 |
| ariane136 | -0.3 | -0.3 | -0.318 |
| bp_be_top | -0.331 | -0.315 | -0.318 |
| bp_multi_top | -0.24 | -0.24 | -0.24 |
| jpeg | -0.147 | -0.165 | -0.164 |
| tinyRocket | -0.14 | -0.168 | -0.154 |
| bp_fe_top | -0.09 | -0.09 | -0.131 |
| ibex | -0.11 | -0.127 | -0.11 |
| aes | -0.041 | -0.0692 | -0.0667 |
| gcd | -0.0529 | -0.0657 | -0.0559 |

_Generated by `flow/util/plot_wns.py` from `rules-base.json`; regenerate with `python3 flow/util/plot_wns.py`._
<!-- END WNS -->
Binary file added flow/designs/nangate45/wns.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
23 changes: 23 additions & 0 deletions flow/designs/sky130hd/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# sky130hd designs

<!-- BEGIN WNS (generated by flow/util/plot_wns.py) -->
## WNS

Worst setup slack per design at three flow stages — clock-tree synthesis (`cts`), global route (`globalroute`) and `finish` — read from each design's `rules-base.json`. Negative means setup timing is not met. Values are in this PDK's native timing unit (ps for `asap7`, ns for most others), so they are comparable within this PDK but not across PDKs.

The bar is the `finish` slack; the markers show the `cts` and `globalroute` slack for the same design, so stage-to-stage movement is visible.

![WNS by design — sky130hd](wns.png)

| design | cts | globalroute | finish |
| --- | ---: | ---: | ---: |
| microwatt | -2.71 | -2.8 | -2.73 |
| gcd | -1.36 | -1.58 | -1.47 |
| riscv32i | -1.41 | -1.55 | -1.37 |
| jpeg | -0.716 | -0.877 | -0.654 |
| ibex | -0.505 | -0.576 | -0.5 |
| aes | -0.18 | -0.554 | -0.425 |
| chameleon | -0.321 | -0.356 | -0.282 |

_Generated by `flow/util/plot_wns.py` from `rules-base.json`; regenerate with `python3 flow/util/plot_wns.py`._
<!-- END WNS -->
Binary file added flow/designs/sky130hd/wns.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
21 changes: 21 additions & 0 deletions flow/designs/sky130hs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# sky130hs designs

<!-- BEGIN WNS (generated by flow/util/plot_wns.py) -->
## WNS

Worst setup slack per design at three flow stages — clock-tree synthesis (`cts`), global route (`globalroute`) and `finish` — read from each design's `rules-base.json`. Negative means setup timing is not met. Values are in this PDK's native timing unit (ps for `asap7`, ns for most others), so they are comparable within this PDK but not across PDKs.

The bar is the `finish` slack; the markers show the `cts` and `globalroute` slack for the same design, so stage-to-stage movement is visible.

![WNS by design — sky130hs](wns.png)

| design | cts | globalroute | finish |
| --- | ---: | ---: | ---: |
| gcd | -0.358 | -1 | -1 |
| riscv32i | -0.303 | -0.695 | -0.571 |
| ibex | -0.35 | -0.525 | -0.35 |
| jpeg | -0.2 | -0.268 | -0.2 |
| aes | -0.14 | -0.206 | -0.145 |

_Generated by `flow/util/plot_wns.py` from `rules-base.json`; regenerate with `python3 flow/util/plot_wns.py`._
<!-- END WNS -->
Binary file added flow/designs/sky130hs/wns.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added flow/designs/wns_accuracy.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading