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
oscura/__init__.py
CHANGED
|
@@ -53,7 +53,7 @@ try:
|
|
|
53
53
|
__version__ = version("oscura")
|
|
54
54
|
except Exception:
|
|
55
55
|
# Fallback for development/testing when package not installed
|
|
56
|
-
__version__ = "0.
|
|
56
|
+
__version__ = "0.10.0"
|
|
57
57
|
|
|
58
58
|
__author__ = "Oscura Contributors"
|
|
59
59
|
|
|
@@ -170,9 +170,13 @@ from oscura.automotive.dbc.generator import DBCGenerator
|
|
|
170
170
|
# Convenience functions (one-call analysis)
|
|
171
171
|
from oscura.convenience import (
|
|
172
172
|
DecodeResult,
|
|
173
|
+
PowerMetrics,
|
|
173
174
|
SpectralMetrics,
|
|
175
|
+
TimingMetrics,
|
|
174
176
|
auto_decode,
|
|
177
|
+
quick_power,
|
|
175
178
|
quick_spectral,
|
|
179
|
+
quick_timing,
|
|
176
180
|
smart_filter,
|
|
177
181
|
)
|
|
178
182
|
|
|
@@ -293,7 +297,7 @@ from oscura.inference import (
|
|
|
293
297
|
)
|
|
294
298
|
|
|
295
299
|
# Loaders (including multi-channel support)
|
|
296
|
-
from oscura.loaders import get_supported_formats, load, load_all_channels
|
|
300
|
+
from oscura.loaders import get_supported_formats, load, load_all_channels, load_auto
|
|
297
301
|
|
|
298
302
|
# Reporting
|
|
299
303
|
from oscura.reporting.core import (
|
|
@@ -409,15 +413,10 @@ from oscura.utils.memory import (
|
|
|
409
413
|
get_total_memory,
|
|
410
414
|
)
|
|
411
415
|
|
|
412
|
-
#
|
|
416
|
+
# Reverse Engineering Pipeline (RE-INT-001)
|
|
413
417
|
from oscura.utils.pipeline import (
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
TraceTransformer,
|
|
417
|
-
compose,
|
|
418
|
-
curry,
|
|
419
|
-
make_composable,
|
|
420
|
-
pipe,
|
|
418
|
+
REPipeline,
|
|
419
|
+
analyze,
|
|
421
420
|
)
|
|
422
421
|
|
|
423
422
|
# Expert API - Streaming (API-003)
|
|
@@ -483,7 +482,7 @@ from oscura.workflows import (
|
|
|
483
482
|
signal_integrity_audit,
|
|
484
483
|
)
|
|
485
484
|
|
|
486
|
-
__all__ = [
|
|
485
|
+
__all__ = [ # noqa: RUF022 - Organized by category with comments for clarity
|
|
487
486
|
# EMC Compliance (EMC-001, EMC-002, EMC-003)
|
|
488
487
|
"AVAILABLE_MASKS",
|
|
489
488
|
"DEFAULT_CONFIG",
|
|
@@ -508,7 +507,6 @@ __all__ = [
|
|
|
508
507
|
"ComplianceReportFormat",
|
|
509
508
|
"ComplianceResult",
|
|
510
509
|
"ComplianceViolation",
|
|
511
|
-
"Composable",
|
|
512
510
|
"ConfigurationError",
|
|
513
511
|
# Automotive
|
|
514
512
|
"DBCGenerator",
|
|
@@ -551,8 +549,6 @@ __all__ = [
|
|
|
551
549
|
"OscuraError",
|
|
552
550
|
# Signal quality (QUAL-007)
|
|
553
551
|
"PLLRecoveryResult",
|
|
554
|
-
# Expert API - Pipeline (API-001, API-002, API-004)
|
|
555
|
-
"Pipeline",
|
|
556
552
|
"PluginError",
|
|
557
553
|
"PluginManager",
|
|
558
554
|
"PluginMetadata",
|
|
@@ -561,6 +557,8 @@ __all__ = [
|
|
|
561
557
|
"ProtocolPacket",
|
|
562
558
|
# Reverse engineering workflow
|
|
563
559
|
"ProtocolSpec",
|
|
560
|
+
# Reverse Engineering Pipeline (RE-INT-001)
|
|
561
|
+
"REPipeline",
|
|
564
562
|
"PulseWidthTrigger",
|
|
565
563
|
# Reporting
|
|
566
564
|
"Report",
|
|
@@ -574,14 +572,15 @@ __all__ = [
|
|
|
574
572
|
"SignalCharacterization",
|
|
575
573
|
"SmartDefaults",
|
|
576
574
|
# Convenience functions
|
|
575
|
+
"PowerMetrics",
|
|
577
576
|
"SpectralMetrics",
|
|
578
577
|
"StreamingAnalyzer",
|
|
578
|
+
"TimingMetrics",
|
|
579
579
|
"Trace",
|
|
580
580
|
# Discovery
|
|
581
581
|
"TraceDiff",
|
|
582
582
|
# Core types
|
|
583
583
|
"TraceMetadata",
|
|
584
|
-
"TraceTransformer",
|
|
585
584
|
"UnsupportedFormatError",
|
|
586
585
|
"ValidationError",
|
|
587
586
|
# Signal quality (QUAL-002)
|
|
@@ -596,6 +595,8 @@ __all__ = [
|
|
|
596
595
|
"align_traces",
|
|
597
596
|
"amplitude",
|
|
598
597
|
"apparent_power",
|
|
598
|
+
# Reverse Engineering Pipeline (RE-INT-001)
|
|
599
|
+
"analyze",
|
|
599
600
|
# Discovery
|
|
600
601
|
"assess_data_quality",
|
|
601
602
|
"assess_signal_quality",
|
|
@@ -622,7 +623,6 @@ __all__ = [
|
|
|
622
623
|
"compare_to_golden",
|
|
623
624
|
# Comparison
|
|
624
625
|
"compare_traces",
|
|
625
|
-
"compose",
|
|
626
626
|
"configure_fft_cache",
|
|
627
627
|
# Logging
|
|
628
628
|
"configure_logging",
|
|
@@ -631,7 +631,6 @@ __all__ = [
|
|
|
631
631
|
"create_golden",
|
|
632
632
|
"create_limit_spec",
|
|
633
633
|
"create_mask",
|
|
634
|
-
"curry",
|
|
635
634
|
"debug_protocol",
|
|
636
635
|
# Protocol decoders
|
|
637
636
|
"decode_can",
|
|
@@ -724,6 +723,7 @@ __all__ = [
|
|
|
724
723
|
"list_plugins",
|
|
725
724
|
# Loaders
|
|
726
725
|
"load",
|
|
726
|
+
"load_auto",
|
|
727
727
|
# Multi-channel loading (Phase 3)
|
|
728
728
|
"load_all_channels",
|
|
729
729
|
# Configuration
|
|
@@ -736,7 +736,6 @@ __all__ = [
|
|
|
736
736
|
"load_trace_chunks",
|
|
737
737
|
# Filtering
|
|
738
738
|
"low_pass",
|
|
739
|
-
"make_composable",
|
|
740
739
|
"margin_analysis",
|
|
741
740
|
"mask_test",
|
|
742
741
|
"math_expression",
|
|
@@ -755,7 +754,6 @@ __all__ = [
|
|
|
755
754
|
"overshoot",
|
|
756
755
|
"percentiles",
|
|
757
756
|
"period",
|
|
758
|
-
"pipe",
|
|
759
757
|
# Signal quality (QUAL-007)
|
|
760
758
|
"pll_clock_recovery",
|
|
761
759
|
# Visualization
|
|
@@ -771,7 +769,9 @@ __all__ = [
|
|
|
771
769
|
"pulse_width",
|
|
772
770
|
"quartiles",
|
|
773
771
|
# Convenience functions
|
|
772
|
+
"quick_power",
|
|
774
773
|
"quick_spectral",
|
|
774
|
+
"quick_timing",
|
|
775
775
|
"reactive_power",
|
|
776
776
|
# Auto-Inference (INF-009)
|
|
777
777
|
"recommend_analyses",
|
oscura/analyzers/__init__.py
CHANGED
|
@@ -22,6 +22,7 @@ from oscura.analyzers import (
|
|
|
22
22
|
ml,
|
|
23
23
|
protocols,
|
|
24
24
|
side_channel,
|
|
25
|
+
signal_classification,
|
|
25
26
|
signal_integrity,
|
|
26
27
|
statistics,
|
|
27
28
|
validation,
|
|
@@ -36,6 +37,7 @@ __all__ = [
|
|
|
36
37
|
"ml",
|
|
37
38
|
"protocols",
|
|
38
39
|
"side_channel",
|
|
40
|
+
"signal_classification",
|
|
39
41
|
"signal_integrity",
|
|
40
42
|
"statistics",
|
|
41
43
|
"validation",
|
|
@@ -145,12 +145,11 @@ def to_digital(
|
|
|
145
145
|
digital_data = data >= thresh_value
|
|
146
146
|
|
|
147
147
|
# Detect edges
|
|
148
|
-
|
|
148
|
+
_detect_edges_internal(data, digital_data, trace.metadata.sample_rate, thresh_value)
|
|
149
149
|
|
|
150
150
|
return DigitalTrace(
|
|
151
151
|
data=digital_data,
|
|
152
152
|
metadata=trace.metadata,
|
|
153
|
-
edges=edges,
|
|
154
153
|
)
|
|
155
154
|
|
|
156
155
|
|
|
@@ -241,7 +240,7 @@ def detect_edges(
|
|
|
241
240
|
edge_indices = np.where(transitions != 0)[0]
|
|
242
241
|
|
|
243
242
|
# Convert indices to timestamps
|
|
244
|
-
sample_period = digital.metadata.
|
|
243
|
+
sample_period = 1.0 / digital.metadata.sample_rate
|
|
245
244
|
timestamps = edge_indices.astype(np.float64) * sample_period
|
|
246
245
|
|
|
247
246
|
# Sub-sample interpolation for analog traces
|
|
@@ -505,7 +505,7 @@ def _get_clock_edges(
|
|
|
505
505
|
if len(data) < 2:
|
|
506
506
|
return np.array([], dtype=np.float64)
|
|
507
507
|
|
|
508
|
-
sample_period = trace.metadata.
|
|
508
|
+
sample_period = 1.0 / trace.metadata.sample_rate
|
|
509
509
|
|
|
510
510
|
# Find threshold
|
|
511
511
|
low, high = _find_logic_levels(data)
|
|
@@ -343,7 +343,7 @@ def slew_rate(
|
|
|
343
343
|
return np.array([], dtype=np.float64) if return_all else np.nan
|
|
344
344
|
|
|
345
345
|
data = trace.data
|
|
346
|
-
sample_period = trace.metadata.
|
|
346
|
+
sample_period = 1.0 / trace.metadata.sample_rate
|
|
347
347
|
|
|
348
348
|
# Find signal levels and validate
|
|
349
349
|
low, high = _find_levels(data)
|
oscura/analyzers/eye/__init__.py
CHANGED
|
@@ -15,7 +15,9 @@ References:
|
|
|
15
15
|
OIF CEI: Common Electrical I/O
|
|
16
16
|
"""
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
# Backward compatibility
|
|
19
|
+
from oscura.analyzers.eye import generation as diagram
|
|
20
|
+
from oscura.analyzers.eye.generation import (
|
|
19
21
|
EyeDiagram,
|
|
20
22
|
generate_eye,
|
|
21
23
|
generate_eye_from_edges,
|
|
@@ -36,6 +38,8 @@ __all__ = [
|
|
|
36
38
|
# Metrics
|
|
37
39
|
"EyeMetrics",
|
|
38
40
|
"crossing_percentage",
|
|
41
|
+
# Backward compatibility
|
|
42
|
+
"diagram",
|
|
39
43
|
"eye_contour",
|
|
40
44
|
"eye_height",
|
|
41
45
|
"eye_width",
|