From 73a7c99377b2b7fe07dca96b651d78bad710306e Mon Sep 17 00:00:00 2001 From: david rice Date: Thu, 23 Apr 2026 13:36:27 +0100 Subject: [PATCH] Chnages --- __pycache__/csv_preprocessor.cpython-312.pyc | Bin 47151 -> 47833 bytes csv_preprocessor.py | 50 +++++++++++++------ 2 files changed, 36 insertions(+), 14 deletions(-) diff --git a/__pycache__/csv_preprocessor.cpython-312.pyc b/__pycache__/csv_preprocessor.cpython-312.pyc index f8c4c47a82eae222b8131186ded1f94b67dac36d..9237a21fac49331271ee14f9c566bdfc9c03895c 100644 GIT binary patch delta 3985 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 delta 3472 zcmZ`5Yiv{3`JC%V?D&<$aqQUfE4E`hFFOw>BqSsd0s*p=l}>HUBVsu>DM<*!b_tJT zWu2&6Dj3kyHM9vOZMTXxjCH+zteRA9>NJgZQURffBCUf-Q~5ErJLsk{P3pem_>v%) z6Mx@#zW3{%>o5K({7e?ipP5XB2tMP#zqzaDmnY2*TyZk|#)w!Tp!JB99Y(~yAaDhQ z78Vgo`iVmK32K|2K6 zwWKOpN5UjBDvTl$eH{a=ejSsVIaRV=jEV7SC7jqmYCE7vQb+1Xg=8a%i4jOBBF6Kj z$H84wK6nEJZ+swlb3S+@1aAWE1Sv|kBx2Wp%Wj`l1}iol58TY6#dRFh^;2w z(EpBnQSESE4SJp8Dzaugf>7$`1QTJRE7>I=u~6(@z>8}%_5;2dmY#zKgpzAO)+2U} zJ;$Ezv$A)F3XEj!_*yUy=9r*}*S?^xGxSb6L35qBX6!h(9`9AWDVPXkof9Q{#oo1O zdlz`_gN<4*_Km%;YGrPM**&t zF7G^qaX=avPN;CVba+Ik7Iq6P_DqHJ_Sg=LCnWvEAl4?~UPvd|;JTo6boXH`o|cL; zV_JMpq6ho2P=;B5cYxhG^l@8p(je+YHL>!C1DawKP3KCLHYClW31qh1gHtA|Mg(Gq z9kCp+L>=tk^iR^wY;S?^A3=&evqy#d*_r1~72M^Kr&P=`5t4?FBvrVGeSEa@g=4ka z%UtpyGnd&}O_`1DI5sBz;n?E>-pcAvL<~9Y-Kx7^lC&P+oXjPa{?Y>eJp}U z*k1M>%_Okbv(MPCwU><>%Tk;6X*H3juoomr?|MALU)hHSkw!?aEQ$ZGf z_^YIqCxxShYBa3MR%ZQd-ODkPeOY#PcK)=Jou4!FhCy;dHo)GDd9>6)?KHq{zU*xa zE(;e_(n)#ltHDl#i)~Sw1ohaVo*J7Y6IW^-hn60M8D>N5`>(`YRT-Bep&?pzPIqq% zVfN`Ou0Vu_;X;5HS#A{3Y&B#Q9TxTr<4)KVJ)9y;H|s7>EGwsaDc4**E>(g?d0(4~ zF`C4@fvIuoT+B7sBy-l1^}`aFsl|!1HB0uihMk@5!8Po!vnv5c<{DIcp{8wfHKy8S z5o;k=-aw1rq4efn9d)#JnLh{na;{b5ptZD)IZs!Xz^>I(gAwh=sW3)VP0HEYS2q;I zXe?Di>tP9OR;S_;lK(C>r1O02VwYbH;G9lt1vL`)teSW-?Mgdm5%HeZEZI_HhCjx+ zPwt9#FZ#DDw!S4fw`G%O^4?>9T0|JSS9SHgw;)dAY0skl)-Wy3#fW6O?~56|FJ>{(KZT)p8t7dyspiX-ZJ@S1 zw+Fbk%o@d>OF?%9dwYIpS_iTs&;w3d0J z7CF1s;D=KR8i%4G_D!mTeSX&L<@a>zRW2Cf)N7o2oP&KFi0r>-`|%@e=lfQ?g>8Q; zUXWT1YS9)powl*B-r8-srb!QpljNE@mClgVAbaxdKeC|(kJ&Ud@x7smJyS#JC- zj4pVLseT?|JNQkvu+-7D)DULs&ZWQ%Qh#QS6y~A#dilh zI+I&Aq9XUa`l2Ox+r*DWaFoMHQ!2;VzupbAK`A^Px@xbwtrBdZ>-L~*1=-ggWVC@x zqxK7LL{vkI2A;`h#Ue+MpljX?w!3FWNN&72jdB zjDDlC=my;-7xbpV06X#CN^P2t_YrpKz2}?u@o^pC;1LcsbMS2r_z$5J<=`<69_3&Q z2Zz|H_m3I)FM?EVuVz^MgCm9K;0*sL{b%;c2WPNZ+WVo5?ZX)RWW?be6%q`xkYn_- z{U5C^8&hHJsi2HFo?m$ "LPMetrics": hs_burst_dur_ns = None hs_amplitude_mv = None hs_rolling_std_found = False + hs_osc_fraction = None s_end = None rstd = None @@ -949,8 +960,6 @@ def analyze_lp_file(path: Path) -> "LPMetrics": ) # Did rolling-std fire in the actual HS window (after LP-low ended)? - # With dynamic display content (video), genuine HS keeps rolling-std above - # threshold; absent HS does not. Used to gate Mode B/D false positives. if lp_low_duration_ns is not None: lp_low_end_idx = s_end + int((lp_low_duration_ns + 50.0) * 1e-9 / dt) hs_check_end = min(lp_low_end_idx + int(1000e-9 / dt), len(rstd)) @@ -958,6 +967,14 @@ def analyze_lp_file(path: Path) -> "LPMetrics": hs_rolling_std_found = bool( np.any(rstd[lp_low_end_idx:hs_check_end] >= HS_OSC_STD_V) ) + # hs_osc_fraction: 100 ns margin past LP-low end, look ahead 3 µs + # (lp_low_end_idx already includes 50 ns; add 50 ns more = 100 ns total) + hs_osc_start = lp_low_end_idx + int(50e-9 / dt) + hs_osc_end = min(hs_osc_start + int(3000e-9 / dt), len(rstd)) + if hs_osc_end - hs_osc_start >= int(500e-9 / dt): + hs_osc_fraction = round( + float(np.mean(rstd[hs_osc_start:hs_osc_end] >= HS_OSC_STD_V)), 4 + ) # ── Warnings ───────────────────────────────────────────────────────── warnings = [] @@ -994,7 +1011,7 @@ def analyze_lp_file(path: Path) -> "LPMetrics": f"(TCLK_PREPARE+TCLK_ZERO minimum) — SN65DSI83 may fail to lock CLK lane" ) - # Flicker suspect: three confirmed failure modes on this hardware: + # Flicker suspect: confirmed failure modes on this hardware: # # A) Normal LP-low (~342–380 ns) → bridge misses SoT → returns to LP-11 # Signature: lp11_to_hs fires at real LP-low end (~347 ns), hs_amplitude ≈ 15–30 mV. @@ -1005,18 +1022,18 @@ def analyze_lp_file(path: Path) -> "LPMetrics": # Signature: lp11_to_hs is None (rolling-std < HS_OSC_STD_V throughout 500 ns # lookahead), hs_amplitude < 50 mV, LP-11 returns ~500 ns later. # - # B) Short LP-low (< 200 ns, vs nominal ~342–380 ns) → anomalous SoT timing. - # Flag on LP-low duration alone: any lp_low < 200 ns is outside the normal range - # and warrants investigation regardless of amplitude or rolling-std state. - # Confirmed: capture 0124 (lp_low=108 ns). + # B) (removed — short-LP-low flicker is now caught by Mode F if osc_frac is in the + # suspicious zone; Mode B was causing false positives on blanking packets which + # legitimately have short LP-low and low amplitude due to uniform DC HS data) # # C) No LP-11 detected at all → MIPI link silent or stuck. # + # F) Normal LP-low but partial/transient HS dropout: hs_osc_fraction in suspicious zone + # (HS_OSC_FRACTION_SUSPICIOUS_LO < osc_frac < HS_OSC_FRACTION_SUSPICIOUS_HI). + # Healthy HS: ~0.14–0.22. Blanking/control (normal): ~0.00–0.02. Dropout: 0.04–0.13. + # Confirmed: capture 0105 Apr-23 run (osc_frac=0.079, lp_low=380 ns). + # # Only flag DAT lane (CLK is continuous HS — LP states not expected). - _lp_low_short = ( - lp_low_duration_ns is not None - and lp_low_duration_ns < 200.0 # below this, LP-low is anomalously brief - ) hs_burst_absent = ( hs_amplitude_mv is not None and hs_amplitude_mv < HS_BURST_AMPLITUDE_MIN_MV @@ -1035,8 +1052,6 @@ def analyze_lp_file(path: Path) -> "LPMetrics": # Mode A2: rolling-std never fired — HS absent or amplitude below HS_OSC_STD_V; # weak oscillations are misclassified as LP-low, masking the true HS failure or lp11_to_hs_ns is None - # Mode B: LP-low anomalously short + low amplitude = marginal HS launch. - or _lp_low_short ) ) # Mode C: no LP-11 at all → link silent (but exclude CLK which is always HS) @@ -1045,6 +1060,12 @@ def analyze_lp_file(path: Path) -> "LPMetrics": and not continuous_hs_clk and not lp11_regions ) + mode_f_partial_hs = ( + lp_transition_valid + and lp_low_duration_ns is not None + and hs_osc_fraction is not None + and HS_OSC_FRACTION_SUSPICIOUS_LO < hs_osc_fraction < HS_OSC_FRACTION_SUSPICIOUS_HI + ) flicker_suspect = ( channel == "dat" and ( @@ -1054,7 +1075,7 @@ def analyze_lp_file(path: Path) -> "LPMetrics": and ( lp_low_duration_ns is None or hs_burst_absent - or _lp_low_short + or mode_f_partial_hs ) ) ) @@ -1077,6 +1098,7 @@ def analyze_lp_file(path: Path) -> "LPMetrics": lp_transition_valid = lp_transition_valid, clk_lp_startup_ok = clk_lp_startup_ok, hs_rolling_std_found = hs_rolling_std_found, + hs_osc_fraction = hs_osc_fraction, flicker_suspect = flicker_suspect, warnings = warnings, )