Flow Gate · header and cells both live

63 個步驟 × 8 個維度,現在的狀態

表頭數字與下方 504 格全部對當前原始碼現算:表頭由 gen_flow_gate_header.py、八個維度的分佈與每一格的狀態由 gen_flow_gate_matrix.py。兩支都有 --check,漂移時 exit 1。這張表隨 repo 變動;流程長一個步驟,覆蓋就自動變不完整。

plugin v1.10.11flow steps 63cells 504suite 36 failed, 861 passed, 11 xfailed in 216.47s (0:03:36) (PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 python3 -m pytest tests/test_matrix_63x8_coverage.py tests/test_matrix_63x8_ledger.py tests/test_matrix_63x8_census_freshness.py tests/test_matrix_d?_*.py -q)updated 2026-08-09 13:01 (plugin / steps / cells derived from source; nothing carried forward, not recomputed)
504
cells
63 步 × 8 維
455
enforced
謂詞現跑且是綠的。不是一種東西:16 格對該步驟自己的機制量、45 格對替身量、394 格所屬維度沒回答量的是誰
26
contradicted
設定成 ENFORCED,但現跑的謂詞是紅的。算成覆蓋,沒有覆蓋任何東西
11
waived
已知缺口 · strict xfail — 修好那天套件會變紅
12
n/a
斷言 NA 前提仍成立;前提消失就自動失效
Dimension 9 · 今天量到的,不是出貨的

第 9 個維度:輸出是不是對的31 / 63 格今天真的會動

D9 不是一個已經出貨的維度。flow/phase1_phase2_phase3.yaml 裡沒有任何一條 gate 在問「輸出對不對」;上面那 504 格問的是前八個問題。這一節是把第九個問題拿去量今天的樹得到的結果,不是一個新的維度宣告。每一格都是真的把該步驟的 blocking gate 跑起來(two-arm artefact mutation,372 個 (step,run) cell),不是靜態掃描。

全綠的時候,讀者可以相信什麼 · What a reader may believe when every cell is green

可以相信 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)。

63
d9 cells
63 步 × 第 9 個問題
31
moves today
刪掉該步驟自己宣告的產出後,blocking gate 的判定真的改變
32
dark
今天量不到。不是因為沒有 oracle —— 五個實測原因在下表
107
published runs
git ls-files benchmark-data 裡帶 phase1/generated_docs/ 的目錄

為什麼 32 格不是「沒有 oracle」 · 原因一:分母

每個步驟,107 個已發佈 run 裡有幾個完整帶著它宣告的產出集合?ANY_OF 與 glob 都照 flowref 的定義解析。

帶滿該步驟產出的 run 數步驟數這代表什麼
022這些格子連跑都跑不起來。沒有任何已發佈的 run 帶著它的產出。
1 – 1031中位數是 3 個 run。一格綠燈的背後常常只有兩三個 run。
≥ 1110其中只有 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 —— 這是今天這張表的天花板本身,不是可以靠寫程式補起來的洞。

32 格暗的,各自是哪一種

原因由 two-arm 的實際結果決定,不是推測。優先序:分母為零 → 沒有 blocking 尺 → 尺是瞎的(觀察到的行為,壓過所有解釋)→ PDK 沒讀到 → skill 不存在 → 本來就紅 → 尺沒跑起來。

22
分母為零 DENOMINATOR
這個步驟宣告的產出,在 107 個已發佈的 run 裡一個都沒有。沒有東西可量,任何尺都量不到。
5
尺是瞎的 RULER-BLIND
gate 跑了、綠了 —— 而且把它宣稱在judge的那個產出整個刪掉之後,它還是一樣綠。這一格量的不是這個步驟,是空氣。
2
本來就是紅的 ALREADY-RED
gate 在已發佈的 run 上本來就是 FINDING,刪掉產出前後都一樣紅。它可能有讀,但無法證明它讀的是這個步驟的產出。
2
沒有會擋的尺 NO-BLOCKING-RULER
整個 gate 沒有任何一條 blocking 條款會執行程式:只有 files_exist 之類的路徑解析。檔案在,就過。
1
尺沒跑起來 RULER-NEVER-RAN
在分母集合裡的每一個 run 上,gate 都是 NO-INPUT 或 ERROR —— 它從來沒有真的讀到東西。

63 個步驟,逐格 · 暗的就顯示成暗的

MOVES = 把該步驟宣告的產出從一份隔離的副本裡刪掉之後,某一條 blocking gate 的判定改變了(這是這個 repo 對「一格是真的」唯一承認的證據:matrix_mutation_ledger)。DARK = 沒有改變。den = 帶滿該步驟產出的 run 數;moved = 在幾個 run 上判定真的改變。

step名稱denmovedD9為什麼暗 / 誰讓它會動
stage_phase1
D1Phase 1 Doc Extraction (17 skills + dialogue entry → L1-L27)1078MOVESl_doc_todo_stub_count_check, phase1_all_l_docs_present_check
stage1
1Spec-to-RTL300DARK沒有會擋的尺 NO-BLOCKING-RULER
2🔁 Lint (RTL + Quartus-unsafe patterns + RTL-bug claim schema)250DARK尺是瞎的 RULER-BLIND
3🔁 CDC / RDC check2525MOVEScdc_crossing_check
4🔁 Simulation (testbench-based + L10/L12 coverage + Verilator coverage)1918MOVEScpu_functional_oracle_waiver_check
5🔁 Formal verification (assertions proved + bit-level full-stack phase2/stage1/tb)85MOVESformal_proof_evidence_check
6FPGA early prototype + verification report audit00DARK分母為零 DENOMINATOR
stage2
7Constraint setup (SDC + PVT matrix)77MOVESpvt_matrix_check, sdc_syntax_check
8🔁 SDC validation120DARK尺是瞎的 RULER-BLIND
9Synthesis (Yosys → mapped netlist)30DARK尺沒跑起來 RULER-NEVER-RAN
10🔁 Pre-layout STA (multi-corner)00DARK分母為零 DENOMINATOR
11DFT insertion (scan chain + ATPG + at-speed + BSDL)33MOVESbsdl_emit, dft_atpg_coverage_check
FS1ISO-26262 FMEDA diagnostic-coverage (fault-injection; safety designs only)00DARK分母為零 DENOMINATOR
DT1Transition-delay-fault (at-speed LOC) ATPG54MOVEStransition_coverage_check
12Post-DFT optimization (resynth / buffering)33MOVESdft_post_optimization_scan_survival_check
13🔁 Equivalence check (RTL ≡ post-DFT netlist)54MOVESlec_equivalence_check
stage_analog
A1Analog Spec Extraction33MOVESanalog_a1_spec_extract_check
A2Analog Topology Selection33MOVESanalog_a2_topology_select_check
A3Analog Netlist Generation33MOVESanalog_a3_netlist_gen_check, analog_netlist_pdk_check
A4Analog Corner Sweep (PVT)33MOVESanalog_a4_corner_sweep_check
A5Analog Layout22MOVESanalog_a5_layout_check
A6Analog Physical Verification (per-block DRC + LVS before merge)21MOVESanalog_a6_block_pv_check
A7🔁 Post-Layout Resimulation22MOVESanalog_pre_vs_post_layout_check
A8Hardmacro Generation (LEF + Liberty + GDS + Verilog)11MOVESanalog_hardmacro_check
A9🔁 Co-Simulation (+ HW correlation when bench data exists)11MOVESanalog_a9_hw_verify_check, analog_hw_spice_correlation_check
stage2
14🔁 Synthesis handoff gate (pre-PnR Yosys script + netlist audit; open-source-flow specific)150DARK尺是瞎的 RULER-BLIND
stage3
15Floorplan + PDN00DARK分母為零 DENOMINATOR
16Clock planning52MOVESclock_plan_check
17Placement (global + detailed)00DARK分母為零 DENOMINATOR
18Spare-cell + ECO-prep insertion (Design-for-ECO)66MOVESspare_cell_coverage_check
19CTS (Clock Tree Synthesis)00DARK分母為零 DENOMINATOR
20🔁 Post-CTS hold fixing00DARK分母為零 DENOMINATOR
21Routing (global + detailed)00DARK分母為零 DENOMINATOR
22Parasitic Extraction (RC → SPEF)44MOVESspef_extraction_check
stage2
DT2Path-delay-fault (at-speed, timing-graded) ATPG65MOVESpath_delay_coverage_check
DT3Small-delay-defect (SDD) at-speed grade54MOVESsdd_coverage_check
stage3
23🔁 Post-route STA (multi-corner multi-mode sign-off)00DARK分母為零 DENOMINATOR
24🔁 IR Drop (static + dynamic)33MOVESir_drop_report_check
25🔁 EM check (electromigration lifetime)30DARK尺是瞎的 RULER-BLIND
26🔁 Antenna check (gate-oxide protection)33MOVESantenna_report_check
27🔁 Signal Integrity (Crosstalk / Noise / Glitch + MCF crosstalk-delay)1515MOVESsi_crosstalk_check
28🔁 PERC / Reliability sign-off (ESD + latch-up + cross-domain)99MOVESperc_signoff_check
29Post-Layout Gate-Level Simulation (Post-Sim + SDF)30DARK本來就是紅的 ALREADY-RED
30Post-Layout SPICE Verification (critical-path correlation + analog)00DARK分母為零 DENOMINATOR
31🔁 Physical Verification (DRC + LVS + ERC + Density)73MOVESdrc_report_check, lvs_report_check
32🔁 Post-route timing repair pass (multi-corner repair_design + repair_timing + reroute)00DARK分母為零 DENOMINATOR
stage4
33Power analysis (pre/post-layout)1411MOVESpower_report_check
34Metal Fill (ECO-aware density fill insertion)31MOVESmetal_fill_density_check
35DFM screen (CMP density + redundant-via ratio + foundry-side OPC/RET disclosure)90DARK沒有會擋的尺 NO-BLOCKING-RULER
36Tapeout checklist (final sign-off confirmation)150DARK尺是瞎的 RULER-BLIND
37GDSII output (only if Step 31 PV fully clean)1010MOVESgds_port_label_check, gds_substance_check
38Foundry Handoff (mask spec + WAT plan + scribe layout + corner test kit)40DARK本來就是紅的 ALREADY-RED
39FPGA final sign-off (recompile + on-board test)00DARK分母為零 DENOMINATOR
stage_mixed_signal
M1Mixed-Signal Top-Level Integration (A+D GDS merge + macro placement)00DARK分母為零 DENOMINATOR
M2Mixed-Signal Power Domain + Level Shifter / Isolation Verification00DARK分母為零 DENOMINATOR
M3Mixed-Signal Verification (AMS co-sim + RNM + interface signal integrity)00DARK分母為零 DENOMINATOR
M4Mixed-Signal Sign-Off (top-level PV + final verdict)00DARK分母為零 DENOMINATOR
stage5_manufacturing
40Fabrication (foundry mask-set + wafer fab — external)00DARK分母為零 DENOMINATOR
41Wafer Sort / Probe Test (ATE + probe card)00DARK分母為零 DENOMINATOR
42Packaging (assembly: wirebond / FC-CSP / WLCSP)00DARK分母為零 DENOMINATOR
43Final Test (ATE: functional + parametric + burn-in)00DARK分母為零 DENOMINATOR
44Reliability qualification (HTOL / FIT attestation)00DARK分母為零 DENOMINATOR
stage1
P0Structural-RTL pre-flight (chip-AGNOSTIC structural gates)00DARK分母為零 DENOMINATOR

另外三個原因 —— 有證據,但沒有任何程式能逐格判定

把這三個算成「每一格的原因」就是在編造一個這支程式做不到的歸因。它們是具名的、可查證的發現,每一條都附上重新量過的普查數字。

原因四 · UNREAD PDK物理上界那一整類,今天 0% 可執行

tech LEF(*.tlef)在 0 / 107 個已發佈 run 裡出現。整個 corpus 只有 5 個 .lef、0 個 .tlef。沒有 PDK 自己的表,就沒有 Jmax、沒有密度窗、沒有製造格點 —— 「這個數字有沒有超出這個 PDK 允許的範圍」這個問句連問都問不出來

實跑 programs/em_current_density_check.py:rc=3verdict=SKIPPEDskip_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)。

原因二 · SINGLE-EMITTER「總數 == 各部分相加」,兩個運算元由同一支程式在同一輪寫出

最尖銳的一個是反向的:被檢查的那個數,本身就是用檢查它所用的比例算出來的。拿 coverage 去驗 faults_covered,等於讓它重算一次自己的輸入 —— 這個等式永遠成立,它不可能發現任何事情。

programs/fault_atpg_run.py:1052faults_covered = int(round(faults_total * coverage_ratio / 100.0))

本頁只發佈這一條經過逐行查證的實例。委託本頁的 brief 宣稱「7 條裡 7 條」都是單一產出者,本次沒有重新推導那 7 條,因此不引用那個數字。

原因三 · CONSUMED-THEN-CHECKED被拿來當標準的 spec,本身就是從被檢查的東西推導出來的

floorplan 的預算欄位 die_area_budget_um,在 195 份已發佈的 L19 文件裡:136 份是 null54 份根本沒有這個欄位、只有 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 份有值。那條註解已經過期 —— 本頁發佈的是今天量到的

原因五 · MISSING EXPERT ASSETS流程點名的 skill,一半不存在

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

推導:63 − 7 = 56

今天這份已發佈的 corpus 上,D9 最多能到 56 / 63 格。再往上需要的不是程式,是改發佈政策(讓 .def/.gds 進 repo)或真的流片(步驟 40–44 是 fab intake、wafer sort、packaging、final test、HTOL —— 沒有任何程式能生出那些產出)。

PLANNED 改善計畫 —— 以下沒有一個數字是量到的

上面每一格都是實跑出來的。這一節不是。這是提案,工期是估的,目標格數是估的。把它跟上面的量測混在一起加總,就是這整個頁面存在要防止的那件事。

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 57 格政策擋住的 + 需要真矽的要嘛改 PUBLISHING.md,要嘛流片。不是工程排期問題。

工期與目標:估計值,不是量測值

委託本頁的 brief 給的是 ~14 engineer-weeks、目標 47 / 63、天花板 53。本次沒有重新推導工期,所以照引並標明它是估的。天花板重新推導,得到的是 56(63 減去 7 格被發佈政策寫死的),不是 53。兩個數字的差別在於「哪些格子算永久擋住」,本頁採用的是可查證的那一個:PUBLISHING.md 的明文排除清單。

本頁與委託 brief 不一致的地方 —— 一律以量到的為準

brief 是照昨天的樹寫的。凡是量出來不一樣的,本頁發佈量到的那個,並在這裡說明。

項目brief 說本頁量到為什麼不一樣
今天會動的格數25 / 63 會動、38 格暗31 / 63 會動、32 格暗brief 的 25 用的是什麼判準未載明。本頁的判準是 two-arm artefact mutation,並且把判準本身寫在程式的 docstring 裡。
分母為零的步驟數2022run 目錄會互相巢狀(例如 caravel_user_project/ 與其底下的 v1.9.43_sky130A/),檔案要用最長前綴歸屬,否則子 run 的檔案會被算到母 run 頭上。
programs 支數1128 支,flow 點到 208 支1075 支(非底線開頭)/1133 支全部 .py,flow 點到 216「1128」比較接近全部 .py 的 1133;本頁把兩種定義都印出來。
PDK 天花板5356PUBLISHING.md 排除清單推導:7 格的產出是 .def/.gds。
Phase 0 的 consumer728 行,已經寫好了找不到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_reality
python3 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 statusbenchmark-data/乾淨的corpus_clean_after_sweep=true--check 在數字漂移時 exit 1。

維度 8 × 63 格

維度 1–7 問的是「這個 gate 本身怎麼樣」;第 8 維問的是捕手 —— 宣告的產出漏掉時,哪個機制該發現而沒發現。WAIVED 那一欄才是要盯的。

#維度問的問題分佈E / ! / W / nE 是對誰量的
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
E ENFORCED! ENFORCED-CONTRADICTEDW WAIVEDn NA

矩陣 63 × 8

依 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 passed912 passed)。

2026-08-06 於 v1.9.86 逐格重算:4 格不一致。1/d212/d235/d2 由 ENFORCED 轉 WAIVED(它們唯一的紅是對空目錄掙來的,那不是「這個 gate 會失敗」的證據);A8/d3 由 WAIVED 轉 ENFORCED(waiver 的前提失效,已移除)。63 個步驟 id 與名稱全部相同;總數 483 / 9 / 12481 / 11 / 12

以上兩段都是歷史,不是現況。它們引的 483 / 9 / 12481 / 11 / 12 都只有「設定成什麼」這一個軸。vibe-ic#888 之後多了第二個軸——那一格的謂詞現在跑起來是什麼顏色——而把兩個軸接起來以後,「481 enforced」裡有一部分是紅的。當前狀態以上方四個現算的計分方塊與下方矩陣為準,它們由 gen_flow_gate_matrix.py 現算,--check 會在漂移時 exit 1。

StepName 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

已知缺口 11 個 WAIVED 格

每一個都是承認「這一格今天還測不到」,帶具體理由與可查證的證據,而且是 xfail(strict=True) —— 修好的那天套件會變紅,逼人把 waiver 拿掉。一個沒有到期壓力的例外,最後都會變成永久的沉默。
這一節由 matrix_63x8/waivers.py 現算:哪一格被 waive、掛在哪一個維度,以登記簿為準。

2 跑得動 · 2 個

step 1dim 2 · 跑得動Spec-to-RTL

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…

step 35dim 2 · 跑得動DFM screen (CMP density + redundant-via ratio + foundry-side OPC/RET dis…

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…

3 產出 · 3 個

step 39dim 3 · 產出FPGA final sign-off (recompile + on-board test)

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…

step 6dim 3 · 產出FPGA early prototype + verification report audit

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…

step M1dim 3 · 產出Mixed-Signal Top-Level Integration (A+D GDS merge + macro placement)

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…

5 依賴 · 1 個

step 12dim 5 · 依賴Post-DFT optimization (resynth / buffering)

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…

6 Skip · 1 個

step DT2dim 6 · SkipPath-delay-fault (at-speed, timing-graded) ATPG

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…

7 清單 · 4 個

step 23dim 7 · 清單🔁 Post-route STA (multi-corner multi-mode sign-off)

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…

step 7dim 7 · 清單Constraint setup (SDC + PVT matrix)

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 —…

step FS1dim 7 · 清單ISO-26262 FMEDA diagnostic-coverage (fault-injection; safety designs onl…

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…

step M1dim 7 · 清單Mixed-Signal Top-Level Integration (A+D GDS merge + macro placement)

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 6PRODUCED_BY_RUN 114UNPROVEN 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 格繼續被算進覆蓋率。上面的矩陣用 ! 逐格標出它們。

2026-08-06 — 「綠燈是怎麼亮的」這個問題,現在由一支程式回答 · 歷史紀錄,除標為現算的區塊外未重算

Owner 問:63×8 的每一個 item 都要有 test case,而且那個 test 要真的會失敗。這一節是那次稽核的結果,以及它現在被什麼擋著。

判定是由 step 資料夾裡的紀錄決定,不是資料夾裡的檔案

真跑一顆 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 讀紀錄,其餘七個零引用。

⭐ 一格不准叫 ENFORCED,除非有一個具名 mutation 被證明能讓它變紅

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/63d7: 58/63d2: 59/63。兩者不可能同時為真。

驗證者一個 mutation 都沒跑就推翻了它 —— 只把兩個數字擺在一起看。已修正:逐維計數才是覆蓋率,空的 NOT_FALSIFIABLE 只代表沒有格子被「證明」不可證偽。

0 個不可證偽,不等於 8 個維度都很強

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_entryresolve_anywhereNone 時 fall-through 成 produced=True,附一張 2026-07-27 的 fixture 保證書。七格標示 ENFORCED、無 waiver(17, 20, 29, 30, M2, M3, M4)因此不可證偽。實測 step 17 的 placed.deffind 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。