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
oscura/dsl/__init__.py
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"""Oscura DSL - Domain-Specific Language for trace analysis.
|
|
2
|
+
|
|
3
|
+
Provides a simple, declarative language for defining trace analysis workflows.
|
|
4
|
+
|
|
5
|
+
Example usage:
|
|
6
|
+
```python
|
|
7
|
+
from oscura.dsl import execute_dsl
|
|
8
|
+
|
|
9
|
+
# Execute DSL script
|
|
10
|
+
script = '''
|
|
11
|
+
$data = load "capture.csv"
|
|
12
|
+
$filtered = $data | filter lowpass 1000
|
|
13
|
+
$rise = $filtered | measure rise_time
|
|
14
|
+
'''
|
|
15
|
+
|
|
16
|
+
env = execute_dsl(script)
|
|
17
|
+
print(f"Rise time: {env['$rise']}")
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Or start interactive REPL:
|
|
21
|
+
```python
|
|
22
|
+
from oscura.dsl import start_repl
|
|
23
|
+
start_repl()
|
|
24
|
+
```
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
from oscura.dsl.commands import BUILTIN_COMMANDS
|
|
28
|
+
from oscura.dsl.interpreter import Interpreter, InterpreterError, execute_dsl
|
|
29
|
+
from oscura.dsl.parser import (
|
|
30
|
+
Assignment,
|
|
31
|
+
Command,
|
|
32
|
+
Expression,
|
|
33
|
+
ForLoop,
|
|
34
|
+
FunctionCall,
|
|
35
|
+
Lexer,
|
|
36
|
+
Literal,
|
|
37
|
+
Parser,
|
|
38
|
+
Pipeline,
|
|
39
|
+
Statement,
|
|
40
|
+
Token,
|
|
41
|
+
TokenType,
|
|
42
|
+
Variable,
|
|
43
|
+
parse_dsl,
|
|
44
|
+
)
|
|
45
|
+
from oscura.dsl.repl import REPL, start_repl
|
|
46
|
+
|
|
47
|
+
__all__ = [
|
|
48
|
+
# Commands
|
|
49
|
+
"BUILTIN_COMMANDS",
|
|
50
|
+
# REPL
|
|
51
|
+
"REPL",
|
|
52
|
+
# AST nodes
|
|
53
|
+
"Assignment",
|
|
54
|
+
"Command",
|
|
55
|
+
"Expression",
|
|
56
|
+
"ForLoop",
|
|
57
|
+
"FunctionCall",
|
|
58
|
+
# Interpreter
|
|
59
|
+
"Interpreter",
|
|
60
|
+
"InterpreterError",
|
|
61
|
+
# Parser
|
|
62
|
+
"Lexer",
|
|
63
|
+
"Literal",
|
|
64
|
+
"Parser",
|
|
65
|
+
"Pipeline",
|
|
66
|
+
"Statement",
|
|
67
|
+
"Token",
|
|
68
|
+
"TokenType",
|
|
69
|
+
"Variable",
|
|
70
|
+
"execute_dsl",
|
|
71
|
+
"parse_dsl",
|
|
72
|
+
"start_repl",
|
|
73
|
+
]
|
oscura/dsl/commands.py
ADDED
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
"""Oscura DSL Commands.
|
|
2
|
+
|
|
3
|
+
Built-in command implementations for DSL.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import sys
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
from oscura.core.exceptions import OscuraError
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def cmd_load(filename: str) -> Any:
|
|
14
|
+
"""Load a trace file.
|
|
15
|
+
|
|
16
|
+
Args:
|
|
17
|
+
filename: Path to trace file
|
|
18
|
+
|
|
19
|
+
Returns:
|
|
20
|
+
Loaded trace object
|
|
21
|
+
|
|
22
|
+
Raises:
|
|
23
|
+
OscuraError: If file cannot be loaded
|
|
24
|
+
"""
|
|
25
|
+
path = Path(filename)
|
|
26
|
+
|
|
27
|
+
if not path.exists():
|
|
28
|
+
raise OscuraError(f"File not found: {filename}")
|
|
29
|
+
|
|
30
|
+
# Determine loader based on extension
|
|
31
|
+
ext = path.suffix.lower()
|
|
32
|
+
|
|
33
|
+
try:
|
|
34
|
+
if ext == ".csv":
|
|
35
|
+
from oscura.loaders.csv import ( # type: ignore[import-not-found]
|
|
36
|
+
load_csv, # type: ignore[import-not-found]
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
return load_csv(str(path))
|
|
40
|
+
elif ext == ".bin":
|
|
41
|
+
from oscura.loaders.binary import ( # type: ignore[import-not-found]
|
|
42
|
+
load_binary, # type: ignore[import-not-found]
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
return load_binary(str(path))
|
|
46
|
+
elif ext in (".h5", ".hdf5"):
|
|
47
|
+
from oscura.loaders.hdf5 import ( # type: ignore[import-not-found]
|
|
48
|
+
load_hdf5, # type: ignore[import-not-found]
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
return load_hdf5(str(path))
|
|
52
|
+
else:
|
|
53
|
+
raise OscuraError(f"Unsupported file format: {ext}")
|
|
54
|
+
|
|
55
|
+
except ImportError as e:
|
|
56
|
+
raise OscuraError(f"Loader not available for {ext}: {e}") # noqa: B904
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def cmd_filter(trace: Any, filter_type: str, *args: Any, **kwargs: Any) -> Any:
|
|
60
|
+
"""Apply filter to trace.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
trace: Input trace
|
|
64
|
+
filter_type: Filter type (lowpass, highpass, bandpass, bandstop)
|
|
65
|
+
*args: Filter parameters (cutoff frequency, etc.)
|
|
66
|
+
**kwargs: Additional filter options
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
Filtered trace
|
|
70
|
+
|
|
71
|
+
Raises:
|
|
72
|
+
OscuraError: If filter cannot be applied
|
|
73
|
+
"""
|
|
74
|
+
try:
|
|
75
|
+
from oscura.filtering import filters # type: ignore[attr-defined]
|
|
76
|
+
|
|
77
|
+
if filter_type.lower() == "lowpass":
|
|
78
|
+
if len(args) < 1:
|
|
79
|
+
raise OscuraError("lowpass filter requires cutoff frequency")
|
|
80
|
+
return filters.low_pass(trace, cutoff=args[0], **kwargs)
|
|
81
|
+
|
|
82
|
+
elif filter_type.lower() == "highpass":
|
|
83
|
+
if len(args) < 1:
|
|
84
|
+
raise OscuraError("highpass filter requires cutoff frequency")
|
|
85
|
+
return filters.high_pass(trace, cutoff=args[0], **kwargs)
|
|
86
|
+
|
|
87
|
+
elif filter_type.lower() == "bandpass":
|
|
88
|
+
if len(args) < 2:
|
|
89
|
+
raise OscuraError("bandpass filter requires low and high cutoff frequencies")
|
|
90
|
+
return filters.band_pass(trace, low=args[0], high=args[1], **kwargs)
|
|
91
|
+
|
|
92
|
+
elif filter_type.lower() == "bandstop":
|
|
93
|
+
if len(args) < 2:
|
|
94
|
+
raise OscuraError("bandstop filter requires low and high cutoff frequencies")
|
|
95
|
+
return filters.band_stop(trace, low=args[0], high=args[1], **kwargs)
|
|
96
|
+
|
|
97
|
+
else:
|
|
98
|
+
raise OscuraError(f"Unknown filter type: {filter_type}")
|
|
99
|
+
|
|
100
|
+
except ImportError:
|
|
101
|
+
raise OscuraError("Filtering module not available") # noqa: B904
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def cmd_measure(trace: Any, *measurements: str) -> Any:
|
|
105
|
+
"""Measure properties of trace.
|
|
106
|
+
|
|
107
|
+
Args:
|
|
108
|
+
trace: Input trace
|
|
109
|
+
*measurements: Measurement names (rise_time, fall_time, etc.)
|
|
110
|
+
|
|
111
|
+
Returns:
|
|
112
|
+
Measurement results (single value or dict)
|
|
113
|
+
|
|
114
|
+
Raises:
|
|
115
|
+
OscuraError: If measurement cannot be performed
|
|
116
|
+
"""
|
|
117
|
+
try:
|
|
118
|
+
from oscura.analyzers import ( # type: ignore[attr-defined]
|
|
119
|
+
measurements as meas, # type: ignore[attr-defined]
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
if len(measurements) == 0:
|
|
123
|
+
raise OscuraError("measure command requires at least one measurement name")
|
|
124
|
+
|
|
125
|
+
results = {}
|
|
126
|
+
|
|
127
|
+
for measurement in measurements:
|
|
128
|
+
meas_name = measurement.lower()
|
|
129
|
+
|
|
130
|
+
if meas_name == "rise_time":
|
|
131
|
+
results["rise_time"] = meas.rise_time(trace)
|
|
132
|
+
elif meas_name == "fall_time":
|
|
133
|
+
results["fall_time"] = meas.fall_time(trace)
|
|
134
|
+
elif meas_name == "period":
|
|
135
|
+
results["period"] = meas.period(trace)
|
|
136
|
+
elif meas_name == "frequency":
|
|
137
|
+
results["frequency"] = meas.frequency(trace)
|
|
138
|
+
elif meas_name == "amplitude":
|
|
139
|
+
results["amplitude"] = meas.amplitude(trace)
|
|
140
|
+
elif meas_name == "mean":
|
|
141
|
+
results["mean"] = meas.mean(trace)
|
|
142
|
+
elif meas_name == "rms":
|
|
143
|
+
results["rms"] = meas.rms(trace)
|
|
144
|
+
elif meas_name == "all":
|
|
145
|
+
# Measure all available measurements
|
|
146
|
+
results = meas.measure_all(trace)
|
|
147
|
+
break
|
|
148
|
+
else:
|
|
149
|
+
raise OscuraError(f"Unknown measurement: {measurement}")
|
|
150
|
+
|
|
151
|
+
# Return single value if only one measurement
|
|
152
|
+
if len(results) == 1:
|
|
153
|
+
return next(iter(results.values()))
|
|
154
|
+
|
|
155
|
+
return results
|
|
156
|
+
|
|
157
|
+
except ImportError:
|
|
158
|
+
raise OscuraError("Measurements module not available") # noqa: B904
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def cmd_plot(trace: Any, **options: Any) -> None:
|
|
162
|
+
"""Plot trace.
|
|
163
|
+
|
|
164
|
+
Args:
|
|
165
|
+
trace: Input trace
|
|
166
|
+
**options: Plot options (title, annotate, etc.)
|
|
167
|
+
|
|
168
|
+
Raises:
|
|
169
|
+
OscuraError: If plotting fails
|
|
170
|
+
"""
|
|
171
|
+
try:
|
|
172
|
+
from oscura.visualization import ( # type: ignore[attr-defined]
|
|
173
|
+
plot as plot_module, # type: ignore[attr-defined]
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
title = options.get("title", "Trace Plot")
|
|
177
|
+
annotate = options.get("annotate")
|
|
178
|
+
|
|
179
|
+
plot_module.plot_trace(trace, title=title)
|
|
180
|
+
|
|
181
|
+
if annotate:
|
|
182
|
+
plot_module.add_annotation(annotate)
|
|
183
|
+
|
|
184
|
+
plot_module.show()
|
|
185
|
+
|
|
186
|
+
except ImportError:
|
|
187
|
+
raise OscuraError("Visualization module not available") # noqa: B904
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def cmd_export(data: Any, format_type: str, filename: str | None = None) -> None:
|
|
191
|
+
"""Export data to file.
|
|
192
|
+
|
|
193
|
+
Args:
|
|
194
|
+
data: Data to export (trace, measurements, etc.)
|
|
195
|
+
format_type: Export format (json, csv, hdf5)
|
|
196
|
+
filename: Output filename (optional, auto-generated if None)
|
|
197
|
+
|
|
198
|
+
Raises:
|
|
199
|
+
OscuraError: If export fails
|
|
200
|
+
"""
|
|
201
|
+
try:
|
|
202
|
+
from oscura.exporters import exporters # type: ignore[attr-defined]
|
|
203
|
+
|
|
204
|
+
if filename is None:
|
|
205
|
+
filename = f"export.{format_type}"
|
|
206
|
+
|
|
207
|
+
fmt = format_type.lower()
|
|
208
|
+
|
|
209
|
+
if fmt == "json":
|
|
210
|
+
exporters.json(data, filename)
|
|
211
|
+
elif fmt == "csv":
|
|
212
|
+
exporters.csv(data, filename)
|
|
213
|
+
elif fmt in ("h5", "hdf5"):
|
|
214
|
+
exporters.hdf5(data, filename)
|
|
215
|
+
else:
|
|
216
|
+
raise OscuraError(f"Unknown export format: {format_type}")
|
|
217
|
+
|
|
218
|
+
print(f"Exported to {filename}", file=sys.stderr)
|
|
219
|
+
|
|
220
|
+
except ImportError:
|
|
221
|
+
raise OscuraError("Export module not available") # noqa: B904
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
def cmd_glob(pattern: str) -> list[str]:
|
|
225
|
+
"""Glob files matching pattern.
|
|
226
|
+
|
|
227
|
+
Args:
|
|
228
|
+
pattern: Glob pattern (*.csv, etc.)
|
|
229
|
+
|
|
230
|
+
Returns:
|
|
231
|
+
List of matching filenames
|
|
232
|
+
"""
|
|
233
|
+
from glob import glob as glob_func
|
|
234
|
+
|
|
235
|
+
return list(glob_func(pattern)) # noqa: PTH207
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
# Command registry
|
|
239
|
+
BUILTIN_COMMANDS = {
|
|
240
|
+
"load": cmd_load,
|
|
241
|
+
"filter": cmd_filter,
|
|
242
|
+
"measure": cmd_measure,
|
|
243
|
+
"plot": cmd_plot,
|
|
244
|
+
"export": cmd_export,
|
|
245
|
+
"glob": cmd_glob,
|
|
246
|
+
}
|