oep-client-python 0.0.41__py3-none-any.whl → 0.0.42__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.
- oep_client/__init__.py +1 -1
- oep_client/{conformance.py → conformance/__init__.py} +40 -37
- oep_client/{conformance_allocator.py → conformance/allocator.py} +2 -2
- oep_client/{virtual_allocator_model.py → conformance/allocator_model.py} +2 -2
- oep_client/{conformance_allocator_sample.py → conformance/allocator_sample.py} +2 -2
- oep_client/{conformance_analog.py → conformance/analog.py} +4 -4
- oep_client/{virtual_analog_model.py → conformance/analog_model.py} +6 -6
- oep_client/{conformance_analog_payload.py → conformance/analog_payload.py} +1 -1
- oep_client/{conformance_analog_sample.py → conformance/analog_sample.py} +1 -1
- oep_client/{conformance_arm_adi.py → conformance/arm_adi.py} +2 -2
- oep_client/{conformance_arm_adi_blocks.py → conformance/arm_adi_blocks.py} +2 -2
- oep_client/{virtual_arm_adi_model.py → conformance/arm_adi_model.py} +2 -2
- oep_client/{conformance_arm_adi_sample.py → conformance/arm_adi_sample.py} +1 -1
- oep_client/{conformance_attach.py → conformance/attach.py} +5 -6
- oep_client/{virtual_attach_model.py → conformance/attach_model.py} +7 -7
- oep_client/{conformance_attach_sample.py → conformance/attach_sample.py} +1 -1
- oep_client/{virtual_block_model.py → conformance/block_model.py} +2 -2
- oep_client/{conformance_block_sample.py → conformance/block_sample.py} +1 -1
- oep_client/{conformance_blocks.py → conformance/blocks.py} +3 -3
- oep_client/{conformance_capture_group.py → conformance/capture_group.py} +3 -3
- oep_client/{conformance_capture_group_geometry.py → conformance/capture_group_geometry.py} +1 -1
- oep_client/{virtual_capture_group_geometry_model.py → conformance/capture_group_geometry_model.py} +1 -1
- oep_client/{virtual_capture_group_model.py → conformance/capture_group_model.py} +7 -7
- oep_client/{conformance_capture_group_sample.py → conformance/capture_group_sample.py} +1 -1
- oep_client/{conformance_capture_metadata.py → conformance/capture_metadata.py} +2 -2
- oep_client/{virtual_capture_metadata_model.py → conformance/capture_metadata_model.py} +2 -2
- oep_client/{conformance_capture_serial.py → conformance/capture_serial.py} +3 -3
- oep_client/{conformance_capture_serial_sample.py → conformance/capture_serial_sample.py} +5 -5
- oep_client/{conformance_capture_timeline.py → conformance/capture_timeline.py} +2 -2
- oep_client/{conformance_capture_timeline_lifecycle.py → conformance/capture_timeline_lifecycle.py} +2 -2
- oep_client/{virtual_capture_timeline_model.py → conformance/capture_timeline_model.py} +7 -7
- oep_client/{conformance_capture_timeline_sample.py → conformance/capture_timeline_sample.py} +1 -1
- oep_client/{conformance_clock.py → conformance/clock.py} +1 -1
- oep_client/{virtual_clock_model.py → conformance/clock_model.py} +2 -2
- oep_client/{conformance_clock_sample.py → conformance/clock_sample.py} +1 -1
- oep_client/{conformance_core_fixed_fields.py → conformance/core_fixed_fields.py} +2 -2
- oep_client/{conformance_core_smoke.py → conformance/core_smoke.py} +2 -2
- oep_client/{conformance_corr.py → conformance/corr.py} +2 -2
- oep_client/{conformance_cut.py → conformance/cut.py} +2 -2
- oep_client/{virtual_cut_model.py → conformance/cut_model.py} +3 -3
- oep_client/{conformance_cut_sample.py → conformance/cut_sample.py} +1 -1
- oep_client/{conformance_data.py → conformance/data.py} +2 -2
- oep_client/{virtual_data_model.py → conformance/data_model.py} +4 -4
- oep_client/{conformance_data_sample.py → conformance/data_sample.py} +1 -1
- oep_client/{conformance_debug.py → conformance/debug.py} +2 -2
- oep_client/{virtual_debug_model.py → conformance/debug_model.py} +2 -2
- oep_client/{conformance_debug_sample.py → conformance/debug_sample.py} +1 -1
- oep_client/{virtual_declaration_model.py → conformance/declaration_model.py} +2 -2
- oep_client/{conformance_dependencies.py → conformance/dependencies.py} +1 -1
- oep_client/{virtual_dependency_model.py → conformance/dependency_model.py} +3 -3
- oep_client/{conformance_dependency_sample.py → conformance/dependency_sample.py} +1 -1
- oep_client/{conformance_discovery.py → conformance/discovery.py} +1 -1
- oep_client/{conformance_dmseq.py → conformance/dmseq.py} +2 -2
- oep_client/{virtual_dmseq_model.py → conformance/dmseq_model.py} +3 -3
- oep_client/{conformance_dmseq_sample.py → conformance/dmseq_sample.py} +1 -1
- oep_client/{conformance_dmseq_target.py → conformance/dmseq_target.py} +2 -2
- oep_client/{virtual_dmseq_target_model.py → conformance/dmseq_target_model.py} +1 -1
- oep_client/{conformance_dmseq_target_sample.py → conformance/dmseq_target_sample.py} +2 -2
- oep_client/{conformance_execution_order.py → conformance/execution_order.py} +2 -2
- oep_client/{conformance_execution_order_sample.py → conformance/execution_order_sample.py} +1 -1
- oep_client/{conformance_exhausted.py → conformance/exhausted.py} +5 -5
- oep_client/{conformance_exhausted_sample.py → conformance/exhausted_sample.py} +2 -2
- oep_client/{conformance_fixture_metadata.py → conformance/fixture_metadata.py} +2 -2
- oep_client/{virtual_fixture_metadata_model.py → conformance/fixture_metadata_model.py} +2 -2
- oep_client/{conformance_gpio.py → conformance/gpio.py} +2 -2
- oep_client/{conformance_gpio_lifecycle.py → conformance/gpio_lifecycle.py} +2 -2
- oep_client/{virtual_gpio_lifecycle_model.py → conformance/gpio_lifecycle_model.py} +1 -1
- oep_client/{conformance_gpio_lifecycle_sample.py → conformance/gpio_lifecycle_sample.py} +1 -1
- oep_client/{virtual_gpio_model.py → conformance/gpio_model.py} +2 -2
- oep_client/{conformance_gpio_sample.py → conformance/gpio_sample.py} +1 -1
- oep_client/{conformance_host_core.py → conformance/host_core.py} +2 -2
- oep_client/{conformance_host_deadline.py → conformance/host_deadline.py} +1 -1
- oep_client/{conformance_host_deadline_sample.py → conformance/host_deadline_sample.py} +2 -2
- oep_client/{conformance_host_notifications.py → conformance/host_notifications.py} +3 -3
- oep_client/{conformance_host_notifications_sample.py → conformance/host_notifications_sample.py} +1 -1
- oep_client/{conformance_host_request_sample.py → conformance/host_request_sample.py} +1 -1
- oep_client/{conformance_host_requests.py → conformance/host_requests.py} +4 -4
- oep_client/{conformance_host_resend.py → conformance/host_resend.py} +3 -3
- oep_client/{conformance_host_resend_sample.py → conformance/host_resend_sample.py} +4 -4
- oep_client/{conformance_host_tlv.py → conformance/host_tlv.py} +3 -3
- oep_client/{conformance_host_tlv_sample.py → conformance/host_tlv_sample.py} +1 -1
- oep_client/{conformance_host_values.py → conformance/host_values.py} +3 -3
- oep_client/{conformance_host_values_sample.py → conformance/host_values_sample.py} +1 -1
- oep_client/{conformance_host_wait.py → conformance/host_wait.py} +2 -2
- oep_client/{conformance_host_wait_sample.py → conformance/host_wait_sample.py} +2 -2
- oep_client/{conformance_i2c.py → conformance/i2c.py} +2 -2
- oep_client/{virtual_i2c_model.py → conformance/i2c_model.py} +5 -5
- oep_client/{conformance_i2c_sample.py → conformance/i2c_sample.py} +1 -1
- oep_client/{conformance_interface_smoke.py → conformance/interface_smoke.py} +5 -5
- oep_client/{conformance_interfaces.py → conformance/interfaces.py} +1 -1
- oep_client/{conformance_lease.py → conformance/lease.py} +2 -2
- oep_client/{conformance_lease_sample.py → conformance/lease_sample.py} +2 -2
- oep_client/{conformance_link_routes.py → conformance/link_routes.py} +3 -3
- oep_client/{virtual_link_routes_model.py → conformance/link_routes_model.py} +2 -2
- oep_client/{conformance_link_routes_sample.py → conformance/link_routes_sample.py} +1 -1
- oep_client/{virtual_link_transfer_model.py → conformance/link_transfer_model.py} +3 -3
- oep_client/{conformance_link_transfer_sample.py → conformance/link_transfer_sample.py} +1 -1
- oep_client/{conformance_link_transfers.py → conformance/link_transfers.py} +2 -2
- oep_client/{conformance_logic.py → conformance/logic.py} +5 -9
- oep_client/{virtual_logic_model.py → conformance/logic_model.py} +6 -6
- oep_client/{conformance_logic_sample.py → conformance/logic_sample.py} +1 -1
- oep_client/{conformance_mailbox.py → conformance/mailbox.py} +2 -2
- oep_client/{virtual_mailbox_model.py → conformance/mailbox_model.py} +2 -2
- oep_client/{conformance_mailbox_sample.py → conformance/mailbox_sample.py} +1 -1
- oep_client/{virtual_notification_model.py → conformance/notification_model.py} +5 -5
- oep_client/{conformance_notification_retention.py → conformance/notification_retention.py} +2 -2
- oep_client/{conformance_notification_retention_sample.py → conformance/notification_retention_sample.py} +3 -3
- oep_client/{conformance_notification_sequence.py → conformance/notification_sequence.py} +2 -2
- oep_client/{conformance_notification_sequence_sample.py → conformance/notification_sequence_sample.py} +1 -1
- oep_client/{virtual_oep_declaration_model.py → conformance/oep_declaration_model.py} +5 -5
- oep_client/{conformance_oep_declarations.py → conformance/oep_declarations.py} +1 -1
- oep_client/{conformance_oep_smoke.py → conformance/oep_smoke.py} +3 -3
- oep_client/{virtual_outcome_model.py → conformance/outcome_model.py} +2 -2
- oep_client/{conformance_outcome_sample.py → conformance/outcome_sample.py} +1 -1
- oep_client/{conformance_outcomes.py → conformance/outcomes.py} +1 -1
- oep_client/{conformance_pipeline.py → conformance/pipeline.py} +1 -1
- oep_client/{virtual_pipeline_model.py → conformance/pipeline_model.py} +1 -1
- oep_client/{conformance_pipeline_sample.py → conformance/pipeline_sample.py} +1 -1
- oep_client/{conformance_port_speed.py → conformance/port_speed.py} +2 -2
- oep_client/{conformance_port_speed_execution.py → conformance/port_speed_execution.py} +2 -2
- oep_client/{virtual_port_speed_execution_model.py → conformance/port_speed_execution_model.py} +2 -2
- oep_client/{conformance_port_speed_execution_sample.py → conformance/port_speed_execution_sample.py} +1 -1
- oep_client/{conformance_port_speed_lifecycle.py → conformance/port_speed_lifecycle.py} +2 -2
- oep_client/{virtual_port_speed_model.py → conformance/port_speed_model.py} +2 -2
- oep_client/{conformance_port_speed_sample.py → conformance/port_speed_sample.py} +1 -1
- oep_client/{conformance_probe_input.py → conformance/probe_input.py} +3 -3
- oep_client/{conformance_probe_input_sample.py → conformance/probe_input_sample.py} +4 -4
- oep_client/{conformance_recovery.py → conformance/recovery.py} +4 -4
- oep_client/{conformance_recovery_race_sample.py → conformance/recovery_race_sample.py} +2 -2
- oep_client/{conformance_recovery_races.py → conformance/recovery_races.py} +5 -5
- oep_client/{conformance_recovery_sample.py → conformance/recovery_sample.py} +2 -2
- oep_client/{conformance_refusal_order.py → conformance/refusal_order.py} +3 -3
- oep_client/{conformance_refusal_order_sample.py → conformance/refusal_order_sample.py} +4 -4
- oep_client/{conformance_registered_ops.py → conformance/registered_ops.py} +1 -1
- oep_client/{virtual_registered_ops_model.py → conformance/registered_ops_model.py} +3 -3
- oep_client/{conformance_replay_pressure.py → conformance/replay_pressure.py} +2 -2
- oep_client/{conformance_reset.py → conformance/reset.py} +4 -4
- oep_client/{virtual_reset_model.py → conformance/reset_model.py} +6 -6
- oep_client/{conformance_reset_sample.py → conformance/reset_sample.py} +1 -1
- oep_client/{virtual_resource_model.py → conformance/resource_model.py} +3 -3
- oep_client/{conformance_resource_sample.py → conformance/resource_sample.py} +1 -1
- oep_client/{conformance_resources.py → conformance/resources.py} +1 -1
- oep_client/{conformance_response_race.py → conformance/response_race.py} +3 -3
- oep_client/{conformance_response_race_sample.py → conformance/response_race_sample.py} +3 -3
- oep_client/{conformance_restart.py → conformance/restart.py} +2 -2
- oep_client/{virtual_restart_model.py → conformance/restart_model.py} +2 -2
- oep_client/{conformance_restart_sample.py → conformance/restart_sample.py} +2 -2
- oep_client/{conformance_retention.py → conformance/retention.py} +7 -14
- oep_client/{conformance_retention_lifecycle.py → conformance/retention_lifecycle.py} +2 -2
- oep_client/{conformance_retention_lifecycle_sample.py → conformance/retention_lifecycle_sample.py} +1 -1
- oep_client/{virtual_retention_model.py → conformance/retention_model.py} +3 -3
- oep_client/{conformance_retention_sample.py → conformance/retention_sample.py} +1 -1
- oep_client/{conformance_retry.py → conformance/retry.py} +2 -2
- oep_client/{virtual_retry_model.py → conformance/retry_model.py} +2 -2
- oep_client/{conformance_retry_sample.py → conformance/retry_sample.py} +1 -1
- oep_client/{virtual_route_model.py → conformance/route_model.py} +5 -5
- oep_client/{conformance_route_sample.py → conformance/route_sample.py} +1 -1
- oep_client/{conformance_routes.py → conformance/routes.py} +1 -1
- oep_client/{conformance_run.py → conformance/run.py} +4 -4
- oep_client/{virtual_run_model.py → conformance/run_model.py} +4 -4
- oep_client/{conformance_run_sample.py → conformance/run_sample.py} +1 -1
- oep_client/{conformance_scan.py → conformance/scan.py} +5 -8
- oep_client/{virtual_scan_model.py → conformance/scan_model.py} +4 -5
- oep_client/{conformance_scan_options.py → conformance/scan_options.py} +6 -6
- oep_client/{virtual_scan_options_model.py → conformance/scan_options_model.py} +8 -10
- oep_client/{conformance_scan_options_sample.py → conformance/scan_options_sample.py} +1 -1
- oep_client/{conformance_scan_sample.py → conformance/scan_sample.py} +1 -1
- oep_client/{conformance_selected_metadata.py → conformance/selected_metadata.py} +2 -2
- oep_client/{virtual_selected_metadata_model.py → conformance/selected_metadata_model.py} +2 -2
- oep_client/{conformance_session_loss.py → conformance/session_loss.py} +4 -4
- oep_client/{conformance_session_loss_sample.py → conformance/session_loss_sample.py} +2 -2
- oep_client/{conformance_session_smoke.py → conformance/session_smoke.py} +2 -2
- oep_client/{conformance_spi.py → conformance/spi.py} +2 -2
- oep_client/{virtual_spi_model.py → conformance/spi_model.py} +2 -2
- oep_client/{conformance_spi_sample.py → conformance/spi_sample.py} +1 -1
- oep_client/{conformance_step.py → conformance/step.py} +3 -3
- oep_client/{virtual_step_model.py → conformance/step_model.py} +3 -3
- oep_client/{conformance_step_sample.py → conformance/step_sample.py} +1 -1
- oep_client/{conformance_stream.py → conformance/stream.py} +1 -1
- oep_client/{virtual_stream_model.py → conformance/stream_model.py} +5 -5
- oep_client/{conformance_stream_sample.py → conformance/stream_sample.py} +1 -1
- oep_client/{conformance_subscription_sample.py → conformance/subscription_sample.py} +1 -1
- oep_client/{conformance_subscriptions.py → conformance/subscriptions.py} +1 -1
- oep_client/{conformance_tcp.py → conformance/tcp.py} +1 -1
- oep_client/{conformance_tcp_peers.py → conformance/tcp_peers.py} +3 -3
- oep_client/{conformance_tcp_recovery.py → conformance/tcp_recovery.py} +3 -3
- oep_client/{conformance_tcp_recovery_sample.py → conformance/tcp_recovery_sample.py} +6 -6
- oep_client/{virtual_tlv_request_model.py → conformance/tlv_request_model.py} +5 -4
- oep_client/{conformance_tlv_requests.py → conformance/tlv_requests.py} +4 -8
- oep_client/{conformance_uart.py → conformance/uart.py} +5 -6
- oep_client/{virtual_uart_model.py → conformance/uart_model.py} +5 -6
- oep_client/{conformance_uart_sample.py → conformance/uart_sample.py} +1 -1
- oep_client/{conformance_uart_stream.py → conformance/uart_stream.py} +2 -2
- oep_client/{conformance_uart_stream_sample.py → conformance/uart_stream_sample.py} +1 -1
- oep_client/{conformance_usb.py → conformance/usb.py} +4 -4
- oep_client/{conformance_usb_cases.py → conformance/usb_cases.py} +3 -3
- oep_client/{conformance_usb_model.py → conformance/usb_model.py} +4 -4
- oep_client/{conformance_wire_options.py → conformance/wire_options.py} +7 -4
- oep_client/{virtual_wire_options_model.py → conformance/wire_options_model.py} +5 -10
- oep_client/{conformance_wire_options_sample.py → conformance/wire_options_sample.py} +1 -1
- oep_client/{conformance_writer_lease.py → conformance/writer_lease.py} +2 -2
- oep_client/{virtual_writer_lease_model.py → conformance/writer_lease_model.py} +2 -2
- oep_client/{conformance_writer_lease_sample.py → conformance/writer_lease_sample.py} +1 -1
- oep_client/endpoint.py +7 -7
- oep_client/host.py +1 -1
- oep_client/registry.py +4 -4
- oep_client/virtual_bench.py +2 -2
- oep_client/virtual_core.py +2 -2
- {oep_client_python-0.0.41.dist-info → oep_client_python-0.0.42.dist-info}/METADATA +1 -1
- oep_client_python-0.0.42.dist-info/RECORD +257 -0
- oep_client_python-0.0.41.dist-info/RECORD +0 -257
- /oep_client/{conformance_host_core_sample.py → conformance/host_core_sample.py} +0 -0
- /oep_client/{conformance_serial.py → conformance/serial.py} +0 -0
- {oep_client_python-0.0.41.dist-info → oep_client_python-0.0.42.dist-info}/WHEEL +0 -0
- {oep_client_python-0.0.41.dist-info → oep_client_python-0.0.42.dist-info}/entry_points.txt +0 -0
- {oep_client_python-0.0.41.dist-info → oep_client_python-0.0.42.dist-info}/licenses/LICENSE +0 -0
oep_client/__init__.py
CHANGED
|
@@ -18,7 +18,7 @@ import struct
|
|
|
18
18
|
import subprocess
|
|
19
19
|
import time
|
|
20
20
|
|
|
21
|
-
from
|
|
21
|
+
from ..hardware import equipment_lock, tomllib
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
CORE_CASES = (
|
|
@@ -112,35 +112,35 @@ def ops(value):
|
|
|
112
112
|
|
|
113
113
|
|
|
114
114
|
|
|
115
|
-
CHECKER_SOURCES = ('
|
|
116
|
-
'
|
|
117
|
-
'
|
|
118
|
-
'
|
|
119
|
-
'
|
|
120
|
-
'
|
|
121
|
-
'
|
|
122
|
-
'
|
|
123
|
-
'
|
|
124
|
-
'
|
|
125
|
-
'pytest_conformance.py', '
|
|
126
|
-
'
|
|
127
|
-
'
|
|
128
|
-
'
|
|
129
|
-
'
|
|
130
|
-
'
|
|
131
|
-
'
|
|
132
|
-
'
|
|
133
|
-
'
|
|
134
|
-
'
|
|
135
|
-
'
|
|
136
|
-
'
|
|
137
|
-
'
|
|
138
|
-
'
|
|
139
|
-
'
|
|
115
|
+
CHECKER_SOURCES = ('__init__.py', 'core_smoke.py', 'session_smoke.py', 'interface_smoke.py', 'oep_smoke.py', 'execution_order.py', 'execution_order_sample.py', 'host_notifications.py', 'host_notifications_sample.py',
|
|
116
|
+
'host_values.py', 'host_values_sample.py',
|
|
117
|
+
'tlv_requests.py',
|
|
118
|
+
'host_requests.py', 'host_request_sample.py',
|
|
119
|
+
'link_transfers.py', 'link_transfer_sample.py',
|
|
120
|
+
'link_routes.py', 'link_routes_sample.py',
|
|
121
|
+
'port_speed.py', 'port_speed_sample.py', 'port_speed_lifecycle.py', 'port_speed_execution.py', 'port_speed_execution_sample.py',
|
|
122
|
+
'host_tlv.py', 'host_tlv_sample.py', 'host_core.py', 'core_fixed_fields.py', 'probe_input.py', 'probe_input_sample.py', 'refusal_order.py', 'refusal_order_sample.py', 'restart.py', 'restart_sample.py', 'host_wait.py', 'host_wait_sample.py', 'host_deadline.py', 'host_deadline_sample.py', 'host_resend.py', 'host_resend_sample.py', 'tcp_recovery.py', 'tcp_recovery_sample.py', 'host_core_sample.py', 'allocator.py', 'allocator_sample.py', 'discovery.py', 'clock.py', 'clock_sample.py',
|
|
123
|
+
'notification_sequence.py', 'notification_sequence_sample.py', 'notification_retention.py', 'notification_retention_sample.py', 'serial.py', 'tcp.py',
|
|
124
|
+
'tcp_peers.py', 'usb.py', 'usb_cases.py',
|
|
125
|
+
'../pytest_conformance.py', 'resources.py', 'resource_sample.py',
|
|
126
|
+
'subscriptions.py', 'subscription_sample.py',
|
|
127
|
+
'data.py', 'data_sample.py',
|
|
128
|
+
'routes.py', 'route_sample.py',
|
|
129
|
+
'pipeline.py', 'pipeline_sample.py',
|
|
130
|
+
'replay_pressure.py', 'lease.py', 'lease_sample.py',
|
|
131
|
+
'retention.py', 'retention_sample.py',
|
|
132
|
+
'retention_lifecycle.py', 'retention_lifecycle_sample.py',
|
|
133
|
+
'corr.py', 'recovery.py', 'recovery_sample.py',
|
|
134
|
+
'recovery_races.py', 'recovery_race_sample.py',
|
|
135
|
+
'session_loss.py', 'session_loss_sample.py',
|
|
136
|
+
'exhausted.py', 'exhausted_sample.py', 'interfaces.py',
|
|
137
|
+
'stream.py', 'stream_sample.py',
|
|
138
|
+
'outcomes.py', 'outcome_sample.py',
|
|
139
|
+
'dependencies.py', 'dependency_sample.py', 'oep_declarations.py', 'attach.py', 'attach_sample.py', 'scan.py', 'scan_sample.py', 'mailbox.py', 'mailbox_sample.py', 'dmseq.py', 'dmseq_sample.py', 'dmseq_target.py', 'dmseq_target_sample.py', 'debug.py', 'debug_sample.py', 'blocks.py', 'block_sample.py', 'step.py', 'step_sample.py', 'reset.py', 'reset_sample.py', 'run.py', 'run_sample.py', 'wire_options.py', 'wire_options_sample.py', 'scan_options.py', 'scan_options_sample.py', 'retry.py', 'retry_sample.py', 'cut.py', 'cut_sample.py', 'writer_lease.py', 'writer_lease_sample.py', 'response_race.py', 'response_race_sample.py', 'registered_ops.py', 'selected_metadata.py','fixture_metadata.py','capture_metadata.py','gpio.py','gpio_sample.py','gpio_lifecycle.py','gpio_lifecycle_sample.py','uart.py','uart_sample.py','uart_stream.py','uart_stream_sample.py','i2c.py','i2c_sample.py','spi.py','spi_sample.py','logic.py','logic_sample.py','analog_payload.py','analog.py','analog_sample.py','capture_group.py','capture_group_sample.py','capture_group_geometry.py','capture_timeline.py','capture_timeline_sample.py','capture_timeline_lifecycle.py', 'capture_serial.py', 'capture_serial_sample.py','arm_adi.py','arm_adi_sample.py','arm_adi_blocks.py')
|
|
140
140
|
|
|
141
141
|
|
|
142
142
|
def checker_sources_sha256():
|
|
143
|
-
return {name: hashlib.sha256(Path(__file__).
|
|
143
|
+
return {name: hashlib.sha256((Path(__file__).parent / name).read_bytes()).hexdigest()
|
|
144
144
|
for name in CHECKER_SOURCES}
|
|
145
145
|
|
|
146
146
|
|
|
@@ -781,13 +781,16 @@ class Checks:
|
|
|
781
781
|
tail = b'\x01' + struct.pack('<H', len(owner)) + owner
|
|
782
782
|
if not self.owner_displayed(tail):
|
|
783
783
|
raise NotApplicable('owner display not implemented (core §6.4: optional); a non-critical owner is ignored')
|
|
784
|
-
tail
|
|
784
|
+
twice = tail + b'\x81\x06\x00second' # the same tag again (critical bit set): malformed (core §2.3)
|
|
785
|
+
self.corr = 0
|
|
786
|
+
self.rejected(self.request(self.core['open'], struct.pack('<IB', 3000, 0) + twice,
|
|
787
|
+
session=secrets.randbelow(0xffffffff) + 1), 'malformed')
|
|
785
788
|
with self.holding(tail=tail) as sid:
|
|
786
789
|
def observed_owner():
|
|
787
790
|
p = self.success(self.request(self.core['lock_state']))
|
|
788
791
|
require(len(p) >= 5 and p[0] == 1, 'owner lock state')
|
|
789
792
|
values = dict(reversed(tlvs(p[5:])))
|
|
790
|
-
require(values.get(1) == owner, 'owner changed
|
|
793
|
+
require(values.get(1) == owner, 'owner changed')
|
|
791
794
|
observed_owner()
|
|
792
795
|
self.success(self.request(self.core['open'], struct.pack('<IB', 3000, 0) + b'\x01\x06\x00second', session=sid))
|
|
793
796
|
observed_owner()
|
|
@@ -838,7 +841,7 @@ class Checks:
|
|
|
838
841
|
tlvs(self.success(self.request(self.core['keepalive'], session=new)))
|
|
839
842
|
|
|
840
843
|
def serial_case(self, kind):
|
|
841
|
-
from .
|
|
844
|
+
from .serial import frame, WireError
|
|
842
845
|
with self.holding(60000):
|
|
843
846
|
req = self.request(self.core['clock'])
|
|
844
847
|
good = frame(req)
|
|
@@ -897,8 +900,8 @@ class Checks:
|
|
|
897
900
|
record['serial_wire'] = self.wire.last_exchange
|
|
898
901
|
|
|
899
902
|
def tcp_case(self, kind):
|
|
900
|
-
from .
|
|
901
|
-
from .
|
|
903
|
+
from .tcp import frame
|
|
904
|
+
from .serial import WireError
|
|
902
905
|
req = self.request(self.core['clock']) # no session or target mutations
|
|
903
906
|
good = frame(req)
|
|
904
907
|
pause, close = 0, False
|
|
@@ -984,12 +987,12 @@ class Checks:
|
|
|
984
987
|
for name, kind in RECONNECT_CASES:
|
|
985
988
|
self.check(name, 'transports §3; core §5.1/6.1/9', lambda kind=kind: self.reconnect(kind))
|
|
986
989
|
if self.usb_wire is not None:
|
|
987
|
-
from .
|
|
990
|
+
from .usb_cases import USB_CASES, HID_CASES, run
|
|
988
991
|
cases = USB_CASES + (HID_CASES if self.usb_wire.kind == 'hid' else ())
|
|
989
992
|
for name, kind in cases:
|
|
990
993
|
self.check(name, 'transports §1/2/3; core §2.4', lambda kind=kind: run(self, kind))
|
|
991
994
|
if self.tcp_peer_open is not None:
|
|
992
|
-
from .
|
|
995
|
+
from .tcp_peers import Peers
|
|
993
996
|
peers = Peers(self)
|
|
994
997
|
for name, kind in TCP_PEER_CASES:
|
|
995
998
|
self.check(name, 'transports §1/3; core §4.2/4.4/6', lambda kind=kind: getattr(peers, kind)())
|
|
@@ -1036,7 +1039,7 @@ def main(argv=None):
|
|
|
1036
1039
|
require_reviewed_contract(registry, spec)
|
|
1037
1040
|
except Violation as exc:
|
|
1038
1041
|
parser.error(str(exc))
|
|
1039
|
-
from
|
|
1042
|
+
from .. import __version__, link
|
|
1040
1043
|
report = {'status': 'failed', 'spec': spec, 'client_version': __version__,
|
|
1041
1044
|
'checker_sha256': hashlib.sha256(Path(__file__).read_bytes()).hexdigest(),
|
|
1042
1045
|
'checker_sources_sha256': checker_sources_sha256(),
|
|
@@ -1051,7 +1054,7 @@ def main(argv=None):
|
|
|
1051
1054
|
if args.framing == 'serial':
|
|
1052
1055
|
if args.address.startswith(('usb:', 'tcp:', 'tcp://')):
|
|
1053
1056
|
raise ValueError('serial framing needs an explicit serial port')
|
|
1054
|
-
from .
|
|
1057
|
+
from .serial import SerialWire
|
|
1055
1058
|
stream = link.open_serial(args.address)
|
|
1056
1059
|
try:
|
|
1057
1060
|
wire = SerialWire(stream)
|
|
@@ -1067,7 +1070,7 @@ def main(argv=None):
|
|
|
1067
1070
|
link._exclusive_off(wire.stream)
|
|
1068
1071
|
wire.stream.close()
|
|
1069
1072
|
elif args.framing == 'tcp':
|
|
1070
|
-
from .
|
|
1073
|
+
from .tcp import TcpWire
|
|
1071
1074
|
wire = TcpWire.open(args.address)
|
|
1072
1075
|
try:
|
|
1073
1076
|
checks = Checks(wire.send, registry, args.unit)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""Core resource ID exhaustion, session retention and reboot boundary checks."""
|
|
2
2
|
import struct
|
|
3
|
-
from .
|
|
4
|
-
from .
|
|
3
|
+
from . import require,tlvs
|
|
4
|
+
from .resources import ResourceChecks
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
class AllocatorChecks(ResourceChecks):
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""Logical resource allocator boundary fixture; seed is not a history of real allocations."""
|
|
2
2
|
import copy
|
|
3
|
-
from
|
|
4
|
-
from .
|
|
3
|
+
from ..virtual_core import Core
|
|
4
|
+
from .resource_model import ResourceModel, Resources
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
class U32Resources(Resources):
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""Explicit allocator boundary controls; no probe-model imports."""
|
|
2
|
-
from .
|
|
3
|
-
from .
|
|
2
|
+
from .resource_sample import SampleResourceAdapter
|
|
3
|
+
from .route_sample import SampleRouteAdapter
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
class SampleAllocatorAdapter(SampleResourceAdapter,SampleRouteAdapter):
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"""Selected-SPEC ADC operations checked independently of model and Host decoder."""
|
|
2
2
|
import struct
|
|
3
|
-
from .
|
|
4
|
-
from .
|
|
5
|
-
from .
|
|
6
|
-
from .
|
|
3
|
+
from . import require, tlvs
|
|
4
|
+
from .logic import LogicChecks
|
|
5
|
+
from .analog_payload import AnalogPayloadChecks
|
|
6
|
+
from .registered_ops import RegisteredOpsChecks
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
class AnalogChecks(LogicChecks):
|
|
@@ -6,11 +6,11 @@ legacy virtual bench sampler or Host capture decoder.
|
|
|
6
6
|
import struct
|
|
7
7
|
|
|
8
8
|
from fractions import Fraction
|
|
9
|
-
from .
|
|
10
|
-
from
|
|
11
|
-
from
|
|
12
|
-
from
|
|
13
|
-
from
|
|
9
|
+
from .logic_model import Logic, LogicModel
|
|
10
|
+
from ..virtual_core import Core, Reject, tlv
|
|
11
|
+
from .. import registry as _reg
|
|
12
|
+
from ..catalog import pack_ops
|
|
13
|
+
from ..virtual_names import R, DC, cause
|
|
14
14
|
|
|
15
15
|
# oep.fixture.analog's numbers by name (capture §3)
|
|
16
16
|
_A = _reg.FIXTURE_ANALOG
|
|
@@ -77,7 +77,7 @@ class Analog(Logic):
|
|
|
77
77
|
if not known: # every copy of an unknown tag: critical -> unsupported (core §2.3)
|
|
78
78
|
if raw&128:raise Reject(R['unsupported'],bytes((raw,)))
|
|
79
79
|
continue
|
|
80
|
-
if key in seen and key!=C['frontend']:
|
|
80
|
+
if key in seen and key!=C['frontend']:raise Reject(R['malformed']) # a non-repeating tag twice (core §2.3); frontend repeats
|
|
81
81
|
seen.add(key)
|
|
82
82
|
if key==C['frontend']:frontends.append((raw,value))
|
|
83
83
|
else:got[key]=(raw,value)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""Independent ARM-ADI transfer checks and basic logical bus-block checks (debug §6)."""
|
|
2
2
|
import struct
|
|
3
|
-
from .
|
|
4
|
-
from .
|
|
3
|
+
from . import require, ops, tlvs
|
|
4
|
+
from .attach import AttachChecks
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
class ArmAdiChecks(AttachChecks):
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""Logical MEM-AP block packet, wrap and progress checks; retains base ARM checks."""
|
|
2
2
|
import struct
|
|
3
|
-
from .
|
|
4
|
-
from .
|
|
3
|
+
from . import require, tlvs
|
|
4
|
+
from .arm_adi import ArmAdiChecks
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
class ArmAdiBlockChecks(ArmAdiChecks):
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"""Logical ARM raw transfers and abstract bus blocks; no SWD electrical implementation."""
|
|
2
2
|
import copy
|
|
3
3
|
import struct
|
|
4
|
-
from .
|
|
5
|
-
from
|
|
4
|
+
from .attach_model import Attachments, AttachModel
|
|
5
|
+
from ..virtual_core import Core, Completed, Reject, tlv
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
def fixed_transfer(data):
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""SPEC-driven standard attach admission and console open checks."""
|
|
2
2
|
import struct
|
|
3
|
-
from .
|
|
4
|
-
from .
|
|
3
|
+
from . import require, ops, tlvs
|
|
4
|
+
from .registered_ops import refusal_carries
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
class AttachChecks:
|
|
@@ -96,9 +96,8 @@ class AttachChecks:
|
|
|
96
96
|
for tail in (b'\0\0\0',bytes((reset,)),bytes((self.unknown|128,4,0))+b'x',self.reset_tlv()+self.tlv(reset,b'x')):
|
|
97
97
|
self.refused(self.attach_request(sid,extra=tail),'malformed')
|
|
98
98
|
elif kind=='UNMARKED':self.attach(sid,extra=self.reset_tlv(marked=False)+self.tlv(self.unknown,b'x'))
|
|
99
|
-
elif kind=='
|
|
100
|
-
self.
|
|
101
|
-
require(self.a.state()['touch'][-1][2]==10,'a later copy of reset was used')
|
|
99
|
+
elif kind=='TWICE': # a non-repeating tag twice: malformed (core §2.3)
|
|
100
|
+
self.refused(self.attach_request(sid,speed=1500,extra=self.reset_tlv(hold=10)+self.reset_tlv(hold=20)),'malformed')
|
|
102
101
|
elif kind=='BUSY':
|
|
103
102
|
self.attach(sid);self.refused(self.attach_request(sid,pair=(0,1)),'unavailable',cause='pin_in_use') # never joined
|
|
104
103
|
self.refused(self.attach_request(sid,fn=2,pair=(0,65535)),'unavailable',cause='pin_in_use')
|
|
@@ -186,7 +185,7 @@ class AttachChecks:
|
|
|
186
185
|
self.c.observed['attach_fixture']={'selection':self.a.selection,'pairs':self.a.pairs,'mechanisms':self.a.mechanisms,'scope':'logical-model','reference':self.a.reference}
|
|
187
186
|
self.c.check('OEP-ATTACH-CONTEXT','debug §1/3/5; console §1',context)
|
|
188
187
|
if self.c.results[-1]['status']!='passed':self.c.abort=True
|
|
189
|
-
cases=[('WIRE-'+kind,lambda kind=kind:self.wire_case(kind)) for kind in ('SHORT','ZERO-SPEED','WIDTH','LOW-SPEED','PINS','METHOD','TLV','MALFORMED','UNMARKED','
|
|
188
|
+
cases=[('WIRE-'+kind,lambda kind=kind:self.wire_case(kind)) for kind in ('SHORT','ZERO-SPEED','WIDTH','LOW-SPEED','PINS','METHOD','TLV','MALFORMED','UNMARKED','TWICE','BUSY','CAPACITY','FAILED','REPLAY')]
|
|
190
189
|
cases += [('CONSOLE-'+kind,lambda kind=kind:self.console_case(kind)) for kind in ('UNSUPPORTED','RESOURCE','DUPLICATE','MALFORMED','INDEPENDENT','RECREATE-REPLAY')]+[('LOCKS',self.locks)]
|
|
191
190
|
for name,case in cases:
|
|
192
191
|
first=len(self.a.trace);self.c.check('OEP-ATTACH-'+name,'debug §1/3/5; console §1/2/3; core §2.3/5.2',case);self.c.results[-1]['adapter_trace']=self.a.trace[first:]
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"""Logical standard attach/console fixture; no electrical target operations."""
|
|
2
2
|
import struct
|
|
3
|
-
from
|
|
4
|
-
from .
|
|
5
|
-
from .
|
|
6
|
-
from
|
|
7
|
-
from
|
|
8
|
-
from
|
|
3
|
+
from ..virtual_core import Core, Completed, Reject, tlv
|
|
4
|
+
from .dependency_model import Dependencies, DependencyModel
|
|
5
|
+
from .stream_model import Stream
|
|
6
|
+
from .. import registry as _reg
|
|
7
|
+
from ..catalog import pack_ops
|
|
8
|
+
from ..virtual_names import R, DC, cause, extension
|
|
9
9
|
|
|
10
10
|
# the wire family's and the console's numbers by name (debug §1-§3, console §1-§3)
|
|
11
11
|
WOP, WT, WE = _reg.WIRE_RVSWD.op, _reg.WIRE_RVSWD.tlv, _reg.WIRE_RVSWD.enum
|
|
@@ -54,7 +54,7 @@ class Attachments(Dependencies):
|
|
|
54
54
|
if tag not in known:
|
|
55
55
|
if raw&128:raise Reject(R['unsupported'],bytes((raw,)))
|
|
56
56
|
continue
|
|
57
|
-
if size!=known[tag]:raise Reject(R['malformed'])
|
|
57
|
+
if size!=known[tag] or tag in result:raise Reject(R['malformed']) # another length, or the tag twice (core §2.3)
|
|
58
58
|
channel,hold=struct.unpack('<HH',value)
|
|
59
59
|
# not the reset line, or a hold past max_op_ms (debug §3, core §7.5): the tag as received, every copy
|
|
60
60
|
if channel!=self.reset_channel or hold>self.ep.max_op_ms:raise Reject(R['unsupported'],bytes((raw,)))
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"""Logical optional block fixture with explicit bus and scratch restoration."""
|
|
2
2
|
import copy
|
|
3
3
|
import struct
|
|
4
|
-
from .
|
|
5
|
-
from
|
|
4
|
+
from .debug_model import Debug, DebugModel, fixed_dmi
|
|
5
|
+
from ..virtual_core import Core, Completed, Reject, tlv
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
HARTSEL=(0x3ff<<6)|(0x3ff<<16)
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"""Independent optional riscv-dm block admission, progress and restoration checks."""
|
|
2
2
|
import struct
|
|
3
|
-
from .
|
|
4
|
-
from .
|
|
5
|
-
from .
|
|
3
|
+
from . import require, tlvs, ops
|
|
4
|
+
from .debug import DebugChecks
|
|
5
|
+
from .dmseq import target_frame
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
HARTSEL=(0x3ff<<6)|(0x3ff<<16)
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"""Independent selected-SPEC group wire/lifecycle checker for paired sample fixtures."""
|
|
2
2
|
import secrets
|
|
3
3
|
import struct
|
|
4
|
-
from .
|
|
5
|
-
from .
|
|
6
|
-
from .
|
|
4
|
+
from . import require, tlvs
|
|
5
|
+
from .registered_ops import RegisteredOpsChecks
|
|
6
|
+
from .analog_payload import AnalogPayloadChecks
|
|
7
7
|
|
|
8
8
|
NO_TIME=(1<<64)-1
|
|
9
9
|
LAST=0xffffffff
|
|
@@ -8,13 +8,13 @@ fn 4 is the checked group and fn 5 a peer group that only holds tracks; fns
|
|
|
8
8
|
import copy
|
|
9
9
|
import struct
|
|
10
10
|
from fractions import Fraction
|
|
11
|
-
from .
|
|
12
|
-
from .
|
|
13
|
-
from .
|
|
14
|
-
from
|
|
15
|
-
from
|
|
16
|
-
from
|
|
17
|
-
from
|
|
11
|
+
from .gpio_model import Gpio
|
|
12
|
+
from .logic_model import Logic, LogicModel
|
|
13
|
+
from .analog_model import Analog, refuse_output_idle
|
|
14
|
+
from ..virtual_core import Core, Reject, tlv
|
|
15
|
+
from .. import registry as _reg
|
|
16
|
+
from ..catalog import pack_ops
|
|
17
|
+
from ..virtual_names import R, DC, cause, UNAVAILABLE_TLV
|
|
18
18
|
|
|
19
19
|
# the capture family's numbers by name (capture §2-§4)
|
|
20
20
|
_L, _A, _G = _reg.FIXTURE_LOGIC, _reg.FIXTURE_ANALOG, _reg.FIXTURE_CAPTURE_GROUP
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""Read-only selected capture describe contracts, not op behavior."""
|
|
2
2
|
import struct
|
|
3
|
-
from .
|
|
4
|
-
from .
|
|
3
|
+
from . import require
|
|
4
|
+
from .registered_ops import RegisteredOpsChecks
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
class CaptureMetadataChecks:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""Independent capture describe fixture; no advertised op implementation."""
|
|
2
2
|
import struct
|
|
3
|
-
from .
|
|
4
|
-
from
|
|
3
|
+
from .registered_ops_model import RegisteredOps, RegisteredOpsModel
|
|
4
|
+
from ..virtual_core import Core, tlv
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
class CaptureMetadata(RegisteredOps):
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
import hashlib
|
|
3
3
|
from pathlib import Path
|
|
4
4
|
import struct
|
|
5
|
-
from .
|
|
6
|
-
from .
|
|
5
|
+
from . import require, tlvs
|
|
6
|
+
from .registered_ops import refusal_carries
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
def answered(reply,fixed):
|
|
@@ -15,7 +15,7 @@ def answered(reply,fixed):
|
|
|
15
15
|
def refused_stale(reply):
|
|
16
16
|
"""rejected unavailable carrying cause 6, other TLVs in any order around it (core §4.3)."""
|
|
17
17
|
return reply[3:5]==b'\0\4' and refusal_carries('unavailable',reply[5:],b'\1\1\0\6')
|
|
18
|
-
from .
|
|
18
|
+
from .host_deadline import reviewed_identity as core_identity
|
|
19
19
|
|
|
20
20
|
REVIEWED={'interfaces/oep-if-capture.ja.md':'ffd89a6a1abf006aea788a6b47b270e6ac0e6d8190a716f4123c4f499bd3a61e',
|
|
21
21
|
'interfaces/oep-if-common.ja.md':'25fed0b1b8b7f246a8b71d02cea810249803b1c3c1e9c3df466c04f38687f70c'}
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
import hashlib
|
|
3
3
|
from pathlib import Path
|
|
4
4
|
import struct
|
|
5
|
-
from
|
|
6
|
-
from
|
|
7
|
-
from .
|
|
8
|
-
from .
|
|
5
|
+
from .. import message
|
|
6
|
+
from ..virtual_core import tlv
|
|
7
|
+
from .logic_model import LogicModel
|
|
8
|
+
from .analog_model import AnalogModel
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
class SampleCaptureSerialAdapter:
|
|
@@ -58,4 +58,4 @@ class SampleCaptureSerialAdapter:
|
|
|
58
58
|
def source_sha256(self):
|
|
59
59
|
root=Path(__file__).parent
|
|
60
60
|
return {n:hashlib.sha256((root/n).read_bytes()).hexdigest() for n in
|
|
61
|
-
('
|
|
61
|
+
('logic_model.py','analog_model.py','../virtual_core.py','gpio_model.py','../message.py')}
|
|
@@ -6,8 +6,8 @@ configure answers; the waveform and clock are the documented fixture's.
|
|
|
6
6
|
"""
|
|
7
7
|
import struct
|
|
8
8
|
from fractions import Fraction
|
|
9
|
-
from .
|
|
10
|
-
from .
|
|
9
|
+
from . import require,tlvs
|
|
10
|
+
from .registered_ops import RegisteredOpsChecks
|
|
11
11
|
|
|
12
12
|
NO_TIME=(1<<64)-1
|
|
13
13
|
NONE=0xffffffff
|
oep_client/{conformance_capture_timeline_lifecycle.py → conformance/capture_timeline_lifecycle.py}
RENAMED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"""Selected-SPEC cross-rate group stop/error/replay, generation exhaustion, start failure, state table and ownership checks."""
|
|
2
2
|
import secrets
|
|
3
3
|
import struct
|
|
4
|
-
from .
|
|
5
|
-
from .
|
|
4
|
+
from . import require,tlvs
|
|
5
|
+
from .capture_timeline import CaptureTimelineChecks,NO_TIME,NONE,arrived
|
|
6
6
|
|
|
7
7
|
LAST=0xffffffff
|
|
8
8
|
|
|
@@ -8,12 +8,12 @@ import copy
|
|
|
8
8
|
import struct
|
|
9
9
|
|
|
10
10
|
from fractions import Fraction
|
|
11
|
-
from .
|
|
12
|
-
from
|
|
13
|
-
from .
|
|
14
|
-
from
|
|
15
|
-
from
|
|
16
|
-
from
|
|
11
|
+
from .gpio_model import Gpio, GpioModel
|
|
12
|
+
from ..virtual_core import Completed, Core, Reject, tlv
|
|
13
|
+
from .analog_model import refuse_output_idle
|
|
14
|
+
from .. import registry as _reg
|
|
15
|
+
from ..catalog import pack_ops
|
|
16
|
+
from ..virtual_names import R, DC, cause, UNAVAILABLE_TLV
|
|
17
17
|
|
|
18
18
|
# the capture family's numbers by name (capture §2-§4; one space for the family, core §2.5)
|
|
19
19
|
_L, _A, _G = _reg.FIXTURE_LOGIC, _reg.FIXTURE_ANALOG, _reg.FIXTURE_CAPTURE_GROUP
|
|
@@ -83,7 +83,7 @@ class Track:
|
|
|
83
83
|
if not known: # every copy of an unknown tag: critical -> unsupported (core §2.3)
|
|
84
84
|
if raw&128:raise Reject(R['unsupported'],bytes((raw,)))
|
|
85
85
|
continue
|
|
86
|
-
if key in seen and key!=C['frontend']:
|
|
86
|
+
if key in seen and key!=C['frontend']:raise Reject(R['malformed']) # a non-repeating tag twice (core §2.3); frontend repeats
|
|
87
87
|
seen.add(key)
|
|
88
88
|
if key==C['frontend']:frontends.append((raw,value))
|
|
89
89
|
else:got[key]=(raw,value)
|