表頭數字與下方 504 格全部對當前原始碼現算:表頭由 gen_flow_gate_header.py、八個維度的分佈與每一格的狀態由 gen_flow_gate_matrix.py。兩支都有 --check,漂移時 exit 1。這張表隨 repo 變動;流程長一個步驟,覆蓋就自動變不完整。
D9 不是一個已經出貨的維度。flow/phase1_phase2_phase3.yaml 裡沒有任何一條 gate 在問「輸出對不對」;上面那 504 格問的是前八個問題。這一節是把第九個問題拿去量今天的樹得到的結果,不是一個新的維度宣告。每一格都是真的把該步驟的 blocking gate 跑起來(two-arm artefact mutation,372 個 (step,run) cell),不是靜態掃描。
可以相信 MAY believe:every declared artefact exists, agrees with itself, agrees with every other artefact of the same run about the same physical quantity, and sits inside what THIS PDK's own tables permit — and no verdict was issued over a zero denominator, an absent file, or a glob that found another run's evidence.
不可以相信 MAY NOT believe:that the design is functionally correct, that it closes timing, that a foundry deck would sign it off, or that silicon works.
This gate certifies CONSISTENCY AND ATTRIBUTION, never CORRECTNESS.
這個 gate 證明的是一致性與歸屬(consistency and attribution),永遠不是正確性(correctness)。
git ls-files benchmark-data 裡帶 phase1/generated_docs/ 的目錄每個步驟,107 個已發佈 run 裡有幾個完整帶著它宣告的產出集合?ANY_OF 與 glob 都照 flowref 的定義解析。
| 帶滿該步驟產出的 run 數 | 步驟數 | 這代表什麼 |
|---|---|---|
| 0 | 22 | 這些格子連跑都跑不起來。沒有任何已發佈的 run 帶著它的產出。 |
| 1 – 10 | 31 | 中位數是 3 個 run。一格綠燈的背後常常只有兩三個 run。 |
| ≥ 11 | 10 | 其中只有 1 個步驟拿得到全部 107 個 run。 |
benchmark-data/PUBLISHING.md 的「Excluded by construction」一節明講:*.gds、*.def、*.spef、*.oas 從來不會被 commit。實測整個 corpus:1 個 .def、12 個 .gds、8 個 .spef、0 個 .oas。所以凡是產出是版圖幾何的步驟,分母天生就是 0 —— 這是今天這張表的天花板本身,不是可以靠寫程式補起來的洞。
原因由 two-arm 的實際結果決定,不是推測。優先序:分母為零 → 沒有 blocking 尺 → 尺是瞎的(觀察到的行為,壓過所有解釋)→ PDK 沒讀到 → skill 不存在 → 本來就紅 → 尺沒跑起來。
files_exist 之類的路徑解析。檔案在,就過。MOVES = 把該步驟宣告的產出從一份隔離的副本裡刪掉之後,某一條 blocking gate 的判定改變了(這是這個 repo 對「一格是真的」唯一承認的證據:matrix_mutation_ledger)。DARK = 沒有改變。den = 帶滿該步驟產出的 run 數;moved = 在幾個 run 上判定真的改變。
| step | 名稱 | den | moved | D9 | 為什麼暗 / 誰讓它會動 |
|---|---|---|---|---|---|
| stage_phase1 | |||||
| D1 | Phase 1 Doc Extraction (17 skills + dialogue entry → L1-L27) | 107 | 8 | MOVES | l_doc_todo_stub_count_check, phase1_all_l_docs_present_check |
| stage1 | |||||
| 1 | Spec-to-RTL | 30 | 0 | DARK | 沒有會擋的尺 NO-BLOCKING-RULER |
| 2 | 🔁 Lint (RTL + Quartus-unsafe patterns + RTL-bug claim schema) | 25 | 0 | DARK | 尺是瞎的 RULER-BLIND |
| 3 | 🔁 CDC / RDC check | 25 | 25 | MOVES | cdc_crossing_check |
| 4 | 🔁 Simulation (testbench-based + L10/L12 coverage + Verilator coverage) | 19 | 18 | MOVES | cpu_functional_oracle_waiver_check |
| 5 | 🔁 Formal verification (assertions proved + bit-level full-stack phase2/stage1/tb) | 8 | 5 | MOVES | formal_proof_evidence_check |
| 6 | FPGA early prototype + verification report audit | 0 | 0 | DARK | 分母為零 DENOMINATOR |
| stage2 | |||||
| 7 | Constraint setup (SDC + PVT matrix) | 7 | 7 | MOVES | pvt_matrix_check, sdc_syntax_check |
| 8 | 🔁 SDC validation | 12 | 0 | DARK | 尺是瞎的 RULER-BLIND |
| 9 | Synthesis (Yosys → mapped netlist) | 3 | 0 | DARK | 尺沒跑起來 RULER-NEVER-RAN |
| 10 | 🔁 Pre-layout STA (multi-corner) | 0 | 0 | DARK | 分母為零 DENOMINATOR |
| 11 | DFT insertion (scan chain + ATPG + at-speed + BSDL) | 3 | 3 | MOVES | bsdl_emit, dft_atpg_coverage_check |
| FS1 | ISO-26262 FMEDA diagnostic-coverage (fault-injection; safety designs only) | 0 | 0 | DARK | 分母為零 DENOMINATOR |
| DT1 | Transition-delay-fault (at-speed LOC) ATPG | 5 | 4 | MOVES | transition_coverage_check |
| 12 | Post-DFT optimization (resynth / buffering) | 3 | 3 | MOVES | dft_post_optimization_scan_survival_check |
| 13 | 🔁 Equivalence check (RTL ≡ post-DFT netlist) | 5 | 4 | MOVES | lec_equivalence_check |
| stage_analog | |||||
| A1 | Analog Spec Extraction | 3 | 3 | MOVES | analog_a1_spec_extract_check |
| A2 | Analog Topology Selection | 3 | 3 | MOVES | analog_a2_topology_select_check |
| A3 | Analog Netlist Generation | 3 | 3 | MOVES | analog_a3_netlist_gen_check, analog_netlist_pdk_check |
| A4 | Analog Corner Sweep (PVT) | 3 | 3 | MOVES | analog_a4_corner_sweep_check |
| A5 | Analog Layout | 2 | 2 | MOVES | analog_a5_layout_check |
| A6 | Analog Physical Verification (per-block DRC + LVS before merge) | 2 | 1 | MOVES | analog_a6_block_pv_check |
| A7 | 🔁 Post-Layout Resimulation | 2 | 2 | MOVES | analog_pre_vs_post_layout_check |
| A8 | Hardmacro Generation (LEF + Liberty + GDS + Verilog) | 1 | 1 | MOVES | analog_hardmacro_check |
| A9 | 🔁 Co-Simulation (+ HW correlation when bench data exists) | 1 | 1 | MOVES | analog_a9_hw_verify_check, analog_hw_spice_correlation_check |
| stage2 | |||||
| 14 | 🔁 Synthesis handoff gate (pre-PnR Yosys script + netlist audit; open-source-flow specific) | 15 | 0 | DARK | 尺是瞎的 RULER-BLIND |
| stage3 | |||||
| 15 | Floorplan + PDN | 0 | 0 | DARK | 分母為零 DENOMINATOR |
| 16 | Clock planning | 5 | 2 | MOVES | clock_plan_check |
| 17 | Placement (global + detailed) | 0 | 0 | DARK | 分母為零 DENOMINATOR |
| 18 | Spare-cell + ECO-prep insertion (Design-for-ECO) | 6 | 6 | MOVES | spare_cell_coverage_check |
| 19 | CTS (Clock Tree Synthesis) | 0 | 0 | DARK | 分母為零 DENOMINATOR |
| 20 | 🔁 Post-CTS hold fixing | 0 | 0 | DARK | 分母為零 DENOMINATOR |
| 21 | Routing (global + detailed) | 0 | 0 | DARK | 分母為零 DENOMINATOR |
| 22 | Parasitic Extraction (RC → SPEF) | 4 | 4 | MOVES | spef_extraction_check |
| stage2 | |||||
| DT2 | Path-delay-fault (at-speed, timing-graded) ATPG | 6 | 5 | MOVES | path_delay_coverage_check |
| DT3 | Small-delay-defect (SDD) at-speed grade | 5 | 4 | MOVES | sdd_coverage_check |
| stage3 | |||||
| 23 | 🔁 Post-route STA (multi-corner multi-mode sign-off) | 0 | 0 | DARK | 分母為零 DENOMINATOR |
| 24 | 🔁 IR Drop (static + dynamic) | 3 | 3 | MOVES | ir_drop_report_check |
| 25 | 🔁 EM check (electromigration lifetime) | 3 | 0 | DARK | 尺是瞎的 RULER-BLIND |
| 26 | 🔁 Antenna check (gate-oxide protection) | 3 | 3 | MOVES | antenna_report_check |
| 27 | 🔁 Signal Integrity (Crosstalk / Noise / Glitch + MCF crosstalk-delay) | 15 | 15 | MOVES | si_crosstalk_check |
| 28 | 🔁 PERC / Reliability sign-off (ESD + latch-up + cross-domain) | 9 | 9 | MOVES | perc_signoff_check |
| 29 | Post-Layout Gate-Level Simulation (Post-Sim + SDF) | 3 | 0 | DARK | 本來就是紅的 ALREADY-RED |
| 30 | Post-Layout SPICE Verification (critical-path correlation + analog) | 0 | 0 | DARK | 分母為零 DENOMINATOR |
| 31 | 🔁 Physical Verification (DRC + LVS + ERC + Density) | 7 | 3 | MOVES | drc_report_check, lvs_report_check |
| 32 | 🔁 Post-route timing repair pass (multi-corner repair_design + repair_timing + reroute) | 0 | 0 | DARK | 分母為零 DENOMINATOR |
| stage4 | |||||
| 33 | Power analysis (pre/post-layout) | 14 | 11 | MOVES | power_report_check |
| 34 | Metal Fill (ECO-aware density fill insertion) | 3 | 1 | MOVES | metal_fill_density_check |
| 35 | DFM screen (CMP density + redundant-via ratio + foundry-side OPC/RET disclosure) | 9 | 0 | DARK | 沒有會擋的尺 NO-BLOCKING-RULER |
| 36 | Tapeout checklist (final sign-off confirmation) | 15 | 0 | DARK | 尺是瞎的 RULER-BLIND |
| 37 | GDSII output (only if Step 31 PV fully clean) | 10 | 10 | MOVES | gds_port_label_check, gds_substance_check |
| 38 | Foundry Handoff (mask spec + WAT plan + scribe layout + corner test kit) | 4 | 0 | DARK | 本來就是紅的 ALREADY-RED |
| 39 | FPGA final sign-off (recompile + on-board test) | 0 | 0 | DARK | 分母為零 DENOMINATOR |
| stage_mixed_signal | |||||
| M1 | Mixed-Signal Top-Level Integration (A+D GDS merge + macro placement) | 0 | 0 | DARK | 分母為零 DENOMINATOR |
| M2 | Mixed-Signal Power Domain + Level Shifter / Isolation Verification | 0 | 0 | DARK | 分母為零 DENOMINATOR |
| M3 | Mixed-Signal Verification (AMS co-sim + RNM + interface signal integrity) | 0 | 0 | DARK | 分母為零 DENOMINATOR |
| M4 | Mixed-Signal Sign-Off (top-level PV + final verdict) | 0 | 0 | DARK | 分母為零 DENOMINATOR |
| stage5_manufacturing | |||||
| 40 | Fabrication (foundry mask-set + wafer fab — external) | 0 | 0 | DARK | 分母為零 DENOMINATOR |
| 41 | Wafer Sort / Probe Test (ATE + probe card) | 0 | 0 | DARK | 分母為零 DENOMINATOR |
| 42 | Packaging (assembly: wirebond / FC-CSP / WLCSP) | 0 | 0 | DARK | 分母為零 DENOMINATOR |
| 43 | Final Test (ATE: functional + parametric + burn-in) | 0 | 0 | DARK | 分母為零 DENOMINATOR |
| 44 | Reliability qualification (HTOL / FIT attestation) | 0 | 0 | DARK | 分母為零 DENOMINATOR |
| stage1 | |||||
| P0 | Structural-RTL pre-flight (chip-AGNOSTIC structural gates) | 0 | 0 | DARK | 分母為零 DENOMINATOR |
把這三個算成「每一格的原因」就是在編造一個這支程式做不到的歸因。它們是具名的、可查證的發現,每一條都附上重新量過的普查數字。
tech LEF(*.tlef)在 0 / 107 個已發佈 run 裡出現。整個 corpus 只有 5 個 .lef、0 個 .tlef。沒有 PDK 自己的表,就沒有 Jmax、沒有密度窗、沒有製造格點 —— 「這個數字有沒有超出這個 PDK 允許的範圍」這個問句連問都問不出來。
實跑 programs/em_current_density_check.py:rc=3、verdict=SKIPPED、skip_reason=jmax_reference_absent,訊息是「no Jmax reference (no --jmax or --tech-lef supplied); §4.05: cannot fabricate PASS and will not use the decap-count proxy」。它誠實地拒絕,不是假裝通過 —— 這一點比原始 brief 描述的更好,也是這個 repo 的房規(零分母必須 refuse,不能 pass)。
最尖銳的一個是反向的:被檢查的那個數,本身就是用檢查它所用的比例算出來的。拿 coverage 去驗 faults_covered,等於讓它重算一次自己的輸入 —— 這個等式永遠成立,它不可能發現任何事情。
programs/fault_atpg_run.py:1052 — faults_covered = int(round(faults_total * coverage_ratio / 100.0))
本頁只發佈這一條經過逐行查證的實例。委託本頁的 brief 宣稱「7 條裡 7 條」都是單一產出者,本次沒有重新推導那 7 條,因此不引用那個數字。
floorplan 的預算欄位 die_area_budget_um,在 195 份已發佈的 L19 文件裡:136 份是 null、54 份根本沒有這個欄位、只有 5 份真的有值(其中 3 份還是散文,像「user macro ~2900 x 3500 um」這種字串,機器無法拿來比較)。一個幾乎不存在的預算,沒辦法當成任何東西的上界。
repo 自己的註解 programs/floorplan_contract.py:56 記的是「194 of 194 tracked L19 documents carry die_area_budget_um: null」。今天重量已經不是 194/194:195 份裡有 5 份有值。那條註解已經過期 —— 本頁發佈的是今天量到的。
flow YAML 點名 56 個 skill,其中 31 個在磁碟上不存在(adi-spec-gen, assertion-gen, atpg, behavioral-sequences-gen, calibration-gen, cdc-check …)。同時 programs/ 底下有 1075 支程式(含底線開頭的共 1133 支 .py),而 flow YAML 只點到 216 支。
「這一步該由誰用專家判斷收尾」在流程裡有名字,在磁碟上沒有身體。
32 格暗的裡面,有 7 格的產出是 PUBLISHING.md 明文「Excluded by construction」的版圖幾何。除非發佈政策改變,這幾格在已發佈的 corpus 上永遠量不到,不是靠寫程式能補的。
| step | 今天為什麼暗 | 它需要的產出 |
|---|---|---|
15 | 分母為零 | phase3/stage3/pnr/floorplan.def |
17 | 分母為零 | phase3/stage3/pnr/placed.def |
19 | 分母為零 | phase3/stage3/pnr/post_cts.def |
20 | 分母為零 | phase3/stage3/pnr/post_hold.def |
21 | 分母為零 | phase3/stage3/pnr/routed.def |
38 | 本來就是紅的 | phase3/stage4/foundry_handoff/scribe_line_layout.gds OR phase3/stage4/fo |
M1 | 分母為零 | phase3/mixed_signal/top_merged.gds |
在今天這份已發佈的 corpus 上,D9 最多能到 56 / 63 格。再往上需要的不是程式,是改發佈政策(讓 .def/.gds 進 repo)或真的流片(步驟 40–44 是 fab intake、wafer sort、packaging、final test、HTOL —— 沒有任何程式能生出那些產出)。
上面每一格都是實跑出來的。這一節不是。這是提案,工期是估的,目標格數是估的。把它跟上面的量測混在一起加總,就是這整個頁面存在要防止的那件事。
| phase | 做什麼 | 為什麼 / 實測註記 |
|---|---|---|
| Phase 0 | 把 PDK 自己的 Jmax、密度窗、製造格點寫進 run,成為帶 sha256 的 pdk_constants.json | 解開「物理上界」那一整類:今天 tech LEF 在 0/107 個 run 裡,所以這一類是 0% 可執行。⚠ 實測修正:brief 說它的 728 行 consumer「已經寫好了」—— 本次在樹裡找不到。pdk_constants 只在 analog_a2_topology_emit.py(932 行)出現一次,而且只是一個 JSON key pdk_constants_source。Phase 0 要寫的是產出端和消費端兩邊。 |
| Phase 1 | 修掉 5 格「尺是瞎的」 | 這是最急的一類,因為它今天是綠的 —— 一個把產出刪光還是照樣綠的 gate,比沒有 gate 更危險,它會讓讀者以為那一格有人在看。 |
| Phase 2 | 給 2 格補上會擋的條款 | 整條 gate 只有 files_exist:檔案在就過,內容不看。 |
| Phase 3 | 處理 2 格「本來就紅」+ 1 格「尺沒跑起來」 | 先讓它們在已發佈的 run 上跑得起來、紅得有理由,才談得上證明它們讀的是這個步驟的產出。 |
| Phase 4 | 把 15 格分母為零、但不是被發佈政策擋住的格子填出分母 | 這需要發佈帶著那些產出的 run,不是改程式。 |
| Phase 5 | 7 格政策擋住的 + 需要真矽的 | 要嘛改 PUBLISHING.md,要嘛流片。不是工程排期問題。 |
委託本頁的 brief 給的是 ~14 engineer-weeks、目標 47 / 63、天花板 53。本次沒有重新推導工期,所以照引並標明它是估的。天花板有重新推導,得到的是 56(63 減去 7 格被發佈政策寫死的),不是 53。兩個數字的差別在於「哪些格子算永久擋住」,本頁採用的是可查證的那一個:PUBLISHING.md 的明文排除清單。
brief 是照昨天的樹寫的。凡是量出來不一樣的,本頁發佈量到的那個,並在這裡說明。
| 項目 | brief 說 | 本頁量到 | 為什麼不一樣 |
|---|---|---|---|
| 今天會動的格數 | 25 / 63 會動、38 格暗 | 31 / 63 會動、32 格暗 | brief 的 25 用的是什麼判準未載明。本頁的判準是 two-arm artefact mutation,並且把判準本身寫在程式的 docstring 裡。 |
| 分母為零的步驟數 | 20 | 22 | run 目錄會互相巢狀(例如 caravel_user_project/ 與其底下的 v1.9.43_sky130A/),檔案要用最長前綴歸屬,否則子 run 的檔案會被算到母 run 頭上。 |
| programs 支數 | 1128 支,flow 點到 208 支 | 1075 支(非底線開頭)/1133 支全部 .py,flow 點到 216 支 | 「1128」比較接近全部 .py 的 1133;本頁把兩種定義都印出來。 |
| PDK 天花板 | 53 | 56 | 由 PUBLISHING.md 排除清單推導:7 格的產出是 .def/.gds。 |
| Phase 0 的 consumer | 728 行,已經寫好了 | 找不到 | pdk_constants 全樹只出現在 analog_a2_topology_emit.py(932 行)的一個 JSON key。 |
| EM 檢查的行為 | 回報「0 of 1667 segment(s) screened」 | rc=3 / SKIPPED / jmax_reference_absent | 「N of M segment(s) screened」這句話在 em_peak_current_authority_check.py,不是 em_current_density_check.py;後者是誠實拒絕,不是回報 0。 |
| 378 個謂詞的分類 | 378 個具體謂詞,330 個 program-decidable | 本頁不發佈這組數字 | SELF-CONSISTENT / CROSS-ARTEFACT / SPEC-BOUND / PHYSICALLY-BOUNDED / EXPERT-JUDGMENT 這套分類在樹裡不存在,本次無法重新推導。照抄一個沒量過的數字,就是這個頁面存在要移除的那個缺陷。 |
怎麼重跑這一節。這一整塊是生成的,不是手打的:
python3 tools/d9_flow_gate_reality.py --out benchmark-data/evaluation/d9_flow_gate_realitypython3 tools/gen_flow_gate_d9_section.py --reality benchmark-data/evaluation/d9_flow_gate_reality/d9_reality.json --page flow-gate.html --check
掃描本身跑了 372 個 (step,run) two-arm cell,每一個都在隔離副本上做,收尾驗證 git status 對 benchmark-data/ 是乾淨的:corpus_clean_after_sweep=true。--check 在數字漂移時 exit 1。
維度 1–7 問的是「這個 gate 本身怎麼樣」;第 8 維問的是捕手 —— 宣告的產出漏掉時,哪個機制該發現而沒發現。WAIVED 那一欄才是要盯的。
| # | 維度 | 問的問題 | 分佈 | E / ! / W / n | E 是對誰量的 own/subst/undecl |
|---|---|---|---|---|---|
| 1 | 接線 Wiring | gate 有沒有被三個管道之一呼叫到 | 63 · 0 · 0 · 0 | 0 / 0 / 63 | |
| 2 | 跑得動 Runnable | 實跑拿真 rc;且它有沒有可能失敗 | 60 · 0 · 2 · 1 | 0 / 0 / 60 | |
| 3 | 產出 Outputs | required_outputs 真的存在且非空 | 34 · 19 · 3 · 7 | 0 / 0 / 34 | |
| 4 | 判準 Criteria | 量的東西是否對得上它宣稱要量的 | 62 · 1 · 0 · 0 | 0 / 0 / 62 | |
| 5 | 依賴 Deps | blocks_on 宣告對不對 | 61 · 0 · 1 · 1 | 0 / 0 / 61 | |
| 6 | Skip Skip | SKIPPED-CONDITION 有沒有被濫用 | 62 · 0 · 1 · 0 | 0 / 0 / 62 | |
| 7 | 清單 List | required_outputs 清單本身完不完整 | 52 · 6 · 4 · 1 | 0 / 0 / 52 | |
| 8 | 抓漏 Catcher | output 沒出來時,哪個機制該抓沒抓到 | 61 · 0 · 0 · 2 | 16 / 45 / 0 |
依 stage 分組。滑過任一格看它現在的意思;WAIVED 的格子在下一節列出理由與證據。
2026-07-30 於 v1.8.40 逐格重驗;2026-07-31 於 v1.8.87 重算(v1.8.44 → v1.8.87 未改動任何一格):把這 504 格和原始碼裡 state_census() 算出來的狀態一格一格比對,0 個不一致;63 個步驟 id 順序完全相同、63 個步驟名稱全部對得上;483 / 9 / 12 與八個維度的分佈也都未變。也就是說從 v1.7.96 到 v1.8.87,這個矩陣的判定一格都沒有動 —— 變的只有套件規模(912 passed → 912 passed)。
2026-08-06 於 v1.9.86 逐格重算:4 格不一致。1/d2、12/d2、35/d2 由 ENFORCED 轉 WAIVED(它們唯一的紅是對空目錄掙來的,那不是「這個 gate 會失敗」的證據);A8/d3 由 WAIVED 轉 ENFORCED(waiver 的前提失效,已移除)。63 個步驟 id 與名稱全部相同;總數 483 / 9 / 12 → 481 / 11 / 12。
以上兩段都是歷史,不是現況。它們引的 483 / 9 / 12、481 / 11 / 12 都只有「設定成什麼」這一個軸。vibe-ic#888 之後多了第二個軸——那一格的謂詞現在跑起來是什麼顏色——而把兩個軸接起來以後,「481 enforced」裡有一部分是紅的。當前狀態以上方四個現算的計分方塊與下方矩陣為準,它們由 gen_flow_gate_matrix.py 現算,--check 會在漂移時 exit 1。
| Step | Name | 1·Wiring | 2·Runnable | 3·Outputs | 4·Criteria | 5·Deps | 6·Skip | 7·List | 8·Catcher |
|---|---|---|---|---|---|---|---|---|---|
| Phase 1 | |||||||||
| D1 | Phase 1 Doc Extraction (17 skills + dialogue entry → L1-L27) | E | E | E | E | E | E | ! | E |
| Stage 1 · RTL | |||||||||
| 1 | Spec-to-RTL | E | W | E | ! | E | E | E | E |
| 2 | 🔁 Lint (RTL + Quartus-unsafe patterns + RTL-bug claim schema) | E | E | E | E | E | E | E | E |
| 3 | 🔁 CDC / RDC check | E | E | E | E | E | E | E | E |
| 4 | 🔁 Simulation (testbench-based + L10/L12 coverage + Verilator coverage) | E | E | E | E | E | E | E | E |
| 5 | 🔁 Formal verification (assertions proved + bit-level full-stack phase2/stage1/tb) | E | E | E | E | E | E | E | E |
| 6 | FPGA early prototype + verification report audit | E | E | W | E | E | E | E | E |
| Stage 2 · Synth/DFT | |||||||||
| 7 | Constraint setup (SDC + PVT matrix) | E | E | E | E | E | E | W | E |
| 8 | 🔁 SDC validation | E | E | E | E | E | E | E | E |
| 9 | Synthesis (Yosys → mapped netlist) | E | E | E | E | E | E | E | E |
| 10 | 🔁 Pre-layout STA (multi-corner) | E | E | ! | E | E | E | E | E |
| 11 | DFT insertion (scan chain + ATPG + at-speed + BSDL) | E | E | ! | E | E | E | ! | E |
| FS1 | ISO-26262 FMEDA diagnostic-coverage (fault-injection; safety designs only) | E | E | n | E | E | E | W | n |
| DT1 | Transition-delay-fault (at-speed LOC) ATPG | E | E | E | E | E | E | E | E |
| 12 | Post-DFT optimization (resynth / buffering) | E | E | ! | E | W | E | E | E |
| 13 | 🔁 Equivalence check (RTL ≡ post-DFT netlist) | E | E | E | E | E | E | E | E |
| Analog | |||||||||
| A1 | Analog Spec Extraction | E | E | E | E | E | E | E | E |
| A2 | Analog Topology Selection | E | E | E | E | E | E | E | E |
| A3 | Analog Netlist Generation | E | E | E | E | E | E | E | E |
| A4 | Analog Corner Sweep (PVT) | E | E | E | E | E | E | E | E |
| A5 | Analog Layout | E | E | E | E | E | E | E | E |
| A6 | Analog Physical Verification (per-block DRC + LVS before merge) | E | E | E | E | E | E | E | E |
| A7 | 🔁 Post-Layout Resimulation | E | E | E | E | E | E | E | E |
| A8 | Hardmacro Generation (LEF + Liberty + GDS + Verilog) | E | E | E | E | E | E | E | E |
| A9 | 🔁 Co-Simulation (+ HW correlation when bench data exists) | E | E | E | E | E | E | E | E |
| Stage 2 · Synth/DFT | |||||||||
| 14 | 🔁 Synthesis handoff gate (pre-PnR Yosys script + netlist audit; open-source-flow specific) | E | E | E | E | E | E | E | E |
| Stage 3 · PD | |||||||||
| 15 | Floorplan + PDN | E | E | ! | E | E | E | E | E |
| 16 | Clock planning | E | E | E | E | E | E | E | E |
| 17 | Placement (global + detailed) | E | E | ! | E | E | E | E | E |
| 18 | Spare-cell + ECO-prep insertion (Design-for-ECO) | E | E | E | E | E | E | E | E |
| 19 | CTS (Clock Tree Synthesis) | E | E | ! | E | E | E | E | E |
| 20 | 🔁 Post-CTS hold fixing | E | E | ! | E | E | E | E | E |
| 21 | Routing (global + detailed) | E | E | ! | E | E | E | E | E |
| 22 | Parasitic Extraction (RC → SPEF) | E | E | ! | E | E | E | E | E |
| Stage 2 · Synth/DFT | |||||||||
| DT2 | Path-delay-fault (at-speed, timing-graded) ATPG | E | E | E | E | E | W | E | E |
| DT3 | Small-delay-defect (SDD) at-speed grade | E | E | E | E | E | E | E | E |
| Stage 3 · PD | |||||||||
| 23 | 🔁 Post-route STA (multi-corner multi-mode sign-off) | E | E | ! | E | E | E | W | E |
| 24 | 🔁 IR Drop (static + dynamic) | E | E | ! | E | E | E | ! | E |
| 25 | 🔁 EM check (electromigration lifetime) | E | E | ! | E | E | E | E | E |
| 26 | 🔁 Antenna check (gate-oxide protection) | E | E | ! | E | E | E | E | E |
| 27 | 🔁 Signal Integrity (Crosstalk / Noise / Glitch + MCF crosstalk-delay) | E | E | E | E | E | E | ! | E |
| 28 | 🔁 PERC / Reliability sign-off (ESD + latch-up + cross-domain) | E | E | E | E | E | E | E | E |
| 29 | Post-Layout Gate-Level Simulation (Post-Sim + SDF) | E | E | ! | E | E | E | E | E |
| 30 | Post-Layout SPICE Verification (critical-path correlation + analog) | E | E | ! | E | E | E | E | E |
| 31 | 🔁 Physical Verification (DRC + LVS + ERC + Density) | E | E | E | E | E | E | E | E |
| 32 | 🔁 Post-route timing repair pass (multi-corner repair_design + repair_timing + reroute) | E | E | ! | E | E | E | E | E |
| Stage 4 · Sign-off | |||||||||
| 33 | Power analysis (pre/post-layout) | E | E | E | E | E | E | E | E |
| 34 | Metal Fill (ECO-aware density fill insertion) | E | E | E | E | E | E | ! | E |
| 35 | DFM screen (CMP density + redundant-via ratio + foundry-side OPC/RET disclosure) | E | W | E | E | E | E | E | E |
| 36 | Tapeout checklist (final sign-off confirmation) | E | E | E | E | E | E | E | E |
| 37 | GDSII output (only if Step 31 PV fully clean) | E | E | E | E | E | E | E | E |
| 38 | Foundry Handoff (mask spec + WAT plan + scribe layout + corner test kit) | E | E | E | E | E | E | E | E |
| 39 | FPGA final sign-off (recompile + on-board test) | E | E | W | E | E | E | E | E |
| Mixed-signal | |||||||||
| M1 | Mixed-Signal Top-Level Integration (A+D GDS merge + macro placement) | E | E | W | E | E | E | W | E |
| M2 | Mixed-Signal Power Domain + Level Shifter / Isolation Verification | E | E | ! | E | E | E | ! | E |
| M3 | Mixed-Signal Verification (AMS co-sim + RNM + interface signal integrity) | E | E | ! | E | E | E | E | E |
| M4 | Mixed-Signal Sign-Off (top-level PV + final verdict) | E | E | ! | E | E | E | E | E |
| Stage 5 · Mfg | |||||||||
| 40 | Fabrication (foundry mask-set + wafer fab — external) | E | E | n | E | E | E | E | E |
| 41 | Wafer Sort / Probe Test (ATE + probe card) | E | E | n | E | E | E | E | E |
| 42 | Packaging (assembly: wirebond / FC-CSP / WLCSP) | E | E | n | E | E | E | E | E |
| 43 | Final Test (ATE: functional + parametric + burn-in) | E | E | n | E | E | E | E | E |
| 44 | Reliability qualification (HTOL / FIT attestation) | E | E | n | E | E | E | E | E |
| Stage 1 · RTL | |||||||||
| P0 | Structural-RTL pre-flight (chip-AGNOSTIC structural gates) | E | n | n | E | n | E | n | n |
每一個都是承認「這一格今天還測不到」,帶具體理由與可查證的證據,而且是 xfail(strict=True) —— 修好的那天套件會變紅,逼人把 waiver 拿掉。一個沒有到期壓力的例外,最後都會變成永久的沉默。
這一節由 matrix_63x8/waivers.py 現算:哪一格被 waive、掛在哪一個維度,以登記簿為準。
PERMANENT, by design — not a pending flow-definition decision. Step 1's gate is ONE clause, `files_exist(any_of): ['phase2/stage1/rtl/*.sv', 'phase2/stage1/rtl/*.v']`, and a files_exist clause has no predicate but path resolution — the cons… (完整理由見 programs/tests/matrix_63x8/waivers.py)
flow/phase1_phase2_phase3.yaml, the AUDIT NOTE comment directly above step id 1 ('this gate is files_exist-only ON PURPOSE ... Do not re-flag as a missing checker'). programs/flow_compliance_check.py:2439-2441 (`passed = len(found) > 0` on…
PERMANENT, by design — not a pending flow-definition decision. Step 35's gate carries `files_exist: ['reports/phase3/dfm_screen.json']` plus `dfm_screen_check` wired as `advisory_program_exit_zero`, so the only BLOCKING term is path resolut… (完整理由見 programs/tests/matrix_63x8/waivers.py)
flow/phase1_phase2_phase3.yaml, the comment on step id 35's ADVISORY half (#306) naming Step 31/34's ownership and the absent OpenROAD repair pass. programs/flow_compliance_check.py:2439-2441 (`passed = len(missing) == 0`) is the blocking t…
The entry phase2/stage1/fpga/final/*.sof is the recompiled Intel Quartus bitstream for on-board sign-off; the same missing producer as step 6 applies, so nothing in this repository can write it, while the sibling on_board_pass.json is produ… (完整理由見 programs/tests/matrix_63x8/waivers.py)
`git ls-tree -r --name-only HEAD` matches ZERO paths against phase2/stage1/fpga/final/*.sof anywhere in the repository or under any admissible in-repo run root; the sibling entry reports/phase2/fpga/on_board_pass.json resolves at 732 B in b…
Two of the three entries are Intel Quartus outputs — a .sof bitstream and a .map.rpt — and no program in this repository synthesises an FPGA bitstream, so nothing here can produce them and no archived run tree carries one either. The dimens… (完整理由見 programs/tests/matrix_63x8/waivers.py)
`git ls-tree -r --name-only HEAD` matches ZERO paths against either entry — 0 tracked '*.sof' and 0 tracked '*.map.rpt' in the whole repository, and 0 under any of the 7 admissible in-repo run roots. The sibling entry reports/phase2/fpga/qu…
NARROWED 2026-07-28. The producer is NOT missing: mixed_signal_top_lvs_run.py writes phase3/mixed_signal/top_merged.gds (KLayout merge), ships, and is invoked twice — M1's own advisory gate clause and programs/vibe_ic_one_shot_runner.py:928… (完整理由見 programs/tests/matrix_63x8/waivers.py)
programs/mixed_signal_top_lvs_run.py:683 targets top_merged.gds; :707-708 returns SKIP rc=2 naming the absent inputs. Asked DIRECTLY (mixed_signal_top_lvs_run.run, tool probe stubbed) on all 12 admissible run roots, 2026-07-28: 12/12 return…
dft_post_optimization_scan_survival_check (step 12's new content clause, landed 2026-08-08 to close a dimension-2 gap) reads phase2/stage2/synth/netlist.v to detect the 'pre-DFT netlist copied over' substitution. That path's TRUE producer,… (完整理由見 programs/tests/matrix_63x8/waivers.py)
flow/phase1_phase2_phase3.yaml: step 9's required_outputs declares phase2/stage2/synth/netlist.v (the true producer); step 14's required_outputs ALSO declares the identical path (the duplicate) while step 14's OWN required_inputs already co…
RE-OPENED 2026-07-28 at the convergence merge, with a sharper reason than it carried before. DT2's step-level condition is ALL-of over three paths, two of which (phase2/stage2/dft/cut_netlist.v and phase3/stage3/pnr/*_pnr.v) are artefacts w… (完整理由見 programs/tests/matrix_63x8/waivers.py)
flow/flow_condition_reachability_baseline.json (owner: vibe-ic#235). Reproduce the hole: `python3 programs/flow_condition_reachability_check.py .` -> 'KNOWN-OPEN: 1 self-disabling condition(s)' naming step DT2. Reproduce the withdrawn repai…
Fourteen artefacts remain undeclared after reports/phase3/sta/sta_corner_record_completeness.json was declared on 2026-07-28 (that one is the step's own unconditional gate --json target, so it closed with no verdict change on any published… (完整理由見 programs/tests/matrix_63x8/waivers.py)
producers programs/phase3_one_shot_runner.py:30169 and :30286 (sta_out / 'sta_spef_based.rpt', sta_out / 'sta_mcorner_ocv.rpt') with mirrors at :30175 and :30316, and the two stance emissions — 'multi_corner_spef_stance.json' guarded at :30…
reports/phase3/single_corner_stance.json is emitted ONLY on the single-corner branch — phase3_one_shot_runner writes it under `if len(corners) < 2 and not pvt.get('multi_corner')` — and a multi-corner run legitimately produces none, so an u… (完整理由見 programs/tests/matrix_63x8/waivers.py)
producer programs/phase3_one_shot_runner.py:29941-29964 (the `len(corners) < 2` guard around the `rpt_phase3 / 'single_corner_stance.json'` write; line number re-verified 2026-08-08 after v1.9.99's CTS fix shifted earlier-file line counts —…
FS1 declares no required_outputs key at all while its gate writes two real JSON artefacts, so there is no list for the flow's presence checks to key off. REOPENED 2026-07-28 with the reason sharpened from 'adding one is a yaml change nobody… (完整理由見 programs/tests/matrix_63x8/waivers.py)
flow/phase1_phase2_phase3.yaml FS1 step has no required_outputs key while its gate runs 'fmeda_fault_injection_coverage ... --json reports/phase2/safety/fmeda_coverage.json' and 'fmeda_coverage_check ... --json reports/phase2/safety/fmeda_c…
reports/analog/mixed_signal/top_lvs.json is the artefact that substantiates M1's PASS — mixed_signal_top_lvs_run writes it and mixed_signal_merge_check's PASS branch is contingent on reading it — yet M1's required_outputs names only top_mer… (完整理由見 programs/tests/matrix_63x8/waivers.py)
producer programs/mixed_signal_top_lvs_run.py:917 ((rpt_dir / 'top_lvs.json').write_text(...), in the same block as the already-declared merge.json); consumer programs/mixed_signal_merge_check.py:88-90 then :107. MEASURED 2026-07-28 with te…
一份宣稱「全覆蓋」的儀表板如果不講自己的上限,它自己就變成一個說謊的檢查。
維度 4 抓得到「gate 讀錯檔」,抓不到「讀對檔、算錯量」。 兩個真實案例都是後者:一個 via 冗餘篩檢讀對了檔案卻讀錯區塊(差 2,240);一個收斂迴圈讀對了 STA 資料庫,卻只查 setup 一個軸,在 slew/cap/fanout 上結構性盲目。這一類仍然只有人看得出來。
維度 3 的 133 個 entry 裡,只有 6 個是這次真的現跑產出的。 2026-07-30 重新量於 v1.8.40:PRODUCED_LIVE 6、PRODUCED_BY_RUN 114、UNPROVEN 13。那 114 個是讀先前記錄的 run 產物,不是這次現跑 —— 也就是「讀存起來的量測」,正是這套東西要抓的病。它們標為已知限制,沒有假裝是現算;本機找得到 7 個合格 run 目錄。(這裡原本寫「19 個 entry 依賴這台機器以外的 run 目錄」,我重新量的時候無法重現那個數字,所以換成我實際量到的分佈。)
今天落地的兩個修復,都是「一個缺陷戴著別人的面具」。 v1.8.42 —— spare cell 的 tie-off 從來沒接上任何東西,而且會救它的那個合法化步驟跟會拋錯的那一步共用同一個 catch,所以永遠不會執行。後果是一顆 tie cell 落在格點外,一路連鎖到繞線失敗、寄生抽取無資料、簽核 STA 靜默退回無寄生模式,最後以「SS corner setup −8.81 ns」的形式被記錄下來 —— 一個擺置缺陷,在六步之後偽裝成時序違規。同一個 corner、有寄生參數的對照組是 +1.73/+1.77 ns。v1.8.43 —— ATPG 的 --reset 預設值是字面字串 rst 並且整場模擬把那個 port 壓低,所以任何 reset port 剛好叫這個名字的設計都被靜默凍結;同時 fault cut 丟掉非同步 set/reset 腳,讓驅動它們的 tie-cell 結構上不可觀測。診斷覆蓋率 91.59% → 97.35%,沒有多加任何一個測試向量。兩個都曾被當成「引擎的天花板」。
維度 8 的 45 格是用替身 gate 量的,16 格才是對該步驟自己的機制量的。 替身那些證明了產出的帳算得對,但沒證明那個 MISSING 降級在該步驟的正式流程裡真的到得了。全表 455 個 enforced 裡,只有這 16 格是對自己的機制量的;45 格是替身;其餘 394 格所屬的維度根本沒回答「你量的是誰」。這三個數字不可以相加。
還有 11 格真實的 repo 缺陷是被 waive 而不是被修掉的(分佈在 10 個步驟上:1、6、7、FS1、12、DT2、23、35、39、M1;M1 在兩個維度上各佔一格)。測試覆蓋的 commit 不該夾帶修復。每個都是 strict —— 修好的那天套件會變紅。而且被 waive 的格子仍然會跑:套件裡那 11 個 xfail 就是這 11 格,waiver 的理由是它的預期失敗訊息,所以「被 waive」不等於「沒被執行」。
而 26 格連 waive 都沒有 —— 它們被登記成 ENFORCED,現跑的謂詞卻是紅的。這不是這張表的限制,是這張表現在能講出來的東西:test_no_cell_is_counted_enforced_while_its_predicate_is_red 會因此變紅,而不是讓那 26 格繼續被算進覆蓋率。上面的矩陣用 ! 逐格標出它們。
Owner 問:63×8 的每一個 item 都要有 test case,而且那個 test 要真的會失敗。這一節是那次稽核的結果,以及它現在被什麼擋著。
真跑一顆 spm(converge_1.5.74_sky130A)測出來的。刪掉 step 3 自己資料夾裡的宣告產出 → step 3 沒有變 MISSING,前後一模一樣 PASS=4 FAIL=3 MISSING=0。因為資料夾裡那些是絕對 symlink,沒人讀;written.json 記的是正典路徑。
會動的是這些:刪正典檔(symlink 留著、別處放一份一模一樣的複本)→ MISSING,複本救不回來;截成 0 byte → MISSING;把 61 個 written.json 拿掉 → 退回全專案 glob,變 FAIL 而非 MISSING。所以承重的是紀錄,不是那棵 symlink 樹。
pre-flight 在這次真跑上一個都沒擋({READY: 8})—— 每個宣告輸入都真的在。它會擋的能力只由對照證明(刪 routed.def → drc/lvs 兩列 BLOCKED,指名「owed by step 21, read by step 31」)。自發性擋下從未被觀察到。
仍未綁:wildcard 不承重(step 1 宣告 rtl/*.sv,把記錄的 spm.v 改名仍算 PASS);analog 與 phase1 兩個 orchestrator 完全沒接;純類比走 waiver 分支根本到不了 gate;八個維度只有 D3 讀紀錄,其餘七個零引用。
programs/matrix_mutation_ledger.py。三道鎖,第三道是關鍵:LOCK 1 編輯配方必須在當前的樹上解析得開(對數見下方現算區塊);LOCK 2 重放 —— 在隔離副本上真的執行那個編輯,把那一格跑兩次,未 mutate 必須過、mutate 後必須紅;LOCK 3 算術要自洽,包含「mutate 前就已經紅的格子」,那些的紅不算它的功勞。
偽造是死路。假 entry ZZ-FORGED-D5-CLI-FLAG 過了 LOCK 1、LOCK 3,被 LOCK 2 重放抓到(STAYED_GREEN)。補一筆沒跑過的 mutation 不能滿足這個閘門。
模組的 docstring 寫著「481 格全部被至少一個 mutation 紅過」,而同一個模組、同一個 commit 印出來的是 d3: 53/63、d7: 58/63、d2: 59/63。兩者不可能同時為真。
驗證者一個 mutation 都沒跑就推翻了它 —— 只把兩個數字擺在一起看。已修正:逐維計數才是覆蓋率,空的 NOT_FALSIFIABLE 只代表沒有格子被「證明」不可證偽。
481 格 / 504 格帶著一條具名 mutation,而那條 mutation 是真的被執行過並且讓那一格變紅的。剩下的 23 格沒有 —— 「有一條會動的線」不代表「那條線量的是對的東西」,而沒有線就連那個都談不上。
逐維計數才是覆蓋率(每次跑都印):d1 63/63 · d4 63/63 · d5 62/63 · d6 62/63 · d8 61/63 · d2 59/63 · d7 58/63 · d3 53/63
LOCK 1 每次跑檢查 697 組 (entry, step):每一條編輯配方都必須在當前的樹上解析得開。LOCK 2 在隔離副本上真的執行那個編輯,把那一格跑兩次(未 mutate 必須過、mutate 後必須紅);replay 模式 witness,每次跑重放 16 組。
重現:python3 programs/matrix_mutation_ledger.py --census --resolve
以下為 2026-08-06 於 v1.9.86 的紀錄,未重算。每一條都附雙向對照:對修補前的檔案必須紅、修補後必須綠,外加一個必須仍然綠的反向案。
D3 查不到東西的查詢卻亮綠燈。 check_entry 在 resolve_anywhere 回 None 時 fall-through 成 produced=True,附一張 2026-07-27 的 fixture 保證書。七格標示 ENFORCED、無 waiver(17, 20, 29, 30, M2, M3, M4)因此不可證偽。實測 step 17 的 placed.def:find 0 個、git ls-tree 0 個。關於過去的保證書不是關於今天的證據。
斷掉的 symlink 被當成已產出的成品。 Path.glob 會回傳斷連結。真實 run root 上把 RTL 換成指向空氣的連結,step 1 讀出 PASS,證據就是那些斷連結;修補後 FAIL 並點名缺檔。爆炸半徑量過:180 個 flow sub-pattern × 123 個 run root = 22140 組比對,乾淨資料零差異。
D2 有三分之一的「紅」是同義反覆。 files_exist 對著空目錄必紅。129 個「證明」裡 32 個是這個形狀,而 step 1、6、12、28、30、35 沒有別的紅。真證明 96 → 100;公布數字掉 29,是因為那 33 條本來就不是證據,沒有任何東西被放寬。
D7 每一條 waiver 的 file:line 引註都是舊的,而 validate() 從不檢查。 它查 dim 範圍、step 存在、理由 ≥ 40 字、證據 ≥ 8 字 —— 就是不查引註解不解析得開。14 條指向不相干的程式碼,有的差 9450 行。
D4 的 files-only 分支不可能變紅。 required_outputs 跨 entry 是 ALL-of-N,只有單一 entry 內的 " OR " 才是 any-of;舊謂詞把它們壓成一個池子,所以任何檢查到一個產物的 step 都不會失敗。step 1 宣告三個 entry、gate 只讀一個。這一格現在是紅的,而那是誠實的答案。
A8/d3 的 waiver 前提變成假的 —— 而防腐機制抓到了。 waiver 白紙黑字寫著 git ls-tree match 零個路徑;一個發布 commit 帶進兩個 hardmacro GDS,於是 match 兩個。waiver 移除,格子取回它真實的狀態。那個 commit 是 gatekeeper 自己推的。
套件從 1 failed / 926 passed 變成 13 failed / 1027 passed(2026-08-06 於 v1.9.86 的紀錄;當前數字見表頭 suite 欄,它會印出自己的選取指令)。紅燈數字上升是矩陣開始講真話的代價 —— 13 個紅裡 12 個是 D3 那些宣告產物確實不存在的格子,加上 D4 的 step 1。