oscura 0.5.0__py3-none-any.whl → 0.6.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 (513) 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/__init__.py +0 -48
  5. oscura/analyzers/digital/edges.py +325 -65
  6. oscura/analyzers/digital/extraction.py +0 -195
  7. oscura/analyzers/digital/quality.py +293 -166
  8. oscura/analyzers/digital/timing.py +260 -115
  9. oscura/analyzers/digital/timing_numba.py +334 -0
  10. oscura/analyzers/entropy.py +605 -0
  11. oscura/analyzers/eye/diagram.py +176 -109
  12. oscura/analyzers/eye/metrics.py +5 -5
  13. oscura/analyzers/jitter/__init__.py +6 -4
  14. oscura/analyzers/jitter/ber.py +52 -52
  15. oscura/analyzers/jitter/classification.py +156 -0
  16. oscura/analyzers/jitter/decomposition.py +163 -113
  17. oscura/analyzers/jitter/spectrum.py +80 -64
  18. oscura/analyzers/ml/__init__.py +39 -0
  19. oscura/analyzers/ml/features.py +600 -0
  20. oscura/analyzers/ml/signal_classifier.py +604 -0
  21. oscura/analyzers/packet/daq.py +246 -158
  22. oscura/analyzers/packet/parser.py +12 -1
  23. oscura/analyzers/packet/payload.py +50 -2110
  24. oscura/analyzers/packet/payload_analysis.py +361 -181
  25. oscura/analyzers/packet/payload_patterns.py +133 -70
  26. oscura/analyzers/packet/stream.py +84 -23
  27. oscura/analyzers/patterns/__init__.py +26 -5
  28. oscura/analyzers/patterns/anomaly_detection.py +908 -0
  29. oscura/analyzers/patterns/clustering.py +169 -108
  30. oscura/analyzers/patterns/clustering_optimized.py +227 -0
  31. oscura/analyzers/patterns/discovery.py +1 -1
  32. oscura/analyzers/patterns/matching.py +581 -197
  33. oscura/analyzers/patterns/pattern_mining.py +778 -0
  34. oscura/analyzers/patterns/periodic.py +121 -38
  35. oscura/analyzers/patterns/sequences.py +175 -78
  36. oscura/analyzers/power/conduction.py +1 -1
  37. oscura/analyzers/power/soa.py +6 -6
  38. oscura/analyzers/power/switching.py +250 -110
  39. oscura/analyzers/protocol/__init__.py +17 -1
  40. oscura/analyzers/protocols/__init__.py +1 -22
  41. oscura/analyzers/protocols/base.py +6 -6
  42. oscura/analyzers/protocols/ble/__init__.py +38 -0
  43. oscura/analyzers/protocols/ble/analyzer.py +809 -0
  44. oscura/analyzers/protocols/ble/uuids.py +288 -0
  45. oscura/analyzers/protocols/can.py +257 -127
  46. oscura/analyzers/protocols/can_fd.py +107 -80
  47. oscura/analyzers/protocols/flexray.py +139 -80
  48. oscura/analyzers/protocols/hdlc.py +93 -58
  49. oscura/analyzers/protocols/i2c.py +247 -106
  50. oscura/analyzers/protocols/i2s.py +138 -86
  51. oscura/analyzers/protocols/industrial/__init__.py +40 -0
  52. oscura/analyzers/protocols/industrial/bacnet/__init__.py +33 -0
  53. oscura/analyzers/protocols/industrial/bacnet/analyzer.py +708 -0
  54. oscura/analyzers/protocols/industrial/bacnet/encoding.py +412 -0
  55. oscura/analyzers/protocols/industrial/bacnet/services.py +622 -0
  56. oscura/analyzers/protocols/industrial/ethercat/__init__.py +30 -0
  57. oscura/analyzers/protocols/industrial/ethercat/analyzer.py +474 -0
  58. oscura/analyzers/protocols/industrial/ethercat/mailbox.py +339 -0
  59. oscura/analyzers/protocols/industrial/ethercat/topology.py +166 -0
  60. oscura/analyzers/protocols/industrial/modbus/__init__.py +31 -0
  61. oscura/analyzers/protocols/industrial/modbus/analyzer.py +525 -0
  62. oscura/analyzers/protocols/industrial/modbus/crc.py +79 -0
  63. oscura/analyzers/protocols/industrial/modbus/functions.py +436 -0
  64. oscura/analyzers/protocols/industrial/opcua/__init__.py +21 -0
  65. oscura/analyzers/protocols/industrial/opcua/analyzer.py +552 -0
  66. oscura/analyzers/protocols/industrial/opcua/datatypes.py +446 -0
  67. oscura/analyzers/protocols/industrial/opcua/services.py +264 -0
  68. oscura/analyzers/protocols/industrial/profinet/__init__.py +23 -0
  69. oscura/analyzers/protocols/industrial/profinet/analyzer.py +441 -0
  70. oscura/analyzers/protocols/industrial/profinet/dcp.py +263 -0
  71. oscura/analyzers/protocols/industrial/profinet/ptcp.py +200 -0
  72. oscura/analyzers/protocols/jtag.py +180 -98
  73. oscura/analyzers/protocols/lin.py +219 -114
  74. oscura/analyzers/protocols/manchester.py +4 -4
  75. oscura/analyzers/protocols/onewire.py +253 -149
  76. oscura/analyzers/protocols/parallel_bus/__init__.py +20 -0
  77. oscura/analyzers/protocols/parallel_bus/centronics.py +92 -0
  78. oscura/analyzers/protocols/parallel_bus/gpib.py +137 -0
  79. oscura/analyzers/protocols/spi.py +192 -95
  80. oscura/analyzers/protocols/swd.py +321 -167
  81. oscura/analyzers/protocols/uart.py +267 -125
  82. oscura/analyzers/protocols/usb.py +235 -131
  83. oscura/analyzers/side_channel/power.py +17 -12
  84. oscura/analyzers/signal/__init__.py +15 -0
  85. oscura/analyzers/signal/timing_analysis.py +1086 -0
  86. oscura/analyzers/signal_integrity/__init__.py +4 -1
  87. oscura/analyzers/signal_integrity/sparams.py +2 -19
  88. oscura/analyzers/spectral/chunked.py +129 -60
  89. oscura/analyzers/spectral/chunked_fft.py +300 -94
  90. oscura/analyzers/spectral/chunked_wavelet.py +100 -80
  91. oscura/analyzers/statistical/checksum.py +376 -217
  92. oscura/analyzers/statistical/classification.py +229 -107
  93. oscura/analyzers/statistical/entropy.py +78 -53
  94. oscura/analyzers/statistics/correlation.py +407 -211
  95. oscura/analyzers/statistics/outliers.py +2 -2
  96. oscura/analyzers/statistics/streaming.py +30 -5
  97. oscura/analyzers/validation.py +216 -101
  98. oscura/analyzers/waveform/measurements.py +9 -0
  99. oscura/analyzers/waveform/measurements_with_uncertainty.py +31 -15
  100. oscura/analyzers/waveform/spectral.py +500 -228
  101. oscura/api/__init__.py +31 -5
  102. oscura/api/dsl/__init__.py +582 -0
  103. oscura/{dsl → api/dsl}/commands.py +43 -76
  104. oscura/{dsl → api/dsl}/interpreter.py +26 -51
  105. oscura/{dsl → api/dsl}/parser.py +107 -77
  106. oscura/{dsl → api/dsl}/repl.py +2 -2
  107. oscura/api/dsl.py +1 -1
  108. oscura/{integrations → api/integrations}/__init__.py +1 -1
  109. oscura/{integrations → api/integrations}/llm.py +201 -102
  110. oscura/api/operators.py +3 -3
  111. oscura/api/optimization.py +144 -30
  112. oscura/api/rest_server.py +921 -0
  113. oscura/api/server/__init__.py +17 -0
  114. oscura/api/server/dashboard.py +850 -0
  115. oscura/api/server/static/README.md +34 -0
  116. oscura/api/server/templates/base.html +181 -0
  117. oscura/api/server/templates/export.html +120 -0
  118. oscura/api/server/templates/home.html +284 -0
  119. oscura/api/server/templates/protocols.html +58 -0
  120. oscura/api/server/templates/reports.html +43 -0
  121. oscura/api/server/templates/session_detail.html +89 -0
  122. oscura/api/server/templates/sessions.html +83 -0
  123. oscura/api/server/templates/waveforms.html +73 -0
  124. oscura/automotive/__init__.py +8 -1
  125. oscura/automotive/can/__init__.py +10 -0
  126. oscura/automotive/can/checksum.py +3 -1
  127. oscura/automotive/can/dbc_generator.py +590 -0
  128. oscura/automotive/can/message_wrapper.py +121 -74
  129. oscura/automotive/can/patterns.py +98 -21
  130. oscura/automotive/can/session.py +292 -56
  131. oscura/automotive/can/state_machine.py +6 -3
  132. oscura/automotive/can/stimulus_response.py +97 -75
  133. oscura/automotive/dbc/__init__.py +10 -2
  134. oscura/automotive/dbc/generator.py +84 -56
  135. oscura/automotive/dbc/parser.py +6 -6
  136. oscura/automotive/dtc/data.json +2763 -0
  137. oscura/automotive/dtc/database.py +2 -2
  138. oscura/automotive/flexray/__init__.py +31 -0
  139. oscura/automotive/flexray/analyzer.py +504 -0
  140. oscura/automotive/flexray/crc.py +185 -0
  141. oscura/automotive/flexray/fibex.py +449 -0
  142. oscura/automotive/j1939/__init__.py +45 -8
  143. oscura/automotive/j1939/analyzer.py +605 -0
  144. oscura/automotive/j1939/spns.py +326 -0
  145. oscura/automotive/j1939/transport.py +306 -0
  146. oscura/automotive/lin/__init__.py +47 -0
  147. oscura/automotive/lin/analyzer.py +612 -0
  148. oscura/automotive/loaders/blf.py +13 -2
  149. oscura/automotive/loaders/csv_can.py +143 -72
  150. oscura/automotive/loaders/dispatcher.py +50 -2
  151. oscura/automotive/loaders/mdf.py +86 -45
  152. oscura/automotive/loaders/pcap.py +111 -61
  153. oscura/automotive/uds/__init__.py +4 -0
  154. oscura/automotive/uds/analyzer.py +725 -0
  155. oscura/automotive/uds/decoder.py +140 -58
  156. oscura/automotive/uds/models.py +7 -1
  157. oscura/automotive/visualization.py +1 -1
  158. oscura/cli/analyze.py +348 -0
  159. oscura/cli/batch.py +142 -122
  160. oscura/cli/benchmark.py +275 -0
  161. oscura/cli/characterize.py +137 -82
  162. oscura/cli/compare.py +224 -131
  163. oscura/cli/completion.py +250 -0
  164. oscura/cli/config_cmd.py +361 -0
  165. oscura/cli/decode.py +164 -87
  166. oscura/cli/export.py +286 -0
  167. oscura/cli/main.py +115 -31
  168. oscura/{onboarding → cli/onboarding}/__init__.py +3 -3
  169. oscura/{onboarding → cli/onboarding}/help.py +80 -58
  170. oscura/{onboarding → cli/onboarding}/tutorials.py +97 -72
  171. oscura/{onboarding → cli/onboarding}/wizard.py +55 -36
  172. oscura/cli/progress.py +147 -0
  173. oscura/cli/shell.py +157 -135
  174. oscura/cli/validate_cmd.py +204 -0
  175. oscura/cli/visualize.py +158 -0
  176. oscura/convenience.py +125 -79
  177. oscura/core/__init__.py +4 -2
  178. oscura/core/backend_selector.py +3 -3
  179. oscura/core/cache.py +126 -15
  180. oscura/core/cancellation.py +1 -1
  181. oscura/{config → core/config}/__init__.py +20 -11
  182. oscura/{config → core/config}/defaults.py +1 -1
  183. oscura/{config → core/config}/loader.py +7 -5
  184. oscura/{config → core/config}/memory.py +5 -5
  185. oscura/{config → core/config}/migration.py +1 -1
  186. oscura/{config → core/config}/pipeline.py +99 -23
  187. oscura/{config → core/config}/preferences.py +1 -1
  188. oscura/{config → core/config}/protocol.py +3 -3
  189. oscura/{config → core/config}/schema.py +426 -272
  190. oscura/{config → core/config}/settings.py +1 -1
  191. oscura/{config → core/config}/thresholds.py +195 -153
  192. oscura/core/correlation.py +5 -6
  193. oscura/core/cross_domain.py +0 -2
  194. oscura/core/debug.py +9 -5
  195. oscura/{extensibility → core/extensibility}/docs.py +158 -70
  196. oscura/{extensibility → core/extensibility}/extensions.py +160 -76
  197. oscura/{extensibility → core/extensibility}/logging.py +1 -1
  198. oscura/{extensibility → core/extensibility}/measurements.py +1 -1
  199. oscura/{extensibility → core/extensibility}/plugins.py +1 -1
  200. oscura/{extensibility → core/extensibility}/templates.py +73 -3
  201. oscura/{extensibility → core/extensibility}/validation.py +1 -1
  202. oscura/core/gpu_backend.py +11 -7
  203. oscura/core/log_query.py +101 -11
  204. oscura/core/logging.py +126 -54
  205. oscura/core/logging_advanced.py +5 -5
  206. oscura/core/memory_limits.py +108 -70
  207. oscura/core/memory_monitor.py +2 -2
  208. oscura/core/memory_progress.py +7 -7
  209. oscura/core/memory_warnings.py +1 -1
  210. oscura/core/numba_backend.py +13 -13
  211. oscura/{plugins → core/plugins}/__init__.py +9 -9
  212. oscura/{plugins → core/plugins}/base.py +7 -7
  213. oscura/{plugins → core/plugins}/cli.py +3 -3
  214. oscura/{plugins → core/plugins}/discovery.py +186 -106
  215. oscura/{plugins → core/plugins}/lifecycle.py +1 -1
  216. oscura/{plugins → core/plugins}/manager.py +7 -7
  217. oscura/{plugins → core/plugins}/registry.py +3 -3
  218. oscura/{plugins → core/plugins}/versioning.py +1 -1
  219. oscura/core/progress.py +16 -1
  220. oscura/core/provenance.py +8 -2
  221. oscura/{schemas → core/schemas}/__init__.py +2 -2
  222. oscura/core/schemas/bus_configuration.json +322 -0
  223. oscura/core/schemas/device_mapping.json +182 -0
  224. oscura/core/schemas/packet_format.json +418 -0
  225. oscura/core/schemas/protocol_definition.json +363 -0
  226. oscura/core/types.py +4 -0
  227. oscura/core/uncertainty.py +3 -3
  228. oscura/correlation/__init__.py +52 -0
  229. oscura/correlation/multi_protocol.py +811 -0
  230. oscura/discovery/auto_decoder.py +117 -35
  231. oscura/discovery/comparison.py +191 -86
  232. oscura/discovery/quality_validator.py +155 -68
  233. oscura/discovery/signal_detector.py +196 -79
  234. oscura/export/__init__.py +18 -20
  235. oscura/export/kaitai_struct.py +513 -0
  236. oscura/export/scapy_layer.py +801 -0
  237. oscura/export/wireshark/README.md +15 -15
  238. oscura/export/wireshark/generator.py +1 -1
  239. oscura/export/wireshark/templates/dissector.lua.j2 +2 -2
  240. oscura/export/wireshark_dissector.py +746 -0
  241. oscura/guidance/wizard.py +207 -111
  242. oscura/hardware/__init__.py +19 -0
  243. oscura/{acquisition → hardware/acquisition}/__init__.py +4 -4
  244. oscura/{acquisition → hardware/acquisition}/file.py +2 -2
  245. oscura/{acquisition → hardware/acquisition}/hardware.py +7 -7
  246. oscura/{acquisition → hardware/acquisition}/saleae.py +15 -12
  247. oscura/{acquisition → hardware/acquisition}/socketcan.py +1 -1
  248. oscura/{acquisition → hardware/acquisition}/streaming.py +2 -2
  249. oscura/{acquisition → hardware/acquisition}/synthetic.py +3 -3
  250. oscura/{acquisition → hardware/acquisition}/visa.py +33 -11
  251. oscura/hardware/firmware/__init__.py +29 -0
  252. oscura/hardware/firmware/pattern_recognition.py +874 -0
  253. oscura/hardware/hal_detector.py +736 -0
  254. oscura/hardware/security/__init__.py +37 -0
  255. oscura/hardware/security/side_channel_detector.py +1126 -0
  256. oscura/inference/__init__.py +4 -0
  257. oscura/inference/active_learning/README.md +7 -7
  258. oscura/inference/active_learning/observation_table.py +4 -1
  259. oscura/inference/alignment.py +216 -123
  260. oscura/inference/bayesian.py +113 -33
  261. oscura/inference/crc_reverse.py +101 -55
  262. oscura/inference/logic.py +6 -2
  263. oscura/inference/message_format.py +342 -183
  264. oscura/inference/protocol.py +95 -44
  265. oscura/inference/protocol_dsl.py +180 -82
  266. oscura/inference/signal_intelligence.py +1439 -706
  267. oscura/inference/spectral.py +99 -57
  268. oscura/inference/state_machine.py +810 -158
  269. oscura/inference/stream.py +270 -110
  270. oscura/iot/__init__.py +34 -0
  271. oscura/iot/coap/__init__.py +32 -0
  272. oscura/iot/coap/analyzer.py +668 -0
  273. oscura/iot/coap/options.py +212 -0
  274. oscura/iot/lorawan/__init__.py +21 -0
  275. oscura/iot/lorawan/crypto.py +206 -0
  276. oscura/iot/lorawan/decoder.py +801 -0
  277. oscura/iot/lorawan/mac_commands.py +341 -0
  278. oscura/iot/mqtt/__init__.py +27 -0
  279. oscura/iot/mqtt/analyzer.py +999 -0
  280. oscura/iot/mqtt/properties.py +315 -0
  281. oscura/iot/zigbee/__init__.py +31 -0
  282. oscura/iot/zigbee/analyzer.py +615 -0
  283. oscura/iot/zigbee/security.py +153 -0
  284. oscura/iot/zigbee/zcl.py +349 -0
  285. oscura/jupyter/display.py +125 -45
  286. oscura/{exploratory → jupyter/exploratory}/__init__.py +8 -8
  287. oscura/{exploratory → jupyter/exploratory}/error_recovery.py +298 -141
  288. oscura/jupyter/exploratory/fuzzy.py +746 -0
  289. oscura/{exploratory → jupyter/exploratory}/fuzzy_advanced.py +258 -100
  290. oscura/{exploratory → jupyter/exploratory}/legacy.py +464 -242
  291. oscura/{exploratory → jupyter/exploratory}/parse.py +167 -145
  292. oscura/{exploratory → jupyter/exploratory}/recovery.py +119 -87
  293. oscura/jupyter/exploratory/sync.py +612 -0
  294. oscura/{exploratory → jupyter/exploratory}/unknown.py +299 -176
  295. oscura/jupyter/magic.py +4 -4
  296. oscura/{ui → jupyter/ui}/__init__.py +2 -2
  297. oscura/{ui → jupyter/ui}/formatters.py +3 -3
  298. oscura/{ui → jupyter/ui}/progressive_display.py +153 -82
  299. oscura/loaders/__init__.py +171 -63
  300. oscura/loaders/binary.py +88 -1
  301. oscura/loaders/chipwhisperer.py +153 -137
  302. oscura/loaders/configurable.py +208 -86
  303. oscura/loaders/csv_loader.py +458 -215
  304. oscura/loaders/hdf5_loader.py +278 -119
  305. oscura/loaders/lazy.py +87 -54
  306. oscura/loaders/mmap_loader.py +1 -1
  307. oscura/loaders/numpy_loader.py +253 -116
  308. oscura/loaders/pcap.py +226 -151
  309. oscura/loaders/rigol.py +110 -49
  310. oscura/loaders/sigrok.py +201 -78
  311. oscura/loaders/tdms.py +81 -58
  312. oscura/loaders/tektronix.py +291 -174
  313. oscura/loaders/touchstone.py +182 -87
  314. oscura/loaders/vcd.py +215 -117
  315. oscura/loaders/wav.py +155 -68
  316. oscura/reporting/__init__.py +9 -7
  317. oscura/reporting/analyze.py +352 -146
  318. oscura/reporting/argument_preparer.py +69 -14
  319. oscura/reporting/auto_report.py +97 -61
  320. oscura/reporting/batch.py +131 -58
  321. oscura/reporting/chart_selection.py +57 -45
  322. oscura/reporting/comparison.py +63 -17
  323. oscura/reporting/content/executive.py +76 -24
  324. oscura/reporting/core_formats/multi_format.py +11 -8
  325. oscura/reporting/engine.py +312 -158
  326. oscura/reporting/enhanced_reports.py +949 -0
  327. oscura/reporting/export.py +86 -43
  328. oscura/reporting/formatting/numbers.py +69 -42
  329. oscura/reporting/html.py +139 -58
  330. oscura/reporting/index.py +137 -65
  331. oscura/reporting/output.py +158 -67
  332. oscura/reporting/pdf.py +67 -102
  333. oscura/reporting/plots.py +191 -112
  334. oscura/reporting/sections.py +88 -47
  335. oscura/reporting/standards.py +104 -61
  336. oscura/reporting/summary_generator.py +75 -55
  337. oscura/reporting/tables.py +138 -54
  338. oscura/reporting/templates/enhanced/protocol_re.html +525 -0
  339. oscura/reporting/templates/index.md +13 -13
  340. oscura/sessions/__init__.py +14 -23
  341. oscura/sessions/base.py +3 -3
  342. oscura/sessions/blackbox.py +106 -10
  343. oscura/sessions/generic.py +2 -2
  344. oscura/sessions/legacy.py +783 -0
  345. oscura/side_channel/__init__.py +63 -0
  346. oscura/side_channel/dpa.py +1025 -0
  347. oscura/utils/__init__.py +15 -1
  348. oscura/utils/autodetect.py +1 -5
  349. oscura/utils/bitwise.py +118 -0
  350. oscura/{builders → utils/builders}/__init__.py +1 -1
  351. oscura/{comparison → utils/comparison}/__init__.py +6 -6
  352. oscura/{comparison → utils/comparison}/compare.py +202 -101
  353. oscura/{comparison → utils/comparison}/golden.py +83 -63
  354. oscura/{comparison → utils/comparison}/limits.py +313 -89
  355. oscura/{comparison → utils/comparison}/mask.py +151 -45
  356. oscura/{comparison → utils/comparison}/trace_diff.py +1 -1
  357. oscura/{comparison → utils/comparison}/visualization.py +147 -89
  358. oscura/{component → utils/component}/__init__.py +3 -3
  359. oscura/{component → utils/component}/impedance.py +122 -58
  360. oscura/{component → utils/component}/reactive.py +165 -168
  361. oscura/{component → utils/component}/transmission_line.py +3 -3
  362. oscura/{filtering → utils/filtering}/__init__.py +6 -6
  363. oscura/{filtering → utils/filtering}/base.py +1 -1
  364. oscura/{filtering → utils/filtering}/convenience.py +2 -2
  365. oscura/{filtering → utils/filtering}/design.py +169 -93
  366. oscura/{filtering → utils/filtering}/filters.py +2 -2
  367. oscura/{filtering → utils/filtering}/introspection.py +2 -2
  368. oscura/utils/geometry.py +31 -0
  369. oscura/utils/imports.py +184 -0
  370. oscura/utils/lazy.py +1 -1
  371. oscura/{math → utils/math}/__init__.py +2 -2
  372. oscura/{math → utils/math}/arithmetic.py +114 -48
  373. oscura/{math → utils/math}/interpolation.py +139 -106
  374. oscura/utils/memory.py +129 -66
  375. oscura/utils/memory_advanced.py +92 -9
  376. oscura/utils/memory_extensions.py +10 -8
  377. oscura/{optimization → utils/optimization}/__init__.py +1 -1
  378. oscura/{optimization → utils/optimization}/search.py +2 -2
  379. oscura/utils/performance/__init__.py +58 -0
  380. oscura/utils/performance/caching.py +889 -0
  381. oscura/utils/performance/lsh_clustering.py +333 -0
  382. oscura/utils/performance/memory_optimizer.py +699 -0
  383. oscura/utils/performance/optimizations.py +675 -0
  384. oscura/utils/performance/parallel.py +654 -0
  385. oscura/utils/performance/profiling.py +661 -0
  386. oscura/{pipeline → utils/pipeline}/base.py +1 -1
  387. oscura/{pipeline → utils/pipeline}/composition.py +11 -3
  388. oscura/{pipeline → utils/pipeline}/parallel.py +3 -2
  389. oscura/{pipeline → utils/pipeline}/pipeline.py +1 -1
  390. oscura/{pipeline → utils/pipeline}/reverse_engineering.py +412 -221
  391. oscura/{search → utils/search}/__init__.py +3 -3
  392. oscura/{search → utils/search}/anomaly.py +188 -58
  393. oscura/utils/search/context.py +294 -0
  394. oscura/{search → utils/search}/pattern.py +138 -10
  395. oscura/utils/serial.py +51 -0
  396. oscura/utils/storage/__init__.py +61 -0
  397. oscura/utils/storage/database.py +1166 -0
  398. oscura/{streaming → utils/streaming}/chunked.py +302 -143
  399. oscura/{streaming → utils/streaming}/progressive.py +1 -1
  400. oscura/{streaming → utils/streaming}/realtime.py +3 -2
  401. oscura/{triggering → utils/triggering}/__init__.py +6 -6
  402. oscura/{triggering → utils/triggering}/base.py +6 -6
  403. oscura/{triggering → utils/triggering}/edge.py +2 -2
  404. oscura/{triggering → utils/triggering}/pattern.py +2 -2
  405. oscura/{triggering → utils/triggering}/pulse.py +115 -74
  406. oscura/{triggering → utils/triggering}/window.py +2 -2
  407. oscura/utils/validation.py +32 -0
  408. oscura/validation/__init__.py +121 -0
  409. oscura/{compliance → validation/compliance}/__init__.py +5 -5
  410. oscura/{compliance → validation/compliance}/advanced.py +5 -5
  411. oscura/{compliance → validation/compliance}/masks.py +1 -1
  412. oscura/{compliance → validation/compliance}/reporting.py +127 -53
  413. oscura/{compliance → validation/compliance}/testing.py +114 -52
  414. oscura/validation/compliance_tests.py +915 -0
  415. oscura/validation/fuzzer.py +990 -0
  416. oscura/validation/grammar_tests.py +596 -0
  417. oscura/validation/grammar_validator.py +904 -0
  418. oscura/validation/hil_testing.py +977 -0
  419. oscura/{quality → validation/quality}/__init__.py +4 -4
  420. oscura/{quality → validation/quality}/ensemble.py +251 -171
  421. oscura/{quality → validation/quality}/explainer.py +3 -3
  422. oscura/{quality → validation/quality}/scoring.py +1 -1
  423. oscura/{quality → validation/quality}/warnings.py +4 -4
  424. oscura/validation/regression_suite.py +808 -0
  425. oscura/validation/replay.py +788 -0
  426. oscura/{testing → validation/testing}/__init__.py +2 -2
  427. oscura/{testing → validation/testing}/synthetic.py +5 -5
  428. oscura/visualization/__init__.py +9 -0
  429. oscura/visualization/accessibility.py +1 -1
  430. oscura/visualization/annotations.py +64 -67
  431. oscura/visualization/colors.py +7 -7
  432. oscura/visualization/digital.py +180 -81
  433. oscura/visualization/eye.py +236 -85
  434. oscura/visualization/interactive.py +320 -143
  435. oscura/visualization/jitter.py +587 -247
  436. oscura/visualization/layout.py +169 -134
  437. oscura/visualization/optimization.py +103 -52
  438. oscura/visualization/palettes.py +1 -1
  439. oscura/visualization/power.py +427 -211
  440. oscura/visualization/power_extended.py +626 -297
  441. oscura/visualization/presets.py +2 -0
  442. oscura/visualization/protocols.py +495 -181
  443. oscura/visualization/render.py +79 -63
  444. oscura/visualization/reverse_engineering.py +171 -124
  445. oscura/visualization/signal_integrity.py +460 -279
  446. oscura/visualization/specialized.py +190 -100
  447. oscura/visualization/spectral.py +670 -255
  448. oscura/visualization/thumbnails.py +166 -137
  449. oscura/visualization/waveform.py +150 -63
  450. oscura/workflows/__init__.py +3 -0
  451. oscura/{batch → workflows/batch}/__init__.py +5 -5
  452. oscura/{batch → workflows/batch}/advanced.py +150 -75
  453. oscura/workflows/batch/aggregate.py +531 -0
  454. oscura/workflows/batch/analyze.py +236 -0
  455. oscura/{batch → workflows/batch}/logging.py +2 -2
  456. oscura/{batch → workflows/batch}/metrics.py +1 -1
  457. oscura/workflows/complete_re.py +1144 -0
  458. oscura/workflows/compliance.py +44 -54
  459. oscura/workflows/digital.py +197 -51
  460. oscura/workflows/legacy/__init__.py +12 -0
  461. oscura/{workflow → workflows/legacy}/dag.py +4 -1
  462. oscura/workflows/multi_trace.py +9 -9
  463. oscura/workflows/power.py +42 -62
  464. oscura/workflows/protocol.py +82 -49
  465. oscura/workflows/reverse_engineering.py +351 -150
  466. oscura/workflows/signal_integrity.py +157 -82
  467. oscura-0.6.0.dist-info/METADATA +643 -0
  468. oscura-0.6.0.dist-info/RECORD +590 -0
  469. oscura/analyzers/digital/ic_database.py +0 -498
  470. oscura/analyzers/digital/timing_paths.py +0 -339
  471. oscura/analyzers/digital/vintage.py +0 -377
  472. oscura/analyzers/digital/vintage_result.py +0 -148
  473. oscura/analyzers/protocols/parallel_bus.py +0 -449
  474. oscura/batch/aggregate.py +0 -300
  475. oscura/batch/analyze.py +0 -139
  476. oscura/dsl/__init__.py +0 -73
  477. oscura/exceptions.py +0 -59
  478. oscura/exploratory/fuzzy.py +0 -513
  479. oscura/exploratory/sync.py +0 -384
  480. oscura/export/wavedrom.py +0 -430
  481. oscura/exporters/__init__.py +0 -94
  482. oscura/exporters/csv.py +0 -303
  483. oscura/exporters/exporters.py +0 -44
  484. oscura/exporters/hdf5.py +0 -217
  485. oscura/exporters/html_export.py +0 -701
  486. oscura/exporters/json_export.py +0 -338
  487. oscura/exporters/markdown_export.py +0 -367
  488. oscura/exporters/matlab_export.py +0 -354
  489. oscura/exporters/npz_export.py +0 -219
  490. oscura/exporters/spice_export.py +0 -210
  491. oscura/exporters/vintage_logic_csv.py +0 -247
  492. oscura/reporting/vintage_logic_report.py +0 -523
  493. oscura/search/context.py +0 -149
  494. oscura/session/__init__.py +0 -34
  495. oscura/session/annotations.py +0 -289
  496. oscura/session/history.py +0 -313
  497. oscura/session/session.py +0 -520
  498. oscura/visualization/digital_advanced.py +0 -718
  499. oscura/visualization/figure_manager.py +0 -156
  500. oscura/workflow/__init__.py +0 -13
  501. oscura-0.5.0.dist-info/METADATA +0 -407
  502. oscura-0.5.0.dist-info/RECORD +0 -486
  503. /oscura/core/{config.py → config/legacy.py} +0 -0
  504. /oscura/{extensibility → core/extensibility}/__init__.py +0 -0
  505. /oscura/{extensibility → core/extensibility}/registry.py +0 -0
  506. /oscura/{plugins → core/plugins}/isolation.py +0 -0
  507. /oscura/{builders → utils/builders}/signal_builder.py +0 -0
  508. /oscura/{optimization → utils/optimization}/parallel.py +0 -0
  509. /oscura/{pipeline → utils/pipeline}/__init__.py +0 -0
  510. /oscura/{streaming → utils/streaming}/__init__.py +0 -0
  511. {oscura-0.5.0.dist-info → oscura-0.6.0.dist-info}/WHEEL +0 -0
  512. {oscura-0.5.0.dist-info → oscura-0.6.0.dist-info}/entry_points.txt +0 -0
  513. {oscura-0.5.0.dist-info → oscura-0.6.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,525 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>{{ title }}</title>
7
+ <script src="https://cdn.plot.ly/plotly-2.27.0.min.js"></script>
8
+ <style>
9
+ :root {
10
+ --bg-color: {{ theme.background_color }};
11
+ --text-color: {{ theme.text_color }};
12
+ --primary-color: {{ theme.primary_color }};
13
+ --secondary-color: {{ theme.secondary_color }};
14
+ --border-color: {{ theme.border_color }};
15
+ --code-bg: {{ theme.code_background }};
16
+ }
17
+
18
+ * {
19
+ box-sizing: border-box;
20
+ margin: 0;
21
+ padding: 0;
22
+ }
23
+
24
+ body {
25
+ font-family: 'Segoe UI', -apple-system, BlinkMacSystemFont, Roboto, sans-serif;
26
+ line-height: 1.6;
27
+ background-color: var(--bg-color);
28
+ color: var(--text-color);
29
+ padding: 0;
30
+ }
31
+
32
+ .container {
33
+ max-width: 1400px;
34
+ margin: 0 auto;
35
+ padding: 40px 20px;
36
+ }
37
+
38
+ /* Header */
39
+ .header {
40
+ background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));
41
+ color: white;
42
+ padding: 60px 40px;
43
+ margin: -40px -20px 40px -20px;
44
+ box-shadow: 0 4px 6px rgba(0,0,0,0.1);
45
+ }
46
+
47
+ .header h1 {
48
+ font-size: 2.5rem;
49
+ margin-bottom: 10px;
50
+ font-weight: 600;
51
+ }
52
+
53
+ .header .meta {
54
+ opacity: 0.9;
55
+ font-size: 0.95rem;
56
+ }
57
+
58
+ /* Table of Contents */
59
+ .toc {
60
+ background: var(--code-bg);
61
+ border-left: 4px solid var(--primary-color);
62
+ padding: 20px;
63
+ margin: 30px 0;
64
+ border-radius: 4px;
65
+ }
66
+
67
+ .toc h2 {
68
+ margin-bottom: 15px;
69
+ font-size: 1.3rem;
70
+ }
71
+
72
+ .toc ul {
73
+ list-style: none;
74
+ }
75
+
76
+ .toc li {
77
+ margin: 8px 0;
78
+ }
79
+
80
+ .toc a {
81
+ color: var(--secondary-color);
82
+ text-decoration: none;
83
+ transition: color 0.2s;
84
+ }
85
+
86
+ .toc a:hover {
87
+ color: var(--primary-color);
88
+ text-decoration: underline;
89
+ }
90
+
91
+ /* Sections */
92
+ .section {
93
+ margin: 50px 0;
94
+ scroll-margin-top: 20px;
95
+ }
96
+
97
+ .section h2 {
98
+ color: var(--primary-color);
99
+ border-bottom: 3px solid var(--primary-color);
100
+ padding-bottom: 12px;
101
+ margin-bottom: 25px;
102
+ font-size: 1.8rem;
103
+ }
104
+
105
+ .section h3 {
106
+ color: var(--secondary-color);
107
+ margin-top: 30px;
108
+ margin-bottom: 15px;
109
+ font-size: 1.4rem;
110
+ }
111
+
112
+ /* Cards */
113
+ .card {
114
+ background: var(--code-bg);
115
+ border: 1px solid var(--border-color);
116
+ border-radius: 8px;
117
+ padding: 25px;
118
+ margin: 20px 0;
119
+ box-shadow: 0 2px 4px rgba(0,0,0,0.05);
120
+ }
121
+
122
+ .card-header {
123
+ font-weight: 600;
124
+ color: var(--primary-color);
125
+ margin-bottom: 15px;
126
+ font-size: 1.1rem;
127
+ }
128
+
129
+ /* Tables */
130
+ table {
131
+ width: 100%;
132
+ border-collapse: collapse;
133
+ margin: 20px 0;
134
+ background: white;
135
+ box-shadow: 0 2px 4px rgba(0,0,0,0.05);
136
+ }
137
+
138
+ th {
139
+ background: var(--primary-color);
140
+ color: white;
141
+ padding: 15px;
142
+ text-align: left;
143
+ font-weight: 600;
144
+ }
145
+
146
+ td {
147
+ padding: 12px 15px;
148
+ border-bottom: 1px solid var(--border-color);
149
+ }
150
+
151
+ tr:nth-child(even) {
152
+ background-color: rgba(0,0,0,0.02);
153
+ }
154
+
155
+ tr:hover {
156
+ background-color: rgba(0,0,0,0.05);
157
+ }
158
+
159
+ /* Badges */
160
+ .badge {
161
+ display: inline-block;
162
+ padding: 4px 12px;
163
+ border-radius: 12px;
164
+ font-size: 0.85rem;
165
+ font-weight: 600;
166
+ }
167
+
168
+ .badge-success {
169
+ background: #d4edda;
170
+ color: #155724;
171
+ }
172
+
173
+ .badge-warning {
174
+ background: #fff3cd;
175
+ color: #856404;
176
+ }
177
+
178
+ .badge-danger {
179
+ background: #f8d7da;
180
+ color: #721c24;
181
+ }
182
+
183
+ /* Warnings */
184
+ .warning {
185
+ background: #fff3cd;
186
+ border-left: 4px solid #ffc107;
187
+ padding: 15px;
188
+ margin: 15px 0;
189
+ border-radius: 4px;
190
+ }
191
+
192
+ .warning::before {
193
+ content: "⚠ ";
194
+ font-weight: bold;
195
+ }
196
+
197
+ /* Plots */
198
+ .plot-container {
199
+ margin: 30px 0;
200
+ padding: 20px;
201
+ background: white;
202
+ border-radius: 8px;
203
+ box-shadow: 0 2px 8px rgba(0,0,0,0.1);
204
+ }
205
+
206
+ .plot-title {
207
+ font-size: 1.2rem;
208
+ font-weight: 600;
209
+ margin-bottom: 15px;
210
+ color: var(--primary-color);
211
+ }
212
+
213
+ .plot-container img {
214
+ max-width: 100%;
215
+ height: auto;
216
+ display: block;
217
+ margin: 0 auto;
218
+ }
219
+
220
+ /* Artifacts List */
221
+ .artifacts-list {
222
+ list-style: none;
223
+ padding: 0;
224
+ }
225
+
226
+ .artifacts-list li {
227
+ background: var(--code-bg);
228
+ padding: 15px;
229
+ margin: 10px 0;
230
+ border-left: 4px solid var(--secondary-color);
231
+ border-radius: 4px;
232
+ }
233
+
234
+ .artifacts-list strong {
235
+ color: var(--primary-color);
236
+ }
237
+
238
+ /* Metrics Grid */
239
+ .metrics-grid {
240
+ display: grid;
241
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
242
+ gap: 20px;
243
+ margin: 20px 0;
244
+ }
245
+
246
+ .metric-card {
247
+ background: var(--code-bg);
248
+ padding: 20px;
249
+ border-radius: 8px;
250
+ text-align: center;
251
+ border: 1px solid var(--border-color);
252
+ }
253
+
254
+ .metric-value {
255
+ font-size: 2rem;
256
+ font-weight: 700;
257
+ color: var(--primary-color);
258
+ margin: 10px 0;
259
+ }
260
+
261
+ .metric-label {
262
+ font-size: 0.9rem;
263
+ color: var(--text-color);
264
+ opacity: 0.8;
265
+ }
266
+
267
+ /* Code blocks */
268
+ code {
269
+ background: var(--code-bg);
270
+ padding: 2px 6px;
271
+ border-radius: 3px;
272
+ font-family: 'Consolas', 'Monaco', monospace;
273
+ font-size: 0.9em;
274
+ }
275
+
276
+ /* Responsive */
277
+ @media (max-width: 768px) {
278
+ .header {
279
+ padding: 40px 20px;
280
+ }
281
+
282
+ .header h1 {
283
+ font-size: 2rem;
284
+ }
285
+
286
+ .section h2 {
287
+ font-size: 1.5rem;
288
+ }
289
+
290
+ .metrics-grid {
291
+ grid-template-columns: 1fr;
292
+ }
293
+ }
294
+
295
+ /* Print styles */
296
+ @media print {
297
+ .header {
298
+ background: white !important;
299
+ color: black !important;
300
+ box-shadow: none !important;
301
+ }
302
+
303
+ .toc {
304
+ display: none;
305
+ }
306
+
307
+ .section {
308
+ page-break-inside: avoid;
309
+ }
310
+ }
311
+ </style>
312
+ </head>
313
+ <body>
314
+ <div class="container">
315
+ <div class="header">
316
+ <h1>{{ title }}</h1>
317
+ <div class="meta">
318
+ {% if config.show_timestamps %}
319
+ <p>Generated: {{ generated_at|format_timestamp }}</p>
320
+ {% endif %}
321
+ <p>Author: {{ author }}</p>
322
+ <p>Report Type: Protocol Reverse Engineering</p>
323
+ </div>
324
+ </div>
325
+
326
+ {% if config.show_toc %}
327
+ <div class="toc">
328
+ <h2>Table of Contents</h2>
329
+ <ul>
330
+ <li><a href="#executive-summary">Executive Summary</a></li>
331
+ <li><a href="#protocol-spec">Protocol Specification</a></li>
332
+ {% if plots %}<li><a href="#visualizations">Visualizations</a></li>{% endif %}
333
+ {% if artifacts %}<li><a href="#artifacts">Generated Artifacts</a></li>{% endif %}
334
+ {% if partial_results %}<li><a href="#analysis">Detailed Analysis</a></li>{% endif %}
335
+ {% if warnings %}<li><a href="#warnings">Warnings</a></li>{% endif %}
336
+ </ul>
337
+ </div>
338
+ {% endif %}
339
+
340
+ <!-- Executive Summary -->
341
+ <div class="section" id="executive-summary">
342
+ <h2>Executive Summary</h2>
343
+ <div class="card">
344
+ <p>This report presents the results of automated protocol reverse engineering
345
+ performed by the Oscura framework. The analysis identified protocol characteristics,
346
+ decoded message structures, and generated working dissectors for further analysis.</p>
347
+ </div>
348
+
349
+ {% if confidence_score %}
350
+ <div class="metrics-grid">
351
+ <div class="metric-card">
352
+ <div class="metric-label">Overall Confidence</div>
353
+ <div class="metric-value">{{ (confidence_score * 100)|round(1) }}%</div>
354
+ {% if confidence_score >= 0.8 %}
355
+ <span class="badge badge-success">High</span>
356
+ {% elif confidence_score >= 0.6 %}
357
+ <span class="badge badge-warning">Medium</span>
358
+ {% else %}
359
+ <span class="badge badge-danger">Low</span>
360
+ {% endif %}
361
+ </div>
362
+
363
+ {% if execution_time %}
364
+ <div class="metric-card">
365
+ <div class="metric-label">Execution Time</div>
366
+ <div class="metric-value">{{ execution_time|round(1) }}s</div>
367
+ </div>
368
+ {% endif %}
369
+
370
+ {% if protocol_spec %}
371
+ <div class="metric-card">
372
+ <div class="metric-label">Fields Detected</div>
373
+ <div class="metric-value">{{ protocol_spec.fields|length }}</div>
374
+ </div>
375
+ {% endif %}
376
+
377
+ {% if artifacts %}
378
+ <div class="metric-card">
379
+ <div class="metric-label">Artifacts Generated</div>
380
+ <div class="metric-value">{{ artifacts|length }}</div>
381
+ </div>
382
+ {% endif %}
383
+ </div>
384
+ {% endif %}
385
+ </div>
386
+
387
+ <!-- Protocol Specification -->
388
+ {% if protocol_spec %}
389
+ <div class="section" id="protocol-spec">
390
+ <h2>Protocol Specification</h2>
391
+
392
+ <div class="card">
393
+ <div class="card-header">Overview</div>
394
+ <table>
395
+ <tr>
396
+ <th>Property</th>
397
+ <th>Value</th>
398
+ </tr>
399
+ <tr>
400
+ <td><strong>Protocol Name</strong></td>
401
+ <td>{{ protocol_spec.name }}</td>
402
+ </tr>
403
+ <tr>
404
+ <td><strong>Baud Rate</strong></td>
405
+ <td>{{ protocol_spec.baud_rate|format_number }} bps</td>
406
+ </tr>
407
+ <tr>
408
+ <td><strong>Frame Format</strong></td>
409
+ <td><code>{{ protocol_spec.frame_format }}</code></td>
410
+ </tr>
411
+ <tr>
412
+ <td><strong>Sync Pattern</strong></td>
413
+ <td><code>{{ protocol_spec.sync_pattern }}</code></td>
414
+ </tr>
415
+ <tr>
416
+ <td><strong>Frame Length</strong></td>
417
+ <td>{{ protocol_spec.frame_length or "Variable" }} bytes</td>
418
+ </tr>
419
+ <tr>
420
+ <td><strong>Checksum Type</strong></td>
421
+ <td>{{ protocol_spec.checksum_type or "None detected" }}</td>
422
+ </tr>
423
+ {% if protocol_spec.checksum_position %}
424
+ <tr>
425
+ <td><strong>Checksum Position</strong></td>
426
+ <td>Byte {{ protocol_spec.checksum_position }}</td>
427
+ </tr>
428
+ {% endif %}
429
+ <tr>
430
+ <td><strong>Detection Confidence</strong></td>
431
+ <td>{{ (protocol_spec.confidence * 100)|round(1) }}%</td>
432
+ </tr>
433
+ </table>
434
+ </div>
435
+
436
+ {% if protocol_spec.fields %}
437
+ <h3>Field Structure</h3>
438
+ <div class="card">
439
+ <table>
440
+ <thead>
441
+ <tr>
442
+ <th>Field Name</th>
443
+ <th>Offset (bytes)</th>
444
+ <th>Size (bytes)</th>
445
+ <th>Type</th>
446
+ </tr>
447
+ </thead>
448
+ <tbody>
449
+ {% for field in protocol_spec.fields %}
450
+ <tr>
451
+ <td><code>{{ field.name }}</code></td>
452
+ <td>{{ field.offset }}</td>
453
+ <td>{{ field.size }}</td>
454
+ <td>{{ field.type }}</td>
455
+ </tr>
456
+ {% endfor %}
457
+ </tbody>
458
+ </table>
459
+ </div>
460
+ {% endif %}
461
+ </div>
462
+ {% endif %}
463
+
464
+ <!-- Visualizations -->
465
+ {% if plots %}
466
+ <div class="section" id="visualizations">
467
+ <h2>Visualizations</h2>
468
+ {% for plot in plots %}
469
+ <div class="plot-container">
470
+ <div class="plot-title">{{ plot.title }}</div>
471
+ {% if plot.type == "embedded" %}
472
+ <img src="{{ plot.data }}" alt="{{ plot.title }}">
473
+ {% else %}
474
+ <img src="{{ plot.path }}" alt="{{ plot.title }}">
475
+ {% endif %}
476
+ </div>
477
+ {% endfor %}
478
+ </div>
479
+ {% endif %}
480
+
481
+ <!-- Generated Artifacts -->
482
+ {% if artifacts %}
483
+ <div class="section" id="artifacts">
484
+ <h2>Generated Artifacts</h2>
485
+ <div class="card">
486
+ <p>The following artifacts were generated and can be used for further analysis:</p>
487
+ <ul class="artifacts-list">
488
+ {% for artifact in artifacts %}
489
+ <li>
490
+ <strong>{{ artifact.name }}</strong><br>
491
+ <code>{{ artifact.path }}</code>
492
+ </li>
493
+ {% endfor %}
494
+ </ul>
495
+ </div>
496
+ </div>
497
+ {% endif %}
498
+
499
+ <!-- Detailed Analysis -->
500
+ {% if partial_results %}
501
+ <div class="section" id="analysis">
502
+ <h2>Detailed Analysis Results</h2>
503
+ {% for key, value in partial_results.items() %}
504
+ {% if key not in ['traces'] %}
505
+ <div class="card">
506
+ <div class="card-header">{{ key|replace('_', ' ')|title }}</div>
507
+ <p>{{ value }}</p>
508
+ </div>
509
+ {% endif %}
510
+ {% endfor %}
511
+ </div>
512
+ {% endif %}
513
+
514
+ <!-- Warnings -->
515
+ {% if warnings %}
516
+ <div class="section" id="warnings">
517
+ <h2>Warnings and Notes</h2>
518
+ {% for warning in warnings %}
519
+ <div class="warning">{{ warning }}</div>
520
+ {% endfor %}
521
+ </div>
522
+ {% endif %}
523
+ </div>
524
+ </body>
525
+ </html>
@@ -2,22 +2,22 @@
2
2
 
3
3
  ## Report Metadata
4
4
 
5
- |Field|Value|
6
- |---|---|
7
- |**Input File**|{{input_name}}|
8
- |**File Size**|{{input_size}}|
9
- |**Input Type**|{{input_type}}|
10
- |**Generated**|{{timestamp}}|
11
- |**Analysis Duration**|{{duration}}|
5
+ | Field | Value |
6
+ | --------------------- | -------------- |
7
+ | **Input File** | {{input_name}} |
8
+ | **File Size** | {{input_size}} |
9
+ | **Input Type** | {{input_type}} |
10
+ | **Generated** | {{timestamp}} |
11
+ | **Analysis Duration** | {{duration}} |
12
12
 
13
13
  ## Analysis Summary
14
14
 
15
- |Metric|Count|
16
- |---|---|
17
- |Total Analyses|{{total_analyses}}|
18
- |Successful|{{successful}}|
19
- |Failed|{{failed}}|
20
- |Analysis Domains|{{domains_count}}|
15
+ | Metric | Count |
16
+ | ---------------- | ------------------ |
17
+ | Total Analyses | {{total_analyses}} |
18
+ | Successful | {{successful}} |
19
+ | Failed | {{failed}} |
20
+ | Analysis Domains | {{domains_count}} |
21
21
 
22
22
  {{#if has_errors}}
23
23
 
@@ -11,43 +11,34 @@ AnalysisSession and provide consistent interfaces for:
11
11
  - Domain-specific analysis methods
12
12
 
13
13
  Example - Generic Session:
14
+ >>> import oscura as osc
14
15
  >>> from oscura.sessions import GenericSession
15
- >>> from oscura.acquisition import FileSource
16
16
  >>>
17
- >>> session = GenericSession()
18
- >>> session.add_recording("test", FileSource("capture.wfm"))
17
+ >>> session = GenericSession(name="Analysis")
18
+ >>> trace = osc.load("capture.wfm")
19
+ >>> session.add_recording("test", trace)
19
20
  >>> results = session.analyze()
20
21
  >>> print(results["summary"]["test"]["mean"])
21
22
 
22
- Example - Domain-Specific Session:
23
- >>> from oscura.sessions import AnalysisSession
24
- >>> from oscura.acquisition import FileSource
23
+ Example - BlackBox Session (Protocol RE):
24
+ >>> from oscura.sessions import BlackBoxSession
25
25
  >>>
26
- >>> class CANSession(AnalysisSession):
27
- ... def analyze(self):
28
- ... # CAN-specific signal discovery
29
- ... return self.discover_signals()
30
- ...
31
- ... def discover_signals(self):
32
- ... # Extract CAN signals from recordings
33
- ... pass
34
- >>>
35
- >>> session = CANSession()
36
- >>> session.add_recording("baseline", FileSource("idle.blf"))
37
- >>> signals = session.analyze()
26
+ >>> session = BlackBoxSession(name="IoT Protocol RE")
27
+ >>> session.add_recording("baseline", osc.load("baseline.wfm"))
28
+ >>> session.add_recording("stimulus", osc.load("button.wfm"))
29
+ >>> diff = session.compare("baseline", "stimulus")
30
+ >>> print(f"Changed: {diff.changed_bytes} bytes")
38
31
 
39
32
  Pattern Decision Table:
40
33
  - Use GenericSession for general waveform analysis
41
- - Extend AnalysisSession for domain-specific workflows
42
- - Use existing session.Session for backward compatibility
34
+ - Use BlackBoxSession for unknown protocol reverse engineering
35
+ - Extend AnalysisSession for custom domain-specific workflows
43
36
 
44
37
  Architecture:
45
38
  Layer 3 (High-Level API) - User-Facing
46
39
  ├── AnalysisSession (ABC)
47
40
  │ ├── GenericSession
48
- │ ├── CANSession (Phase 1)
49
- │ ├── SerialSession (Phase 1)
50
- │ ├── BlackBoxSession (Phase 1)
41
+ │ ├── BlackBoxSession
51
42
  │ └── [Future domain sessions]
52
43
  └── [Workflows wrapping sessions]
53
44
 
oscura/sessions/base.py CHANGED
@@ -6,7 +6,7 @@ for domain-specific sessions (CAN, Serial, BlackBox, etc.).
6
6
 
7
7
  Example:
8
8
  >>> from oscura.sessions import AnalysisSession
9
- >>> from oscura.acquisition import FileSource, HardwareSource
9
+ >>> from oscura.hardware.acquisition import FileSource, HardwareSource
10
10
  >>>
11
11
  >>> # Domain-specific sessions extend AnalysisSession
12
12
  >>> class CANSession(AnalysisSession):
@@ -52,8 +52,8 @@ from pathlib import Path
52
52
  from typing import TYPE_CHECKING, Any
53
53
 
54
54
  if TYPE_CHECKING:
55
- from oscura.acquisition import Source
56
55
  from oscura.core.types import Trace
56
+ from oscura.hardware.acquisition import Source
57
57
 
58
58
 
59
59
  @dataclass
@@ -154,7 +154,7 @@ class AnalysisSession(ABC):
154
154
  ValueError: If name already exists.
155
155
 
156
156
  Example:
157
- >>> from oscura.acquisition import FileSource
157
+ >>> from oscura.hardware.acquisition import FileSource
158
158
  >>> session.add_recording("baseline", FileSource("idle.blf"))
159
159
  >>> session.add_recording("active", FileSource("running.blf"))
160
160
  """