oscura 0.4.0__tar.gz → 0.5.0__tar.gz

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 (547) hide show
  1. {oscura-0.4.0 → oscura-0.5.0}/.gitignore +1 -0
  2. {oscura-0.4.0 → oscura-0.5.0}/CHANGELOG.md +159 -1
  3. {oscura-0.4.0 → oscura-0.5.0}/PKG-INFO +1 -1
  4. {oscura-0.4.0 → oscura-0.5.0}/pyproject.toml +1 -1
  5. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/__init__.py +1 -1
  6. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/digital/__init__.py +48 -0
  7. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/digital/extraction.py +195 -0
  8. oscura-0.5.0/src/oscura/analyzers/digital/ic_database.py +498 -0
  9. oscura-0.5.0/src/oscura/analyzers/digital/timing_paths.py +339 -0
  10. oscura-0.5.0/src/oscura/analyzers/digital/vintage.py +377 -0
  11. oscura-0.5.0/src/oscura/analyzers/digital/vintage_result.py +148 -0
  12. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/protocols/__init__.py +22 -1
  13. oscura-0.5.0/src/oscura/analyzers/protocols/parallel_bus.py +449 -0
  14. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/__init__.py +1 -1
  15. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/export/__init__.py +12 -0
  16. oscura-0.5.0/src/oscura/export/wavedrom.py +430 -0
  17. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exporters/json_export.py +47 -0
  18. oscura-0.5.0/src/oscura/exporters/vintage_logic_csv.py +247 -0
  19. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/__init__.py +7 -0
  20. oscura-0.5.0/src/oscura/reporting/vintage_logic_report.py +523 -0
  21. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/utils/autodetect.py +5 -1
  22. oscura-0.5.0/src/oscura/visualization/digital_advanced.py +718 -0
  23. oscura-0.5.0/src/oscura/visualization/figure_manager.py +156 -0
  24. {oscura-0.4.0 → oscura-0.5.0}/uv.lock +1 -1
  25. oscura-0.4.0/.vscode/extensions.json +0 -55
  26. oscura-0.4.0/.vscode/launch.json +0 -183
  27. oscura-0.4.0/.vscode/settings.json +0 -383
  28. oscura-0.4.0/cspell.json +0 -139
  29. oscura-0.4.0/src/oscura/automotive/dtc/data.json +0 -2763
  30. oscura-0.4.0/src/oscura/schemas/bus_configuration.json +0 -322
  31. oscura-0.4.0/src/oscura/schemas/device_mapping.json +0 -182
  32. oscura-0.4.0/src/oscura/schemas/packet_format.json +0 -418
  33. oscura-0.4.0/src/oscura/schemas/protocol_definition.json +0 -363
  34. {oscura-0.4.0 → oscura-0.5.0}/.claude/summaries/.gitkeep +0 -0
  35. {oscura-0.4.0 → oscura-0.5.0}/.cspell/.gitkeep +0 -0
  36. {oscura-0.4.0 → oscura-0.5.0}/.cspell/custom-dictionary.txt +0 -0
  37. {oscura-0.4.0 → oscura-0.5.0}/.editorconfig +0 -0
  38. {oscura-0.4.0 → oscura-0.5.0}/.env.example +0 -0
  39. {oscura-0.4.0 → oscura-0.5.0}/.gitattributes +0 -0
  40. {oscura-0.4.0 → oscura-0.5.0}/.gitleaks.toml +0 -0
  41. {oscura-0.4.0 → oscura-0.5.0}/.importlinter +0 -0
  42. {oscura-0.4.0 → oscura-0.5.0}/.lycheeignore +0 -0
  43. {oscura-0.4.0 → oscura-0.5.0}/.markdownlint.yaml +0 -0
  44. {oscura-0.4.0 → oscura-0.5.0}/.markdownlintignore +0 -0
  45. {oscura-0.4.0 → oscura-0.5.0}/.pre-commit-config.yaml +0 -0
  46. {oscura-0.4.0 → oscura-0.5.0}/.prettierignore +0 -0
  47. {oscura-0.4.0 → oscura-0.5.0}/.python-version +0 -0
  48. {oscura-0.4.0 → oscura-0.5.0}/.shellcheckrc +0 -0
  49. {oscura-0.4.0 → oscura-0.5.0}/.vscode/markdown.css +0 -0
  50. {oscura-0.4.0 → oscura-0.5.0}/.yamllint.yaml +0 -0
  51. {oscura-0.4.0 → oscura-0.5.0}/CITATION.cff +0 -0
  52. {oscura-0.4.0 → oscura-0.5.0}/CLAUDE.md +0 -0
  53. {oscura-0.4.0 → oscura-0.5.0}/CODE_OF_CONDUCT.md +0 -0
  54. {oscura-0.4.0 → oscura-0.5.0}/CONTRIBUTING.md +0 -0
  55. {oscura-0.4.0 → oscura-0.5.0}/LICENSE +0 -0
  56. {oscura-0.4.0 → oscura-0.5.0}/Makefile +0 -0
  57. {oscura-0.4.0 → oscura-0.5.0}/README.md +0 -0
  58. {oscura-0.4.0 → oscura-0.5.0}/SECURITY.md +0 -0
  59. {oscura-0.4.0 → oscura-0.5.0}/demos/01_waveform_analysis/demo_data/.gitkeep +0 -0
  60. {oscura-0.4.0 → oscura-0.5.0}/demos/01_waveform_analysis/generate_demo_data.py +0 -0
  61. {oscura-0.4.0 → oscura-0.5.0}/demos/03_custom_daq/demo_data/.gitkeep +0 -0
  62. {oscura-0.4.0 → oscura-0.5.0}/demos/03_custom_daq/generate_demo_data.py +0 -0
  63. {oscura-0.4.0 → oscura-0.5.0}/demos/04_serial_protocols/demo_data/.gitkeep +0 -0
  64. {oscura-0.4.0 → oscura-0.5.0}/demos/05_protocol_decoding/demo_data/.gitkeep +0 -0
  65. {oscura-0.4.0 → oscura-0.5.0}/demos/05_protocol_decoding/generate_demo_data.py +0 -0
  66. {oscura-0.4.0 → oscura-0.5.0}/demos/06_udp_packet_analysis/demo_data/.gitkeep +0 -0
  67. {oscura-0.4.0 → oscura-0.5.0}/demos/06_udp_packet_analysis/generate_demo_data.py +0 -0
  68. {oscura-0.4.0 → oscura-0.5.0}/demos/07_protocol_inference/demo_data/.gitkeep +0 -0
  69. {oscura-0.4.0 → oscura-0.5.0}/demos/09_automotive/demo_data/.gitkeep +0 -0
  70. {oscura-0.4.0 → oscura-0.5.0}/demos/09_automotive/generate_demo_data.py +0 -0
  71. {oscura-0.4.0 → oscura-0.5.0}/demos/11_mixed_signal/demo_data/.gitkeep +0 -0
  72. {oscura-0.4.0 → oscura-0.5.0}/demos/11_mixed_signal/generate_demo_data.py +0 -0
  73. {oscura-0.4.0 → oscura-0.5.0}/demos/12_spectral_compliance/demo_data/.gitkeep +0 -0
  74. {oscura-0.4.0 → oscura-0.5.0}/demos/12_spectral_compliance/generate_demo_data.py +0 -0
  75. {oscura-0.4.0 → oscura-0.5.0}/demos/13_jitter_analysis/generate_demo_data.py +0 -0
  76. {oscura-0.4.0 → oscura-0.5.0}/demos/16_emc_compliance/demo_data/.gitkeep +0 -0
  77. {oscura-0.4.0 → oscura-0.5.0}/demos/16_emc_compliance/generate_demo_data.py +0 -0
  78. {oscura-0.4.0 → oscura-0.5.0}/demos/17_signal_reverse_engineering/demo_data/.gitkeep +0 -0
  79. {oscura-0.4.0 → oscura-0.5.0}/demos/17_signal_reverse_engineering/generate_demo_data.py +0 -0
  80. {oscura-0.4.0 → oscura-0.5.0}/demos/generate_all_demo_data.py +0 -0
  81. {oscura-0.4.0 → oscura-0.5.0}/lychee.toml +0 -0
  82. {oscura-0.4.0 → oscura-0.5.0}/mkdocs.yml +0 -0
  83. {oscura-0.4.0 → oscura-0.5.0}/run_all_demos.py +0 -0
  84. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/__main__.py +0 -0
  85. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/acquisition/__init__.py +0 -0
  86. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/acquisition/file.py +0 -0
  87. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/acquisition/hardware.py +0 -0
  88. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/acquisition/saleae.py +0 -0
  89. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/acquisition/socketcan.py +0 -0
  90. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/acquisition/streaming.py +0 -0
  91. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/acquisition/synthetic.py +0 -0
  92. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/acquisition/visa.py +0 -0
  93. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/__init__.py +0 -0
  94. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/digital/bus.py +0 -0
  95. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/digital/clock.py +0 -0
  96. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/digital/correlation.py +0 -0
  97. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/digital/edges.py +0 -0
  98. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/digital/quality.py +0 -0
  99. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/digital/signal_quality.py +0 -0
  100. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/digital/thresholds.py +0 -0
  101. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/digital/timing.py +0 -0
  102. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/eye/__init__.py +0 -0
  103. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/eye/diagram.py +0 -0
  104. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/eye/metrics.py +0 -0
  105. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/jitter/__init__.py +0 -0
  106. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/jitter/ber.py +0 -0
  107. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/jitter/decomposition.py +0 -0
  108. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/jitter/measurements.py +0 -0
  109. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/jitter/spectrum.py +0 -0
  110. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/measurements.py +0 -0
  111. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/packet/__init__.py +0 -0
  112. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/packet/daq.py +0 -0
  113. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/packet/metrics.py +0 -0
  114. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/packet/parser.py +0 -0
  115. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/packet/payload.py +0 -0
  116. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/packet/payload_analysis.py +0 -0
  117. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/packet/payload_extraction.py +0 -0
  118. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/packet/payload_patterns.py +0 -0
  119. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/packet/stream.py +0 -0
  120. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/patterns/__init__.py +0 -0
  121. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/patterns/clustering.py +0 -0
  122. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/patterns/discovery.py +0 -0
  123. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/patterns/learning.py +0 -0
  124. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/patterns/matching.py +0 -0
  125. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/patterns/periodic.py +0 -0
  126. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/patterns/sequences.py +0 -0
  127. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/power/__init__.py +0 -0
  128. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/power/ac_power.py +0 -0
  129. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/power/basic.py +0 -0
  130. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/power/conduction.py +0 -0
  131. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/power/efficiency.py +0 -0
  132. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/power/ripple.py +0 -0
  133. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/power/soa.py +0 -0
  134. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/power/switching.py +0 -0
  135. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/protocol/__init__.py +0 -0
  136. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/protocols/base.py +0 -0
  137. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/protocols/can.py +0 -0
  138. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/protocols/can_fd.py +0 -0
  139. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/protocols/flexray.py +0 -0
  140. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/protocols/hdlc.py +0 -0
  141. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/protocols/i2c.py +0 -0
  142. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/protocols/i2s.py +0 -0
  143. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/protocols/jtag.py +0 -0
  144. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/protocols/lin.py +0 -0
  145. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/protocols/manchester.py +0 -0
  146. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/protocols/onewire.py +0 -0
  147. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/protocols/spi.py +0 -0
  148. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/protocols/swd.py +0 -0
  149. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/protocols/uart.py +0 -0
  150. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/protocols/usb.py +0 -0
  151. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/side_channel/__init__.py +0 -0
  152. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/side_channel/power.py +0 -0
  153. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/side_channel/timing.py +0 -0
  154. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/signal_integrity/__init__.py +0 -0
  155. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/signal_integrity/embedding.py +0 -0
  156. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/signal_integrity/equalization.py +0 -0
  157. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/signal_integrity/sparams.py +0 -0
  158. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/spectral/__init__.py +0 -0
  159. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/spectral/chunked.py +0 -0
  160. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/spectral/chunked_fft.py +0 -0
  161. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/spectral/chunked_wavelet.py +0 -0
  162. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/spectral/fft.py +0 -0
  163. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/statistical/__init__.py +0 -0
  164. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/statistical/checksum.py +0 -0
  165. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/statistical/chunked_corr.py +0 -0
  166. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/statistical/classification.py +0 -0
  167. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/statistical/entropy.py +0 -0
  168. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/statistical/ngrams.py +0 -0
  169. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/statistics/__init__.py +0 -0
  170. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/statistics/advanced.py +0 -0
  171. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/statistics/basic.py +0 -0
  172. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/statistics/correlation.py +0 -0
  173. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/statistics/distribution.py +0 -0
  174. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/statistics/outliers.py +0 -0
  175. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/statistics/streaming.py +0 -0
  176. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/statistics/trend.py +0 -0
  177. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/validation.py +0 -0
  178. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/waveform/__init__.py +0 -0
  179. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/waveform/measurements.py +0 -0
  180. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/waveform/measurements_with_uncertainty.py +0 -0
  181. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/waveform/spectral.py +0 -0
  182. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/waveform/wavelets.py +0 -0
  183. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/api/__init__.py +0 -0
  184. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/api/dsl.py +0 -0
  185. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/api/fluent.py +0 -0
  186. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/api/operators.py +0 -0
  187. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/api/optimization.py +0 -0
  188. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/api/profiling.py +0 -0
  189. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/can/__init__.py +0 -0
  190. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/can/analysis.py +0 -0
  191. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/can/checksum.py +0 -0
  192. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/can/correlation.py +0 -0
  193. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/can/discovery.py +0 -0
  194. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/can/message_wrapper.py +0 -0
  195. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/can/models.py +0 -0
  196. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/can/patterns.py +0 -0
  197. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/can/session.py +0 -0
  198. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/can/state_machine.py +0 -0
  199. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/can/stimulus_response.py +0 -0
  200. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/dbc/__init__.py +0 -0
  201. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/dbc/generator.py +0 -0
  202. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/dbc/parser.py +0 -0
  203. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/dtc/__init__.py +0 -0
  204. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/dtc/database.py +0 -0
  205. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/j1939/__init__.py +0 -0
  206. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/j1939/decoder.py +0 -0
  207. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/loaders/__init__.py +0 -0
  208. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/loaders/asc.py +0 -0
  209. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/loaders/blf.py +0 -0
  210. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/loaders/csv_can.py +0 -0
  211. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/loaders/dispatcher.py +0 -0
  212. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/loaders/mdf.py +0 -0
  213. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/loaders/pcap.py +0 -0
  214. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/obd/__init__.py +0 -0
  215. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/obd/decoder.py +0 -0
  216. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/uds/__init__.py +0 -0
  217. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/uds/decoder.py +0 -0
  218. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/uds/models.py +0 -0
  219. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/visualization.py +0 -0
  220. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/batch/__init__.py +0 -0
  221. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/batch/advanced.py +0 -0
  222. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/batch/aggregate.py +0 -0
  223. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/batch/analyze.py +0 -0
  224. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/batch/logging.py +0 -0
  225. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/batch/metrics.py +0 -0
  226. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/builders/__init__.py +0 -0
  227. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/builders/signal_builder.py +0 -0
  228. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/cli/__init__.py +0 -0
  229. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/cli/batch.py +0 -0
  230. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/cli/characterize.py +0 -0
  231. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/cli/compare.py +0 -0
  232. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/cli/decode.py +0 -0
  233. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/cli/main.py +0 -0
  234. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/cli/shell.py +0 -0
  235. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/comparison/__init__.py +0 -0
  236. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/comparison/compare.py +0 -0
  237. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/comparison/golden.py +0 -0
  238. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/comparison/limits.py +0 -0
  239. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/comparison/mask.py +0 -0
  240. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/comparison/trace_diff.py +0 -0
  241. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/comparison/visualization.py +0 -0
  242. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/compliance/__init__.py +0 -0
  243. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/compliance/advanced.py +0 -0
  244. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/compliance/masks.py +0 -0
  245. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/compliance/reporting.py +0 -0
  246. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/compliance/testing.py +0 -0
  247. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/component/__init__.py +0 -0
  248. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/component/impedance.py +0 -0
  249. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/component/reactive.py +0 -0
  250. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/component/transmission_line.py +0 -0
  251. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/config/__init__.py +0 -0
  252. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/config/defaults.py +0 -0
  253. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/config/loader.py +0 -0
  254. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/config/memory.py +0 -0
  255. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/config/migration.py +0 -0
  256. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/config/pipeline.py +0 -0
  257. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/config/preferences.py +0 -0
  258. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/config/protocol.py +0 -0
  259. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/config/schema.py +0 -0
  260. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/config/settings.py +0 -0
  261. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/config/thresholds.py +0 -0
  262. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/convenience.py +0 -0
  263. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/__init__.py +0 -0
  264. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/audit.py +0 -0
  265. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/backend_selector.py +0 -0
  266. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/cache.py +0 -0
  267. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/cancellation.py +0 -0
  268. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/confidence.py +0 -0
  269. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/config.py +0 -0
  270. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/correlation.py +0 -0
  271. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/cross_domain.py +0 -0
  272. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/debug.py +0 -0
  273. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/edge_cases.py +0 -0
  274. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/exceptions.py +0 -0
  275. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/gpu_backend.py +0 -0
  276. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/lazy.py +0 -0
  277. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/log_query.py +0 -0
  278. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/logging.py +0 -0
  279. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/logging_advanced.py +0 -0
  280. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/memoize.py +0 -0
  281. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/memory_check.py +0 -0
  282. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/memory_guard.py +0 -0
  283. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/memory_limits.py +0 -0
  284. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/memory_monitor.py +0 -0
  285. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/memory_progress.py +0 -0
  286. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/memory_warnings.py +0 -0
  287. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/numba_backend.py +0 -0
  288. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/performance.py +0 -0
  289. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/progress.py +0 -0
  290. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/provenance.py +0 -0
  291. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/results.py +0 -0
  292. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/types.py +0 -0
  293. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/uncertainty.py +0 -0
  294. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/discovery/__init__.py +0 -0
  295. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/discovery/anomaly_detector.py +0 -0
  296. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/discovery/auto_decoder.py +0 -0
  297. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/discovery/comparison.py +0 -0
  298. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/discovery/quality_validator.py +0 -0
  299. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/discovery/signal_detector.py +0 -0
  300. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/dsl/__init__.py +0 -0
  301. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/dsl/commands.py +0 -0
  302. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/dsl/interpreter.py +0 -0
  303. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/dsl/parser.py +0 -0
  304. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/dsl/repl.py +0 -0
  305. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exceptions.py +0 -0
  306. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exploratory/__init__.py +0 -0
  307. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exploratory/error_recovery.py +0 -0
  308. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exploratory/fuzzy.py +0 -0
  309. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exploratory/fuzzy_advanced.py +0 -0
  310. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exploratory/legacy.py +0 -0
  311. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exploratory/parse.py +0 -0
  312. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exploratory/recovery.py +0 -0
  313. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exploratory/sync.py +0 -0
  314. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exploratory/unknown.py +0 -0
  315. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/export/wireshark/README.md +0 -0
  316. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/export/wireshark/__init__.py +0 -0
  317. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/export/wireshark/generator.py +0 -0
  318. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/export/wireshark/lua_builder.py +0 -0
  319. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/export/wireshark/templates/dissector.lua.j2 +0 -0
  320. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/export/wireshark/type_mapping.py +0 -0
  321. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/export/wireshark/validator.py +0 -0
  322. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exporters/__init__.py +0 -0
  323. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exporters/csv.py +0 -0
  324. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exporters/exporters.py +0 -0
  325. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exporters/hdf5.py +0 -0
  326. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exporters/html_export.py +0 -0
  327. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exporters/markdown_export.py +0 -0
  328. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exporters/matlab_export.py +0 -0
  329. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exporters/npz_export.py +0 -0
  330. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exporters/spice_export.py +0 -0
  331. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/extensibility/__init__.py +0 -0
  332. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/extensibility/docs.py +0 -0
  333. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/extensibility/extensions.py +0 -0
  334. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/extensibility/logging.py +0 -0
  335. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/extensibility/measurements.py +0 -0
  336. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/extensibility/plugins.py +0 -0
  337. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/extensibility/registry.py +0 -0
  338. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/extensibility/templates.py +0 -0
  339. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/extensibility/validation.py +0 -0
  340. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/filtering/__init__.py +0 -0
  341. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/filtering/base.py +0 -0
  342. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/filtering/convenience.py +0 -0
  343. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/filtering/design.py +0 -0
  344. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/filtering/filters.py +0 -0
  345. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/filtering/introspection.py +0 -0
  346. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/guidance/__init__.py +0 -0
  347. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/guidance/recommender.py +0 -0
  348. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/guidance/wizard.py +0 -0
  349. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/__init__.py +0 -0
  350. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/active_learning/README.md +0 -0
  351. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/active_learning/__init__.py +0 -0
  352. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/active_learning/lstar.py +0 -0
  353. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/active_learning/observation_table.py +0 -0
  354. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/active_learning/oracle.py +0 -0
  355. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/active_learning/teachers/__init__.py +0 -0
  356. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/active_learning/teachers/simulator.py +0 -0
  357. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/adaptive_tuning.py +0 -0
  358. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/alignment.py +0 -0
  359. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/bayesian.py +0 -0
  360. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/binary.py +0 -0
  361. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/crc_reverse.py +0 -0
  362. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/logic.py +0 -0
  363. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/message_format.py +0 -0
  364. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/protocol.py +0 -0
  365. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/protocol_dsl.py +0 -0
  366. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/protocol_library.py +0 -0
  367. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/sequences.py +0 -0
  368. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/signal_intelligence.py +0 -0
  369. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/spectral.py +0 -0
  370. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/state_machine.py +0 -0
  371. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/stream.py +0 -0
  372. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/integrations/__init__.py +0 -0
  373. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/integrations/llm.py +0 -0
  374. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/jupyter/__init__.py +0 -0
  375. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/jupyter/display.py +0 -0
  376. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/jupyter/magic.py +0 -0
  377. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/__init__.py +0 -0
  378. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/binary.py +0 -0
  379. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/chipwhisperer.py +0 -0
  380. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/configurable.py +0 -0
  381. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/csv.py +0 -0
  382. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/csv_loader.py +0 -0
  383. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/hdf5.py +0 -0
  384. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/hdf5_loader.py +0 -0
  385. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/lazy.py +0 -0
  386. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/mmap_loader.py +0 -0
  387. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/numpy_loader.py +0 -0
  388. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/pcap.py +0 -0
  389. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/preprocessing.py +0 -0
  390. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/rigol.py +0 -0
  391. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/sigrok.py +0 -0
  392. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/tdms.py +0 -0
  393. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/tektronix.py +0 -0
  394. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/touchstone.py +0 -0
  395. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/validation.py +0 -0
  396. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/vcd.py +0 -0
  397. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/wav.py +0 -0
  398. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/math/__init__.py +0 -0
  399. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/math/arithmetic.py +0 -0
  400. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/math/interpolation.py +0 -0
  401. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/onboarding/__init__.py +0 -0
  402. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/onboarding/help.py +0 -0
  403. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/onboarding/tutorials.py +0 -0
  404. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/onboarding/wizard.py +0 -0
  405. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/optimization/__init__.py +0 -0
  406. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/optimization/parallel.py +0 -0
  407. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/optimization/search.py +0 -0
  408. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/pipeline/__init__.py +0 -0
  409. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/pipeline/base.py +0 -0
  410. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/pipeline/composition.py +0 -0
  411. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/pipeline/parallel.py +0 -0
  412. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/pipeline/pipeline.py +0 -0
  413. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/pipeline/reverse_engineering.py +0 -0
  414. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/plugins/__init__.py +0 -0
  415. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/plugins/base.py +0 -0
  416. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/plugins/cli.py +0 -0
  417. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/plugins/discovery.py +0 -0
  418. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/plugins/isolation.py +0 -0
  419. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/plugins/lifecycle.py +0 -0
  420. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/plugins/manager.py +0 -0
  421. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/plugins/registry.py +0 -0
  422. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/plugins/versioning.py +0 -0
  423. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/py.typed +0 -0
  424. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/quality/__init__.py +0 -0
  425. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/quality/ensemble.py +0 -0
  426. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/quality/explainer.py +0 -0
  427. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/quality/scoring.py +0 -0
  428. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/quality/warnings.py +0 -0
  429. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/advanced.py +0 -0
  430. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/analyze.py +0 -0
  431. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/argument_preparer.py +0 -0
  432. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/auto_report.py +0 -0
  433. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/batch.py +0 -0
  434. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/chart_selection.py +0 -0
  435. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/comparison.py +0 -0
  436. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/config.py +0 -0
  437. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/content/__init__.py +0 -0
  438. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/content/executive.py +0 -0
  439. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/content/filtering.py +0 -0
  440. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/content/minimal.py +0 -0
  441. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/content/verbosity.py +0 -0
  442. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/core.py +0 -0
  443. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/core_formats/__init__.py +0 -0
  444. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/core_formats/multi_format.py +0 -0
  445. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/engine.py +0 -0
  446. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/export.py +0 -0
  447. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/formatting/__init__.py +0 -0
  448. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/formatting/emphasis.py +0 -0
  449. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/formatting/numbers.py +0 -0
  450. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/formatting/standards.py +0 -0
  451. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/formatting.py +0 -0
  452. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/html.py +0 -0
  453. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/index.py +0 -0
  454. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/multichannel.py +0 -0
  455. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/output.py +0 -0
  456. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/pdf.py +0 -0
  457. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/plots.py +0 -0
  458. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/pptx_export.py +0 -0
  459. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/renderers/__init__.py +0 -0
  460. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/renderers/pdf.py +0 -0
  461. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/sections.py +0 -0
  462. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/standards.py +0 -0
  463. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/summary_generator.py +0 -0
  464. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/tables.py +0 -0
  465. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/template_system.py +0 -0
  466. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/templates/__init__.py +0 -0
  467. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/templates/definition.py +0 -0
  468. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/templates/index.html +0 -0
  469. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/templates/index.md +0 -0
  470. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/schemas/__init__.py +0 -0
  471. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/search/__init__.py +0 -0
  472. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/search/anomaly.py +0 -0
  473. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/search/context.py +0 -0
  474. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/search/pattern.py +0 -0
  475. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/session/__init__.py +0 -0
  476. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/session/annotations.py +0 -0
  477. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/session/history.py +0 -0
  478. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/session/session.py +0 -0
  479. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/sessions/__init__.py +0 -0
  480. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/sessions/base.py +0 -0
  481. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/sessions/blackbox.py +0 -0
  482. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/sessions/generic.py +0 -0
  483. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/streaming/__init__.py +0 -0
  484. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/streaming/chunked.py +0 -0
  485. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/streaming/progressive.py +0 -0
  486. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/streaming/realtime.py +0 -0
  487. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/testing/__init__.py +0 -0
  488. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/testing/synthetic.py +0 -0
  489. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/triggering/__init__.py +0 -0
  490. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/triggering/base.py +0 -0
  491. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/triggering/edge.py +0 -0
  492. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/triggering/pattern.py +0 -0
  493. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/triggering/pulse.py +0 -0
  494. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/triggering/window.py +0 -0
  495. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/ui/__init__.py +0 -0
  496. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/ui/formatters.py +0 -0
  497. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/ui/progressive_display.py +0 -0
  498. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/utils/__init__.py +0 -0
  499. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/utils/buffer.py +0 -0
  500. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/utils/lazy.py +0 -0
  501. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/utils/lazy_imports.py +0 -0
  502. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/utils/memory.py +0 -0
  503. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/utils/memory_advanced.py +0 -0
  504. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/utils/memory_extensions.py +0 -0
  505. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/utils/progressive.py +0 -0
  506. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/utils/windowing.py +0 -0
  507. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/__init__.py +0 -0
  508. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/accessibility.py +0 -0
  509. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/annotations.py +0 -0
  510. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/axis_scaling.py +0 -0
  511. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/colors.py +0 -0
  512. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/digital.py +0 -0
  513. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/eye.py +0 -0
  514. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/histogram.py +0 -0
  515. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/interactive.py +0 -0
  516. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/jitter.py +0 -0
  517. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/keyboard.py +0 -0
  518. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/layout.py +0 -0
  519. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/optimization.py +0 -0
  520. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/palettes.py +0 -0
  521. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/plot.py +0 -0
  522. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/power.py +0 -0
  523. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/power_extended.py +0 -0
  524. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/presets.py +0 -0
  525. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/protocols.py +0 -0
  526. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/render.py +0 -0
  527. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/rendering.py +0 -0
  528. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/reverse_engineering.py +0 -0
  529. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/signal_integrity.py +0 -0
  530. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/specialized.py +0 -0
  531. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/spectral.py +0 -0
  532. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/styles.py +0 -0
  533. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/thumbnails.py +0 -0
  534. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/time_axis.py +0 -0
  535. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/waveform.py +0 -0
  536. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/workflow/__init__.py +0 -0
  537. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/workflow/dag.py +0 -0
  538. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/workflows/__init__.py +0 -0
  539. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/workflows/compliance.py +0 -0
  540. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/workflows/digital.py +0 -0
  541. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/workflows/multi_trace.py +0 -0
  542. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/workflows/power.py +0 -0
  543. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/workflows/protocol.py +0 -0
  544. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/workflows/reverse_engineering.py +0 -0
  545. {oscura-0.4.0 → oscura-0.5.0}/src/oscura/workflows/signal_integrity.py +0 -0
  546. {oscura-0.4.0 → oscura-0.5.0}/test_data/README.md +0 -0
  547. {oscura-0.4.0 → oscura-0.5.0}/validate_all_demos.py +0 -0
@@ -292,3 +292,4 @@ validation_results/
292
292
 
293
293
  # Exceptions: legitimate documentation with these keywords in name
294
294
  # (none currently - add here if needed)
295
+ *.json
@@ -7,6 +7,164 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.5.0] - 2026-01-22
11
+
12
+ ### Added
13
+
14
+ - **Vintage Logic Family Support** (`src/oscura/analyzers/digital/extraction.py`):
15
+ - **ECL** (Emitter-Coupled Logic): ECL 10K and ECL 100K series support with differential signaling
16
+ - **RTL** (Resistor-Transistor Logic): 1960s-era logic family (3.6V supply)
17
+ - **DTL** (Diode-Transistor Logic): Pre-TTL logic family
18
+ - **PMOS/NMOS**: Negative and positive MOS logic (-12V and +12V rails)
19
+ - Auto-detection of logic family from voltage levels (`detect_logic_family()`)
20
+ - Open-collector/open-drain detection (`detect_open_collector()`)
21
+ - Test coverage: Comprehensive tests for all vintage families
22
+
23
+ - **IC Timing Database** (`src/oscura/analyzers/digital/ic_database.py`):
24
+ - Comprehensive database of 14+ common ICs (74xx series, 4000 series)
25
+ - Standard TTL: 7400, 7474 with typical 1970s timing
26
+ - LS-TTL: 74LS00, 74LS74, 74LS138, 74LS244, 74LS245, 74LS273, 74LS374
27
+ - HC-CMOS: 74HC00, 74HC74, 74HC595 with modern fast timing
28
+ - 4000 series CMOS: 4011, 4013 with wide voltage range support
29
+ - IC identification from measured timings (`identify_ic()`)
30
+ - Timing validation against specifications (`validate_ic_timing()`)
31
+ - Automatic spec compliance checking
32
+
33
+ - **Parallel Bus Protocol Decoders** (`src/oscura/analyzers/protocols/parallel_bus.py`):
34
+ - **IEEE-488 (GPIB)**: Complete GPIB protocol decoder for instrument control
35
+ - Talk/listen address decoding
36
+ - Universal and addressed command recognition
37
+ - EOI (End-Or-Identify) support
38
+ - Data and control byte interpretation
39
+ - **Centronics**: Parallel printer interface decoder
40
+ - ASCII character extraction
41
+ - Control signal monitoring (STROBE, BUSY, ACK)
42
+ - Printable character detection
43
+ - **ISA Bus**: Industry Standard Architecture bus analyzer
44
+ - Memory read/write transaction decoding
45
+ - I/O read/write transaction decoding
46
+ - 20-bit address support
47
+ - DMA and interrupt detection
48
+
49
+ - **WaveDrom Timing Diagram Export** (`src/oscura/export/wavedrom.py`):
50
+ - WaveDrom JSON format generation
51
+ - Clock signal generation with configurable period/duty cycle
52
+ - Digital signal edge-based waveform generation
53
+ - Data bus visualization with hex value labels
54
+ - Timing annotation arrows with labels
55
+ - Direct export from DigitalTrace objects
56
+ - Compatible with wavedrom-cli and online renderers
57
+
58
+ - **State-of-the-Art Digital Logic Visualizations** (`src/oscura/visualization/digital_advanced.py`):
59
+ - **Logic Analyzer View**: Professional multi-channel timeline display
60
+ - Bus grouping with hex value overlays
61
+ - Automatic time axis formatting (ns/μs/ms/s)
62
+ - Timing cursors with delta-time measurements
63
+ - Stacked waveform display
64
+ - **Timing Diagram with Annotations**: Publication-quality timing diagrams
65
+ - Setup/hold time visualization
66
+ - Propagation delay arrows
67
+ - Custom timing parameter annotations
68
+ - **IC Timing Validation Overlay**: Visual spec compliance checking
69
+ - Real-time pass/fail indicators
70
+ - Measured vs. specification comparison
71
+ - Error percentage display
72
+ - **Multi-IC Timing Path Visualization**: Cascaded IC timing analysis
73
+ - End-to-end delay visualization
74
+ - Per-stage timing breakdown
75
+ - Critical path highlighting
76
+ - **Bus Eye Diagram**: Signal quality analysis for multi-bit buses
77
+ - Per-bit eye diagram overlays
78
+ - Symbol period alignment
79
+ - Quality assessment
80
+
81
+ - **Multi-IC Timing Path Analysis** (`src/oscura/analyzers/digital/timing_paths.py`):
82
+ - Cascaded IC propagation delay analysis
83
+ - Critical path identification
84
+ - Timing budget calculation and allocation
85
+ - Setup/hold time analysis for synchronous paths
86
+ - Path slack calculation
87
+ - Automatic spec violation detection
88
+ - Support for clock and data path correlation
89
+
90
+ - **Vintage Logic Analysis High-Level API** (`src/oscura/analyzers/digital/vintage.py`):
91
+ - Unified `analyze_vintage_logic()` function for complete system analysis
92
+ - Orchestrates logic family detection, IC identification, timing analysis, and protocol decoding
93
+ - Returns consolidated `VintageLogicAnalysisResult` object
94
+ - Modern IC replacement recommendations (74LSxx → 74HCTxx)
95
+ - Automatic BOM generation with supporting components
96
+ - Open-collector detection and pull-up recommendations
97
+ - Comprehensive warning system
98
+
99
+ - **Vintage Logic Analysis Result Structures** (`src/oscura/analyzers/digital/vintage_result.py`):
100
+ - `VintageLogicAnalysisResult`: Complete analysis aggregation
101
+ - `ICIdentificationResult`: IC identification with validation
102
+ - `ModernReplacementIC`: Replacement recommendations
103
+ - `BOMEntry`: Bill of materials entries
104
+ - Structured data for reporting and export
105
+
106
+ - **Comprehensive Vintage Logic Reporting** (`src/oscura/reporting/vintage_logic_report.py`):
107
+ - Professional HTML reports with embedded plots
108
+ - Markdown summary generation
109
+ - PDF export guidance (HTML→PDF workflow)
110
+ - Interactive visualizations with base64-embedded images
111
+ - Automated table generation (IC specs, timing, BOM)
112
+ - Warning and confidence score display
113
+ - `generate_vintage_logic_report()` unified API
114
+
115
+ - **Figure Management System** (`src/oscura/visualization/figure_manager.py`):
116
+ - Multi-format figure saving (PNG, SVG, PDF)
117
+ - Base64 encoding for HTML embedding
118
+ - Figure registry and path management
119
+ - Configurable DPI and save options
120
+ - Automatic directory creation
121
+
122
+ - **Vintage Logic CSV Exporters** (`src/oscura/exporters/vintage_logic_csv.py`):
123
+ - Timing measurements export with parameter classification
124
+ - IC identification results export with validation status
125
+ - Bill of materials export (procurement-ready format)
126
+ - Voltage levels export
127
+ - `export_all_vintage_logic_csv()` batch export
128
+
129
+ - **Enhanced JSON Export** (`src/oscura/exporters/json_export.py`):
130
+ - `export_vintage_logic_json()` convenience function
131
+ - Automatic dataclass serialization for vintage logic results
132
+ - Complete analysis export with metadata
133
+
134
+ - **All-in-One Visualization Suite** (`src/oscura/visualization/digital_advanced.py`):
135
+ - `generate_all_vintage_logic_plots()`: Generate all relevant plots
136
+ - Automatic plot selection based on analysis results
137
+ - Multi-format save support
138
+ - Integration with FigureManager
139
+
140
+ ### Enhanced
141
+
142
+ - **LOGIC_FAMILIES Dictionary**: Expanded from 7 to 14 logic families
143
+ - **Digital Analysis Module** (`src/oscura/analyzers/digital/__init__.py`):
144
+ - Now exports vintage logic high-level API: `analyze_vintage_logic()`
145
+ - Exports vintage logic result structures: `VintageLogicAnalysisResult`, `ICIdentificationResult`, `ModernReplacementIC`, `BOMEntry`
146
+ - Exports IC replacement database: `REPLACEMENT_DATABASE`
147
+ - **Protocol Decoders**: Added parallel bus protocols alongside existing serial protocols
148
+ - **Export Module**: WaveDrom timing diagram generation added
149
+ - **Visualization Module** (`src/oscura/visualization/digital_advanced.py`):
150
+ - Added `generate_all_vintage_logic_plots()` for automated visualization suite generation
151
+ - Enhanced existing plot functions with vintage logic support
152
+ - **Reporting Module** (`src/oscura/reporting/__init__.py`):
153
+ - Now exports `generate_vintage_logic_report()` and `VintageLogicReport`
154
+ - Unified API for report generation and multi-format export
155
+ - **Examples** (`examples/vintage_logic_reverse_engineering.py`):
156
+ - Updated to demonstrate new high-level API and reporting features
157
+ - Shows complete workflow: analysis → visualization → reporting → export
158
+
159
+ ### Infrastructure
160
+
161
+ - **Test Coverage**: Comprehensive tests for all new features
162
+ - IC database validation (14 test cases)
163
+ - Logic family detection (8 test cases)
164
+ - Open-collector detection (7 test cases)
165
+ - Parallel bus protocols (15+ test cases)
166
+ - All features verified with standalone tests
167
+
10
168
  ## [0.4.0] - 2026-01-22
11
169
 
12
170
  ### BREAKING CHANGES
@@ -995,7 +1153,7 @@ trace = builder.build() # Returns WaveformTrace directly
995
1153
 
996
1154
  ### Initial Public Release
997
1155
 
998
- Oscura 0.4.0 is the first public release of the comprehensive hardware reverse engineering framework for security researchers, right-to-repair advocates, defense analysts, and commercial intelligence teams.
1156
+ Oscura 0.5.0 is the first public release of the comprehensive hardware reverse engineering framework for security researchers, right-to-repair advocates, defense analysts, and commercial intelligence teams.
999
1157
 
1000
1158
  ### Core Features
1001
1159
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: oscura
3
- Version: 0.4.0
3
+ Version: 0.5.0
4
4
  Summary: Unified hardware reverse engineering framework. Extract all information from any system through signals and data. Unknown protocol discovery, state machine extraction, CRC recovery, security analysis. 16+ protocols, IEEE-compliant measurements.
5
5
  Project-URL: Homepage, https://github.com/oscura-re/oscura
6
6
  Project-URL: Documentation, https://github.com/oscura-re/oscura/tree/main/docs
@@ -6,7 +6,7 @@
6
6
 
7
7
  [project]
8
8
  name = "oscura"
9
- version = "0.4.0"
9
+ version = "0.5.0"
10
10
  description = "Unified hardware reverse engineering framework. Extract all information from any system through signals and data. Unknown protocol discovery, state machine extraction, CRC recovery, security analysis. 16+ protocols, IEEE-compliant measurements."
11
11
  readme = "README.md"
12
12
  requires-python = ">=3.12"
@@ -46,7 +46,7 @@ Example:
46
46
  For more information, see https://github.com/oscura-re/oscura
47
47
  """
48
48
 
49
- __version__ = "0.4.0"
49
+ __version__ = "0.5.0"
50
50
  __author__ = "Oscura Contributors"
51
51
 
52
52
  # Core types
@@ -52,9 +52,17 @@ from oscura.analyzers.digital.edges import (
52
52
  from oscura.analyzers.digital.extraction import (
53
53
  LOGIC_FAMILIES,
54
54
  detect_edges,
55
+ detect_logic_family,
56
+ detect_open_collector,
55
57
  get_logic_threshold,
56
58
  to_digital,
57
59
  )
60
+ from oscura.analyzers.digital.ic_database import (
61
+ IC_DATABASE,
62
+ ICTiming,
63
+ identify_ic,
64
+ validate_ic_timing,
65
+ )
58
66
  from oscura.analyzers.digital.quality import (
59
67
  Glitch,
60
68
  NoiseMarginResult,
@@ -97,13 +105,37 @@ from oscura.analyzers.digital.timing import (
97
105
  skew,
98
106
  slew_rate,
99
107
  )
108
+ from oscura.analyzers.digital.timing_paths import (
109
+ ICStage,
110
+ SetupHoldAnalysis,
111
+ TimingPathResult,
112
+ analyze_setup_hold,
113
+ analyze_timing_path,
114
+ calculate_timing_budget,
115
+ find_critical_paths,
116
+ )
117
+ from oscura.analyzers.digital.vintage import (
118
+ REPLACEMENT_DATABASE,
119
+ analyze_vintage_logic,
120
+ )
121
+ from oscura.analyzers.digital.vintage_result import (
122
+ BOMEntry,
123
+ ICIdentificationResult,
124
+ ModernReplacementIC,
125
+ VintageLogicAnalysisResult,
126
+ )
100
127
 
101
128
  __all__ = [
129
+ # IC Database
130
+ "IC_DATABASE",
102
131
  # Extraction
103
132
  "LOGIC_FAMILIES",
133
+ "REPLACEMENT_DATABASE",
104
134
  "AdaptiveThresholdResult",
105
135
  # Adaptive Thresholds (RE-THR-001)
106
136
  "AdaptiveThresholder",
137
+ # Vintage Logic Analysis
138
+ "BOMEntry",
107
139
  # Clock Recovery (DSP-002)
108
140
  "BaudRateResult",
109
141
  # Bus Decoding (DSP-003)
@@ -125,6 +157,10 @@ __all__ = [
125
157
  "EdgeTimingViolation",
126
158
  # Quality
127
159
  "Glitch",
160
+ "ICIdentificationResult",
161
+ "ICStage",
162
+ "ICTiming",
163
+ "ModernReplacementIC",
128
164
  # Multi-Level Logic (RE-THR-002)
129
165
  "MultiLevelDetector",
130
166
  "MultiLevelResult",
@@ -132,18 +168,25 @@ __all__ = [
132
168
  # Signal Quality (DSP-005)
133
169
  "NoiseMargins",
134
170
  "ParallelBusConfig",
171
+ "SetupHoldAnalysis",
135
172
  "SignalIntegrityReport",
136
173
  "SignalQualityAnalyzer",
137
174
  "SimpleQualityMetrics",
138
175
  "ThresholdConfig",
139
176
  "TimingConstraint",
177
+ "TimingPathResult",
140
178
  "TimingViolation",
141
179
  "TransitionMetrics",
180
+ "VintageLogicAnalysisResult",
142
181
  "Violation",
143
182
  "align_by_trigger",
183
+ "analyze_setup_hold",
144
184
  "analyze_signal_integrity",
185
+ "analyze_timing_path",
186
+ "analyze_vintage_logic",
145
187
  "apply_adaptive_threshold",
146
188
  "calculate_threshold_snr",
189
+ "calculate_timing_budget",
147
190
  "check_timing_constraints",
148
191
  "classify_edge_quality",
149
192
  "correlate_channels",
@@ -153,10 +196,14 @@ __all__ = [
153
196
  "detect_edges",
154
197
  "detect_edges_advanced",
155
198
  "detect_glitches",
199
+ "detect_logic_family",
156
200
  "detect_multi_level",
201
+ "detect_open_collector",
157
202
  "detect_violations",
203
+ "find_critical_paths",
158
204
  "get_logic_threshold",
159
205
  "hold_time",
206
+ "identify_ic",
160
207
  "interpolate_edge_time",
161
208
  "measure_clock_jitter",
162
209
  "measure_edge_timing",
@@ -174,4 +221,5 @@ __all__ = [
174
221
  "skew",
175
222
  "slew_rate",
176
223
  "to_digital",
224
+ "validate_ic_timing",
177
225
  ]
@@ -25,6 +25,7 @@ if TYPE_CHECKING:
25
25
  # Standard logic family threshold constants
26
26
  # Reference: Various IC manufacturer datasheets
27
27
  LOGIC_FAMILIES: dict[str, dict[str, float]] = {
28
+ # Modern logic families (5V)
28
29
  "TTL": {
29
30
  "VIL_max": 0.8, # Maximum input low voltage
30
31
  "VIH_min": 2.0, # Minimum input high voltage
@@ -74,6 +75,63 @@ LOGIC_FAMILIES: dict[str, dict[str, float]] = {
74
75
  "VOH_min": 1.1,
75
76
  "VCC": 1.2,
76
77
  },
78
+ # Vintage logic families (1960s-1970s)
79
+ "ECL": {
80
+ "VIL_max": -1.475, # ECL 10K series
81
+ "VIH_min": -1.105,
82
+ "VOL_max": -1.630, # Typical -1.63V
83
+ "VOH_min": -0.980, # Typical -0.98V
84
+ "VCC": 0.0, # Ground-referenced
85
+ "VEE": -5.2, # Negative supply
86
+ "differential": True, # Differential signaling
87
+ },
88
+ "ECL_100K": {
89
+ "VIL_max": -1.810, # ECL 100K series (faster)
90
+ "VIH_min": -1.620,
91
+ "VOL_max": -1.950,
92
+ "VOH_min": -1.650,
93
+ "VCC": 0.0,
94
+ "VEE": -5.2,
95
+ "differential": True,
96
+ },
97
+ "RTL": {
98
+ "VIL_max": 0.4, # Resistor-Transistor Logic
99
+ "VIH_min": 0.9,
100
+ "VOL_max": 0.2,
101
+ "VOH_min": 3.6, # Typical 3.6V high output
102
+ "VCC": 3.6, # 3.6V supply common
103
+ },
104
+ "DTL": {
105
+ "VIL_max": 0.5, # Diode-Transistor Logic
106
+ "VIH_min": 2.0,
107
+ "VOL_max": 0.4,
108
+ "VOH_min": 4.0, # Typical 4V high output
109
+ "VCC": 5.0,
110
+ },
111
+ "MOS": {
112
+ "VIL_max": -3.0, # P-channel MOS (negative logic)
113
+ "VIH_min": -10.0,
114
+ "VOL_max": -0.5,
115
+ "VOH_min": -11.5,
116
+ "VCC": 0.0, # Ground
117
+ "VDD": -12.0, # Negative supply
118
+ },
119
+ "PMOS": {
120
+ "VIL_max": -3.0, # PMOS (4000 series at -12V)
121
+ "VIH_min": -9.0,
122
+ "VOL_max": -0.5,
123
+ "VOH_min": -11.5,
124
+ "VCC": 0.0,
125
+ "VDD": -12.0,
126
+ },
127
+ "NMOS": {
128
+ "VIL_max": 1.5, # NMOS (positive logic, 12V)
129
+ "VIH_min": 8.0,
130
+ "VOL_max": 0.5,
131
+ "VOH_min": 11.5,
132
+ "VCC": 12.0,
133
+ "VSS": 0.0,
134
+ },
77
135
  }
78
136
 
79
137
 
@@ -405,9 +463,146 @@ def get_logic_threshold(
405
463
  raise ValueError(f"Unknown threshold_type: {threshold_type}")
406
464
 
407
465
 
466
+ def detect_logic_family(
467
+ trace: WaveformTrace,
468
+ *,
469
+ confidence_threshold: float = 0.8,
470
+ ) -> tuple[str, float]:
471
+ """Auto-detect logic family from signal voltage levels.
472
+
473
+ Analyzes the signal to determine which logic family it most likely represents
474
+ based on voltage levels.
475
+
476
+ Args:
477
+ trace: Input analog waveform trace.
478
+ confidence_threshold: Minimum confidence (0-1) to return a match.
479
+
480
+ Returns:
481
+ Tuple of (family_name, confidence_score).
482
+ Returns ("unknown", 0.0) if no match above threshold.
483
+
484
+ Example:
485
+ >>> family, conf = detect_logic_family(trace)
486
+ >>> print(f"Detected: {family} ({conf*100:.1f}% confidence)")
487
+ """
488
+ if len(trace.data) < 10:
489
+ return ("unknown", 0.0)
490
+
491
+ data = np.asarray(trace.data)
492
+
493
+ # Find voltage levels using percentiles
494
+ p10, p90 = np.percentile(data, [10, 90])
495
+ vlow = p10
496
+ vhigh = p90
497
+
498
+ # Calculate midpoint and swing
499
+ vmid = (vlow + vhigh) / 2.0
500
+ vswing = vhigh - vlow
501
+
502
+ if vswing < 0.1: # Insufficient signal
503
+ return ("unknown", 0.0)
504
+
505
+ # Score each logic family
506
+ scores: dict[str, float] = {}
507
+
508
+ for family_name, levels in LOGIC_FAMILIES.items():
509
+ # Check if voltage levels match this family
510
+ vil_max = levels["VIL_max"]
511
+ vih_min = levels["VIH_min"]
512
+ vcc = levels.get("VCC", 5.0)
513
+
514
+ # Expected midpoint for this family
515
+ expected_mid = (vil_max + vih_min) / 2.0
516
+
517
+ # Score based on:
518
+ # 1. Midpoint proximity
519
+ # 2. High level proximity to VOH
520
+ # 3. Low level proximity to VOL
521
+
522
+ mid_error = abs(vmid - expected_mid)
523
+ high_error = abs(vhigh - levels.get("VOH_min", vih_min))
524
+ low_error = abs(vlow - levels.get("VOL_max", vil_max))
525
+
526
+ # Normalize errors (handle VCC=0 for ECL/PMOS)
527
+ if vcc != 0:
528
+ mid_score = max(0, 1.0 - mid_error / abs(vcc))
529
+ high_score = max(0, 1.0 - high_error / abs(vcc))
530
+ low_score = max(0, 1.0 - low_error / abs(vcc))
531
+ else:
532
+ # For VCC=0 families (ECL), use voltage range instead
533
+ voltage_range = abs(vih_min - vil_max)
534
+ if voltage_range > 0:
535
+ mid_score = max(0, 1.0 - mid_error / voltage_range)
536
+ high_score = max(0, 1.0 - high_error / voltage_range)
537
+ low_score = max(0, 1.0 - low_error / voltage_range)
538
+ else:
539
+ mid_score = high_score = low_score = 0.0
540
+
541
+ # Combined score (weighted average)
542
+ total_score = mid_score * 0.5 + high_score * 0.25 + low_score * 0.25
543
+ scores[family_name] = total_score
544
+
545
+ # Find best match
546
+ if not scores:
547
+ return ("unknown", 0.0)
548
+
549
+ best_family = max(scores.items(), key=lambda x: x[1])
550
+
551
+ if best_family[1] < confidence_threshold:
552
+ return ("unknown", best_family[1])
553
+
554
+ return best_family
555
+
556
+
557
+ def detect_open_collector(
558
+ trace: WaveformTrace,
559
+ *,
560
+ asymmetry_threshold: float = 3.0,
561
+ ) -> tuple[bool, float]:
562
+ """Detect open-collector or open-drain output.
563
+
564
+ Open-collector outputs have slow rise times (limited by pull-up resistor)
565
+ and fast fall times (active transistor).
566
+
567
+ Args:
568
+ trace: Input analog waveform trace.
569
+ asymmetry_threshold: Minimum rise/fall ratio to indicate open-collector.
570
+
571
+ Returns:
572
+ Tuple of (is_open_collector, asymmetry_ratio).
573
+
574
+ Example:
575
+ >>> is_oc, ratio = detect_open_collector(trace)
576
+ >>> if is_oc:
577
+ ... print(f"Open-collector detected (rise/fall = {ratio:.1f})")
578
+ """
579
+ from oscura.analyzers.waveform.measurements import fall_time, rise_time
580
+
581
+ if len(trace.data) < 10:
582
+ return (False, 1.0)
583
+
584
+ # Measure rise and fall times
585
+ tr = rise_time(trace, ref_levels=(0.1, 0.9))
586
+ tf = fall_time(trace, ref_levels=(0.9, 0.1))
587
+
588
+ # Check for valid measurements
589
+ if np.isnan(tr) or np.isnan(tf) or tf == 0:
590
+ return (False, 1.0)
591
+
592
+ # Calculate asymmetry ratio
593
+ asymmetry = tr / tf
594
+
595
+ # Open-collector has slow rise, fast fall
596
+ is_oc = bool(asymmetry >= asymmetry_threshold)
597
+
598
+ return (is_oc, float(asymmetry))
599
+
600
+
408
601
  __all__ = [
409
602
  "LOGIC_FAMILIES",
410
603
  "detect_edges",
604
+ "detect_logic_family",
605
+ "detect_open_collector",
411
606
  "get_logic_threshold",
412
607
  "to_digital",
413
608
  ]