Local OpenROAD-SYN QoR signal: forced-engine variants, fast synth tier, asap7 suites, syn-dashboard#4365
Local OpenROAD-SYN QoR signal: forced-engine variants, fast synth tier, asap7 suites, syn-dashboard#4365oharboe wants to merge 8 commits into
Conversation
make metadata-check-synth gates a synthesis-only run on the synth__/constraints__ subset of the design's regular RULES_JSON (checkMetadata.py --only-prefix), and make metadata-synth runs synth + metadata-generate + that check. No per-variant rules files: the same rules-base.json that gates the full flow gates the fast signal, keeping the two congruent. genMetrics.py tolerates a synthesis-only tree (SDC falls back to 1_synth.sdc; grt/finish extraction is guarded; empty placeholder netlists hash as absent, matching a make run that never wrote them). synth_syn.tcl always writes the 1_synth.v gate-level netlist (write_lec_verilog, stripping physical-only masters) so the Bazel synth stage can declare it as an output in SYN mode. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
Every design() gets manual full-flow variants that pin the synthesis engine regardless of the config.mk default: <name>_syn_* forces SYNTH_USE_SYN=1 so any design can be tested under OpenROAD-SYN before its config.mk switches, and <name>_yosys_* forces the yosys engine so the baseline stays reproducible after a switch (asap7/gcd today). 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 — the local counterpart of the Jenkins/dashboard signal: <name>_<engine>_test runs the full flow against all rules; <name>_<engine>_synth_test is the minutes-scale iteration tier, checking only the synth__/constraints__ subset while sharing its synthesis action with the full-flow test. //flow/designs/asap7:syn_test and :syn_synth_test aggregate the 14 suite designs (fastest first, known failures included by design — the suites are a status signal, not a green-only gate; slow designs are documented in SYN_SLOW_DESIGNS and reproduced individually). gcd's single-process comparison consumes the generated gcd_yosys_* variant instead of hand-rolling its own yosys-engine flow. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
bazelisk run //flow/designs:syn-dashboard prints a GitHub-flavored markdown status table over the forced-engine QoR tests already built in this workspace: per design, pass/fail for the fast synthesis tier and the full flow under each engine, the failing rule fields harvested from checkMetadata.py output, and the age of the newest result. It reads bazel-testlogs only — builds nothing, so it is instant — and the output pastes into a PR or issue as-is: the local TL;DR counterpart of https://dashboard.precisioninno.com/. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
Documents the forced-engine variants, the two QoR tiers and their congruence with the Jenkins dashboard signal, and the loop philosophy: deciding what to test/build is a separate concern from displaying what exists (bazelisk run //flow/designs:syn-dashboard). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
Picks up The-OpenROAD-Project/bazel-orfs#771: SYNTH_USE_SYN=1 engine selection in the synth stage (with logs/1_synth.json declared so QoR tests can gate synth__* metrics), the fast synthesis-stage QoR pre-check emitted for any flow with rules, the orfs_update single-source cp fix, and the orfs_design extra hook that flow/designs/design.bzl uses for the forced-engine variants. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
There was a problem hiding this comment.
Code Review
This pull request introduces a local OpenROAD-SYN testing loop, including a local status dashboard (syn-dashboard), test suites for asap7, and support for synthesis-only QoR checks. Feedback on the changes highlights three main areas for improvement: correcting the output path of write_lec_verilog in synth_syn.tcl to prevent Bazel build failures, executing metadata-synth prerequisites sequentially in utils.mk to avoid parallel make race conditions, and explicitly specifying UTF-8 encoding when reading log files in synDashboard.py to ensure cross-platform compatibility.
metadata-synth ran synth/metadata-generate/metadata-check-synth as plain prerequisites, which race under make -j; run them as sequential sub-makes instead. synDashboard.py reads test logs with an explicit utf-8 encoding so non-UTF-8 host defaults cannot break parsing. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
|
/gemini review |
There was a problem hiding this comment.
Code Review
This pull request introduces a fast local OpenROAD-SYN testing loop, including new test suites for asap7 designs, synthesis-only metadata checks, and a local markdown dashboard utility (synDashboard.py) to display test results. Feedback on the new dashboard script suggests making the XML parsing more robust against malformed attributes and renaming a generator variable to avoid shadowing an outer scope variable.
…loop var Malformed failures/errors attributes now make the whole test.xml count as "no result" (—) like a ParseError, instead of raising — or worse, being swallowed per-attribute and rendering a green cell for a corrupt file. Rename the generator variable shadowing the outer result. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
|
/gemini review |
There was a problem hiding this comment.
Code Review
This pull request introduces a fast local OpenROAD-SYN testing loop and a local QoR dashboard. It adds forced-engine flow variants (syn and yosys) for designs, defines test suites for asap7, and implements a synDashboard tool to display test results from bazel-testlogs. Additionally, it updates metadata checking and metrics generation to support synthesis-only runs. Feedback on the changes points out that the generated gate-level netlist in synth_syn.tcl is written to the current working directory instead of the designated results directory, which will cause Bazel builds to fail.
Full asap7 suite status (first complete run of both tiers)
(mock-alu, mock-cpu, riscv32i are absent: their synthesis fails to build, so bazel records no test result — the Full-flow pass: gcd, gcd-ccs, aes_lvt, jpeg, jpeg_lvt. Interesting pair: aes fails 🤖 Generated with Claude Code |
The bare-filename call keeps getting flagged in review as writing to the CWD; state the proc's contract at the call site. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
|
Small consumability note from testing this PR's head as a bazel-orfs |
The local counterpart of the Jenkins QoR signal (https://dashboard.precisioninno.com/), built through Bazel so the OpenROAD-SYN 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. Supersedes #4363, which bundled status graphs and opt-in LEC (closed, parked there for revival).
What this adds
Every design gets manual forced-engine flow variants from the config.mk DSL, regardless of the engine its config.mk selects:
<name>_syn_*pinsSYNTH_USE_SYN=1so any design can be tested under OpenROAD-SYN before its config.mk officially switches, and<name>_yosys_*pins yosys so the baseline stays reproducible after a switch (asap7/gcd today). gcd's single-process comparison now consumes the generatedgcd_yosys_*variant instead of hand-rolling its own yosys flow.Designs with a
rules-base.jsonget two QoR tiers per variant, both checking the design's regular rules file with the regularcheckMetadata.py— congruent with what Jenkins measures because the fast tier is a subset of the same gate, never a different metric:<name>_<engine>_synth_test— synthesis only, gated on thesynth__/constraints__subset of the rules (make metadata-check-synth). Minutes. QoR-only: without LEC it cannot prove correctness, so it's for iterating, not concluding.<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.Displaying what you have is a separate concern from deciding what to build.
bazelisk run //flow/designs:syn-dashboardprints a GitHub-markdown TL;DR over every forced-engine result already inbazel-testlogs— pass/fail per tier and engine, failing rule fields, result age — building nothing, pasteable into a PR as-is. Seeflow/designs/README.mdfor the loop.The suites deliberately include designs that fail OpenROAD-SYN today — they are a status signal, not a green-only gate (see
SYN_TEST_DESIGNS/SYN_SLOW_DESIGNSinflow/designs/asap7/BUILD).Mechanism
SYNTH_USE_SYN=1engine selection withlogs/1_synth.jsondeclared (without it, no Bazel test could gatesynth__*metrics), the generic fast synthesis-stage QoR pre-check (its own<variant>_synthsub-variant sharing the flow's synth action), theorfs_updatecp fix, and theorfs_design(extra=)hook the DSL uses.metadata-check-synth/metadata-synthmake targets (checkMetadata.py --only-prefix),genMetrics.pytolerance for synthesis-only trees,synth_syn.tclalways writing the1_synth.vnetlist (write_lec_verilog), the forced-engine variants inflow/designs/design.bzl, the two asap7 suites, and the dashboard.Verified
Full flow under forced SYN and forced yosys on gcd (plus the regular
gcd_test), fast tier green on uart and aes, aes-block failing its area rule honestly (synth__design__instance__area__stdcell), mock-alu failing to build (slang rejects). Sample dashboard output:Full-suite
syn_teststatus across all 14 designs will be reported here once the multi-hour run completes.🤖 Generated with Claude Code