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,479 @@
1
+ """Switching loss analysis for TraceKit.
2
+
3
+ Provides switching loss calculations for power semiconductor devices
4
+ including MOSFETs, IGBTs, and diodes.
5
+
6
+
7
+ Example:
8
+ >>> from oscura.analyzers.power.switching import switching_loss
9
+ >>> losses = switching_loss(v_ds_trace, i_d_trace)
10
+ >>> print(f"Turn-on: {losses['e_on']*1e6:.2f} uJ")
11
+ >>> print(f"Turn-off: {losses['e_off']*1e6:.2f} uJ")
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ from dataclasses import dataclass
17
+ from typing import TYPE_CHECKING, Any, Literal
18
+
19
+ import numpy as np
20
+
21
+ from oscura.analyzers.power.basic import instantaneous_power
22
+
23
+ if TYPE_CHECKING:
24
+ from numpy.typing import NDArray
25
+
26
+ from oscura.core.types import WaveformTrace
27
+
28
+
29
+ @dataclass
30
+ class SwitchingEvent:
31
+ """Information about a switching transition.
32
+
33
+ Attributes:
34
+ start_time: Start time of transition (seconds).
35
+ end_time: End time of transition (seconds).
36
+ duration: Transition duration (seconds).
37
+ energy: Energy dissipated during transition (Joules).
38
+ peak_power: Peak power during transition (Watts).
39
+ event_type: "turn_on" or "turn_off".
40
+ """
41
+
42
+ start_time: float
43
+ end_time: float
44
+ duration: float
45
+ energy: float
46
+ peak_power: float
47
+ event_type: Literal["turn_on", "turn_off"]
48
+
49
+
50
+ def switching_loss(
51
+ voltage: WaveformTrace,
52
+ current: WaveformTrace,
53
+ *,
54
+ v_threshold: float | None = None,
55
+ i_threshold: float | None = None,
56
+ ) -> dict[str, Any]:
57
+ """Calculate switching losses for a power device.
58
+
59
+ Analyzes voltage and current waveforms to find switching transitions
60
+ and calculate turn-on and turn-off energy losses.
61
+
62
+ Args:
63
+ voltage: Drain-source (or collector-emitter) voltage trace.
64
+ current: Drain (or collector) current trace.
65
+ v_threshold: Voltage threshold for on/off detection.
66
+ If None, uses 10% of peak voltage.
67
+ i_threshold: Current threshold for on/off detection.
68
+ If None, uses 10% of peak current.
69
+
70
+ Returns:
71
+ Dictionary with:
72
+ - e_on: Turn-on energy per event (Joules)
73
+ - e_off: Turn-off energy per event (Joules)
74
+ - e_total: Total switching energy per cycle (Joules)
75
+ - p_sw: Switching power at estimated frequency (Watts)
76
+ - events: List of SwitchingEvent objects
77
+ - n_turn_on: Number of turn-on events
78
+ - n_turn_off: Number of turn-off events
79
+
80
+ Example:
81
+ >>> losses = switching_loss(v_ds, i_d)
82
+ >>> print(f"E_on: {losses['e_on']*1e6:.2f} uJ")
83
+ >>> print(f"E_off: {losses['e_off']*1e6:.2f} uJ")
84
+ >>> print(f"Switching power @ 100kHz: {losses['p_sw']*100e3:.2f} W")
85
+
86
+ References:
87
+ Infineon Application Note AN-9010
88
+ """
89
+ # Calculate instantaneous power
90
+ power = instantaneous_power(voltage, current)
91
+
92
+ # Ensure i_data matches v_data length (handle mismatched array sizes)
93
+ min_len = min(len(voltage.data), len(current.data))
94
+ v_data = voltage.data[:min_len]
95
+ i_data = current.data[:min_len]
96
+ p_data = power.data[:min_len]
97
+ sample_period = power.metadata.time_base
98
+
99
+ # Auto-detect thresholds if not provided
100
+ if v_threshold is None:
101
+ v_threshold = 0.1 * float(np.max(np.abs(v_data)))
102
+ if i_threshold is None:
103
+ i_threshold = 0.1 * float(np.max(np.abs(i_data)))
104
+
105
+ # Add hysteresis to prevent false transitions due to ringing (Schmitt trigger)
106
+ # Use 20% hysteresis band around thresholds
107
+ hysteresis_factor = 0.2
108
+ v_threshold_high = v_threshold * (1 + hysteresis_factor)
109
+ v_threshold_low = v_threshold * (1 - hysteresis_factor)
110
+ i_threshold_high = i_threshold * (1 + hysteresis_factor)
111
+ i_threshold_low = i_threshold * (1 - hysteresis_factor)
112
+
113
+ # Find switching events
114
+ events: list[SwitchingEvent] = []
115
+
116
+ # Determine device state at each sample with hysteresis
117
+ # ON: low voltage, high current
118
+ # OFF: high voltage, low current
119
+ # Use hysteresis to avoid rapid state changes due to noise/ringing
120
+ device_state = np.zeros(min_len, dtype=int) # 0=unknown, 1=on, 2=off
121
+ current_state = 0 # Start in unknown state
122
+
123
+ for i in range(min_len):
124
+ v = v_data[i]
125
+ i_val = i_data[i]
126
+
127
+ # Determine next state based on current state and measurements
128
+ if current_state == 1: # Currently ON
129
+ # Stay ON unless voltage goes high (with hysteresis)
130
+ if v > v_threshold_high:
131
+ current_state = 2 # Transition to OFF
132
+ elif current_state == 2: # Currently OFF
133
+ # Stay OFF unless voltage goes low (with hysteresis)
134
+ if v < v_threshold_low and i_val > i_threshold_low:
135
+ current_state = 1 # Transition to ON
136
+ else: # Unknown state - determine initial state
137
+ if v < v_threshold_low and i_val > i_threshold_high:
138
+ current_state = 1 # ON
139
+ elif v > v_threshold_high and i_val < i_threshold_low:
140
+ current_state = 2 # OFF
141
+
142
+ device_state[i] = current_state
143
+
144
+ device_on = device_state == 1
145
+ device_off = device_state == 2
146
+
147
+ # Find transitions
148
+ i = 0
149
+ while i < len(device_on) - 1:
150
+ # Look for turn-on: device was off, now turning on
151
+ if device_off[i] and not device_off[i + 1]:
152
+ # Find end of transition (device fully on)
153
+ start_idx = i
154
+ end_idx = start_idx + 1
155
+ while end_idx < len(device_on) and not device_on[end_idx]:
156
+ end_idx += 1
157
+
158
+ if end_idx < len(device_on):
159
+ # Calculate transition energy (scipy for stable API)
160
+ from scipy.integrate import trapezoid
161
+
162
+ transition_power = p_data[start_idx : end_idx + 1]
163
+ e = float(trapezoid(transition_power, dx=sample_period))
164
+ peak_p = float(np.max(transition_power))
165
+
166
+ events.append(
167
+ SwitchingEvent(
168
+ start_time=start_idx * sample_period,
169
+ end_time=end_idx * sample_period,
170
+ duration=(end_idx - start_idx) * sample_period,
171
+ energy=e,
172
+ peak_power=peak_p,
173
+ event_type="turn_on",
174
+ )
175
+ )
176
+ i = end_idx
177
+ continue
178
+
179
+ # Look for turn-off: device was on, now turning off
180
+ if device_on[i] and not device_on[i + 1]:
181
+ start_idx = i
182
+ end_idx = start_idx + 1
183
+ while end_idx < len(device_off) and not device_off[end_idx]:
184
+ end_idx += 1
185
+
186
+ if end_idx < len(device_off):
187
+ from scipy.integrate import trapezoid
188
+
189
+ transition_power = p_data[start_idx : end_idx + 1]
190
+ e = float(trapezoid(transition_power, dx=sample_period))
191
+ peak_p = float(np.max(transition_power))
192
+
193
+ events.append(
194
+ SwitchingEvent(
195
+ start_time=start_idx * sample_period,
196
+ end_time=end_idx * sample_period,
197
+ duration=(end_idx - start_idx) * sample_period,
198
+ energy=e,
199
+ peak_power=peak_p,
200
+ event_type="turn_off",
201
+ )
202
+ )
203
+ i = end_idx
204
+ continue
205
+
206
+ i += 1
207
+
208
+ # Calculate average energies
209
+ turn_on_events = [e for e in events if e.event_type == "turn_on"]
210
+ turn_off_events = [e for e in events if e.event_type == "turn_off"]
211
+
212
+ e_on = float(np.mean([e.energy for e in turn_on_events])) if turn_on_events else 0.0
213
+ e_off = float(np.mean([e.energy for e in turn_off_events])) if turn_off_events else 0.0
214
+ e_total = e_on + e_off
215
+
216
+ # Estimate switching frequency from event spacing
217
+ if len(events) >= 2:
218
+ event_times = [e.start_time for e in events]
219
+ avg_period = float(np.mean(np.diff(event_times))) * 2 # Full cycle
220
+ f_sw = 1.0 / avg_period if avg_period > 0 else 0.0
221
+ else:
222
+ f_sw = 0.0
223
+
224
+ return {
225
+ "e_on": e_on,
226
+ "e_off": e_off,
227
+ "e_total": e_total,
228
+ "f_sw": f_sw,
229
+ "p_sw": e_total * f_sw, # Switching power at this frequency
230
+ "events": events,
231
+ "n_turn_on": len(turn_on_events),
232
+ "n_turn_off": len(turn_off_events),
233
+ }
234
+
235
+
236
+ def switching_energy(
237
+ voltage: WaveformTrace,
238
+ current: WaveformTrace,
239
+ start_time: float,
240
+ end_time: float,
241
+ ) -> float:
242
+ """Calculate switching energy over a specific time window.
243
+
244
+ E = integral(V(t) * I(t) dt) from start_time to end_time
245
+
246
+ Args:
247
+ voltage: Voltage trace.
248
+ current: Current trace.
249
+ start_time: Start of integration window (seconds).
250
+ end_time: End of integration window (seconds).
251
+
252
+ Returns:
253
+ Switching energy in Joules.
254
+
255
+ Example:
256
+ >>> e = switching_energy(v_ds, i_d, start_time=1e-6, end_time=1.5e-6)
257
+ >>> print(f"Switching energy: {e*1e9:.2f} nJ")
258
+ """
259
+ power = instantaneous_power(voltage, current)
260
+ sample_period = power.metadata.time_base
261
+ time_vector = np.arange(len(power.data)) * sample_period
262
+
263
+ # Select time window
264
+ mask = (time_vector >= start_time) & (time_vector <= end_time)
265
+ window_power = power.data[mask]
266
+
267
+ # Use scipy for stable API across NumPy versions
268
+ from scipy.integrate import trapezoid
269
+
270
+ return float(trapezoid(window_power, dx=sample_period))
271
+
272
+
273
+ def turn_on_loss(
274
+ voltage: WaveformTrace,
275
+ current: WaveformTrace,
276
+ *,
277
+ v_threshold: float | None = None,
278
+ i_threshold: float | None = None,
279
+ ) -> float:
280
+ """Calculate average turn-on energy loss.
281
+
282
+ Convenience function that returns just the turn-on energy.
283
+
284
+ Args:
285
+ voltage: Drain-source voltage trace.
286
+ current: Drain current trace.
287
+ v_threshold: Voltage threshold for on/off detection.
288
+ i_threshold: Current threshold for on/off detection.
289
+
290
+ Returns:
291
+ Average turn-on energy in Joules.
292
+ """
293
+ result = switching_loss(voltage, current, v_threshold=v_threshold, i_threshold=i_threshold)
294
+ return float(result["e_on"])
295
+
296
+
297
+ def turn_off_loss(
298
+ voltage: WaveformTrace,
299
+ current: WaveformTrace,
300
+ *,
301
+ v_threshold: float | None = None,
302
+ i_threshold: float | None = None,
303
+ ) -> float:
304
+ """Calculate average turn-off energy loss.
305
+
306
+ Args:
307
+ voltage: Drain-source voltage trace.
308
+ current: Drain current trace.
309
+ v_threshold: Voltage threshold for on/off detection.
310
+ i_threshold: Current threshold for on/off detection.
311
+
312
+ Returns:
313
+ Average turn-off energy in Joules.
314
+ """
315
+ result = switching_loss(voltage, current, v_threshold=v_threshold, i_threshold=i_threshold)
316
+ return float(result["e_off"])
317
+
318
+
319
+ def total_switching_loss(
320
+ voltage: WaveformTrace,
321
+ current: WaveformTrace,
322
+ frequency: float,
323
+ *,
324
+ v_threshold: float | None = None,
325
+ i_threshold: float | None = None,
326
+ ) -> float:
327
+ """Calculate total switching power loss at given frequency.
328
+
329
+ P_sw = (E_on + E_off) * f_sw
330
+
331
+ Args:
332
+ voltage: Drain-source voltage trace.
333
+ current: Drain current trace.
334
+ frequency: Switching frequency in Hz.
335
+ v_threshold: Voltage threshold for on/off detection.
336
+ i_threshold: Current threshold for on/off detection.
337
+
338
+ Returns:
339
+ Switching power loss in Watts.
340
+
341
+ Example:
342
+ >>> p_sw = total_switching_loss(v_ds, i_d, frequency=100e3)
343
+ >>> print(f"Switching loss at 100kHz: {p_sw:.2f} W")
344
+ """
345
+ result = switching_loss(voltage, current, v_threshold=v_threshold, i_threshold=i_threshold)
346
+ return float(result["e_total"]) * frequency
347
+
348
+
349
+ def switching_frequency(
350
+ voltage: WaveformTrace,
351
+ *,
352
+ threshold: float | None = None,
353
+ ) -> float:
354
+ """Estimate switching frequency from voltage waveform.
355
+
356
+ Args:
357
+ voltage: Drain-source voltage trace.
358
+ threshold: Voltage threshold for edge detection.
359
+
360
+ Returns:
361
+ Estimated switching frequency in Hz.
362
+
363
+ Example:
364
+ >>> f_sw = switching_frequency(v_ds)
365
+ >>> print(f"Switching frequency: {f_sw/1e3:.1f} kHz")
366
+ """
367
+ data = voltage.data
368
+ sample_rate = voltage.metadata.sample_rate
369
+
370
+ if threshold is None:
371
+ threshold = float((np.max(data) + np.min(data)) / 2)
372
+
373
+ # Find rising edges
374
+ below = data < threshold
375
+ above = data >= threshold
376
+ rising = np.where(below[:-1] & above[1:])[0]
377
+
378
+ if len(rising) < 2:
379
+ return 0.0
380
+
381
+ # Calculate average period
382
+ periods = np.diff(rising) / sample_rate
383
+ avg_period = float(np.mean(periods))
384
+
385
+ return 1.0 / avg_period if avg_period > 0 else 0.0
386
+
387
+
388
+ def switching_times(
389
+ voltage: WaveformTrace,
390
+ current: WaveformTrace,
391
+ *,
392
+ v_threshold: float | None = None,
393
+ i_threshold: float | None = None,
394
+ ) -> dict[str, float]:
395
+ """Measure switching times (tr, tf, ton, toff).
396
+
397
+ Args:
398
+ voltage: Drain-source voltage trace.
399
+ current: Drain current trace.
400
+ v_threshold: Voltage threshold (10%-90% levels if None).
401
+ i_threshold: Current threshold (10%-90% levels if None).
402
+
403
+ Returns:
404
+ Dictionary with:
405
+ - tr: Rise time (10%-90%)
406
+ - tf: Fall time (90%-10%)
407
+ - t_on: Turn-on delay time
408
+ - t_off: Turn-off delay time
409
+ """
410
+ # Ensure arrays match in length (handle mismatched array sizes)
411
+ min_len = min(len(voltage.data), len(current.data))
412
+ v_data = voltage.data[:min_len]
413
+ i_data = current.data[:min_len]
414
+ sample_period = voltage.metadata.time_base
415
+
416
+ v_min, v_max = float(np.min(v_data)), float(np.max(v_data))
417
+ i_min, i_max = float(np.min(i_data)), float(np.max(i_data))
418
+
419
+ v_10 = v_min + 0.1 * (v_max - v_min)
420
+ v_90 = v_min + 0.9 * (v_max - v_min)
421
+ i_10 = i_min + 0.1 * (i_max - i_min)
422
+ i_90 = i_min + 0.9 * (i_max - i_min)
423
+
424
+ # Find voltage transitions
425
+ def find_transition_time(
426
+ data: NDArray[np.floating[Any]], low: float, high: float, rising: bool
427
+ ) -> float:
428
+ if rising:
429
+ below_low = data < low
430
+ start_idx_arr = np.where(below_low[:-1] & ~below_low[1:])[0]
431
+ if len(start_idx_arr) == 0:
432
+ return float(np.nan)
433
+ start_idx = int(start_idx_arr[0])
434
+ remaining = data[start_idx:]
435
+ above_mask = remaining > high
436
+ if not np.any(above_mask):
437
+ return float(np.nan)
438
+ end_offset = int(np.argmax(above_mask))
439
+ return float(end_offset) * sample_period
440
+ else:
441
+ above_high = data > high
442
+ start_idx_arr = np.where(above_high[:-1] & ~above_high[1:])[0]
443
+ if len(start_idx_arr) == 0:
444
+ return float(np.nan)
445
+ start_idx = int(start_idx_arr[0])
446
+ remaining = data[start_idx:]
447
+ below_mask = remaining < low
448
+ if not np.any(below_mask):
449
+ return float(np.nan)
450
+ end_offset = int(np.argmax(below_mask))
451
+ return float(end_offset) * sample_period
452
+
453
+ # Voltage fall time (turn-on)
454
+ tf_v = find_transition_time(v_data, v_10, v_90, rising=False)
455
+ # Voltage rise time (turn-off)
456
+ tr_v = find_transition_time(v_data, v_10, v_90, rising=True)
457
+ # Current rise time (turn-on)
458
+ tr_i = find_transition_time(i_data, i_10, i_90, rising=True)
459
+ # Current fall time (turn-off)
460
+ tf_i = find_transition_time(i_data, i_10, i_90, rising=False)
461
+
462
+ return {
463
+ "tr": tr_v, # Voltage rise time (turn-off)
464
+ "tf": tf_v, # Voltage fall time (turn-on)
465
+ "tr_current": tr_i, # Current rise time (turn-on)
466
+ "tf_current": tf_i, # Current fall time (turn-off)
467
+ }
468
+
469
+
470
+ __all__ = [
471
+ "SwitchingEvent",
472
+ "switching_energy",
473
+ "switching_frequency",
474
+ "switching_loss",
475
+ "switching_times",
476
+ "total_switching_loss",
477
+ "turn_off_loss",
478
+ "turn_on_loss",
479
+ ]
@@ -0,0 +1,150 @@
1
+ """Protocol decoding module.
2
+
3
+ This module re-exports protocol decoders from the protocols package
4
+ for convenient access. Both import paths are equivalent:
5
+
6
+ from oscura.analyzers.protocol import UARTDecoder # singular (this module)
7
+ from oscura.analyzers.protocols import UARTDecoder # plural (recommended)
8
+
9
+ The plural form (protocols) is recommended as the canonical import path.
10
+ See IMPORT-PATHS.md in the repository root for detailed guidelines.
11
+ """
12
+
13
+ from oscura.analyzers.protocols import (
14
+ CAN_BITRATES,
15
+ CANFD_DLC_TO_LENGTH,
16
+ FAMILY_CODES,
17
+ JTAG_INSTRUCTIONS,
18
+ PID_NAMES,
19
+ ROM_COMMAND_NAMES,
20
+ USBPID,
21
+ Annotation,
22
+ AnnotationLevel,
23
+ AsyncDecoder,
24
+ CANDecoder,
25
+ CANFDDecoder,
26
+ CANFDFrame,
27
+ CANFDFrameType,
28
+ CANFrame,
29
+ CANFrameType,
30
+ ChannelDef,
31
+ DecoderState,
32
+ FlexRayDecoder,
33
+ FlexRayFrame,
34
+ FlexRaySegment,
35
+ HDLCDecoder,
36
+ I2CDecoder,
37
+ I2SDecoder,
38
+ I2SMode,
39
+ JTAGDecoder,
40
+ LINDecoder,
41
+ LINVersion,
42
+ ManchesterDecoder,
43
+ ManchesterMode,
44
+ OneWireDecoder,
45
+ OneWireMode,
46
+ OneWireROMCommand,
47
+ OneWireROMID,
48
+ OneWireTimings,
49
+ OptionDef,
50
+ ProtocolDecoder,
51
+ SPIDecoder,
52
+ SWDDecoder,
53
+ SWDResponse,
54
+ SyncDecoder,
55
+ TAPState,
56
+ UARTDecoder,
57
+ USBDecoder,
58
+ USBSpeed,
59
+ decode_can,
60
+ decode_can_fd,
61
+ decode_flexray,
62
+ decode_hdlc,
63
+ decode_i2c,
64
+ decode_i2s,
65
+ decode_jtag,
66
+ decode_lin,
67
+ decode_manchester,
68
+ decode_onewire,
69
+ decode_spi,
70
+ decode_swd,
71
+ decode_uart,
72
+ decode_usb,
73
+ )
74
+
75
+ __all__ = [
76
+ "CANFD_DLC_TO_LENGTH",
77
+ "CAN_BITRATES",
78
+ "FAMILY_CODES",
79
+ "JTAG_INSTRUCTIONS",
80
+ "PID_NAMES",
81
+ "ROM_COMMAND_NAMES",
82
+ "USBPID",
83
+ "Annotation",
84
+ "AnnotationLevel",
85
+ "AsyncDecoder",
86
+ # CAN (PRO-005)
87
+ "CANDecoder",
88
+ # CAN-FD (PRO-015)
89
+ "CANFDDecoder",
90
+ "CANFDFrame",
91
+ "CANFDFrameType",
92
+ "CANFrame",
93
+ "CANFrameType",
94
+ "ChannelDef",
95
+ "DecoderState",
96
+ # FlexRay (PRO-016)
97
+ "FlexRayDecoder",
98
+ "FlexRayFrame",
99
+ "FlexRaySegment",
100
+ # HDLC (PRO-013)
101
+ "HDLCDecoder",
102
+ # I2C (PRO-004)
103
+ "I2CDecoder",
104
+ # I2S (PRO-011)
105
+ "I2SDecoder",
106
+ "I2SMode",
107
+ # JTAG (PRO-009)
108
+ "JTAGDecoder",
109
+ # LIN (PRO-008)
110
+ "LINDecoder",
111
+ "LINVersion",
112
+ # Manchester (PRO-014)
113
+ "ManchesterDecoder",
114
+ "ManchesterMode",
115
+ # 1-Wire (PRO-007)
116
+ "OneWireDecoder",
117
+ "OneWireMode",
118
+ "OneWireROMCommand",
119
+ "OneWireROMID",
120
+ "OneWireTimings",
121
+ "OptionDef",
122
+ # Base
123
+ "ProtocolDecoder",
124
+ # SPI (PRO-003)
125
+ "SPIDecoder",
126
+ # SWD (PRO-010)
127
+ "SWDDecoder",
128
+ "SWDResponse",
129
+ "SyncDecoder",
130
+ "TAPState",
131
+ # UART (PRO-002)
132
+ "UARTDecoder",
133
+ # USB (PRO-012)
134
+ "USBDecoder",
135
+ "USBSpeed",
136
+ "decode_can",
137
+ "decode_can_fd",
138
+ "decode_flexray",
139
+ "decode_hdlc",
140
+ "decode_i2c",
141
+ "decode_i2s",
142
+ "decode_jtag",
143
+ "decode_lin",
144
+ "decode_manchester",
145
+ "decode_onewire",
146
+ "decode_spi",
147
+ "decode_swd",
148
+ "decode_uart",
149
+ "decode_usb",
150
+ ]