oscura 0.7.0__py3-none-any.whl → 0.10.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- oscura/__init__.py +19 -19
- oscura/analyzers/__init__.py +2 -0
- oscura/analyzers/digital/extraction.py +2 -3
- oscura/analyzers/digital/quality.py +1 -1
- oscura/analyzers/digital/timing.py +1 -1
- oscura/analyzers/eye/__init__.py +5 -1
- oscura/analyzers/eye/generation.py +501 -0
- oscura/analyzers/jitter/__init__.py +6 -6
- oscura/analyzers/jitter/timing.py +419 -0
- oscura/analyzers/patterns/__init__.py +94 -0
- oscura/analyzers/patterns/reverse_engineering.py +991 -0
- oscura/analyzers/power/__init__.py +35 -12
- oscura/analyzers/power/basic.py +3 -3
- oscura/analyzers/power/soa.py +1 -1
- oscura/analyzers/power/switching.py +3 -3
- oscura/analyzers/signal_classification.py +529 -0
- oscura/analyzers/signal_integrity/sparams.py +3 -3
- oscura/analyzers/statistics/__init__.py +4 -0
- oscura/analyzers/statistics/basic.py +152 -0
- oscura/analyzers/statistics/correlation.py +47 -6
- oscura/analyzers/validation.py +1 -1
- oscura/analyzers/waveform/__init__.py +2 -0
- oscura/analyzers/waveform/measurements.py +329 -163
- oscura/analyzers/waveform/measurements_with_uncertainty.py +91 -35
- oscura/analyzers/waveform/spectral.py +498 -54
- oscura/api/dsl/commands.py +15 -6
- oscura/api/server/templates/base.html +137 -146
- oscura/api/server/templates/export.html +84 -110
- oscura/api/server/templates/home.html +248 -267
- oscura/api/server/templates/protocols.html +44 -48
- oscura/api/server/templates/reports.html +27 -35
- oscura/api/server/templates/session_detail.html +68 -78
- oscura/api/server/templates/sessions.html +62 -72
- oscura/api/server/templates/waveforms.html +54 -64
- oscura/automotive/__init__.py +1 -1
- oscura/automotive/can/session.py +1 -1
- oscura/automotive/dbc/generator.py +638 -23
- oscura/automotive/dtc/data.json +102 -17
- oscura/automotive/uds/decoder.py +99 -6
- oscura/cli/analyze.py +8 -2
- oscura/cli/batch.py +36 -5
- oscura/cli/characterize.py +18 -4
- oscura/cli/export.py +47 -5
- oscura/cli/main.py +2 -0
- oscura/cli/onboarding/wizard.py +10 -6
- oscura/cli/pipeline.py +585 -0
- oscura/cli/visualize.py +6 -4
- oscura/convenience.py +400 -32
- oscura/core/config/loader.py +0 -1
- oscura/core/measurement_result.py +286 -0
- oscura/core/progress.py +1 -1
- oscura/core/schemas/device_mapping.json +8 -2
- oscura/core/schemas/packet_format.json +24 -4
- oscura/core/schemas/protocol_definition.json +12 -2
- oscura/core/types.py +300 -199
- oscura/correlation/multi_protocol.py +1 -1
- oscura/export/legacy/__init__.py +11 -0
- oscura/export/legacy/wav.py +75 -0
- oscura/exporters/__init__.py +19 -0
- oscura/exporters/wireshark.py +809 -0
- oscura/hardware/acquisition/file.py +5 -19
- oscura/hardware/acquisition/saleae.py +10 -10
- oscura/hardware/acquisition/socketcan.py +4 -6
- oscura/hardware/acquisition/synthetic.py +1 -5
- oscura/hardware/acquisition/visa.py +6 -6
- oscura/hardware/security/side_channel_detector.py +5 -508
- oscura/inference/message_format.py +686 -1
- oscura/jupyter/display.py +2 -2
- oscura/jupyter/magic.py +3 -3
- oscura/loaders/__init__.py +17 -12
- oscura/loaders/binary.py +1 -1
- oscura/loaders/chipwhisperer.py +1 -2
- oscura/loaders/configurable.py +1 -1
- oscura/loaders/csv_loader.py +2 -2
- oscura/loaders/hdf5_loader.py +1 -1
- oscura/loaders/lazy.py +6 -1
- oscura/loaders/mmap_loader.py +0 -1
- oscura/loaders/numpy_loader.py +8 -7
- oscura/loaders/preprocessing.py +3 -5
- oscura/loaders/rigol.py +21 -7
- oscura/loaders/sigrok.py +2 -5
- oscura/loaders/tdms.py +3 -2
- oscura/loaders/tektronix.py +38 -32
- oscura/loaders/tss.py +20 -27
- oscura/loaders/vcd.py +13 -8
- oscura/loaders/wav.py +1 -6
- oscura/pipeline/__init__.py +76 -0
- oscura/pipeline/handlers/__init__.py +165 -0
- oscura/pipeline/handlers/analyzers.py +1045 -0
- oscura/pipeline/handlers/decoders.py +899 -0
- oscura/pipeline/handlers/exporters.py +1103 -0
- oscura/pipeline/handlers/filters.py +891 -0
- oscura/pipeline/handlers/loaders.py +640 -0
- oscura/pipeline/handlers/transforms.py +768 -0
- oscura/reporting/__init__.py +88 -1
- oscura/reporting/automation.py +348 -0
- oscura/reporting/citations.py +374 -0
- oscura/reporting/core.py +54 -0
- oscura/reporting/formatting/__init__.py +11 -0
- oscura/reporting/formatting/measurements.py +320 -0
- oscura/reporting/html.py +57 -0
- oscura/reporting/interpretation.py +431 -0
- oscura/reporting/summary.py +329 -0
- oscura/reporting/templates/enhanced/protocol_re.html +504 -503
- oscura/reporting/visualization.py +542 -0
- oscura/side_channel/__init__.py +38 -57
- oscura/utils/builders/signal_builder.py +5 -5
- oscura/utils/comparison/compare.py +7 -9
- oscura/utils/comparison/golden.py +1 -1
- oscura/utils/filtering/convenience.py +2 -2
- oscura/utils/math/arithmetic.py +38 -62
- oscura/utils/math/interpolation.py +20 -20
- oscura/utils/pipeline/__init__.py +4 -17
- oscura/utils/progressive.py +1 -4
- oscura/utils/triggering/edge.py +1 -1
- oscura/utils/triggering/pattern.py +2 -2
- oscura/utils/triggering/pulse.py +2 -2
- oscura/utils/triggering/window.py +3 -3
- oscura/validation/hil_testing.py +11 -11
- oscura/visualization/__init__.py +47 -284
- oscura/visualization/batch.py +160 -0
- oscura/visualization/plot.py +542 -53
- oscura/visualization/styles.py +184 -318
- oscura/workflows/__init__.py +2 -0
- oscura/workflows/batch/advanced.py +1 -1
- oscura/workflows/batch/aggregate.py +7 -8
- oscura/workflows/complete_re.py +251 -23
- oscura/workflows/digital.py +27 -4
- oscura/workflows/multi_trace.py +136 -17
- oscura/workflows/waveform.py +788 -0
- {oscura-0.7.0.dist-info → oscura-0.10.0.dist-info}/METADATA +59 -79
- {oscura-0.7.0.dist-info → oscura-0.10.0.dist-info}/RECORD +135 -149
- oscura/side_channel/dpa.py +0 -1025
- oscura/utils/optimization/__init__.py +0 -19
- oscura/utils/optimization/parallel.py +0 -443
- oscura/utils/optimization/search.py +0 -532
- oscura/utils/pipeline/base.py +0 -338
- oscura/utils/pipeline/composition.py +0 -248
- oscura/utils/pipeline/parallel.py +0 -449
- oscura/utils/pipeline/pipeline.py +0 -375
- oscura/utils/search/__init__.py +0 -16
- oscura/utils/search/anomaly.py +0 -424
- oscura/utils/search/context.py +0 -294
- oscura/utils/search/pattern.py +0 -288
- oscura/utils/storage/__init__.py +0 -61
- oscura/utils/storage/database.py +0 -1166
- oscura/visualization/accessibility.py +0 -526
- oscura/visualization/annotations.py +0 -371
- oscura/visualization/axis_scaling.py +0 -305
- oscura/visualization/colors.py +0 -451
- oscura/visualization/digital.py +0 -436
- oscura/visualization/eye.py +0 -571
- oscura/visualization/histogram.py +0 -281
- oscura/visualization/interactive.py +0 -1035
- oscura/visualization/jitter.py +0 -1042
- oscura/visualization/keyboard.py +0 -394
- oscura/visualization/layout.py +0 -400
- oscura/visualization/optimization.py +0 -1079
- oscura/visualization/palettes.py +0 -446
- oscura/visualization/power.py +0 -508
- oscura/visualization/power_extended.py +0 -955
- oscura/visualization/presets.py +0 -469
- oscura/visualization/protocols.py +0 -1246
- oscura/visualization/render.py +0 -223
- oscura/visualization/rendering.py +0 -444
- oscura/visualization/reverse_engineering.py +0 -838
- oscura/visualization/signal_integrity.py +0 -989
- oscura/visualization/specialized.py +0 -643
- oscura/visualization/spectral.py +0 -1226
- oscura/visualization/thumbnails.py +0 -340
- oscura/visualization/time_axis.py +0 -351
- oscura/visualization/waveform.py +0 -454
- {oscura-0.7.0.dist-info → oscura-0.10.0.dist-info}/WHEEL +0 -0
- {oscura-0.7.0.dist-info → oscura-0.10.0.dist-info}/entry_points.txt +0 -0
- {oscura-0.7.0.dist-info → oscura-0.10.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
"""Power analysis module for Oscura.
|
|
1
|
+
"""Power analysis module for Oscura - IEEE 1459-2010 compliant.
|
|
2
2
|
|
|
3
3
|
Provides comprehensive power analysis capabilities including:
|
|
4
|
-
- Basic power measurements (instantaneous, average, RMS, peak)
|
|
5
|
-
- AC power analysis (reactive, apparent, power factor)
|
|
4
|
+
- Basic power measurements (instantaneous, average, RMS, peak) per IEEE 1459
|
|
5
|
+
- AC power analysis (reactive, apparent, power factor, harmonics) per IEEE 1459
|
|
6
6
|
- Switching loss analysis for power electronics
|
|
7
|
+
- Conduction loss analysis (MOSFET, IGBT, diode)
|
|
7
8
|
- Safe Operating Area (SOA) analysis
|
|
8
|
-
- Ripple measurement
|
|
9
|
-
- Efficiency calculations
|
|
9
|
+
- Ripple measurement and analysis
|
|
10
|
+
- Efficiency calculations (single and multi-output)
|
|
10
11
|
|
|
11
12
|
|
|
12
13
|
Example:
|
|
@@ -14,6 +15,9 @@ Example:
|
|
|
14
15
|
>>> power_trace = instantaneous_power(voltage_trace, current_trace)
|
|
15
16
|
>>> stats = power_statistics(power_trace)
|
|
16
17
|
>>> print(f"Average power: {stats['average']:.2f} W")
|
|
18
|
+
|
|
19
|
+
References:
|
|
20
|
+
IEEE 1459-2010: Standard for Power Quality Definitions
|
|
17
21
|
"""
|
|
18
22
|
|
|
19
23
|
from oscura.analyzers.power.ac_power import (
|
|
@@ -23,6 +27,7 @@ from oscura.analyzers.power.ac_power import (
|
|
|
23
27
|
phase_angle,
|
|
24
28
|
power_factor,
|
|
25
29
|
reactive_power,
|
|
30
|
+
three_phase_power,
|
|
26
31
|
total_harmonic_distortion_power,
|
|
27
32
|
)
|
|
28
33
|
from oscura.analyzers.power.basic import (
|
|
@@ -30,39 +35,51 @@ from oscura.analyzers.power.basic import (
|
|
|
30
35
|
energy,
|
|
31
36
|
instantaneous_power,
|
|
32
37
|
peak_power,
|
|
38
|
+
power_profile,
|
|
33
39
|
power_statistics,
|
|
34
40
|
rms_power,
|
|
35
41
|
)
|
|
36
42
|
from oscura.analyzers.power.conduction import (
|
|
37
43
|
conduction_loss,
|
|
44
|
+
diode_conduction_loss,
|
|
38
45
|
duty_cycle_weighted_loss,
|
|
39
46
|
forward_voltage,
|
|
47
|
+
igbt_conduction_loss,
|
|
40
48
|
mosfet_conduction_loss,
|
|
41
49
|
on_resistance,
|
|
50
|
+
temperature_derating,
|
|
42
51
|
)
|
|
43
52
|
from oscura.analyzers.power.efficiency import (
|
|
44
53
|
efficiency,
|
|
54
|
+
efficiency_vs_load,
|
|
55
|
+
loss_breakdown,
|
|
45
56
|
multi_output_efficiency,
|
|
46
57
|
power_conversion_efficiency,
|
|
58
|
+
thermal_efficiency,
|
|
47
59
|
)
|
|
48
60
|
from oscura.analyzers.power.ripple import (
|
|
49
61
|
extract_ripple,
|
|
50
62
|
ripple,
|
|
63
|
+
ripple_envelope,
|
|
51
64
|
ripple_frequency,
|
|
65
|
+
ripple_harmonics,
|
|
52
66
|
ripple_percentage,
|
|
53
67
|
ripple_statistics,
|
|
54
68
|
)
|
|
55
69
|
from oscura.analyzers.power.soa import (
|
|
56
70
|
SOALimit,
|
|
71
|
+
SOAViolation,
|
|
57
72
|
check_soa_violations,
|
|
58
73
|
create_mosfet_soa,
|
|
59
74
|
plot_soa,
|
|
60
75
|
soa_analysis,
|
|
61
76
|
)
|
|
62
77
|
from oscura.analyzers.power.switching import (
|
|
78
|
+
SwitchingEvent,
|
|
63
79
|
switching_energy,
|
|
64
80
|
switching_frequency,
|
|
65
81
|
switching_loss,
|
|
82
|
+
switching_times,
|
|
66
83
|
total_switching_loss,
|
|
67
84
|
turn_off_loss,
|
|
68
85
|
turn_on_loss,
|
|
@@ -70,22 +87,25 @@ from oscura.analyzers.power.switching import (
|
|
|
70
87
|
|
|
71
88
|
__all__ = [
|
|
72
89
|
"SOALimit",
|
|
90
|
+
"SOAViolation",
|
|
91
|
+
"SwitchingEvent",
|
|
73
92
|
"apparent_power",
|
|
74
93
|
"average_power",
|
|
75
94
|
"check_soa_violations",
|
|
76
|
-
# Conduction
|
|
77
95
|
"conduction_loss",
|
|
78
96
|
"create_mosfet_soa",
|
|
97
|
+
"diode_conduction_loss",
|
|
79
98
|
"displacement_power_factor",
|
|
80
99
|
"distortion_power_factor",
|
|
81
100
|
"duty_cycle_weighted_loss",
|
|
82
|
-
# Efficiency
|
|
83
101
|
"efficiency",
|
|
102
|
+
"efficiency_vs_load",
|
|
84
103
|
"energy",
|
|
85
104
|
"extract_ripple",
|
|
86
105
|
"forward_voltage",
|
|
87
|
-
|
|
106
|
+
"igbt_conduction_loss",
|
|
88
107
|
"instantaneous_power",
|
|
108
|
+
"loss_breakdown",
|
|
89
109
|
"mosfet_conduction_loss",
|
|
90
110
|
"multi_output_efficiency",
|
|
91
111
|
"on_resistance",
|
|
@@ -94,21 +114,24 @@ __all__ = [
|
|
|
94
114
|
"plot_soa",
|
|
95
115
|
"power_conversion_efficiency",
|
|
96
116
|
"power_factor",
|
|
117
|
+
"power_profile",
|
|
97
118
|
"power_statistics",
|
|
98
|
-
# AC power
|
|
99
119
|
"reactive_power",
|
|
100
|
-
# Ripple
|
|
101
120
|
"ripple",
|
|
121
|
+
"ripple_envelope",
|
|
102
122
|
"ripple_frequency",
|
|
123
|
+
"ripple_harmonics",
|
|
103
124
|
"ripple_percentage",
|
|
104
125
|
"ripple_statistics",
|
|
105
126
|
"rms_power",
|
|
106
|
-
# SOA
|
|
107
127
|
"soa_analysis",
|
|
108
128
|
"switching_energy",
|
|
109
129
|
"switching_frequency",
|
|
110
|
-
# Switching
|
|
111
130
|
"switching_loss",
|
|
131
|
+
"switching_times",
|
|
132
|
+
"temperature_derating",
|
|
133
|
+
"thermal_efficiency",
|
|
134
|
+
"three_phase_power",
|
|
112
135
|
"total_harmonic_distortion_power",
|
|
113
136
|
"total_switching_loss",
|
|
114
137
|
"turn_off_loss",
|
oscura/analyzers/power/basic.py
CHANGED
|
@@ -232,7 +232,7 @@ def energy(
|
|
|
232
232
|
power = instantaneous_power(voltage, current)
|
|
233
233
|
|
|
234
234
|
data = power.data
|
|
235
|
-
sample_period = power.metadata.
|
|
235
|
+
sample_period = 1.0 / power.metadata.sample_rate
|
|
236
236
|
|
|
237
237
|
# Apply time limits
|
|
238
238
|
if start_time is not None or end_time is not None:
|
|
@@ -290,7 +290,7 @@ def power_statistics(
|
|
|
290
290
|
power = instantaneous_power(voltage, current)
|
|
291
291
|
|
|
292
292
|
data = power.data
|
|
293
|
-
sample_period = power.metadata.
|
|
293
|
+
sample_period = 1.0 / power.metadata.sample_rate
|
|
294
294
|
|
|
295
295
|
# Use scipy trapezoid for stable API across NumPy versions
|
|
296
296
|
from scipy.integrate import trapezoid
|
|
@@ -330,7 +330,7 @@ def power_profile(
|
|
|
330
330
|
"""
|
|
331
331
|
power = instantaneous_power(voltage, current)
|
|
332
332
|
data = power.data
|
|
333
|
-
sample_period = power.metadata.
|
|
333
|
+
sample_period = 1.0 / power.metadata.sample_rate
|
|
334
334
|
|
|
335
335
|
if window_size is None:
|
|
336
336
|
# Auto-select: ~1% of total samples or 100, whichever is larger
|
oscura/analyzers/power/soa.py
CHANGED
|
@@ -105,7 +105,7 @@ def soa_analysis(
|
|
|
105
105
|
min_len = min(len(v_data), len(i_data))
|
|
106
106
|
v_data = v_data[:min_len]
|
|
107
107
|
i_data = i_data[:min_len]
|
|
108
|
-
sample_period = voltage.metadata.
|
|
108
|
+
sample_period = 1.0 / voltage.metadata.sample_rate
|
|
109
109
|
|
|
110
110
|
# Select applicable limits based on pulse width
|
|
111
111
|
if pulse_width is None:
|
|
@@ -65,7 +65,7 @@ def _prepare_switching_data(
|
|
|
65
65
|
v_data = voltage.data[:min_len]
|
|
66
66
|
i_data = current.data[:min_len]
|
|
67
67
|
p_data = power.data[:min_len]
|
|
68
|
-
sample_period = power.metadata.
|
|
68
|
+
sample_period = 1.0 / power.metadata.sample_rate
|
|
69
69
|
return v_data, i_data, p_data, sample_period
|
|
70
70
|
|
|
71
71
|
|
|
@@ -386,7 +386,7 @@ def switching_energy(
|
|
|
386
386
|
>>> print(f"Switching energy: {e*1e9:.2f} nJ")
|
|
387
387
|
"""
|
|
388
388
|
power = instantaneous_power(voltage, current)
|
|
389
|
-
sample_period = power.metadata.
|
|
389
|
+
sample_period = 1.0 / power.metadata.sample_rate
|
|
390
390
|
time_vector = np.arange(len(power.data)) * sample_period
|
|
391
391
|
|
|
392
392
|
# Select time window
|
|
@@ -540,7 +540,7 @@ def switching_times(
|
|
|
540
540
|
min_len = min(len(voltage.data), len(current.data))
|
|
541
541
|
v_data = voltage.data[:min_len]
|
|
542
542
|
i_data = current.data[:min_len]
|
|
543
|
-
sample_period = voltage.metadata.
|
|
543
|
+
sample_period = 1.0 / voltage.metadata.sample_rate
|
|
544
544
|
|
|
545
545
|
v_min, v_max = float(np.min(v_data)), float(np.max(v_data))
|
|
546
546
|
i_min, i_max = float(np.min(i_data)), float(np.max(i_data))
|