oscura 0.5.1__py3-none-any.whl → 0.7.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 (497) hide show
  1. oscura/__init__.py +169 -167
  2. oscura/analyzers/__init__.py +3 -0
  3. oscura/analyzers/classification.py +659 -0
  4. oscura/analyzers/digital/edges.py +325 -65
  5. oscura/analyzers/digital/quality.py +293 -166
  6. oscura/analyzers/digital/timing.py +260 -115
  7. oscura/analyzers/digital/timing_numba.py +334 -0
  8. oscura/analyzers/entropy.py +605 -0
  9. oscura/analyzers/eye/diagram.py +176 -109
  10. oscura/analyzers/eye/metrics.py +5 -5
  11. oscura/analyzers/jitter/__init__.py +6 -4
  12. oscura/analyzers/jitter/ber.py +52 -52
  13. oscura/analyzers/jitter/classification.py +156 -0
  14. oscura/analyzers/jitter/decomposition.py +163 -113
  15. oscura/analyzers/jitter/spectrum.py +80 -64
  16. oscura/analyzers/ml/__init__.py +39 -0
  17. oscura/analyzers/ml/features.py +600 -0
  18. oscura/analyzers/ml/signal_classifier.py +604 -0
  19. oscura/analyzers/packet/daq.py +246 -158
  20. oscura/analyzers/packet/parser.py +12 -1
  21. oscura/analyzers/packet/payload.py +50 -2110
  22. oscura/analyzers/packet/payload_analysis.py +361 -181
  23. oscura/analyzers/packet/payload_patterns.py +133 -70
  24. oscura/analyzers/packet/stream.py +84 -23
  25. oscura/analyzers/patterns/__init__.py +26 -5
  26. oscura/analyzers/patterns/anomaly_detection.py +908 -0
  27. oscura/analyzers/patterns/clustering.py +169 -108
  28. oscura/analyzers/patterns/clustering_optimized.py +227 -0
  29. oscura/analyzers/patterns/discovery.py +1 -1
  30. oscura/analyzers/patterns/matching.py +581 -197
  31. oscura/analyzers/patterns/pattern_mining.py +778 -0
  32. oscura/analyzers/patterns/periodic.py +121 -38
  33. oscura/analyzers/patterns/sequences.py +175 -78
  34. oscura/analyzers/power/conduction.py +1 -1
  35. oscura/analyzers/power/soa.py +6 -6
  36. oscura/analyzers/power/switching.py +250 -110
  37. oscura/analyzers/protocol/__init__.py +17 -1
  38. oscura/analyzers/protocols/base.py +6 -6
  39. oscura/analyzers/protocols/ble/__init__.py +38 -0
  40. oscura/analyzers/protocols/ble/analyzer.py +809 -0
  41. oscura/analyzers/protocols/ble/uuids.py +288 -0
  42. oscura/analyzers/protocols/can.py +257 -127
  43. oscura/analyzers/protocols/can_fd.py +107 -80
  44. oscura/analyzers/protocols/flexray.py +139 -80
  45. oscura/analyzers/protocols/hdlc.py +93 -58
  46. oscura/analyzers/protocols/i2c.py +247 -106
  47. oscura/analyzers/protocols/i2s.py +138 -86
  48. oscura/analyzers/protocols/industrial/__init__.py +40 -0
  49. oscura/analyzers/protocols/industrial/bacnet/__init__.py +33 -0
  50. oscura/analyzers/protocols/industrial/bacnet/analyzer.py +708 -0
  51. oscura/analyzers/protocols/industrial/bacnet/encoding.py +412 -0
  52. oscura/analyzers/protocols/industrial/bacnet/services.py +622 -0
  53. oscura/analyzers/protocols/industrial/ethercat/__init__.py +30 -0
  54. oscura/analyzers/protocols/industrial/ethercat/analyzer.py +474 -0
  55. oscura/analyzers/protocols/industrial/ethercat/mailbox.py +339 -0
  56. oscura/analyzers/protocols/industrial/ethercat/topology.py +166 -0
  57. oscura/analyzers/protocols/industrial/modbus/__init__.py +31 -0
  58. oscura/analyzers/protocols/industrial/modbus/analyzer.py +525 -0
  59. oscura/analyzers/protocols/industrial/modbus/crc.py +79 -0
  60. oscura/analyzers/protocols/industrial/modbus/functions.py +436 -0
  61. oscura/analyzers/protocols/industrial/opcua/__init__.py +21 -0
  62. oscura/analyzers/protocols/industrial/opcua/analyzer.py +552 -0
  63. oscura/analyzers/protocols/industrial/opcua/datatypes.py +446 -0
  64. oscura/analyzers/protocols/industrial/opcua/services.py +264 -0
  65. oscura/analyzers/protocols/industrial/profinet/__init__.py +23 -0
  66. oscura/analyzers/protocols/industrial/profinet/analyzer.py +441 -0
  67. oscura/analyzers/protocols/industrial/profinet/dcp.py +263 -0
  68. oscura/analyzers/protocols/industrial/profinet/ptcp.py +200 -0
  69. oscura/analyzers/protocols/jtag.py +180 -98
  70. oscura/analyzers/protocols/lin.py +219 -114
  71. oscura/analyzers/protocols/manchester.py +4 -4
  72. oscura/analyzers/protocols/onewire.py +253 -149
  73. oscura/analyzers/protocols/parallel_bus/__init__.py +20 -0
  74. oscura/analyzers/protocols/parallel_bus/centronics.py +92 -0
  75. oscura/analyzers/protocols/parallel_bus/gpib.py +137 -0
  76. oscura/analyzers/protocols/spi.py +192 -95
  77. oscura/analyzers/protocols/swd.py +321 -167
  78. oscura/analyzers/protocols/uart.py +267 -125
  79. oscura/analyzers/protocols/usb.py +235 -131
  80. oscura/analyzers/side_channel/power.py +17 -12
  81. oscura/analyzers/signal/__init__.py +15 -0
  82. oscura/analyzers/signal/timing_analysis.py +1086 -0
  83. oscura/analyzers/signal_integrity/__init__.py +4 -1
  84. oscura/analyzers/signal_integrity/sparams.py +2 -19
  85. oscura/analyzers/spectral/chunked.py +129 -60
  86. oscura/analyzers/spectral/chunked_fft.py +300 -94
  87. oscura/analyzers/spectral/chunked_wavelet.py +100 -80
  88. oscura/analyzers/statistical/checksum.py +376 -217
  89. oscura/analyzers/statistical/classification.py +229 -107
  90. oscura/analyzers/statistical/entropy.py +78 -53
  91. oscura/analyzers/statistics/correlation.py +407 -211
  92. oscura/analyzers/statistics/outliers.py +2 -2
  93. oscura/analyzers/statistics/streaming.py +30 -5
  94. oscura/analyzers/validation.py +216 -101
  95. oscura/analyzers/waveform/measurements.py +9 -0
  96. oscura/analyzers/waveform/measurements_with_uncertainty.py +31 -15
  97. oscura/analyzers/waveform/spectral.py +500 -228
  98. oscura/api/__init__.py +31 -5
  99. oscura/api/dsl/__init__.py +582 -0
  100. oscura/{dsl → api/dsl}/commands.py +43 -76
  101. oscura/{dsl → api/dsl}/interpreter.py +26 -51
  102. oscura/{dsl → api/dsl}/parser.py +107 -77
  103. oscura/{dsl → api/dsl}/repl.py +2 -2
  104. oscura/api/dsl.py +1 -1
  105. oscura/{integrations → api/integrations}/__init__.py +1 -1
  106. oscura/{integrations → api/integrations}/llm.py +201 -102
  107. oscura/api/operators.py +3 -3
  108. oscura/api/optimization.py +144 -30
  109. oscura/api/rest_server.py +921 -0
  110. oscura/api/server/__init__.py +17 -0
  111. oscura/api/server/dashboard.py +850 -0
  112. oscura/api/server/static/README.md +34 -0
  113. oscura/api/server/templates/base.html +181 -0
  114. oscura/api/server/templates/export.html +120 -0
  115. oscura/api/server/templates/home.html +284 -0
  116. oscura/api/server/templates/protocols.html +58 -0
  117. oscura/api/server/templates/reports.html +43 -0
  118. oscura/api/server/templates/session_detail.html +89 -0
  119. oscura/api/server/templates/sessions.html +83 -0
  120. oscura/api/server/templates/waveforms.html +73 -0
  121. oscura/automotive/__init__.py +8 -1
  122. oscura/automotive/can/__init__.py +10 -0
  123. oscura/automotive/can/checksum.py +3 -1
  124. oscura/automotive/can/dbc_generator.py +590 -0
  125. oscura/automotive/can/message_wrapper.py +121 -74
  126. oscura/automotive/can/patterns.py +98 -21
  127. oscura/automotive/can/session.py +292 -56
  128. oscura/automotive/can/state_machine.py +6 -3
  129. oscura/automotive/can/stimulus_response.py +97 -75
  130. oscura/automotive/dbc/__init__.py +10 -2
  131. oscura/automotive/dbc/generator.py +84 -56
  132. oscura/automotive/dbc/parser.py +6 -6
  133. oscura/automotive/dtc/data.json +17 -102
  134. oscura/automotive/dtc/database.py +2 -2
  135. oscura/automotive/flexray/__init__.py +31 -0
  136. oscura/automotive/flexray/analyzer.py +504 -0
  137. oscura/automotive/flexray/crc.py +185 -0
  138. oscura/automotive/flexray/fibex.py +449 -0
  139. oscura/automotive/j1939/__init__.py +45 -8
  140. oscura/automotive/j1939/analyzer.py +605 -0
  141. oscura/automotive/j1939/spns.py +326 -0
  142. oscura/automotive/j1939/transport.py +306 -0
  143. oscura/automotive/lin/__init__.py +47 -0
  144. oscura/automotive/lin/analyzer.py +612 -0
  145. oscura/automotive/loaders/blf.py +13 -2
  146. oscura/automotive/loaders/csv_can.py +143 -72
  147. oscura/automotive/loaders/dispatcher.py +50 -2
  148. oscura/automotive/loaders/mdf.py +86 -45
  149. oscura/automotive/loaders/pcap.py +111 -61
  150. oscura/automotive/uds/__init__.py +4 -0
  151. oscura/automotive/uds/analyzer.py +725 -0
  152. oscura/automotive/uds/decoder.py +140 -58
  153. oscura/automotive/uds/models.py +7 -1
  154. oscura/automotive/visualization.py +1 -1
  155. oscura/cli/analyze.py +348 -0
  156. oscura/cli/batch.py +142 -122
  157. oscura/cli/benchmark.py +275 -0
  158. oscura/cli/characterize.py +137 -82
  159. oscura/cli/compare.py +224 -131
  160. oscura/cli/completion.py +250 -0
  161. oscura/cli/config_cmd.py +361 -0
  162. oscura/cli/decode.py +164 -87
  163. oscura/cli/export.py +286 -0
  164. oscura/cli/main.py +115 -31
  165. oscura/{onboarding → cli/onboarding}/__init__.py +3 -3
  166. oscura/{onboarding → cli/onboarding}/help.py +80 -58
  167. oscura/{onboarding → cli/onboarding}/tutorials.py +97 -72
  168. oscura/{onboarding → cli/onboarding}/wizard.py +55 -36
  169. oscura/cli/progress.py +147 -0
  170. oscura/cli/shell.py +157 -135
  171. oscura/cli/validate_cmd.py +204 -0
  172. oscura/cli/visualize.py +158 -0
  173. oscura/convenience.py +125 -79
  174. oscura/core/__init__.py +4 -2
  175. oscura/core/backend_selector.py +3 -3
  176. oscura/core/cache.py +126 -15
  177. oscura/core/cancellation.py +1 -1
  178. oscura/{config → core/config}/__init__.py +20 -11
  179. oscura/{config → core/config}/defaults.py +1 -1
  180. oscura/{config → core/config}/loader.py +7 -5
  181. oscura/{config → core/config}/memory.py +5 -5
  182. oscura/{config → core/config}/migration.py +1 -1
  183. oscura/{config → core/config}/pipeline.py +99 -23
  184. oscura/{config → core/config}/preferences.py +1 -1
  185. oscura/{config → core/config}/protocol.py +3 -3
  186. oscura/{config → core/config}/schema.py +426 -272
  187. oscura/{config → core/config}/settings.py +1 -1
  188. oscura/{config → core/config}/thresholds.py +195 -153
  189. oscura/core/correlation.py +5 -6
  190. oscura/core/cross_domain.py +0 -2
  191. oscura/core/debug.py +9 -5
  192. oscura/{extensibility → core/extensibility}/docs.py +158 -70
  193. oscura/{extensibility → core/extensibility}/extensions.py +160 -76
  194. oscura/{extensibility → core/extensibility}/logging.py +1 -1
  195. oscura/{extensibility → core/extensibility}/measurements.py +1 -1
  196. oscura/{extensibility → core/extensibility}/plugins.py +1 -1
  197. oscura/{extensibility → core/extensibility}/templates.py +73 -3
  198. oscura/{extensibility → core/extensibility}/validation.py +1 -1
  199. oscura/core/gpu_backend.py +11 -7
  200. oscura/core/log_query.py +101 -11
  201. oscura/core/logging.py +126 -54
  202. oscura/core/logging_advanced.py +5 -5
  203. oscura/core/memory_limits.py +108 -70
  204. oscura/core/memory_monitor.py +2 -2
  205. oscura/core/memory_progress.py +7 -7
  206. oscura/core/memory_warnings.py +1 -1
  207. oscura/core/numba_backend.py +13 -13
  208. oscura/{plugins → core/plugins}/__init__.py +9 -9
  209. oscura/{plugins → core/plugins}/base.py +7 -7
  210. oscura/{plugins → core/plugins}/cli.py +3 -3
  211. oscura/{plugins → core/plugins}/discovery.py +186 -106
  212. oscura/{plugins → core/plugins}/lifecycle.py +1 -1
  213. oscura/{plugins → core/plugins}/manager.py +7 -7
  214. oscura/{plugins → core/plugins}/registry.py +3 -3
  215. oscura/{plugins → core/plugins}/versioning.py +1 -1
  216. oscura/core/progress.py +16 -1
  217. oscura/core/provenance.py +8 -2
  218. oscura/{schemas → core/schemas}/__init__.py +2 -2
  219. oscura/{schemas → core/schemas}/device_mapping.json +2 -8
  220. oscura/{schemas → core/schemas}/packet_format.json +4 -24
  221. oscura/{schemas → core/schemas}/protocol_definition.json +2 -12
  222. oscura/core/types.py +4 -0
  223. oscura/core/uncertainty.py +3 -3
  224. oscura/correlation/__init__.py +52 -0
  225. oscura/correlation/multi_protocol.py +811 -0
  226. oscura/discovery/auto_decoder.py +117 -35
  227. oscura/discovery/comparison.py +191 -86
  228. oscura/discovery/quality_validator.py +155 -68
  229. oscura/discovery/signal_detector.py +196 -79
  230. oscura/export/__init__.py +18 -8
  231. oscura/export/kaitai_struct.py +513 -0
  232. oscura/export/scapy_layer.py +801 -0
  233. oscura/export/wireshark/generator.py +1 -1
  234. oscura/export/wireshark/templates/dissector.lua.j2 +2 -2
  235. oscura/export/wireshark_dissector.py +746 -0
  236. oscura/guidance/wizard.py +207 -111
  237. oscura/hardware/__init__.py +19 -0
  238. oscura/{acquisition → hardware/acquisition}/__init__.py +4 -4
  239. oscura/{acquisition → hardware/acquisition}/file.py +2 -2
  240. oscura/{acquisition → hardware/acquisition}/hardware.py +7 -7
  241. oscura/{acquisition → hardware/acquisition}/saleae.py +15 -12
  242. oscura/{acquisition → hardware/acquisition}/socketcan.py +1 -1
  243. oscura/{acquisition → hardware/acquisition}/streaming.py +2 -2
  244. oscura/{acquisition → hardware/acquisition}/synthetic.py +3 -3
  245. oscura/{acquisition → hardware/acquisition}/visa.py +33 -11
  246. oscura/hardware/firmware/__init__.py +29 -0
  247. oscura/hardware/firmware/pattern_recognition.py +874 -0
  248. oscura/hardware/hal_detector.py +736 -0
  249. oscura/hardware/security/__init__.py +37 -0
  250. oscura/hardware/security/side_channel_detector.py +1126 -0
  251. oscura/inference/__init__.py +4 -0
  252. oscura/inference/active_learning/observation_table.py +4 -1
  253. oscura/inference/alignment.py +216 -123
  254. oscura/inference/bayesian.py +113 -33
  255. oscura/inference/crc_reverse.py +101 -55
  256. oscura/inference/logic.py +6 -2
  257. oscura/inference/message_format.py +342 -183
  258. oscura/inference/protocol.py +95 -44
  259. oscura/inference/protocol_dsl.py +180 -82
  260. oscura/inference/signal_intelligence.py +1439 -706
  261. oscura/inference/spectral.py +99 -57
  262. oscura/inference/state_machine.py +810 -158
  263. oscura/inference/stream.py +270 -110
  264. oscura/iot/__init__.py +34 -0
  265. oscura/iot/coap/__init__.py +32 -0
  266. oscura/iot/coap/analyzer.py +668 -0
  267. oscura/iot/coap/options.py +212 -0
  268. oscura/iot/lorawan/__init__.py +21 -0
  269. oscura/iot/lorawan/crypto.py +206 -0
  270. oscura/iot/lorawan/decoder.py +801 -0
  271. oscura/iot/lorawan/mac_commands.py +341 -0
  272. oscura/iot/mqtt/__init__.py +27 -0
  273. oscura/iot/mqtt/analyzer.py +999 -0
  274. oscura/iot/mqtt/properties.py +315 -0
  275. oscura/iot/zigbee/__init__.py +31 -0
  276. oscura/iot/zigbee/analyzer.py +615 -0
  277. oscura/iot/zigbee/security.py +153 -0
  278. oscura/iot/zigbee/zcl.py +349 -0
  279. oscura/jupyter/display.py +125 -45
  280. oscura/{exploratory → jupyter/exploratory}/__init__.py +8 -8
  281. oscura/{exploratory → jupyter/exploratory}/error_recovery.py +298 -141
  282. oscura/jupyter/exploratory/fuzzy.py +746 -0
  283. oscura/{exploratory → jupyter/exploratory}/fuzzy_advanced.py +258 -100
  284. oscura/{exploratory → jupyter/exploratory}/legacy.py +464 -242
  285. oscura/{exploratory → jupyter/exploratory}/parse.py +167 -145
  286. oscura/{exploratory → jupyter/exploratory}/recovery.py +119 -87
  287. oscura/jupyter/exploratory/sync.py +612 -0
  288. oscura/{exploratory → jupyter/exploratory}/unknown.py +299 -176
  289. oscura/jupyter/magic.py +4 -4
  290. oscura/{ui → jupyter/ui}/__init__.py +2 -2
  291. oscura/{ui → jupyter/ui}/formatters.py +3 -3
  292. oscura/{ui → jupyter/ui}/progressive_display.py +153 -82
  293. oscura/loaders/__init__.py +183 -67
  294. oscura/loaders/binary.py +88 -1
  295. oscura/loaders/chipwhisperer.py +153 -137
  296. oscura/loaders/configurable.py +208 -86
  297. oscura/loaders/csv_loader.py +458 -215
  298. oscura/loaders/hdf5_loader.py +278 -119
  299. oscura/loaders/lazy.py +87 -54
  300. oscura/loaders/mmap_loader.py +1 -1
  301. oscura/loaders/numpy_loader.py +253 -116
  302. oscura/loaders/pcap.py +226 -151
  303. oscura/loaders/rigol.py +110 -49
  304. oscura/loaders/sigrok.py +201 -78
  305. oscura/loaders/tdms.py +81 -58
  306. oscura/loaders/tektronix.py +291 -174
  307. oscura/loaders/touchstone.py +182 -87
  308. oscura/loaders/tss.py +456 -0
  309. oscura/loaders/vcd.py +215 -117
  310. oscura/loaders/wav.py +155 -68
  311. oscura/reporting/__init__.py +9 -0
  312. oscura/reporting/analyze.py +352 -146
  313. oscura/reporting/argument_preparer.py +69 -14
  314. oscura/reporting/auto_report.py +97 -61
  315. oscura/reporting/batch.py +131 -58
  316. oscura/reporting/chart_selection.py +57 -45
  317. oscura/reporting/comparison.py +63 -17
  318. oscura/reporting/content/executive.py +76 -24
  319. oscura/reporting/core_formats/multi_format.py +11 -8
  320. oscura/reporting/engine.py +312 -158
  321. oscura/reporting/enhanced_reports.py +949 -0
  322. oscura/reporting/export.py +86 -43
  323. oscura/reporting/formatting/numbers.py +69 -42
  324. oscura/reporting/html.py +139 -58
  325. oscura/reporting/index.py +137 -65
  326. oscura/reporting/output.py +158 -67
  327. oscura/reporting/pdf.py +67 -102
  328. oscura/reporting/plots.py +191 -112
  329. oscura/reporting/sections.py +88 -47
  330. oscura/reporting/standards.py +104 -61
  331. oscura/reporting/summary_generator.py +75 -55
  332. oscura/reporting/tables.py +138 -54
  333. oscura/reporting/templates/enhanced/protocol_re.html +525 -0
  334. oscura/sessions/__init__.py +14 -23
  335. oscura/sessions/base.py +3 -3
  336. oscura/sessions/blackbox.py +106 -10
  337. oscura/sessions/generic.py +2 -2
  338. oscura/sessions/legacy.py +783 -0
  339. oscura/side_channel/__init__.py +63 -0
  340. oscura/side_channel/dpa.py +1025 -0
  341. oscura/utils/__init__.py +15 -1
  342. oscura/utils/bitwise.py +118 -0
  343. oscura/{builders → utils/builders}/__init__.py +1 -1
  344. oscura/{comparison → utils/comparison}/__init__.py +6 -6
  345. oscura/{comparison → utils/comparison}/compare.py +202 -101
  346. oscura/{comparison → utils/comparison}/golden.py +83 -63
  347. oscura/{comparison → utils/comparison}/limits.py +313 -89
  348. oscura/{comparison → utils/comparison}/mask.py +151 -45
  349. oscura/{comparison → utils/comparison}/trace_diff.py +1 -1
  350. oscura/{comparison → utils/comparison}/visualization.py +147 -89
  351. oscura/{component → utils/component}/__init__.py +3 -3
  352. oscura/{component → utils/component}/impedance.py +122 -58
  353. oscura/{component → utils/component}/reactive.py +165 -168
  354. oscura/{component → utils/component}/transmission_line.py +3 -3
  355. oscura/{filtering → utils/filtering}/__init__.py +6 -6
  356. oscura/{filtering → utils/filtering}/base.py +1 -1
  357. oscura/{filtering → utils/filtering}/convenience.py +2 -2
  358. oscura/{filtering → utils/filtering}/design.py +169 -93
  359. oscura/{filtering → utils/filtering}/filters.py +2 -2
  360. oscura/{filtering → utils/filtering}/introspection.py +2 -2
  361. oscura/utils/geometry.py +31 -0
  362. oscura/utils/imports.py +184 -0
  363. oscura/utils/lazy.py +1 -1
  364. oscura/{math → utils/math}/__init__.py +2 -2
  365. oscura/{math → utils/math}/arithmetic.py +114 -48
  366. oscura/{math → utils/math}/interpolation.py +139 -106
  367. oscura/utils/memory.py +129 -66
  368. oscura/utils/memory_advanced.py +92 -9
  369. oscura/utils/memory_extensions.py +10 -8
  370. oscura/{optimization → utils/optimization}/__init__.py +1 -1
  371. oscura/{optimization → utils/optimization}/search.py +2 -2
  372. oscura/utils/performance/__init__.py +58 -0
  373. oscura/utils/performance/caching.py +889 -0
  374. oscura/utils/performance/lsh_clustering.py +333 -0
  375. oscura/utils/performance/memory_optimizer.py +699 -0
  376. oscura/utils/performance/optimizations.py +675 -0
  377. oscura/utils/performance/parallel.py +654 -0
  378. oscura/utils/performance/profiling.py +661 -0
  379. oscura/{pipeline → utils/pipeline}/base.py +1 -1
  380. oscura/{pipeline → utils/pipeline}/composition.py +1 -1
  381. oscura/{pipeline → utils/pipeline}/parallel.py +3 -2
  382. oscura/{pipeline → utils/pipeline}/pipeline.py +1 -1
  383. oscura/{pipeline → utils/pipeline}/reverse_engineering.py +412 -221
  384. oscura/{search → utils/search}/__init__.py +3 -3
  385. oscura/{search → utils/search}/anomaly.py +188 -58
  386. oscura/utils/search/context.py +294 -0
  387. oscura/{search → utils/search}/pattern.py +138 -10
  388. oscura/utils/serial.py +51 -0
  389. oscura/utils/storage/__init__.py +61 -0
  390. oscura/utils/storage/database.py +1166 -0
  391. oscura/{streaming → utils/streaming}/chunked.py +302 -143
  392. oscura/{streaming → utils/streaming}/progressive.py +1 -1
  393. oscura/{streaming → utils/streaming}/realtime.py +3 -2
  394. oscura/{triggering → utils/triggering}/__init__.py +6 -6
  395. oscura/{triggering → utils/triggering}/base.py +6 -6
  396. oscura/{triggering → utils/triggering}/edge.py +2 -2
  397. oscura/{triggering → utils/triggering}/pattern.py +2 -2
  398. oscura/{triggering → utils/triggering}/pulse.py +115 -74
  399. oscura/{triggering → utils/triggering}/window.py +2 -2
  400. oscura/utils/validation.py +32 -0
  401. oscura/validation/__init__.py +121 -0
  402. oscura/{compliance → validation/compliance}/__init__.py +5 -5
  403. oscura/{compliance → validation/compliance}/advanced.py +5 -5
  404. oscura/{compliance → validation/compliance}/masks.py +1 -1
  405. oscura/{compliance → validation/compliance}/reporting.py +127 -53
  406. oscura/{compliance → validation/compliance}/testing.py +114 -52
  407. oscura/validation/compliance_tests.py +915 -0
  408. oscura/validation/fuzzer.py +990 -0
  409. oscura/validation/grammar_tests.py +596 -0
  410. oscura/validation/grammar_validator.py +904 -0
  411. oscura/validation/hil_testing.py +977 -0
  412. oscura/{quality → validation/quality}/__init__.py +4 -4
  413. oscura/{quality → validation/quality}/ensemble.py +251 -171
  414. oscura/{quality → validation/quality}/explainer.py +3 -3
  415. oscura/{quality → validation/quality}/scoring.py +1 -1
  416. oscura/{quality → validation/quality}/warnings.py +4 -4
  417. oscura/validation/regression_suite.py +808 -0
  418. oscura/validation/replay.py +788 -0
  419. oscura/{testing → validation/testing}/__init__.py +2 -2
  420. oscura/{testing → validation/testing}/synthetic.py +5 -5
  421. oscura/visualization/__init__.py +9 -0
  422. oscura/visualization/accessibility.py +1 -1
  423. oscura/visualization/annotations.py +64 -67
  424. oscura/visualization/colors.py +7 -7
  425. oscura/visualization/digital.py +180 -81
  426. oscura/visualization/eye.py +236 -85
  427. oscura/visualization/interactive.py +320 -143
  428. oscura/visualization/jitter.py +587 -247
  429. oscura/visualization/layout.py +169 -134
  430. oscura/visualization/optimization.py +103 -52
  431. oscura/visualization/palettes.py +1 -1
  432. oscura/visualization/power.py +427 -211
  433. oscura/visualization/power_extended.py +626 -297
  434. oscura/visualization/presets.py +2 -0
  435. oscura/visualization/protocols.py +495 -181
  436. oscura/visualization/render.py +79 -63
  437. oscura/visualization/reverse_engineering.py +171 -124
  438. oscura/visualization/signal_integrity.py +460 -279
  439. oscura/visualization/specialized.py +190 -100
  440. oscura/visualization/spectral.py +670 -255
  441. oscura/visualization/thumbnails.py +166 -137
  442. oscura/visualization/waveform.py +150 -63
  443. oscura/workflows/__init__.py +3 -0
  444. oscura/{batch → workflows/batch}/__init__.py +5 -5
  445. oscura/{batch → workflows/batch}/advanced.py +150 -75
  446. oscura/workflows/batch/aggregate.py +531 -0
  447. oscura/workflows/batch/analyze.py +236 -0
  448. oscura/{batch → workflows/batch}/logging.py +2 -2
  449. oscura/{batch → workflows/batch}/metrics.py +1 -1
  450. oscura/workflows/complete_re.py +1144 -0
  451. oscura/workflows/compliance.py +44 -54
  452. oscura/workflows/digital.py +197 -51
  453. oscura/workflows/legacy/__init__.py +12 -0
  454. oscura/{workflow → workflows/legacy}/dag.py +4 -1
  455. oscura/workflows/multi_trace.py +9 -9
  456. oscura/workflows/power.py +42 -62
  457. oscura/workflows/protocol.py +82 -49
  458. oscura/workflows/reverse_engineering.py +351 -150
  459. oscura/workflows/signal_integrity.py +157 -82
  460. oscura-0.7.0.dist-info/METADATA +661 -0
  461. oscura-0.7.0.dist-info/RECORD +591 -0
  462. oscura/batch/aggregate.py +0 -300
  463. oscura/batch/analyze.py +0 -139
  464. oscura/dsl/__init__.py +0 -73
  465. oscura/exceptions.py +0 -59
  466. oscura/exploratory/fuzzy.py +0 -513
  467. oscura/exploratory/sync.py +0 -384
  468. oscura/exporters/__init__.py +0 -94
  469. oscura/exporters/csv.py +0 -303
  470. oscura/exporters/exporters.py +0 -44
  471. oscura/exporters/hdf5.py +0 -217
  472. oscura/exporters/html_export.py +0 -701
  473. oscura/exporters/json_export.py +0 -291
  474. oscura/exporters/markdown_export.py +0 -367
  475. oscura/exporters/matlab_export.py +0 -354
  476. oscura/exporters/npz_export.py +0 -219
  477. oscura/exporters/spice_export.py +0 -210
  478. oscura/search/context.py +0 -149
  479. oscura/session/__init__.py +0 -34
  480. oscura/session/annotations.py +0 -289
  481. oscura/session/history.py +0 -313
  482. oscura/session/session.py +0 -520
  483. oscura/workflow/__init__.py +0 -13
  484. oscura-0.5.1.dist-info/METADATA +0 -583
  485. oscura-0.5.1.dist-info/RECORD +0 -481
  486. /oscura/core/{config.py → config/legacy.py} +0 -0
  487. /oscura/{extensibility → core/extensibility}/__init__.py +0 -0
  488. /oscura/{extensibility → core/extensibility}/registry.py +0 -0
  489. /oscura/{plugins → core/plugins}/isolation.py +0 -0
  490. /oscura/{schemas → core/schemas}/bus_configuration.json +0 -0
  491. /oscura/{builders → utils/builders}/signal_builder.py +0 -0
  492. /oscura/{optimization → utils/optimization}/parallel.py +0 -0
  493. /oscura/{pipeline → utils/pipeline}/__init__.py +0 -0
  494. /oscura/{streaming → utils/streaming}/__init__.py +0 -0
  495. {oscura-0.5.1.dist-info → oscura-0.7.0.dist-info}/WHEEL +0 -0
  496. {oscura-0.5.1.dist-info → oscura-0.7.0.dist-info}/entry_points.txt +0 -0
  497. {oscura-0.5.1.dist-info → oscura-0.7.0.dist-info}/licenses/LICENSE +0 -0
oscura/__init__.py CHANGED
@@ -46,7 +46,15 @@ Example:
46
46
  For more information, see https://github.com/oscura-re/oscura
47
47
  """
48
48
 
49
- __version__ = "0.5.1"
49
+ # Version dynamically imported from package metadata (SSOT: pyproject.toml)
50
+ try:
51
+ from importlib.metadata import version
52
+
53
+ __version__ = version("oscura")
54
+ except Exception:
55
+ # Fallback for development/testing when package not installed
56
+ __version__ = "0.7.0"
57
+
50
58
  __author__ = "Oscura Contributors"
51
59
 
52
60
  # Core types
@@ -155,67 +163,9 @@ from oscura.analyzers.waveform.spectral import (
155
163
  thd,
156
164
  )
157
165
 
158
- # Signal builders (top-level convenience access)
159
- from oscura.builders import (
160
- SignalBuilder,
161
- )
162
-
163
- # Comparison and limit testing
164
- from oscura.comparison.compare import (
165
- compare_traces,
166
- correlation,
167
- difference,
168
- similarity_score,
169
- )
170
- from oscura.comparison.golden import (
171
- GoldenReference,
172
- compare_to_golden,
173
- create_golden,
174
- )
175
- from oscura.comparison.limits import (
176
- LimitSpec,
177
- check_limits,
178
- create_limit_spec,
179
- margin_analysis,
180
- )
181
- from oscura.comparison.mask import (
182
- Mask,
183
- create_mask,
184
- eye_mask,
185
- mask_test,
186
- )
187
-
188
- # EMC Compliance (EMC-001, EMC-002, EMC-003)
189
- from oscura.compliance import (
190
- AVAILABLE_MASKS,
191
- ComplianceReportFormat,
192
- ComplianceResult,
193
- ComplianceViolation,
194
- DetectorType,
195
- LimitMask,
196
- check_compliance,
197
- create_custom_mask,
198
- generate_compliance_report,
199
- load_limit_mask,
200
- )
201
-
202
- # Component analysis
203
- from oscura.component.impedance import (
204
- discontinuity_analysis,
205
- extract_impedance,
206
- impedance_profile,
207
- )
208
- from oscura.component.reactive import (
209
- extract_parasitics,
210
- measure_capacitance,
211
- measure_inductance,
212
- )
213
- from oscura.component.transmission_line import (
214
- characteristic_impedance,
215
- propagation_delay,
216
- transmission_line_analysis,
217
- velocity_factor,
218
- )
166
+ # Automotive - CAN analysis and DBC generation
167
+ from oscura.automotive.can.session import CANSession
168
+ from oscura.automotive.dbc.generator import DBCGenerator
219
169
 
220
170
  # Convenience functions (one-call analysis)
221
171
  from oscura.convenience import (
@@ -258,6 +208,31 @@ from oscura.core.exceptions import (
258
208
  ValidationError,
259
209
  )
260
210
 
211
+ # Expert API - Extensibility (API-006, API-007, API-008, PLUG-008)
212
+ from oscura.core.extensibility import (
213
+ AlgorithmRegistry,
214
+ MeasurementDefinition,
215
+ MeasurementRegistry,
216
+ PluginError,
217
+ PluginManager,
218
+ PluginMetadata,
219
+ PluginTemplate,
220
+ PluginType,
221
+ generate_plugin_template,
222
+ get_algorithm,
223
+ get_algorithms,
224
+ get_measurement_registry,
225
+ get_plugin_manager,
226
+ list_measurements,
227
+ list_plugins,
228
+ load_plugin,
229
+ register_algorithm,
230
+ register_measurement,
231
+ )
232
+ from oscura.core.extensibility import (
233
+ measure as measure_custom,
234
+ )
235
+
261
236
  # Logging
262
237
  from oscura.core.logging import (
263
238
  configure_logging,
@@ -301,41 +276,91 @@ from oscura.discovery import (
301
276
  decode_protocol as discovery_decode_protocol,
302
277
  )
303
278
 
304
- # Data Export (top-level convenience access)
305
- from oscura.exporters import (
306
- export_csv,
307
- export_hdf5,
308
- export_json,
309
- export_mat,
279
+ # Data Export - Removed legacy exports
280
+ # Use oscura.export.* modules directly for protocol export functionality
281
+ # Auto-Inference (INF-001 to INF-009)
282
+ from oscura.inference import (
283
+ AnalysisRecommendation,
284
+ assess_signal_quality,
285
+ auto_spectral_config,
286
+ check_measurement_suitability,
287
+ classify_signal,
288
+ detect_logic_family,
289
+ detect_protocol,
290
+ get_optimal_domain_order,
291
+ recommend_analyses,
292
+ suggest_measurements,
310
293
  )
311
294
 
312
- # Expert API - Extensibility (API-006, API-007, API-008, PLUG-008)
313
- from oscura.extensibility import (
314
- AlgorithmRegistry,
315
- MeasurementDefinition,
316
- MeasurementRegistry,
317
- PluginError,
318
- PluginManager,
319
- PluginMetadata,
320
- PluginTemplate,
321
- PluginType,
322
- generate_plugin_template,
323
- get_algorithm,
324
- get_algorithms,
325
- get_measurement_registry,
326
- get_plugin_manager,
327
- list_measurements,
328
- list_plugins,
329
- load_plugin,
330
- register_algorithm,
331
- register_measurement,
295
+ # Loaders (including multi-channel support)
296
+ from oscura.loaders import get_supported_formats, load, load_all_channels
297
+
298
+ # Reporting
299
+ from oscura.reporting.core import (
300
+ Report,
301
+ ReportConfig,
302
+ generate_report,
332
303
  )
333
- from oscura.extensibility import (
334
- measure as measure_custom,
304
+ from oscura.reporting.formatting import (
305
+ NumberFormatter,
306
+ format_value,
307
+ format_with_context,
308
+ format_with_units,
309
+ )
310
+
311
+ # Session Management - Use new AnalysisSession API
312
+ from oscura.sessions import BlackBoxSession, GenericSession
313
+
314
+ # Signal builders (top-level convenience access)
315
+ from oscura.utils.builders import (
316
+ SignalBuilder,
317
+ )
318
+
319
+ # Comparison and limit testing
320
+ from oscura.utils.comparison.compare import (
321
+ compare_traces,
322
+ correlation,
323
+ difference,
324
+ similarity_score,
325
+ )
326
+ from oscura.utils.comparison.golden import (
327
+ GoldenReference,
328
+ compare_to_golden,
329
+ create_golden,
330
+ )
331
+ from oscura.utils.comparison.limits import (
332
+ LimitSpec,
333
+ check_limits,
334
+ create_limit_spec,
335
+ margin_analysis,
336
+ )
337
+ from oscura.utils.comparison.mask import (
338
+ Mask,
339
+ create_mask,
340
+ eye_mask,
341
+ mask_test,
342
+ )
343
+
344
+ # Component analysis
345
+ from oscura.utils.component.impedance import (
346
+ discontinuity_analysis,
347
+ extract_impedance,
348
+ impedance_profile,
349
+ )
350
+ from oscura.utils.component.reactive import (
351
+ extract_parasitics,
352
+ measure_capacitance,
353
+ measure_inductance,
354
+ )
355
+ from oscura.utils.component.transmission_line import (
356
+ characteristic_impedance,
357
+ propagation_delay,
358
+ transmission_line_analysis,
359
+ velocity_factor,
335
360
  )
336
361
 
337
362
  # Filtering (top-level convenience access)
338
- from oscura.filtering.convenience import (
363
+ from oscura.utils.filtering.convenience import (
339
364
  band_pass,
340
365
  band_stop,
341
366
  high_pass,
@@ -345,7 +370,7 @@ from oscura.filtering.convenience import (
345
370
  notch_filter,
346
371
  savgol_filter,
347
372
  )
348
- from oscura.filtering.design import (
373
+ from oscura.utils.filtering.design import (
349
374
  BandPassFilter,
350
375
  BandStopFilter,
351
376
  HighPassFilter,
@@ -353,25 +378,8 @@ from oscura.filtering.design import (
353
378
  design_filter,
354
379
  )
355
380
 
356
- # Auto-Inference (INF-001 to INF-009)
357
- from oscura.inference import (
358
- AnalysisRecommendation,
359
- assess_signal_quality,
360
- auto_spectral_config,
361
- check_measurement_suitability,
362
- classify_signal,
363
- detect_logic_family,
364
- detect_protocol,
365
- get_optimal_domain_order,
366
- recommend_analyses,
367
- suggest_measurements,
368
- )
369
-
370
- # Loaders (including multi-channel support)
371
- from oscura.loaders import get_supported_formats, load, load_all_channels
372
-
373
381
  # Math/arithmetic operations (top-level convenience access)
374
- from oscura.math.arithmetic import (
382
+ from oscura.utils.math.arithmetic import (
375
383
  absolute,
376
384
  add,
377
385
  differentiate,
@@ -384,15 +392,25 @@ from oscura.math.arithmetic import (
384
392
  scale,
385
393
  subtract,
386
394
  )
387
- from oscura.math.interpolation import (
395
+ from oscura.utils.math.interpolation import (
388
396
  align_traces,
389
397
  downsample,
390
398
  interpolate,
391
399
  resample,
392
400
  )
393
401
 
402
+ # Memory management
403
+ from oscura.utils.memory import (
404
+ MemoryCheckError,
405
+ check_memory_available,
406
+ estimate_memory,
407
+ get_available_memory,
408
+ get_memory_pressure,
409
+ get_total_memory,
410
+ )
411
+
394
412
  # Expert API - Pipeline and Composition (API-001, API-002, API-004)
395
- from oscura.pipeline import (
413
+ from oscura.utils.pipeline import (
396
414
  Composable,
397
415
  Pipeline,
398
416
  TraceTransformer,
@@ -402,38 +420,14 @@ from oscura.pipeline import (
402
420
  pipe,
403
421
  )
404
422
 
405
- # Reporting
406
- from oscura.reporting.core import (
407
- Report,
408
- ReportConfig,
409
- generate_report,
410
- )
411
- from oscura.reporting.formatting import (
412
- NumberFormatter,
413
- format_value,
414
- format_with_context,
415
- format_with_units,
416
- )
417
-
418
- # Session Management (SESS-001, SESS-002, SESS-003)
419
- from oscura.session import (
420
- Annotation,
421
- AnnotationLayer,
422
- AnnotationType,
423
- HistoryEntry,
424
- OperationHistory,
425
- Session,
426
- load_session,
427
- )
428
-
429
423
  # Expert API - Streaming (API-003)
430
- from oscura.streaming import (
424
+ from oscura.utils.streaming import (
431
425
  StreamingAnalyzer,
432
426
  load_trace_chunks,
433
427
  )
434
428
 
435
429
  # Triggering (top-level convenience access)
436
- from oscura.triggering import (
430
+ from oscura.utils.triggering import (
437
431
  EdgeTrigger,
438
432
  PulseWidthTrigger,
439
433
  find_falling_edges,
@@ -444,22 +438,36 @@ from oscura.triggering import (
444
438
  find_triggers,
445
439
  )
446
440
 
447
- # Memory management
448
- from oscura.utils.memory import (
449
- MemoryCheckError,
450
- check_memory_available,
451
- estimate_memory,
452
- get_available_memory,
453
- get_memory_pressure,
454
- get_total_memory,
441
+ # EMC Compliance (EMC-001, EMC-002, EMC-003)
442
+ from oscura.validation.compliance import (
443
+ AVAILABLE_MASKS,
444
+ ComplianceReportFormat,
445
+ ComplianceResult,
446
+ ComplianceViolation,
447
+ DetectorType,
448
+ LimitMask,
449
+ check_compliance,
450
+ create_custom_mask,
451
+ generate_compliance_report,
452
+ load_limit_mask,
455
453
  )
456
454
 
457
455
  # Visualization (top-level convenience access)
458
- from oscura.visualization import (
459
- plot_fft,
460
- plot_spectrum,
461
- plot_waveform,
462
- )
456
+ # Import conditionally - these require matplotlib
457
+ try:
458
+ from oscura.visualization import (
459
+ plot_fft,
460
+ plot_spectrum,
461
+ plot_waveform,
462
+ )
463
+
464
+ _HAS_VISUALIZATION = True
465
+ except ImportError:
466
+ # Visualization features require matplotlib
467
+ _HAS_VISUALIZATION = False
468
+ plot_fft = None # type: ignore[assignment]
469
+ plot_spectrum = None # type: ignore[assignment]
470
+ plot_waveform = None # type: ignore[assignment]
463
471
 
464
472
  # Workflows (WRK-001 to WRK-005 + reverse engineering)
465
473
  from oscura.workflows import (
@@ -487,10 +495,6 @@ __all__ = [
487
495
  "AnalysisRecommendation",
488
496
  # Expert API - Results (API-005)
489
497
  "AnalysisResult",
490
- # Session Management (SESS-002)
491
- "Annotation",
492
- "AnnotationLayer",
493
- "AnnotationType",
494
498
  # Discovery
495
499
  "Anomaly",
496
500
  # Audit trail (LOG-009)
@@ -498,11 +502,16 @@ __all__ = [
498
502
  "AuditTrail",
499
503
  "BandPassFilter",
500
504
  "BandStopFilter",
505
+ # Session Management
506
+ "BlackBoxSession",
507
+ "CANSession",
501
508
  "ComplianceReportFormat",
502
509
  "ComplianceResult",
503
510
  "ComplianceViolation",
504
511
  "Composable",
505
512
  "ConfigurationError",
513
+ # Automotive
514
+ "DBCGenerator",
506
515
  # Discovery
507
516
  "DataQuality",
508
517
  # Convenience functions
@@ -516,12 +525,11 @@ __all__ = [
516
525
  "FieldSpec",
517
526
  "FilterResult",
518
527
  "FormatError",
528
+ "GenericSession",
519
529
  # Signal quality (QUAL-005)
520
530
  "Glitch",
521
531
  "GoldenReference",
522
532
  "HighPassFilter",
523
- # Session Management (SESS-003)
524
- "HistoryEntry",
525
533
  # Reverse engineering workflow
526
534
  "InferredFrame",
527
535
  "InsufficientDataError",
@@ -539,7 +547,6 @@ __all__ = [
539
547
  # Signal quality (QUAL-001)
540
548
  "NoiseMarginResult",
541
549
  "NumberFormatter",
542
- "OperationHistory",
543
550
  # Exceptions
544
551
  "OscuraError",
545
552
  # Signal quality (QUAL-007)
@@ -561,8 +568,6 @@ __all__ = [
561
568
  # Reverse engineering workflow
562
569
  "ReverseEngineeringResult",
563
570
  "SampleRateError",
564
- # Session Management (SESS-001)
565
- "Session",
566
571
  # Signal builders
567
572
  "SignalBuilder",
568
573
  # Discovery
@@ -668,11 +673,8 @@ __all__ = [
668
673
  "enob",
669
674
  # Memory management
670
675
  "estimate_memory",
671
- # Export functions
672
- "export_csv",
673
- "export_hdf5",
674
- "export_json",
675
- "export_mat",
676
+ # Export functions - removed legacy exports
677
+ # Use oscura.export.wireshark, kaitai_struct, scapy_layer instead
676
678
  # Component analysis
677
679
  "extract_impedance",
678
680
  "extract_parasitics",
@@ -728,8 +730,8 @@ __all__ = [
728
730
  "load_config",
729
731
  "load_limit_mask",
730
732
  "load_plugin",
731
- # Session Management
732
- "load_session",
733
+ # Session Management - removed legacy load_session
734
+ # Use AnalysisSession API instead
733
735
  # Expert API - Streaming (API-003)
734
736
  "load_trace_chunks",
735
737
  # Filtering
@@ -10,6 +10,7 @@ Provides signal analysis functionality including:
10
10
  - Eye diagram analysis (height, width, Q-factor)
11
11
  - Signal integrity (S-parameters, equalization)
12
12
  - Side-channel analysis (DPA, CPA, timing attacks)
13
+ - Machine learning classification (automatic protocol detection)
13
14
  """
14
15
 
15
16
  # Import measurements module as namespace for DSL compatibility
@@ -18,6 +19,7 @@ from oscura.analyzers import (
18
19
  eye,
19
20
  jitter,
20
21
  measurements,
22
+ ml,
21
23
  protocols,
22
24
  side_channel,
23
25
  signal_integrity,
@@ -31,6 +33,7 @@ __all__ = [
31
33
  "eye",
32
34
  "jitter",
33
35
  "measurements",
36
+ "ml",
34
37
  "protocols",
35
38
  "side_channel",
36
39
  "signal_integrity",