oscura 0.0.1__py3-none-any.whl → 0.1.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 +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.0.dist-info/METADATA +300 -0
- oscura-0.1.0.dist-info/RECORD +463 -0
- oscura-0.1.0.dist-info/entry_points.txt +2 -0
- {oscura-0.0.1.dist-info → oscura-0.1.0.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.0.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,479 @@
|
|
|
1
|
+
"""Switching loss analysis for TraceKit.
|
|
2
|
+
|
|
3
|
+
Provides switching loss calculations for power semiconductor devices
|
|
4
|
+
including MOSFETs, IGBTs, and diodes.
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
Example:
|
|
8
|
+
>>> from oscura.analyzers.power.switching import switching_loss
|
|
9
|
+
>>> losses = switching_loss(v_ds_trace, i_d_trace)
|
|
10
|
+
>>> print(f"Turn-on: {losses['e_on']*1e6:.2f} uJ")
|
|
11
|
+
>>> print(f"Turn-off: {losses['e_off']*1e6:.2f} uJ")
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
from dataclasses import dataclass
|
|
17
|
+
from typing import TYPE_CHECKING, Any, Literal
|
|
18
|
+
|
|
19
|
+
import numpy as np
|
|
20
|
+
|
|
21
|
+
from oscura.analyzers.power.basic import instantaneous_power
|
|
22
|
+
|
|
23
|
+
if TYPE_CHECKING:
|
|
24
|
+
from numpy.typing import NDArray
|
|
25
|
+
|
|
26
|
+
from oscura.core.types import WaveformTrace
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@dataclass
|
|
30
|
+
class SwitchingEvent:
|
|
31
|
+
"""Information about a switching transition.
|
|
32
|
+
|
|
33
|
+
Attributes:
|
|
34
|
+
start_time: Start time of transition (seconds).
|
|
35
|
+
end_time: End time of transition (seconds).
|
|
36
|
+
duration: Transition duration (seconds).
|
|
37
|
+
energy: Energy dissipated during transition (Joules).
|
|
38
|
+
peak_power: Peak power during transition (Watts).
|
|
39
|
+
event_type: "turn_on" or "turn_off".
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
start_time: float
|
|
43
|
+
end_time: float
|
|
44
|
+
duration: float
|
|
45
|
+
energy: float
|
|
46
|
+
peak_power: float
|
|
47
|
+
event_type: Literal["turn_on", "turn_off"]
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def switching_loss(
|
|
51
|
+
voltage: WaveformTrace,
|
|
52
|
+
current: WaveformTrace,
|
|
53
|
+
*,
|
|
54
|
+
v_threshold: float | None = None,
|
|
55
|
+
i_threshold: float | None = None,
|
|
56
|
+
) -> dict[str, Any]:
|
|
57
|
+
"""Calculate switching losses for a power device.
|
|
58
|
+
|
|
59
|
+
Analyzes voltage and current waveforms to find switching transitions
|
|
60
|
+
and calculate turn-on and turn-off energy losses.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
voltage: Drain-source (or collector-emitter) voltage trace.
|
|
64
|
+
current: Drain (or collector) current trace.
|
|
65
|
+
v_threshold: Voltage threshold for on/off detection.
|
|
66
|
+
If None, uses 10% of peak voltage.
|
|
67
|
+
i_threshold: Current threshold for on/off detection.
|
|
68
|
+
If None, uses 10% of peak current.
|
|
69
|
+
|
|
70
|
+
Returns:
|
|
71
|
+
Dictionary with:
|
|
72
|
+
- e_on: Turn-on energy per event (Joules)
|
|
73
|
+
- e_off: Turn-off energy per event (Joules)
|
|
74
|
+
- e_total: Total switching energy per cycle (Joules)
|
|
75
|
+
- p_sw: Switching power at estimated frequency (Watts)
|
|
76
|
+
- events: List of SwitchingEvent objects
|
|
77
|
+
- n_turn_on: Number of turn-on events
|
|
78
|
+
- n_turn_off: Number of turn-off events
|
|
79
|
+
|
|
80
|
+
Example:
|
|
81
|
+
>>> losses = switching_loss(v_ds, i_d)
|
|
82
|
+
>>> print(f"E_on: {losses['e_on']*1e6:.2f} uJ")
|
|
83
|
+
>>> print(f"E_off: {losses['e_off']*1e6:.2f} uJ")
|
|
84
|
+
>>> print(f"Switching power @ 100kHz: {losses['p_sw']*100e3:.2f} W")
|
|
85
|
+
|
|
86
|
+
References:
|
|
87
|
+
Infineon Application Note AN-9010
|
|
88
|
+
"""
|
|
89
|
+
# Calculate instantaneous power
|
|
90
|
+
power = instantaneous_power(voltage, current)
|
|
91
|
+
|
|
92
|
+
# Ensure i_data matches v_data length (handle mismatched array sizes)
|
|
93
|
+
min_len = min(len(voltage.data), len(current.data))
|
|
94
|
+
v_data = voltage.data[:min_len]
|
|
95
|
+
i_data = current.data[:min_len]
|
|
96
|
+
p_data = power.data[:min_len]
|
|
97
|
+
sample_period = power.metadata.time_base
|
|
98
|
+
|
|
99
|
+
# Auto-detect thresholds if not provided
|
|
100
|
+
if v_threshold is None:
|
|
101
|
+
v_threshold = 0.1 * float(np.max(np.abs(v_data)))
|
|
102
|
+
if i_threshold is None:
|
|
103
|
+
i_threshold = 0.1 * float(np.max(np.abs(i_data)))
|
|
104
|
+
|
|
105
|
+
# Add hysteresis to prevent false transitions due to ringing (Schmitt trigger)
|
|
106
|
+
# Use 20% hysteresis band around thresholds
|
|
107
|
+
hysteresis_factor = 0.2
|
|
108
|
+
v_threshold_high = v_threshold * (1 + hysteresis_factor)
|
|
109
|
+
v_threshold_low = v_threshold * (1 - hysteresis_factor)
|
|
110
|
+
i_threshold_high = i_threshold * (1 + hysteresis_factor)
|
|
111
|
+
i_threshold_low = i_threshold * (1 - hysteresis_factor)
|
|
112
|
+
|
|
113
|
+
# Find switching events
|
|
114
|
+
events: list[SwitchingEvent] = []
|
|
115
|
+
|
|
116
|
+
# Determine device state at each sample with hysteresis
|
|
117
|
+
# ON: low voltage, high current
|
|
118
|
+
# OFF: high voltage, low current
|
|
119
|
+
# Use hysteresis to avoid rapid state changes due to noise/ringing
|
|
120
|
+
device_state = np.zeros(min_len, dtype=int) # 0=unknown, 1=on, 2=off
|
|
121
|
+
current_state = 0 # Start in unknown state
|
|
122
|
+
|
|
123
|
+
for i in range(min_len):
|
|
124
|
+
v = v_data[i]
|
|
125
|
+
i_val = i_data[i]
|
|
126
|
+
|
|
127
|
+
# Determine next state based on current state and measurements
|
|
128
|
+
if current_state == 1: # Currently ON
|
|
129
|
+
# Stay ON unless voltage goes high (with hysteresis)
|
|
130
|
+
if v > v_threshold_high:
|
|
131
|
+
current_state = 2 # Transition to OFF
|
|
132
|
+
elif current_state == 2: # Currently OFF
|
|
133
|
+
# Stay OFF unless voltage goes low (with hysteresis)
|
|
134
|
+
if v < v_threshold_low and i_val > i_threshold_low:
|
|
135
|
+
current_state = 1 # Transition to ON
|
|
136
|
+
else: # Unknown state - determine initial state
|
|
137
|
+
if v < v_threshold_low and i_val > i_threshold_high:
|
|
138
|
+
current_state = 1 # ON
|
|
139
|
+
elif v > v_threshold_high and i_val < i_threshold_low:
|
|
140
|
+
current_state = 2 # OFF
|
|
141
|
+
|
|
142
|
+
device_state[i] = current_state
|
|
143
|
+
|
|
144
|
+
device_on = device_state == 1
|
|
145
|
+
device_off = device_state == 2
|
|
146
|
+
|
|
147
|
+
# Find transitions
|
|
148
|
+
i = 0
|
|
149
|
+
while i < len(device_on) - 1:
|
|
150
|
+
# Look for turn-on: device was off, now turning on
|
|
151
|
+
if device_off[i] and not device_off[i + 1]:
|
|
152
|
+
# Find end of transition (device fully on)
|
|
153
|
+
start_idx = i
|
|
154
|
+
end_idx = start_idx + 1
|
|
155
|
+
while end_idx < len(device_on) and not device_on[end_idx]:
|
|
156
|
+
end_idx += 1
|
|
157
|
+
|
|
158
|
+
if end_idx < len(device_on):
|
|
159
|
+
# Calculate transition energy (scipy for stable API)
|
|
160
|
+
from scipy.integrate import trapezoid
|
|
161
|
+
|
|
162
|
+
transition_power = p_data[start_idx : end_idx + 1]
|
|
163
|
+
e = float(trapezoid(transition_power, dx=sample_period))
|
|
164
|
+
peak_p = float(np.max(transition_power))
|
|
165
|
+
|
|
166
|
+
events.append(
|
|
167
|
+
SwitchingEvent(
|
|
168
|
+
start_time=start_idx * sample_period,
|
|
169
|
+
end_time=end_idx * sample_period,
|
|
170
|
+
duration=(end_idx - start_idx) * sample_period,
|
|
171
|
+
energy=e,
|
|
172
|
+
peak_power=peak_p,
|
|
173
|
+
event_type="turn_on",
|
|
174
|
+
)
|
|
175
|
+
)
|
|
176
|
+
i = end_idx
|
|
177
|
+
continue
|
|
178
|
+
|
|
179
|
+
# Look for turn-off: device was on, now turning off
|
|
180
|
+
if device_on[i] and not device_on[i + 1]:
|
|
181
|
+
start_idx = i
|
|
182
|
+
end_idx = start_idx + 1
|
|
183
|
+
while end_idx < len(device_off) and not device_off[end_idx]:
|
|
184
|
+
end_idx += 1
|
|
185
|
+
|
|
186
|
+
if end_idx < len(device_off):
|
|
187
|
+
from scipy.integrate import trapezoid
|
|
188
|
+
|
|
189
|
+
transition_power = p_data[start_idx : end_idx + 1]
|
|
190
|
+
e = float(trapezoid(transition_power, dx=sample_period))
|
|
191
|
+
peak_p = float(np.max(transition_power))
|
|
192
|
+
|
|
193
|
+
events.append(
|
|
194
|
+
SwitchingEvent(
|
|
195
|
+
start_time=start_idx * sample_period,
|
|
196
|
+
end_time=end_idx * sample_period,
|
|
197
|
+
duration=(end_idx - start_idx) * sample_period,
|
|
198
|
+
energy=e,
|
|
199
|
+
peak_power=peak_p,
|
|
200
|
+
event_type="turn_off",
|
|
201
|
+
)
|
|
202
|
+
)
|
|
203
|
+
i = end_idx
|
|
204
|
+
continue
|
|
205
|
+
|
|
206
|
+
i += 1
|
|
207
|
+
|
|
208
|
+
# Calculate average energies
|
|
209
|
+
turn_on_events = [e for e in events if e.event_type == "turn_on"]
|
|
210
|
+
turn_off_events = [e for e in events if e.event_type == "turn_off"]
|
|
211
|
+
|
|
212
|
+
e_on = float(np.mean([e.energy for e in turn_on_events])) if turn_on_events else 0.0
|
|
213
|
+
e_off = float(np.mean([e.energy for e in turn_off_events])) if turn_off_events else 0.0
|
|
214
|
+
e_total = e_on + e_off
|
|
215
|
+
|
|
216
|
+
# Estimate switching frequency from event spacing
|
|
217
|
+
if len(events) >= 2:
|
|
218
|
+
event_times = [e.start_time for e in events]
|
|
219
|
+
avg_period = float(np.mean(np.diff(event_times))) * 2 # Full cycle
|
|
220
|
+
f_sw = 1.0 / avg_period if avg_period > 0 else 0.0
|
|
221
|
+
else:
|
|
222
|
+
f_sw = 0.0
|
|
223
|
+
|
|
224
|
+
return {
|
|
225
|
+
"e_on": e_on,
|
|
226
|
+
"e_off": e_off,
|
|
227
|
+
"e_total": e_total,
|
|
228
|
+
"f_sw": f_sw,
|
|
229
|
+
"p_sw": e_total * f_sw, # Switching power at this frequency
|
|
230
|
+
"events": events,
|
|
231
|
+
"n_turn_on": len(turn_on_events),
|
|
232
|
+
"n_turn_off": len(turn_off_events),
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
def switching_energy(
|
|
237
|
+
voltage: WaveformTrace,
|
|
238
|
+
current: WaveformTrace,
|
|
239
|
+
start_time: float,
|
|
240
|
+
end_time: float,
|
|
241
|
+
) -> float:
|
|
242
|
+
"""Calculate switching energy over a specific time window.
|
|
243
|
+
|
|
244
|
+
E = integral(V(t) * I(t) dt) from start_time to end_time
|
|
245
|
+
|
|
246
|
+
Args:
|
|
247
|
+
voltage: Voltage trace.
|
|
248
|
+
current: Current trace.
|
|
249
|
+
start_time: Start of integration window (seconds).
|
|
250
|
+
end_time: End of integration window (seconds).
|
|
251
|
+
|
|
252
|
+
Returns:
|
|
253
|
+
Switching energy in Joules.
|
|
254
|
+
|
|
255
|
+
Example:
|
|
256
|
+
>>> e = switching_energy(v_ds, i_d, start_time=1e-6, end_time=1.5e-6)
|
|
257
|
+
>>> print(f"Switching energy: {e*1e9:.2f} nJ")
|
|
258
|
+
"""
|
|
259
|
+
power = instantaneous_power(voltage, current)
|
|
260
|
+
sample_period = power.metadata.time_base
|
|
261
|
+
time_vector = np.arange(len(power.data)) * sample_period
|
|
262
|
+
|
|
263
|
+
# Select time window
|
|
264
|
+
mask = (time_vector >= start_time) & (time_vector <= end_time)
|
|
265
|
+
window_power = power.data[mask]
|
|
266
|
+
|
|
267
|
+
# Use scipy for stable API across NumPy versions
|
|
268
|
+
from scipy.integrate import trapezoid
|
|
269
|
+
|
|
270
|
+
return float(trapezoid(window_power, dx=sample_period))
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
def turn_on_loss(
|
|
274
|
+
voltage: WaveformTrace,
|
|
275
|
+
current: WaveformTrace,
|
|
276
|
+
*,
|
|
277
|
+
v_threshold: float | None = None,
|
|
278
|
+
i_threshold: float | None = None,
|
|
279
|
+
) -> float:
|
|
280
|
+
"""Calculate average turn-on energy loss.
|
|
281
|
+
|
|
282
|
+
Convenience function that returns just the turn-on energy.
|
|
283
|
+
|
|
284
|
+
Args:
|
|
285
|
+
voltage: Drain-source voltage trace.
|
|
286
|
+
current: Drain current trace.
|
|
287
|
+
v_threshold: Voltage threshold for on/off detection.
|
|
288
|
+
i_threshold: Current threshold for on/off detection.
|
|
289
|
+
|
|
290
|
+
Returns:
|
|
291
|
+
Average turn-on energy in Joules.
|
|
292
|
+
"""
|
|
293
|
+
result = switching_loss(voltage, current, v_threshold=v_threshold, i_threshold=i_threshold)
|
|
294
|
+
return float(result["e_on"])
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
def turn_off_loss(
|
|
298
|
+
voltage: WaveformTrace,
|
|
299
|
+
current: WaveformTrace,
|
|
300
|
+
*,
|
|
301
|
+
v_threshold: float | None = None,
|
|
302
|
+
i_threshold: float | None = None,
|
|
303
|
+
) -> float:
|
|
304
|
+
"""Calculate average turn-off energy loss.
|
|
305
|
+
|
|
306
|
+
Args:
|
|
307
|
+
voltage: Drain-source voltage trace.
|
|
308
|
+
current: Drain current trace.
|
|
309
|
+
v_threshold: Voltage threshold for on/off detection.
|
|
310
|
+
i_threshold: Current threshold for on/off detection.
|
|
311
|
+
|
|
312
|
+
Returns:
|
|
313
|
+
Average turn-off energy in Joules.
|
|
314
|
+
"""
|
|
315
|
+
result = switching_loss(voltage, current, v_threshold=v_threshold, i_threshold=i_threshold)
|
|
316
|
+
return float(result["e_off"])
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
def total_switching_loss(
|
|
320
|
+
voltage: WaveformTrace,
|
|
321
|
+
current: WaveformTrace,
|
|
322
|
+
frequency: float,
|
|
323
|
+
*,
|
|
324
|
+
v_threshold: float | None = None,
|
|
325
|
+
i_threshold: float | None = None,
|
|
326
|
+
) -> float:
|
|
327
|
+
"""Calculate total switching power loss at given frequency.
|
|
328
|
+
|
|
329
|
+
P_sw = (E_on + E_off) * f_sw
|
|
330
|
+
|
|
331
|
+
Args:
|
|
332
|
+
voltage: Drain-source voltage trace.
|
|
333
|
+
current: Drain current trace.
|
|
334
|
+
frequency: Switching frequency in Hz.
|
|
335
|
+
v_threshold: Voltage threshold for on/off detection.
|
|
336
|
+
i_threshold: Current threshold for on/off detection.
|
|
337
|
+
|
|
338
|
+
Returns:
|
|
339
|
+
Switching power loss in Watts.
|
|
340
|
+
|
|
341
|
+
Example:
|
|
342
|
+
>>> p_sw = total_switching_loss(v_ds, i_d, frequency=100e3)
|
|
343
|
+
>>> print(f"Switching loss at 100kHz: {p_sw:.2f} W")
|
|
344
|
+
"""
|
|
345
|
+
result = switching_loss(voltage, current, v_threshold=v_threshold, i_threshold=i_threshold)
|
|
346
|
+
return float(result["e_total"]) * frequency
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
def switching_frequency(
|
|
350
|
+
voltage: WaveformTrace,
|
|
351
|
+
*,
|
|
352
|
+
threshold: float | None = None,
|
|
353
|
+
) -> float:
|
|
354
|
+
"""Estimate switching frequency from voltage waveform.
|
|
355
|
+
|
|
356
|
+
Args:
|
|
357
|
+
voltage: Drain-source voltage trace.
|
|
358
|
+
threshold: Voltage threshold for edge detection.
|
|
359
|
+
|
|
360
|
+
Returns:
|
|
361
|
+
Estimated switching frequency in Hz.
|
|
362
|
+
|
|
363
|
+
Example:
|
|
364
|
+
>>> f_sw = switching_frequency(v_ds)
|
|
365
|
+
>>> print(f"Switching frequency: {f_sw/1e3:.1f} kHz")
|
|
366
|
+
"""
|
|
367
|
+
data = voltage.data
|
|
368
|
+
sample_rate = voltage.metadata.sample_rate
|
|
369
|
+
|
|
370
|
+
if threshold is None:
|
|
371
|
+
threshold = float((np.max(data) + np.min(data)) / 2)
|
|
372
|
+
|
|
373
|
+
# Find rising edges
|
|
374
|
+
below = data < threshold
|
|
375
|
+
above = data >= threshold
|
|
376
|
+
rising = np.where(below[:-1] & above[1:])[0]
|
|
377
|
+
|
|
378
|
+
if len(rising) < 2:
|
|
379
|
+
return 0.0
|
|
380
|
+
|
|
381
|
+
# Calculate average period
|
|
382
|
+
periods = np.diff(rising) / sample_rate
|
|
383
|
+
avg_period = float(np.mean(periods))
|
|
384
|
+
|
|
385
|
+
return 1.0 / avg_period if avg_period > 0 else 0.0
|
|
386
|
+
|
|
387
|
+
|
|
388
|
+
def switching_times(
|
|
389
|
+
voltage: WaveformTrace,
|
|
390
|
+
current: WaveformTrace,
|
|
391
|
+
*,
|
|
392
|
+
v_threshold: float | None = None,
|
|
393
|
+
i_threshold: float | None = None,
|
|
394
|
+
) -> dict[str, float]:
|
|
395
|
+
"""Measure switching times (tr, tf, ton, toff).
|
|
396
|
+
|
|
397
|
+
Args:
|
|
398
|
+
voltage: Drain-source voltage trace.
|
|
399
|
+
current: Drain current trace.
|
|
400
|
+
v_threshold: Voltage threshold (10%-90% levels if None).
|
|
401
|
+
i_threshold: Current threshold (10%-90% levels if None).
|
|
402
|
+
|
|
403
|
+
Returns:
|
|
404
|
+
Dictionary with:
|
|
405
|
+
- tr: Rise time (10%-90%)
|
|
406
|
+
- tf: Fall time (90%-10%)
|
|
407
|
+
- t_on: Turn-on delay time
|
|
408
|
+
- t_off: Turn-off delay time
|
|
409
|
+
"""
|
|
410
|
+
# Ensure arrays match in length (handle mismatched array sizes)
|
|
411
|
+
min_len = min(len(voltage.data), len(current.data))
|
|
412
|
+
v_data = voltage.data[:min_len]
|
|
413
|
+
i_data = current.data[:min_len]
|
|
414
|
+
sample_period = voltage.metadata.time_base
|
|
415
|
+
|
|
416
|
+
v_min, v_max = float(np.min(v_data)), float(np.max(v_data))
|
|
417
|
+
i_min, i_max = float(np.min(i_data)), float(np.max(i_data))
|
|
418
|
+
|
|
419
|
+
v_10 = v_min + 0.1 * (v_max - v_min)
|
|
420
|
+
v_90 = v_min + 0.9 * (v_max - v_min)
|
|
421
|
+
i_10 = i_min + 0.1 * (i_max - i_min)
|
|
422
|
+
i_90 = i_min + 0.9 * (i_max - i_min)
|
|
423
|
+
|
|
424
|
+
# Find voltage transitions
|
|
425
|
+
def find_transition_time(
|
|
426
|
+
data: NDArray[np.floating[Any]], low: float, high: float, rising: bool
|
|
427
|
+
) -> float:
|
|
428
|
+
if rising:
|
|
429
|
+
below_low = data < low
|
|
430
|
+
start_idx_arr = np.where(below_low[:-1] & ~below_low[1:])[0]
|
|
431
|
+
if len(start_idx_arr) == 0:
|
|
432
|
+
return float(np.nan)
|
|
433
|
+
start_idx = int(start_idx_arr[0])
|
|
434
|
+
remaining = data[start_idx:]
|
|
435
|
+
above_mask = remaining > high
|
|
436
|
+
if not np.any(above_mask):
|
|
437
|
+
return float(np.nan)
|
|
438
|
+
end_offset = int(np.argmax(above_mask))
|
|
439
|
+
return float(end_offset) * sample_period
|
|
440
|
+
else:
|
|
441
|
+
above_high = data > high
|
|
442
|
+
start_idx_arr = np.where(above_high[:-1] & ~above_high[1:])[0]
|
|
443
|
+
if len(start_idx_arr) == 0:
|
|
444
|
+
return float(np.nan)
|
|
445
|
+
start_idx = int(start_idx_arr[0])
|
|
446
|
+
remaining = data[start_idx:]
|
|
447
|
+
below_mask = remaining < low
|
|
448
|
+
if not np.any(below_mask):
|
|
449
|
+
return float(np.nan)
|
|
450
|
+
end_offset = int(np.argmax(below_mask))
|
|
451
|
+
return float(end_offset) * sample_period
|
|
452
|
+
|
|
453
|
+
# Voltage fall time (turn-on)
|
|
454
|
+
tf_v = find_transition_time(v_data, v_10, v_90, rising=False)
|
|
455
|
+
# Voltage rise time (turn-off)
|
|
456
|
+
tr_v = find_transition_time(v_data, v_10, v_90, rising=True)
|
|
457
|
+
# Current rise time (turn-on)
|
|
458
|
+
tr_i = find_transition_time(i_data, i_10, i_90, rising=True)
|
|
459
|
+
# Current fall time (turn-off)
|
|
460
|
+
tf_i = find_transition_time(i_data, i_10, i_90, rising=False)
|
|
461
|
+
|
|
462
|
+
return {
|
|
463
|
+
"tr": tr_v, # Voltage rise time (turn-off)
|
|
464
|
+
"tf": tf_v, # Voltage fall time (turn-on)
|
|
465
|
+
"tr_current": tr_i, # Current rise time (turn-on)
|
|
466
|
+
"tf_current": tf_i, # Current fall time (turn-off)
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
|
|
470
|
+
__all__ = [
|
|
471
|
+
"SwitchingEvent",
|
|
472
|
+
"switching_energy",
|
|
473
|
+
"switching_frequency",
|
|
474
|
+
"switching_loss",
|
|
475
|
+
"switching_times",
|
|
476
|
+
"total_switching_loss",
|
|
477
|
+
"turn_off_loss",
|
|
478
|
+
"turn_on_loss",
|
|
479
|
+
]
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"""Protocol decoding module.
|
|
2
|
+
|
|
3
|
+
This module re-exports protocol decoders from the protocols package
|
|
4
|
+
for convenient access. Both import paths are equivalent:
|
|
5
|
+
|
|
6
|
+
from oscura.analyzers.protocol import UARTDecoder # singular (this module)
|
|
7
|
+
from oscura.analyzers.protocols import UARTDecoder # plural (recommended)
|
|
8
|
+
|
|
9
|
+
The plural form (protocols) is recommended as the canonical import path.
|
|
10
|
+
See IMPORT-PATHS.md in the repository root for detailed guidelines.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from oscura.analyzers.protocols import (
|
|
14
|
+
CAN_BITRATES,
|
|
15
|
+
CANFD_DLC_TO_LENGTH,
|
|
16
|
+
FAMILY_CODES,
|
|
17
|
+
JTAG_INSTRUCTIONS,
|
|
18
|
+
PID_NAMES,
|
|
19
|
+
ROM_COMMAND_NAMES,
|
|
20
|
+
USBPID,
|
|
21
|
+
Annotation,
|
|
22
|
+
AnnotationLevel,
|
|
23
|
+
AsyncDecoder,
|
|
24
|
+
CANDecoder,
|
|
25
|
+
CANFDDecoder,
|
|
26
|
+
CANFDFrame,
|
|
27
|
+
CANFDFrameType,
|
|
28
|
+
CANFrame,
|
|
29
|
+
CANFrameType,
|
|
30
|
+
ChannelDef,
|
|
31
|
+
DecoderState,
|
|
32
|
+
FlexRayDecoder,
|
|
33
|
+
FlexRayFrame,
|
|
34
|
+
FlexRaySegment,
|
|
35
|
+
HDLCDecoder,
|
|
36
|
+
I2CDecoder,
|
|
37
|
+
I2SDecoder,
|
|
38
|
+
I2SMode,
|
|
39
|
+
JTAGDecoder,
|
|
40
|
+
LINDecoder,
|
|
41
|
+
LINVersion,
|
|
42
|
+
ManchesterDecoder,
|
|
43
|
+
ManchesterMode,
|
|
44
|
+
OneWireDecoder,
|
|
45
|
+
OneWireMode,
|
|
46
|
+
OneWireROMCommand,
|
|
47
|
+
OneWireROMID,
|
|
48
|
+
OneWireTimings,
|
|
49
|
+
OptionDef,
|
|
50
|
+
ProtocolDecoder,
|
|
51
|
+
SPIDecoder,
|
|
52
|
+
SWDDecoder,
|
|
53
|
+
SWDResponse,
|
|
54
|
+
SyncDecoder,
|
|
55
|
+
TAPState,
|
|
56
|
+
UARTDecoder,
|
|
57
|
+
USBDecoder,
|
|
58
|
+
USBSpeed,
|
|
59
|
+
decode_can,
|
|
60
|
+
decode_can_fd,
|
|
61
|
+
decode_flexray,
|
|
62
|
+
decode_hdlc,
|
|
63
|
+
decode_i2c,
|
|
64
|
+
decode_i2s,
|
|
65
|
+
decode_jtag,
|
|
66
|
+
decode_lin,
|
|
67
|
+
decode_manchester,
|
|
68
|
+
decode_onewire,
|
|
69
|
+
decode_spi,
|
|
70
|
+
decode_swd,
|
|
71
|
+
decode_uart,
|
|
72
|
+
decode_usb,
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
__all__ = [
|
|
76
|
+
"CANFD_DLC_TO_LENGTH",
|
|
77
|
+
"CAN_BITRATES",
|
|
78
|
+
"FAMILY_CODES",
|
|
79
|
+
"JTAG_INSTRUCTIONS",
|
|
80
|
+
"PID_NAMES",
|
|
81
|
+
"ROM_COMMAND_NAMES",
|
|
82
|
+
"USBPID",
|
|
83
|
+
"Annotation",
|
|
84
|
+
"AnnotationLevel",
|
|
85
|
+
"AsyncDecoder",
|
|
86
|
+
# CAN (PRO-005)
|
|
87
|
+
"CANDecoder",
|
|
88
|
+
# CAN-FD (PRO-015)
|
|
89
|
+
"CANFDDecoder",
|
|
90
|
+
"CANFDFrame",
|
|
91
|
+
"CANFDFrameType",
|
|
92
|
+
"CANFrame",
|
|
93
|
+
"CANFrameType",
|
|
94
|
+
"ChannelDef",
|
|
95
|
+
"DecoderState",
|
|
96
|
+
# FlexRay (PRO-016)
|
|
97
|
+
"FlexRayDecoder",
|
|
98
|
+
"FlexRayFrame",
|
|
99
|
+
"FlexRaySegment",
|
|
100
|
+
# HDLC (PRO-013)
|
|
101
|
+
"HDLCDecoder",
|
|
102
|
+
# I2C (PRO-004)
|
|
103
|
+
"I2CDecoder",
|
|
104
|
+
# I2S (PRO-011)
|
|
105
|
+
"I2SDecoder",
|
|
106
|
+
"I2SMode",
|
|
107
|
+
# JTAG (PRO-009)
|
|
108
|
+
"JTAGDecoder",
|
|
109
|
+
# LIN (PRO-008)
|
|
110
|
+
"LINDecoder",
|
|
111
|
+
"LINVersion",
|
|
112
|
+
# Manchester (PRO-014)
|
|
113
|
+
"ManchesterDecoder",
|
|
114
|
+
"ManchesterMode",
|
|
115
|
+
# 1-Wire (PRO-007)
|
|
116
|
+
"OneWireDecoder",
|
|
117
|
+
"OneWireMode",
|
|
118
|
+
"OneWireROMCommand",
|
|
119
|
+
"OneWireROMID",
|
|
120
|
+
"OneWireTimings",
|
|
121
|
+
"OptionDef",
|
|
122
|
+
# Base
|
|
123
|
+
"ProtocolDecoder",
|
|
124
|
+
# SPI (PRO-003)
|
|
125
|
+
"SPIDecoder",
|
|
126
|
+
# SWD (PRO-010)
|
|
127
|
+
"SWDDecoder",
|
|
128
|
+
"SWDResponse",
|
|
129
|
+
"SyncDecoder",
|
|
130
|
+
"TAPState",
|
|
131
|
+
# UART (PRO-002)
|
|
132
|
+
"UARTDecoder",
|
|
133
|
+
# USB (PRO-012)
|
|
134
|
+
"USBDecoder",
|
|
135
|
+
"USBSpeed",
|
|
136
|
+
"decode_can",
|
|
137
|
+
"decode_can_fd",
|
|
138
|
+
"decode_flexray",
|
|
139
|
+
"decode_hdlc",
|
|
140
|
+
"decode_i2c",
|
|
141
|
+
"decode_i2s",
|
|
142
|
+
"decode_jtag",
|
|
143
|
+
"decode_lin",
|
|
144
|
+
"decode_manchester",
|
|
145
|
+
"decode_onewire",
|
|
146
|
+
"decode_spi",
|
|
147
|
+
"decode_swd",
|
|
148
|
+
"decode_uart",
|
|
149
|
+
"decode_usb",
|
|
150
|
+
]
|