oscura 0.0.1__py3-none-any.whl → 0.1.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 (465) hide show
  1. oscura/__init__.py +813 -8
  2. oscura/__main__.py +392 -0
  3. oscura/analyzers/__init__.py +37 -0
  4. oscura/analyzers/digital/__init__.py +177 -0
  5. oscura/analyzers/digital/bus.py +691 -0
  6. oscura/analyzers/digital/clock.py +805 -0
  7. oscura/analyzers/digital/correlation.py +720 -0
  8. oscura/analyzers/digital/edges.py +632 -0
  9. oscura/analyzers/digital/extraction.py +413 -0
  10. oscura/analyzers/digital/quality.py +878 -0
  11. oscura/analyzers/digital/signal_quality.py +877 -0
  12. oscura/analyzers/digital/thresholds.py +708 -0
  13. oscura/analyzers/digital/timing.py +1104 -0
  14. oscura/analyzers/eye/__init__.py +46 -0
  15. oscura/analyzers/eye/diagram.py +434 -0
  16. oscura/analyzers/eye/metrics.py +555 -0
  17. oscura/analyzers/jitter/__init__.py +83 -0
  18. oscura/analyzers/jitter/ber.py +333 -0
  19. oscura/analyzers/jitter/decomposition.py +759 -0
  20. oscura/analyzers/jitter/measurements.py +413 -0
  21. oscura/analyzers/jitter/spectrum.py +220 -0
  22. oscura/analyzers/measurements.py +40 -0
  23. oscura/analyzers/packet/__init__.py +171 -0
  24. oscura/analyzers/packet/daq.py +1077 -0
  25. oscura/analyzers/packet/metrics.py +437 -0
  26. oscura/analyzers/packet/parser.py +327 -0
  27. oscura/analyzers/packet/payload.py +2156 -0
  28. oscura/analyzers/packet/payload_analysis.py +1312 -0
  29. oscura/analyzers/packet/payload_extraction.py +236 -0
  30. oscura/analyzers/packet/payload_patterns.py +670 -0
  31. oscura/analyzers/packet/stream.py +359 -0
  32. oscura/analyzers/patterns/__init__.py +266 -0
  33. oscura/analyzers/patterns/clustering.py +1036 -0
  34. oscura/analyzers/patterns/discovery.py +539 -0
  35. oscura/analyzers/patterns/learning.py +797 -0
  36. oscura/analyzers/patterns/matching.py +1091 -0
  37. oscura/analyzers/patterns/periodic.py +650 -0
  38. oscura/analyzers/patterns/sequences.py +767 -0
  39. oscura/analyzers/power/__init__.py +116 -0
  40. oscura/analyzers/power/ac_power.py +391 -0
  41. oscura/analyzers/power/basic.py +383 -0
  42. oscura/analyzers/power/conduction.py +314 -0
  43. oscura/analyzers/power/efficiency.py +297 -0
  44. oscura/analyzers/power/ripple.py +356 -0
  45. oscura/analyzers/power/soa.py +372 -0
  46. oscura/analyzers/power/switching.py +479 -0
  47. oscura/analyzers/protocol/__init__.py +150 -0
  48. oscura/analyzers/protocols/__init__.py +150 -0
  49. oscura/analyzers/protocols/base.py +500 -0
  50. oscura/analyzers/protocols/can.py +620 -0
  51. oscura/analyzers/protocols/can_fd.py +448 -0
  52. oscura/analyzers/protocols/flexray.py +405 -0
  53. oscura/analyzers/protocols/hdlc.py +399 -0
  54. oscura/analyzers/protocols/i2c.py +368 -0
  55. oscura/analyzers/protocols/i2s.py +296 -0
  56. oscura/analyzers/protocols/jtag.py +393 -0
  57. oscura/analyzers/protocols/lin.py +445 -0
  58. oscura/analyzers/protocols/manchester.py +333 -0
  59. oscura/analyzers/protocols/onewire.py +501 -0
  60. oscura/analyzers/protocols/spi.py +334 -0
  61. oscura/analyzers/protocols/swd.py +325 -0
  62. oscura/analyzers/protocols/uart.py +393 -0
  63. oscura/analyzers/protocols/usb.py +495 -0
  64. oscura/analyzers/signal_integrity/__init__.py +63 -0
  65. oscura/analyzers/signal_integrity/embedding.py +294 -0
  66. oscura/analyzers/signal_integrity/equalization.py +370 -0
  67. oscura/analyzers/signal_integrity/sparams.py +484 -0
  68. oscura/analyzers/spectral/__init__.py +53 -0
  69. oscura/analyzers/spectral/chunked.py +273 -0
  70. oscura/analyzers/spectral/chunked_fft.py +571 -0
  71. oscura/analyzers/spectral/chunked_wavelet.py +391 -0
  72. oscura/analyzers/spectral/fft.py +92 -0
  73. oscura/analyzers/statistical/__init__.py +250 -0
  74. oscura/analyzers/statistical/checksum.py +923 -0
  75. oscura/analyzers/statistical/chunked_corr.py +228 -0
  76. oscura/analyzers/statistical/classification.py +778 -0
  77. oscura/analyzers/statistical/entropy.py +1113 -0
  78. oscura/analyzers/statistical/ngrams.py +614 -0
  79. oscura/analyzers/statistics/__init__.py +119 -0
  80. oscura/analyzers/statistics/advanced.py +885 -0
  81. oscura/analyzers/statistics/basic.py +263 -0
  82. oscura/analyzers/statistics/correlation.py +630 -0
  83. oscura/analyzers/statistics/distribution.py +298 -0
  84. oscura/analyzers/statistics/outliers.py +463 -0
  85. oscura/analyzers/statistics/streaming.py +93 -0
  86. oscura/analyzers/statistics/trend.py +520 -0
  87. oscura/analyzers/validation.py +598 -0
  88. oscura/analyzers/waveform/__init__.py +36 -0
  89. oscura/analyzers/waveform/measurements.py +943 -0
  90. oscura/analyzers/waveform/measurements_with_uncertainty.py +371 -0
  91. oscura/analyzers/waveform/spectral.py +1689 -0
  92. oscura/analyzers/waveform/wavelets.py +298 -0
  93. oscura/api/__init__.py +62 -0
  94. oscura/api/dsl.py +538 -0
  95. oscura/api/fluent.py +571 -0
  96. oscura/api/operators.py +498 -0
  97. oscura/api/optimization.py +392 -0
  98. oscura/api/profiling.py +396 -0
  99. oscura/automotive/__init__.py +73 -0
  100. oscura/automotive/can/__init__.py +52 -0
  101. oscura/automotive/can/analysis.py +356 -0
  102. oscura/automotive/can/checksum.py +250 -0
  103. oscura/automotive/can/correlation.py +212 -0
  104. oscura/automotive/can/discovery.py +355 -0
  105. oscura/automotive/can/message_wrapper.py +375 -0
  106. oscura/automotive/can/models.py +385 -0
  107. oscura/automotive/can/patterns.py +381 -0
  108. oscura/automotive/can/session.py +452 -0
  109. oscura/automotive/can/state_machine.py +300 -0
  110. oscura/automotive/can/stimulus_response.py +461 -0
  111. oscura/automotive/dbc/__init__.py +15 -0
  112. oscura/automotive/dbc/generator.py +156 -0
  113. oscura/automotive/dbc/parser.py +146 -0
  114. oscura/automotive/dtc/__init__.py +30 -0
  115. oscura/automotive/dtc/database.py +3036 -0
  116. oscura/automotive/j1939/__init__.py +14 -0
  117. oscura/automotive/j1939/decoder.py +745 -0
  118. oscura/automotive/loaders/__init__.py +35 -0
  119. oscura/automotive/loaders/asc.py +98 -0
  120. oscura/automotive/loaders/blf.py +77 -0
  121. oscura/automotive/loaders/csv_can.py +136 -0
  122. oscura/automotive/loaders/dispatcher.py +136 -0
  123. oscura/automotive/loaders/mdf.py +331 -0
  124. oscura/automotive/loaders/pcap.py +132 -0
  125. oscura/automotive/obd/__init__.py +14 -0
  126. oscura/automotive/obd/decoder.py +707 -0
  127. oscura/automotive/uds/__init__.py +48 -0
  128. oscura/automotive/uds/decoder.py +265 -0
  129. oscura/automotive/uds/models.py +64 -0
  130. oscura/automotive/visualization.py +369 -0
  131. oscura/batch/__init__.py +55 -0
  132. oscura/batch/advanced.py +627 -0
  133. oscura/batch/aggregate.py +300 -0
  134. oscura/batch/analyze.py +139 -0
  135. oscura/batch/logging.py +487 -0
  136. oscura/batch/metrics.py +556 -0
  137. oscura/builders/__init__.py +41 -0
  138. oscura/builders/signal_builder.py +1131 -0
  139. oscura/cli/__init__.py +14 -0
  140. oscura/cli/batch.py +339 -0
  141. oscura/cli/characterize.py +273 -0
  142. oscura/cli/compare.py +775 -0
  143. oscura/cli/decode.py +551 -0
  144. oscura/cli/main.py +247 -0
  145. oscura/cli/shell.py +350 -0
  146. oscura/comparison/__init__.py +66 -0
  147. oscura/comparison/compare.py +397 -0
  148. oscura/comparison/golden.py +487 -0
  149. oscura/comparison/limits.py +391 -0
  150. oscura/comparison/mask.py +434 -0
  151. oscura/comparison/trace_diff.py +30 -0
  152. oscura/comparison/visualization.py +481 -0
  153. oscura/compliance/__init__.py +70 -0
  154. oscura/compliance/advanced.py +756 -0
  155. oscura/compliance/masks.py +363 -0
  156. oscura/compliance/reporting.py +483 -0
  157. oscura/compliance/testing.py +298 -0
  158. oscura/component/__init__.py +38 -0
  159. oscura/component/impedance.py +365 -0
  160. oscura/component/reactive.py +598 -0
  161. oscura/component/transmission_line.py +312 -0
  162. oscura/config/__init__.py +191 -0
  163. oscura/config/defaults.py +254 -0
  164. oscura/config/loader.py +348 -0
  165. oscura/config/memory.py +271 -0
  166. oscura/config/migration.py +458 -0
  167. oscura/config/pipeline.py +1077 -0
  168. oscura/config/preferences.py +530 -0
  169. oscura/config/protocol.py +875 -0
  170. oscura/config/schema.py +713 -0
  171. oscura/config/settings.py +420 -0
  172. oscura/config/thresholds.py +599 -0
  173. oscura/convenience.py +457 -0
  174. oscura/core/__init__.py +299 -0
  175. oscura/core/audit.py +457 -0
  176. oscura/core/backend_selector.py +405 -0
  177. oscura/core/cache.py +590 -0
  178. oscura/core/cancellation.py +439 -0
  179. oscura/core/confidence.py +225 -0
  180. oscura/core/config.py +506 -0
  181. oscura/core/correlation.py +216 -0
  182. oscura/core/cross_domain.py +422 -0
  183. oscura/core/debug.py +301 -0
  184. oscura/core/edge_cases.py +541 -0
  185. oscura/core/exceptions.py +535 -0
  186. oscura/core/gpu_backend.py +523 -0
  187. oscura/core/lazy.py +832 -0
  188. oscura/core/log_query.py +540 -0
  189. oscura/core/logging.py +931 -0
  190. oscura/core/logging_advanced.py +952 -0
  191. oscura/core/memoize.py +171 -0
  192. oscura/core/memory_check.py +274 -0
  193. oscura/core/memory_guard.py +290 -0
  194. oscura/core/memory_limits.py +336 -0
  195. oscura/core/memory_monitor.py +453 -0
  196. oscura/core/memory_progress.py +465 -0
  197. oscura/core/memory_warnings.py +315 -0
  198. oscura/core/numba_backend.py +362 -0
  199. oscura/core/performance.py +352 -0
  200. oscura/core/progress.py +524 -0
  201. oscura/core/provenance.py +358 -0
  202. oscura/core/results.py +331 -0
  203. oscura/core/types.py +504 -0
  204. oscura/core/uncertainty.py +383 -0
  205. oscura/discovery/__init__.py +52 -0
  206. oscura/discovery/anomaly_detector.py +672 -0
  207. oscura/discovery/auto_decoder.py +415 -0
  208. oscura/discovery/comparison.py +497 -0
  209. oscura/discovery/quality_validator.py +528 -0
  210. oscura/discovery/signal_detector.py +769 -0
  211. oscura/dsl/__init__.py +73 -0
  212. oscura/dsl/commands.py +246 -0
  213. oscura/dsl/interpreter.py +455 -0
  214. oscura/dsl/parser.py +689 -0
  215. oscura/dsl/repl.py +172 -0
  216. oscura/exceptions.py +59 -0
  217. oscura/exploratory/__init__.py +111 -0
  218. oscura/exploratory/error_recovery.py +642 -0
  219. oscura/exploratory/fuzzy.py +513 -0
  220. oscura/exploratory/fuzzy_advanced.py +786 -0
  221. oscura/exploratory/legacy.py +831 -0
  222. oscura/exploratory/parse.py +358 -0
  223. oscura/exploratory/recovery.py +275 -0
  224. oscura/exploratory/sync.py +382 -0
  225. oscura/exploratory/unknown.py +707 -0
  226. oscura/export/__init__.py +25 -0
  227. oscura/export/wireshark/README.md +265 -0
  228. oscura/export/wireshark/__init__.py +47 -0
  229. oscura/export/wireshark/generator.py +312 -0
  230. oscura/export/wireshark/lua_builder.py +159 -0
  231. oscura/export/wireshark/templates/dissector.lua.j2 +92 -0
  232. oscura/export/wireshark/type_mapping.py +165 -0
  233. oscura/export/wireshark/validator.py +105 -0
  234. oscura/exporters/__init__.py +94 -0
  235. oscura/exporters/csv.py +303 -0
  236. oscura/exporters/exporters.py +44 -0
  237. oscura/exporters/hdf5.py +219 -0
  238. oscura/exporters/html_export.py +701 -0
  239. oscura/exporters/json_export.py +291 -0
  240. oscura/exporters/markdown_export.py +367 -0
  241. oscura/exporters/matlab_export.py +354 -0
  242. oscura/exporters/npz_export.py +219 -0
  243. oscura/exporters/spice_export.py +210 -0
  244. oscura/extensibility/__init__.py +131 -0
  245. oscura/extensibility/docs.py +752 -0
  246. oscura/extensibility/extensions.py +1125 -0
  247. oscura/extensibility/logging.py +259 -0
  248. oscura/extensibility/measurements.py +485 -0
  249. oscura/extensibility/plugins.py +414 -0
  250. oscura/extensibility/registry.py +346 -0
  251. oscura/extensibility/templates.py +913 -0
  252. oscura/extensibility/validation.py +651 -0
  253. oscura/filtering/__init__.py +89 -0
  254. oscura/filtering/base.py +563 -0
  255. oscura/filtering/convenience.py +564 -0
  256. oscura/filtering/design.py +725 -0
  257. oscura/filtering/filters.py +32 -0
  258. oscura/filtering/introspection.py +605 -0
  259. oscura/guidance/__init__.py +24 -0
  260. oscura/guidance/recommender.py +429 -0
  261. oscura/guidance/wizard.py +518 -0
  262. oscura/inference/__init__.py +251 -0
  263. oscura/inference/active_learning/README.md +153 -0
  264. oscura/inference/active_learning/__init__.py +38 -0
  265. oscura/inference/active_learning/lstar.py +257 -0
  266. oscura/inference/active_learning/observation_table.py +230 -0
  267. oscura/inference/active_learning/oracle.py +78 -0
  268. oscura/inference/active_learning/teachers/__init__.py +15 -0
  269. oscura/inference/active_learning/teachers/simulator.py +192 -0
  270. oscura/inference/adaptive_tuning.py +453 -0
  271. oscura/inference/alignment.py +653 -0
  272. oscura/inference/bayesian.py +943 -0
  273. oscura/inference/binary.py +1016 -0
  274. oscura/inference/crc_reverse.py +711 -0
  275. oscura/inference/logic.py +288 -0
  276. oscura/inference/message_format.py +1305 -0
  277. oscura/inference/protocol.py +417 -0
  278. oscura/inference/protocol_dsl.py +1084 -0
  279. oscura/inference/protocol_library.py +1230 -0
  280. oscura/inference/sequences.py +809 -0
  281. oscura/inference/signal_intelligence.py +1509 -0
  282. oscura/inference/spectral.py +215 -0
  283. oscura/inference/state_machine.py +634 -0
  284. oscura/inference/stream.py +918 -0
  285. oscura/integrations/__init__.py +59 -0
  286. oscura/integrations/llm.py +1827 -0
  287. oscura/jupyter/__init__.py +32 -0
  288. oscura/jupyter/display.py +268 -0
  289. oscura/jupyter/magic.py +334 -0
  290. oscura/loaders/__init__.py +526 -0
  291. oscura/loaders/binary.py +69 -0
  292. oscura/loaders/configurable.py +1255 -0
  293. oscura/loaders/csv.py +26 -0
  294. oscura/loaders/csv_loader.py +473 -0
  295. oscura/loaders/hdf5.py +9 -0
  296. oscura/loaders/hdf5_loader.py +510 -0
  297. oscura/loaders/lazy.py +370 -0
  298. oscura/loaders/mmap_loader.py +583 -0
  299. oscura/loaders/numpy_loader.py +436 -0
  300. oscura/loaders/pcap.py +432 -0
  301. oscura/loaders/preprocessing.py +368 -0
  302. oscura/loaders/rigol.py +287 -0
  303. oscura/loaders/sigrok.py +321 -0
  304. oscura/loaders/tdms.py +367 -0
  305. oscura/loaders/tektronix.py +711 -0
  306. oscura/loaders/validation.py +584 -0
  307. oscura/loaders/vcd.py +464 -0
  308. oscura/loaders/wav.py +233 -0
  309. oscura/math/__init__.py +45 -0
  310. oscura/math/arithmetic.py +824 -0
  311. oscura/math/interpolation.py +413 -0
  312. oscura/onboarding/__init__.py +39 -0
  313. oscura/onboarding/help.py +498 -0
  314. oscura/onboarding/tutorials.py +405 -0
  315. oscura/onboarding/wizard.py +466 -0
  316. oscura/optimization/__init__.py +19 -0
  317. oscura/optimization/parallel.py +440 -0
  318. oscura/optimization/search.py +532 -0
  319. oscura/pipeline/__init__.py +43 -0
  320. oscura/pipeline/base.py +338 -0
  321. oscura/pipeline/composition.py +242 -0
  322. oscura/pipeline/parallel.py +448 -0
  323. oscura/pipeline/pipeline.py +375 -0
  324. oscura/pipeline/reverse_engineering.py +1119 -0
  325. oscura/plugins/__init__.py +122 -0
  326. oscura/plugins/base.py +272 -0
  327. oscura/plugins/cli.py +497 -0
  328. oscura/plugins/discovery.py +411 -0
  329. oscura/plugins/isolation.py +418 -0
  330. oscura/plugins/lifecycle.py +959 -0
  331. oscura/plugins/manager.py +493 -0
  332. oscura/plugins/registry.py +421 -0
  333. oscura/plugins/versioning.py +372 -0
  334. oscura/py.typed +0 -0
  335. oscura/quality/__init__.py +65 -0
  336. oscura/quality/ensemble.py +740 -0
  337. oscura/quality/explainer.py +338 -0
  338. oscura/quality/scoring.py +616 -0
  339. oscura/quality/warnings.py +456 -0
  340. oscura/reporting/__init__.py +248 -0
  341. oscura/reporting/advanced.py +1234 -0
  342. oscura/reporting/analyze.py +448 -0
  343. oscura/reporting/argument_preparer.py +596 -0
  344. oscura/reporting/auto_report.py +507 -0
  345. oscura/reporting/batch.py +615 -0
  346. oscura/reporting/chart_selection.py +223 -0
  347. oscura/reporting/comparison.py +330 -0
  348. oscura/reporting/config.py +615 -0
  349. oscura/reporting/content/__init__.py +39 -0
  350. oscura/reporting/content/executive.py +127 -0
  351. oscura/reporting/content/filtering.py +191 -0
  352. oscura/reporting/content/minimal.py +257 -0
  353. oscura/reporting/content/verbosity.py +162 -0
  354. oscura/reporting/core.py +508 -0
  355. oscura/reporting/core_formats/__init__.py +17 -0
  356. oscura/reporting/core_formats/multi_format.py +210 -0
  357. oscura/reporting/engine.py +836 -0
  358. oscura/reporting/export.py +366 -0
  359. oscura/reporting/formatting/__init__.py +129 -0
  360. oscura/reporting/formatting/emphasis.py +81 -0
  361. oscura/reporting/formatting/numbers.py +403 -0
  362. oscura/reporting/formatting/standards.py +55 -0
  363. oscura/reporting/formatting.py +466 -0
  364. oscura/reporting/html.py +578 -0
  365. oscura/reporting/index.py +590 -0
  366. oscura/reporting/multichannel.py +296 -0
  367. oscura/reporting/output.py +379 -0
  368. oscura/reporting/pdf.py +373 -0
  369. oscura/reporting/plots.py +731 -0
  370. oscura/reporting/pptx_export.py +360 -0
  371. oscura/reporting/renderers/__init__.py +11 -0
  372. oscura/reporting/renderers/pdf.py +94 -0
  373. oscura/reporting/sections.py +471 -0
  374. oscura/reporting/standards.py +680 -0
  375. oscura/reporting/summary_generator.py +368 -0
  376. oscura/reporting/tables.py +397 -0
  377. oscura/reporting/template_system.py +724 -0
  378. oscura/reporting/templates/__init__.py +15 -0
  379. oscura/reporting/templates/definition.py +205 -0
  380. oscura/reporting/templates/index.html +649 -0
  381. oscura/reporting/templates/index.md +173 -0
  382. oscura/schemas/__init__.py +158 -0
  383. oscura/schemas/bus_configuration.json +322 -0
  384. oscura/schemas/device_mapping.json +182 -0
  385. oscura/schemas/packet_format.json +418 -0
  386. oscura/schemas/protocol_definition.json +363 -0
  387. oscura/search/__init__.py +16 -0
  388. oscura/search/anomaly.py +292 -0
  389. oscura/search/context.py +149 -0
  390. oscura/search/pattern.py +160 -0
  391. oscura/session/__init__.py +34 -0
  392. oscura/session/annotations.py +289 -0
  393. oscura/session/history.py +313 -0
  394. oscura/session/session.py +445 -0
  395. oscura/streaming/__init__.py +43 -0
  396. oscura/streaming/chunked.py +611 -0
  397. oscura/streaming/progressive.py +393 -0
  398. oscura/streaming/realtime.py +622 -0
  399. oscura/testing/__init__.py +54 -0
  400. oscura/testing/synthetic.py +808 -0
  401. oscura/triggering/__init__.py +68 -0
  402. oscura/triggering/base.py +229 -0
  403. oscura/triggering/edge.py +353 -0
  404. oscura/triggering/pattern.py +344 -0
  405. oscura/triggering/pulse.py +581 -0
  406. oscura/triggering/window.py +453 -0
  407. oscura/ui/__init__.py +48 -0
  408. oscura/ui/formatters.py +526 -0
  409. oscura/ui/progressive_display.py +340 -0
  410. oscura/utils/__init__.py +99 -0
  411. oscura/utils/autodetect.py +338 -0
  412. oscura/utils/buffer.py +389 -0
  413. oscura/utils/lazy.py +407 -0
  414. oscura/utils/lazy_imports.py +147 -0
  415. oscura/utils/memory.py +836 -0
  416. oscura/utils/memory_advanced.py +1326 -0
  417. oscura/utils/memory_extensions.py +465 -0
  418. oscura/utils/progressive.py +352 -0
  419. oscura/utils/windowing.py +362 -0
  420. oscura/visualization/__init__.py +321 -0
  421. oscura/visualization/accessibility.py +526 -0
  422. oscura/visualization/annotations.py +374 -0
  423. oscura/visualization/axis_scaling.py +305 -0
  424. oscura/visualization/colors.py +453 -0
  425. oscura/visualization/digital.py +337 -0
  426. oscura/visualization/eye.py +420 -0
  427. oscura/visualization/histogram.py +281 -0
  428. oscura/visualization/interactive.py +858 -0
  429. oscura/visualization/jitter.py +702 -0
  430. oscura/visualization/keyboard.py +394 -0
  431. oscura/visualization/layout.py +365 -0
  432. oscura/visualization/optimization.py +1028 -0
  433. oscura/visualization/palettes.py +446 -0
  434. oscura/visualization/plot.py +92 -0
  435. oscura/visualization/power.py +290 -0
  436. oscura/visualization/power_extended.py +626 -0
  437. oscura/visualization/presets.py +467 -0
  438. oscura/visualization/protocols.py +932 -0
  439. oscura/visualization/render.py +207 -0
  440. oscura/visualization/rendering.py +444 -0
  441. oscura/visualization/reverse_engineering.py +791 -0
  442. oscura/visualization/signal_integrity.py +808 -0
  443. oscura/visualization/specialized.py +553 -0
  444. oscura/visualization/spectral.py +811 -0
  445. oscura/visualization/styles.py +381 -0
  446. oscura/visualization/thumbnails.py +311 -0
  447. oscura/visualization/time_axis.py +351 -0
  448. oscura/visualization/waveform.py +367 -0
  449. oscura/workflow/__init__.py +13 -0
  450. oscura/workflow/dag.py +377 -0
  451. oscura/workflows/__init__.py +58 -0
  452. oscura/workflows/compliance.py +280 -0
  453. oscura/workflows/digital.py +272 -0
  454. oscura/workflows/multi_trace.py +502 -0
  455. oscura/workflows/power.py +178 -0
  456. oscura/workflows/protocol.py +492 -0
  457. oscura/workflows/reverse_engineering.py +639 -0
  458. oscura/workflows/signal_integrity.py +227 -0
  459. oscura-0.1.0.dist-info/METADATA +300 -0
  460. oscura-0.1.0.dist-info/RECORD +463 -0
  461. oscura-0.1.0.dist-info/entry_points.txt +2 -0
  462. {oscura-0.0.1.dist-info → oscura-0.1.0.dist-info}/licenses/LICENSE +1 -1
  463. oscura-0.0.1.dist-info/METADATA +0 -63
  464. oscura-0.0.1.dist-info/RECORD +0 -5
  465. {oscura-0.0.1.dist-info → oscura-0.1.0.dist-info}/WHEEL +0 -0
@@ -0,0 +1,227 @@
1
+ """Signal integrity audit workflow.
2
+
3
+ This module implements comprehensive signal integrity analysis including
4
+ eye diagram, jitter decomposition, and margin analysis.
5
+
6
+
7
+ Example:
8
+ >>> import oscura as tk
9
+ >>> trace = tk.load('data_signal.wfm')
10
+ >>> clock = tk.load('clock_signal.wfm')
11
+ >>> result = tk.signal_integrity_audit(trace, clock)
12
+ >>> print(f"Eye Height: {result['eye_height']:.3f} V")
13
+ >>> print(f"RMS Jitter: {result['jitter_rms']:.2f} ps")
14
+
15
+ References:
16
+ JEDEC Standard No. 65B: High-Speed Interface Timing
17
+ IEEE 1596.3-1996: Low-Voltage Differential Signals
18
+ """
19
+
20
+ from __future__ import annotations
21
+
22
+ from typing import TYPE_CHECKING, Any
23
+
24
+ import numpy as np
25
+
26
+ if TYPE_CHECKING:
27
+ from oscura.core.types import WaveformTrace
28
+
29
+
30
+ def signal_integrity_audit(
31
+ trace: WaveformTrace,
32
+ clock_trace: WaveformTrace | None = None,
33
+ *,
34
+ bit_rate: float | None = None,
35
+ mask: str | None = None,
36
+ report: str | None = None,
37
+ ) -> dict[str, Any]:
38
+ """Comprehensive signal integrity analysis.
39
+
40
+ Performs complete signal integrity audit including:
41
+ - Eye diagram generation and analysis
42
+ - Jitter decomposition (random vs deterministic)
43
+ - Time Interval Error (TIE) measurement
44
+ - Margin analysis against standard masks
45
+ - Dominant noise source identification
46
+
47
+ Args:
48
+ trace: Data signal to analyze.
49
+ clock_trace: Optional recovered clock or reference clock.
50
+ If None, clock is recovered from data.
51
+ bit_rate: Bit rate in bits/second. If None, auto-detected.
52
+ mask: Optional eye mask standard ('PCIe', 'USB', 'SATA', etc.).
53
+ report: Optional path to save HTML report.
54
+
55
+ Returns:
56
+ Dictionary containing:
57
+ - eye_height: Eye opening height in volts
58
+ - eye_width: Eye opening width in seconds
59
+ - jitter_rms: RMS jitter in seconds
60
+ - jitter_pp: Peak-to-peak jitter in seconds
61
+ - tie: Time Interval Error array
62
+ - tie_rms: RMS of TIE in seconds
63
+ - margin_to_mask: Margin to specified mask (if provided)
64
+ - dominant_jitter_source: 'random' or 'deterministic'
65
+ - bit_error_rate_estimate: Estimated BER from eye closure
66
+ - snr_db: Signal-to-noise ratio in dB
67
+
68
+ Returns:
69
+ Dictionary containing:
70
+ - eye_height: Eye opening height in volts
71
+ - eye_width: Eye opening width in seconds
72
+ - jitter_rms: RMS jitter in seconds
73
+ - jitter_pp: Peak-to-peak jitter in seconds
74
+ - tie: Time Interval Error array
75
+ - tie_rms: RMS of TIE in seconds
76
+ - margin_to_mask: Margin to specified mask (if provided)
77
+ - dominant_jitter_source: 'random' or 'deterministic'
78
+ - bit_error_rate_estimate: Estimated BER from eye closure
79
+ - snr_db: Signal-to-noise ratio in dB
80
+
81
+ Example:
82
+ >>> trace = tk.load('high_speed_data.wfm')
83
+ >>> result = tk.signal_integrity_audit(trace, bit_rate=1e9)
84
+ >>> print(f"Eye Height: {result['eye_height']*1e3:.1f} mV")
85
+ >>> print(f"Jitter (RMS): {result['jitter_rms']*1e12:.2f} ps")
86
+ >>> print(f"Dominant Jitter: {result['dominant_jitter_source']}")
87
+
88
+ References:
89
+ JEDEC Standard No. 65B Section 4.3 (Eye diagrams)
90
+ TIA-568.2-D (Signal integrity for high-speed data)
91
+ """
92
+ # Import here to avoid circular dependencies
93
+ try:
94
+ from oscura.analyzers.eye.diagram import (
95
+ EyeDiagram,
96
+ )
97
+ except ImportError:
98
+ # Fallback if eye module not available
99
+ pass
100
+
101
+ try:
102
+ from oscura.analyzers.digital.timing import (
103
+ peak_to_peak_jitter,
104
+ recover_clock_fft,
105
+ time_interval_error,
106
+ )
107
+ except ImportError:
108
+ # Provide minimal implementation
109
+ recover_clock_fft = None # type: ignore[assignment]
110
+ peak_to_peak_jitter = None # type: ignore[assignment] # noqa: F841
111
+ time_interval_error = None # type: ignore[assignment]
112
+
113
+ # Recover clock if not provided
114
+ if clock_trace is None and recover_clock_fft is not None:
115
+ try:
116
+ clock_result = recover_clock_fft(trace)
117
+ recovered_freq = clock_result.frequency
118
+ except Exception:
119
+ # Estimate from bit rate
120
+ recovered_freq = bit_rate if bit_rate else 1e9
121
+ else:
122
+ recovered_freq = bit_rate if bit_rate else 1e9
123
+
124
+ # Calculate eye parameters (simplified - would use actual eye_diagram function)
125
+ # For now, provide placeholder calculations
126
+ vpp = np.ptp(trace.data)
127
+ eye_height = vpp * 0.7 # Typical eye opening is ~70% of signal swing
128
+ ui = 1.0 / recovered_freq if recovered_freq else 1e-9 # Unit Interval
129
+ eye_width = ui * 0.6 # Typical eye opening is ~60% of UI
130
+
131
+ # Calculate jitter (simplified)
132
+ # In real implementation, would use proper jitter analysis
133
+ if time_interval_error is not None:
134
+ try:
135
+ tie = time_interval_error(trace, nominal_period=1.0 / recovered_freq)
136
+ jitter_rms_val = float(np.std(tie))
137
+ jitter_pp_val = float(np.ptp(tie))
138
+ except Exception:
139
+ tie = np.array([])
140
+ jitter_rms_val = ui * 0.05 # Assume 5% UI jitter
141
+ jitter_pp_val = ui * 0.2 # Assume 20% UI p-p jitter
142
+ else:
143
+ tie = np.array([]) # type: ignore[unreachable]
144
+ jitter_rms_val = ui * 0.05
145
+ jitter_pp_val = ui * 0.2
146
+
147
+ # Determine dominant jitter source
148
+ # Random jitter dominates if RMS jitter is significant compared to p-p
149
+ # (deterministic would show bounded p-p with lower RMS)
150
+ if jitter_rms_val > 0:
151
+ jitter_ratio = jitter_pp_val / (6 * jitter_rms_val) # Expect ~6 for Gaussian
152
+ dominant_jitter_source = "random" if jitter_ratio < 8 else "deterministic"
153
+ else:
154
+ dominant_jitter_source = "unknown"
155
+
156
+ # Estimate BER from eye closure (simplified Gaussian approximation)
157
+ if eye_height > 0:
158
+ snr_linear = (
159
+ eye_height / (2 * jitter_rms_val * recovered_freq) if jitter_rms_val > 0 else 100
160
+ )
161
+ snr_db = 20 * np.log10(snr_linear) if snr_linear > 0 else 0
162
+ # BER ~ Q(SNR) where Q is Q-function
163
+ ber_estimate = 0.5 * (1 - np.tanh(snr_linear / np.sqrt(2)))
164
+ else:
165
+ snr_db = 0
166
+ ber_estimate = 0.5
167
+
168
+ # Mask margin (placeholder - would load actual mask)
169
+ margin_to_mask = None
170
+ if mask is not None:
171
+ # Would compare eye to loaded mask
172
+ margin_to_mask = eye_height * 0.2 # Assume 20% margin
173
+
174
+ # Build result dictionary
175
+ result = {
176
+ "eye_height": eye_height,
177
+ "eye_width": eye_width,
178
+ "jitter_rms": jitter_rms_val,
179
+ "jitter_pp": jitter_pp_val,
180
+ "tie": tie,
181
+ "tie_rms": jitter_rms_val, # TIE RMS same as jitter RMS
182
+ "margin_to_mask": margin_to_mask,
183
+ "dominant_jitter_source": dominant_jitter_source,
184
+ "bit_error_rate_estimate": ber_estimate,
185
+ "snr_db": snr_db,
186
+ "bit_rate": recovered_freq,
187
+ "unit_interval": ui,
188
+ }
189
+
190
+ # Generate report if requested
191
+ if report is not None:
192
+ _generate_si_report(result, report)
193
+
194
+ return result
195
+
196
+
197
+ def _generate_si_report(result: dict[str, Any], output_path: str) -> None:
198
+ """Generate HTML report for signal integrity audit.
199
+
200
+ Args:
201
+ result: Signal integrity result dictionary.
202
+ output_path: Path to save HTML report.
203
+ """
204
+ html = f"""
205
+ <html>
206
+ <head><title>Signal Integrity Audit Report</title></head>
207
+ <body>
208
+ <h1>Signal Integrity Audit Report</h1>
209
+ <h2>Eye Diagram Analysis</h2>
210
+ <table>
211
+ <tr><th>Parameter</th><th>Value</th><th>Units</th></tr>
212
+ <tr><td>Eye Height</td><td>{result["eye_height"] * 1e3:.2f}</td><td>mV</td></tr>
213
+ <tr><td>Eye Width</td><td>{result["eye_width"] * 1e12:.2f}</td><td>ps</td></tr>
214
+ <tr><td>RMS Jitter</td><td>{result["jitter_rms"] * 1e12:.2f}</td><td>ps</td></tr>
215
+ <tr><td>P-P Jitter</td><td>{result["jitter_pp"] * 1e12:.2f}</td><td>ps</td></tr>
216
+ <tr><td>SNR</td><td>{result["snr_db"]:.1f}</td><td>dB</td></tr>
217
+ <tr><td>Est. BER</td><td>{result["bit_error_rate_estimate"]:.2e}</td><td></td></tr>
218
+ <tr><td>Dominant Jitter</td><td>{result["dominant_jitter_source"]}</td><td></td></tr>
219
+ </table>
220
+ </body>
221
+ </html>
222
+ """
223
+ with open(output_path, "w") as f:
224
+ f.write(html)
225
+
226
+
227
+ __all__ = ["signal_integrity_audit"]
@@ -0,0 +1,300 @@
1
+ Metadata-Version: 2.4
2
+ Name: oscura
3
+ Version: 0.1.0
4
+ Summary: Unified hardware reverse engineering framework. Extract all information from any system through signals and data. Unknown protocol discovery, state machine extraction, CRC recovery, security analysis. 16+ protocols, IEEE-compliant measurements.
5
+ Project-URL: Homepage, https://github.com/oscura-re/oscura
6
+ Project-URL: Documentation, https://github.com/oscura-re/oscura/tree/main/docs
7
+ Project-URL: Repository, https://github.com/oscura-re/oscura
8
+ Project-URL: Changelog, https://github.com/oscura-re/oscura/blob/main/CHANGELOG.md
9
+ Project-URL: Issue Tracker, https://github.com/oscura-re/oscura/issues
10
+ Project-URL: Discussions, https://github.com/oscura-re/oscura/discussions
11
+ License-Expression: MIT
12
+ License-File: LICENSE
13
+ Keywords: automotive-protocols,can-bus,crc-recovery,device-replication,embedded-systems,exploitation,hardware-reverse-engineering,hardware-security,i2c,ieee-compliance,logic-analyzer,obd-ii,oscilloscope,protocol-analysis,protocol-decoder,protocol-inference,reverse-engineering,right-to-repair,security-research,signal-analysis,spectral-analysis,spi,state-machine-learning,uart,unknown-protocol,vulnerability-analysis,waveform-analysis
14
+ Classifier: Development Status :: 3 - Alpha
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: Intended Audience :: Information Technology
17
+ Classifier: Intended Audience :: Science/Research
18
+ Classifier: Intended Audience :: Telecommunications Industry
19
+ Classifier: License :: OSI Approved :: MIT License
20
+ Classifier: Operating System :: OS Independent
21
+ Classifier: Programming Language :: Python :: 3
22
+ Classifier: Programming Language :: Python :: 3.12
23
+ Classifier: Programming Language :: Python :: 3.13
24
+ Classifier: Topic :: Scientific/Engineering
25
+ Classifier: Topic :: Scientific/Engineering :: Information Analysis
26
+ Classifier: Topic :: Security
27
+ Classifier: Topic :: System :: Hardware
28
+ Classifier: Topic :: System :: Hardware :: Hardware Drivers
29
+ Classifier: Typing :: Typed
30
+ Requires-Python: >=3.12
31
+ Requires-Dist: click<9.0.0,>=8.1.0
32
+ Requires-Dist: dpkt<2.0.0,>=1.9.0
33
+ Requires-Dist: jinja2<4.0.0,>=3.1
34
+ Requires-Dist: matplotlib<4.0.0,>=3.7.0
35
+ Requires-Dist: numpy<3.0.0,>=1.24.0
36
+ Requires-Dist: pandas<3.0.0,>=2.0.0
37
+ Requires-Dist: psutil<7.0.0,>=5.9.0
38
+ Requires-Dist: pyyaml<7.0.0,>=6.0
39
+ Requires-Dist: scipy<2.0.0,>=1.10.0
40
+ Requires-Dist: tm-data-types<1.0.0,>=0.3.0
41
+ Provides-Extra: all
42
+ Requires-Dist: asammdf<8.0.0,>=7.4.0; extra == 'all'
43
+ Requires-Dist: cantools<40.0.0,>=39.4.0; extra == 'all'
44
+ Requires-Dist: check-jsonschema<1.0.0,>=0.29.0; extra == 'all'
45
+ Requires-Dist: h5py<4.0.0,>=3.0.0; extra == 'all'
46
+ Requires-Dist: hypothesis<7.0.0,>=6.0.0; extra == 'all'
47
+ Requires-Dist: interrogate<2.0.0,>=1.7.0; extra == 'all'
48
+ Requires-Dist: ipython<9.0.0,>=8.0.0; extra == 'all'
49
+ Requires-Dist: jupyter<2.0.0,>=1.0.0; extra == 'all'
50
+ Requires-Dist: nbconvert<8.0.0,>=7.0.0; extra == 'all'
51
+ Requires-Dist: networkx<4.0.0,>=3.0; extra == 'all'
52
+ Requires-Dist: nptdms<2.0.0,>=1.7.0; extra == 'all'
53
+ Requires-Dist: openpyxl<4.0.0,>=3.0.0; extra == 'all'
54
+ Requires-Dist: pytest-cov<8.0.0,>=6.0; extra == 'all'
55
+ Requires-Dist: pytest-timeout<3.0.0,>=2.3.0; extra == 'all'
56
+ Requires-Dist: pytest<10.0.0,>=8.0; extra == 'all'
57
+ Requires-Dist: python-can<5.0.0,>=4.4.0; extra == 'all'
58
+ Requires-Dist: python-pptx<1.0.0,>=0.6.21; extra == 'all'
59
+ Requires-Dist: pywavelets<2.0.0,>=1.0.0; extra == 'all'
60
+ Requires-Dist: reportlab<6.0.0,>=4.4.7; extra == 'all'
61
+ Requires-Dist: rigolwfm<2.0.0,>=1.0.0; extra == 'all'
62
+ Requires-Dist: scapy<3.0.0,>=2.5.0; extra == 'all'
63
+ Requires-Dist: types-pyyaml<7.0.0,>=6.0; extra == 'all'
64
+ Requires-Dist: yamllint<2.0.0,>=1.35; extra == 'all'
65
+ Provides-Extra: analysis
66
+ Requires-Dist: networkx<4.0.0,>=3.0; extra == 'analysis'
67
+ Requires-Dist: openpyxl<4.0.0,>=3.0.0; extra == 'analysis'
68
+ Requires-Dist: pywavelets<2.0.0,>=1.0.0; extra == 'analysis'
69
+ Provides-Extra: automotive
70
+ Requires-Dist: asammdf<8.0.0,>=7.4.0; extra == 'automotive'
71
+ Requires-Dist: cantools<40.0.0,>=39.4.0; extra == 'automotive'
72
+ Requires-Dist: python-can<5.0.0,>=4.4.0; extra == 'automotive'
73
+ Requires-Dist: scapy<3.0.0,>=2.5.0; extra == 'automotive'
74
+ Provides-Extra: dev
75
+ Requires-Dist: check-jsonschema<1.0.0,>=0.29.0; extra == 'dev'
76
+ Requires-Dist: hypothesis<7.0.0,>=6.0.0; extra == 'dev'
77
+ Requires-Dist: interrogate<2.0.0,>=1.7.0; extra == 'dev'
78
+ Requires-Dist: pytest-cov<8.0.0,>=6.0; extra == 'dev'
79
+ Requires-Dist: pytest-timeout<3.0.0,>=2.3.0; extra == 'dev'
80
+ Requires-Dist: pytest<10.0.0,>=8.0; extra == 'dev'
81
+ Requires-Dist: types-pyyaml<7.0.0,>=6.0; extra == 'dev'
82
+ Requires-Dist: yamllint<2.0.0,>=1.35; extra == 'dev'
83
+ Provides-Extra: hdf5
84
+ Requires-Dist: h5py<4.0.0,>=3.0.0; extra == 'hdf5'
85
+ Provides-Extra: jupyter
86
+ Requires-Dist: ipython<9.0.0,>=8.0.0; extra == 'jupyter'
87
+ Requires-Dist: jupyter<2.0.0,>=1.0.0; extra == 'jupyter'
88
+ Requires-Dist: nbconvert<8.0.0,>=7.0.0; extra == 'jupyter'
89
+ Provides-Extra: oscilloscopes
90
+ Requires-Dist: nptdms<2.0.0,>=1.7.0; extra == 'oscilloscopes'
91
+ Requires-Dist: rigolwfm<2.0.0,>=1.0.0; extra == 'oscilloscopes'
92
+ Provides-Extra: reporting
93
+ Requires-Dist: python-pptx<1.0.0,>=0.6.21; extra == 'reporting'
94
+ Requires-Dist: reportlab<6.0.0,>=4.4.7; extra == 'reporting'
95
+ Description-Content-Type: text/markdown
96
+
97
+ # Oscura
98
+
99
+ **Unified hardware reverse engineering framework. Extract all information from any system through signals and data.**
100
+
101
+ [![PyPI version](https://badge.fury.io/py/oscura.svg)](https://badge.fury.io/py/oscura)
102
+ [![Python 3.12+](https://img.shields.io/badge/python-3.12+-blue.svg)](https://www.python.org/downloads/)
103
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
104
+ [![CI](https://github.com/lair-click-bats/oscura/workflows/CI/badge.svg)](https://github.com/lair-click-bats/oscura/actions)
105
+
106
+ ---
107
+
108
+ ## What is Oscura?
109
+
110
+ Oscura is a hardware reverse engineering framework for security researchers, right-to-repair advocates, defense analysts, and commercial intelligence teams. From oscilloscope captures to complete system understanding.
111
+
112
+ **Reverse Engineering**: Unknown protocol discovery • State machine extraction • CRC/checksum recovery • Proprietary device replication • Security vulnerability analysis
113
+ **Signal Analysis**: IEEE-compliant measurements (181/1241/1459/2414) • Comprehensive protocol decoding (16+ protocols) • Spectral analysis • Timing characterization
114
+ **Built For**: Exploitation • Replication • Defense analysis • Commercial intelligence • Right-to-repair
115
+
116
+ ---
117
+
118
+ ## Installation
119
+
120
+ ```bash
121
+ # Using uv (recommended)
122
+ uv pip install oscura
123
+
124
+ # Or with pip
125
+ pip install oscura
126
+
127
+ # Development install
128
+ git clone https://github.com/lair-click-bats/oscura.git
129
+ cd oscura
130
+ uv sync --all-extras
131
+ ./scripts/setup/install-hooks.sh
132
+ ```
133
+
134
+ ---
135
+
136
+ ## Quick Start
137
+
138
+ ```python
139
+ import oscura as tk
140
+
141
+ # Load oscilloscope capture
142
+ trace = tk.load("capture.wfm")
143
+
144
+ # Basic measurements
145
+ print(f"Frequency: {tk.frequency(trace) / 1e6:.3f} MHz")
146
+ print(f"Rise time: {tk.rise_time(trace) * 1e9:.1f} ns")
147
+
148
+ # Decode protocol
149
+ from oscura.protocols import UARTDecoder
150
+ decoder = UARTDecoder(baud_rate=115200)
151
+ messages = decoder.decode(trace)
152
+ ```
153
+
154
+ ---
155
+
156
+ ## Learn by Example
157
+
158
+ **Demos are the documentation.** Each category includes working code with comprehensive explanations.
159
+
160
+ ### Core Capabilities
161
+
162
+ | Demo | Description |
163
+ |------|-------------|
164
+ | [01_waveform_analysis](demos/01_waveform_analysis/) | Load and analyze Tektronix, Rigol, LeCroy captures |
165
+ | [02_file_format_io](demos/02_file_format_io/) | CSV, HDF5, NumPy, custom binary formats |
166
+ | [03_custom_daq](demos/03_custom_daq/) | Streaming loaders for custom DAQ systems |
167
+ | [04_serial_protocols](demos/04_serial_protocols/) | UART, SPI, I2C, 1-Wire decoding |
168
+ | [05_protocol_decoding](demos/05_protocol_decoding/) | Protocol auto-detection and decoding |
169
+ | [06_udp_packet_analysis](demos/06_udp_packet_analysis/) | Network packet capture and analysis |
170
+
171
+ ### Advanced Analysis
172
+
173
+ | Demo | Description |
174
+ |------|-------------|
175
+ | [07_protocol_inference](demos/07_protocol_inference/) | State machine learning, CRC reverse engineering |
176
+ | [08_automotive_protocols](demos/08_automotive_protocols/) | CAN, CAN-FD, LIN, FlexRay analysis |
177
+ | [09_automotive](demos/09_automotive/) | OBD-II, UDS, J1939 diagnostics |
178
+ | [10_timing_measurements](demos/10_timing_measurements/) | Rise/fall time, duty cycle (IEEE 181) |
179
+ | [11_mixed_signal](demos/11_mixed_signal/) | Analog + digital combined analysis |
180
+ | [12_spectral_compliance](demos/12_spectral_compliance/) | FFT, THD, SNR, SINAD (IEEE 1241) |
181
+ | [13_jitter_analysis](demos/13_jitter_analysis/) | TIE, RJ/DJ, eye diagrams (IEEE 2414) |
182
+ | [14_power_analysis](demos/14_power_analysis/) | DC-DC, ripple, efficiency (IEEE 1459) |
183
+ | [15_signal_integrity](demos/15_signal_integrity/) | TDR, S-parameters, setup/hold timing |
184
+ | [16_emc_compliance](demos/16_emc_compliance/) | CISPR, FCC, MIL-STD testing |
185
+ | [17_signal_reverse_engineering](demos/17_signal_reverse_engineering/) | Complete unknown signal analysis |
186
+ | [18_advanced_inference](demos/18_advanced_inference/) | Bayesian inference, Protocol DSL |
187
+ | [19_complete_workflows](demos/19_complete_workflows/) | End-to-end reverse engineering |
188
+
189
+ ### Run Your First Demo
190
+
191
+ ```bash
192
+ # Generate demo data
193
+ python demos/data_generation/generate_all_demo_data.py
194
+
195
+ # Run a demo
196
+ uv run python demos/01_waveform_analysis/comprehensive_wfm_analysis.py
197
+ ```
198
+
199
+ ---
200
+
201
+ ## Key Features
202
+
203
+ ### Protocols (16+)
204
+
205
+ UART • SPI • I2C • 1-Wire • CAN • CAN-FD • LIN • FlexRay • JTAG • SWD • Manchester • Miller • USB • HDLC • I2S • MDIO • DMX512
206
+
207
+ ### File Formats (18+)
208
+
209
+ Tektronix WFM • Rigol WFM • LeCroy TRC • Sigrok • VCD • CSV • NumPy • HDF5 • MATLAB • WAV • JSON • BLF • MF4 • PCAP • PCAPNG
210
+
211
+ ### Standards Compliance
212
+
213
+ **IEEE 181-2011**: Rise/fall time, pulse width, overshoot
214
+ **IEEE 1241-2010**: SNR, SINAD, THD, SFDR, ENOB
215
+ **IEEE 1459-2010**: Power factor, harmonics, efficiency
216
+ **IEEE 2414-2020**: TIE, period jitter, RJ/DJ
217
+
218
+ ---
219
+
220
+ ## Command Line Interface
221
+
222
+ ```bash
223
+ # Analyze a waveform
224
+ oscura analyze capture.wfm
225
+
226
+ # Decode protocol
227
+ oscura decode capture.wfm --protocol uart --baud 115200
228
+
229
+ # Generate report
230
+ oscura report capture.wfm -o report.pdf
231
+
232
+ # Convert formats
233
+ oscura convert input.wfm output.csv
234
+ ```
235
+
236
+ See [CLI Reference](docs/cli.md) for complete documentation.
237
+
238
+ ---
239
+
240
+ ## Contributing
241
+
242
+ We welcome contributions! See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and guidelines.
243
+
244
+ ```bash
245
+ # Quick setup
246
+ git clone https://github.com/lair-click-bats/oscura.git
247
+ cd oscura
248
+ uv sync --all-extras
249
+ ./scripts/setup/install-hooks.sh
250
+
251
+ # Run tests
252
+ ./scripts/test.sh
253
+
254
+ # Quality checks
255
+ ./scripts/check.sh
256
+ ```
257
+
258
+ ---
259
+
260
+ ## Documentation
261
+
262
+ - **[Demos](demos/)** - Start here (working examples)
263
+ - **[API Reference](docs/api/)** - Complete API documentation
264
+ - **[CLI Reference](docs/cli.md)** - Command line usage
265
+ - **[Testing Guide](docs/testing/)** - Test suite architecture
266
+ - **[CHANGELOG](CHANGELOG.md)** - Version history
267
+
268
+ ---
269
+
270
+ ## License
271
+
272
+ MIT License - see [LICENSE](LICENSE) for details.
273
+
274
+ ---
275
+
276
+ ## Citation
277
+
278
+ If you use Oscura in research:
279
+
280
+ ```bibtex
281
+ @software{oscura,
282
+ title = {Oscura: Signal Reverse Engineering Toolkit},
283
+ author = {Oscura Contributors},
284
+ year = {2026},
285
+ url = {https://github.com/lair-click-bats/oscura}
286
+ }
287
+ ```
288
+
289
+ Machine-readable: [CITATION.cff](CITATION.cff)
290
+
291
+ ---
292
+
293
+ ## Support
294
+
295
+ - **[GitHub Issues](https://github.com/lair-click-bats/oscura/issues)** - Bug reports and feature requests
296
+ - **[Discussions](https://github.com/lair-click-bats/oscura/discussions)** - Questions and community
297
+
298
+ ---
299
+
300
+ **Oscura** • Reverse engineer any system from captured waveforms