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

175 lines
32 KiB
Plaintext
Raw Normal View History

2026-04-08 12:55:34 +01:00
<EFBFBD>
2026-04-09 10:29:53 +01:00
<00>_<EFBFBD>i\s<00><00>P<00>dZddlZddlZddlZddlmZmZddlm Z ddl
2026-04-08 12:55:34 +01:00
m Z dZ dZ dZd Zd
2026-04-09 08:45:57 +01:00
Zd Zd Zd Zd ZdZdZdZdZd ZdZeGd<13>d<14><00>Zde deej:ej:ffd<17>Zdej:dej:dej:fd<1A>Z d6dej:dej:de de de!dee"e"ff d<1E>Z#de defd<1F>Z$eGd <20>d!<21><00>Z%de dd!fd"<22>Z&d#e de'ee(e!fe'e(e fffd$<24>Z)eGd%<25>d&<26><00>Z*d'ej:d(e!dej:fd)<29>Z+d7d*ej:d+e!fd,<2C>Z,de dd&fd-<2D>Z-e.d.k(r<>ddl/Z/e e0<65>jbd/z Z2e3e/jh<00>d0kDr$e/jhd0dD<00>cgc]
}e |<00><00><02> c}Z5ne6e2jod1<64><00>dd2Z5e5D]?Z8 d3e8jrvr e-e8<65>Z:ne$e8<65>Z:e;e:jy<00><00>e;<3B><00>Ayycc}w#e=$r"Z>e;d4e8jr<00>d5e><3E><00><04>YdZ>[><3E>kdZ>[>wwxYw)8uF
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=
ףp=<3D>?gI@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=
<EFBFBD>?c<00>$<00>eZdZUeed<eed<eed<eed<eed<eed<eed<eed<eed <eed
<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-09 08:45:57 +01:00
d<1D>d<1E><05>|j&D]}|jd|<03><00><02><00>d j)|<02>S)!Nc<00><00>|rdSdS<00>Nu✓u<>)<01>conds <20>5/home/david-rice/Python/MiPi_Test/csv_preprocessor.py<70><lambda>z(ChannelMetrics.summary.<locals>.<lambda>Rs <00><00>4<EFBFBD>%<25><00>U<EFBFBD><00><00>Capture <20>04d<34> z [<5B>/<2F>]z Vdiff amplitude : z6.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>
)r r r rr<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.summaryQs6<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-08 12:55:34 +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-09 08:45:57 +01:00
__module__<EFBFBD> __qualname__<5F>str<74>__annotations__<5F>int<6E>floatrrrrrrrrr<00>listrr?r$r(r&r
2026-04-08 12:55:34 +01:00
r
2026-04-09 08:45:57 +01:00
3s<><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
2026-04-09 10:29:53 +01:00
<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 z (z rows parsed)) <0B>open<65>csv<73>reader<65>lenr7rF<00>
ValueError<EFBFBD>np<6E>array<61>float64<36>name)rH<00>times<65>volts<74>f<>row<6F>t<>vs r&<00> _read_csvr]xs<><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>
<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>
D <07> D<03>DrWrXc<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-09 10:29:53 +01:00
|<05>S)zDReturn array of linearly-interpolated zero-crossing times (seconds).rrK)rS<00>sign<67>diff<66>wherer7rT)rWrX<00>signs<6E>change<67>idx<64>ct<63>i<>fracs r&<00>_zero_crossingsrh<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>
"<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
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-09 08:45:57 +01:00
g<><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?rrrJ<00>rK<00><00><>mBN<42><4E><EFBFBD><EFBFBD><EFBFBD>)
2026-04-09 10:29:53 +01:00
rSr_rar`<00>max<61>minrQ<00> searchsorted<65>interpr7)rWrXrirjrk<00>v20<32>v80rb<00> trans_idx<64>rise_ps<70>fall_psrd<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>
<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 }
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-09 10:29:53 +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)rror<00>e<><65>A<EFBFBD>@<40>@gg@N<>clk<6C>rng@g<11>-<2D><><EFBFBD><EFBFBD>=<3D><00><>.ArJrKrmgffffff<66>?<3F>
2026-04-09 08:45:57 +01:00
rLTg333333<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 r2z mV below spec min r/z mV above spec max z
2026-04-08 12:55:34 +01:00
Rise time z ps exceeds r1z
2026-04-09 10:29:53 +01:00
Fall time z settled samples below r r r rrrrrrrrrrrrrrrrr$) <20>re<72>matchrV<00>
IGNORECASErR<00>groupsrEr]rFrSr`<00>mean<61>TRANSITION_BAND_MV<4D>anyrp<00>absrhrQ<00>median<61>std<74>roundrqr<><00>zeros<6F>boolrrr5<00>sumr7r6r8r
).rH<00>mr r <00>cap_strrr rWrX<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>vcmrerrrr<00> half_periods<64>med<65>sd<73>hprirj<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-09 08:45:57 +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
<eed <eed <ee <09> <0A>Z
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_passrrr c <00><><00>d<01>}d|jd<03>d|j<00>d<05>d|jd<07>dtd <09>d
td <09>d ||j
2026-04-09 10:29:53 +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>a<00> <00><00><01>u<EFBFBD><00>u<EFBFBD>r(r)r*r+z [pwr/1v8]z Mean voltage : <20>.4f<EFBFBD>
V (spec r0<00><> V) z Min voltage : z V z Droop depth : r.r/z Ripple RMS : r3r4) r r r<><00>V18_SPEC_MIN_V<5F>V18_SPEC_MAX_Vr<56>r<>r<>r<>r<>rr7r9r:s r&r?zV1V8Metrics.summary`s<><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) r@rArBrCrDrErFr<>rrGrr?r$r(r&r<>r<>Lse<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-09 10:29:53 +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: rrorr<>r<>z Mean supply r<>z V outside spec (r0r<>z V)zSupply droops to u V — below z V spec minz Droop depth r.u6 mV — possible insufficient decoupling near MIPI PHYzRipple z mV RMS is elevatedrKrJrm) r r r<>r<>rr<>r<>r<>r<>r<>r<>r<>r)r<>r<>rVr<>rRr<>rEr]rFrSr`r<>rqrpr<>r<>r<>r7<00>V18_DROOP_WARN_MV<4D>V18_RIPPLE_WARN_MVr<56>r<>rQ)rHr<>r r<>r rWrXr<>r<>r<>r<>r<>r<>r<>r<>r<>r<>rs r&<00>analyze_1v8_filer<65>os%<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> _<>
<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(<00>data_dirc<00>D<00>tjdtj<00>}i}t|j d<02><00>D]\}|j |j <00>}|s<01>!|j<00>\}}}}|t|<07>f} ||j| i<00>|<06>d|<08><00><<00>^|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-09 08:45:57 +01:00
z9(\d{8}_\d{6})_(sig|proto|lp|pwr)_(\d+)_(clk|dat|1v8)\.csv<73>*.csv<73>_)
2026-04-09 10:29:53 +01:00
r<EFBFBD><00>compiler<65><00>sorted<65>globr<62>rVr<>rE<00>
2026-04-08 12:55:34 +01:00
setdefault)
2026-04-09 10:29:53 +01:00
r<EFBFBD><00>patternr<6E>rYr<><00>ts<74>ftyper<65><00>ch<63>keys
r&<00>group_capturesr<73><00>s<><00><00><11>j<EFBFBD>j<EFBFBD>D<>b<EFBFBD>m<EFBFBD>m<EFBFBD><06>G<EFBFBD>68<36>F<EFBFBD> <13>H<EFBFBD>M<EFBFBD>M<EFBFBD>'<27>*<2A> +<2B>8<><01> <13>M<EFBFBD>M<EFBFBD>!<21>&<26>&<26> !<21><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<> <12>Mr(c<00><><00>eZdZUeed<eed<eed<eed<eed<eed<eeed<eeed<eeed <eeed
2026-04-08 14:19:31 +01:00
<eed <eeed <eeed <eed<e e
<EFBFBD><0F>Z e
2026-04-09 10:29:53 +01:00
ed<defd<12>Z y)<14> LPMetricsr r rrr<>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_validrrr 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-09 10:29:53 +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> |j d|jd<11>d<15><03>|j d|jrdnd<18><00><02>|jr>|j d|j<00><00>|jrd|jd<11>d<15>ndz<00>|j<00> |j d|jd<11>d<1D><03>|jD]}|j d|<05><00><02><00>dj!|<02>S) Nc<00><00>|rdSdSr#r$r<>s r&r'z#LPMetrics.summary.<locals>.<lambda><3E>r<>r(r)r*r+z [lp/r-z LP-11 voltage : <20>.3fr<EFBFBD>r.r<>r0r<>z LP-11 duration : u µsu LP exit → HS : r2u ns (spec ≥z ns) z LP-low plateau : z nsu LP→HS sequence : u valid ✓uNOT DETECTED ✗z HS bursts : z avg <20>z HS amplitude : z mV (single-ended p-p/2)r3r4)r r rr<><00>LP11_SPEC_MIN_V<5F>LP11_SPEC_MAX_Vr7r<>r<><00>LP_LOW_DUR_MIN_NSr<53>r<>r<>r<>r<>rr9)r;r<r=<00>in_spec<65>ok_exitr>s r&r?zLPMetrics.summary<72>s"<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-08 14:19:31 +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> <11>L<EFBFBD>L<EFBFBD>/<2F><04>0G<30>0G<30><03>/L<>C<EFBFBD>P<> Q<> <0A> <0C> <0C>$<24>D<EFBFBD>4L<34>4L<34>[<5B>Rd<52>$e<> f<>
2026-04-09 10:29:53 +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<><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) r@rArBrCrDrErFrr<>rrGrr?r$r(r&r<>r<><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><1A>4<EFBFBD>0<>H<EFBFBD>d<EFBFBD>0<> <20><13> r(r<><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-09 10:29:53 +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_viewrK)<01>axisrJro)<07>numpy.lib.stride_tricksr<73>rQrS<00>fullr<6C><00> concatenate)r<>r<>r<><00>n<>windowed<65>stds<64>pad_l<5F>pad_rs r&<00> _rolling_stdr<00>s<><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(<00>mask<73> 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-09 10:29:53 +01:00
|k\s<01>||f<02><02>c}}Scc}}w)uGReturn list of (start_idx, end_idx) for True runs ≥ min_samples long.FrKrro)rSr<>r`<00>astype<70>int8ra<00>zip)rr<00>paddedr`<00>starts<74>endsryrzs r&<00>_find_contiguous_regionsr
 s<><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>+<2B>tjd|jtj<00>}|st d|j<00><00><02><00>|j <00>\}}}t |<03>}t|<00>\<00>+}ttj<00>+<2B>j<00><00>}d|z }t<00>+d<00>t<00>+d<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
<EFBFBD>} tt!<00>+fd <0B>| D<00><00>dzd
<EFBFBD>} d }d }d }d}d }d }t#| <0B>d k\<00>rt%dt d|z <00><00>}t'||<16>}g}t)| <0B>D]^\}\}}|d zt#| <0B>kr | |d zdn t#<00>+<2B>d z
}t<00>+|<00>+|z
dzd <0A>}|j+|||f<03><00>`|<18>r&t#|<18>}tttj|D<00><1E>cgc]\}}}|<1F><02>
c}}<1E><00>d <0A>}d}| dd } t-| t d|z <00>zt#<00>+<2B>d z
<00>}!tj.|| |!t0k\<00>d}"t#|"<22>rt<00>+| |"dz<00>+| z
dzd <0A>}|t2k|t0kz}#t|#d<12><08>}$t d|z <00>}%|$D]0\}&}'| |&cxkr | |%zks<01>n<00>t<00>+|'<00>+|&z
dzd <0A>}n|r]|d\}}}|||}(tttj4|(d<14><00>ttj4|(d<12><00>z
dz dzd <0A>}g})| xr'|dk(xr t|j%<00><00>tk}*|*r|)j+d<18>nb| s|)j+d<19>nN| <0C>L| t6kr|)j+d| d<1B>dt6<00>d<1D><05>| t8kDr|)j+d| d<1B>dt8<00>d<1D><05>|<10>'|t:kr|)j+d|d <20>d!t:d <20>d"<22><05>|*s)|s|)j+d#<23>|dk(r|)j+d$<24>t=|||t|dz d <0A>t| d<15>t#<00>+<2B>| | |||||||)<29>%<25>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-09 10:29:53 +01:00
z%(\d{8}_\d{6})_lp_(\d+)_(clk|dat)\.csvz$Filename does not match lp pattern: rrorr<>r<>)rN<>c3<00>:<00>K<00>|]\}}<02>|<00>|z
<00><01><00>y<00>w)Nr$)<04>.0ryrzrWs <20>r&<00> <genexpr>z"analyze_lp_file.<locals>.<genexpr>5s"<00><><00><><00>?<3F>$<24>!<21>Q<EFBFBD><15>q<EFBFBD><18>E<EFBFBD>!<21>H<EFBFBD>$<24>?<3F>s<00>FrKg<><67>&<26> .>r<>Tg<54><67><EFBFBD><EFBFBD><EFBFBD>Ơ><3E>g<><67><EFBFBD><EFBFBD><EFBFBD>ư><3E>_rJi<>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 z Vz V above spec max zLP exit duration r2z 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 transition)r r rrr<>rr<>r<>r<>r<>r<>r<>r<>r<>r)r<>r<>rVr<>rRr<>rEr]rFrSr`r<><00> LP11_HIGH_Vr
r<>r<>r<>rQrpr<00> enumerater7rqra<00> HS_OSC_STD_V<5F>LP_LOW_V<5F>
percentiler<EFBFBD>r<>r<>r<>),rHr<>r r<>rr rXr<>r<>r<><00> lp11_mask<73> lp11_regionsr<73>r<>ryrzr<>r<>r<>r<>r<>r<>r<><00>rstd<74> hs_burstsrf<00>lp11_s<5F>lp11_e<5F> burst_end<6E> burst_dur_nsr<73><00>d<>s_end<6E> lookahead<61> high_std_idx<64> lp_low_mask<73>lp_low_regions<6E> exit_window<6F>lplow_s<5F>lplow_e<5F> burst_voltsr<00>continuous_hs_clkrWs, @r&<00>analyze_lp_filer*s<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>?<3F>,<2C>?<3F> ?<3F>#<23> E<>q<EFBFBD>J<01><18><1C>M<EFBFBD><1D><16><1F><17><18>K<EFBFBD><1B>O<EFBFBD><1B>O<EFBFBD>
2026-04-08 14:19:31 +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> @<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> <20>%<25> <09>"2<>U<EFBFBD>6<EFBFBD>]<5D>"B<>c<EFBFBD>!I<>1<EFBFBD>M<>L<EFBFBD> <15> <1C> <1C>f<EFBFBD>i<EFBFBD><1C>><3E> ?<3F>  @<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>5<>k<EFBFBD>q<EFBFBD>Q<>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>w<EFBFBD><1E>%<25><07>.<2E>8<>C<EFBFBD>?<3F><11>*D<01>&<26><19>  <1A> <15><1F><01>l<EFBFBD>G<EFBFBD>A<EFBFBD>q<EFBFBD>!<21><1F><01>!<21>*<2A>K<EFBFBD>#<23><16>r<EFBFBD>}<7D>}<7D>[<5B>"<22>5<>6<><16>r<EFBFBD>}<7D>}<7D>[<5B>!<21>4<>5<>6<>9:<3A>;<3B>=A<>B<01>CD<43><0E>O<EFBFBD> <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>
<EFBFBD>
2026-04-09 10:29:53 +01:00
<1D>"<22> <14>O<EFBFBD>O<EFBFBD>V<> W<> <16>!<21> <1B> <14>O<EFBFBD>O<EFBFBD>G<> H<> <14>'<27>)<29>%<25>#<23>K<EFBFBD>#<23>$5<>q<EFBFBD>9<>#<23>K<EFBFBD><11>3<>!<21>%<25>j<EFBFBD>,<2C>.<2E>+<2B>0<>)<29>-<2D>-<2D>1<>&<26> <06><06><>q 2<><32>B4Ps <00>R9<12>+ R?<12>__main__<5F>datarKr<><00><00>_lp_zERROR z: )<01><)r)?<3F>__doc__rOr<><00>numpyrS<00> dataclassesrr<00>pathlibr<00>typingr<00> V18_NOMINAL_Vr<56>r<>r<>r<>r5r6r8r<>rrr<>r<>r<>rr
<00>tuple<6C>ndarrayr]rhrFrErGr<>r<>r<>r<><00>dictrCr<>r<>rr
r*r@<00>sys<79>__file__<5F>parentr<74>rQ<00>argv<67>filesr<73>r<>rYrV<00>result<6C>printr?<00> Exceptionrz)<01>as0r&<00><module>rBs<><00><01><04>" <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><17><0F><17><0F><18><11><18> <0C> <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-09 08:45:57 +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>p<12>T<EFBFBD><12>d<EFBFBD>5<EFBFBD><13>c<EFBFBD><18>?<3F>D<EFBFBD><13>d<EFBFBD><19>O<EFBFBD>+K<>&L<><12>2 <0B>9 <20>9 <20> <0B>9 <20>x 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>G<06>$<24>G<06>;<3B>G<06>T <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-09 08:45:57 +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>G9<04>9<G><02>>H%<05>H <05> H%