-
Notifications
You must be signed in to change notification settings - Fork 515
Local OpenROAD-SYN QoR signal: forced-engine variants, fast synth tier, asap7 suites, syn-dashboard #4365
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
oharboe
wants to merge
8
commits into
The-OpenROAD-Project:master
Choose a base branch
from
oharboe:syn-local-signal
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Local OpenROAD-SYN QoR signal: forced-engine variants, fast synth tier, asap7 suites, syn-dashboard #4365
Changes from all commits
Commits
Show all changes
8 commits
Select commit
Hold shift + click to select a range
8ca0388
util: synthesis-stage QoR check against the regular rules file
oharboe a498113
designs: forced-engine flow variants and asap7 OpenROAD-SYN suites
oharboe 1408356
util: syn-dashboard — local markdown TL;DR of the OpenROAD-SYN signal
oharboe dbf3241
designs: README for the fast local OpenROAD-SYN testing loop
oharboe 5022d1f
bazel: bump bazel-orfs for OpenROAD-SYN engine and fast synth QoR tests
oharboe 13ce4d0
review: make metadata-synth -j-safe, explicit utf-8 in synDashboard
oharboe a30468e
review: syn-dashboard treats corrupt test.xml as no result, unshadow …
oharboe 5ff9d76
synth_syn: document that write_lec_verilog prefixes RESULTS_DIR itself
oharboe File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1 +1,12 @@ | ||
| exports_files(["BUILD"]) | ||
|
|
||
| # Local TL;DR of https://dashboard.precisioninno.com/: a GitHub-markdown | ||
| # status table over the forced-engine OpenROAD-SYN QoR tests already | ||
| # built in this workspace (see flow/designs/design.bzl). Reads | ||
| # bazel-testlogs only — builds nothing, instant. | ||
| # | ||
| # bazelisk run //flow/designs:syn-dashboard | ||
| alias( | ||
| name = "syn-dashboard", | ||
| actual = "//flow/util:synDashboard", | ||
| ) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,72 @@ | ||
| # Fast local OpenROAD-SYN testing loop | ||
|
|
||
| The maintainers' QoR signal comes from Jenkins runs published at | ||
| <https://dashboard.precisioninno.com/>. The targets described here are | ||
| its local counterpart: the same designs, gated by the same | ||
| `rules-base.json` files with the same `checkMetadata.py`, but built | ||
| locally through Bazel so the loop can be sharpened onto exactly the | ||
| design, engine, and stage being worked on — fast enough for an agent | ||
| (e.g. Claude) to iterate against. | ||
|
|
||
| Every design gets manual forced-engine flow variants (see | ||
| `design.bzl`), regardless of the engine its config.mk selects: | ||
|
|
||
| - `<name>_syn_*` pins `SYNTH_USE_SYN=1` (OpenROAD-SYN), so any design | ||
| can be tested under SYN before its config.mk officially switches. | ||
| - `<name>_yosys_*` pins the yosys engine, so the baseline stays | ||
| reproducible after a design switches (asap7/gcd today). | ||
|
|
||
| Designs with a `rules-base.json` get two QoR tiers per variant: | ||
|
|
||
| - `<name>_<engine>_synth_test` — the fast tier: synthesis only, | ||
| checked against the `synth__`/`constraints__` subset of the rules. | ||
| Minutes. QoR-only — without LEC it cannot prove correctness, so use | ||
| it to iterate, not to conclude. | ||
| - `<name>_<engine>_test` — the full flow against all rules: the real, | ||
| dashboard-equivalent gate. It reuses the fast tier's synthesis | ||
| action, so escalating from fast to full never repeats synthesis. | ||
|
|
||
| ## The loop | ||
|
|
||
| Build/test whatever is relevant to what you are changing — one design, | ||
| one stage, one tier, or a whole suite: | ||
|
|
||
| ```sh | ||
| # fastest signal for one design | ||
| bazelisk test //flow/designs/asap7/jpeg:jpeg_encoder_syn_synth_test | ||
|
|
||
| # the real gate for that design | ||
| bazelisk test //flow/designs/asap7/jpeg:jpeg_encoder_syn_test | ||
|
|
||
| # a single stage, for triage | ||
| bazelisk build //flow/designs/asap7/jpeg:jpeg_encoder_syn_route | ||
|
|
||
| # yosys A/B on an officially-SYN design | ||
| bazelisk test //flow/designs/asap7/gcd:gcd_yosys_test | ||
|
|
||
| # suite-wide status (asap7): fast tier, then the full flows | ||
| bazelisk test --keep_going //flow/designs/asap7:syn_synth_test | ||
| bazelisk test --keep_going //flow/designs/asap7:syn_test | ||
| ``` | ||
|
|
||
| Then display what you have — deliberately a separate concern from | ||
| deciding what to test or build: | ||
|
|
||
| ```sh | ||
| bazelisk run //flow/designs:syn-dashboard | ||
| ``` | ||
|
|
||
| It prints a GitHub-markdown TL;DR table of every forced-engine test | ||
| result already in `bazel-testlogs` — pass/fail per tier and engine, | ||
| failing rule fields, result age — without building anything. Paste it | ||
| into a PR or issue as-is. Because the display reads whatever exists, | ||
| the loop stays fast: iterate on the one target you care about, and the | ||
| dashboard aggregates across everything you (or earlier sessions) have | ||
| built so far. | ||
|
|
||
| The suites include designs that fail OpenROAD-SYN today on purpose — | ||
| they are a status signal, not a green-only gate. A build failure (e.g. | ||
| synthesis dies) records no test result at all, so run the suites with | ||
| `--keep_going` and check their output for `FAILED TO BUILD`; designs | ||
| too slow for the suites are listed in `SYN_SLOW_DESIGNS` | ||
| (`asap7/BUILD`) and reproduced individually. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,111 @@ | ||
| # OpenROAD-SYN test suites for asap7 — the local counterpart of the | ||
| # Jenkins QoR signal (https://dashboard.precisioninno.com/). | ||
| # | ||
| # Every design gets manual forced-engine flow variants from the | ||
| # config.mk DSL (see flow/designs/design.bzl): <name>_syn_* pins | ||
| # SYNTH_USE_SYN=1 and <name>_yosys_* pins the yosys engine, regardless | ||
| # of the config.mk default. Designs with a rules-base.json get two QoR | ||
| # gates per variant, both checking the design's regular rules file with | ||
| # the regular checkMetadata.py — congruent with what Jenkins measures: | ||
| # | ||
| # bazelisk test --keep_going //flow/designs/asap7:syn_synth_test | ||
| # Fast tier: synthesis only, checks the synth__/constraints__ subset | ||
| # of rules-base.json. Minutes-scale; QoR-only (no LEC), so it cannot | ||
| # prove correctness — use it to iterate, not to conclude. | ||
| # | ||
| # bazelisk test --keep_going //flow/designs/asap7:syn_test | ||
| # Full flow, all rules-base.json gates. The real signal; shares its | ||
| # synthesis action with the fast tier. | ||
| # | ||
| # Sharpening the loop on one design or stage: | ||
| # | ||
| # bazelisk test //flow/designs/asap7/jpeg:jpeg_encoder_syn_synth_test | ||
| # bazelisk test //flow/designs/asap7/jpeg:jpeg_encoder_syn_test | ||
| # bazelisk build //flow/designs/asap7/jpeg:jpeg_encoder_syn_route | ||
| # bazelisk test //flow/designs/asap7/gcd:gcd_yosys_test # yosys A/B | ||
| # | ||
| # Both suites deliberately include designs that fail OpenROAD-SYN today | ||
| # — they are a status signal, not a green-only gate. A design can fail | ||
| # by not synthesizing at all, or by missing rules-base.json gates that | ||
| # its regular flow meets. | ||
|
|
||
| # Design directory -> DESIGN_NAME (bazel target prefix), ordered | ||
| # fastest-first so --keep_going runs surface quick failures early. | ||
| # Known failures / quirks are listed last. "minimal" is excluded: it | ||
| # has no VERILOG_FILES and thus no generated design targets. | ||
| # | ||
| # Known OpenROAD-SYN failures today: | ||
| # - mock-alu: SDC references yosys-style register names (*io_out_REG*) | ||
| # absent from the SYN netlist. | ||
| # - riscv32i: slang rejects procedural assignment to nets (dmem.v). | ||
| # - mock-cpu: slang rejects endianness-mismatched part-select | ||
| # (wptr_full.v). | ||
| # - aes-block: hierarchical BLOCKS; synthesizes, but SYN area blows past | ||
| # the yosys-derived rules-base.json gate. | ||
| SYN_TEST_DESIGNS = { | ||
| "gcd": "gcd", # smoketest, fast | ||
| "uart": "uart", | ||
| "mock-alu": "MockAlu", | ||
| "riscv32i": "riscv_top", | ||
| "aes": "aes_cipher_top", | ||
| "aes_lvt": "aes_cipher_top", | ||
| "aes-mbff": "aes_cipher_top", | ||
| "jpeg": "jpeg_encoder", | ||
| "jpeg_lvt": "jpeg_encoder", | ||
| "ethmac": "ethmac", | ||
| "ethmac_lvt": "ethmac", | ||
| "mock-cpu": "mock_cpu", | ||
| "gcd-ccs": "gcd", # CCS liberty | ||
| "aes-block": "aes_cipher_top", # hierarchical BLOCKS | ||
| } | ||
|
|
||
| # Designs whose OpenROAD-SYN run is too slow (or does not terminate) for | ||
| # the suites. Their generated per-design targets stay tags=["manual"] | ||
| # like all forced-engine targets, but they are deliberately left out of | ||
| # the suites so those remain runnable; reproduce individually, e.g. | ||
| # bazelisk build //flow/designs/asap7/ibex:ibex_core_syn_synth | ||
| # | ||
| # - ibex: sv_elaborate/synthesize/repair_design complete in seconds, but | ||
| # report_metrics ("Report metrics stage 1, synth...") spins in STA for | ||
| # hours (observed >2h on 48 threads with no progress). | ||
| # - cva6: synthesize itself takes ~73s, but repair_design -pre_placement | ||
| # was still running after 10+ minutes when the status sweep was cut | ||
| # off; not yet characterized to completion. | ||
| # - swerv_wrapper: largest design in the suite; not yet run to | ||
| # completion under OpenROAD-SYN in this environment. | ||
| # - riscv32i-mock-sram: hierarchical BLOCKS (fakeram) — the syn variant | ||
| # first needs the block's full PnR flow for its abstract; not yet run | ||
| # to completion. | ||
| SYN_SLOW_DESIGNS = { | ||
| "cva6": "cva6", | ||
| "ibex": "ibex_core", | ||
| "riscv32i-mock-sram": "riscv_top", | ||
| "swerv_wrapper": "swerv_wrapper", | ||
| } | ||
|
|
||
| # Explicitly listed manual tests DO run through a test_suite (the manual | ||
| # tag only exempts them from wildcard expansion); the suites themselves | ||
| # are manual so `bazelisk test //flow/...` does not pull them in either. | ||
| test_suite( | ||
| name = "syn_test", | ||
| tags = ["manual"], | ||
| tests = [ | ||
| "//flow/designs/asap7/{pkg}:{name}_syn_test".format( | ||
| name = name, | ||
| pkg = pkg, | ||
| ) | ||
| for pkg, name in SYN_TEST_DESIGNS.items() | ||
| ], | ||
| ) | ||
|
|
||
| test_suite( | ||
| name = "syn_synth_test", | ||
| tags = ["manual"], | ||
| tests = [ | ||
| "//flow/designs/asap7/{pkg}:{name}_syn_synth_test".format( | ||
| name = name, | ||
| pkg = pkg, | ||
| ) | ||
| for pkg, name in SYN_TEST_DESIGNS.items() | ||
| ], | ||
| ) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.