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