oscura 0.0.1__py3-none-any.whl → 0.1.1__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.1.dist-info/METADATA +300 -0
  460. oscura-0.1.1.dist-info/RECORD +463 -0
  461. oscura-0.1.1.dist-info/entry_points.txt +2 -0
  462. {oscura-0.0.1.dist-info → oscura-0.1.1.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.1.dist-info}/WHEEL +0 -0
@@ -0,0 +1,312 @@
1
+ """Transmission line analysis for Oscura.
2
+
3
+ This module provides transmission line characterization including
4
+ characteristic impedance, propagation delay, and velocity factor.
5
+
6
+
7
+ Example:
8
+ >>> from oscura.component import transmission_line_analysis
9
+ >>> result = transmission_line_analysis(tdr_trace)
10
+
11
+ References:
12
+ IPC-TM-650 2.5.5.7: Characteristic Impedance of Lines on PCBs
13
+ IEEE 370-2020: Electrical Characterization of Interconnects
14
+ """
15
+
16
+ from __future__ import annotations
17
+
18
+ from dataclasses import dataclass, field
19
+ from typing import TYPE_CHECKING
20
+
21
+ import numpy as np
22
+ from scipy import signal as sp_signal
23
+
24
+ if TYPE_CHECKING:
25
+ from numpy.typing import NDArray
26
+
27
+ from oscura.core.types import WaveformTrace
28
+
29
+
30
+ @dataclass
31
+ class TransmissionLineResult:
32
+ """Transmission line characterization result.
33
+
34
+ Attributes:
35
+ z0: Characteristic impedance in ohms.
36
+ propagation_delay: Propagation delay in seconds.
37
+ velocity_factor: Velocity factor (0-1).
38
+ velocity: Propagation velocity in m/s.
39
+ length: Estimated line length in meters.
40
+ loss: Estimated loss in dB (if available).
41
+ return_loss: Return loss in dB (if available).
42
+ insertion_loss: Insertion loss in dB (if available).
43
+ statistics: Additional measurements.
44
+ """
45
+
46
+ z0: float
47
+ propagation_delay: float
48
+ velocity_factor: float
49
+ velocity: float
50
+ length: float
51
+ loss: float | None = None
52
+ return_loss: float | None = None
53
+ insertion_loss: float | None = None
54
+ statistics: dict = field(default_factory=dict) # type: ignore[type-arg]
55
+
56
+
57
+ def transmission_line_analysis(
58
+ trace: WaveformTrace,
59
+ *,
60
+ z0_source: float = 50.0,
61
+ line_length: float | None = None,
62
+ dielectric_constant: float | None = None,
63
+ ) -> TransmissionLineResult:
64
+ """Analyze transmission line from TDR measurement.
65
+
66
+ Characterizes a transmission line by extracting characteristic
67
+ impedance, propagation delay, and loss parameters.
68
+
69
+ Args:
70
+ trace: TDR reflection waveform.
71
+ z0_source: Source impedance (default 50 ohms).
72
+ line_length: Known line length in meters (improves accuracy).
73
+ dielectric_constant: Known dielectric constant (improves velocity).
74
+
75
+ Returns:
76
+ TransmissionLineResult with line parameters.
77
+
78
+ Example:
79
+ >>> result = transmission_line_analysis(tdr_trace, line_length=0.1)
80
+ >>> print(f"Z0 = {result.z0:.1f} ohms, delay = {result.propagation_delay*1e9:.2f} ns")
81
+ """
82
+ from oscura.component.impedance import extract_impedance
83
+
84
+ # Speed of light
85
+ c = 299792458.0
86
+
87
+ # Extract impedance profile
88
+ z0, profile = extract_impedance(trace, z0_source=z0_source)
89
+
90
+ # Estimate propagation delay from reflection
91
+ data = trace.data.astype(np.float64)
92
+ sample_rate = trace.metadata.sample_rate
93
+
94
+ # Find incident edge and first reflection
95
+ incident_time, reflection_time = _find_reflection_times(data, sample_rate)
96
+ round_trip_time = reflection_time - incident_time
97
+
98
+ # Propagation delay is half the round-trip time
99
+ propagation_delay = round_trip_time / 2
100
+
101
+ # Calculate velocity
102
+ if line_length is not None:
103
+ # Use known length
104
+ velocity = line_length / propagation_delay if propagation_delay > 0 else c * 0.66
105
+ velocity_factor = velocity / c
106
+ elif dielectric_constant is not None:
107
+ # Calculate from dielectric constant
108
+ velocity_factor = 1 / np.sqrt(dielectric_constant)
109
+ velocity = c * velocity_factor
110
+ line_length = velocity * propagation_delay
111
+ else:
112
+ # Estimate from typical FR4
113
+ velocity_factor = 0.66
114
+ velocity = c * velocity_factor
115
+ line_length = velocity * propagation_delay
116
+
117
+ # Estimate loss from reflection amplitude decay
118
+ loss = _estimate_loss(data, sample_rate, propagation_delay)
119
+
120
+ # Estimate return loss
121
+ return_loss = _calculate_return_loss(z0, z0_source)
122
+
123
+ return TransmissionLineResult(
124
+ z0=z0,
125
+ propagation_delay=propagation_delay,
126
+ velocity_factor=velocity_factor,
127
+ velocity=velocity,
128
+ length=line_length,
129
+ loss=loss,
130
+ return_loss=return_loss,
131
+ statistics={
132
+ "incident_time": incident_time,
133
+ "reflection_time": reflection_time,
134
+ "round_trip_time": round_trip_time,
135
+ "z0_std": profile.statistics.get("z0_std", 0),
136
+ },
137
+ )
138
+
139
+
140
+ def characteristic_impedance(
141
+ trace: WaveformTrace,
142
+ *,
143
+ z0_source: float = 50.0,
144
+ start_time: float | None = None,
145
+ end_time: float | None = None,
146
+ ) -> float:
147
+ """Extract characteristic impedance from TDR measurement.
148
+
149
+ Calculates the characteristic impedance from a stable region
150
+ of the TDR waveform.
151
+
152
+ Args:
153
+ trace: TDR reflection waveform.
154
+ z0_source: Source impedance.
155
+ start_time: Start of analysis window (seconds).
156
+ end_time: End of analysis window (seconds).
157
+
158
+ Returns:
159
+ Characteristic impedance in ohms.
160
+
161
+ Example:
162
+ >>> z0 = characteristic_impedance(tdr_trace)
163
+ >>> print(f"Z0 = {z0:.1f} ohms")
164
+ """
165
+ from oscura.component.impedance import extract_impedance
166
+
167
+ z0, _ = extract_impedance(
168
+ trace,
169
+ z0_source=z0_source,
170
+ start_time=start_time,
171
+ end_time=end_time,
172
+ )
173
+ return z0
174
+
175
+
176
+ def propagation_delay(
177
+ trace: WaveformTrace,
178
+ *,
179
+ threshold: float = 0.5,
180
+ ) -> float:
181
+ """Measure propagation delay from TDR waveform.
182
+
183
+ Calculates the one-way propagation delay from the incident edge
184
+ to the first reflection.
185
+
186
+ Args:
187
+ trace: TDR reflection waveform.
188
+ threshold: Threshold level for edge detection (normalized).
189
+
190
+ Returns:
191
+ Propagation delay in seconds.
192
+
193
+ Example:
194
+ >>> delay = propagation_delay(tdr_trace)
195
+ >>> print(f"Delay = {delay * 1e9:.2f} ns")
196
+ """
197
+ data = trace.data.astype(np.float64)
198
+ sample_rate = trace.metadata.sample_rate
199
+
200
+ incident_time, reflection_time = _find_reflection_times(data, sample_rate, threshold)
201
+
202
+ return (reflection_time - incident_time) / 2
203
+
204
+
205
+ def velocity_factor(
206
+ trace: WaveformTrace,
207
+ line_length: float,
208
+ ) -> float:
209
+ """Calculate velocity factor from TDR and known length.
210
+
211
+ Determines the propagation velocity as a fraction of the
212
+ speed of light.
213
+
214
+ Args:
215
+ trace: TDR reflection waveform.
216
+ line_length: Known line length in meters.
217
+
218
+ Returns:
219
+ Velocity factor (0 to 1).
220
+
221
+ Example:
222
+ >>> vf = velocity_factor(tdr_trace, line_length=0.1)
223
+ >>> print(f"Velocity factor = {vf:.2f}")
224
+ """
225
+ c = 299792458.0
226
+ delay = propagation_delay(trace)
227
+
228
+ if delay > 0:
229
+ velocity = line_length / delay
230
+ return float(min(1.0, velocity / c))
231
+ return 0.66 # Default for FR4
232
+
233
+
234
+ def _find_reflection_times(
235
+ data: NDArray[np.float64],
236
+ sample_rate: float,
237
+ threshold: float = 0.5,
238
+ ) -> tuple[float, float]:
239
+ """Find incident and reflection edge times."""
240
+ # Normalize data
241
+ data_norm = (data - np.min(data)) / (np.ptp(data) + 1e-10)
242
+
243
+ # Calculate derivative to find edges
244
+ derivative = np.abs(np.diff(data_norm))
245
+
246
+ # Find peaks in derivative
247
+ peaks, _ = sp_signal.find_peaks(derivative, height=0.1 * np.max(derivative))
248
+
249
+ if len(peaks) < 2:
250
+ # Fallback: use threshold crossing
251
+ above_thresh = data_norm > threshold
252
+ crossings = np.where(np.diff(above_thresh.astype(int)))[0]
253
+
254
+ if len(crossings) >= 2:
255
+ incident_idx = crossings[0]
256
+ reflection_idx = crossings[1]
257
+ else:
258
+ # Can't find edges
259
+ incident_idx = 0
260
+ reflection_idx = len(data) // 2
261
+ else:
262
+ incident_idx = peaks[0]
263
+ reflection_idx = peaks[1]
264
+
265
+ incident_time = incident_idx / sample_rate
266
+ reflection_time = reflection_idx / sample_rate
267
+
268
+ return incident_time, reflection_time
269
+
270
+
271
+ def _estimate_loss(
272
+ data: NDArray[np.float64],
273
+ sample_rate: float,
274
+ delay: float,
275
+ ) -> float | None:
276
+ """Estimate transmission line loss from reflection amplitudes."""
277
+ # Find incident and reflected amplitudes
278
+ incident_region = data[: int(delay * sample_rate * 0.5)]
279
+ if len(incident_region) == 0:
280
+ return None
281
+
282
+ incident_amp = np.max(incident_region) - np.min(incident_region)
283
+
284
+ # Find reflected amplitude (after round-trip)
285
+ reflection_start = int(delay * 2 * sample_rate)
286
+ if reflection_start >= len(data):
287
+ return None
288
+
289
+ reflected_region = data[reflection_start:]
290
+ if len(reflected_region) == 0:
291
+ return None
292
+
293
+ reflected_amp = np.max(reflected_region) - np.min(reflected_region)
294
+
295
+ if incident_amp > 0:
296
+ # Loss in dB = 20 * log10(reflected / incident)
297
+ # But this is round-trip, so divide by 2 for one-way
298
+ ratio = reflected_amp / incident_amp
299
+ if ratio > 0 and ratio < 1:
300
+ return float(-20 * np.log10(ratio) / 2)
301
+
302
+ return None
303
+
304
+
305
+ def _calculate_return_loss(z0: float, z0_source: float) -> float:
306
+ """Calculate return loss from impedance mismatch."""
307
+ if z0 + z0_source > 0:
308
+ rho = abs((z0 - z0_source) / (z0 + z0_source))
309
+ if rho > 0:
310
+ return float(-20 * np.log10(rho))
311
+ return float("inf") # Perfect match
312
+ return 0.0
@@ -0,0 +1,191 @@
1
+ """Oscura configuration and schema validation system.
2
+
3
+ This package provides:
4
+ - JSON Schema-based configuration validation
5
+ - YAML/JSON configuration loading
6
+ - Protocol definition loading
7
+ - Threshold configuration management
8
+ - Pipeline configuration
9
+ - User preferences
10
+
11
+
12
+ Example:
13
+ >>> from oscura.config import load_config, validate_config
14
+ >>> config = load_config("pipeline.yaml")
15
+ >>> validate_config(config, schema="pipeline")
16
+ """
17
+
18
+ from oscura.config.defaults import (
19
+ DEFAULT_CONFIG,
20
+ get_effective_config,
21
+ inject_defaults,
22
+ )
23
+ from oscura.config.loader import (
24
+ get_config_value,
25
+ load_config,
26
+ load_config_file,
27
+ save_config,
28
+ )
29
+ from oscura.config.memory import (
30
+ MemoryConfiguration,
31
+ configure_from_environment,
32
+ enable_auto_degrade,
33
+ get_memory_config,
34
+ reset_to_defaults,
35
+ set_memory_limit,
36
+ set_memory_reserve,
37
+ set_memory_thresholds,
38
+ )
39
+ from oscura.config.migration import (
40
+ Migration,
41
+ MigrationFunction,
42
+ SchemaMigration,
43
+ get_config_version, # noqa: F401
44
+ get_migration_registry,
45
+ list_migrations,
46
+ migrate_config,
47
+ register_migration,
48
+ )
49
+ from oscura.config.pipeline import (
50
+ Pipeline,
51
+ PipelineDefinition,
52
+ PipelineExecutionError,
53
+ PipelineResult,
54
+ PipelineStep,
55
+ PipelineTemplate,
56
+ PipelineValidationError,
57
+ load_pipeline,
58
+ resolve_includes,
59
+ )
60
+ from oscura.config.preferences import (
61
+ DefaultsPreferences,
62
+ EditorPreferences,
63
+ ExportPreferences,
64
+ LoggingPreferences,
65
+ PreferencesManager,
66
+ UserPreferences,
67
+ VisualizationPreferences,
68
+ get_preferences,
69
+ get_preferences_manager,
70
+ save_preferences,
71
+ )
72
+ from oscura.config.protocol import (
73
+ ProtocolCapabilities,
74
+ ProtocolDefinition,
75
+ ProtocolRegistry,
76
+ ProtocolWatcher,
77
+ get_protocol_registry,
78
+ load_protocol,
79
+ resolve_inheritance,
80
+ )
81
+ from oscura.config.schema import (
82
+ ConfigSchema,
83
+ SchemaRegistry,
84
+ ValidationError,
85
+ get_schema_registry,
86
+ register_schema,
87
+ validate_against_schema,
88
+ )
89
+ from oscura.config.settings import (
90
+ AnalysisSettings,
91
+ CLIDefaults,
92
+ OutputSettings,
93
+ Settings,
94
+ get_settings,
95
+ load_settings,
96
+ reset_settings,
97
+ save_settings,
98
+ set_settings,
99
+ )
100
+ from oscura.config.thresholds import (
101
+ LogicFamily,
102
+ ThresholdProfile,
103
+ ThresholdRegistry,
104
+ get_threshold_registry,
105
+ get_user_logic_families_dir,
106
+ load_logic_family,
107
+ load_user_logic_families,
108
+ )
109
+
110
+ __all__ = [
111
+ "DEFAULT_CONFIG",
112
+ # Settings
113
+ "AnalysisSettings",
114
+ "CLIDefaults",
115
+ # Schema
116
+ "ConfigSchema",
117
+ # Preferences
118
+ "DefaultsPreferences",
119
+ "EditorPreferences",
120
+ "ExportPreferences",
121
+ "LoggingPreferences",
122
+ # Thresholds
123
+ "LogicFamily",
124
+ # Memory configuration
125
+ "MemoryConfiguration",
126
+ #
127
+ "Migration",
128
+ "MigrationFunction",
129
+ "OutputSettings",
130
+ # Pipeline
131
+ "Pipeline",
132
+ "PipelineDefinition",
133
+ "PipelineExecutionError",
134
+ "PipelineResult",
135
+ "PipelineStep",
136
+ "PipelineTemplate",
137
+ "PipelineValidationError",
138
+ "PreferencesManager",
139
+ # Protocol
140
+ "ProtocolCapabilities",
141
+ "ProtocolDefinition",
142
+ "ProtocolRegistry",
143
+ "ProtocolWatcher",
144
+ "SchemaMigration",
145
+ "SchemaRegistry",
146
+ "Settings",
147
+ "ThresholdProfile",
148
+ "ThresholdRegistry",
149
+ "UserPreferences",
150
+ "ValidationError",
151
+ "VisualizationPreferences",
152
+ "configure_from_environment",
153
+ "enable_auto_degrade",
154
+ "get_config_value",
155
+ "get_effective_config",
156
+ "get_memory_config",
157
+ "get_migration_registry",
158
+ "get_preferences",
159
+ "get_preferences_manager",
160
+ "get_protocol_registry",
161
+ "get_schema_registry",
162
+ "get_settings",
163
+ "get_threshold_registry",
164
+ "get_user_logic_families_dir",
165
+ # Defaults
166
+ "inject_defaults",
167
+ "list_migrations",
168
+ # Loading
169
+ "load_config",
170
+ "load_config_file",
171
+ "load_logic_family",
172
+ "load_pipeline",
173
+ "load_protocol",
174
+ "load_settings",
175
+ "load_user_logic_families",
176
+ "migrate_config",
177
+ "register_migration",
178
+ "register_schema",
179
+ "reset_settings",
180
+ "reset_to_defaults",
181
+ "resolve_includes",
182
+ "resolve_inheritance",
183
+ "save_config",
184
+ "save_preferences",
185
+ "save_settings",
186
+ "set_memory_limit",
187
+ "set_memory_reserve",
188
+ "set_memory_thresholds",
189
+ "set_settings",
190
+ "validate_against_schema",
191
+ ]