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.
Files changed (175) hide show
  1. oscura/__init__.py +19 -19
  2. oscura/analyzers/__init__.py +2 -0
  3. oscura/analyzers/digital/extraction.py +2 -3
  4. oscura/analyzers/digital/quality.py +1 -1
  5. oscura/analyzers/digital/timing.py +1 -1
  6. oscura/analyzers/eye/__init__.py +5 -1
  7. oscura/analyzers/eye/generation.py +501 -0
  8. oscura/analyzers/jitter/__init__.py +6 -6
  9. oscura/analyzers/jitter/timing.py +419 -0
  10. oscura/analyzers/patterns/__init__.py +94 -0
  11. oscura/analyzers/patterns/reverse_engineering.py +991 -0
  12. oscura/analyzers/power/__init__.py +35 -12
  13. oscura/analyzers/power/basic.py +3 -3
  14. oscura/analyzers/power/soa.py +1 -1
  15. oscura/analyzers/power/switching.py +3 -3
  16. oscura/analyzers/signal_classification.py +529 -0
  17. oscura/analyzers/signal_integrity/sparams.py +3 -3
  18. oscura/analyzers/statistics/__init__.py +4 -0
  19. oscura/analyzers/statistics/basic.py +152 -0
  20. oscura/analyzers/statistics/correlation.py +47 -6
  21. oscura/analyzers/validation.py +1 -1
  22. oscura/analyzers/waveform/__init__.py +2 -0
  23. oscura/analyzers/waveform/measurements.py +329 -163
  24. oscura/analyzers/waveform/measurements_with_uncertainty.py +91 -35
  25. oscura/analyzers/waveform/spectral.py +498 -54
  26. oscura/api/dsl/commands.py +15 -6
  27. oscura/api/server/templates/base.html +137 -146
  28. oscura/api/server/templates/export.html +84 -110
  29. oscura/api/server/templates/home.html +248 -267
  30. oscura/api/server/templates/protocols.html +44 -48
  31. oscura/api/server/templates/reports.html +27 -35
  32. oscura/api/server/templates/session_detail.html +68 -78
  33. oscura/api/server/templates/sessions.html +62 -72
  34. oscura/api/server/templates/waveforms.html +54 -64
  35. oscura/automotive/__init__.py +1 -1
  36. oscura/automotive/can/session.py +1 -1
  37. oscura/automotive/dbc/generator.py +638 -23
  38. oscura/automotive/dtc/data.json +102 -17
  39. oscura/automotive/uds/decoder.py +99 -6
  40. oscura/cli/analyze.py +8 -2
  41. oscura/cli/batch.py +36 -5
  42. oscura/cli/characterize.py +18 -4
  43. oscura/cli/export.py +47 -5
  44. oscura/cli/main.py +2 -0
  45. oscura/cli/onboarding/wizard.py +10 -6
  46. oscura/cli/pipeline.py +585 -0
  47. oscura/cli/visualize.py +6 -4
  48. oscura/convenience.py +400 -32
  49. oscura/core/config/loader.py +0 -1
  50. oscura/core/measurement_result.py +286 -0
  51. oscura/core/progress.py +1 -1
  52. oscura/core/schemas/device_mapping.json +8 -2
  53. oscura/core/schemas/packet_format.json +24 -4
  54. oscura/core/schemas/protocol_definition.json +12 -2
  55. oscura/core/types.py +300 -199
  56. oscura/correlation/multi_protocol.py +1 -1
  57. oscura/export/legacy/__init__.py +11 -0
  58. oscura/export/legacy/wav.py +75 -0
  59. oscura/exporters/__init__.py +19 -0
  60. oscura/exporters/wireshark.py +809 -0
  61. oscura/hardware/acquisition/file.py +5 -19
  62. oscura/hardware/acquisition/saleae.py +10 -10
  63. oscura/hardware/acquisition/socketcan.py +4 -6
  64. oscura/hardware/acquisition/synthetic.py +1 -5
  65. oscura/hardware/acquisition/visa.py +6 -6
  66. oscura/hardware/security/side_channel_detector.py +5 -508
  67. oscura/inference/message_format.py +686 -1
  68. oscura/jupyter/display.py +2 -2
  69. oscura/jupyter/magic.py +3 -3
  70. oscura/loaders/__init__.py +17 -12
  71. oscura/loaders/binary.py +1 -1
  72. oscura/loaders/chipwhisperer.py +1 -2
  73. oscura/loaders/configurable.py +1 -1
  74. oscura/loaders/csv_loader.py +2 -2
  75. oscura/loaders/hdf5_loader.py +1 -1
  76. oscura/loaders/lazy.py +6 -1
  77. oscura/loaders/mmap_loader.py +0 -1
  78. oscura/loaders/numpy_loader.py +8 -7
  79. oscura/loaders/preprocessing.py +3 -5
  80. oscura/loaders/rigol.py +21 -7
  81. oscura/loaders/sigrok.py +2 -5
  82. oscura/loaders/tdms.py +3 -2
  83. oscura/loaders/tektronix.py +38 -32
  84. oscura/loaders/tss.py +20 -27
  85. oscura/loaders/vcd.py +13 -8
  86. oscura/loaders/wav.py +1 -6
  87. oscura/pipeline/__init__.py +76 -0
  88. oscura/pipeline/handlers/__init__.py +165 -0
  89. oscura/pipeline/handlers/analyzers.py +1045 -0
  90. oscura/pipeline/handlers/decoders.py +899 -0
  91. oscura/pipeline/handlers/exporters.py +1103 -0
  92. oscura/pipeline/handlers/filters.py +891 -0
  93. oscura/pipeline/handlers/loaders.py +640 -0
  94. oscura/pipeline/handlers/transforms.py +768 -0
  95. oscura/reporting/__init__.py +88 -1
  96. oscura/reporting/automation.py +348 -0
  97. oscura/reporting/citations.py +374 -0
  98. oscura/reporting/core.py +54 -0
  99. oscura/reporting/formatting/__init__.py +11 -0
  100. oscura/reporting/formatting/measurements.py +320 -0
  101. oscura/reporting/html.py +57 -0
  102. oscura/reporting/interpretation.py +431 -0
  103. oscura/reporting/summary.py +329 -0
  104. oscura/reporting/templates/enhanced/protocol_re.html +504 -503
  105. oscura/reporting/visualization.py +542 -0
  106. oscura/side_channel/__init__.py +38 -57
  107. oscura/utils/builders/signal_builder.py +5 -5
  108. oscura/utils/comparison/compare.py +7 -9
  109. oscura/utils/comparison/golden.py +1 -1
  110. oscura/utils/filtering/convenience.py +2 -2
  111. oscura/utils/math/arithmetic.py +38 -62
  112. oscura/utils/math/interpolation.py +20 -20
  113. oscura/utils/pipeline/__init__.py +4 -17
  114. oscura/utils/progressive.py +1 -4
  115. oscura/utils/triggering/edge.py +1 -1
  116. oscura/utils/triggering/pattern.py +2 -2
  117. oscura/utils/triggering/pulse.py +2 -2
  118. oscura/utils/triggering/window.py +3 -3
  119. oscura/validation/hil_testing.py +11 -11
  120. oscura/visualization/__init__.py +47 -284
  121. oscura/visualization/batch.py +160 -0
  122. oscura/visualization/plot.py +542 -53
  123. oscura/visualization/styles.py +184 -318
  124. oscura/workflows/__init__.py +2 -0
  125. oscura/workflows/batch/advanced.py +1 -1
  126. oscura/workflows/batch/aggregate.py +7 -8
  127. oscura/workflows/complete_re.py +251 -23
  128. oscura/workflows/digital.py +27 -4
  129. oscura/workflows/multi_trace.py +136 -17
  130. oscura/workflows/waveform.py +788 -0
  131. {oscura-0.7.0.dist-info → oscura-0.10.0.dist-info}/METADATA +59 -79
  132. {oscura-0.7.0.dist-info → oscura-0.10.0.dist-info}/RECORD +135 -149
  133. oscura/side_channel/dpa.py +0 -1025
  134. oscura/utils/optimization/__init__.py +0 -19
  135. oscura/utils/optimization/parallel.py +0 -443
  136. oscura/utils/optimization/search.py +0 -532
  137. oscura/utils/pipeline/base.py +0 -338
  138. oscura/utils/pipeline/composition.py +0 -248
  139. oscura/utils/pipeline/parallel.py +0 -449
  140. oscura/utils/pipeline/pipeline.py +0 -375
  141. oscura/utils/search/__init__.py +0 -16
  142. oscura/utils/search/anomaly.py +0 -424
  143. oscura/utils/search/context.py +0 -294
  144. oscura/utils/search/pattern.py +0 -288
  145. oscura/utils/storage/__init__.py +0 -61
  146. oscura/utils/storage/database.py +0 -1166
  147. oscura/visualization/accessibility.py +0 -526
  148. oscura/visualization/annotations.py +0 -371
  149. oscura/visualization/axis_scaling.py +0 -305
  150. oscura/visualization/colors.py +0 -451
  151. oscura/visualization/digital.py +0 -436
  152. oscura/visualization/eye.py +0 -571
  153. oscura/visualization/histogram.py +0 -281
  154. oscura/visualization/interactive.py +0 -1035
  155. oscura/visualization/jitter.py +0 -1042
  156. oscura/visualization/keyboard.py +0 -394
  157. oscura/visualization/layout.py +0 -400
  158. oscura/visualization/optimization.py +0 -1079
  159. oscura/visualization/palettes.py +0 -446
  160. oscura/visualization/power.py +0 -508
  161. oscura/visualization/power_extended.py +0 -955
  162. oscura/visualization/presets.py +0 -469
  163. oscura/visualization/protocols.py +0 -1246
  164. oscura/visualization/render.py +0 -223
  165. oscura/visualization/rendering.py +0 -444
  166. oscura/visualization/reverse_engineering.py +0 -838
  167. oscura/visualization/signal_integrity.py +0 -989
  168. oscura/visualization/specialized.py +0 -643
  169. oscura/visualization/spectral.py +0 -1226
  170. oscura/visualization/thumbnails.py +0 -340
  171. oscura/visualization/time_axis.py +0 -351
  172. oscura/visualization/waveform.py +0 -454
  173. {oscura-0.7.0.dist-info → oscura-0.10.0.dist-info}/WHEEL +0 -0
  174. {oscura-0.7.0.dist-info → oscura-0.10.0.dist-info}/entry_points.txt +0 -0
  175. {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.7.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
- # Expert API - Pipeline and Composition (API-001, API-002, API-004)
416
+ # Reverse Engineering Pipeline (RE-INT-001)
413
417
  from oscura.utils.pipeline import (
414
- Composable,
415
- Pipeline,
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",
@@ -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
- edges = _detect_edges_internal(data, digital_data, trace.metadata.sample_rate, thresh_value)
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.time_base
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.time_base
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.time_base
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)
@@ -15,7 +15,9 @@ References:
15
15
  OIF CEI: Common Electrical I/O
16
16
  """
17
17
 
18
- from oscura.analyzers.eye.diagram import (
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",