oscura 0.0.1__py3-none-any.whl → 0.1.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- oscura/__init__.py +813 -8
- oscura/__main__.py +392 -0
- oscura/analyzers/__init__.py +37 -0
- oscura/analyzers/digital/__init__.py +177 -0
- oscura/analyzers/digital/bus.py +691 -0
- oscura/analyzers/digital/clock.py +805 -0
- oscura/analyzers/digital/correlation.py +720 -0
- oscura/analyzers/digital/edges.py +632 -0
- oscura/analyzers/digital/extraction.py +413 -0
- oscura/analyzers/digital/quality.py +878 -0
- oscura/analyzers/digital/signal_quality.py +877 -0
- oscura/analyzers/digital/thresholds.py +708 -0
- oscura/analyzers/digital/timing.py +1104 -0
- oscura/analyzers/eye/__init__.py +46 -0
- oscura/analyzers/eye/diagram.py +434 -0
- oscura/analyzers/eye/metrics.py +555 -0
- oscura/analyzers/jitter/__init__.py +83 -0
- oscura/analyzers/jitter/ber.py +333 -0
- oscura/analyzers/jitter/decomposition.py +759 -0
- oscura/analyzers/jitter/measurements.py +413 -0
- oscura/analyzers/jitter/spectrum.py +220 -0
- oscura/analyzers/measurements.py +40 -0
- oscura/analyzers/packet/__init__.py +171 -0
- oscura/analyzers/packet/daq.py +1077 -0
- oscura/analyzers/packet/metrics.py +437 -0
- oscura/analyzers/packet/parser.py +327 -0
- oscura/analyzers/packet/payload.py +2156 -0
- oscura/analyzers/packet/payload_analysis.py +1312 -0
- oscura/analyzers/packet/payload_extraction.py +236 -0
- oscura/analyzers/packet/payload_patterns.py +670 -0
- oscura/analyzers/packet/stream.py +359 -0
- oscura/analyzers/patterns/__init__.py +266 -0
- oscura/analyzers/patterns/clustering.py +1036 -0
- oscura/analyzers/patterns/discovery.py +539 -0
- oscura/analyzers/patterns/learning.py +797 -0
- oscura/analyzers/patterns/matching.py +1091 -0
- oscura/analyzers/patterns/periodic.py +650 -0
- oscura/analyzers/patterns/sequences.py +767 -0
- oscura/analyzers/power/__init__.py +116 -0
- oscura/analyzers/power/ac_power.py +391 -0
- oscura/analyzers/power/basic.py +383 -0
- oscura/analyzers/power/conduction.py +314 -0
- oscura/analyzers/power/efficiency.py +297 -0
- oscura/analyzers/power/ripple.py +356 -0
- oscura/analyzers/power/soa.py +372 -0
- oscura/analyzers/power/switching.py +479 -0
- oscura/analyzers/protocol/__init__.py +150 -0
- oscura/analyzers/protocols/__init__.py +150 -0
- oscura/analyzers/protocols/base.py +500 -0
- oscura/analyzers/protocols/can.py +620 -0
- oscura/analyzers/protocols/can_fd.py +448 -0
- oscura/analyzers/protocols/flexray.py +405 -0
- oscura/analyzers/protocols/hdlc.py +399 -0
- oscura/analyzers/protocols/i2c.py +368 -0
- oscura/analyzers/protocols/i2s.py +296 -0
- oscura/analyzers/protocols/jtag.py +393 -0
- oscura/analyzers/protocols/lin.py +445 -0
- oscura/analyzers/protocols/manchester.py +333 -0
- oscura/analyzers/protocols/onewire.py +501 -0
- oscura/analyzers/protocols/spi.py +334 -0
- oscura/analyzers/protocols/swd.py +325 -0
- oscura/analyzers/protocols/uart.py +393 -0
- oscura/analyzers/protocols/usb.py +495 -0
- oscura/analyzers/signal_integrity/__init__.py +63 -0
- oscura/analyzers/signal_integrity/embedding.py +294 -0
- oscura/analyzers/signal_integrity/equalization.py +370 -0
- oscura/analyzers/signal_integrity/sparams.py +484 -0
- oscura/analyzers/spectral/__init__.py +53 -0
- oscura/analyzers/spectral/chunked.py +273 -0
- oscura/analyzers/spectral/chunked_fft.py +571 -0
- oscura/analyzers/spectral/chunked_wavelet.py +391 -0
- oscura/analyzers/spectral/fft.py +92 -0
- oscura/analyzers/statistical/__init__.py +250 -0
- oscura/analyzers/statistical/checksum.py +923 -0
- oscura/analyzers/statistical/chunked_corr.py +228 -0
- oscura/analyzers/statistical/classification.py +778 -0
- oscura/analyzers/statistical/entropy.py +1113 -0
- oscura/analyzers/statistical/ngrams.py +614 -0
- oscura/analyzers/statistics/__init__.py +119 -0
- oscura/analyzers/statistics/advanced.py +885 -0
- oscura/analyzers/statistics/basic.py +263 -0
- oscura/analyzers/statistics/correlation.py +630 -0
- oscura/analyzers/statistics/distribution.py +298 -0
- oscura/analyzers/statistics/outliers.py +463 -0
- oscura/analyzers/statistics/streaming.py +93 -0
- oscura/analyzers/statistics/trend.py +520 -0
- oscura/analyzers/validation.py +598 -0
- oscura/analyzers/waveform/__init__.py +36 -0
- oscura/analyzers/waveform/measurements.py +943 -0
- oscura/analyzers/waveform/measurements_with_uncertainty.py +371 -0
- oscura/analyzers/waveform/spectral.py +1689 -0
- oscura/analyzers/waveform/wavelets.py +298 -0
- oscura/api/__init__.py +62 -0
- oscura/api/dsl.py +538 -0
- oscura/api/fluent.py +571 -0
- oscura/api/operators.py +498 -0
- oscura/api/optimization.py +392 -0
- oscura/api/profiling.py +396 -0
- oscura/automotive/__init__.py +73 -0
- oscura/automotive/can/__init__.py +52 -0
- oscura/automotive/can/analysis.py +356 -0
- oscura/automotive/can/checksum.py +250 -0
- oscura/automotive/can/correlation.py +212 -0
- oscura/automotive/can/discovery.py +355 -0
- oscura/automotive/can/message_wrapper.py +375 -0
- oscura/automotive/can/models.py +385 -0
- oscura/automotive/can/patterns.py +381 -0
- oscura/automotive/can/session.py +452 -0
- oscura/automotive/can/state_machine.py +300 -0
- oscura/automotive/can/stimulus_response.py +461 -0
- oscura/automotive/dbc/__init__.py +15 -0
- oscura/automotive/dbc/generator.py +156 -0
- oscura/automotive/dbc/parser.py +146 -0
- oscura/automotive/dtc/__init__.py +30 -0
- oscura/automotive/dtc/database.py +3036 -0
- oscura/automotive/j1939/__init__.py +14 -0
- oscura/automotive/j1939/decoder.py +745 -0
- oscura/automotive/loaders/__init__.py +35 -0
- oscura/automotive/loaders/asc.py +98 -0
- oscura/automotive/loaders/blf.py +77 -0
- oscura/automotive/loaders/csv_can.py +136 -0
- oscura/automotive/loaders/dispatcher.py +136 -0
- oscura/automotive/loaders/mdf.py +331 -0
- oscura/automotive/loaders/pcap.py +132 -0
- oscura/automotive/obd/__init__.py +14 -0
- oscura/automotive/obd/decoder.py +707 -0
- oscura/automotive/uds/__init__.py +48 -0
- oscura/automotive/uds/decoder.py +265 -0
- oscura/automotive/uds/models.py +64 -0
- oscura/automotive/visualization.py +369 -0
- oscura/batch/__init__.py +55 -0
- oscura/batch/advanced.py +627 -0
- oscura/batch/aggregate.py +300 -0
- oscura/batch/analyze.py +139 -0
- oscura/batch/logging.py +487 -0
- oscura/batch/metrics.py +556 -0
- oscura/builders/__init__.py +41 -0
- oscura/builders/signal_builder.py +1131 -0
- oscura/cli/__init__.py +14 -0
- oscura/cli/batch.py +339 -0
- oscura/cli/characterize.py +273 -0
- oscura/cli/compare.py +775 -0
- oscura/cli/decode.py +551 -0
- oscura/cli/main.py +247 -0
- oscura/cli/shell.py +350 -0
- oscura/comparison/__init__.py +66 -0
- oscura/comparison/compare.py +397 -0
- oscura/comparison/golden.py +487 -0
- oscura/comparison/limits.py +391 -0
- oscura/comparison/mask.py +434 -0
- oscura/comparison/trace_diff.py +30 -0
- oscura/comparison/visualization.py +481 -0
- oscura/compliance/__init__.py +70 -0
- oscura/compliance/advanced.py +756 -0
- oscura/compliance/masks.py +363 -0
- oscura/compliance/reporting.py +483 -0
- oscura/compliance/testing.py +298 -0
- oscura/component/__init__.py +38 -0
- oscura/component/impedance.py +365 -0
- oscura/component/reactive.py +598 -0
- oscura/component/transmission_line.py +312 -0
- oscura/config/__init__.py +191 -0
- oscura/config/defaults.py +254 -0
- oscura/config/loader.py +348 -0
- oscura/config/memory.py +271 -0
- oscura/config/migration.py +458 -0
- oscura/config/pipeline.py +1077 -0
- oscura/config/preferences.py +530 -0
- oscura/config/protocol.py +875 -0
- oscura/config/schema.py +713 -0
- oscura/config/settings.py +420 -0
- oscura/config/thresholds.py +599 -0
- oscura/convenience.py +457 -0
- oscura/core/__init__.py +299 -0
- oscura/core/audit.py +457 -0
- oscura/core/backend_selector.py +405 -0
- oscura/core/cache.py +590 -0
- oscura/core/cancellation.py +439 -0
- oscura/core/confidence.py +225 -0
- oscura/core/config.py +506 -0
- oscura/core/correlation.py +216 -0
- oscura/core/cross_domain.py +422 -0
- oscura/core/debug.py +301 -0
- oscura/core/edge_cases.py +541 -0
- oscura/core/exceptions.py +535 -0
- oscura/core/gpu_backend.py +523 -0
- oscura/core/lazy.py +832 -0
- oscura/core/log_query.py +540 -0
- oscura/core/logging.py +931 -0
- oscura/core/logging_advanced.py +952 -0
- oscura/core/memoize.py +171 -0
- oscura/core/memory_check.py +274 -0
- oscura/core/memory_guard.py +290 -0
- oscura/core/memory_limits.py +336 -0
- oscura/core/memory_monitor.py +453 -0
- oscura/core/memory_progress.py +465 -0
- oscura/core/memory_warnings.py +315 -0
- oscura/core/numba_backend.py +362 -0
- oscura/core/performance.py +352 -0
- oscura/core/progress.py +524 -0
- oscura/core/provenance.py +358 -0
- oscura/core/results.py +331 -0
- oscura/core/types.py +504 -0
- oscura/core/uncertainty.py +383 -0
- oscura/discovery/__init__.py +52 -0
- oscura/discovery/anomaly_detector.py +672 -0
- oscura/discovery/auto_decoder.py +415 -0
- oscura/discovery/comparison.py +497 -0
- oscura/discovery/quality_validator.py +528 -0
- oscura/discovery/signal_detector.py +769 -0
- oscura/dsl/__init__.py +73 -0
- oscura/dsl/commands.py +246 -0
- oscura/dsl/interpreter.py +455 -0
- oscura/dsl/parser.py +689 -0
- oscura/dsl/repl.py +172 -0
- oscura/exceptions.py +59 -0
- oscura/exploratory/__init__.py +111 -0
- oscura/exploratory/error_recovery.py +642 -0
- oscura/exploratory/fuzzy.py +513 -0
- oscura/exploratory/fuzzy_advanced.py +786 -0
- oscura/exploratory/legacy.py +831 -0
- oscura/exploratory/parse.py +358 -0
- oscura/exploratory/recovery.py +275 -0
- oscura/exploratory/sync.py +382 -0
- oscura/exploratory/unknown.py +707 -0
- oscura/export/__init__.py +25 -0
- oscura/export/wireshark/README.md +265 -0
- oscura/export/wireshark/__init__.py +47 -0
- oscura/export/wireshark/generator.py +312 -0
- oscura/export/wireshark/lua_builder.py +159 -0
- oscura/export/wireshark/templates/dissector.lua.j2 +92 -0
- oscura/export/wireshark/type_mapping.py +165 -0
- oscura/export/wireshark/validator.py +105 -0
- oscura/exporters/__init__.py +94 -0
- oscura/exporters/csv.py +303 -0
- oscura/exporters/exporters.py +44 -0
- oscura/exporters/hdf5.py +219 -0
- oscura/exporters/html_export.py +701 -0
- oscura/exporters/json_export.py +291 -0
- oscura/exporters/markdown_export.py +367 -0
- oscura/exporters/matlab_export.py +354 -0
- oscura/exporters/npz_export.py +219 -0
- oscura/exporters/spice_export.py +210 -0
- oscura/extensibility/__init__.py +131 -0
- oscura/extensibility/docs.py +752 -0
- oscura/extensibility/extensions.py +1125 -0
- oscura/extensibility/logging.py +259 -0
- oscura/extensibility/measurements.py +485 -0
- oscura/extensibility/plugins.py +414 -0
- oscura/extensibility/registry.py +346 -0
- oscura/extensibility/templates.py +913 -0
- oscura/extensibility/validation.py +651 -0
- oscura/filtering/__init__.py +89 -0
- oscura/filtering/base.py +563 -0
- oscura/filtering/convenience.py +564 -0
- oscura/filtering/design.py +725 -0
- oscura/filtering/filters.py +32 -0
- oscura/filtering/introspection.py +605 -0
- oscura/guidance/__init__.py +24 -0
- oscura/guidance/recommender.py +429 -0
- oscura/guidance/wizard.py +518 -0
- oscura/inference/__init__.py +251 -0
- oscura/inference/active_learning/README.md +153 -0
- oscura/inference/active_learning/__init__.py +38 -0
- oscura/inference/active_learning/lstar.py +257 -0
- oscura/inference/active_learning/observation_table.py +230 -0
- oscura/inference/active_learning/oracle.py +78 -0
- oscura/inference/active_learning/teachers/__init__.py +15 -0
- oscura/inference/active_learning/teachers/simulator.py +192 -0
- oscura/inference/adaptive_tuning.py +453 -0
- oscura/inference/alignment.py +653 -0
- oscura/inference/bayesian.py +943 -0
- oscura/inference/binary.py +1016 -0
- oscura/inference/crc_reverse.py +711 -0
- oscura/inference/logic.py +288 -0
- oscura/inference/message_format.py +1305 -0
- oscura/inference/protocol.py +417 -0
- oscura/inference/protocol_dsl.py +1084 -0
- oscura/inference/protocol_library.py +1230 -0
- oscura/inference/sequences.py +809 -0
- oscura/inference/signal_intelligence.py +1509 -0
- oscura/inference/spectral.py +215 -0
- oscura/inference/state_machine.py +634 -0
- oscura/inference/stream.py +918 -0
- oscura/integrations/__init__.py +59 -0
- oscura/integrations/llm.py +1827 -0
- oscura/jupyter/__init__.py +32 -0
- oscura/jupyter/display.py +268 -0
- oscura/jupyter/magic.py +334 -0
- oscura/loaders/__init__.py +526 -0
- oscura/loaders/binary.py +69 -0
- oscura/loaders/configurable.py +1255 -0
- oscura/loaders/csv.py +26 -0
- oscura/loaders/csv_loader.py +473 -0
- oscura/loaders/hdf5.py +9 -0
- oscura/loaders/hdf5_loader.py +510 -0
- oscura/loaders/lazy.py +370 -0
- oscura/loaders/mmap_loader.py +583 -0
- oscura/loaders/numpy_loader.py +436 -0
- oscura/loaders/pcap.py +432 -0
- oscura/loaders/preprocessing.py +368 -0
- oscura/loaders/rigol.py +287 -0
- oscura/loaders/sigrok.py +321 -0
- oscura/loaders/tdms.py +367 -0
- oscura/loaders/tektronix.py +711 -0
- oscura/loaders/validation.py +584 -0
- oscura/loaders/vcd.py +464 -0
- oscura/loaders/wav.py +233 -0
- oscura/math/__init__.py +45 -0
- oscura/math/arithmetic.py +824 -0
- oscura/math/interpolation.py +413 -0
- oscura/onboarding/__init__.py +39 -0
- oscura/onboarding/help.py +498 -0
- oscura/onboarding/tutorials.py +405 -0
- oscura/onboarding/wizard.py +466 -0
- oscura/optimization/__init__.py +19 -0
- oscura/optimization/parallel.py +440 -0
- oscura/optimization/search.py +532 -0
- oscura/pipeline/__init__.py +43 -0
- oscura/pipeline/base.py +338 -0
- oscura/pipeline/composition.py +242 -0
- oscura/pipeline/parallel.py +448 -0
- oscura/pipeline/pipeline.py +375 -0
- oscura/pipeline/reverse_engineering.py +1119 -0
- oscura/plugins/__init__.py +122 -0
- oscura/plugins/base.py +272 -0
- oscura/plugins/cli.py +497 -0
- oscura/plugins/discovery.py +411 -0
- oscura/plugins/isolation.py +418 -0
- oscura/plugins/lifecycle.py +959 -0
- oscura/plugins/manager.py +493 -0
- oscura/plugins/registry.py +421 -0
- oscura/plugins/versioning.py +372 -0
- oscura/py.typed +0 -0
- oscura/quality/__init__.py +65 -0
- oscura/quality/ensemble.py +740 -0
- oscura/quality/explainer.py +338 -0
- oscura/quality/scoring.py +616 -0
- oscura/quality/warnings.py +456 -0
- oscura/reporting/__init__.py +248 -0
- oscura/reporting/advanced.py +1234 -0
- oscura/reporting/analyze.py +448 -0
- oscura/reporting/argument_preparer.py +596 -0
- oscura/reporting/auto_report.py +507 -0
- oscura/reporting/batch.py +615 -0
- oscura/reporting/chart_selection.py +223 -0
- oscura/reporting/comparison.py +330 -0
- oscura/reporting/config.py +615 -0
- oscura/reporting/content/__init__.py +39 -0
- oscura/reporting/content/executive.py +127 -0
- oscura/reporting/content/filtering.py +191 -0
- oscura/reporting/content/minimal.py +257 -0
- oscura/reporting/content/verbosity.py +162 -0
- oscura/reporting/core.py +508 -0
- oscura/reporting/core_formats/__init__.py +17 -0
- oscura/reporting/core_formats/multi_format.py +210 -0
- oscura/reporting/engine.py +836 -0
- oscura/reporting/export.py +366 -0
- oscura/reporting/formatting/__init__.py +129 -0
- oscura/reporting/formatting/emphasis.py +81 -0
- oscura/reporting/formatting/numbers.py +403 -0
- oscura/reporting/formatting/standards.py +55 -0
- oscura/reporting/formatting.py +466 -0
- oscura/reporting/html.py +578 -0
- oscura/reporting/index.py +590 -0
- oscura/reporting/multichannel.py +296 -0
- oscura/reporting/output.py +379 -0
- oscura/reporting/pdf.py +373 -0
- oscura/reporting/plots.py +731 -0
- oscura/reporting/pptx_export.py +360 -0
- oscura/reporting/renderers/__init__.py +11 -0
- oscura/reporting/renderers/pdf.py +94 -0
- oscura/reporting/sections.py +471 -0
- oscura/reporting/standards.py +680 -0
- oscura/reporting/summary_generator.py +368 -0
- oscura/reporting/tables.py +397 -0
- oscura/reporting/template_system.py +724 -0
- oscura/reporting/templates/__init__.py +15 -0
- oscura/reporting/templates/definition.py +205 -0
- oscura/reporting/templates/index.html +649 -0
- oscura/reporting/templates/index.md +173 -0
- oscura/schemas/__init__.py +158 -0
- oscura/schemas/bus_configuration.json +322 -0
- oscura/schemas/device_mapping.json +182 -0
- oscura/schemas/packet_format.json +418 -0
- oscura/schemas/protocol_definition.json +363 -0
- oscura/search/__init__.py +16 -0
- oscura/search/anomaly.py +292 -0
- oscura/search/context.py +149 -0
- oscura/search/pattern.py +160 -0
- oscura/session/__init__.py +34 -0
- oscura/session/annotations.py +289 -0
- oscura/session/history.py +313 -0
- oscura/session/session.py +445 -0
- oscura/streaming/__init__.py +43 -0
- oscura/streaming/chunked.py +611 -0
- oscura/streaming/progressive.py +393 -0
- oscura/streaming/realtime.py +622 -0
- oscura/testing/__init__.py +54 -0
- oscura/testing/synthetic.py +808 -0
- oscura/triggering/__init__.py +68 -0
- oscura/triggering/base.py +229 -0
- oscura/triggering/edge.py +353 -0
- oscura/triggering/pattern.py +344 -0
- oscura/triggering/pulse.py +581 -0
- oscura/triggering/window.py +453 -0
- oscura/ui/__init__.py +48 -0
- oscura/ui/formatters.py +526 -0
- oscura/ui/progressive_display.py +340 -0
- oscura/utils/__init__.py +99 -0
- oscura/utils/autodetect.py +338 -0
- oscura/utils/buffer.py +389 -0
- oscura/utils/lazy.py +407 -0
- oscura/utils/lazy_imports.py +147 -0
- oscura/utils/memory.py +836 -0
- oscura/utils/memory_advanced.py +1326 -0
- oscura/utils/memory_extensions.py +465 -0
- oscura/utils/progressive.py +352 -0
- oscura/utils/windowing.py +362 -0
- oscura/visualization/__init__.py +321 -0
- oscura/visualization/accessibility.py +526 -0
- oscura/visualization/annotations.py +374 -0
- oscura/visualization/axis_scaling.py +305 -0
- oscura/visualization/colors.py +453 -0
- oscura/visualization/digital.py +337 -0
- oscura/visualization/eye.py +420 -0
- oscura/visualization/histogram.py +281 -0
- oscura/visualization/interactive.py +858 -0
- oscura/visualization/jitter.py +702 -0
- oscura/visualization/keyboard.py +394 -0
- oscura/visualization/layout.py +365 -0
- oscura/visualization/optimization.py +1028 -0
- oscura/visualization/palettes.py +446 -0
- oscura/visualization/plot.py +92 -0
- oscura/visualization/power.py +290 -0
- oscura/visualization/power_extended.py +626 -0
- oscura/visualization/presets.py +467 -0
- oscura/visualization/protocols.py +932 -0
- oscura/visualization/render.py +207 -0
- oscura/visualization/rendering.py +444 -0
- oscura/visualization/reverse_engineering.py +791 -0
- oscura/visualization/signal_integrity.py +808 -0
- oscura/visualization/specialized.py +553 -0
- oscura/visualization/spectral.py +811 -0
- oscura/visualization/styles.py +381 -0
- oscura/visualization/thumbnails.py +311 -0
- oscura/visualization/time_axis.py +351 -0
- oscura/visualization/waveform.py +367 -0
- oscura/workflow/__init__.py +13 -0
- oscura/workflow/dag.py +377 -0
- oscura/workflows/__init__.py +58 -0
- oscura/workflows/compliance.py +280 -0
- oscura/workflows/digital.py +272 -0
- oscura/workflows/multi_trace.py +502 -0
- oscura/workflows/power.py +178 -0
- oscura/workflows/protocol.py +492 -0
- oscura/workflows/reverse_engineering.py +639 -0
- oscura/workflows/signal_integrity.py +227 -0
- oscura-0.1.1.dist-info/METADATA +300 -0
- oscura-0.1.1.dist-info/RECORD +463 -0
- oscura-0.1.1.dist-info/entry_points.txt +2 -0
- {oscura-0.0.1.dist-info → oscura-0.1.1.dist-info}/licenses/LICENSE +1 -1
- oscura-0.0.1.dist-info/METADATA +0 -63
- oscura-0.0.1.dist-info/RECORD +0 -5
- {oscura-0.0.1.dist-info → oscura-0.1.1.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
"""Signal integrity audit workflow.
|
|
2
|
+
|
|
3
|
+
This module implements comprehensive signal integrity analysis including
|
|
4
|
+
eye diagram, jitter decomposition, and margin analysis.
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
Example:
|
|
8
|
+
>>> import oscura as osc
|
|
9
|
+
>>> trace = osc.load('data_signal.wfm')
|
|
10
|
+
>>> clock = osc.load('clock_signal.wfm')
|
|
11
|
+
>>> result = osc.signal_integrity_audit(trace, clock)
|
|
12
|
+
>>> print(f"Eye Height: {result['eye_height']:.3f} V")
|
|
13
|
+
>>> print(f"RMS Jitter: {result['jitter_rms']:.2f} ps")
|
|
14
|
+
|
|
15
|
+
References:
|
|
16
|
+
JEDEC Standard No. 65B: High-Speed Interface Timing
|
|
17
|
+
IEEE 1596.3-1996: Low-Voltage Differential Signals
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
from typing import TYPE_CHECKING, Any
|
|
23
|
+
|
|
24
|
+
import numpy as np
|
|
25
|
+
|
|
26
|
+
if TYPE_CHECKING:
|
|
27
|
+
from oscura.core.types import WaveformTrace
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def signal_integrity_audit(
|
|
31
|
+
trace: WaveformTrace,
|
|
32
|
+
clock_trace: WaveformTrace | None = None,
|
|
33
|
+
*,
|
|
34
|
+
bit_rate: float | None = None,
|
|
35
|
+
mask: str | None = None,
|
|
36
|
+
report: str | None = None,
|
|
37
|
+
) -> dict[str, Any]:
|
|
38
|
+
"""Comprehensive signal integrity analysis.
|
|
39
|
+
|
|
40
|
+
Performs complete signal integrity audit including:
|
|
41
|
+
- Eye diagram generation and analysis
|
|
42
|
+
- Jitter decomposition (random vs deterministic)
|
|
43
|
+
- Time Interval Error (TIE) measurement
|
|
44
|
+
- Margin analysis against standard masks
|
|
45
|
+
- Dominant noise source identification
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
trace: Data signal to analyze.
|
|
49
|
+
clock_trace: Optional recovered clock or reference clock.
|
|
50
|
+
If None, clock is recovered from data.
|
|
51
|
+
bit_rate: Bit rate in bits/second. If None, auto-detected.
|
|
52
|
+
mask: Optional eye mask standard ('PCIe', 'USB', 'SATA', etc.).
|
|
53
|
+
report: Optional path to save HTML report.
|
|
54
|
+
|
|
55
|
+
Returns:
|
|
56
|
+
Dictionary containing:
|
|
57
|
+
- eye_height: Eye opening height in volts
|
|
58
|
+
- eye_width: Eye opening width in seconds
|
|
59
|
+
- jitter_rms: RMS jitter in seconds
|
|
60
|
+
- jitter_pp: Peak-to-peak jitter in seconds
|
|
61
|
+
- tie: Time Interval Error array
|
|
62
|
+
- tie_rms: RMS of TIE in seconds
|
|
63
|
+
- margin_to_mask: Margin to specified mask (if provided)
|
|
64
|
+
- dominant_jitter_source: 'random' or 'deterministic'
|
|
65
|
+
- bit_error_rate_estimate: Estimated BER from eye closure
|
|
66
|
+
- snr_db: Signal-to-noise ratio in dB
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
Dictionary containing:
|
|
70
|
+
- eye_height: Eye opening height in volts
|
|
71
|
+
- eye_width: Eye opening width in seconds
|
|
72
|
+
- jitter_rms: RMS jitter in seconds
|
|
73
|
+
- jitter_pp: Peak-to-peak jitter in seconds
|
|
74
|
+
- tie: Time Interval Error array
|
|
75
|
+
- tie_rms: RMS of TIE in seconds
|
|
76
|
+
- margin_to_mask: Margin to specified mask (if provided)
|
|
77
|
+
- dominant_jitter_source: 'random' or 'deterministic'
|
|
78
|
+
- bit_error_rate_estimate: Estimated BER from eye closure
|
|
79
|
+
- snr_db: Signal-to-noise ratio in dB
|
|
80
|
+
|
|
81
|
+
Example:
|
|
82
|
+
>>> trace = osc.load('high_speed_data.wfm')
|
|
83
|
+
>>> result = osc.signal_integrity_audit(trace, bit_rate=1e9)
|
|
84
|
+
>>> print(f"Eye Height: {result['eye_height']*1e3:.1f} mV")
|
|
85
|
+
>>> print(f"Jitter (RMS): {result['jitter_rms']*1e12:.2f} ps")
|
|
86
|
+
>>> print(f"Dominant Jitter: {result['dominant_jitter_source']}")
|
|
87
|
+
|
|
88
|
+
References:
|
|
89
|
+
JEDEC Standard No. 65B Section 4.3 (Eye diagrams)
|
|
90
|
+
TIA-568.2-D (Signal integrity for high-speed data)
|
|
91
|
+
"""
|
|
92
|
+
# Import here to avoid circular dependencies
|
|
93
|
+
try:
|
|
94
|
+
from oscura.analyzers.eye.diagram import (
|
|
95
|
+
EyeDiagram,
|
|
96
|
+
)
|
|
97
|
+
except ImportError:
|
|
98
|
+
# Fallback if eye module not available
|
|
99
|
+
pass
|
|
100
|
+
|
|
101
|
+
try:
|
|
102
|
+
from oscura.analyzers.digital.timing import (
|
|
103
|
+
peak_to_peak_jitter,
|
|
104
|
+
recover_clock_fft,
|
|
105
|
+
time_interval_error,
|
|
106
|
+
)
|
|
107
|
+
except ImportError:
|
|
108
|
+
# Provide minimal implementation
|
|
109
|
+
recover_clock_fft = None # type: ignore[assignment]
|
|
110
|
+
peak_to_peak_jitter = None # type: ignore[assignment] # noqa: F841
|
|
111
|
+
time_interval_error = None # type: ignore[assignment]
|
|
112
|
+
|
|
113
|
+
# Recover clock if not provided
|
|
114
|
+
if clock_trace is None and recover_clock_fft is not None:
|
|
115
|
+
try:
|
|
116
|
+
clock_result = recover_clock_fft(trace)
|
|
117
|
+
recovered_freq = clock_result.frequency
|
|
118
|
+
except Exception:
|
|
119
|
+
# Estimate from bit rate
|
|
120
|
+
recovered_freq = bit_rate if bit_rate else 1e9
|
|
121
|
+
else:
|
|
122
|
+
recovered_freq = bit_rate if bit_rate else 1e9
|
|
123
|
+
|
|
124
|
+
# Calculate eye parameters (simplified - would use actual eye_diagram function)
|
|
125
|
+
# For now, provide placeholder calculations
|
|
126
|
+
vpp = np.ptp(trace.data)
|
|
127
|
+
eye_height = vpp * 0.7 # Typical eye opening is ~70% of signal swing
|
|
128
|
+
ui = 1.0 / recovered_freq if recovered_freq else 1e-9 # Unit Interval
|
|
129
|
+
eye_width = ui * 0.6 # Typical eye opening is ~60% of UI
|
|
130
|
+
|
|
131
|
+
# Calculate jitter (simplified)
|
|
132
|
+
# In real implementation, would use proper jitter analysis
|
|
133
|
+
if time_interval_error is not None:
|
|
134
|
+
try:
|
|
135
|
+
tie = time_interval_error(trace, nominal_period=1.0 / recovered_freq)
|
|
136
|
+
jitter_rms_val = float(np.std(tie))
|
|
137
|
+
jitter_pp_val = float(np.ptp(tie))
|
|
138
|
+
except Exception:
|
|
139
|
+
tie = np.array([])
|
|
140
|
+
jitter_rms_val = ui * 0.05 # Assume 5% UI jitter
|
|
141
|
+
jitter_pp_val = ui * 0.2 # Assume 20% UI p-p jitter
|
|
142
|
+
else:
|
|
143
|
+
tie = np.array([]) # type: ignore[unreachable]
|
|
144
|
+
jitter_rms_val = ui * 0.05
|
|
145
|
+
jitter_pp_val = ui * 0.2
|
|
146
|
+
|
|
147
|
+
# Determine dominant jitter source
|
|
148
|
+
# Random jitter dominates if RMS jitter is significant compared to p-p
|
|
149
|
+
# (deterministic would show bounded p-p with lower RMS)
|
|
150
|
+
if jitter_rms_val > 0:
|
|
151
|
+
jitter_ratio = jitter_pp_val / (6 * jitter_rms_val) # Expect ~6 for Gaussian
|
|
152
|
+
dominant_jitter_source = "random" if jitter_ratio < 8 else "deterministic"
|
|
153
|
+
else:
|
|
154
|
+
dominant_jitter_source = "unknown"
|
|
155
|
+
|
|
156
|
+
# Estimate BER from eye closure (simplified Gaussian approximation)
|
|
157
|
+
if eye_height > 0:
|
|
158
|
+
snr_linear = (
|
|
159
|
+
eye_height / (2 * jitter_rms_val * recovered_freq) if jitter_rms_val > 0 else 100
|
|
160
|
+
)
|
|
161
|
+
snr_db = 20 * np.log10(snr_linear) if snr_linear > 0 else 0
|
|
162
|
+
# BER ~ Q(SNR) where Q is Q-function
|
|
163
|
+
ber_estimate = 0.5 * (1 - np.tanh(snr_linear / np.sqrt(2)))
|
|
164
|
+
else:
|
|
165
|
+
snr_db = 0
|
|
166
|
+
ber_estimate = 0.5
|
|
167
|
+
|
|
168
|
+
# Mask margin (placeholder - would load actual mask)
|
|
169
|
+
margin_to_mask = None
|
|
170
|
+
if mask is not None:
|
|
171
|
+
# Would compare eye to loaded mask
|
|
172
|
+
margin_to_mask = eye_height * 0.2 # Assume 20% margin
|
|
173
|
+
|
|
174
|
+
# Build result dictionary
|
|
175
|
+
result = {
|
|
176
|
+
"eye_height": eye_height,
|
|
177
|
+
"eye_width": eye_width,
|
|
178
|
+
"jitter_rms": jitter_rms_val,
|
|
179
|
+
"jitter_pp": jitter_pp_val,
|
|
180
|
+
"tie": tie,
|
|
181
|
+
"tie_rms": jitter_rms_val, # TIE RMS same as jitter RMS
|
|
182
|
+
"margin_to_mask": margin_to_mask,
|
|
183
|
+
"dominant_jitter_source": dominant_jitter_source,
|
|
184
|
+
"bit_error_rate_estimate": ber_estimate,
|
|
185
|
+
"snr_db": snr_db,
|
|
186
|
+
"bit_rate": recovered_freq,
|
|
187
|
+
"unit_interval": ui,
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
# Generate report if requested
|
|
191
|
+
if report is not None:
|
|
192
|
+
_generate_si_report(result, report)
|
|
193
|
+
|
|
194
|
+
return result
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def _generate_si_report(result: dict[str, Any], output_path: str) -> None:
|
|
198
|
+
"""Generate HTML report for signal integrity audit.
|
|
199
|
+
|
|
200
|
+
Args:
|
|
201
|
+
result: Signal integrity result dictionary.
|
|
202
|
+
output_path: Path to save HTML report.
|
|
203
|
+
"""
|
|
204
|
+
html = f"""
|
|
205
|
+
<html>
|
|
206
|
+
<head><title>Signal Integrity Audit Report</title></head>
|
|
207
|
+
<body>
|
|
208
|
+
<h1>Signal Integrity Audit Report</h1>
|
|
209
|
+
<h2>Eye Diagram Analysis</h2>
|
|
210
|
+
<table>
|
|
211
|
+
<tr><th>Parameter</th><th>Value</th><th>Units</th></tr>
|
|
212
|
+
<tr><td>Eye Height</td><td>{result["eye_height"] * 1e3:.2f}</td><td>mV</td></tr>
|
|
213
|
+
<tr><td>Eye Width</td><td>{result["eye_width"] * 1e12:.2f}</td><td>ps</td></tr>
|
|
214
|
+
<tr><td>RMS Jitter</td><td>{result["jitter_rms"] * 1e12:.2f}</td><td>ps</td></tr>
|
|
215
|
+
<tr><td>P-P Jitter</td><td>{result["jitter_pp"] * 1e12:.2f}</td><td>ps</td></tr>
|
|
216
|
+
<tr><td>SNR</td><td>{result["snr_db"]:.1f}</td><td>dB</td></tr>
|
|
217
|
+
<tr><td>Est. BER</td><td>{result["bit_error_rate_estimate"]:.2e}</td><td></td></tr>
|
|
218
|
+
<tr><td>Dominant Jitter</td><td>{result["dominant_jitter_source"]}</td><td></td></tr>
|
|
219
|
+
</table>
|
|
220
|
+
</body>
|
|
221
|
+
</html>
|
|
222
|
+
"""
|
|
223
|
+
with open(output_path, "w") as f:
|
|
224
|
+
f.write(html)
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
__all__ = ["signal_integrity_audit"]
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: oscura
|
|
3
|
+
Version: 0.1.1
|
|
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
|
+
Project-URL: Homepage, https://github.com/oscura-re/oscura
|
|
6
|
+
Project-URL: Documentation, https://github.com/oscura-re/oscura/tree/main/docs
|
|
7
|
+
Project-URL: Repository, https://github.com/oscura-re/oscura
|
|
8
|
+
Project-URL: Changelog, https://github.com/oscura-re/oscura/blob/main/CHANGELOG.md
|
|
9
|
+
Project-URL: Issue Tracker, https://github.com/oscura-re/oscura/issues
|
|
10
|
+
Project-URL: Discussions, https://github.com/oscura-re/oscura/discussions
|
|
11
|
+
License-Expression: MIT
|
|
12
|
+
License-File: LICENSE
|
|
13
|
+
Keywords: automotive-protocols,can-bus,crc-recovery,device-replication,embedded-systems,exploitation,hardware-reverse-engineering,hardware-security,i2c,ieee-compliance,logic-analyzer,obd-ii,oscilloscope,protocol-analysis,protocol-decoder,protocol-inference,reverse-engineering,right-to-repair,security-research,signal-analysis,spectral-analysis,spi,state-machine-learning,uart,unknown-protocol,vulnerability-analysis,waveform-analysis
|
|
14
|
+
Classifier: Development Status :: 3 - Alpha
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: Intended Audience :: Information Technology
|
|
17
|
+
Classifier: Intended Audience :: Science/Research
|
|
18
|
+
Classifier: Intended Audience :: Telecommunications Industry
|
|
19
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
20
|
+
Classifier: Operating System :: OS Independent
|
|
21
|
+
Classifier: Programming Language :: Python :: 3
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
24
|
+
Classifier: Topic :: Scientific/Engineering
|
|
25
|
+
Classifier: Topic :: Scientific/Engineering :: Information Analysis
|
|
26
|
+
Classifier: Topic :: Security
|
|
27
|
+
Classifier: Topic :: System :: Hardware
|
|
28
|
+
Classifier: Topic :: System :: Hardware :: Hardware Drivers
|
|
29
|
+
Classifier: Typing :: Typed
|
|
30
|
+
Requires-Python: >=3.12
|
|
31
|
+
Requires-Dist: click<9.0.0,>=8.1.0
|
|
32
|
+
Requires-Dist: dpkt<2.0.0,>=1.9.0
|
|
33
|
+
Requires-Dist: jinja2<4.0.0,>=3.1
|
|
34
|
+
Requires-Dist: matplotlib<4.0.0,>=3.7.0
|
|
35
|
+
Requires-Dist: numpy<3.0.0,>=1.24.0
|
|
36
|
+
Requires-Dist: pandas<3.0.0,>=2.0.0
|
|
37
|
+
Requires-Dist: psutil<7.0.0,>=5.9.0
|
|
38
|
+
Requires-Dist: pyyaml<7.0.0,>=6.0
|
|
39
|
+
Requires-Dist: scipy<2.0.0,>=1.10.0
|
|
40
|
+
Requires-Dist: tm-data-types<1.0.0,>=0.3.0
|
|
41
|
+
Provides-Extra: all
|
|
42
|
+
Requires-Dist: asammdf<8.0.0,>=7.4.0; extra == 'all'
|
|
43
|
+
Requires-Dist: cantools<40.0.0,>=39.4.0; extra == 'all'
|
|
44
|
+
Requires-Dist: check-jsonschema<1.0.0,>=0.29.0; extra == 'all'
|
|
45
|
+
Requires-Dist: h5py<4.0.0,>=3.0.0; extra == 'all'
|
|
46
|
+
Requires-Dist: hypothesis<7.0.0,>=6.0.0; extra == 'all'
|
|
47
|
+
Requires-Dist: interrogate<2.0.0,>=1.7.0; extra == 'all'
|
|
48
|
+
Requires-Dist: ipython<9.0.0,>=8.0.0; extra == 'all'
|
|
49
|
+
Requires-Dist: jupyter<2.0.0,>=1.0.0; extra == 'all'
|
|
50
|
+
Requires-Dist: nbconvert<8.0.0,>=7.0.0; extra == 'all'
|
|
51
|
+
Requires-Dist: networkx<4.0.0,>=3.0; extra == 'all'
|
|
52
|
+
Requires-Dist: nptdms<2.0.0,>=1.7.0; extra == 'all'
|
|
53
|
+
Requires-Dist: openpyxl<4.0.0,>=3.0.0; extra == 'all'
|
|
54
|
+
Requires-Dist: pytest-cov<8.0.0,>=6.0; extra == 'all'
|
|
55
|
+
Requires-Dist: pytest-timeout<3.0.0,>=2.3.0; extra == 'all'
|
|
56
|
+
Requires-Dist: pytest<10.0.0,>=8.0; extra == 'all'
|
|
57
|
+
Requires-Dist: python-can<5.0.0,>=4.4.0; extra == 'all'
|
|
58
|
+
Requires-Dist: python-pptx<1.0.0,>=0.6.21; extra == 'all'
|
|
59
|
+
Requires-Dist: pywavelets<2.0.0,>=1.0.0; extra == 'all'
|
|
60
|
+
Requires-Dist: reportlab<6.0.0,>=4.4.7; extra == 'all'
|
|
61
|
+
Requires-Dist: rigolwfm<2.0.0,>=1.0.0; extra == 'all'
|
|
62
|
+
Requires-Dist: scapy<3.0.0,>=2.5.0; extra == 'all'
|
|
63
|
+
Requires-Dist: types-pyyaml<7.0.0,>=6.0; extra == 'all'
|
|
64
|
+
Requires-Dist: yamllint<2.0.0,>=1.35; extra == 'all'
|
|
65
|
+
Provides-Extra: analysis
|
|
66
|
+
Requires-Dist: networkx<4.0.0,>=3.0; extra == 'analysis'
|
|
67
|
+
Requires-Dist: openpyxl<4.0.0,>=3.0.0; extra == 'analysis'
|
|
68
|
+
Requires-Dist: pywavelets<2.0.0,>=1.0.0; extra == 'analysis'
|
|
69
|
+
Provides-Extra: automotive
|
|
70
|
+
Requires-Dist: asammdf<8.0.0,>=7.4.0; extra == 'automotive'
|
|
71
|
+
Requires-Dist: cantools<40.0.0,>=39.4.0; extra == 'automotive'
|
|
72
|
+
Requires-Dist: python-can<5.0.0,>=4.4.0; extra == 'automotive'
|
|
73
|
+
Requires-Dist: scapy<3.0.0,>=2.5.0; extra == 'automotive'
|
|
74
|
+
Provides-Extra: dev
|
|
75
|
+
Requires-Dist: check-jsonschema<1.0.0,>=0.29.0; extra == 'dev'
|
|
76
|
+
Requires-Dist: hypothesis<7.0.0,>=6.0.0; extra == 'dev'
|
|
77
|
+
Requires-Dist: interrogate<2.0.0,>=1.7.0; extra == 'dev'
|
|
78
|
+
Requires-Dist: pytest-cov<8.0.0,>=6.0; extra == 'dev'
|
|
79
|
+
Requires-Dist: pytest-timeout<3.0.0,>=2.3.0; extra == 'dev'
|
|
80
|
+
Requires-Dist: pytest<10.0.0,>=8.0; extra == 'dev'
|
|
81
|
+
Requires-Dist: types-pyyaml<7.0.0,>=6.0; extra == 'dev'
|
|
82
|
+
Requires-Dist: yamllint<2.0.0,>=1.35; extra == 'dev'
|
|
83
|
+
Provides-Extra: hdf5
|
|
84
|
+
Requires-Dist: h5py<4.0.0,>=3.0.0; extra == 'hdf5'
|
|
85
|
+
Provides-Extra: jupyter
|
|
86
|
+
Requires-Dist: ipython<9.0.0,>=8.0.0; extra == 'jupyter'
|
|
87
|
+
Requires-Dist: jupyter<2.0.0,>=1.0.0; extra == 'jupyter'
|
|
88
|
+
Requires-Dist: nbconvert<8.0.0,>=7.0.0; extra == 'jupyter'
|
|
89
|
+
Provides-Extra: oscilloscopes
|
|
90
|
+
Requires-Dist: nptdms<2.0.0,>=1.7.0; extra == 'oscilloscopes'
|
|
91
|
+
Requires-Dist: rigolwfm<2.0.0,>=1.0.0; extra == 'oscilloscopes'
|
|
92
|
+
Provides-Extra: reporting
|
|
93
|
+
Requires-Dist: python-pptx<1.0.0,>=0.6.21; extra == 'reporting'
|
|
94
|
+
Requires-Dist: reportlab<6.0.0,>=4.4.7; extra == 'reporting'
|
|
95
|
+
Description-Content-Type: text/markdown
|
|
96
|
+
|
|
97
|
+
# Oscura
|
|
98
|
+
|
|
99
|
+
**Unified hardware reverse engineering framework. Extract all information from any system through signals and data.**
|
|
100
|
+
|
|
101
|
+
[](https://badge.fury.io/py/oscura)
|
|
102
|
+
[](https://www.python.org/downloads/)
|
|
103
|
+
[](https://opensource.org/licenses/MIT)
|
|
104
|
+
[](https://github.com/oscura-re/oscura/actions)
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## What is Oscura?
|
|
109
|
+
|
|
110
|
+
Oscura is a hardware reverse engineering framework for security researchers, right-to-repair advocates, defense analysts, and commercial intelligence teams. From oscilloscope captures to complete system understanding.
|
|
111
|
+
|
|
112
|
+
**Reverse Engineering**: Unknown protocol discovery • State machine extraction • CRC/checksum recovery • Proprietary device replication • Security vulnerability analysis
|
|
113
|
+
**Signal Analysis**: IEEE-compliant measurements (181/1241/1459/2414) • Comprehensive protocol decoding (16+ protocols) • Spectral analysis • Timing characterization
|
|
114
|
+
**Built For**: Exploitation • Replication • Defense analysis • Commercial intelligence • Right-to-repair
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## Installation
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
# Using uv (recommended)
|
|
122
|
+
uv pip install oscura
|
|
123
|
+
|
|
124
|
+
# Or with pip
|
|
125
|
+
pip install oscura
|
|
126
|
+
|
|
127
|
+
# Development install
|
|
128
|
+
git clone https://github.com/oscura-re/oscura.git
|
|
129
|
+
cd oscura
|
|
130
|
+
uv sync --all-extras
|
|
131
|
+
./scripts/setup/install-hooks.sh
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## Quick Start
|
|
137
|
+
|
|
138
|
+
```python
|
|
139
|
+
import oscura as osc
|
|
140
|
+
|
|
141
|
+
# Load oscilloscope capture
|
|
142
|
+
trace = osc.load("capture.wfm")
|
|
143
|
+
|
|
144
|
+
# Basic measurements
|
|
145
|
+
print(f"Frequency: {osc.frequency(trace) / 1e6:.3f} MHz")
|
|
146
|
+
print(f"Rise time: {osc.rise_time(trace) * 1e9:.1f} ns")
|
|
147
|
+
|
|
148
|
+
# Decode protocol
|
|
149
|
+
from oscura.protocols import UARTDecoder
|
|
150
|
+
decoder = UARTDecoder(baud_rate=115200)
|
|
151
|
+
messages = decoder.decode(trace)
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## Learn by Example
|
|
157
|
+
|
|
158
|
+
**Demos are the documentation.** Each category includes working code with comprehensive explanations.
|
|
159
|
+
|
|
160
|
+
### Core Capabilities
|
|
161
|
+
|
|
162
|
+
| Demo | Description |
|
|
163
|
+
|------|-------------|
|
|
164
|
+
| [01_waveform_analysis](demos/01_waveform_analysis/) | Load and analyze Tektronix, Rigol, LeCroy captures |
|
|
165
|
+
| [02_file_format_io](demos/02_file_format_io/) | CSV, HDF5, NumPy, custom binary formats |
|
|
166
|
+
| [03_custom_daq](demos/03_custom_daq/) | Streaming loaders for custom DAQ systems |
|
|
167
|
+
| [04_serial_protocols](demos/04_serial_protocols/) | UART, SPI, I2C, 1-Wire decoding |
|
|
168
|
+
| [05_protocol_decoding](demos/05_protocol_decoding/) | Protocol auto-detection and decoding |
|
|
169
|
+
| [06_udp_packet_analysis](demos/06_udp_packet_analysis/) | Network packet capture and analysis |
|
|
170
|
+
|
|
171
|
+
### Advanced Analysis
|
|
172
|
+
|
|
173
|
+
| Demo | Description |
|
|
174
|
+
|------|-------------|
|
|
175
|
+
| [07_protocol_inference](demos/07_protocol_inference/) | State machine learning, CRC reverse engineering |
|
|
176
|
+
| [08_automotive_protocols](demos/08_automotive_protocols/) | CAN, CAN-FD, LIN, FlexRay analysis |
|
|
177
|
+
| [09_automotive](demos/09_automotive/) | OBD-II, UDS, J1939 diagnostics |
|
|
178
|
+
| [10_timing_measurements](demos/10_timing_measurements/) | Rise/fall time, duty cycle (IEEE 181) |
|
|
179
|
+
| [11_mixed_signal](demos/11_mixed_signal/) | Analog + digital combined analysis |
|
|
180
|
+
| [12_spectral_compliance](demos/12_spectral_compliance/) | FFT, THD, SNR, SINAD (IEEE 1241) |
|
|
181
|
+
| [13_jitter_analysis](demos/13_jitter_analysis/) | TIE, RJ/DJ, eye diagrams (IEEE 2414) |
|
|
182
|
+
| [14_power_analysis](demos/14_power_analysis/) | DC-DC, ripple, efficiency (IEEE 1459) |
|
|
183
|
+
| [15_signal_integrity](demos/15_signal_integrity/) | TDR, S-parameters, setup/hold timing |
|
|
184
|
+
| [16_emc_compliance](demos/16_emc_compliance/) | CISPR, FCC, MIL-STD testing |
|
|
185
|
+
| [17_signal_reverse_engineering](demos/17_signal_reverse_engineering/) | Complete unknown signal analysis |
|
|
186
|
+
| [18_advanced_inference](demos/18_advanced_inference/) | Bayesian inference, Protocol DSL |
|
|
187
|
+
| [19_complete_workflows](demos/19_complete_workflows/) | End-to-end reverse engineering |
|
|
188
|
+
|
|
189
|
+
### Run Your First Demo
|
|
190
|
+
|
|
191
|
+
```bash
|
|
192
|
+
# Generate demo data
|
|
193
|
+
python demos/data_generation/generate_all_demo_data.py
|
|
194
|
+
|
|
195
|
+
# Run a demo
|
|
196
|
+
uv run python demos/01_waveform_analysis/comprehensive_wfm_analysis.py
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## Key Features
|
|
202
|
+
|
|
203
|
+
### Protocols (16+)
|
|
204
|
+
|
|
205
|
+
UART • SPI • I2C • 1-Wire • CAN • CAN-FD • LIN • FlexRay • JTAG • SWD • Manchester • Miller • USB • HDLC • I2S • MDIO • DMX512
|
|
206
|
+
|
|
207
|
+
### File Formats (18+)
|
|
208
|
+
|
|
209
|
+
Tektronix WFM • Rigol WFM • LeCroy TRC • Sigrok • VCD • CSV • NumPy • HDF5 • MATLAB • WAV • JSON • BLF • MF4 • PCAP • PCAPNG
|
|
210
|
+
|
|
211
|
+
### Standards Compliance
|
|
212
|
+
|
|
213
|
+
**IEEE 181-2011**: Rise/fall time, pulse width, overshoot
|
|
214
|
+
**IEEE 1241-2010**: SNR, SINAD, THD, SFDR, ENOB
|
|
215
|
+
**IEEE 1459-2010**: Power factor, harmonics, efficiency
|
|
216
|
+
**IEEE 2414-2020**: TIE, period jitter, RJ/DJ
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
## Command Line Interface
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
# Analyze a waveform
|
|
224
|
+
oscura analyze capture.wfm
|
|
225
|
+
|
|
226
|
+
# Decode protocol
|
|
227
|
+
oscura decode capture.wfm --protocol uart --baud 115200
|
|
228
|
+
|
|
229
|
+
# Generate report
|
|
230
|
+
oscura report capture.wfm -o report.pdf
|
|
231
|
+
|
|
232
|
+
# Convert formats
|
|
233
|
+
oscura convert input.wfm output.csv
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
See [CLI Reference](docs/cli.md) for complete documentation.
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## Contributing
|
|
241
|
+
|
|
242
|
+
We welcome contributions! See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and guidelines.
|
|
243
|
+
|
|
244
|
+
```bash
|
|
245
|
+
# Quick setup
|
|
246
|
+
git clone https://github.com/oscura-re/oscura.git
|
|
247
|
+
cd oscura
|
|
248
|
+
uv sync --all-extras
|
|
249
|
+
./scripts/setup/install-hooks.sh
|
|
250
|
+
|
|
251
|
+
# Run tests
|
|
252
|
+
./scripts/test.sh
|
|
253
|
+
|
|
254
|
+
# Quality checks
|
|
255
|
+
./scripts/check.sh
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
---
|
|
259
|
+
|
|
260
|
+
## Documentation
|
|
261
|
+
|
|
262
|
+
- **[Demos](demos/)** - Start here (working examples)
|
|
263
|
+
- **[API Reference](docs/api/)** - Complete API documentation
|
|
264
|
+
- **[CLI Reference](docs/cli.md)** - Command line usage
|
|
265
|
+
- **[Testing Guide](docs/testing/)** - Test suite architecture
|
|
266
|
+
- **[CHANGELOG](CHANGELOG.md)** - Version history
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
## License
|
|
271
|
+
|
|
272
|
+
MIT License - see [LICENSE](LICENSE) for details.
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
## Citation
|
|
277
|
+
|
|
278
|
+
If you use Oscura in research:
|
|
279
|
+
|
|
280
|
+
```bibtex
|
|
281
|
+
@software{oscura,
|
|
282
|
+
title = {Oscura: Signal Reverse Engineering Toolkit},
|
|
283
|
+
author = {Oscura Contributors},
|
|
284
|
+
year = {2026},
|
|
285
|
+
url = {https://github.com/oscura-re/oscura}
|
|
286
|
+
}
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
Machine-readable: [CITATION.cff](CITATION.cff)
|
|
290
|
+
|
|
291
|
+
---
|
|
292
|
+
|
|
293
|
+
## Support
|
|
294
|
+
|
|
295
|
+
- **[GitHub Issues](https://github.com/oscura-re/oscura/issues)** - Bug reports and feature requests
|
|
296
|
+
- **[Discussions](https://github.com/oscura-re/oscura/discussions)** - Questions and community
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
**Oscura** • Reverse engineer any system from captured waveforms
|