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.
- {oscura-0.4.0 → oscura-0.5.0}/.gitignore +1 -0
- {oscura-0.4.0 → oscura-0.5.0}/CHANGELOG.md +159 -1
- {oscura-0.4.0 → oscura-0.5.0}/PKG-INFO +1 -1
- {oscura-0.4.0 → oscura-0.5.0}/pyproject.toml +1 -1
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/__init__.py +1 -1
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/digital/__init__.py +48 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/digital/extraction.py +195 -0
- oscura-0.5.0/src/oscura/analyzers/digital/ic_database.py +498 -0
- oscura-0.5.0/src/oscura/analyzers/digital/timing_paths.py +339 -0
- oscura-0.5.0/src/oscura/analyzers/digital/vintage.py +377 -0
- oscura-0.5.0/src/oscura/analyzers/digital/vintage_result.py +148 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/protocols/__init__.py +22 -1
- oscura-0.5.0/src/oscura/analyzers/protocols/parallel_bus.py +449 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/__init__.py +1 -1
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/export/__init__.py +12 -0
- oscura-0.5.0/src/oscura/export/wavedrom.py +430 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exporters/json_export.py +47 -0
- oscura-0.5.0/src/oscura/exporters/vintage_logic_csv.py +247 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/__init__.py +7 -0
- oscura-0.5.0/src/oscura/reporting/vintage_logic_report.py +523 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/utils/autodetect.py +5 -1
- oscura-0.5.0/src/oscura/visualization/digital_advanced.py +718 -0
- oscura-0.5.0/src/oscura/visualization/figure_manager.py +156 -0
- {oscura-0.4.0 → oscura-0.5.0}/uv.lock +1 -1
- oscura-0.4.0/.vscode/extensions.json +0 -55
- oscura-0.4.0/.vscode/launch.json +0 -183
- oscura-0.4.0/.vscode/settings.json +0 -383
- oscura-0.4.0/cspell.json +0 -139
- oscura-0.4.0/src/oscura/automotive/dtc/data.json +0 -2763
- oscura-0.4.0/src/oscura/schemas/bus_configuration.json +0 -322
- oscura-0.4.0/src/oscura/schemas/device_mapping.json +0 -182
- oscura-0.4.0/src/oscura/schemas/packet_format.json +0 -418
- oscura-0.4.0/src/oscura/schemas/protocol_definition.json +0 -363
- {oscura-0.4.0 → oscura-0.5.0}/.claude/summaries/.gitkeep +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/.cspell/.gitkeep +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/.cspell/custom-dictionary.txt +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/.editorconfig +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/.env.example +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/.gitattributes +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/.gitleaks.toml +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/.importlinter +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/.lycheeignore +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/.markdownlint.yaml +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/.markdownlintignore +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/.pre-commit-config.yaml +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/.prettierignore +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/.python-version +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/.shellcheckrc +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/.vscode/markdown.css +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/.yamllint.yaml +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/CITATION.cff +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/CLAUDE.md +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/CODE_OF_CONDUCT.md +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/CONTRIBUTING.md +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/LICENSE +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/Makefile +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/README.md +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/SECURITY.md +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/demos/01_waveform_analysis/demo_data/.gitkeep +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/demos/01_waveform_analysis/generate_demo_data.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/demos/03_custom_daq/demo_data/.gitkeep +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/demos/03_custom_daq/generate_demo_data.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/demos/04_serial_protocols/demo_data/.gitkeep +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/demos/05_protocol_decoding/demo_data/.gitkeep +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/demos/05_protocol_decoding/generate_demo_data.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/demos/06_udp_packet_analysis/demo_data/.gitkeep +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/demos/06_udp_packet_analysis/generate_demo_data.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/demos/07_protocol_inference/demo_data/.gitkeep +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/demos/09_automotive/demo_data/.gitkeep +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/demos/09_automotive/generate_demo_data.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/demos/11_mixed_signal/demo_data/.gitkeep +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/demos/11_mixed_signal/generate_demo_data.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/demos/12_spectral_compliance/demo_data/.gitkeep +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/demos/12_spectral_compliance/generate_demo_data.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/demos/13_jitter_analysis/generate_demo_data.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/demos/16_emc_compliance/demo_data/.gitkeep +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/demos/16_emc_compliance/generate_demo_data.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/demos/17_signal_reverse_engineering/demo_data/.gitkeep +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/demos/17_signal_reverse_engineering/generate_demo_data.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/demos/generate_all_demo_data.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/lychee.toml +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/mkdocs.yml +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/run_all_demos.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/__main__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/acquisition/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/acquisition/file.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/acquisition/hardware.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/acquisition/saleae.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/acquisition/socketcan.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/acquisition/streaming.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/acquisition/synthetic.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/acquisition/visa.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/digital/bus.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/digital/clock.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/digital/correlation.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/digital/edges.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/digital/quality.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/digital/signal_quality.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/digital/thresholds.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/digital/timing.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/eye/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/eye/diagram.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/eye/metrics.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/jitter/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/jitter/ber.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/jitter/decomposition.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/jitter/measurements.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/jitter/spectrum.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/measurements.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/packet/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/packet/daq.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/packet/metrics.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/packet/parser.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/packet/payload.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/packet/payload_analysis.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/packet/payload_extraction.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/packet/payload_patterns.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/packet/stream.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/patterns/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/patterns/clustering.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/patterns/discovery.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/patterns/learning.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/patterns/matching.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/patterns/periodic.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/patterns/sequences.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/power/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/power/ac_power.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/power/basic.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/power/conduction.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/power/efficiency.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/power/ripple.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/power/soa.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/power/switching.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/protocol/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/protocols/base.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/protocols/can.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/protocols/can_fd.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/protocols/flexray.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/protocols/hdlc.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/protocols/i2c.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/protocols/i2s.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/protocols/jtag.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/protocols/lin.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/protocols/manchester.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/protocols/onewire.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/protocols/spi.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/protocols/swd.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/protocols/uart.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/protocols/usb.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/side_channel/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/side_channel/power.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/side_channel/timing.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/signal_integrity/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/signal_integrity/embedding.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/signal_integrity/equalization.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/signal_integrity/sparams.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/spectral/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/spectral/chunked.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/spectral/chunked_fft.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/spectral/chunked_wavelet.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/spectral/fft.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/statistical/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/statistical/checksum.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/statistical/chunked_corr.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/statistical/classification.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/statistical/entropy.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/statistical/ngrams.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/statistics/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/statistics/advanced.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/statistics/basic.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/statistics/correlation.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/statistics/distribution.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/statistics/outliers.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/statistics/streaming.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/statistics/trend.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/validation.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/waveform/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/waveform/measurements.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/waveform/measurements_with_uncertainty.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/waveform/spectral.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/analyzers/waveform/wavelets.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/api/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/api/dsl.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/api/fluent.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/api/operators.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/api/optimization.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/api/profiling.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/can/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/can/analysis.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/can/checksum.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/can/correlation.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/can/discovery.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/can/message_wrapper.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/can/models.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/can/patterns.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/can/session.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/can/state_machine.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/can/stimulus_response.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/dbc/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/dbc/generator.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/dbc/parser.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/dtc/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/dtc/database.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/j1939/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/j1939/decoder.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/loaders/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/loaders/asc.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/loaders/blf.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/loaders/csv_can.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/loaders/dispatcher.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/loaders/mdf.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/loaders/pcap.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/obd/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/obd/decoder.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/uds/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/uds/decoder.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/uds/models.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/automotive/visualization.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/batch/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/batch/advanced.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/batch/aggregate.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/batch/analyze.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/batch/logging.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/batch/metrics.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/builders/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/builders/signal_builder.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/cli/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/cli/batch.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/cli/characterize.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/cli/compare.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/cli/decode.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/cli/main.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/cli/shell.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/comparison/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/comparison/compare.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/comparison/golden.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/comparison/limits.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/comparison/mask.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/comparison/trace_diff.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/comparison/visualization.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/compliance/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/compliance/advanced.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/compliance/masks.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/compliance/reporting.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/compliance/testing.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/component/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/component/impedance.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/component/reactive.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/component/transmission_line.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/config/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/config/defaults.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/config/loader.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/config/memory.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/config/migration.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/config/pipeline.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/config/preferences.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/config/protocol.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/config/schema.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/config/settings.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/config/thresholds.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/convenience.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/audit.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/backend_selector.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/cache.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/cancellation.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/confidence.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/config.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/correlation.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/cross_domain.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/debug.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/edge_cases.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/exceptions.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/gpu_backend.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/lazy.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/log_query.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/logging.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/logging_advanced.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/memoize.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/memory_check.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/memory_guard.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/memory_limits.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/memory_monitor.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/memory_progress.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/memory_warnings.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/numba_backend.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/performance.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/progress.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/provenance.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/results.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/types.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/core/uncertainty.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/discovery/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/discovery/anomaly_detector.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/discovery/auto_decoder.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/discovery/comparison.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/discovery/quality_validator.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/discovery/signal_detector.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/dsl/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/dsl/commands.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/dsl/interpreter.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/dsl/parser.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/dsl/repl.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exceptions.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exploratory/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exploratory/error_recovery.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exploratory/fuzzy.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exploratory/fuzzy_advanced.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exploratory/legacy.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exploratory/parse.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exploratory/recovery.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exploratory/sync.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exploratory/unknown.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/export/wireshark/README.md +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/export/wireshark/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/export/wireshark/generator.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/export/wireshark/lua_builder.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/export/wireshark/templates/dissector.lua.j2 +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/export/wireshark/type_mapping.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/export/wireshark/validator.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exporters/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exporters/csv.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exporters/exporters.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exporters/hdf5.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exporters/html_export.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exporters/markdown_export.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exporters/matlab_export.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exporters/npz_export.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/exporters/spice_export.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/extensibility/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/extensibility/docs.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/extensibility/extensions.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/extensibility/logging.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/extensibility/measurements.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/extensibility/plugins.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/extensibility/registry.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/extensibility/templates.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/extensibility/validation.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/filtering/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/filtering/base.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/filtering/convenience.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/filtering/design.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/filtering/filters.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/filtering/introspection.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/guidance/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/guidance/recommender.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/guidance/wizard.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/active_learning/README.md +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/active_learning/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/active_learning/lstar.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/active_learning/observation_table.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/active_learning/oracle.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/active_learning/teachers/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/active_learning/teachers/simulator.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/adaptive_tuning.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/alignment.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/bayesian.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/binary.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/crc_reverse.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/logic.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/message_format.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/protocol.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/protocol_dsl.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/protocol_library.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/sequences.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/signal_intelligence.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/spectral.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/state_machine.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/inference/stream.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/integrations/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/integrations/llm.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/jupyter/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/jupyter/display.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/jupyter/magic.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/binary.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/chipwhisperer.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/configurable.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/csv.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/csv_loader.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/hdf5.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/hdf5_loader.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/lazy.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/mmap_loader.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/numpy_loader.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/pcap.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/preprocessing.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/rigol.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/sigrok.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/tdms.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/tektronix.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/touchstone.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/validation.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/vcd.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/loaders/wav.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/math/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/math/arithmetic.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/math/interpolation.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/onboarding/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/onboarding/help.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/onboarding/tutorials.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/onboarding/wizard.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/optimization/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/optimization/parallel.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/optimization/search.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/pipeline/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/pipeline/base.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/pipeline/composition.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/pipeline/parallel.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/pipeline/pipeline.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/pipeline/reverse_engineering.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/plugins/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/plugins/base.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/plugins/cli.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/plugins/discovery.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/plugins/isolation.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/plugins/lifecycle.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/plugins/manager.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/plugins/registry.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/plugins/versioning.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/py.typed +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/quality/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/quality/ensemble.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/quality/explainer.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/quality/scoring.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/quality/warnings.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/advanced.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/analyze.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/argument_preparer.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/auto_report.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/batch.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/chart_selection.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/comparison.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/config.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/content/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/content/executive.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/content/filtering.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/content/minimal.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/content/verbosity.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/core.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/core_formats/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/core_formats/multi_format.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/engine.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/export.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/formatting/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/formatting/emphasis.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/formatting/numbers.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/formatting/standards.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/formatting.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/html.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/index.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/multichannel.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/output.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/pdf.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/plots.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/pptx_export.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/renderers/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/renderers/pdf.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/sections.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/standards.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/summary_generator.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/tables.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/template_system.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/templates/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/templates/definition.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/templates/index.html +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/reporting/templates/index.md +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/schemas/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/search/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/search/anomaly.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/search/context.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/search/pattern.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/session/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/session/annotations.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/session/history.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/session/session.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/sessions/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/sessions/base.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/sessions/blackbox.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/sessions/generic.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/streaming/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/streaming/chunked.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/streaming/progressive.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/streaming/realtime.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/testing/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/testing/synthetic.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/triggering/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/triggering/base.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/triggering/edge.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/triggering/pattern.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/triggering/pulse.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/triggering/window.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/ui/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/ui/formatters.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/ui/progressive_display.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/utils/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/utils/buffer.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/utils/lazy.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/utils/lazy_imports.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/utils/memory.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/utils/memory_advanced.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/utils/memory_extensions.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/utils/progressive.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/utils/windowing.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/accessibility.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/annotations.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/axis_scaling.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/colors.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/digital.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/eye.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/histogram.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/interactive.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/jitter.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/keyboard.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/layout.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/optimization.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/palettes.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/plot.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/power.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/power_extended.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/presets.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/protocols.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/render.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/rendering.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/reverse_engineering.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/signal_integrity.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/specialized.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/spectral.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/styles.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/thumbnails.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/time_axis.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/visualization/waveform.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/workflow/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/workflow/dag.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/workflows/__init__.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/workflows/compliance.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/workflows/digital.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/workflows/multi_trace.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/workflows/power.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/workflows/protocol.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/workflows/reverse_engineering.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/src/oscura/workflows/signal_integrity.py +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/test_data/README.md +0 -0
- {oscura-0.4.0 → oscura-0.5.0}/validate_all_demos.py +0 -0
|
@@ -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.
|
|
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.
|
|
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.
|
|
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"
|
|
@@ -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
|
]
|