Files
MiPi_TEST/__pycache__/csv_preprocessor.cpython-312.pyc

228 lines
46 KiB
Plaintext
Raw Normal View History

2026-04-08 12:55:34 +01:00
<EFBFBD>
2026-04-21 15:38:17 +01:00
<00>]<5D><00><00><00>UdZddlZddlZddlZddlZddlmZmZddl m
2026-04-09 11:03:35 +01:00
Z
ddl m Z dZ dZdZd Zd
2026-04-21 12:26:10 +01:00
Zd Zd Zd Zd ZdZdZdZdZd ZdZd
Zd ZdZdZdZ eGd<16>d<17><00>Z!de
de"ejFejFffd<1A>Z$dejFdejFdejFfd<1D>Z% dJdejFdejFde&de&d e'de"e(e(ff d!<21>Z)de
de!fd"<22>Z*eGd#<23>d$<24><00>Z+de
dd$fd%<25>Z,d&Z-d'd(ggd)<29>gd*<2A>d+<2B>Z.e/e0e(fe1d,<d-d.gZ2d/e(de(e0fd0<64>Z3eGd1<64>d2<64><00>Z4de
dd2fd3<64>Z5dZ6eGd4<64>d5<64><00>Z7de
dd5fd6<64>Z8d7e
de/e"e0e'fe/e0e
fffd8<64>Z9eGd9<64>d:<3A><00>Z:d;ejFd<e'dejFfd=<3D>Z;dKd>ejFd?e'fd@<40>Z<de
dd:fdA<64>Z=e>dBk(r<>ddl?Z?e
e@<40>j<>dCz ZBeCe?j<><00>dDkDr$e?j<>dDdD<00>cgc]
2026-04-09 11:03:35 +01:00
}e
2026-04-21 12:26:10 +01:00
|<00><00><02> c}ZEneFeBj<42>dE<64><00>ddFZEeED]?ZH dGeHj<48>vr e=eH<65>ZJne*eH<65>ZJeKeJj<4A><00><00>eK<65><00>Ayycc}w#eM$r"ZNeKdHeHj<48><00>dIeN<65><00><04>YdZN[N<>kdZN[NwwxYw)LuF
2026-04-08 12:55:34 +01:00
csv_preprocessor.py
Extracts MIPI HS-TX / LP state metrics from oscilloscope CSV files.
File naming convention: YYYYMMDD_HHMMSS_{sig|proto|lp}_{NNNN}_{clk|dat}.csv
sig — high-res short window (320 GSa/s, ~20 ns) — rise/fall times
Two columns: time_s, vdiff_v (F1/F2 differential, ±250 mV HS swing)
proto — lower-res long window (20 GSa/s, ~10 µs) — jitter, frequency, amplitude
Two columns: time_s, vdiff_v (F1/F2 differential)
lp — LP state capture (~40 GSa/s, ~5 µs) — LP-11/LP-00/HS burst structure
Two columns: time_s, voltage_v (Ch1 or Ch3 single-ended CLK+/DAT0+)
Vertical range: 0.2 V to 1.4 V so LP-11 (~1.2 V) and LP-00 (~0 V) are visible.
Trigger: falling edge at 0.6 V on CLK+ catches LP-11 → LP-01 SoT transition.
2026-04-09 08:45:57 +01:00
<EFBFBD>N)<02> dataclass<73>field)<01>Path)<01>Optionalg<6C><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?g\<5C><><EFBFBD>(\<5C>?g=
2026-04-13 15:03:47 +01:00
ףp=<3D>?<3F>I@g4@g<00>a@g<00>p@g@@皙<><E79A99><EFBFBD><EFBFBD><EFBFBD>?g<00>?<3F><00>?g333333<33>?g
2026-04-08 12:55:34 +01:00
ףp=
2026-04-20 16:56:41 +01:00
<EFBFBD>?<3F><00>r@gD@g$@c<00>$<00>eZdZUeed<eed<eed<eed<eed<eed<eed<eed<eed <eed
2026-04-08 12:55:34 +01:00
<eed <d Zeeed <d Z eeed<d Z
eeed<d Z eeed<d Z eeed<dZ eed<dZeed<ee<10><15>Zeed<defd<18>Zy )<19>ChannelMetrics<63> timestamp<6D> capture_num<75> file_type<70>channel<65>sample_rate_gsps<70> duration_ns<6E> n_samples<65> vdiff_pos_mv<6D> vdiff_neg_mv<6D>vdiff_amplitude_mv<6D>vcm_mvN<76>clock_freq_mhz<68> jitter_pp_ps<70> jitter_rms_ps<70> rise_time_ps<70> fall_time_psr<00> n_transitions<6E>spec_violations<6E><01>default_factory<72>warnings<67>returnc <00><00>d<01>}d|jd<03>d|j<00>d|j<00>d|j<00>d<07> d|jd <09>d
|t
|jcxkxr t knc<00><00><00>d |jd <0C>d |jd <0C>d<0E>d|jd<10>d<0E>g}|j<00>-|jd|jd<12>d|j<00>d<14><05>|j<00>.|jd|jd <0C>d|jd <0C>d<17><05>|j<00>9|jd|jd <0C>d||jt k<00><00><00><04>|j"<00>9|jd|j"d <0C>d||j"t k<00><00><00><04>|j$r'|jd|j$<00>dt
2026-04-21 12:26:10 +01:00
d<1D>d<1E><05>|j&D]}|jd|<03><00><02><00>d j)|<02>S)!Nc<00><00>|rdSdS<00>N<><><>)<01>conds <20>5/home/david-rice/Python/MiPi_Test/csv_preprocessor.py<70><lambda>z(ChannelMetrics.summary.<locals>.<lambda>is <00><00>4<EFBFBD>%<25><00>U<EFBFBD><00><00>Capture <20>04d<34> z [<5B>/<2F>]z Vdiff amplitude : <20>6.1fu mV (spec 140270 mV) z Vdiff pos/neg : +<2B>.1fz / <20> mVz Common mode : z+.1fz Clock freq : <20>.2fz MHz DDR (z transitions)z Jitter p-p/RMS : z ps / <20> psz Rise time 20-80%: z ps z Fall time 20-80%: z Spec violations : z samples below <20>.0fu mV ✗<> WARNING: <20>
)rr rrr<00>HS_VDIFF_MIN_MV<4D>HS_VDIFF_MAX_MVrrrr<00>appendrrrr<00>RISE_FALL_MAX_PSrrr!<00>join<69><04>self<6C>ok<6F>lines<65>ws r*<00>summaryzChannelMetrics.summaryhs6<00><00> 2<><02><16>t<EFBFBD>'<27>'<27><03>,<2C>B<EFBFBD>t<EFBFBD>~<7E>~<7E>.><3E>c<EFBFBD>$<24>.<2E>.<2E>AQ<41>QR<51>SW<53>S_<53>S_<53>R`<60>`a<> b<>"<22>4<EFBFBD>#:<3A>#:<3A>4<EFBFBD>"@<40>A$<24>$&<26><EFBFBD>$<24>:Q<>:Q<>'d<>Ud<55>'d<>$e<>#f<> h<01>#<23>D<EFBFBD>$5<>$5<>c<EFBFBD>#:<3A>#<23>d<EFBFBD>>O<>>O<>PS<50>=T<>TW<54> X<>"<22>4<EFBFBD>;<3B>;<3B>t<EFBFBD>"4<>C<EFBFBD> 8<> 
2026-04-20 12:13:26 +01:00
<EFBFBD><05> <10> <1E> <1E> *<2A> <11>L<EFBFBD>L<EFBFBD>&<26>t<EFBFBD>':<3A>':<3A>3<EFBFBD>&?<3F>@<14><18>&<26>&<26>'<27>}<7D>6<> <0E> <10> <1C> <1C> (<28> <11>L<EFBFBD>L<EFBFBD>&<26>t<EFBFBD>'8<>'8<><13>&=<3D>V<EFBFBD>D<EFBFBD>DV<44>DV<44>WZ<57>C[<5B>[^<5E>_<> <0E> <10> <1C> <1C> (<28> <11>L<EFBFBD>L<EFBFBD>&<26>t<EFBFBD>'8<>'8<><13>&=<3D>U<EFBFBD><15>d<EFBFBD>'<27>'<27>+;<3B>;<3B><<3C>=<3D>?<3F> <0E> <10> <1C> <1C> (<28> <11>L<EFBFBD>L<EFBFBD>&<26>t<EFBFBD>'8<>'8<><13>&=<3D>U<EFBFBD><15>d<EFBFBD>'<27>'<27>+;<3B>;<3B><<3C>=<3D>?<3F> <0E> <10> <1F> <1F> <11>L<EFBFBD>L<EFBFBD>/<2F><04>0D<30>0D<30>/E<>_<EFBFBD>Ud<55>eh<65>Ti<54>iq<69>r<> s<><15><1D><1D> ,<2C>A<EFBFBD> <11>L<EFBFBD>L<EFBFBD>;<3B>q<EFBFBD>c<EFBFBD>*<2A> +<2B> ,<2C><13>y<EFBFBD>y<EFBFBD><15><1F>r,)<13>__name__<5F>
2026-04-21 12:26:10 +01:00
__module__<EFBFBD> __qualname__<5F>str<74>__annotations__<5F>int<6E>floatrrrrrrrrr<00>listr!rDr(r,r*r r Js<><00><00><14><14><14><14><14><14><14><14><1B><1B><1B><1B><19><19><1E><1D><1D><1D><1D><1D><1D><1D>'+<2B>N<EFBFBD>H<EFBFBD>U<EFBFBD>O<EFBFBD>*<2A>&*<2A>L<EFBFBD>H<EFBFBD>U<EFBFBD>O<EFBFBD>*<2A>&*<2A>M<EFBFBD>H<EFBFBD>U<EFBFBD>O<EFBFBD>*<2A>&*<2A>L<EFBFBD>H<EFBFBD>U<EFBFBD>O<EFBFBD>*<2A>&*<2A>L<EFBFBD>H<EFBFBD>U<EFBFBD>O<EFBFBD>*<2A><1B>M<EFBFBD>C<EFBFBD><1B><1D>O<EFBFBD>S<EFBFBD><1C><1A>4<EFBFBD>0<>H<EFBFBD>d<EFBFBD>0<>  <20><13>  r,r <00>pathr"c<00>4<00>gg}}t|<00>5}tj|<03>D]L}t|<04>dk\s<01> |j t |d<00><00>|j t |d<00><00><00>N ddd<00>tj|tj<00><04>}tj|tj<00><04>}t|<05>dkr%t d|j<00>dt|<05><00>d<07><05><00>||fS#t $rY<00><>wxYw#1swY<00><>xYw)N<>r<00><00><01>dtypezInsufficient samples in <20> (z rows parsed)) <0B>open<65>csv<73>reader<65>lenr<rK<00>
ValueError<EFBFBD>np<6E>array<61>float64<36>name)rM<00>times<65>volts<74>f<>row<6F>t<>vs r*<00> _read_csvrc<00>s<><00><00><15>r<EFBFBD>5<EFBFBD>E<EFBFBD> <0A>d<EFBFBD><1A><19>q<EFBFBD><16>:<3A>:<3A>a<EFBFBD>=<3D> <19>C<EFBFBD><12>3<EFBFBD>x<EFBFBD>1<EFBFBD>}<7D><19><19>L<EFBFBD>L<EFBFBD><15>s<EFBFBD>1<EFBFBD>v<EFBFBD><1D>/<2F><19>L<EFBFBD>L<EFBFBD><15>s<EFBFBD>1<EFBFBD>v<EFBFBD><1D>/<2F>  <19><19> <0B><08><08><15>b<EFBFBD>j<EFBFBD>j<EFBFBD>)<29>A<EFBFBD>
2026-04-09 10:29:53 +01:00
<EFBFBD><08><08><15>b<EFBFBD>j<EFBFBD>j<EFBFBD>)<29>A<EFBFBD>
<EFBFBD>1<EFBFBD>v<EFBFBD><01>z<EFBFBD><18>3<>D<EFBFBD>I<EFBFBD>I<EFBFBD>;<3B>b<EFBFBD><13>Q<EFBFBD><16><08> <0A>V<>W<>W<> <0C>a<EFBFBD>4<EFBFBD>K<EFBFBD><4B> "<22><19><18><19><> <19><19>s.<00>'D<03>:C?<04>3D<03>? D <07>D<03>
2026-04-20 12:13:26 +01:00
D <07> D<03>Dr]r^c<00>h<00>tj|<01>}tj|<02>}tj|dk7<00>d}g}|D]R}||dk7s<01> ||dzdk7s<01>|| ||dz||z
2026-04-08 12:55:34 +01:00
z }|j |||||dz||z
zz<00><00>Ttj
2026-04-21 12:26:10 +01:00
|<05>S)zDReturn array of linearly-interpolated zero-crossing times (seconds).rrP)rY<00>sign<67>diff<66>wherer<rZ)r]r^<00>signs<6E>change<67>idx<64>ct<63>i<>fracs r*<00>_zero_crossingsrn<00>s<><00><00> <0E>G<EFBFBD>G<EFBFBD>E<EFBFBD>N<EFBFBD>E<EFBFBD> <0F>W<EFBFBD>W<EFBFBD>U<EFBFBD>^<5E>F<EFBFBD>
2026-04-08 12:55:34 +01:00
<0C>(<28>(<28>6<EFBFBD>Q<EFBFBD>;<3B>
<1F><01>
2026-04-20 12:13:26 +01:00
"<22>C<EFBFBD> <0B>B<EFBFBD> <10>C<01><01> <10><11>8<EFBFBD>q<EFBFBD>=<3D>U<EFBFBD>1<EFBFBD>q<EFBFBD>5<EFBFBD>\<5C>Q<EFBFBD>.<2E><19>!<21>H<EFBFBD>9<EFBFBD><05>a<EFBFBD>!<21>e<EFBFBD> <0C>u<EFBFBD>Q<EFBFBD>x<EFBFBD> 7<>8<>D<EFBFBD> <0E>I<EFBFBD>I<EFBFBD>e<EFBFBD>A<EFBFBD>h<EFBFBD><14><15>q<EFBFBD>1<EFBFBD>u<EFBFBD><1C><05>a<EFBFBD><08>)@<40>!A<>A<> B<>C<01> <0E>8<EFBFBD>8<EFBFBD>B<EFBFBD><<3C>r,<00>v_high<67>v_low<6F>window_samplesc <00><00>|d||z
2026-04-08 12:55:34 +01:00
zz}|d||z
zz}tj|<01>}tjtj|<07>dk7<00>d}gg}
} |D<00>]&} t d| |dzz
<00>} t t |<00>| |dzz<00>} || | }|| | }t |<0F>dkr<01>J|t | dzt |<01>dz
<00>|| kDr<>tj||<05>}tj||<06>}d|cxkrt |<0E>dz
ks<01><>n<00><>d|cxkrt |<0E>dz
ks<01><>n<00><>||kDs<01><>tj|||dz
|dz||dz
|dz<00>}tj|||dz
|dz||dz
|dz<00>}| j||z
dz<00><00><01>A|ddd <09>}|ddd <09>}tj||<06>}tj||<05>}d|cxkrt |<15>dz
ks<02><01><>n<00><01><>d|cxkrt |<15>dz
ks<02><01><>n<00><01><>||kDs<02><01><>tj|||dz
|dz||dz
|dz<00>}tj|||dz
|dz||dz
|dz<00>}|
j||z
dz<00><00><02>)| |
fS)
uv
Measure 20%80% rise and fall times around each zero crossing.
Returns (rise_times_ps, fall_times_ps).
2026-04-20 12:13:26 +01:00
g<><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?rrrO<00>rP<00><00><>mBN<42><4E><EFBFBD><EFBFBD><EFBFBD>)
2026-04-21 12:26:10 +01:00
rYrergrf<00>max<61>minrW<00> searchsorted<65>interpr<)r]r^rorprq<00>v20<32>v80rh<00> trans_idx<64>rise_ps<70>fall_psrj<00>s<>e<>tw<74>vw<76>i20<32>i80<38>t20<32>t80<38>vw_r<5F>tw_rs r*<00>_rise_fall_timesr<73><00>s<><00><00> <10>$<24>&<26>5<EFBFBD>.<2E>)<29>
2026-04-08 12:55:34 +01:00
)<29>C<EFBFBD>
<0F>$<24>&<26>5<EFBFBD>.<2E>)<29>
)<29>C<EFBFBD> <0E>G<EFBFBD>G<EFBFBD>E<EFBFBD>N<EFBFBD>E<EFBFBD><12><08><08><12><17><17><15><1E>1<EFBFBD>,<2C>-<2D>a<EFBFBD>0<>I<EFBFBD><19>2<EFBFBD>W<EFBFBD>G<EFBFBD><18>3<><03> <0F><01>3<EFBFBD><1E>1<EFBFBD>,<2C>,<2C> -<2D><01> <0F><03>E<EFBFBD>
2026-04-20 12:13:26 +01:00
<EFBFBD>C<EFBFBD>.<2E>A<EFBFBD>"5<>5<> 6<><01> <12>1<EFBFBD>Q<EFBFBD>Z<EFBFBD><02> <12>1<EFBFBD>Q<EFBFBD>Z<EFBFBD><02> <0E>r<EFBFBD>7<EFBFBD>Q<EFBFBD>;<3B> <14> <10><13>S<EFBFBD>1<EFBFBD>W<EFBFBD>c<EFBFBD>%<25>j<EFBFBD>1<EFBFBD>n<EFBFBD>-<2D> .<2E><15>s<EFBFBD><1A> ;<3B><14>/<2F>/<2F>"<22>c<EFBFBD>*<2A>C<EFBFBD><14>/<2F>/<2F>"<22>c<EFBFBD>*<2A>C<EFBFBD><10>3<EFBFBD>$<24><13>R<EFBFBD><17>1<EFBFBD><1B>$<24><11>S<EFBFBD>)><3E>3<EFBFBD>r<EFBFBD>7<EFBFBD>Q<EFBFBD>;<3B>)><3E>3<EFBFBD><13>9<EFBFBD><18>i<EFBFBD>i<EFBFBD><03>R<EFBFBD><03>a<EFBFBD><07><03>a<EFBFBD><07>%8<>"<22>S<EFBFBD>1<EFBFBD>W<EFBFBD>S<EFBFBD>1<EFBFBD>W<EFBFBD>:M<>N<><03><18>i<EFBFBD>i<EFBFBD><03>R<EFBFBD><03>a<EFBFBD><07><03>a<EFBFBD><07>%8<>"<22>S<EFBFBD>1<EFBFBD>W<EFBFBD>S<EFBFBD>1<EFBFBD>W<EFBFBD>:M<>N<><03><17><0E><0E><03>c<EFBFBD> <09>T<EFBFBD>1<>2<><16>d<EFBFBD><02>d<EFBFBD>8<EFBFBD>D<EFBFBD><15>d<EFBFBD><02>d<EFBFBD>8<EFBFBD>D<EFBFBD><14>/<2F>/<2F>$<24><03>,<2C>C<EFBFBD><14>/<2F>/<2F>$<24><03>,<2C>C<EFBFBD><10>3<EFBFBD>&<26><13>T<EFBFBD><19>Q<EFBFBD><1D>&<26>&<26>1<EFBFBD>s<EFBFBD>+B<>S<EFBFBD><14>Y<EFBFBD><11>]<5D>+B<>+B<>s<EFBFBD>S<EFBFBD>y<EFBFBD><18>i<EFBFBD>i<EFBFBD><03>T<EFBFBD>#<23><01>'<27>#<23><01>'<27>%:<3A>D<EFBFBD><13>q<EFBFBD><17><13>q<EFBFBD><17><Q<>R<><03><18>i<EFBFBD>i<EFBFBD><03>T<EFBFBD>#<23><01>'<27>#<23><01>'<27>%:<3A>D<EFBFBD><13>q<EFBFBD><17><13>q<EFBFBD><17><Q<>R<><03><17><0E><0E><03>c<EFBFBD> <09>T<EFBFBD>1<>2<>53<>8 <13>G<EFBFBD> <1B>r,c <00><> <00>tjd|jtj<00>}|st d|j<00><00><02><00>|j <00>\}}}}|dk(r t d<04><00>t |<04>}t|<00>\}}ttj|<07>j<00><00>} d| z }
2026-04-08 12:55:34 +01:00
t|d<00>t|d<00>z
dz} td z } || kD} || k}| j<00>rt|| j<00><00>d znd
}|j<00>rt||j<00><00>d znd
}| j<00> xr|j<00> }| xr$| j<00> xs|j<00> }|rd
}n;|rtt|<0F>t|<10><00>}nt|<0F>t|<10>zd z }||zd z }t!||<08>}t#|<15>}d x}x}}|d k(<00>r|dk\<00>r tj|<15>dz}ttj$|<1A><00>}t|j'<00><00>}|dkDr!|tj||z
<00>d|zkn|}t#|<1D>dk\r<>t)dttj$|<1D><00>dzz dz d<13>}t)t|j<00>|j+<00>z
<00>d<14>}t)t|j'<00><00>d<14>}|d z }|d z }t-||||<1F>\} }!| r(t)ttj$| <20><00>d<14>nd }"|!r(t)ttj$|!<21><00>d<14>nd }#|dk\r4ttj$tj|<15><00><00>dzn| dz}$tj.t#|<07>t0<00><18>}%|D]9}&tj2||&|$z
<00>}'tj2||&|$z<00>}(d|%|'|(<00>;|%tj|<08>| kDz})|r)|r'dt+t|d z <00>t|d z <00><00>znt4d z }*t tj6|)tj|<08>|*kz<00><00>}+g},|r|,j9d<1B>n+|r)| j<00>rdnd}-|,j9d|-<2D>d<1F><03>|s'|t4kr|,j9d |d!<21>d"t4d!<21>d#<23><05>|t:kDr|,j9d |d!<21>d$t:d!<21>d#<23><05>|"<22>'|"t<kDr|,j9d%|"d!<21>d&t<d!<21>d'<27><05>|#<23>'|#t<kDr|,j9d(|#d!<21>d&t<d!<21>d'<27><05>|+dkDr|,j9|+<2B>d)t4d!<21>d#<23><04>t?d=id*|<02>d+|<06>d,|<03>d-|<05>d.t)|
dz d<14><00>d/t)| d<13><00>d0t#|<07><00>d1t)|d<14><00>d2t)|d<14><00>d3t)|d<14><00>d4t)|d<14><00>d5|<17>d6|<18>d7|<19>d8|"<22>d9|#<23>d:|<16>d;|+<2B>d<|,<2C><01>S)>zQ
Analyse one oscilloscope CSV file and return a ChannelMetrics instance.
2026-04-20 12:13:26 +01:00
z1(\d{8}_\d{6})_(sig|proto|lp)_(\d+)_(clk|dat)\.csvz*Filename does not match expected pattern: <20>lpz6Use analyze_lp_file() for lp-type files (single-ended)r rur<00>e<><65>A<EFBFBD>@<40>@gg@N<>clk<6C>rtg@g<11>-<2D><><EFBFBD><EFBFBD>=<3D><00><>.ArOrPrsgffffff<66>?<3F>
rQTg333333<33>?u9No HS signal detected — line may be in LP state or idle<6C>positive<76>negativezOnly u= swings in capture window — amplitude may be underestimatedzVdiff r7z mV below spec min r4z mV above spec max z
Rise time z ps exceeds r6z
Fall time z settled samples below r rrrrrrrrrrrrrrrrrr!r() <20>re<72>matchr\<00>
2026-04-21 12:26:10 +01:00
IGNORECASErX<00>groupsrJrcrKrYrf<00>mean<61>TRANSITION_BAND_MV<4D>anyrv<00>absrnrW<00>median<61>std<74>roundrwr<><00>zeros<6F>boolrxr:<00>sumr<r;r=r ).rM<00>mr r<00>cap_strrrr]r^<00>dt<64> sample_rater<00>v_thresh<73>pos_mask<73>neg_mask<73> vdiff_pos<6F> vdiff_neg<65> no_signal<61> one_sided<65> amplitude<64>vcmrkrrrr<00> half_periods<64>med<65>sd<73>hprorp<00> rise_list<73> fall_listrr<00>guard_s<5F>in_guard<72>t_cross<73>lo<6C>hi<68>settled<65>floor_vrr!<00>polaritys. r*<00> analyze_filer<65><00>s@<00><00> <0B><08><08>E<><15><19><19>B<EFBFBD>M<EFBFBD>M<EFBFBD> +<2B>A<EFBFBD> <0C><18>E<>d<EFBFBD>i<EFBFBD>i<EFBFBD>[<5B>Q<>R<>R<>-.<2E>X<EFBFBD>X<EFBFBD>Z<EFBFBD>*<2A>I<EFBFBD>y<EFBFBD>'<27>7<EFBFBD><10>D<EFBFBD><18><18>Q<>R<>R<><15>g<EFBFBD>,<2C>K<EFBFBD><1C>T<EFBFBD>?<3F>L<EFBFBD>E<EFBFBD>5<EFBFBD><1A>2<EFBFBD>7<EFBFBD>7<EFBFBD>5<EFBFBD>><3E>.<2E>.<2E>0<>1<>B<EFBFBD><18>2<EFBFBD>X<EFBFBD>K<EFBFBD><1B>E<EFBFBD>"<22>I<EFBFBD>&<26><15>u<EFBFBD>Q<EFBFBD>x<EFBFBD><1F>8<>C<EFBFBD>?<3F>K<EFBFBD>"<22>F<EFBFBD>*<2A>H<EFBFBD><14><08> <20>H<EFBFBD><14><08>y<EFBFBD> <20>H<EFBFBD>:B<>,<2C>,<2C>.<2E><05>e<EFBFBD>H<EFBFBD>o<EFBFBD>*<2A>*<2A>,<2C>-<2D><06>6<>c<EFBFBD>I<EFBFBD>:B<>,<2C>,<2C>.<2E><05>e<EFBFBD>H<EFBFBD>o<EFBFBD>*<2A>*<2A>,<2C>-<2D><06>6<>c<EFBFBD>I<EFBFBD>
2026-04-08 12:55:34 +01:00
<1E>\<5C>\<5C>^<5E>#<23>=<3D>h<EFBFBD>l<EFBFBD>l<EFBFBD>n<EFBFBD>*<<3C>I<EFBFBD><1E><1D>R<>(<28>,<2C>,<2C>.<2E>&8<>%Q<>(<28>,<2C>,<2C>.<2E>>P<>I<EFBFBD><10><17> <09> <12><17><03>I<EFBFBD><0E><03>I<EFBFBD><0E>7<> <09><18><19>^<5E>c<EFBFBD>)<29>n<EFBFBD>4<><03>;<3B> <09> <14>y<EFBFBD> <20>C<EFBFBD>
'<27>C<EFBFBD>
<19><15><05> &<26>B<EFBFBD><17><02>G<EFBFBD>M<EFBFBD>48<34>8<>N<EFBFBD>8<>\<5C>M<EFBFBD> <0F>%<25><17>M<EFBFBD>R<EFBFBD>/<2F><19>w<EFBFBD>w<EFBFBD>r<EFBFBD>{<7B>T<EFBFBD>)<29> <0C><13>B<EFBFBD>I<EFBFBD>I<EFBFBD>l<EFBFBD>+<2B>,<2C><03><13>L<EFBFBD>$<24>$<24>&<26>'<27><02>DF<44><11>F<EFBFBD>\<5C>"<22>&<26>&<26><1C><03>!3<>4<>s<EFBFBD>R<EFBFBD>x<EFBFBD>?<3F> @<40>P\<5C><02> <0E>r<EFBFBD>7<EFBFBD>b<EFBFBD>=<3D>"<22>3<EFBFBD>%<25><02> <09> <09>"<22> <0A>*><3E><15>*F<>#G<>#<23>#M<>q<EFBFBD>Q<>N<EFBFBD>"<22>5<EFBFBD><12><16><16><18>B<EFBFBD>F<EFBFBD>F<EFBFBD>H<EFBFBD>)<<3C>#=<3D>q<EFBFBD>A<>L<EFBFBD>"<22>5<EFBFBD><12><16><16><18>?<3F>A<EFBFBD>6<>M<EFBFBD><17><16> <1F>F<EFBFBD> <16><16> <1F>E<EFBFBD>+<2B>E<EFBFBD>5<EFBFBD>&<26>%<25>H<><18>I<EFBFBD>y<EFBFBD><E<>5<EFBFBD><15>r<EFBFBD>y<EFBFBD>y<EFBFBD><19>3<>4<>a<EFBFBD>8<>4<EFBFBD>L<EFBFBD><E<>5<EFBFBD><15>r<EFBFBD>y<EFBFBD>y<EFBFBD><19>3<>4<>a<EFBFBD>8<>4<EFBFBD>L<EFBFBD> 7D<01>q<EFBFBD>6H<36>e<EFBFBD>B<EFBFBD>I<EFBFBD>I<EFBFBD>b<EFBFBD>g<EFBFBD>g<EFBFBD>b<EFBFBD>k<EFBFBD>*<2A>+<2B>d<EFBFBD>2<>b<EFBFBD>SU<53>g<EFBFBD>G<EFBFBD><11>x<EFBFBD>x<EFBFBD><03>E<EFBFBD>
<EFBFBD>$<24>/<2F>H<EFBFBD><15><1F><07> <0F>_<EFBFBD>_<EFBFBD>U<EFBFBD>G<EFBFBD>g<EFBFBD>$5<> 6<><02> <0F>_<EFBFBD>_<EFBFBD>U<EFBFBD>G<EFBFBD>g<EFBFBD>$5<> 6<><02><1E><08><12>B<EFBFBD><0F><1F>
<19>y<EFBFBD>R<EFBFBD>V<EFBFBD>V<EFBFBD>E<EFBFBD>]<5D>X<EFBFBD>5<>6<>G<EFBFBD> <12>i<EFBFBD><13>S<EFBFBD><13>Y<EFBFBD><16>/<2F>0<>#<23>i<EFBFBD>&<26>6H<36>2I<32>J<>J<>&5<><06>&><3E> <0C><19>"<22>&<26>&<26><17>B<EFBFBD>F<EFBFBD>F<EFBFBD>5<EFBFBD>M<EFBFBD>G<EFBFBD>,C<>!D<>E<>F<>O<EFBFBD><12>H<EFBFBD><10><10><0F><0F>S<>T<> <12>!)<29><1C><1C><1E>:<3A>Z<EFBFBD><08><10><0F><0F><13>H<EFBFBD>:<3A>Z<> [<5B>
<EFBFBD> <15><19>_<EFBFBD>4<><10><0F><0F>&<26><19>3<EFBFBD><0F>/B<>?<3F>SV<53>BW<42>WZ<57>[<5B>\<5C><10>?<3F>"<22><10><0F><0F>&<26><19>3<EFBFBD><0F>/B<>?<3F>SV<53>BW<42>WZ<57>[<5B>\<5C><13><1F>L<EFBFBD>3C<33>$C<><10><0F><0F>*<2A>\<5C>#<23>$6<>l<EFBFBD>CS<43>TW<54>BX<42>X[<5B>\<5C>]<5D><13><1F>L<EFBFBD>3C<33>$C<><10><0F><0F>*<2A>\<5C>#<23>$6<>l<EFBFBD>CS<43>TW<54>BX<42>X[<5B>\<5C>]<5D><16><11><1A><10><0F><0F>?<3F>+<2B>+B<>?<3F>SV<53>BW<42>WZ<57>[<5B>\<5C> <19> <06>$<24> <06>&<26> <06>%<25> <06>#<23>  <06>
2026-04-20 12:13:26 +01:00
!<21><1B>s<EFBFBD>!2<>A<EFBFBD>6<>  <06> !<21><1B>a<EFBFBD>0<>  <06><1F>u<EFBFBD>:<3A> <06>!<21><19>A<EFBFBD>.<2E> <06>!<21><19>A<EFBFBD>.<2E> <06>#<23>9<EFBFBD>a<EFBFBD>0<> <06>!<21><13>a<EFBFBD>=<3D> <06>*<2A> <06>(<28> <06>)<29> <06>(<28> <06> (<28>! <06>")<29># <06>$+<2B>% <06>&$<24>' <06>r,c<00><><00>eZdZUeed<eed<eed<eed<eed<eed<eed<eed<eed <eed
2026-04-09 08:45:57 +01:00
<eed <eed <ee <09> <0A>Z
2026-04-20 12:13:26 +01:00
e ed<defd<10>Z y)<12> V1V8Metricsr r<00>sample_rate_mhz<68> duration_usr<00>mean_v<5F>min_v<5F>max_v<5F>droop_mv<6D> ripple_mv_rms<6D> spec_pass<73>
droop_passrr!r"c <00><><00>d<01>}d|jd<03>d|j<00>d<05>d|jd<07>dtd <09>d
2026-04-09 08:45:57 +01:00
td <09>d ||j
2026-04-21 12:26:10 +01:00
<00><00><00>d |j d<07>d ||j<00><00><00>d|jd<0F>d<10>d|jd <09>d<10>g}|jD]}|jd|<03><00><02><00>dj|<02>S)Nc<00><00>|rdSdSr%r(<00><01>cs r*r+z%V1V8Metrics.summary.<locals>.<lambda>x<00> <00><00><01>u<EFBFBD><00>u<EFBFBD>r,r-r.r/z [pwr/1v8]z Mean voltage : <20>.4f<EFBFBD>
V (spec r5<00><> V) z Min voltage : z V z Droop depth : r3r4z Ripple RMS : r8r9) rr r<><00>V18_SPEC_MIN_V<5F>V18_SPEC_MAX_Vr<56>r<>r<>r<>r<>r!r<r>r?s r*rDzV1V8Metrics.summaryws<><00><00> ,<2C><02><16>t<EFBFBD>'<27>'<27><03>,<2C>B<EFBFBD>t<EFBFBD>~<7E>~<7E>.><3E>k<EFBFBD> J<>"<22>4<EFBFBD>;<3B>;<3B>s<EFBFBD>"3<>4<15>#<23>C<EFBFBD>(<28><03>N<EFBFBD>3<EFBFBD>+?<3F>u<EFBFBD>R<EFBFBD><04><0E><0E>EW<45>DX<44> Z<01>"<22>4<EFBFBD>:<3A>:<3A>c<EFBFBD>"2<>$<24>r<EFBFBD>$<24>/<2F>/<2F>7J<37>6K<36> L<>"<22>4<EFBFBD>=<3D>=<3D><13>"5<>S<EFBFBD> 9<>"<22>4<EFBFBD>#5<>#5<>c<EFBFBD>":<3A>#<23> ><3E> 
<EFBFBD><05><16><1D><1D> ,<2C>A<EFBFBD> <11>L<EFBFBD>L<EFBFBD>;<3B>q<EFBFBD>c<EFBFBD>*<2A> +<2B> ,<2C><13>y<EFBFBD>y<EFBFBD><15><1F>r,N) rErFrGrHrIrJrKr<>rrLr!rDr(r,r*r<>r<>cse<00><00><14><14><14><14><1A><1A><1A><1A><18><18><18><18><18><18><18><18><18><18><18><18><14><14><14><14><1A>4<EFBFBD>0<>H<EFBFBD>d<EFBFBD>0<>  <20><13>  r,r<>c<00><><00>tjd|jtj<00>}|st d|j<00><00><02><00>|j <00>\}}t |<03>}t|<00>\}}ttj|<05>j<00><00>}d|z }t|d<00>t|d<00>z
2026-04-09 08:45:57 +01:00
dz} t|j<00><00>}
t|j<00><00>} t|j<00><00>} |
| z
dz} t|j<00><00>dz}t|
cxkxr t knc}| tk\}g}|s&|j#d|
d <09>d
td <0B>d t d <0B>d <0A><07>|s|j#d| d <09>dtd <0B>d<10><05>| t$kDr|j#d| d<12>d<13><03>|t&kDr|j#d|d<12>d<15><03>t)||t+|dz d<16>t+| d<17>t-|<05>t+|
2026-04-21 12:26:10 +01:00
d<18>t+| d<18>t+| d<18>t+| d<16>t+|d<17>|||<11><19> S)z@Analyse a 1.8 V supply rail CSV captured by the Rigol DS1202Z-E.z (\d{8}_\d{6})_pwr_(\d+)_1v8\.csvz%Filename does not match 1v8 pattern: r rurr<>r<>z Mean supply r<>z V outside spec (r5r<>z V)zSupply droops to u V — below z V spec minz Droop depth r3u6 mV — possible insufficient decoupling near MIPI PHYzRipple z mV RMS is elevatedrPrOrs) r rr<>r<>rr<>r<>r<>r<>r<>r<>r<>r!)r<>r<>r\r<>rXr<>rJrcrKrYrfr<>rwrvr<>r<>r<>r<<00>V18_DROOP_WARN_MV<4D>V18_RIPPLE_WARN_MVr<56>r<>rW)rMr<>r r<>rr]r^r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r!s r*<00>analyze_1v8_filer<65><00>s%<00><00>
2026-04-09 08:45:57 +01:00
<EFBFBD><08><08>4<>d<EFBFBD>i<EFBFBD>i<EFBFBD><12><1D><1D>O<>A<EFBFBD> <0C><18>@<40><14><19><19> <0B>L<>M<>M<><1A><18><18><1A><16>I<EFBFBD>w<EFBFBD><15>g<EFBFBD>,<2C>K<EFBFBD><1C>T<EFBFBD>?<3F>L<EFBFBD>E<EFBFBD>5<EFBFBD><18><12><17><17><15><1E>,<2C>,<2C>.<2E>/<2F>B<EFBFBD><16><12>8<EFBFBD>K<EFBFBD><19>%<25><02>)<29>$<24>u<EFBFBD>U<EFBFBD>1<EFBFBD>X<EFBFBD><EFBFBD>6<>#<23>=<3D>K<EFBFBD><19>%<25>*<2A>*<2A>,<2C>'<27>F<EFBFBD><19>%<25>)<29>)<29>+<2B>&<26>E<EFBFBD><19>%<25>)<29>)<29>+<2B>&<26>E<EFBFBD><1B>e<EFBFBD>^<5E>v<EFBFBD>-<2D>H<EFBFBD><19>%<25>)<29>)<29>+<2B>&<26><16>/<2F>M<EFBFBD><1F>6<EFBFBD>;<3B>^<5E>;<3B>I<EFBFBD><16>.<2E>(<28>J<EFBFBD><11>H<EFBFBD> <14><10><0F><0F><1A>6<EFBFBD>#<23>,<2C>'<10><1E>s<EFBFBD>#<23>3<EFBFBD>~<7E>c<EFBFBD>&:<3A>#<23> ?<3F>
<EFBFBD> <16><10><0F><0F><1F><05>c<EFBFBD>{<7B>-<2D><0E>s<EFBFBD>7K<37>;<3B> W<>
<EFBFBD><10>#<23>#<23><10><0F><0F><1A>8<EFBFBD>C<EFBFBD>.<2E>(^<5E> _<>
2026-04-20 12:13:26 +01:00
<EFBFBD><15>)<29>)<29><10><0F><0F>'<27>-<2D><03>!4<>4G<34>H<>I<> <16>#<23>%<25><1F> <0B>c<EFBFBD> 1<>1<EFBFBD>5<><1F> <0B>Q<EFBFBD>/<2F><1D>e<EFBFBD>*<2A><1F><06><01>*<2A><1F><05>q<EFBFBD>/<2F><1F><05>q<EFBFBD>/<2F><1F><08>!<21>,<2C><1F> <0A>q<EFBFBD>1<>#<23>$<24>"<22> <06>r,g<>S㥛<53>2@)<04>TLPX<50><00><>)rwr)<04>THS_EXITrr<>)rwgY@))<04> TCLK_PREPARE<52>r<>)<03>rangegC@g<00>W@)<04> TCLK_ZERO<52>r<>N)<04> TCLK_POSTr<54>r<>)rwg<><67><EFBFBD><EFBFBD>̌f@)<04>
TCLK_TRAILrr<>)rwgN@))<04> THS_PREPAREr<45>r<>)r<>gfffff<66>H@g<><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X@)<04>THS_ZEROr<4F>r<>N)<04> THS_TRAILrr<>)rwg33333SQ@)<03>b4<62>b8<62>bc<62>_DSIM_PHY_FIELDS)r<>r<>r
zTCLK_PREPARE+TCLK_ZERO)r<>r<>gfffffe@zTHS_PREPARE+THS_ZERO<52> registersc<00><><00>d<01>}g}i}|D<00>]<5D>}|jdd<03>j<00>jd<04>}|jdd<06>j<00>}t|<05>dk\r|dd nd}tj|<07>}|<08><01><> t |d
2026-04-13 15:03:47 +01:00
<EFBFBD>} |jd<0E>xsd|<05><00>}
|jd |jd<02><00>d|
<EFBFBD>d|<06><00><06>|D]<5D>\} } } }| | z | z}|tz}||| <|<0E>|jd| d<12>d|d<14>d|d<16>d<17><07><00>?|ddk(r6||dk\}|jd| d<12>d|d<14>d|d<16>d|dd<1C>d||<11><00><00>
<EFBFBD><00>}|ddk(s<01><>|d|cxkxr|dknc}|jd| d<12>d|d<14>d|d<16>d|dd<1C>d |dd<1C>d||<11><00><00> <0C><00><><00><01><>tD]G\}}}}||vs<01> ||vs<01>||||z}||k\}|jd|d!<21>d|d<16>d|d<1C>d||<11><00><00><08><00>I|S#t $r:|jd |jd<02><00>d |jd<05><00>d <0A><05>Y<00><02>9wxYw)"z<>
Decode DSIM PHY timing registers and return a list of annotated strings,
one per field, with D-PHY v1.1 spec compliance check results.
2026-04-21 12:26:10 +01:00
c<00><00>|rdSdS)Nr&u ✗ VIOLATIONr(r<>s r*r+z(_decode_dsim_registers.<locals>.<lambda><3E>s <00><00>A<EFBFBD>5<EFBFBD><00>?<3F>r,<00>address<73><00>0x<30>value<75>0x0rO<00><><EFBFBD><EFBFBD><EFBFBD>Nr<4E>r/<00> : z (parse error)r\rSz) = z z<16sz = <20>3du bc → r2z ns (combined check below)rrwrPu ns (spec ≥ r3<00> ns) r<>z ns (spec r<>z<28s)
2026-04-20 12:13:26 +01:00
<EFBFBD>get<65>lower<65>lstriprWr<>rJrXr<<00>_DSIM_BYTE_PERIOD_NS<4E>_DSIM_COMBINED_CHECKS)r<>rArB<00>field_ns<6E>reg<65>addr_str<74>val_str<74>suffix<69>fields<64>val<61>reg_name<6D>fname<6D>shift<66>mask<73>spec<65>raw<61>ns<6E>
2026-04-21 12:26:10 +01:00
pass_check<EFBFBD>fa<66>fb<66>min_ns<6E>label<65>totals r*<00>_decode_dsim_registersr<00>s<><00><00>
2026-04-13 15:03:47 +01:00
3<EFBFBD>B<EFBFBD> <0E>E<EFBFBD>!#<23>H<EFBFBD><18>$<12><03><16>7<EFBFBD>7<EFBFBD>9<EFBFBD>b<EFBFBD>)<29>/<2F>/<2F>1<>8<>8<><14>><3E><08><16>7<EFBFBD>7<EFBFBD>7<EFBFBD>e<EFBFBD>,<2C>2<>2<>4<><07>$'<27><08>M<EFBFBD>Q<EFBFBD>$6<>8<EFBFBD>B<EFBFBD>C<EFBFBD>=<3D>B<EFBFBD><06>#<23>'<27>'<27><06>/<2F><06> <11>><3E> <14> <15><15>g<EFBFBD>r<EFBFBD>"<22>C<EFBFBD>
<17>7<EFBFBD>7<EFBFBD>6<EFBFBD>?<3F>5<><02>8<EFBFBD>*<2A>o<EFBFBD><08> <0A> <0C> <0C>r<EFBFBD>#<23>'<27>'<27>)<29>,<2C>-<2D>R<EFBFBD><08>z<EFBFBD><14>g<EFBFBD>Y<EFBFBD>G<>H<>*0<> <12> &<26>U<EFBFBD>E<EFBFBD>4<EFBFBD><14><16>%<25><<3C>4<EFBFBD>'<27>C<EFBFBD><15>,<2C>,<2C>B<EFBFBD> <20>H<EFBFBD>U<EFBFBD>O<EFBFBD><13>|<7C><15> <0C> <0C>t<EFBFBD>E<EFBFBD>$<24><<3C>s<EFBFBD>3<EFBFBD>r<EFBFBD>(<28>(<28>2<EFBFBD>d<EFBFBD>)<29>Kf<4B>g<>h<><15>a<EFBFBD><17>E<EFBFBD>!<21><1F>4<EFBFBD><01>7<EFBFBD>]<5D>
<EFBFBD><15> <0C> <0C><1A>5<EFBFBD><14>,<2C>c<EFBFBD>#<23>b<EFBFBD><18><18>"<22>T<EFBFBD><19>C!<21>!%<25>a<EFBFBD><17><13> <0A>V<EFBFBD>B<EFBFBD>z<EFBFBD>N<EFBFBD>3C<33>E<01><12><16>a<EFBFBD><17>G<EFBFBD>#<23>!<21>!<21>W<EFBFBD><02>5<>d<EFBFBD>1<EFBFBD>g<EFBFBD>5<>
<EFBFBD><15> <0C> <0C><1A>5<EFBFBD><14>,<2C>c<EFBFBD>#<23>b<EFBFBD><18><18>"<22>T<EFBFBD><19>C<1D>!<21>!<21>W<EFBFBD>S<EFBFBD>M<EFBFBD><13>T<EFBFBD>!<21>W<EFBFBD>S<EFBFBD>M<EFBFBD><16><02>:<3A><0E>?O<>Q<01><12>! <12>#$<12>N$9<><0E><1F><12>R<EFBFBD><16><15> <0A><18>><3E>b<EFBFBD>H<EFBFBD>n<EFBFBD><1C>R<EFBFBD>L<EFBFBD>8<EFBFBD>B<EFBFBD><<3C>/<2F>E<EFBFBD><1E>&<26><1F>J<EFBFBD> <11>L<EFBFBD>L<EFBFBD><16>u<EFBFBD>T<EFBFBD>l<EFBFBD>#<23>e<EFBFBD>D<EFBFBD>\<5C><1F><16><03> <0C>F<EFBFBD>SU<53>V`<60>Sa<53>Rb<52>c<> <0E> <0E> <11>L<EFBFBD><4C>K<1A> <15> <11>L<EFBFBD>L<EFBFBD>2<EFBFBD>c<EFBFBD>g<EFBFBD>g<EFBFBD>i<EFBFBD>0<>1<><13>S<EFBFBD>W<EFBFBD>W<EFBFBD>W<EFBFBD>5E<35>4F<34>o<EFBFBD>V<> W<> <14> <15>s<00> H<02>?I<05>Ic<00>P<00>eZdZUdZeed<eed<eed<eed<eed<defd<08>Zy )
2026-04-20 12:13:26 +01:00
<EFBFBD>RegDumpz>DSI controller register snapshot read from device via memtool.r r<00>commandsr<73><00>errorsr"c<00>d<00>d|jd<02>d|j<00>d<04>g}|jr%|jD]}|jd|<02><00><02><00>|js"|jd<06>dj |<01>S|jdd j |j <00><00><00><02>t|j<00>}|r|j|<03>nL|jD]=}|jd
2026-04-13 15:03:47 +01:00
<EFBFBD>r d |d
2026-04-20 12:13:26 +01:00
<00>d <0C>nd }|jd|d<00>d|d<00>|<05><00><05><00>?dj |<01>S)Nr-r.r/z [reg/dsi_phy]r8z No registers capturedr9z Commands : z; r\<00> (<28>)r<>r<>r<>r<>)
2026-04-21 12:26:10 +01:00
rr rr<r<>r>rr<00>extendr<64>)r@rB<00>err<72>decoded<65>rr\s r*rDzRegDump.summary+s!<00><00><1B>D<EFBFBD>,<2C>,<2C>S<EFBFBD>1<><12>D<EFBFBD>N<EFBFBD>N<EFBFBD>3C<33>?<3F>S<>T<><05> <0F>;<3B>;<3B><1B>{<7B>{<7B> 2<><03><15> <0C> <0C>{<7B>3<EFBFBD>%<25>0<>1<> 2<><13>~<7E>~<7E> <11>L<EFBFBD>L<EFBFBD>2<> 3<><17>9<EFBFBD>9<EFBFBD>U<EFBFBD>#<23> #<23> <0A> <0C> <0C>+<2B>D<EFBFBD>I<EFBFBD>I<EFBFBD>d<EFBFBD>m<EFBFBD>m<EFBFBD>,D<>+E<>F<>G<>(<28><14><1E><1E>8<><07> <12> <11>L<EFBFBD>L<EFBFBD><17> !<21><1A>^<5E>^<5E> G<01><01>-.<2E>U<EFBFBD>U<EFBFBD>6<EFBFBD>]<5D><13>Q<EFBFBD>v<EFBFBD>Y<EFBFBD>K<EFBFBD>q<EFBFBD>)<29><02><04><15> <0C> <0C>r<EFBFBD>!<21>I<EFBFBD>,<2C><1E>s<EFBFBD>1<EFBFBD>W<EFBFBD>:<3A>,<2C>t<EFBFBD>f<EFBFBD>E<>F<> G<01><14>y<EFBFBD>y<EFBFBD><15><1F>r,N) rErFrG<00>__doc__rHrIrJrLrDr(r,r*rr"s/<00><00>H<><14><14><14><14><15><15><15><15><15><15> <20><13> r,rc <00><><00>tjd|jtj<00>}|st d|j<00><00><02><00>|j <00>\}}t j|j<00><00>}t|t|<03>|jdg<00>|jdg<00>|jd<05>xsg<00><06>S)z@Read a register JSON file saved by mipi_test._fetch_registers().<2E>(\d{8}_\d{6})_reg_(\d+)\.jsonz*Filename does not match register pattern: rr<>r)r rrr<>r) r<>r<>r\r<>rXr<><00>json<6F>loads<64> read_textrrJr<>)rMr<>r r<><00>datas r*<00>analyze_reg_filer"?s<><00><00>
2026-04-20 12:13:26 +01:00
<EFBFBD><08><08>1<>4<EFBFBD>9<EFBFBD>9<EFBFBD>b<EFBFBD>m<EFBFBD>m<EFBFBD>L<>A<EFBFBD> <0C><18>E<>d<EFBFBD>i<EFBFBD>i<EFBFBD>[<5B>Q<>R<>R<><1A><18><18><1A><16>I<EFBFBD>w<EFBFBD> <0F>:<3A>:<3A>d<EFBFBD>n<EFBFBD>n<EFBFBD>&<26> '<27>D<EFBFBD> <12><1F><19>'<27>l<EFBFBD><1A>h<EFBFBD>h<EFBFBD>z<EFBFBD>2<EFBFBD>.<2E><1A>h<EFBFBD>h<EFBFBD>{<7B>B<EFBFBD>/<2F><1A>h<EFBFBD>h<EFBFBD>x<EFBFBD>(<28>.<2E>B<EFBFBD>  <06>r,c<00><><00>eZdZUeed<eed<eed<eed<eed<eed<eed<eed<eed <eeed
<e e
<EFBFBD> <0B>Z e
ed <d efd<0E>Z y)<10>
INTMetricsr rr<>r<>rr<>r<>r<><00> int_asserted<65>asserted_duration_usrr!r"c<00><><00>d<01>}d|jd<03>d|j<00>d<05>d|jd<07>d|jd<07>d|jd<07>d <09>g}|j
r5|j rd
2026-04-21 12:26:10 +01:00
|j d <0B>d <0C>nd }|jd|<03>d<0F><03>n|jd<10>|jD]}|jd|<04><00><02><00>dj|<02>S)Nc<00><00>|rdSdSr%r(r<>s r*r+z$INTMetrics.summary.<locals>.<lambda>lr<>r,r-r.r/z [int/irq]z IRQ mean/min/max : <20>.3fz V / <20> Vrr5u µs)r<>u> IRQ status : *** ASSERTED HIGH — bridge flagged erroru *** ✗u7 IRQ status : not asserted (no bridge error) ✓r8r9)
rr r<>r<>r<>r%r&r<r!r>)r@rArB<00>dur_strrCs r*rDzINTMetrics.summaryks<><00><00> ,<2C><02><16>t<EFBFBD>'<27>'<27><03>,<2C>B<EFBFBD>t<EFBFBD>~<7E>~<7E>.><3E>k<EFBFBD> J<>#<23>D<EFBFBD>K<EFBFBD>K<EFBFBD><03>#4<>E<EFBFBD>$<24>*<2A>*<2A>S<EFBFBD>9I<39><15>t<EFBFBD>z<EFBFBD>z<EFBFBD>Z]<5D>N^<5E>^`<60> a<>
<EFBFBD><05> <10> <1C> <1C><1E>3<>3<><1D>T<EFBFBD>6<>6<>s<EFBFBD>;<3B>5<EFBFBD>A<>9;<3B> <14> <11>L<EFBFBD>L<EFBFBD>P<>QX<51>PY<50>Yb<59>c<> <0E> <12>L<EFBFBD>L<EFBFBD>R<> T<><15><1D><1D> ,<2C>A<EFBFBD> <11>L<EFBFBD>L<EFBFBD>;<3B>q<EFBFBD>c<EFBFBD>*<2A> +<2B> ,<2C><13>y<EFBFBD>y<EFBFBD><15><1F>r,N) rErFrGrHrIrJrKr<>rrrLr!rDr(r,r*r$r$YsZ<00><00><14><14><14><14><1A><1A><1A><1A><18><18> <12>N<EFBFBD> <12>N<EFBFBD> <12>N<EFBFBD><1E><1E>"<22>5<EFBFBD>/<2F>)<29><1A>4<EFBFBD>0<>H<EFBFBD>d<EFBFBD>0<> <20><13> r,r$c <00><><00>tjd|jtj<00>}|st d|j<00><00><02><00>|j <00>\}}t |<03>}t|<00>\}}ttj|<05>j<00><00>}d|z }t|d<00>t|d<00>z
2026-04-20 12:13:26 +01:00
dz} t|j<00><00>}
t|j<00><00>} t|j<00><00>} |tkD} t| j!<00><00>}d}|r)t#t| j%<00><00>|zdzd<08>}g}| d kr|
d kr|j'd
<EFBFBD>t)||t#|dz d <0B>t#| d <0C>t+|<05>t#|
2026-04-21 12:26:10 +01:00
d<08>t#| d<08>t#| d<08>|||<10> <0A> S)z%Analyse a Rigol CH2 IRQ pin CSV file.z(\d{8}_\d{6})_int_(\d+)\.csvz%Filename does not match int pattern: r rurr<>N<>g<><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?u<>IRQ pin reads ~0 V throughout — likely high-impedance (IRQ_EN=0, default). Set CSR 0xE0.0=1 and enable error bits in CSR 0xE1 to activate IRQ output.rPrO) r rr<>r<>rr<>r<>r<>r%r&r!)r<>r<>r\r<>rXr<>rJrcrKrYrfr<>rwrv<00>INT_ASSERTED_HIGH_Vr<56>r<>r<>r<>r<r$rW)rMr<>r r<>rr]r^r<>r<>r<>r<>r<>r<><00> asserted_maskr%r&r!s r*<00>analyze_int_filer0~s<><00><00>
2026-04-20 12:13:26 +01:00
<EFBFBD><08><08>0<>$<24>)<29>)<29>R<EFBFBD>]<5D>]<5D>K<>A<EFBFBD> <0C><18>@<40><14><19><19> <0B>L<>M<>M<><1A><18><18><1A><16>I<EFBFBD>w<EFBFBD><15>g<EFBFBD>,<2C>K<EFBFBD><1C>T<EFBFBD>?<3F>L<EFBFBD>E<EFBFBD>5<EFBFBD><17><02><07><07><05><0E>+<2B>+<2B>-<2D>.<2E>B<EFBFBD><15><02>(<28>K<EFBFBD><18><15>r<EFBFBD><19>#<23>e<EFBFBD>E<EFBFBD>!<21>H<EFBFBD>o<EFBFBD>5<><13><<3C>K<EFBFBD> <12>5<EFBFBD>:<3A>:<3A><<3C> <20>F<EFBFBD> <12>5<EFBFBD>9<EFBFBD>9<EFBFBD>;<3B> <1F>E<EFBFBD> <12>5<EFBFBD>9<EFBFBD>9<EFBFBD>;<3B> <1F>E<EFBFBD> <20>#6<>6<>M<EFBFBD><1F> <0A> 1<> 1<> 3<>4<>L<EFBFBD><1F><18><13>$<24>U<EFBFBD>=<3D>+<<3C>+<<3C>+><3E>%?<3F>"<22>%D<>s<EFBFBD>%J<>A<EFBFBD>N<><1C><11>H<EFBFBD> <0C>s<EFBFBD>{<7B>v<EFBFBD><03>|<7C><10><0F><0F>Y<01>
<EFBFBD>
<16>(<28>*<2A>$<24>[<5B>3<EFBFBD>%6<><01>:<3A>$<24>[<5B>!<21>4<>"<22>5<EFBFBD>z<EFBFBD>$<24>V<EFBFBD>Q<EFBFBD>/<2F>$<24>U<EFBFBD>A<EFBFBD><EFBFBD>$<24>U<EFBFBD>A<EFBFBD><EFBFBD>+<2B>3<>'<27> <06> r,<00>data_dirc<00>p<00>tjdtj<00>}tjdtj<00>}i}t|j d<03><00>D]\}|j |j <00>}|s<01>!|j<00>\}}}} |t|<08>f}
2026-04-09 11:03:35 +01:00
||j|
i<00>|<07>d| <09><00><<00>^t|j d<05><00>D]U}|j |j <00>}|s<01>!|j<00>\}}|t|<08>f}
||j|
i<00>d<<00>W|S)u
2026-04-08 12:55:34 +01:00
Scan data_dir and group CSV files by (timestamp, capture_number).
Returns dict mapping (timestamp, num) → {file_type_channel: Path}.
Example key: ("20260408_111448", 1)
Example value: {"sig_clk": Path(...), "sig_dat": ..., "proto_clk": ..., "proto_dat": ...}
2026-04-20 12:13:26 +01:00
z9(\d{8}_\d{6})_(sig|proto|lp|pwr)_(\d+)_(clk|dat|1v8)\.csvr<00>*.csv<73>_z*.jsonr<6E>)
r<EFBFBD><00>compiler<65><00>sorted<65>globr<62>r\r<>rJ<00>
2026-04-21 12:26:10 +01:00
setdefault) r1<00> csv_pattern<72> reg_patternr<6E>r_r<><00>ts<74>ftyper<65><00>ch<63>keys r*<00>group_capturesr?<00>s)<00><00><15>*<2A>*<2A>D<>b<EFBFBD>m<EFBFBD>m<EFBFBD><06>K<EFBFBD><15>*<2A>*<2A>(<28>"<22>-<2D>-<2D><06>K<EFBFBD>68<36>F<EFBFBD> <13>H<EFBFBD>M<EFBFBD>M<EFBFBD>'<27>*<2A> +<2B>8<><01> <17> <1D> <1D>a<EFBFBD>f<EFBFBD>f<EFBFBD> %<25><01><10> <14>!"<22><18><18><1A><1E><02>E<EFBFBD>7<EFBFBD>B<EFBFBD><11>3<EFBFBD>w<EFBFBD><<3C> <20><03>67<36><06><19><19>#<23>r<EFBFBD>"<22>e<EFBFBD>W<EFBFBD>A<EFBFBD>b<EFBFBD>T<EFBFBD>?<3F>3<> 8<><14>H<EFBFBD>M<EFBFBD>M<EFBFBD>(<28>+<2B> ,<2C>.<2E><01> <17> <1D> <1D>a<EFBFBD>f<EFBFBD>f<EFBFBD> %<25><01><10> <14><17>h<EFBFBD>h<EFBFBD>j<EFBFBD> <0B><02>G<EFBFBD><11>3<EFBFBD>w<EFBFBD><<3C> <20><03>,-<2D><06><19><19>#<23>r<EFBFBD>"<22>5<EFBFBD>)<29> .<2E> <12>Mr,c<00><00>eZdZUeed<eed<eed<eed<eed<eed<eeed<eeed<eeed <eeed
2026-04-20 12:13:26 +01:00
<eed <eeed <eeed <eed<dZ eeed<dZ
eed<e e <0C><13>Z e ed<defd<16>Zy)<17> LPMetricsr rrrr<>r<00>lp11_voltage_v<5F>lp11_duration_us<75> lp11_to_hs_ns<6E>lp_low_duration_ns<6E> n_hs_bursts<74>hs_burst_dur_ns<6E>hs_amplitude_mv<6D>lp_transition_validN<64>clk_lp_startup_okF<6B>flicker_suspectrr!r"c <00><><00>d<01>}d|jd<03>d|j<00>d|j<00>d<06>g}|j<00>Zt|jcxkxr t
2026-04-08 12:55:34 +01:00
knc}|j d|jd<08>d td
<EFBFBD>d t
2026-04-21 12:26:10 +01:00
d <0C>d ||<03><00><00><08>|j<00> |j d|jd <0C>d<0F><03>|j<00>C|jtk\}|j d|jd<11>dtd<11>d||<04><00><00><06>|j<00>q|jdk(rB|jtk\}|j d|jd<11>dtd<11>d|rdnd<18><00><06>n |j d|jd<11>d<1A><03>|j<00>"|j d|jrdnd<1D><00><02>|j d|jrdnd <20><00><02>|jr>|j d!|j<00><00>|jrd"|jd<11>d<1A>nd#z<00>|j <00> |j d$|j d<11>d%<25><03>|j"r<>|js|js|j d&<26>n<>|j <00>i|j t$krV|j<00>J|jtk\r7|j d'|j d<11>d(t$d<11>d)|jd<11>d*<2A><07>n|j d+t&d<11>d,<2C><03>|j(D]}|j d-|<06><00><02><00>d.j+|<02>S)/Nc<00><00>|rdSdSr%r(r<>s r*r+z#LPMetrics.summary.<locals>.<lambda><3E>r<>r,r-r.r/z [lp/r1z LP-11 voltage : r)r<>r3r<>r5r<>z LP-11 duration : u µsu LP exit → HS : r7u ns (spec ≥r<E289A5>r<>z LP-00 (CLK) : z ns for bridge CLK lock) r&r'z LP-low plateau : z nsz CLK startup : uok ✓u)*** SHORT — bridge may not lock CLK ✗u LP→HS sequence : u valid ✓uNOT DETECTED ✗z HS bursts : z avg r<>z HS amplitude : z mV (single-ended p-p/2)uP *** FLICKER SUSPECT: MIPI link silent — no LP-11, LP-low, or HS detected ***z2 *** FLICKER SUSPECT: HS burst absent (amplitude z mV < z mV, lp11_to_hs=z ns) ***z2 *** FLICKER SUSPECT: LP-low plateau absent or < z ns ***r8r9)rr rrB<00>LP11_SPEC_MIN_V<5F>LP11_SPEC_MAX_Vr<rCrD<00>LP_LOW_DUR_MIN_NSrE<00>CLK_LP_LOW_MIN_NSrJrIrFrGrHrK<00>HS_BURST_AMPLITUDE_MIN_MV<4D>FLICKER_LP_LOW_MAX_NSr!r>)r@rArB<00>in_spec<65>ok_exit<69>ok_clkrCs r*rDzLPMetrics.summary<72>sw<00><00> ,<2C><02><16>t<EFBFBD>'<27>'<27><03>,<2C>B<EFBFBD>t<EFBFBD>~<7E>~<7E>.><3E>f<EFBFBD>T<EFBFBD>\<5C>\<5C>N<EFBFBD>RS<52> T<>
2026-04-20 12:13:26 +01:00
<EFBFBD><05> <10> <1E> <1E> *<2A>%<25><14>)<<3C>)<<3C>O<><0F>O<>G<EFBFBD> <11>L<EFBFBD>L<EFBFBD>&<26>t<EFBFBD>':<3A>':<3A>3<EFBFBD>&?<3F>@<19>(<28><13>-<2D>S<EFBFBD><1F><13>0E<30>U<EFBFBD>2<EFBFBD>g<EFBFBD>;<3B>-<2D>Y<01> <0E> <10> <20> <20> ,<2C> <11>L<EFBFBD>L<EFBFBD>/<2F><04>0E<30>0E<30>c<EFBFBD>/J<>$<24>O<> P<> <0F> <1D> <1D> )<29><1A>(<28>(<28>,=<3D>=<3D>G<EFBFBD> <11>L<EFBFBD>L<EFBFBD>(<28><14>);<3B>);<3B>C<EFBFBD>(@<40>A<1C>-<2D>c<EFBFBD>2<>&<26><12>G<EFBFBD><1B> <0A>G<01> <0E> <10> "<22> "<22> .<2E><13>|<7C>|<7C>u<EFBFBD>$<24><1D>0<>0<>4E<34>E<><06><15> <0C> <0C>*<2A>4<EFBFBD>+B<>+B<>3<EFBFBD>*G<>H <20> 1<>#<23>6<>6P<36> &<26>u<EFBFBD>E<EFBFBD>2<>4<><12> <16> <0C> <0C>3<>D<EFBFBD>4K<34>4K<34>C<EFBFBD>3P<33>PS<50>T<>U<> <0F> !<21> !<21> -<2D> <11>L<EFBFBD>L<EFBFBD>&<26>4<EFBFBD>3I<33>3I<33>x<EFBFBD>Oz<4F>&{<7B>|<7C> <0E> <0E> <0C> <0C>$<24>D<EFBFBD>4L<34>4L<34>[<5B>Rd<52>$e<> f<>
2026-04-21 12:26:10 +01:00
<EFBFBD> <10> <1B> <1B> <11>L<EFBFBD>L<EFBFBD>/<2F><04>0@<40>0@<40>/A<>B<>FJ<46>FZ<46>FZ<46>f<EFBFBD>T<EFBFBD>%9<>%9<>#<23>$><3E>c<EFBFBD>B<>`b<>d<01> e<01> <0F> <1F> <1F> +<2B> <11>L<EFBFBD>L<EFBFBD>/<2F><04>0D<30>0D<30>S<EFBFBD>/I<>Ia<49>b<> c<> <0F> <1F> <1F><17>+<2B>+<2B>D<EFBFBD>4G<34>4G<34><15> <0C> <0C>f<><12><17>&<26>&<26>2<><1C>,<2C>,<2C>/H<>H<><1C>*<2A>*<2A>6<><1C>*<2A>*<2A>.?<3F>?<3F><15> <0C> <0C>"<22>"&<26>"6<>"6<>s<EFBFBD>!;<3B>6<EFBFBD>B[<5B>\_<>A`<60>a"<22>"&<26>"4<>"4<>S<EFBFBD>!9<><18>C<01><12> <16> <0C> <0C>H<>I^<5E>_b<5F>Hc<48>cj<63>k<><12><16><1D><1D> ,<2C>A<EFBFBD> <11>L<EFBFBD>L<EFBFBD>;<3B>q<EFBFBD>c<EFBFBD>*<2A> +<2B> ,<2C><13>y<EFBFBD>y<EFBFBD><15><1F>r,)rErFrGrHrIrJrKrr<>rJrKrrLr!rDr(r,r*rArA<00>s<><00><00><14><14><14><14><14><14><1B><1B><1B><1B><19><19> <20><05><EFBFBD>&<26><1F><05><EFBFBD>&<26>!<21><15><0F>'<27> <20><15><0F>'<27><1C><1B> <20><15><0F>'<27> <20><15><0F>'<27><1D><1D> )-<2D><15>x<EFBFBD><04>~<7E>,<2C>
2026-04-20 12:13:26 +01:00
"<22>O<EFBFBD>T<EFBFBD>!<21><1A>4<EFBFBD>0<>H<EFBFBD>d<EFBFBD>0<>= <20><13>= r,rA<00>arr<72>windowc <00>d<00>ddlm}t|<00>}||kr$tj||j <00><00>S|||<01>}|j d<03><04>}|dz}|t|<05>z
2026-04-08 12:55:34 +01:00
|z
2026-04-21 12:26:10 +01:00
}tj tj||d<00>|tj||d<00>g<03>S)zKCompute rolling standard deviation using stride_tricks (O(n) memory, fast).r)<01>sliding_window_viewrP)<01>axisrOru)<07>numpy.lib.stride_tricksrZrWrY<00>fullr<6C><00> concatenate)rWrXrZ<00>n<>windowed<65>stds<64>pad_l<5F>pad_rs r*<00> _rolling_stdrd7s<><00><00>;<3B> <0B>C<EFBFBD><08>A<EFBFBD><08>F<EFBFBD>{<7B><11>w<EFBFBD>w<EFBFBD>q<EFBFBD>#<23>'<27>'<27>)<29>$<24>$<24>"<22>3<EFBFBD><06>/<2F>H<EFBFBD> <13><<3C><<3C>Q<EFBFBD><<3C> <1F>D<EFBFBD> <12>a<EFBFBD>K<EFBFBD>E<EFBFBD> <0A><03>D<EFBFBD> <09>M<EFBFBD>E<EFBFBD> !<21>E<EFBFBD> <0A>><3E>><3E>2<EFBFBD>7<EFBFBD>7<EFBFBD>5<EFBFBD>$<24>q<EFBFBD>'<27>2<>D<EFBFBD>"<22>'<27>'<27>%<25><14>b<EFBFBD><18>:R<>S<> T<>Tr,r<00> min_samplesc<00>f<00>tjdg|dgg<03>}tj|jtj<00><00>}tj
2026-04-08 12:55:34 +01:00
|dk(<00>d}tj
|dk(<00>d}t ||<05>D<00><06>cgc]\}}||z
2026-04-21 15:38:17 +01:00
|k\s<01>||f<02><02>c}}Scc}}w)uGReturn list of (start_idx, end_idx) for True runs ≥ min_samples long.FrPrru)rYr^rf<00>astype<70>int8rg<00>zip)rre<00>paddedrf<00>starts<74>endsrr<>s r*<00>_find_contiguous_regionsrmEs<><00><00> <0F>^<5E>^<5E>e<EFBFBD>W<EFBFBD>d<EFBFBD>U<EFBFBD>G<EFBFBD>4<> 5<>F<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>6<EFBFBD>=<3D>=<3D><12><17><17>)<29> *<2A>D<EFBFBD> <0F>X<EFBFBD>X<EFBFBD>d<EFBFBD>a<EFBFBD>i<EFBFBD> <20><11> #<23>F<EFBFBD> <0F>X<EFBFBD>X<EFBFBD>d<EFBFBD>b<EFBFBD>j<EFBFBD> !<21>!<21> $<24>D<EFBFBD>"<22>6<EFBFBD>4<EFBFBD>0<> K<>t<EFBFBD>q<EFBFBD>!<21>Q<EFBFBD><11>U<EFBFBD>{<7B>4J<34>Q<EFBFBD><01>F<EFBFBD> K<>K<><4B> Ks <00>B-<06>#B-c <00><> <00>2<EFBFBD>tjd|jtj<00>}|st d|j<00><00><02><00>|j <00>\}}}t |<03>}t|<00>\<00>2}ttj<00>2<EFBFBD>j<00><00>}d|z }t<00>2d<00>t<00>2d<00>z
2026-04-08 14:19:31 +01:00
dz} |tkD}
t|
d<07><08>} d } d } | rmtttj| D<00><0E>cgc]
\}}|||<00><02> c}}<0E>j<00><00>d
2026-04-20 12:13:26 +01:00
<EFBFBD>} tt!<00>2fd <0B>| D<00><00>dzd
<EFBFBD>} d }d }d }d}d }d }t#| <0B>d k\<00>rnt%dt d|z <00><00>}t'||<16>}g}t)| <0B>D]v\}\}}|d zt#| <0B>kr | |d zdn t#<00>2<EFBFBD>d z
}t+|t#<00>2<EFBFBD>d z
<00>}t<00>2|<00>2|z
2026-04-16 11:23:25 +01:00
dzd <0A>}|j-|||f<03><00>x|<18>rTt#|<18>}tttj|D<00><1F> cgc]\}}} | <20><02>
2026-04-20 12:13:26 +01:00
c} }<1F><00>d <0A>}d}| dd }!t+|!t d|z <00>zt#<00>2<EFBFBD>d z
<00>}"tj.||!|"t0k\<00>d}#t#|#<23>rt<00>2|!|#dz<00>2|!z
dzd <0A>}|t2k|t0kz}$t%dt d|z <00><00>}%t|$|%<25><08>}&t d|z <00>}'|&D]F\}(})|!|(cxkr |!|'zks<01>n<00>t<00>2t+|)t#<00>2<EFBFBD>d z
<00><00>2|(z
2026-04-17 11:27:41 +01:00
dzd <0A>}n|rk|d\}}}|||}*t#|*<2A>dk\rOtttj4|*d<16><00>ttj4|*d<12><00>z
2026-04-21 15:38:17 +01:00
dz dzd <0A>}g}+| xr'|dk(xr t|j%<00><00>tk},|,r|+j-d<19>nb| s|+j-d<1A>nN| <0C>L| t6kr|+j-d| d<1C>dt6<00>d<1E><05>| t8kDr|+j-d| d<1C>dt8<00>d<1E><05>|<10>'|t:kr|+j-d |d!<21>d"t:d!<21>d#<23><05>|,s)|s|+j-d$<24>|dk(r|+j-d%<25>d }-|dk(r-| r+|<11>)|t<k\}-|-s|+j-d&|d!<21>d't<d!<21>d(<28><05>|d uxr|d)k}.|d uxrY|t>kxrN|d uxr(|t:k\xr|t@k\xr|d uxs ||tBzkDxs|d uxs|.xs|d uxr|t:kxr|. }/|d*k(xr|, xr| }0|d*k(xr|0xs |xr|d uxs|/}1tEd<id+|<02>d,|<05>d-|<04>d.t|dz d <0A><00>d/t| d<15><00>d0t#<00>2<EFBFBD><00>d1| <0C>d2| <0A>d3|<10>d4|<11>d5|<13>d6|<14>d7|<15>d8|<12>d9|-<2D>d:|1<>d;|+<2B><01>Scc}}wcc} }w)=u<>
2026-04-08 12:55:34 +01:00
Analyse a single-ended LP capture CSV (Ch1 or Ch3) and return LPMetrics.
State classification per sample:
LP-11 : voltage > LP11_HIGH_V (~1.2 V, both pins high)
LP-low : voltage < LP_LOW_V (~0 V, pin driven low — LP-01 or LP-00)
HS : voltage in mid-range with high oscillation (rolling std > HS_OSC_STD_V)
trans : everything else (transitions between states)
2026-04-20 12:13:26 +01:00
z%(\d{8}_\d{6})_lp_(\d+)_(clk|dat)\.csvz$Filename does not match lp pattern: r rurr<>r<>)reNr-c3<00>f<00>K<00>|](\}}<02>t|t<00><03>dz
2026-04-16 11:23:25 +01:00
<00><00>|z
2026-04-21 12:26:10 +01:00
<00><01><00>*y<01>w)rPN)rwrW)<04>.0rr<>r]s <20>r*<00> <genexpr>z"analyze_lp_file.<locals>.<genexpr>os:<00><><00><><00>*<2A><18>A<EFBFBD>q<EFBFBD><17>s<EFBFBD>1<EFBFBD>c<EFBFBD>%<25>j<EFBFBD>1<EFBFBD>n<EFBFBD>-<2D>.<2E><15>q<EFBFBD><18>9<>*<2A>s<00>.1FrPg<><67>&<26> .>r<>Tg<54><67><EFBFBD><EFBFBD><EFBFBD>Ơ><3E>g:<3A>0<EFBFBD><30>y5>g<><67><EFBFBD><EFBFBD><EFBFBD>ư>rO<00>_i<>r<>uCCLK lane is in continuous HS mode — LP states not expected on CLKz)No LP-11 state detected in capture windowzLP-11 voltage r)z V below spec min r*z V above spec max zLP exit duration r7z ns below spec min u5 ns — LP-01/LP-00 states may be absent or too briefu8LP-11 → LP-low → HS transition sequence not detectedz)No HS bursts detected after LP transitionz
2026-04-20 16:56:41 +01:00
CLK LP-00 z ns < uL ns (TCLK_PREPARE+TCLK_ZERO minimum) — SN65DSI83 may fail to lock CLK lanegi@<40>datr rrrr<>rrBrCrDrErFrGrHrIrJrKr!r()#r<>r<>r\r<>rXr<>rJrcrKrYrfr<><00> LP11_HIGH_Vrmr<>r^r<>rWrvrd<00> enumeraterwr<rg<00> HS_OSC_STD_V<5F>LP_LOW_V<5F>
2026-04-21 12:26:10 +01:00
percentilerNrOrPrQrR<00>HS_MODE_A_MIN_MV<4D>LP_LOW_HS_ONSET_MARGIN_NSrA)3rMr<>r r<>rrr^r<>r<>r<><00> lp11_mask<73> lp11_regionsrBrCrr<>rDrErIrFrGrHrX<00>rstd<74> hs_burstsrl<00>lp11_s<5F>lp11_e<5F> burst_end<6E>
2026-04-21 15:38:17 +01:00
lp11_e_idx<EFBFBD> burst_dur_nsr4<00>d<>s_end<6E> lookahead<61> high_std_idx<64> lp_low_mask<73> _min_lp_low<6F>lp_low_regions<6E> exit_window<6F>lplow_s<5F>lplow_e<5F> burst_voltsr!<00>continuous_hs_clkrJ<00> _lp_low_short<72>hs_burst_absent<6E> link_silentrKr]s3 @r*<00>analyze_lp_filer<65>Nse<00><><00> <0B><08><08>9<>4<EFBFBD>9<EFBFBD>9<EFBFBD>b<EFBFBD>m<EFBFBD>m<EFBFBD>T<>A<EFBFBD> <0C><18>?<3F><04> <09> <09>{<7B>K<>L<>L<>"#<23>(<28>(<28>*<2A><1F>I<EFBFBD>w<EFBFBD><07><15>g<EFBFBD>,<2C>K<EFBFBD><1C>T<EFBFBD>?<3F>L<EFBFBD>E<EFBFBD>5<EFBFBD><18><12><17><17><15><1E>,<2C>,<2C>.<2E>/<2F>B<EFBFBD><16><12>8<EFBFBD>K<EFBFBD><19>%<25><02>)<29>$<24>u<EFBFBD>U<EFBFBD>1<EFBFBD>X<EFBFBD><EFBFBD>6<>#<23>=<3D>K<EFBFBD><19>;<3B>&<26>I<EFBFBD>+<2B>I<EFBFBD>2<EFBFBD>F<>L<EFBFBD><1B>N<EFBFBD><1B><14><13> <20><15>r<EFBFBD>~<7E>~<7E>$0<> 1<>D<EFBFBD>A<EFBFBD>q<EFBFBD>U<EFBFBD>1<EFBFBD>Q<EFBFBD>Z<EFBFBD> 1<>(3<>37<33>4<EFBFBD>6<EFBFBD>";<3B><=<3D>?<3F><0E> <20> <0F>*<2A>(<28>*<2A> *<2A>,/<2F> 0<>12<31>4<><18><1C>M<EFBFBD><1D><16><1F><17><18>K<EFBFBD><1B>O<EFBFBD><1B>O<EFBFBD>
2026-04-17 11:27:41 +01:00
<EFBFBD><<3C><18>A<EFBFBD><1D><15>R<EFBFBD><13>T<EFBFBD>B<EFBFBD>Y<EFBFBD><1E>(<28><06><1B>E<EFBFBD>6<EFBFBD>*<2A><04><16> <09>#,<2C>\<5C>#:<3A> D<01> <1F>A<EFBFBD><1F><06><06>23<32>a<EFBFBD>%<25>#<23>l<EFBFBD>:K<>2K<32> <0C>Q<EFBFBD><11>U<EFBFBD>+<2B>A<EFBFBD>.<2E>QT<51>UZ<55>Q[<5B>^_<>Q_<51>I<EFBFBD><1C>V<EFBFBD>S<EFBFBD><15>Z<EFBFBD>!<21>^<5E>4<>J<EFBFBD> <20>%<25> <09>"2<>U<EFBFBD>:<3A>5F<35>"F<>#<23>!M<>q<EFBFBD>Q<>L<EFBFBD> <15> <1C> <1C>j<EFBFBD>)<29>\<5C>B<> C<>  D<01> <15>"<22>9<EFBFBD>~<7E>K<EFBFBD>$<24>U<EFBFBD>2<EFBFBD>7<EFBFBD>7<EFBFBD>Y<EFBFBD>3O<33>'<27>!<21>Q<EFBFBD><01>A<EFBFBD>3O<33>+P<>%Q<>ST<53>U<>O<EFBFBD>"&<26> <1F>!<21><11>O<EFBFBD>A<EFBFBD>&<26>E<EFBFBD><1B>E<EFBFBD>C<EFBFBD><06><12> <0B>$4<>4<>c<EFBFBD>%<25>j<EFBFBD>1<EFBFBD>n<EFBFBD>E<>I<EFBFBD><1D>8<EFBFBD>8<EFBFBD>D<EFBFBD><15>y<EFBFBD>$9<>\<5C>$I<>J<>1<EFBFBD>M<>L<EFBFBD><12><<3C> <20> %<25>u<EFBFBD>U<EFBFBD>\<5C>!<21>_<EFBFBD>-D<>'E<><05>e<EFBFBD> <0C>'T<>X[<5B>&[<5B>]^<5E> _<> <0A>!<21>8<EFBFBD>+<2B><04>|<7C>0C<30>D<>K<EFBFBD><1E>a<EFBFBD><13>T<EFBFBD>B<EFBFBD>Y<EFBFBD><1E>0<>K<EFBFBD>5<>k<EFBFBD>{<7B>[<5B>N<EFBFBD><1D>d<EFBFBD>R<EFBFBD>i<EFBFBD>.<2E>K<EFBFBD>$2<> <1A> <20><07><17><18>G<EFBFBD>:<3A>u<EFBFBD>{<7B>':<3A>:<3A>).<2E><1E>s<EFBFBD>7<EFBFBD>C<EFBFBD><05>J<EFBFBD><11>N<EFBFBD>;<3B><<3C>u<EFBFBD>W<EFBFBD>~<7E>M<>QT<51>T<>VW<56>*Y<01>&<26><19>  <1A> <15><1F><01>l<EFBFBD>G<EFBFBD>A<EFBFBD>q<EFBFBD>!<21><1F><01>!<21>*<2A>K<EFBFBD><12>;<3B><1F>1<EFBFBD>$<24>"'<27><1A>2<EFBFBD>=<3D>=<3D><1B>b<EFBFBD>9<>:<3A><1A>2<EFBFBD>=<3D>=<3D><1B>a<EFBFBD>8<>9<>:<3A>=><3E>?<3F>AE<41>F<01>GH<47>#<12><0F> <12>H<EFBFBD>)<29>)<29>h<><07>5<EFBFBD>0@<40>h<>u<EFBFBD>U<EFBFBD>Y<EFBFBD>Y<EFBFBD>[<5B>GY<47>\g<>Gg<47><15><18><10><0F><0F>]<5D>^<5E> <19><10><0F><0F>C<>D<> <17> #<23> <19>O<EFBFBD> +<2B> <14>O<EFBFBD>O<EFBFBD>n<EFBFBD>^<5E>C<EFBFBD>,@<40>@R<>Sb<53>Rc<52>ce<63>f<> g<> <19>O<EFBFBD> +<2B> <14>O<EFBFBD>O<EFBFBD>n<EFBFBD>^<5E>C<EFBFBD>,@<40>@R<>Sb<53>Rc<52>ce<63>f<> g<><14> <20>]<5D>5F<35>%F<><10><0F><0F><1F> <0A>c<EFBFBD>2<>2E<32>FW<46>X[<5B>E\<5C>]@<01> A<01>
2026-04-08 14:19:31 +01:00
<EFBFBD>
2026-04-20 16:06:01 +01:00
<1D>"<22> <14>O<EFBFBD>O<EFBFBD>V<> W<> <16>!<21> <1B> <14>O<EFBFBD>O<EFBFBD>G<> H<>)-<2D><15><0E>%<25><17>L<EFBFBD>-?<3F>-K<>.<2E>2C<32>C<><19> <20> <14>O<EFBFBD>O<EFBFBD><1C>/<2F><03>4<>F<EFBFBD>;L<>S<EFBFBD>:Q<>R[<01>\<01> <0E>B <1B>$<24>&<26> '<27> <1E><15> &<26><12>
2026-04-21 15:38:17 +01:00
<18>t<EFBFBD>#<23>
<EFBFBD> <1B>7<> 7<>
<EFBFBD><1B>$<24> &<26>U<01>=<3D><M<>+M<>U<01> <20>$4<>4<>U<01>$<24><04>,<2C>T<01>"<22>%7<>:S<>%S<>S<> '<27> <1D><04>$<24>  '<27><1D> '<27><1E>T<EFBFBD>)<29>&<26>!<21>$5<>5<>&<26>%<25>%<25>3<14>< <10>5<EFBFBD><18> <1D>!<21> !<21> <1D><1C> <1C><10> <10>5<EFBFBD><18>
2026-04-21 12:26:10 +01:00
<EFBFBD> <17> <0E>#<23><12> '<27>$<24>.<2E>'<27>&<26><14>$ <15> <06>(<28> <06>*<2A> <06> '<27> <06> %<25>[<5B>3<EFBFBD>%6<><01>:<3A>  <06>
2026-04-21 15:38:17 +01:00
%<25>[<5B>!<21>4<>  <06> #<23>5<EFBFBD>z<EFBFBD>  <06> .<2E> <06> 0<> <06> -<2D> <06> 2<> <06> +<2B> <06> /<2F> <06> /<2F> <06> 3<> <06> 1<> <06> /<2F>! <06>" (<28># <06><06><>w 2<><32>F4Ps <00>W3<12> W9<12>__main__r!rPr3r<><00>_lp_zERROR z: )<01><)rr)OrrUrr<><00>numpyrY<00> dataclassesrr<00>pathlibr<00>typingr<00> V18_NOMINAL_Vr<56>r<>r<>r<>r:r;r=r<>rurxrNrOrPrwr{rSrQrRrzr <00>tuple<6C>ndarrayrcrnrKrJrLr<>r<>r<>r<>r<>r<><00>dictrHrIr<>rrr"r.r$r0r?rArdrmr<>rE<00>sys<79>__file__<5F>parentr1rW<00>argv<67>filesr6r7r_r\<00>result<6C>printrD<00> Exceptionr<6E>)<01>as0r*<00><module>r<>s<><00><01><04>" <0B> <0B> <09><12>(<28><18><1B><18> <0A><17><0E><17><0E><19><11><19><12><19><0F><18><0F><18><10><1A><12><17> <0B><17><08><18><0F><18><0F><18><11><19> <0C>!<21><19><1D><15><1A><11> !<21><19> <18><10> <0B>= <20>= <20> <0B>= <20>H<10>D<EFBFBD><10>U<EFBFBD>2<EFBFBD>:<3A>:<3A>r<EFBFBD>z<EFBFBD>z<EFBFBD>#9<>:<3A><10>"
2026-04-08 12:55:34 +01:00
<18>2<EFBFBD>:<3A>:<3A>
<18>b<EFBFBD>j<EFBFBD>j<EFBFBD>
<18>R<EFBFBD>Z<EFBFBD>Z<EFBFBD>
<18>,.<2E>+<1C>B<EFBFBD>J<EFBFBD>J<EFBFBD>+<1C>r<EFBFBD>z<EFBFBD>z<EFBFBD>+<1C>"<22>+<1C>+0<>+<1C>%(<28>+<1C>27<32><04>d<EFBFBD>
2026-04-21 15:38:17 +01:00
<EFBFBD>2C<EFBFBD>+<1C>dA<06>t<EFBFBD>A<06><0E>A<06>H <0B> <20> <20> <0B> <20>D5<06>4<EFBFBD>5<06>M<EFBFBD>5<06>|<1E><14> -<2D>-<2D> <06> <06>  <06>%<02><10>$<24>s<EFBFBD>D<EFBFBD>y<EFBFBD>/<2F><02>.D<01>A<><02><15> 8<11>d<EFBFBD>8<11>t<EFBFBD>C<EFBFBD>y<EFBFBD>8<11>v <0B> <20> <20> <0B> <20>8 <06>4<EFBFBD> <06>I<EFBFBD> <06>.<1A><13> <0B>! <20>! <20> <0B>! <20>H*<06>4<EFBFBD>*<06>L<EFBFBD>*<06>Z<12>T<EFBFBD><12>d<EFBFBD>5<EFBFBD><13>c<EFBFBD><18>?<3F>D<EFBFBD><13>d<EFBFBD><19>O<EFBFBD>+K<>&L<><12>L <0B>b <20>b <20> <0B>b <20>J U<01>b<EFBFBD>j<EFBFBD>j<EFBFBD> U<01>#<23> U<01>"<22>*<2A>*<2A> U<01>L<01>2<EFBFBD>:<3A>:<3A>L<01>C<EFBFBD>L<01>l<06>$<24>l<06>;<3B>l<06>^ <0C>z<EFBFBD><19><0E><13>H<EFBFBD>~<7E>$<24>$<24>v<EFBFBD>-<2D>H<EFBFBD>
2026-04-08 12:55:34 +01:00
<EFBFBD>3<EFBFBD>8<EFBFBD>8<EFBFBD>}<7D>q<EFBFBD><18>"%<25>(<28>(<28>1<EFBFBD>2<EFBFBD>,<2C>/<2F>Q<EFBFBD><14>a<EFBFBD><17>/<2F><05><16>x<EFBFBD>}<7D>}<7D>W<EFBFBD>-<2D>.<2E>r<EFBFBD><01>2<><05> <12> *<2A><01> *<2A><15><11><16><16><1F>(<28><11>+<2B><06>%<25>a<EFBFBD><1F><06> <11>&<26>.<2E>.<2E>"<22> #<23> <11>G<EFBFBD> *<2A><1A><>
2026-04-21 12:26:10 +01:00
0<><30><19> *<2A> <11>F<EFBFBD>1<EFBFBD>6<EFBFBD>6<EFBFBD>(<28>"<22>Q<EFBFBD>C<EFBFBD>(<28> )<29> )<29><> *<2A>s<00>,I<04><I$<02>$J <05>)J<05>J