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,173 @@
1
+ # {{title}}
2
+
3
+ ## Report Metadata
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}}|
12
+
13
+ ## Analysis Summary
14
+
15
+ |Metric|Count|
16
+ |---|---|
17
+ |Total Analyses|{{total_analyses}}|
18
+ |Successful|{{successful}}|
19
+ |Failed|{{failed}}|
20
+ |Analysis Domains|{{domains_count}}|
21
+
22
+ {{#if has_errors}}
23
+
24
+ > **Warning**: {{failed}} analyses encountered errors. See [Errors](#errors) section for details.
25
+ > {{/if}}
26
+
27
+ ---
28
+
29
+ ## Table of Contents
30
+
31
+ - [Overview](#overview)
32
+ {{#each domains}}
33
+ - [{{domain_name}}](#{{domain_id}})
34
+ {{/each}}
35
+ {{#if has_errors}}
36
+ - [Errors](#errors)
37
+ {{/if}}
38
+ - [Data Files](#data-files)
39
+
40
+ ---
41
+
42
+ ## Overview
43
+
44
+ This comprehensive analysis report contains **{{total_analyses}}** analyses across **{{domains_count}}** domains. Analysis completed in **{{duration}}**.
45
+
46
+ {{#if has_errors}}
47
+ **Note**: {{failed}} analyses encountered errors during execution. Check the [Errors](#errors) section below for details.
48
+ {{/if}}
49
+
50
+ ---
51
+
52
+ {{#each domains}}
53
+
54
+ ## {{domain_name}} {#{{domain_id}}}
55
+
56
+ **Statistics**: {{analyses_count}} analyses | {{plots_count}} plots | {{data_files_count}} data files
57
+
58
+ {{#if key_findings}}
59
+
60
+ ### Key Findings
61
+
62
+ {{#each key_findings}}
63
+
64
+ - {{this}}
65
+ {{/each}}
66
+
67
+ {{/if}}
68
+ {{#if plots}}
69
+
70
+ ### Visualizations
71
+
72
+ {{#each plots}}
73
+
74
+ #### {{title}}
75
+
76
+ ![{{title}}]({{path}})
77
+
78
+ {{/each}}
79
+
80
+ {{/if}}
81
+ {{#if data_files}}
82
+
83
+ ### Data Files
84
+
85
+ {{#each data_files}}
86
+
87
+ - [{{filename}}]({{path}}) - {{format}}
88
+ {{/each}}
89
+
90
+ {{/if}}
91
+
92
+ {{/each}}
93
+
94
+ {{#if has_errors}}
95
+
96
+ ## Errors {#errors}
97
+
98
+ The following analyses encountered errors during execution:
99
+
100
+ {{#each errors}}
101
+
102
+ ### {{domain}} - {{analysis_name}}
103
+
104
+ ```
105
+ {{error_message}}
106
+ ```
107
+
108
+ {{/each}}
109
+
110
+ ---
111
+
112
+ {{/if}}
113
+
114
+ ## Data Files {#data-files}
115
+
116
+ Full analysis results are available in multiple formats:
117
+
118
+ - [summary.json](summary.json) - Complete JSON output
119
+ - [summary.yaml](summary.yaml) - YAML format for readability
120
+ - [summary.csv](summary.csv) - Tabular data export
121
+ - [index.md](index.md) - This Markdown report
122
+
123
+ ---
124
+
125
+ ## Technical Details
126
+
127
+ ### Analysis Configuration
128
+
129
+ All analyses were executed using the Oscura comprehensive analysis system with the following configuration:
130
+
131
+ - Input file: `{{input_name}}`
132
+ - File size: {{input_size}}
133
+ - Input type: {{input_type}}
134
+ - Analysis duration: {{duration}}
135
+ - Total analyses: {{total_analyses}}
136
+ - Success rate: {{successful}}/{{total_analyses}}
137
+
138
+ ### Output Structure
139
+
140
+ ```
141
+ output_directory/
142
+ ├── index.html # Interactive HTML report
143
+ ├── index.md # This Markdown report
144
+ ├── summary.json # Complete JSON data
145
+ ├── summary.yaml # YAML formatted data
146
+ ├── summary.csv # CSV export
147
+ {{#each domains}}
148
+ ├── {{domain_id}}/ # {{domain_name}} outputs
149
+ {{#if plots}}
150
+ │ ├── plots/ # Visualization files
151
+ {{#each plots}}
152
+ │ │ ├── {{filename}}
153
+ {{/each}}
154
+ {{/if}}
155
+ {{#if data_files}}
156
+ │ └── data/ # Analysis data files
157
+ {{#each data_files}}
158
+ │ ├── {{filename}}
159
+ {{/each}}
160
+ {{/if}}
161
+ {{/each}}
162
+ ```
163
+
164
+ ### Viewing This Report
165
+
166
+ - **HTML Version**: Open `index.html` in any modern web browser for an interactive experience with dark mode support
167
+ - **Markdown Version**: View this file in any Markdown-compatible viewer or editor
168
+ - **PDF Export**: The HTML version is print-optimized for PDF generation via browser print
169
+
170
+ ---
171
+
172
+ _Generated by Oscura Comprehensive Analysis System_
173
+ _Report timestamp: {{timestamp}}_
@@ -0,0 +1,158 @@
1
+ """JSON Schema definitions for TraceKit configuration types.
2
+
3
+ This module provides JSON Schema definitions for validating various
4
+ configuration file types used in TraceKit, including packet formats,
5
+ device mappings, bus configurations, and protocol definitions.
6
+
7
+
8
+ Example:
9
+ >>> from oscura.schemas import load_schema, validate_config
10
+ >>> schema = load_schema("packet_format")
11
+ >>> validate_config(config_dict, "packet_format")
12
+ True
13
+ """
14
+
15
+ from __future__ import annotations
16
+
17
+ import json
18
+ from pathlib import Path
19
+ from typing import Any
20
+
21
+ from oscura.config.schema import (
22
+ ConfigSchema,
23
+ get_schema_registry,
24
+ register_schema,
25
+ validate_against_schema,
26
+ )
27
+
28
+ __all__ = [
29
+ "SCHEMA_NAMES",
30
+ "get_schema_path",
31
+ "load_schema",
32
+ "register_builtin_schemas",
33
+ "validate_config",
34
+ ]
35
+
36
+ # Schema type names
37
+ SCHEMA_NAMES = [
38
+ "packet_format",
39
+ "device_mapping",
40
+ "bus_configuration",
41
+ "protocol_definition",
42
+ ]
43
+
44
+
45
+ def get_schema_path(schema_name: str) -> Path:
46
+ """Get the file path for a schema definition.
47
+
48
+ Args:
49
+ schema_name: Schema name (e.g., "packet_format").
50
+
51
+ Returns:
52
+ Path to the JSON schema file.
53
+
54
+ Raises:
55
+ ValueError: If schema name is not recognized.
56
+ FileNotFoundError: If schema file does not exist.
57
+ """
58
+ if schema_name not in SCHEMA_NAMES:
59
+ raise ValueError(f"Unknown schema name: {schema_name}. Available schemas: {SCHEMA_NAMES}")
60
+
61
+ schema_dir = Path(__file__).parent
62
+ schema_file = schema_dir / f"{schema_name}.json"
63
+
64
+ if not schema_file.exists():
65
+ raise FileNotFoundError(f"Schema file not found: {schema_file}")
66
+
67
+ return schema_file
68
+
69
+
70
+ def load_schema(schema_name: str) -> dict[str, Any]:
71
+ """Load a JSON schema definition from disk.
72
+
73
+ Args:
74
+ schema_name: Schema name (e.g., "packet_format").
75
+
76
+ Returns:
77
+ JSON schema dictionary.
78
+ """
79
+ schema_path = get_schema_path(schema_name)
80
+
81
+ with open(schema_path) as f:
82
+ result: dict[str, Any] = json.load(f)
83
+ return result
84
+
85
+
86
+ def validate_config(
87
+ config: dict[str, Any],
88
+ schema_name: str,
89
+ *,
90
+ strict: bool = False,
91
+ ) -> bool:
92
+ """Validate a configuration dictionary against a schema.
93
+
94
+ Args:
95
+ config: Configuration dictionary to validate.
96
+ schema_name: Schema name (e.g., "packet_format").
97
+ strict: If True, fail on additional properties.
98
+
99
+ Returns:
100
+ True if validation passes.
101
+
102
+ Example:
103
+ >>> config = {"name": "test", "packet": {...}, "header": {...}}
104
+ >>> validate_config(config, "packet_format")
105
+ True
106
+ """
107
+ # Use the existing validation system from config.schema
108
+ return validate_against_schema(config, schema_name, strict=strict)
109
+
110
+
111
+ def register_builtin_schemas() -> None:
112
+ """Register all built-in configuration schemas.
113
+
114
+ This function registers the following schemas:
115
+ - packet_format: Binary packet format configurations
116
+ - device_mapping: Device ID to name mappings
117
+ - bus_configuration: Parallel bus configurations
118
+ - protocol_definition: Protocol DSL definitions
119
+
120
+
121
+
122
+ The schemas are registered with the global SchemaRegistry and can
123
+ be accessed via validate_against_schema() or get_schema_registry().
124
+ """
125
+ registry = get_schema_registry()
126
+
127
+ # Load and register each schema
128
+ for schema_name in SCHEMA_NAMES:
129
+ # Skip if already registered
130
+ if registry.has_schema(schema_name):
131
+ continue
132
+
133
+ schema_dict = load_schema(schema_name)
134
+
135
+ # Extract version from $id if present
136
+ version = "1.0.0" # default
137
+ if "$id" in schema_dict:
138
+ # Extract version from URI like .../v1.0.0.json
139
+ schema_id = schema_dict["$id"]
140
+ if "/v" in schema_id:
141
+ version_part = schema_id.split("/v")[-1]
142
+ version = version_part.replace(".json", "")
143
+
144
+ # Create ConfigSchema object
145
+ config_schema = ConfigSchema(
146
+ name=schema_name,
147
+ version=version,
148
+ schema=schema_dict,
149
+ description=schema_dict.get("description", ""),
150
+ uri=schema_dict.get("$id"),
151
+ )
152
+
153
+ # Register with global registry
154
+ register_schema(config_schema, set_default=True)
155
+
156
+
157
+ # Auto-register schemas on module import
158
+ register_builtin_schemas()
@@ -0,0 +1,322 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://tracekit.io/schemas/bus_configuration.json",
4
+ "title": "Bus Configuration Schema",
5
+ "description": "Schema for validating parallel bus configurations for multi-bit protocols (CFG-001).",
6
+ "type": "object",
7
+ "required": ["name", "settings"],
8
+ "additionalProperties": true,
9
+ "properties": {
10
+ "name": {
11
+ "type": "string",
12
+ "description": "Bus configuration identifier",
13
+ "pattern": "^[a-zA-Z][a-zA-Z0-9_]*$",
14
+ "minLength": 1
15
+ },
16
+ "version": {
17
+ "type": "string",
18
+ "description": "Configuration version",
19
+ "pattern": "^\\d+\\.\\d+$"
20
+ },
21
+ "description": {
22
+ "type": "string",
23
+ "description": "Human-readable description"
24
+ },
25
+ "settings": {
26
+ "type": "object",
27
+ "description": "Global bus settings",
28
+ "properties": {
29
+ "active_low": {
30
+ "type": "boolean",
31
+ "description": "Signals are active-low (inverted)"
32
+ },
33
+ "sample_on": {
34
+ "type": "string",
35
+ "enum": ["rising", "falling", "both"],
36
+ "description": "Sample on clock/timing pulse edge"
37
+ },
38
+ "bit_numbering": {
39
+ "type": "string",
40
+ "enum": ["lsb_0", "msb_0"],
41
+ "description": "Bit numbering convention"
42
+ }
43
+ },
44
+ "additionalProperties": false
45
+ },
46
+ "data_bus": {
47
+ "type": "object",
48
+ "description": "Data bus definition",
49
+ "required": ["name", "width", "bits"],
50
+ "properties": {
51
+ "name": {
52
+ "type": "string",
53
+ "description": "Bus name",
54
+ "pattern": "^[a-zA-Z][a-zA-Z0-9_]*$"
55
+ },
56
+ "width": {
57
+ "type": "integer",
58
+ "minimum": 1,
59
+ "maximum": 128,
60
+ "description": "Bus width in bits"
61
+ },
62
+ "description": {
63
+ "type": "string",
64
+ "description": "Bus description"
65
+ },
66
+ "active_low": {
67
+ "type": "boolean",
68
+ "description": "Override global active_low setting"
69
+ },
70
+ "bits": {
71
+ "type": "array",
72
+ "description": "Bit mappings from channel to position",
73
+ "minItems": 1,
74
+ "items": {
75
+ "type": "object",
76
+ "required": ["channel", "bit"],
77
+ "properties": {
78
+ "channel": {
79
+ "type": "integer",
80
+ "minimum": 0,
81
+ "description": "Source channel index"
82
+ },
83
+ "bit": {
84
+ "type": "integer",
85
+ "minimum": 0,
86
+ "description": "Bit position in bus"
87
+ },
88
+ "name": {
89
+ "type": "string",
90
+ "description": "Signal name",
91
+ "pattern": "^[a-zA-Z][a-zA-Z0-9_]*$"
92
+ }
93
+ },
94
+ "additionalProperties": false
95
+ }
96
+ }
97
+ },
98
+ "additionalProperties": false
99
+ },
100
+ "address_bus": {
101
+ "type": "object",
102
+ "description": "Address bus definition",
103
+ "required": ["name", "width", "bits"],
104
+ "properties": {
105
+ "name": {
106
+ "type": "string",
107
+ "description": "Bus name",
108
+ "pattern": "^[a-zA-Z][a-zA-Z0-9_]*$"
109
+ },
110
+ "width": {
111
+ "type": "integer",
112
+ "minimum": 1,
113
+ "maximum": 128,
114
+ "description": "Bus width in bits"
115
+ },
116
+ "description": {
117
+ "type": "string",
118
+ "description": "Bus description"
119
+ },
120
+ "active_low": {
121
+ "type": "boolean",
122
+ "description": "Override global active_low setting"
123
+ },
124
+ "bits": {
125
+ "type": "array",
126
+ "description": "Bit mappings from channel to position",
127
+ "minItems": 1,
128
+ "items": {
129
+ "type": "object",
130
+ "required": ["channel", "bit"],
131
+ "properties": {
132
+ "channel": {
133
+ "type": "integer",
134
+ "minimum": 0,
135
+ "description": "Source channel index"
136
+ },
137
+ "bit": {
138
+ "type": "integer",
139
+ "minimum": 0,
140
+ "description": "Bit position in bus"
141
+ },
142
+ "name": {
143
+ "type": "string",
144
+ "description": "Signal name",
145
+ "pattern": "^[a-zA-Z][a-zA-Z0-9_]*$"
146
+ }
147
+ },
148
+ "additionalProperties": false
149
+ }
150
+ }
151
+ },
152
+ "additionalProperties": false
153
+ },
154
+ "control_signals": {
155
+ "type": "array",
156
+ "description": "Control signal definitions",
157
+ "items": {
158
+ "type": "object",
159
+ "required": ["name", "channel"],
160
+ "properties": {
161
+ "name": {
162
+ "type": "string",
163
+ "description": "Signal name",
164
+ "pattern": "^[a-zA-Z][a-zA-Z0-9_]*$"
165
+ },
166
+ "channel": {
167
+ "type": "integer",
168
+ "minimum": 0,
169
+ "description": "Source channel index"
170
+ },
171
+ "active_low": {
172
+ "type": "boolean",
173
+ "description": "Signal is active-low"
174
+ },
175
+ "description": {
176
+ "type": "string",
177
+ "description": "Signal description"
178
+ },
179
+ "short_name": {
180
+ "type": "string",
181
+ "description": "Short name/abbreviation",
182
+ "maxLength": 8
183
+ }
184
+ },
185
+ "additionalProperties": false
186
+ }
187
+ },
188
+ "timing": {
189
+ "type": "object",
190
+ "description": "Timing constraints and validation",
191
+ "properties": {
192
+ "clock_period_ns": {
193
+ "type": "number",
194
+ "exclusiveMinimum": 0,
195
+ "description": "Clock period in nanoseconds"
196
+ },
197
+ "setup_time_ns": {
198
+ "type": "number",
199
+ "minimum": 0,
200
+ "description": "Setup time requirement in nanoseconds"
201
+ },
202
+ "hold_time_ns": {
203
+ "type": "number",
204
+ "minimum": 0,
205
+ "description": "Hold time requirement in nanoseconds"
206
+ },
207
+ "pulse_width_ns": {
208
+ "type": "object",
209
+ "description": "Pulse width requirements by signal type",
210
+ "additionalProperties": {
211
+ "type": "number",
212
+ "minimum": 0
213
+ }
214
+ }
215
+ },
216
+ "additionalProperties": false
217
+ },
218
+ "transactions": {
219
+ "type": "object",
220
+ "description": "Transaction decoding rules",
221
+ "properties": {
222
+ "types": {
223
+ "type": "array",
224
+ "description": "Transaction type definitions",
225
+ "items": {
226
+ "type": "object",
227
+ "required": ["name", "conditions"],
228
+ "properties": {
229
+ "name": {
230
+ "type": "string",
231
+ "description": "Transaction type name",
232
+ "pattern": "^[a-zA-Z][a-zA-Z0-9_]*$"
233
+ },
234
+ "conditions": {
235
+ "type": "object",
236
+ "description": "Signal conditions for this transaction",
237
+ "additionalProperties": {
238
+ "type": "boolean"
239
+ }
240
+ },
241
+ "sample_on": {
242
+ "type": "string",
243
+ "description": "Control signal to sample on"
244
+ },
245
+ "capture": {
246
+ "type": "object",
247
+ "description": "Buses/signals to capture",
248
+ "additionalProperties": {
249
+ "type": "string"
250
+ }
251
+ }
252
+ },
253
+ "additionalProperties": false
254
+ }
255
+ }
256
+ },
257
+ "additionalProperties": false
258
+ },
259
+ "instruction_decode": {
260
+ "type": "object",
261
+ "description": "Instruction decoding (if data contains opcodes)",
262
+ "properties": {
263
+ "enabled": {
264
+ "type": "boolean",
265
+ "description": "Enable instruction decoding"
266
+ },
267
+ "opcode_bits": {
268
+ "type": "array",
269
+ "description": "Bit range for opcode [start, end]",
270
+ "items": { "type": "integer", "minimum": 0 },
271
+ "minItems": 2,
272
+ "maxItems": 2
273
+ },
274
+ "opcodes": {
275
+ "type": "object",
276
+ "description": "Opcode to instruction mappings (keys can be integers or binary/hex strings)",
277
+ "additionalProperties": {
278
+ "type": "object",
279
+ "required": ["name"],
280
+ "properties": {
281
+ "name": {
282
+ "type": "string",
283
+ "description": "Instruction mnemonic"
284
+ },
285
+ "description": {
286
+ "type": "string",
287
+ "description": "Instruction description"
288
+ }
289
+ },
290
+ "additionalProperties": false
291
+ }
292
+ }
293
+ },
294
+ "additionalProperties": false
295
+ },
296
+ "output": {
297
+ "type": "object",
298
+ "description": "Output formatting options",
299
+ "properties": {
300
+ "format": {
301
+ "type": "string",
302
+ "enum": ["raw", "transaction", "annotated"],
303
+ "description": "Output format type"
304
+ },
305
+ "timestamp_format": {
306
+ "type": "string",
307
+ "enum": ["absolute", "relative_us", "relative_ns", "sample_index"],
308
+ "description": "Timestamp format"
309
+ },
310
+ "include_raw_values": {
311
+ "type": "boolean",
312
+ "description": "Include raw values in output"
313
+ },
314
+ "hex_format": {
315
+ "type": "boolean",
316
+ "description": "Display values in hexadecimal"
317
+ }
318
+ },
319
+ "additionalProperties": false
320
+ }
321
+ }
322
+ }