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
oscura/dsl/__init__.py
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"""TraceKit 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
|
+
"""TraceKit 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 TraceKitError
|
|
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
|
+
TraceKitError: If file cannot be loaded
|
|
24
|
+
"""
|
|
25
|
+
path = Path(filename)
|
|
26
|
+
|
|
27
|
+
if not path.exists():
|
|
28
|
+
raise TraceKitError(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 TraceKitError(f"Unsupported file format: {ext}")
|
|
54
|
+
|
|
55
|
+
except ImportError as e:
|
|
56
|
+
raise TraceKitError(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
|
+
TraceKitError: 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 TraceKitError("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 TraceKitError("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 TraceKitError("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 TraceKitError("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 TraceKitError(f"Unknown filter type: {filter_type}")
|
|
99
|
+
|
|
100
|
+
except ImportError:
|
|
101
|
+
raise TraceKitError("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
|
+
TraceKitError: 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 TraceKitError("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 TraceKitError(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 TraceKitError("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
|
+
TraceKitError: 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 TraceKitError("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
|
+
TraceKitError: 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 TraceKitError(f"Unknown export format: {format_type}")
|
|
217
|
+
|
|
218
|
+
print(f"Exported to {filename}", file=sys.stderr)
|
|
219
|
+
|
|
220
|
+
except ImportError:
|
|
221
|
+
raise TraceKitError("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
|
+
}
|