Skip to content

Commit b287ce1

Browse files
committed
DetTrace: add runnable bring-up trace comparison workflow
1 parent 40a469a commit b287ce1

3 files changed

Lines changed: 160 additions & 0 deletions

File tree

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
{
2+
"workflow": "pre-post-silicon-style-bringup-trace-validation",
3+
"safe_claim": "firmware-style trace validation; not silicon ownership or hardware lab bring-up",
4+
"expected_trace": "bringup_validation/pre_silicon_boot_trace.json",
5+
"observed_trace": "bringup_validation/post_silicon_boot_trace.json",
6+
"expected_event_count": 7,
7+
"observed_event_count": 8,
8+
"first_divergence": {
9+
"index": 3,
10+
"expected": {
11+
"phase": "register_init",
12+
"event": "clock_enable",
13+
"register": "CLK_CTRL",
14+
"value": "0x1",
15+
"calibration_status": "not_started",
16+
"status": "ok"
17+
},
18+
"observed": {
19+
"phase": "register_init",
20+
"event": "clock_enable_timeout",
21+
"register": "CLK_CTRL",
22+
"value": "0x0",
23+
"calibration_status": "not_started",
24+
"status": "timeout"
25+
}
26+
},
27+
"timeout_event_count": 1,
28+
"retry_event_count": 1,
29+
"calibration_issue_count": 2,
30+
"blocked_or_degraded_event_count": 2,
31+
"diagnostic_status": "FAIL",
32+
"root_cause_summary": "Observed boot trace diverged during register initialization: expected clock_enable but observed clock_enable_timeout, followed by retry behavior, calibration drift warning, and blocked ready state."
33+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# Bring-Up Comparison Report
2+
3+
## Safe claim
4+
5+
firmware-style trace validation; not silicon ownership or hardware lab bring-up
6+
7+
## Summary
8+
9+
- diagnostic status: `FAIL`
10+
- expected event count: `7`
11+
- observed event count: `8`
12+
- first divergence index: `3`
13+
- timeout events: `1`
14+
- retry events: `1`
15+
- calibration issues: `2`
16+
- blocked/degraded events: `2`
17+
18+
## First divergence
19+
20+
- expected: `{'phase': 'register_init', 'event': 'clock_enable', 'register': 'CLK_CTRL', 'value': '0x1', 'calibration_status': 'not_started', 'status': 'ok'}`
21+
- observed: `{'phase': 'register_init', 'event': 'clock_enable_timeout', 'register': 'CLK_CTRL', 'value': '0x0', 'calibration_status': 'not_started', 'status': 'timeout'}`
22+
23+
## Root-cause summary
24+
25+
Observed boot trace diverged during register initialization: expected clock_enable but observed clock_enable_timeout, followed by retry behavior, calibration drift warning, and blocked ready state.
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
#!/usr/bin/env python3
2+
import json
3+
from pathlib import Path
4+
5+
PRE = Path("bringup_validation/pre_silicon_boot_trace.json")
6+
POST = Path("bringup_validation/post_silicon_boot_trace.json")
7+
REPORT_JSON = Path("bringup_validation/bringup_comparison_report.json")
8+
REPORT_MD = Path("bringup_validation/bringup_comparison_report.md")
9+
10+
11+
def load_events(path):
12+
return json.loads(path.read_text())["boot_events"]
13+
14+
15+
def signature(event):
16+
return {
17+
"phase": event["phase"],
18+
"event": event["event"],
19+
"register": event["register"],
20+
"value": event["value"],
21+
"calibration_status": event["calibration_status"],
22+
"status": event["status"],
23+
}
24+
25+
26+
def main():
27+
expected = load_events(PRE)
28+
observed = load_events(POST)
29+
30+
first_divergence = None
31+
for idx, (e, a) in enumerate(zip(expected, observed)):
32+
if signature(e) != signature(a):
33+
first_divergence = {
34+
"index": idx,
35+
"expected": signature(e),
36+
"observed": signature(a),
37+
}
38+
break
39+
40+
timeout_events = [e for e in observed if e["status"] == "timeout" or "timeout" in e["event"]]
41+
retry_events = [e for e in observed if e["status"] == "retry" or "retry" in e["event"]]
42+
calibration_issues = [
43+
e for e in observed
44+
if e["calibration_status"] not in {"not_started", "running", "valid"}
45+
]
46+
blocked_or_degraded = [
47+
e for e in observed
48+
if e["status"] in {"blocked", "degraded"}
49+
]
50+
51+
report = {
52+
"workflow": "pre-post-silicon-style-bringup-trace-validation",
53+
"safe_claim": "firmware-style trace validation; not silicon ownership or hardware lab bring-up",
54+
"expected_trace": str(PRE),
55+
"observed_trace": str(POST),
56+
"expected_event_count": len(expected),
57+
"observed_event_count": len(observed),
58+
"first_divergence": first_divergence,
59+
"timeout_event_count": len(timeout_events),
60+
"retry_event_count": len(retry_events),
61+
"calibration_issue_count": len(calibration_issues),
62+
"blocked_or_degraded_event_count": len(blocked_or_degraded),
63+
"diagnostic_status": "FAIL" if first_divergence or timeout_events or calibration_issues or blocked_or_degraded else "PASS",
64+
"root_cause_summary": (
65+
"Observed boot trace diverged during register initialization: expected clock_enable but observed "
66+
"clock_enable_timeout, followed by retry behavior, calibration drift warning, and blocked ready state."
67+
if first_divergence else
68+
"Observed boot trace matched expected boot sequence."
69+
),
70+
}
71+
72+
REPORT_JSON.write_text(json.dumps(report, indent=2))
73+
74+
div = report["first_divergence"]
75+
REPORT_MD.write_text(
76+
"# Bring-Up Comparison Report\n\n"
77+
"## Safe claim\n\n"
78+
f"{report['safe_claim']}\n\n"
79+
"## Summary\n\n"
80+
f"- diagnostic status: `{report['diagnostic_status']}`\n"
81+
f"- expected event count: `{report['expected_event_count']}`\n"
82+
f"- observed event count: `{report['observed_event_count']}`\n"
83+
f"- first divergence index: `{div['index'] if div else 'none'}`\n"
84+
f"- timeout events: `{report['timeout_event_count']}`\n"
85+
f"- retry events: `{report['retry_event_count']}`\n"
86+
f"- calibration issues: `{report['calibration_issue_count']}`\n"
87+
f"- blocked/degraded events: `{report['blocked_or_degraded_event_count']}`\n\n"
88+
"## First divergence\n\n"
89+
f"- expected: `{div['expected'] if div else 'none'}`\n"
90+
f"- observed: `{div['observed'] if div else 'none'}`\n\n"
91+
"## Root-cause summary\n\n"
92+
f"{report['root_cause_summary']}\n"
93+
)
94+
95+
print(json.dumps(report, indent=2))
96+
97+
if report["diagnostic_status"] == "FAIL":
98+
raise SystemExit(1)
99+
100+
101+
if __name__ == "__main__":
102+
main()

0 commit comments

Comments
 (0)