oscura 0.5.1__py3-none-any.whl → 0.7.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- oscura/__init__.py +169 -167
- oscura/analyzers/__init__.py +3 -0
- oscura/analyzers/classification.py +659 -0
- oscura/analyzers/digital/edges.py +325 -65
- oscura/analyzers/digital/quality.py +293 -166
- oscura/analyzers/digital/timing.py +260 -115
- oscura/analyzers/digital/timing_numba.py +334 -0
- oscura/analyzers/entropy.py +605 -0
- oscura/analyzers/eye/diagram.py +176 -109
- oscura/analyzers/eye/metrics.py +5 -5
- oscura/analyzers/jitter/__init__.py +6 -4
- oscura/analyzers/jitter/ber.py +52 -52
- oscura/analyzers/jitter/classification.py +156 -0
- oscura/analyzers/jitter/decomposition.py +163 -113
- oscura/analyzers/jitter/spectrum.py +80 -64
- oscura/analyzers/ml/__init__.py +39 -0
- oscura/analyzers/ml/features.py +600 -0
- oscura/analyzers/ml/signal_classifier.py +604 -0
- oscura/analyzers/packet/daq.py +246 -158
- oscura/analyzers/packet/parser.py +12 -1
- oscura/analyzers/packet/payload.py +50 -2110
- oscura/analyzers/packet/payload_analysis.py +361 -181
- oscura/analyzers/packet/payload_patterns.py +133 -70
- oscura/analyzers/packet/stream.py +84 -23
- oscura/analyzers/patterns/__init__.py +26 -5
- oscura/analyzers/patterns/anomaly_detection.py +908 -0
- oscura/analyzers/patterns/clustering.py +169 -108
- oscura/analyzers/patterns/clustering_optimized.py +227 -0
- oscura/analyzers/patterns/discovery.py +1 -1
- oscura/analyzers/patterns/matching.py +581 -197
- oscura/analyzers/patterns/pattern_mining.py +778 -0
- oscura/analyzers/patterns/periodic.py +121 -38
- oscura/analyzers/patterns/sequences.py +175 -78
- oscura/analyzers/power/conduction.py +1 -1
- oscura/analyzers/power/soa.py +6 -6
- oscura/analyzers/power/switching.py +250 -110
- oscura/analyzers/protocol/__init__.py +17 -1
- oscura/analyzers/protocols/base.py +6 -6
- oscura/analyzers/protocols/ble/__init__.py +38 -0
- oscura/analyzers/protocols/ble/analyzer.py +809 -0
- oscura/analyzers/protocols/ble/uuids.py +288 -0
- oscura/analyzers/protocols/can.py +257 -127
- oscura/analyzers/protocols/can_fd.py +107 -80
- oscura/analyzers/protocols/flexray.py +139 -80
- oscura/analyzers/protocols/hdlc.py +93 -58
- oscura/analyzers/protocols/i2c.py +247 -106
- oscura/analyzers/protocols/i2s.py +138 -86
- oscura/analyzers/protocols/industrial/__init__.py +40 -0
- oscura/analyzers/protocols/industrial/bacnet/__init__.py +33 -0
- oscura/analyzers/protocols/industrial/bacnet/analyzer.py +708 -0
- oscura/analyzers/protocols/industrial/bacnet/encoding.py +412 -0
- oscura/analyzers/protocols/industrial/bacnet/services.py +622 -0
- oscura/analyzers/protocols/industrial/ethercat/__init__.py +30 -0
- oscura/analyzers/protocols/industrial/ethercat/analyzer.py +474 -0
- oscura/analyzers/protocols/industrial/ethercat/mailbox.py +339 -0
- oscura/analyzers/protocols/industrial/ethercat/topology.py +166 -0
- oscura/analyzers/protocols/industrial/modbus/__init__.py +31 -0
- oscura/analyzers/protocols/industrial/modbus/analyzer.py +525 -0
- oscura/analyzers/protocols/industrial/modbus/crc.py +79 -0
- oscura/analyzers/protocols/industrial/modbus/functions.py +436 -0
- oscura/analyzers/protocols/industrial/opcua/__init__.py +21 -0
- oscura/analyzers/protocols/industrial/opcua/analyzer.py +552 -0
- oscura/analyzers/protocols/industrial/opcua/datatypes.py +446 -0
- oscura/analyzers/protocols/industrial/opcua/services.py +264 -0
- oscura/analyzers/protocols/industrial/profinet/__init__.py +23 -0
- oscura/analyzers/protocols/industrial/profinet/analyzer.py +441 -0
- oscura/analyzers/protocols/industrial/profinet/dcp.py +263 -0
- oscura/analyzers/protocols/industrial/profinet/ptcp.py +200 -0
- oscura/analyzers/protocols/jtag.py +180 -98
- oscura/analyzers/protocols/lin.py +219 -114
- oscura/analyzers/protocols/manchester.py +4 -4
- oscura/analyzers/protocols/onewire.py +253 -149
- oscura/analyzers/protocols/parallel_bus/__init__.py +20 -0
- oscura/analyzers/protocols/parallel_bus/centronics.py +92 -0
- oscura/analyzers/protocols/parallel_bus/gpib.py +137 -0
- oscura/analyzers/protocols/spi.py +192 -95
- oscura/analyzers/protocols/swd.py +321 -167
- oscura/analyzers/protocols/uart.py +267 -125
- oscura/analyzers/protocols/usb.py +235 -131
- oscura/analyzers/side_channel/power.py +17 -12
- oscura/analyzers/signal/__init__.py +15 -0
- oscura/analyzers/signal/timing_analysis.py +1086 -0
- oscura/analyzers/signal_integrity/__init__.py +4 -1
- oscura/analyzers/signal_integrity/sparams.py +2 -19
- oscura/analyzers/spectral/chunked.py +129 -60
- oscura/analyzers/spectral/chunked_fft.py +300 -94
- oscura/analyzers/spectral/chunked_wavelet.py +100 -80
- oscura/analyzers/statistical/checksum.py +376 -217
- oscura/analyzers/statistical/classification.py +229 -107
- oscura/analyzers/statistical/entropy.py +78 -53
- oscura/analyzers/statistics/correlation.py +407 -211
- oscura/analyzers/statistics/outliers.py +2 -2
- oscura/analyzers/statistics/streaming.py +30 -5
- oscura/analyzers/validation.py +216 -101
- oscura/analyzers/waveform/measurements.py +9 -0
- oscura/analyzers/waveform/measurements_with_uncertainty.py +31 -15
- oscura/analyzers/waveform/spectral.py +500 -228
- oscura/api/__init__.py +31 -5
- oscura/api/dsl/__init__.py +582 -0
- oscura/{dsl → api/dsl}/commands.py +43 -76
- oscura/{dsl → api/dsl}/interpreter.py +26 -51
- oscura/{dsl → api/dsl}/parser.py +107 -77
- oscura/{dsl → api/dsl}/repl.py +2 -2
- oscura/api/dsl.py +1 -1
- oscura/{integrations → api/integrations}/__init__.py +1 -1
- oscura/{integrations → api/integrations}/llm.py +201 -102
- oscura/api/operators.py +3 -3
- oscura/api/optimization.py +144 -30
- oscura/api/rest_server.py +921 -0
- oscura/api/server/__init__.py +17 -0
- oscura/api/server/dashboard.py +850 -0
- oscura/api/server/static/README.md +34 -0
- oscura/api/server/templates/base.html +181 -0
- oscura/api/server/templates/export.html +120 -0
- oscura/api/server/templates/home.html +284 -0
- oscura/api/server/templates/protocols.html +58 -0
- oscura/api/server/templates/reports.html +43 -0
- oscura/api/server/templates/session_detail.html +89 -0
- oscura/api/server/templates/sessions.html +83 -0
- oscura/api/server/templates/waveforms.html +73 -0
- oscura/automotive/__init__.py +8 -1
- oscura/automotive/can/__init__.py +10 -0
- oscura/automotive/can/checksum.py +3 -1
- oscura/automotive/can/dbc_generator.py +590 -0
- oscura/automotive/can/message_wrapper.py +121 -74
- oscura/automotive/can/patterns.py +98 -21
- oscura/automotive/can/session.py +292 -56
- oscura/automotive/can/state_machine.py +6 -3
- oscura/automotive/can/stimulus_response.py +97 -75
- oscura/automotive/dbc/__init__.py +10 -2
- oscura/automotive/dbc/generator.py +84 -56
- oscura/automotive/dbc/parser.py +6 -6
- oscura/automotive/dtc/data.json +17 -102
- oscura/automotive/dtc/database.py +2 -2
- oscura/automotive/flexray/__init__.py +31 -0
- oscura/automotive/flexray/analyzer.py +504 -0
- oscura/automotive/flexray/crc.py +185 -0
- oscura/automotive/flexray/fibex.py +449 -0
- oscura/automotive/j1939/__init__.py +45 -8
- oscura/automotive/j1939/analyzer.py +605 -0
- oscura/automotive/j1939/spns.py +326 -0
- oscura/automotive/j1939/transport.py +306 -0
- oscura/automotive/lin/__init__.py +47 -0
- oscura/automotive/lin/analyzer.py +612 -0
- oscura/automotive/loaders/blf.py +13 -2
- oscura/automotive/loaders/csv_can.py +143 -72
- oscura/automotive/loaders/dispatcher.py +50 -2
- oscura/automotive/loaders/mdf.py +86 -45
- oscura/automotive/loaders/pcap.py +111 -61
- oscura/automotive/uds/__init__.py +4 -0
- oscura/automotive/uds/analyzer.py +725 -0
- oscura/automotive/uds/decoder.py +140 -58
- oscura/automotive/uds/models.py +7 -1
- oscura/automotive/visualization.py +1 -1
- oscura/cli/analyze.py +348 -0
- oscura/cli/batch.py +142 -122
- oscura/cli/benchmark.py +275 -0
- oscura/cli/characterize.py +137 -82
- oscura/cli/compare.py +224 -131
- oscura/cli/completion.py +250 -0
- oscura/cli/config_cmd.py +361 -0
- oscura/cli/decode.py +164 -87
- oscura/cli/export.py +286 -0
- oscura/cli/main.py +115 -31
- oscura/{onboarding → cli/onboarding}/__init__.py +3 -3
- oscura/{onboarding → cli/onboarding}/help.py +80 -58
- oscura/{onboarding → cli/onboarding}/tutorials.py +97 -72
- oscura/{onboarding → cli/onboarding}/wizard.py +55 -36
- oscura/cli/progress.py +147 -0
- oscura/cli/shell.py +157 -135
- oscura/cli/validate_cmd.py +204 -0
- oscura/cli/visualize.py +158 -0
- oscura/convenience.py +125 -79
- oscura/core/__init__.py +4 -2
- oscura/core/backend_selector.py +3 -3
- oscura/core/cache.py +126 -15
- oscura/core/cancellation.py +1 -1
- oscura/{config → core/config}/__init__.py +20 -11
- oscura/{config → core/config}/defaults.py +1 -1
- oscura/{config → core/config}/loader.py +7 -5
- oscura/{config → core/config}/memory.py +5 -5
- oscura/{config → core/config}/migration.py +1 -1
- oscura/{config → core/config}/pipeline.py +99 -23
- oscura/{config → core/config}/preferences.py +1 -1
- oscura/{config → core/config}/protocol.py +3 -3
- oscura/{config → core/config}/schema.py +426 -272
- oscura/{config → core/config}/settings.py +1 -1
- oscura/{config → core/config}/thresholds.py +195 -153
- oscura/core/correlation.py +5 -6
- oscura/core/cross_domain.py +0 -2
- oscura/core/debug.py +9 -5
- oscura/{extensibility → core/extensibility}/docs.py +158 -70
- oscura/{extensibility → core/extensibility}/extensions.py +160 -76
- oscura/{extensibility → core/extensibility}/logging.py +1 -1
- oscura/{extensibility → core/extensibility}/measurements.py +1 -1
- oscura/{extensibility → core/extensibility}/plugins.py +1 -1
- oscura/{extensibility → core/extensibility}/templates.py +73 -3
- oscura/{extensibility → core/extensibility}/validation.py +1 -1
- oscura/core/gpu_backend.py +11 -7
- oscura/core/log_query.py +101 -11
- oscura/core/logging.py +126 -54
- oscura/core/logging_advanced.py +5 -5
- oscura/core/memory_limits.py +108 -70
- oscura/core/memory_monitor.py +2 -2
- oscura/core/memory_progress.py +7 -7
- oscura/core/memory_warnings.py +1 -1
- oscura/core/numba_backend.py +13 -13
- oscura/{plugins → core/plugins}/__init__.py +9 -9
- oscura/{plugins → core/plugins}/base.py +7 -7
- oscura/{plugins → core/plugins}/cli.py +3 -3
- oscura/{plugins → core/plugins}/discovery.py +186 -106
- oscura/{plugins → core/plugins}/lifecycle.py +1 -1
- oscura/{plugins → core/plugins}/manager.py +7 -7
- oscura/{plugins → core/plugins}/registry.py +3 -3
- oscura/{plugins → core/plugins}/versioning.py +1 -1
- oscura/core/progress.py +16 -1
- oscura/core/provenance.py +8 -2
- oscura/{schemas → core/schemas}/__init__.py +2 -2
- oscura/{schemas → core/schemas}/device_mapping.json +2 -8
- oscura/{schemas → core/schemas}/packet_format.json +4 -24
- oscura/{schemas → core/schemas}/protocol_definition.json +2 -12
- oscura/core/types.py +4 -0
- oscura/core/uncertainty.py +3 -3
- oscura/correlation/__init__.py +52 -0
- oscura/correlation/multi_protocol.py +811 -0
- oscura/discovery/auto_decoder.py +117 -35
- oscura/discovery/comparison.py +191 -86
- oscura/discovery/quality_validator.py +155 -68
- oscura/discovery/signal_detector.py +196 -79
- oscura/export/__init__.py +18 -8
- oscura/export/kaitai_struct.py +513 -0
- oscura/export/scapy_layer.py +801 -0
- oscura/export/wireshark/generator.py +1 -1
- oscura/export/wireshark/templates/dissector.lua.j2 +2 -2
- oscura/export/wireshark_dissector.py +746 -0
- oscura/guidance/wizard.py +207 -111
- oscura/hardware/__init__.py +19 -0
- oscura/{acquisition → hardware/acquisition}/__init__.py +4 -4
- oscura/{acquisition → hardware/acquisition}/file.py +2 -2
- oscura/{acquisition → hardware/acquisition}/hardware.py +7 -7
- oscura/{acquisition → hardware/acquisition}/saleae.py +15 -12
- oscura/{acquisition → hardware/acquisition}/socketcan.py +1 -1
- oscura/{acquisition → hardware/acquisition}/streaming.py +2 -2
- oscura/{acquisition → hardware/acquisition}/synthetic.py +3 -3
- oscura/{acquisition → hardware/acquisition}/visa.py +33 -11
- oscura/hardware/firmware/__init__.py +29 -0
- oscura/hardware/firmware/pattern_recognition.py +874 -0
- oscura/hardware/hal_detector.py +736 -0
- oscura/hardware/security/__init__.py +37 -0
- oscura/hardware/security/side_channel_detector.py +1126 -0
- oscura/inference/__init__.py +4 -0
- oscura/inference/active_learning/observation_table.py +4 -1
- oscura/inference/alignment.py +216 -123
- oscura/inference/bayesian.py +113 -33
- oscura/inference/crc_reverse.py +101 -55
- oscura/inference/logic.py +6 -2
- oscura/inference/message_format.py +342 -183
- oscura/inference/protocol.py +95 -44
- oscura/inference/protocol_dsl.py +180 -82
- oscura/inference/signal_intelligence.py +1439 -706
- oscura/inference/spectral.py +99 -57
- oscura/inference/state_machine.py +810 -158
- oscura/inference/stream.py +270 -110
- oscura/iot/__init__.py +34 -0
- oscura/iot/coap/__init__.py +32 -0
- oscura/iot/coap/analyzer.py +668 -0
- oscura/iot/coap/options.py +212 -0
- oscura/iot/lorawan/__init__.py +21 -0
- oscura/iot/lorawan/crypto.py +206 -0
- oscura/iot/lorawan/decoder.py +801 -0
- oscura/iot/lorawan/mac_commands.py +341 -0
- oscura/iot/mqtt/__init__.py +27 -0
- oscura/iot/mqtt/analyzer.py +999 -0
- oscura/iot/mqtt/properties.py +315 -0
- oscura/iot/zigbee/__init__.py +31 -0
- oscura/iot/zigbee/analyzer.py +615 -0
- oscura/iot/zigbee/security.py +153 -0
- oscura/iot/zigbee/zcl.py +349 -0
- oscura/jupyter/display.py +125 -45
- oscura/{exploratory → jupyter/exploratory}/__init__.py +8 -8
- oscura/{exploratory → jupyter/exploratory}/error_recovery.py +298 -141
- oscura/jupyter/exploratory/fuzzy.py +746 -0
- oscura/{exploratory → jupyter/exploratory}/fuzzy_advanced.py +258 -100
- oscura/{exploratory → jupyter/exploratory}/legacy.py +464 -242
- oscura/{exploratory → jupyter/exploratory}/parse.py +167 -145
- oscura/{exploratory → jupyter/exploratory}/recovery.py +119 -87
- oscura/jupyter/exploratory/sync.py +612 -0
- oscura/{exploratory → jupyter/exploratory}/unknown.py +299 -176
- oscura/jupyter/magic.py +4 -4
- oscura/{ui → jupyter/ui}/__init__.py +2 -2
- oscura/{ui → jupyter/ui}/formatters.py +3 -3
- oscura/{ui → jupyter/ui}/progressive_display.py +153 -82
- oscura/loaders/__init__.py +183 -67
- oscura/loaders/binary.py +88 -1
- oscura/loaders/chipwhisperer.py +153 -137
- oscura/loaders/configurable.py +208 -86
- oscura/loaders/csv_loader.py +458 -215
- oscura/loaders/hdf5_loader.py +278 -119
- oscura/loaders/lazy.py +87 -54
- oscura/loaders/mmap_loader.py +1 -1
- oscura/loaders/numpy_loader.py +253 -116
- oscura/loaders/pcap.py +226 -151
- oscura/loaders/rigol.py +110 -49
- oscura/loaders/sigrok.py +201 -78
- oscura/loaders/tdms.py +81 -58
- oscura/loaders/tektronix.py +291 -174
- oscura/loaders/touchstone.py +182 -87
- oscura/loaders/tss.py +456 -0
- oscura/loaders/vcd.py +215 -117
- oscura/loaders/wav.py +155 -68
- oscura/reporting/__init__.py +9 -0
- oscura/reporting/analyze.py +352 -146
- oscura/reporting/argument_preparer.py +69 -14
- oscura/reporting/auto_report.py +97 -61
- oscura/reporting/batch.py +131 -58
- oscura/reporting/chart_selection.py +57 -45
- oscura/reporting/comparison.py +63 -17
- oscura/reporting/content/executive.py +76 -24
- oscura/reporting/core_formats/multi_format.py +11 -8
- oscura/reporting/engine.py +312 -158
- oscura/reporting/enhanced_reports.py +949 -0
- oscura/reporting/export.py +86 -43
- oscura/reporting/formatting/numbers.py +69 -42
- oscura/reporting/html.py +139 -58
- oscura/reporting/index.py +137 -65
- oscura/reporting/output.py +158 -67
- oscura/reporting/pdf.py +67 -102
- oscura/reporting/plots.py +191 -112
- oscura/reporting/sections.py +88 -47
- oscura/reporting/standards.py +104 -61
- oscura/reporting/summary_generator.py +75 -55
- oscura/reporting/tables.py +138 -54
- oscura/reporting/templates/enhanced/protocol_re.html +525 -0
- oscura/sessions/__init__.py +14 -23
- oscura/sessions/base.py +3 -3
- oscura/sessions/blackbox.py +106 -10
- oscura/sessions/generic.py +2 -2
- oscura/sessions/legacy.py +783 -0
- oscura/side_channel/__init__.py +63 -0
- oscura/side_channel/dpa.py +1025 -0
- oscura/utils/__init__.py +15 -1
- oscura/utils/bitwise.py +118 -0
- oscura/{builders → utils/builders}/__init__.py +1 -1
- oscura/{comparison → utils/comparison}/__init__.py +6 -6
- oscura/{comparison → utils/comparison}/compare.py +202 -101
- oscura/{comparison → utils/comparison}/golden.py +83 -63
- oscura/{comparison → utils/comparison}/limits.py +313 -89
- oscura/{comparison → utils/comparison}/mask.py +151 -45
- oscura/{comparison → utils/comparison}/trace_diff.py +1 -1
- oscura/{comparison → utils/comparison}/visualization.py +147 -89
- oscura/{component → utils/component}/__init__.py +3 -3
- oscura/{component → utils/component}/impedance.py +122 -58
- oscura/{component → utils/component}/reactive.py +165 -168
- oscura/{component → utils/component}/transmission_line.py +3 -3
- oscura/{filtering → utils/filtering}/__init__.py +6 -6
- oscura/{filtering → utils/filtering}/base.py +1 -1
- oscura/{filtering → utils/filtering}/convenience.py +2 -2
- oscura/{filtering → utils/filtering}/design.py +169 -93
- oscura/{filtering → utils/filtering}/filters.py +2 -2
- oscura/{filtering → utils/filtering}/introspection.py +2 -2
- oscura/utils/geometry.py +31 -0
- oscura/utils/imports.py +184 -0
- oscura/utils/lazy.py +1 -1
- oscura/{math → utils/math}/__init__.py +2 -2
- oscura/{math → utils/math}/arithmetic.py +114 -48
- oscura/{math → utils/math}/interpolation.py +139 -106
- oscura/utils/memory.py +129 -66
- oscura/utils/memory_advanced.py +92 -9
- oscura/utils/memory_extensions.py +10 -8
- oscura/{optimization → utils/optimization}/__init__.py +1 -1
- oscura/{optimization → utils/optimization}/search.py +2 -2
- oscura/utils/performance/__init__.py +58 -0
- oscura/utils/performance/caching.py +889 -0
- oscura/utils/performance/lsh_clustering.py +333 -0
- oscura/utils/performance/memory_optimizer.py +699 -0
- oscura/utils/performance/optimizations.py +675 -0
- oscura/utils/performance/parallel.py +654 -0
- oscura/utils/performance/profiling.py +661 -0
- oscura/{pipeline → utils/pipeline}/base.py +1 -1
- oscura/{pipeline → utils/pipeline}/composition.py +1 -1
- oscura/{pipeline → utils/pipeline}/parallel.py +3 -2
- oscura/{pipeline → utils/pipeline}/pipeline.py +1 -1
- oscura/{pipeline → utils/pipeline}/reverse_engineering.py +412 -221
- oscura/{search → utils/search}/__init__.py +3 -3
- oscura/{search → utils/search}/anomaly.py +188 -58
- oscura/utils/search/context.py +294 -0
- oscura/{search → utils/search}/pattern.py +138 -10
- oscura/utils/serial.py +51 -0
- oscura/utils/storage/__init__.py +61 -0
- oscura/utils/storage/database.py +1166 -0
- oscura/{streaming → utils/streaming}/chunked.py +302 -143
- oscura/{streaming → utils/streaming}/progressive.py +1 -1
- oscura/{streaming → utils/streaming}/realtime.py +3 -2
- oscura/{triggering → utils/triggering}/__init__.py +6 -6
- oscura/{triggering → utils/triggering}/base.py +6 -6
- oscura/{triggering → utils/triggering}/edge.py +2 -2
- oscura/{triggering → utils/triggering}/pattern.py +2 -2
- oscura/{triggering → utils/triggering}/pulse.py +115 -74
- oscura/{triggering → utils/triggering}/window.py +2 -2
- oscura/utils/validation.py +32 -0
- oscura/validation/__init__.py +121 -0
- oscura/{compliance → validation/compliance}/__init__.py +5 -5
- oscura/{compliance → validation/compliance}/advanced.py +5 -5
- oscura/{compliance → validation/compliance}/masks.py +1 -1
- oscura/{compliance → validation/compliance}/reporting.py +127 -53
- oscura/{compliance → validation/compliance}/testing.py +114 -52
- oscura/validation/compliance_tests.py +915 -0
- oscura/validation/fuzzer.py +990 -0
- oscura/validation/grammar_tests.py +596 -0
- oscura/validation/grammar_validator.py +904 -0
- oscura/validation/hil_testing.py +977 -0
- oscura/{quality → validation/quality}/__init__.py +4 -4
- oscura/{quality → validation/quality}/ensemble.py +251 -171
- oscura/{quality → validation/quality}/explainer.py +3 -3
- oscura/{quality → validation/quality}/scoring.py +1 -1
- oscura/{quality → validation/quality}/warnings.py +4 -4
- oscura/validation/regression_suite.py +808 -0
- oscura/validation/replay.py +788 -0
- oscura/{testing → validation/testing}/__init__.py +2 -2
- oscura/{testing → validation/testing}/synthetic.py +5 -5
- oscura/visualization/__init__.py +9 -0
- oscura/visualization/accessibility.py +1 -1
- oscura/visualization/annotations.py +64 -67
- oscura/visualization/colors.py +7 -7
- oscura/visualization/digital.py +180 -81
- oscura/visualization/eye.py +236 -85
- oscura/visualization/interactive.py +320 -143
- oscura/visualization/jitter.py +587 -247
- oscura/visualization/layout.py +169 -134
- oscura/visualization/optimization.py +103 -52
- oscura/visualization/palettes.py +1 -1
- oscura/visualization/power.py +427 -211
- oscura/visualization/power_extended.py +626 -297
- oscura/visualization/presets.py +2 -0
- oscura/visualization/protocols.py +495 -181
- oscura/visualization/render.py +79 -63
- oscura/visualization/reverse_engineering.py +171 -124
- oscura/visualization/signal_integrity.py +460 -279
- oscura/visualization/specialized.py +190 -100
- oscura/visualization/spectral.py +670 -255
- oscura/visualization/thumbnails.py +166 -137
- oscura/visualization/waveform.py +150 -63
- oscura/workflows/__init__.py +3 -0
- oscura/{batch → workflows/batch}/__init__.py +5 -5
- oscura/{batch → workflows/batch}/advanced.py +150 -75
- oscura/workflows/batch/aggregate.py +531 -0
- oscura/workflows/batch/analyze.py +236 -0
- oscura/{batch → workflows/batch}/logging.py +2 -2
- oscura/{batch → workflows/batch}/metrics.py +1 -1
- oscura/workflows/complete_re.py +1144 -0
- oscura/workflows/compliance.py +44 -54
- oscura/workflows/digital.py +197 -51
- oscura/workflows/legacy/__init__.py +12 -0
- oscura/{workflow → workflows/legacy}/dag.py +4 -1
- oscura/workflows/multi_trace.py +9 -9
- oscura/workflows/power.py +42 -62
- oscura/workflows/protocol.py +82 -49
- oscura/workflows/reverse_engineering.py +351 -150
- oscura/workflows/signal_integrity.py +157 -82
- oscura-0.7.0.dist-info/METADATA +661 -0
- oscura-0.7.0.dist-info/RECORD +591 -0
- oscura/batch/aggregate.py +0 -300
- oscura/batch/analyze.py +0 -139
- oscura/dsl/__init__.py +0 -73
- oscura/exceptions.py +0 -59
- oscura/exploratory/fuzzy.py +0 -513
- oscura/exploratory/sync.py +0 -384
- oscura/exporters/__init__.py +0 -94
- oscura/exporters/csv.py +0 -303
- oscura/exporters/exporters.py +0 -44
- oscura/exporters/hdf5.py +0 -217
- oscura/exporters/html_export.py +0 -701
- oscura/exporters/json_export.py +0 -291
- oscura/exporters/markdown_export.py +0 -367
- oscura/exporters/matlab_export.py +0 -354
- oscura/exporters/npz_export.py +0 -219
- oscura/exporters/spice_export.py +0 -210
- oscura/search/context.py +0 -149
- oscura/session/__init__.py +0 -34
- oscura/session/annotations.py +0 -289
- oscura/session/history.py +0 -313
- oscura/session/session.py +0 -520
- oscura/workflow/__init__.py +0 -13
- oscura-0.5.1.dist-info/METADATA +0 -583
- oscura-0.5.1.dist-info/RECORD +0 -481
- /oscura/core/{config.py → config/legacy.py} +0 -0
- /oscura/{extensibility → core/extensibility}/__init__.py +0 -0
- /oscura/{extensibility → core/extensibility}/registry.py +0 -0
- /oscura/{plugins → core/plugins}/isolation.py +0 -0
- /oscura/{schemas → core/schemas}/bus_configuration.json +0 -0
- /oscura/{builders → utils/builders}/signal_builder.py +0 -0
- /oscura/{optimization → utils/optimization}/parallel.py +0 -0
- /oscura/{pipeline → utils/pipeline}/__init__.py +0 -0
- /oscura/{streaming → utils/streaming}/__init__.py +0 -0
- {oscura-0.5.1.dist-info → oscura-0.7.0.dist-info}/WHEEL +0 -0
- {oscura-0.5.1.dist-info → oscura-0.7.0.dist-info}/entry_points.txt +0 -0
- {oscura-0.5.1.dist-info → oscura-0.7.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -6,7 +6,7 @@ versioning, and CLI operations.
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
Example:
|
|
9
|
-
>>> from oscura.plugins.manager import PluginManager
|
|
9
|
+
>>> from oscura.core.plugins.manager import PluginManager
|
|
10
10
|
>>> manager = PluginManager()
|
|
11
11
|
>>> manager.discover_and_load()
|
|
12
12
|
>>> plugin = manager.get_plugin("uart_decoder")
|
|
@@ -19,21 +19,21 @@ import logging
|
|
|
19
19
|
from pathlib import Path
|
|
20
20
|
from typing import TYPE_CHECKING, Any
|
|
21
21
|
|
|
22
|
-
from oscura.plugins.discovery import discover_plugins, get_plugin_paths
|
|
23
|
-
from oscura.plugins.isolation import IsolationManager, PermissionSet, ResourceLimits
|
|
24
|
-
from oscura.plugins.lifecycle import (
|
|
22
|
+
from oscura.core.plugins.discovery import discover_plugins, get_plugin_paths
|
|
23
|
+
from oscura.core.plugins.isolation import IsolationManager, PermissionSet, ResourceLimits
|
|
24
|
+
from oscura.core.plugins.lifecycle import (
|
|
25
25
|
DependencyGraph,
|
|
26
26
|
PluginLifecycleManager,
|
|
27
27
|
)
|
|
28
|
-
from oscura.plugins.registry import (
|
|
28
|
+
from oscura.core.plugins.registry import (
|
|
29
29
|
PluginConflictError,
|
|
30
30
|
PluginRegistry,
|
|
31
31
|
PluginVersionError,
|
|
32
32
|
)
|
|
33
|
-
from oscura.plugins.versioning import MigrationManager
|
|
33
|
+
from oscura.core.plugins.versioning import MigrationManager
|
|
34
34
|
|
|
35
35
|
if TYPE_CHECKING:
|
|
36
|
-
from oscura.plugins.base import PluginBase, PluginCapability, PluginMetadata
|
|
36
|
+
from oscura.core.plugins.base import PluginBase, PluginCapability, PluginMetadata
|
|
37
37
|
|
|
38
38
|
logger = logging.getLogger(__name__)
|
|
39
39
|
|
|
@@ -5,7 +5,7 @@ registering, and accessing plugins.
|
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
Example:
|
|
8
|
-
>>> from oscura.plugins.registry import register_plugin, get_plugin
|
|
8
|
+
>>> from oscura.core.plugins.registry import register_plugin, get_plugin
|
|
9
9
|
>>> register_plugin(MyDecoder)
|
|
10
10
|
>>> decoder = get_plugin("my_decoder")
|
|
11
11
|
"""
|
|
@@ -15,14 +15,14 @@ from __future__ import annotations
|
|
|
15
15
|
import logging
|
|
16
16
|
from typing import TYPE_CHECKING, Any
|
|
17
17
|
|
|
18
|
-
from oscura.plugins.discovery import (
|
|
18
|
+
from oscura.core.plugins.discovery import (
|
|
19
19
|
OSCURA_API_VERSION,
|
|
20
20
|
DiscoveredPlugin,
|
|
21
21
|
discover_plugins,
|
|
22
22
|
)
|
|
23
23
|
|
|
24
24
|
if TYPE_CHECKING:
|
|
25
|
-
from oscura.plugins.base import PluginBase, PluginCapability, PluginMetadata
|
|
25
|
+
from oscura.core.plugins.base import PluginBase, PluginCapability, PluginMetadata
|
|
26
26
|
|
|
27
27
|
logger = logging.getLogger(__name__)
|
|
28
28
|
|
oscura/core/progress.py
CHANGED
|
@@ -23,7 +23,14 @@ import time
|
|
|
23
23
|
import warnings
|
|
24
24
|
from typing import TYPE_CHECKING, Protocol
|
|
25
25
|
|
|
26
|
-
import
|
|
26
|
+
# Lazy import for optional system monitoring
|
|
27
|
+
try:
|
|
28
|
+
import psutil
|
|
29
|
+
|
|
30
|
+
_HAS_PSUTIL = True
|
|
31
|
+
except ImportError:
|
|
32
|
+
psutil = None # type: ignore[assignment]
|
|
33
|
+
_HAS_PSUTIL = False
|
|
27
34
|
|
|
28
35
|
if TYPE_CHECKING:
|
|
29
36
|
from collections.abc import Callable
|
|
@@ -423,6 +430,10 @@ def check_memory_available(required_bytes: int, *, threshold: float = 0.8) -> bo
|
|
|
423
430
|
References:
|
|
424
431
|
PROG-003: Memory Usage Warnings
|
|
425
432
|
"""
|
|
433
|
+
# If psutil not available, assume memory is sufficient
|
|
434
|
+
if not _HAS_PSUTIL:
|
|
435
|
+
return True
|
|
436
|
+
|
|
426
437
|
memory = psutil.virtual_memory()
|
|
427
438
|
available_bytes = memory.available
|
|
428
439
|
threshold_bytes = available_bytes * threshold
|
|
@@ -454,6 +465,10 @@ def warn_memory_usage(
|
|
|
454
465
|
References:
|
|
455
466
|
PROG-003: Memory Usage Warnings
|
|
456
467
|
"""
|
|
468
|
+
# If psutil not available, skip memory warning
|
|
469
|
+
if not _HAS_PSUTIL:
|
|
470
|
+
return
|
|
471
|
+
|
|
457
472
|
memory = psutil.virtual_memory()
|
|
458
473
|
available_bytes = memory.available
|
|
459
474
|
threshold_bytes = available_bytes * threshold
|
oscura/core/provenance.py
CHANGED
|
@@ -17,8 +17,14 @@ import numpy as np
|
|
|
17
17
|
if TYPE_CHECKING:
|
|
18
18
|
from numpy.typing import NDArray
|
|
19
19
|
|
|
20
|
-
# Oscura version
|
|
21
|
-
|
|
20
|
+
# Oscura version dynamically imported from package metadata (SSOT: pyproject.toml)
|
|
21
|
+
try:
|
|
22
|
+
from importlib.metadata import version
|
|
23
|
+
|
|
24
|
+
OSCURA_VERSION = version("oscura")
|
|
25
|
+
except Exception:
|
|
26
|
+
# Fallback for development/testing when package not installed
|
|
27
|
+
OSCURA_VERSION = "0.0.0+dev"
|
|
22
28
|
|
|
23
29
|
|
|
24
30
|
@dataclass
|
|
@@ -6,7 +6,7 @@ device mappings, bus configurations, and protocol definitions.
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
Example:
|
|
9
|
-
>>> from oscura.schemas import load_schema, validate_config
|
|
9
|
+
>>> from oscura.core.schemas import load_schema, validate_config
|
|
10
10
|
>>> schema = load_schema("packet_format")
|
|
11
11
|
>>> validate_config(config_dict, "packet_format")
|
|
12
12
|
True
|
|
@@ -18,7 +18,7 @@ import json
|
|
|
18
18
|
from pathlib import Path
|
|
19
19
|
from typing import Any
|
|
20
20
|
|
|
21
|
-
from oscura.config.schema import (
|
|
21
|
+
from oscura.core.config.schema import (
|
|
22
22
|
ConfigSchema,
|
|
23
23
|
get_schema_registry,
|
|
24
24
|
register_schema,
|
|
@@ -149,20 +149,14 @@
|
|
|
149
149
|
"type": "array",
|
|
150
150
|
"description": "Device IDs to include (whitelist)",
|
|
151
151
|
"items": {
|
|
152
|
-
"oneOf": [
|
|
153
|
-
{ "type": "integer" },
|
|
154
|
-
{ "type": "string", "pattern": "^0[xX][0-9A-Fa-f]+$" }
|
|
155
|
-
]
|
|
152
|
+
"oneOf": [{ "type": "integer" }, { "type": "string", "pattern": "^0[xX][0-9A-Fa-f]+$" }]
|
|
156
153
|
}
|
|
157
154
|
},
|
|
158
155
|
"exclude_devices": {
|
|
159
156
|
"type": "array",
|
|
160
157
|
"description": "Device IDs to exclude (blacklist)",
|
|
161
158
|
"items": {
|
|
162
|
-
"oneOf": [
|
|
163
|
-
{ "type": "integer" },
|
|
164
|
-
{ "type": "string", "pattern": "^0[xX][0-9A-Fa-f]+$" }
|
|
165
|
-
]
|
|
159
|
+
"oneOf": [{ "type": "integer" }, { "type": "string", "pattern": "^0[xX][0-9A-Fa-f]+$" }]
|
|
166
160
|
}
|
|
167
161
|
},
|
|
168
162
|
"include_categories": {
|
|
@@ -118,10 +118,7 @@
|
|
|
118
118
|
},
|
|
119
119
|
"value": {
|
|
120
120
|
"description": "Expected constant value for validation",
|
|
121
|
-
"oneOf": [
|
|
122
|
-
{ "type": "integer" },
|
|
123
|
-
{ "type": "array", "items": { "type": "integer" } }
|
|
124
|
-
]
|
|
121
|
+
"oneOf": [{ "type": "integer" }, { "type": "array", "items": { "type": "integer" } }]
|
|
125
122
|
},
|
|
126
123
|
"description": {
|
|
127
124
|
"type": "string",
|
|
@@ -188,18 +185,7 @@
|
|
|
188
185
|
},
|
|
189
186
|
"type": {
|
|
190
187
|
"type": "string",
|
|
191
|
-
"enum": [
|
|
192
|
-
"uint8",
|
|
193
|
-
"uint16",
|
|
194
|
-
"uint32",
|
|
195
|
-
"uint64",
|
|
196
|
-
"int8",
|
|
197
|
-
"int16",
|
|
198
|
-
"int32",
|
|
199
|
-
"int64",
|
|
200
|
-
"float32",
|
|
201
|
-
"float64"
|
|
202
|
-
],
|
|
188
|
+
"enum": ["uint8", "uint16", "uint32", "uint64", "int8", "int16", "int32", "int64", "float32", "float64"],
|
|
203
189
|
"description": "Sample data type"
|
|
204
190
|
},
|
|
205
191
|
"endian": {
|
|
@@ -303,10 +289,7 @@
|
|
|
303
289
|
},
|
|
304
290
|
"expected": {
|
|
305
291
|
"description": "Expected value",
|
|
306
|
-
"oneOf": [
|
|
307
|
-
{ "type": "integer" },
|
|
308
|
-
{ "type": "array", "items": { "type": "integer" } }
|
|
309
|
-
]
|
|
292
|
+
"oneOf": [{ "type": "integer" }, { "type": "array", "items": { "type": "integer" } }]
|
|
310
293
|
},
|
|
311
294
|
"on_failure": {
|
|
312
295
|
"type": "string",
|
|
@@ -379,10 +362,7 @@
|
|
|
379
362
|
},
|
|
380
363
|
"pattern": {
|
|
381
364
|
"description": "Idle pattern to detect",
|
|
382
|
-
"oneOf": [
|
|
383
|
-
{ "type": "string", "enum": ["auto", "zeros", "ones"] },
|
|
384
|
-
{ "type": "integer" }
|
|
385
|
-
]
|
|
365
|
+
"oneOf": [{ "type": "string", "enum": ["auto", "zeros", "ones"] }, { "type": "integer" }]
|
|
386
366
|
},
|
|
387
367
|
"min_duration": {
|
|
388
368
|
"type": "integer",
|
|
@@ -241,12 +241,7 @@
|
|
|
241
241
|
},
|
|
242
242
|
"value": {
|
|
243
243
|
"description": "Expected constant value for validation",
|
|
244
|
-
"oneOf": [
|
|
245
|
-
{ "type": "integer" },
|
|
246
|
-
{ "type": "number" },
|
|
247
|
-
{ "type": "string" },
|
|
248
|
-
{ "type": "array" }
|
|
249
|
-
]
|
|
244
|
+
"oneOf": [{ "type": "integer" }, { "type": "number" }, { "type": "string" }, { "type": "array" }]
|
|
250
245
|
},
|
|
251
246
|
"condition": {
|
|
252
247
|
"type": "string",
|
|
@@ -331,12 +326,7 @@
|
|
|
331
326
|
},
|
|
332
327
|
"expected": {
|
|
333
328
|
"description": "Expected value",
|
|
334
|
-
"oneOf": [
|
|
335
|
-
{ "type": "integer" },
|
|
336
|
-
{ "type": "number" },
|
|
337
|
-
{ "type": "string" },
|
|
338
|
-
{ "type": "array" }
|
|
339
|
-
]
|
|
329
|
+
"oneOf": [{ "type": "integer" }, { "type": "number" }, { "type": "string" }, { "type": "array" }]
|
|
340
330
|
},
|
|
341
331
|
"on_mismatch": {
|
|
342
332
|
"type": "string",
|
oscura/core/types.py
CHANGED
|
@@ -44,6 +44,7 @@ class CalibrationInfo:
|
|
|
44
44
|
coupling: Input coupling ("DC", "AC", "GND") (optional).
|
|
45
45
|
bandwidth_limit: Bandwidth limit in Hz, None if disabled (optional).
|
|
46
46
|
vertical_resolution: ADC resolution in bits (optional).
|
|
47
|
+
timebase_accuracy: Timebase accuracy in ppm (parts per million) (optional).
|
|
47
48
|
|
|
48
49
|
Example:
|
|
49
50
|
>>> from datetime import datetime
|
|
@@ -74,6 +75,7 @@ class CalibrationInfo:
|
|
|
74
75
|
coupling: str | None = None
|
|
75
76
|
bandwidth_limit: float | None = None
|
|
76
77
|
vertical_resolution: int | None = None
|
|
78
|
+
timebase_accuracy: float | None = None
|
|
77
79
|
|
|
78
80
|
def __post_init__(self) -> None:
|
|
79
81
|
"""Validate calibration info after initialization."""
|
|
@@ -85,6 +87,8 @@ class CalibrationInfo:
|
|
|
85
87
|
raise ValueError(
|
|
86
88
|
f"vertical_resolution must be positive, got {self.vertical_resolution}"
|
|
87
89
|
)
|
|
90
|
+
if self.timebase_accuracy is not None and self.timebase_accuracy <= 0:
|
|
91
|
+
raise ValueError(f"timebase_accuracy must be positive, got {self.timebase_accuracy}")
|
|
88
92
|
|
|
89
93
|
@property
|
|
90
94
|
def is_calibration_current(self) -> bool | None:
|
oscura/core/uncertainty.py
CHANGED
|
@@ -108,7 +108,7 @@ class MeasurementWithUncertainty:
|
|
|
108
108
|
JCGM 100:2008 Section 5.1.6
|
|
109
109
|
"""
|
|
110
110
|
if self.value == 0:
|
|
111
|
-
return float(np.inf)
|
|
111
|
+
return float(np.inf)
|
|
112
112
|
return abs(self.uncertainty / self.value)
|
|
113
113
|
|
|
114
114
|
@property
|
|
@@ -173,7 +173,7 @@ class UncertaintyEstimator:
|
|
|
173
173
|
JCGM 100:2008 Section 4.2 (Type A evaluation)
|
|
174
174
|
"""
|
|
175
175
|
if len(data) < 2:
|
|
176
|
-
return float(np.nan)
|
|
176
|
+
return float(np.nan)
|
|
177
177
|
return float(np.std(data, ddof=1)) # Sample std (Bessel correction)
|
|
178
178
|
|
|
179
179
|
@staticmethod
|
|
@@ -190,7 +190,7 @@ class UncertaintyEstimator:
|
|
|
190
190
|
JCGM 100:2008 Section 4.2.3
|
|
191
191
|
"""
|
|
192
192
|
if len(data) < 2:
|
|
193
|
-
return float(np.nan)
|
|
193
|
+
return float(np.nan)
|
|
194
194
|
return float(np.std(data, ddof=1) / np.sqrt(len(data)))
|
|
195
195
|
|
|
196
196
|
@staticmethod
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"""Multi-protocol correlation and session analysis.
|
|
2
|
+
|
|
3
|
+
This module provides tools for correlating messages and sessions across
|
|
4
|
+
different protocols (CAN, Ethernet, Serial, etc.) to discover cross-protocol
|
|
5
|
+
communication patterns and dependencies.
|
|
6
|
+
|
|
7
|
+
Example:
|
|
8
|
+
>>> from oscura.correlation import MultiProtocolCorrelator, ProtocolMessage
|
|
9
|
+
>>> correlator = MultiProtocolCorrelator(time_window=0.1, min_confidence=0.5)
|
|
10
|
+
>>>
|
|
11
|
+
>>> # Add messages from different protocols
|
|
12
|
+
>>> can_msg = ProtocolMessage(
|
|
13
|
+
... protocol="can",
|
|
14
|
+
... timestamp=1.234,
|
|
15
|
+
... message_id=0x123,
|
|
16
|
+
... payload=b"\\x01\\x02\\x03"
|
|
17
|
+
... )
|
|
18
|
+
>>> eth_msg = ProtocolMessage(
|
|
19
|
+
... protocol="ethernet",
|
|
20
|
+
... timestamp=1.238,
|
|
21
|
+
... payload=b"\\x01\\x02\\x03\\x04"
|
|
22
|
+
... )
|
|
23
|
+
>>> correlator.add_message(can_msg)
|
|
24
|
+
>>> correlator.add_message(eth_msg)
|
|
25
|
+
>>>
|
|
26
|
+
>>> # Find correlations
|
|
27
|
+
>>> correlations = correlator.correlate_all()
|
|
28
|
+
>>> print(f"Found {len(correlations)} correlations")
|
|
29
|
+
>>>
|
|
30
|
+
>>> # Extract sessions
|
|
31
|
+
>>> sessions = correlator.extract_sessions()
|
|
32
|
+
>>> print(f"Protocols used: {sessions[0].protocols}")
|
|
33
|
+
|
|
34
|
+
References:
|
|
35
|
+
Network protocol analysis
|
|
36
|
+
Graph theory for dependency analysis
|
|
37
|
+
Session correlation algorithms
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
from oscura.correlation.multi_protocol import (
|
|
41
|
+
MessageCorrelation,
|
|
42
|
+
MultiProtocolCorrelator,
|
|
43
|
+
ProtocolMessage,
|
|
44
|
+
SessionFlow,
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
__all__ = [
|
|
48
|
+
"MessageCorrelation",
|
|
49
|
+
"MultiProtocolCorrelator",
|
|
50
|
+
"ProtocolMessage",
|
|
51
|
+
"SessionFlow",
|
|
52
|
+
]
|