oep-client-python 0.0.47__tar.gz → 0.0.49__tar.gz

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.
Files changed (727) hide show
  1. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/CHANGELOG.md +34 -0
  2. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/PKG-INFO +1 -1
  3. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/pyproject.toml +1 -1
  4. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/__init__.py +1 -1
  5. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/acquire.py +42 -11
  6. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/virtual_bench_capture.py +140 -20
  7. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_acquire.py +49 -0
  8. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_formats.py +24 -6
  9. oep_client_python-0.0.49/tests/test_virtual_bench_fast_samples.py +64 -0
  10. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/.gitignore +0 -0
  11. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/LICENSE +0 -0
  12. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/README.ja.md +0 -0
  13. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/README.md +0 -0
  14. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/README.ja.md +0 -0
  15. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/allocator-conformance.ja.md +0 -0
  16. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/analog-conformance.ja.md +0 -0
  17. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/analog-payload-conformance.ja.md +0 -0
  18. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/arm-adi-conformance.ja.md +0 -0
  19. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/attach-conformance.ja.md +0 -0
  20. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/block-conformance.ja.md +0 -0
  21. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/capture-group-conformance.ja.md +0 -0
  22. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/capture-group-geometry-conformance.ja.md +0 -0
  23. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/capture-metadata-conformance.ja.md +0 -0
  24. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/capture-serial-conformance.ja.md +0 -0
  25. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/capture-timeline-conformance.ja.md +0 -0
  26. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/capture-timeline-lifecycle-conformance.ja.md +0 -0
  27. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/clock-conformance.ja.md +0 -0
  28. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/config-conformance.ja.md +0 -0
  29. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/config-execution-conformance.ja.md +0 -0
  30. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/config-fallback-conformance.ja.md +0 -0
  31. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/config-paging-conformance.ja.md +0 -0
  32. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/config-power-loss-conformance.ja.md +0 -0
  33. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/config-storage-conformance.ja.md +0 -0
  34. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/conformance-checks.ja.md +0 -0
  35. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/conformance-spec-compatibility.ja.md +0 -0
  36. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/core-fixed-fields-review.ja.md +0 -0
  37. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/core-smoke-conformance.ja.md +0 -0
  38. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/corr-conformance.ja.md +0 -0
  39. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/cut-conformance.ja.md +0 -0
  40. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/data-conformance.ja.md +0 -0
  41. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/debug-conformance.ja.md +0 -0
  42. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/dependency-conformance.ja.md +0 -0
  43. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/discovery-conformance.ja.md +0 -0
  44. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/dmseq-conformance.ja.md +0 -0
  45. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/dmseq-target-conformance.ja.md +0 -0
  46. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/execution-order-conformance.ja.md +0 -0
  47. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/exhausted-conformance.ja.md +0 -0
  48. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/fixture-metadata-conformance.ja.md +0 -0
  49. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/gpio-conformance.ja.md +0 -0
  50. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/gpio-lifecycle-conformance.ja.md +0 -0
  51. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/hardware-configuration.ja.md +0 -0
  52. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/hardware-quickstart.ja.md +0 -0
  53. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/hardware-schema.ja.md +0 -0
  54. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/host-core-shapes-conformance.ja.md +0 -0
  55. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/host-deadline-conformance.ja.md +0 -0
  56. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/host-notification-conformance.ja.md +0 -0
  57. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/host-request-conformance.ja.md +0 -0
  58. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/host-resend-conformance.ja.md +0 -0
  59. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/host-tlv-conformance.ja.md +0 -0
  60. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/host-value-conformance.ja.md +0 -0
  61. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/host-wait-conformance.ja.md +0 -0
  62. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/i2c-conformance.ja.md +0 -0
  63. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/interface-conformance.ja.md +0 -0
  64. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/interface-smoke-conformance.ja.md +0 -0
  65. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/lease-conformance.ja.md +0 -0
  66. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/link-routes-conformance.ja.md +0 -0
  67. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/link-transfer-conformance.ja.md +0 -0
  68. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/logic-conformance.ja.md +0 -0
  69. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/mailbox-conformance.ja.md +0 -0
  70. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/notification-output-sample.ja.md +0 -0
  71. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/notification-retention-conformance.ja.md +0 -0
  72. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/notification-sequence-conformance.ja.md +0 -0
  73. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/oep-declaration-conformance.ja.md +0 -0
  74. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/oep-example-smoke-conformance.ja.md +0 -0
  75. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/outcome-conformance.ja.md +0 -0
  76. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/pin-constraints-conformance.ja.md +0 -0
  77. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/pipeline-conformance.ja.md +0 -0
  78. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/port-speed-conformance.ja.md +0 -0
  79. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/probe-input-conformance.ja.md +0 -0
  80. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/recovery-conformance.ja.md +0 -0
  81. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/recovery-races-conformance.ja.md +0 -0
  82. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/refusal-order-conformance.ja.md +0 -0
  83. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/registered-ops-conformance.ja.md +0 -0
  84. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/replay-pressure-conformance.ja.md +0 -0
  85. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/reset-conformance.ja.md +0 -0
  86. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/resource-conformance.ja.md +0 -0
  87. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/response-race-conformance.ja.md +0 -0
  88. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/restart-conformance.ja.md +0 -0
  89. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/retention-conformance.ja.md +0 -0
  90. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/retention-lifecycle-conformance.ja.md +0 -0
  91. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/retry-conformance.ja.md +0 -0
  92. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/route-conformance.ja.md +0 -0
  93. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/run-conformance.ja.md +0 -0
  94. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/scan-conformance.ja.md +0 -0
  95. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/scan-options-conformance.ja.md +0 -0
  96. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/selected-metadata-conformance.ja.md +0 -0
  97. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/session-loss-conformance.ja.md +0 -0
  98. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/session-smoke-conformance.ja.md +0 -0
  99. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/spec-follow-notes.ja.md +0 -0
  100. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/spi-conformance.ja.md +0 -0
  101. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/step-conformance.ja.md +0 -0
  102. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/stream-conformance.ja.md +0 -0
  103. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/subscription-conformance.ja.md +0 -0
  104. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/tcp-recovery-conformance.ja.md +0 -0
  105. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/testing-consumers.ja.md +0 -0
  106. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/testing-policy.ja.md +0 -0
  107. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/tlv-request-conformance.ja.md +0 -0
  108. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/trace/README.ja.md +0 -0
  109. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/trace/capture.json +0 -0
  110. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/trace/common.json +0 -0
  111. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/trace/console.json +0 -0
  112. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/trace/core.json +0 -0
  113. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/trace/debug.json +0 -0
  114. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/trace/fixture.json +0 -0
  115. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/trace/link.json +0 -0
  116. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/trace/plan.json +0 -0
  117. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/trace/restart.json +0 -0
  118. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/trace/transports.json +0 -0
  119. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/uart-conformance.ja.md +0 -0
  120. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/uart-stream-conformance.ja.md +0 -0
  121. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/usb-conformance.ja.md +0 -0
  122. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/wire-options-conformance.ja.md +0 -0
  123. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/docs/writer-lease-conformance.ja.md +0 -0
  124. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/__main__.py +0 -0
  125. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/arm.py +0 -0
  126. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/capture.py +0 -0
  127. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/capture_blocks.py +0 -0
  128. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/catalog.py +0 -0
  129. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/ch32_flash.py +0 -0
  130. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/cobs.py +0 -0
  131. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/__init__.py +0 -0
  132. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/allocator.py +0 -0
  133. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/allocator_model.py +0 -0
  134. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/allocator_sample.py +0 -0
  135. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/analog.py +0 -0
  136. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/analog_model.py +0 -0
  137. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/analog_payload.py +0 -0
  138. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/analog_sample.py +0 -0
  139. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/arm_adi.py +0 -0
  140. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/arm_adi_blocks.py +0 -0
  141. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/arm_adi_model.py +0 -0
  142. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/arm_adi_sample.py +0 -0
  143. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/attach.py +0 -0
  144. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/attach_model.py +0 -0
  145. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/attach_sample.py +0 -0
  146. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/block_model.py +0 -0
  147. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/block_sample.py +0 -0
  148. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/blocks.py +0 -0
  149. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/capture_group.py +0 -0
  150. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/capture_group_geometry.py +0 -0
  151. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/capture_group_geometry_model.py +0 -0
  152. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/capture_group_model.py +0 -0
  153. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/capture_group_sample.py +0 -0
  154. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/capture_metadata.py +0 -0
  155. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/capture_metadata_model.py +0 -0
  156. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/capture_serial.py +0 -0
  157. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/capture_serial_sample.py +0 -0
  158. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/capture_timeline.py +0 -0
  159. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/capture_timeline_lifecycle.py +0 -0
  160. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/capture_timeline_model.py +0 -0
  161. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/capture_timeline_sample.py +0 -0
  162. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/clock.py +0 -0
  163. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/clock_model.py +0 -0
  164. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/clock_sample.py +0 -0
  165. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/core_fixed_fields.py +0 -0
  166. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/core_smoke.py +0 -0
  167. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/corr.py +0 -0
  168. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/cut.py +0 -0
  169. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/cut_model.py +0 -0
  170. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/cut_sample.py +0 -0
  171. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/data.py +0 -0
  172. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/data_model.py +0 -0
  173. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/data_sample.py +0 -0
  174. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/debug.py +0 -0
  175. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/debug_model.py +0 -0
  176. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/debug_sample.py +0 -0
  177. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/declaration_model.py +0 -0
  178. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/dependencies.py +0 -0
  179. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/dependency_model.py +0 -0
  180. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/dependency_sample.py +0 -0
  181. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/discovery.py +0 -0
  182. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/dmseq.py +0 -0
  183. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/dmseq_model.py +0 -0
  184. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/dmseq_sample.py +0 -0
  185. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/dmseq_target.py +0 -0
  186. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/dmseq_target_model.py +0 -0
  187. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/dmseq_target_sample.py +0 -0
  188. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/execution_order.py +0 -0
  189. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/execution_order_sample.py +0 -0
  190. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/exhausted.py +0 -0
  191. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/exhausted_sample.py +0 -0
  192. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/fixture_metadata.py +0 -0
  193. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/fixture_metadata_model.py +0 -0
  194. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/force_hw.py +0 -0
  195. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/gpio.py +0 -0
  196. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/gpio_lifecycle.py +0 -0
  197. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/gpio_lifecycle_model.py +0 -0
  198. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/gpio_lifecycle_sample.py +0 -0
  199. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/gpio_model.py +0 -0
  200. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/gpio_sample.py +0 -0
  201. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/host_core.py +0 -0
  202. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/host_core_sample.py +0 -0
  203. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/host_deadline.py +0 -0
  204. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/host_deadline_sample.py +0 -0
  205. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/host_notifications.py +0 -0
  206. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/host_notifications_sample.py +0 -0
  207. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/host_request_sample.py +0 -0
  208. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/host_requests.py +0 -0
  209. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/host_resend.py +0 -0
  210. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/host_resend_sample.py +0 -0
  211. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/host_tlv.py +0 -0
  212. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/host_tlv_sample.py +0 -0
  213. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/host_values.py +0 -0
  214. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/host_values_sample.py +0 -0
  215. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/host_wait.py +0 -0
  216. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/host_wait_sample.py +0 -0
  217. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/i2c.py +0 -0
  218. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/i2c_model.py +0 -0
  219. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/i2c_sample.py +0 -0
  220. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/interface_smoke.py +0 -0
  221. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/interfaces.py +0 -0
  222. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/lease.py +0 -0
  223. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/lease_sample.py +0 -0
  224. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/link_routes.py +0 -0
  225. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/link_routes_model.py +0 -0
  226. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/link_routes_sample.py +0 -0
  227. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/link_transfer_model.py +0 -0
  228. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/link_transfer_sample.py +0 -0
  229. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/link_transfers.py +0 -0
  230. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/logic.py +0 -0
  231. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/logic_model.py +0 -0
  232. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/logic_sample.py +0 -0
  233. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/mailbox.py +0 -0
  234. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/mailbox_model.py +0 -0
  235. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/mailbox_sample.py +0 -0
  236. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/notification_model.py +0 -0
  237. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/notification_retention.py +0 -0
  238. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/notification_retention_sample.py +0 -0
  239. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/notification_sequence.py +0 -0
  240. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/notification_sequence_sample.py +0 -0
  241. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/notify_hw.py +0 -0
  242. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/oep_declaration_model.py +0 -0
  243. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/oep_declarations.py +0 -0
  244. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/oep_smoke.py +0 -0
  245. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/outcome_model.py +0 -0
  246. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/outcome_sample.py +0 -0
  247. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/outcomes.py +0 -0
  248. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/pipeline.py +0 -0
  249. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/pipeline_model.py +0 -0
  250. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/pipeline_sample.py +0 -0
  251. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/port_speed.py +0 -0
  252. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/port_speed_execution.py +0 -0
  253. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/port_speed_execution_model.py +0 -0
  254. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/port_speed_execution_sample.py +0 -0
  255. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/port_speed_lifecycle.py +0 -0
  256. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/port_speed_model.py +0 -0
  257. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/port_speed_sample.py +0 -0
  258. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/probe_input.py +0 -0
  259. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/probe_input_sample.py +0 -0
  260. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/recovery.py +0 -0
  261. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/recovery_race_sample.py +0 -0
  262. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/recovery_races.py +0 -0
  263. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/recovery_sample.py +0 -0
  264. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/refusal_order.py +0 -0
  265. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/refusal_order_sample.py +0 -0
  266. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/registered_ops.py +0 -0
  267. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/registered_ops_model.py +0 -0
  268. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/release_hw.py +0 -0
  269. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/replay_pressure.py +0 -0
  270. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/reset.py +0 -0
  271. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/reset_model.py +0 -0
  272. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/reset_sample.py +0 -0
  273. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/resource_model.py +0 -0
  274. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/resource_sample.py +0 -0
  275. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/resources.py +0 -0
  276. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/response_race.py +0 -0
  277. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/response_race_sample.py +0 -0
  278. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/restart.py +0 -0
  279. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/restart_model.py +0 -0
  280. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/restart_sample.py +0 -0
  281. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/retention.py +0 -0
  282. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/retention_lifecycle.py +0 -0
  283. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/retention_lifecycle_sample.py +0 -0
  284. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/retention_model.py +0 -0
  285. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/retention_sample.py +0 -0
  286. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/retry.py +0 -0
  287. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/retry_model.py +0 -0
  288. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/retry_sample.py +0 -0
  289. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/route_model.py +0 -0
  290. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/route_sample.py +0 -0
  291. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/routes.py +0 -0
  292. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/run.py +0 -0
  293. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/run_model.py +0 -0
  294. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/run_sample.py +0 -0
  295. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/scan.py +0 -0
  296. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/scan_model.py +0 -0
  297. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/scan_options.py +0 -0
  298. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/scan_options_model.py +0 -0
  299. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/scan_options_sample.py +0 -0
  300. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/scan_sample.py +0 -0
  301. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/selected_metadata.py +0 -0
  302. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/selected_metadata_model.py +0 -0
  303. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/serial.py +0 -0
  304. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/session_loss.py +0 -0
  305. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/session_loss_sample.py +0 -0
  306. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/session_smoke.py +0 -0
  307. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/spi.py +0 -0
  308. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/spi_model.py +0 -0
  309. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/spi_sample.py +0 -0
  310. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/step.py +0 -0
  311. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/step_model.py +0 -0
  312. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/step_sample.py +0 -0
  313. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/stream.py +0 -0
  314. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/stream_model.py +0 -0
  315. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/stream_sample.py +0 -0
  316. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/subscription_sample.py +0 -0
  317. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/subscriptions.py +0 -0
  318. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/tcp.py +0 -0
  319. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/tcp_peers.py +0 -0
  320. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/tcp_recovery.py +0 -0
  321. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/tcp_recovery_sample.py +0 -0
  322. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/tlv_request_model.py +0 -0
  323. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/tlv_requests.py +0 -0
  324. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/uart.py +0 -0
  325. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/uart_model.py +0 -0
  326. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/uart_sample.py +0 -0
  327. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/uart_stream.py +0 -0
  328. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/uart_stream_sample.py +0 -0
  329. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/usb.py +0 -0
  330. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/usb_cases.py +0 -0
  331. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/usb_hw.py +0 -0
  332. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/usb_model.py +0 -0
  333. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/wire_options.py +0 -0
  334. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/wire_options_model.py +0 -0
  335. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/wire_options_sample.py +0 -0
  336. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/writer_lease.py +0 -0
  337. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/writer_lease_model.py +0 -0
  338. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/conformance/writer_lease_sample.py +0 -0
  339. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/console.py +0 -0
  340. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/core.py +0 -0
  341. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/decode.py +0 -0
  342. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/discovery.py +0 -0
  343. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/dump.py +0 -0
  344. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/endpoint.py +0 -0
  345. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/fixture.py +0 -0
  346. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/frames.py +0 -0
  347. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/hardware.py +0 -0
  348. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/hid_stream.py +0 -0
  349. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/host.py +0 -0
  350. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/interfaces.py +0 -0
  351. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/kept_session.py +0 -0
  352. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/link.py +0 -0
  353. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/linktest.py +0 -0
  354. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/memo.py +0 -0
  355. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/message.py +0 -0
  356. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/names.py +0 -0
  357. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/pins.py +0 -0
  358. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/probe_log.py +0 -0
  359. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/pytest_conformance.py +0 -0
  360. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/registry.py +0 -0
  361. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/riscv.py +0 -0
  362. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/rp2350.py +0 -0
  363. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/settings.py +0 -0
  364. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/speed_record.py +0 -0
  365. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/stimulus.py +0 -0
  366. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/targets.py +0 -0
  367. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/uiapduino.py +0 -0
  368. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/usb_stream.py +0 -0
  369. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/virtual_bench.py +0 -0
  370. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/virtual_bench_mdns.py +0 -0
  371. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/virtual_bench_serial.py +0 -0
  372. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/virtual_bench_serve.py +0 -0
  373. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/virtual_bench_trigger.py +0 -0
  374. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/virtual_bench_usb.py +0 -0
  375. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/virtual_core.py +0 -0
  376. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/virtual_fixture_drive.py +0 -0
  377. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/src/oep_client/virtual_names.py +0 -0
  378. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/conftest.py +0 -0
  379. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/equipment/.env.example +0 -0
  380. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/equipment/test_core_contract.py +0 -0
  381. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/equipment/test_preflight.py +0 -0
  382. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/fixtures/hardware.virtual.toml +0 -0
  383. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/.env.example +0 -0
  384. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/.env.virtual.example +0 -0
  385. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/README.ja.md +0 -0
  386. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/README.md +0 -0
  387. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/__init__.py +0 -0
  388. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/boards.py +0 -0
  389. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/conftest.py +0 -0
  390. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/firmware.py +0 -0
  391. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/flash.py +0 -0
  392. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/hardware.example.toml +0 -0
  393. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/hardware.resolved.example.toml +0 -0
  394. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/record.py +0 -0
  395. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/.gitignore +0 -0
  396. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.26+5bafb92-0.0.26.json +0 -0
  397. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.26+654b06a-0.0.26.json +0 -0
  398. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.27+ec1df99-0.0.27.json +0 -0
  399. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.32+1491c13-0.0.31-20261016T133559.json +0 -0
  400. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.32+672bf7b-0.0.32-20261016T164655.json +0 -0
  401. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131458.json +0 -0
  402. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131510.json +0 -0
  403. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131526.json +0 -0
  404. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131532.json +0 -0
  405. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131656.json +0 -0
  406. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131703.json +0 -0
  407. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131708.json +0 -0
  408. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T132050.json +0 -0
  409. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T132057.json +0 -0
  410. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T132104.json +0 -0
  411. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.36+f8ac55a-0.0.36-20261022T160307.json +0 -0
  412. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.36+f8ac55a-0.0.36-20261022T161655.json +0 -0
  413. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.37+1031feb-0.0.37-20261023T214002.json +0 -0
  414. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.38+7c158ff-0.0.38-20261027T081156.json +0 -0
  415. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.39+1ad47c7-0.0.39-20261027T182907.json +0 -0
  416. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.39+2c0c41f-0.0.39-20261027T174907.json +0 -0
  417. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.39+9317805-0.0.39-20261027T191153.json +0 -0
  418. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.39+a75fd45-0.0.39-20261027T205055.json +0 -0
  419. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.39+ca5f896-0.0.39-20261027T201038.json +0 -0
  420. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.39+ca5f896-0.0.39-20261027T201057.json +0 -0
  421. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.39+ca5f896-0.0.39-20261027T201058.json +0 -0
  422. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.39+ca5f896-0.0.39-20261027T201059.json +0 -0
  423. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.39+ca5f896__crash_at_2106_s_-0.0.39-20261027T204608.json +0 -0
  424. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.39+d4d323c-0.0.39-20261028T190815.json +0 -0
  425. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/9489dd2ae0953650-0.0.39+d4d323c-0.0.39-20261028T191854.json +0 -0
  426. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/e8f60ae84e28-0.0.39+1ad47c7-0.0.39-20261027T181116.json +0 -0
  427. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/e8f60ae84e28-0.0.39+1ad47c7-0.0.39-20261027T181812.json +0 -0
  428. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/e8f60ae84e28-0.0.39+1ad47c7-0.0.39-20261027T182903.json +0 -0
  429. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/e8f60ae84e28-0.0.39+62463f2-0.0.39-20261029T145541.json +0 -0
  430. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/e8f60ae84e28-0.0.39+9317805-0.0.39-20261027T191150.json +0 -0
  431. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/e8f60ae84e28-0.0.39+a75fd45-0.0.39-20261028T190803.json +0 -0
  432. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/e8f60ae84e28-0.0.39+b7fbdf9-0.0.39-20261027T191727.json +0 -0
  433. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/e8f60ae84e28-0.0.39+b7fbdf9-0.0.39-20261027T204611.json +0 -0
  434. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/e8f60ae84e28-0.0.39+bb371fb-0.0.39-20261028T191811.json +0 -0
  435. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/e8f60ae84e28-0.0.39+bb371fb-0.0.39-20261028T191849.json +0 -0
  436. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/e8f60ae84e28-0.0.44+34c0b0b-0.0.44-20261104T190820.json +0 -0
  437. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/e8f60ae84e28-0.0.44+34c0b0b-0.0.44-20261104T190903.json +0 -0
  438. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/e8f60ae84e28-unknown-0.0.44-20261104T190857.json +0 -0
  439. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.26+4fad559-0.0.26.json +0 -0
  440. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.26+5bafb92-0.0.26.json +0 -0
  441. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.32+1491c13-0.0.31-20261016T133501.json +0 -0
  442. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.32+672bf7b-0.0.32-20261016T164559.json +0 -0
  443. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.32-0.0.31-20261016T130922.json +0 -0
  444. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.32-0.0.31-20261016T131024.json +0 -0
  445. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.36+12e1222-0.0.37-20261023T214016.json +0 -0
  446. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.36+f8ac55a-0.0.36-20261022T160134.json +0 -0
  447. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.37+1031feb-0.0.37-20261023T214230.json +0 -0
  448. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.38+7c158ff-0.0.38-20261027T081159.json +0 -0
  449. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.39+2c0c41f-0.0.39-20261027T174933.json +0 -0
  450. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.39+9317805-0.0.39-20261027T191154.json +0 -0
  451. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.39+b7fbdf9-0.0.39-20261027T204617.json +0 -0
  452. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.39+bb371fb-0.0.39-20261028T191816.json +0 -0
  453. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.25-0.0.26.json +0 -0
  454. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.26+5bafb92-0.0.26.json +0 -0
  455. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.26+654b06a-0.0.26.json +0 -0
  456. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.26+e877631-0.0.26.json +0 -0
  457. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.27+ac80e07-0.0.27.json +0 -0
  458. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.27+ec1df99-0.0.27.json +0 -0
  459. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.27-0.0.27.json +0 -0
  460. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.28-0.0.28.json +0 -0
  461. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.37+1031feb-0.0.37-20261023T220718.json +0 -0
  462. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.37+1031feb-0.0.37-20261023T221106.json +0 -0
  463. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.37+1031feb__panic_at_11_s_-0.0.37-20261023T220856.json +0 -0
  464. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.37+1031feb__panic_at_11_s_-0.0.37-20261023T220901.json +0 -0
  465. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.37+1031feb__panic_at_11_s_-0.0.37-20261023T220915.json +0 -0
  466. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-pico-d4-50029191fe34-unknown-0.0.26.json +0 -0
  467. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-pico-d4-50029191fe34-unknown-0.0.37-20261023T214102.json +0 -0
  468. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-pico-d4-50029191fe34-unknown-0.0.39-20261028T190818.json +0 -0
  469. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0e31108-0.0.26+5bafb92-0.0.26.json +0 -0
  470. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0e31108-0.0.26+654b06a-0.0.26.json +0 -0
  471. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0e31108-0.0.44+34c0b0b-0.0.44-20261104T190941.json +0 -0
  472. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0e343c6-0.0.26+5bafb92-0.0.26.json +0 -0
  473. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0e343c6-0.0.26+654b06a-0.0.26.json +0 -0
  474. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0e343c6-0.0.27+ec1df99-0.0.27.json +0 -0
  475. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0e343c6-0.0.28+ffe4eb1-0.0.28.json +0 -0
  476. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0e343c6-0.0.28-0.0.28.json +0 -0
  477. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+0f013b7-0.0.28.json +0 -0
  478. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+1c940ca-0.0.28.json +0 -0
  479. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+4ef21db+4ef21db-dirty-0.0.28.json +0 -0
  480. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+68d9694-0.0.28.json +0 -0
  481. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+ec38b1d-0.0.28.json +0 -0
  482. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+ffe4eb1-0.0.28.json +0 -0
  483. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28-0.0.28.json +0 -0
  484. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.36+f8ac55a-0.0.36-20261022T160503.json +0 -0
  485. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.37+1031feb-0.0.37-20261023T214005.json +0 -0
  486. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.38+7c158ff-0.0.38-20261027T081145.json +0 -0
  487. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.38+7c158ff-0.0.38-20261027T081152.json +0 -0
  488. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+1ad47c7-0.0.39-20261027T180716.json +0 -0
  489. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+1ad47c7-0.0.39-20261027T182855.json +0 -0
  490. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+1ad47c7-0.0.39-20261027T183107.json +0 -0
  491. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+2c0c41f-0.0.39-20261027T174908.json +0 -0
  492. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+2c0c41f__task-wdt_at_18_s_-0.0.39-20261027T175743.json +0 -0
  493. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+2c0c41f__task-wdt_at_18_s_-0.0.39-20261027T175815.json +0 -0
  494. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+2c0c41f__task-wdt_at_33_s_-0.0.39-20261027T175634.json +0 -0
  495. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+2c0c41f__task-wdt_at_431_s_-0.0.39-20261027T175709.json +0 -0
  496. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+62463f2-0.0.39-20261029T145536.json +0 -0
  497. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+7445bee-0.0.39-20261027T155413.json +0 -0
  498. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+9317805-0.0.39-20261027T191146.json +0 -0
  499. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+b7fbdf9-0.0.39-20261027T191724.json +0 -0
  500. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+bb371fb-0.0.39-20261028T191806.json +0 -0
  501. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+bb371fb-0.0.39-20261028T191843.json +0 -0
  502. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+d4d323c-0.0.39-20261028T190809.json +0 -0
  503. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-unknown-0.0.36-20261022T160222.json +0 -0
  504. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-unknown-0.0.39-20261027T155301.json +0 -0
  505. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/results/esp32-series-30eda0ea068b-unknown-0.0.39-20261027T155340.json +0 -0
  506. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/test_harness.py +0 -0
  507. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/hw/test_probe.py +0 -0
  508. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/spec/DOCS_SHA256 +0 -0
  509. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/spec/oep-v1.toml +0 -0
  510. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/spec_names.py +0 -0
  511. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_address.py +0 -0
  512. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_capabilities.py +0 -0
  513. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_capture.py +0 -0
  514. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_capture_blocks.py +0 -0
  515. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_capture_generation_rules.py +0 -0
  516. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_capture_rules.py +0 -0
  517. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_cobs.py +0 -0
  518. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance.py +0 -0
  519. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_allocator.py +0 -0
  520. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_analog.py +0 -0
  521. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_analog_payload.py +0 -0
  522. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_arm_adi.py +0 -0
  523. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_arm_adi_blocks.py +0 -0
  524. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_attach.py +0 -0
  525. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_blocks.py +0 -0
  526. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_capture_group.py +0 -0
  527. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_capture_group_geometry.py +0 -0
  528. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_capture_metadata.py +0 -0
  529. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_capture_serial.py +0 -0
  530. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_capture_timeline.py +0 -0
  531. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_capture_timeline_lifecycle.py +0 -0
  532. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_clock.py +0 -0
  533. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_core_fixed_fields.py +0 -0
  534. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_core_smoke.py +0 -0
  535. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_corr.py +0 -0
  536. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_cut.py +0 -0
  537. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_data.py +0 -0
  538. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_debug.py +0 -0
  539. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_dependencies.py +0 -0
  540. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_discovery.py +0 -0
  541. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_dmseq.py +0 -0
  542. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_dmseq_target.py +0 -0
  543. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_execution_order.py +0 -0
  544. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_exhausted.py +0 -0
  545. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_fixture_metadata.py +0 -0
  546. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_force_hw.py +0 -0
  547. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_gpio.py +0 -0
  548. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_gpio_lifecycle.py +0 -0
  549. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_host_core.py +0 -0
  550. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_host_critical_calls.py +0 -0
  551. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_host_deadline.py +0 -0
  552. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_host_notifications.py +0 -0
  553. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_host_requests.py +0 -0
  554. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_host_resend.py +0 -0
  555. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_host_tlv.py +0 -0
  556. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_host_values.py +0 -0
  557. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_host_wait.py +0 -0
  558. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_i2c.py +0 -0
  559. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_interface_smoke.py +0 -0
  560. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_interfaces.py +0 -0
  561. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_lease.py +0 -0
  562. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_link_routes.py +0 -0
  563. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_link_transfers.py +0 -0
  564. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_logic.py +0 -0
  565. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_mailbox.py +0 -0
  566. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_notification_output.py +0 -0
  567. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_notification_retention.py +0 -0
  568. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_notification_sequence.py +0 -0
  569. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_oep_declarations.py +0 -0
  570. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_oep_smoke.py +0 -0
  571. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_outcomes.py +0 -0
  572. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_pipeline.py +0 -0
  573. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_port_speed.py +0 -0
  574. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_port_speed_execution.py +0 -0
  575. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_port_speed_lifecycle.py +0 -0
  576. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_probe_input.py +0 -0
  577. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_reconnect.py +0 -0
  578. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_recovery.py +0 -0
  579. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_recovery_races.py +0 -0
  580. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_refusal_order.py +0 -0
  581. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_registered_ops.py +0 -0
  582. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_replay_pressure.py +0 -0
  583. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_replay_records_optional.py +0 -0
  584. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_reset.py +0 -0
  585. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_resources.py +0 -0
  586. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_response_race.py +0 -0
  587. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_restart.py +0 -0
  588. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_retention.py +0 -0
  589. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_retention_lifecycle.py +0 -0
  590. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_retry.py +0 -0
  591. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_reviewed_pins.py +0 -0
  592. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_routes.py +0 -0
  593. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_run.py +0 -0
  594. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_scan.py +0 -0
  595. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_scan_options.py +0 -0
  596. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_selected_metadata.py +0 -0
  597. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_serial.py +0 -0
  598. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_session_loss.py +0 -0
  599. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_session_smoke.py +0 -0
  600. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_spec_guard.py +0 -0
  601. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_spi.py +0 -0
  602. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_step.py +0 -0
  603. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_stream.py +0 -0
  604. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_subscriptions.py +0 -0
  605. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_tcp.py +0 -0
  606. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_tcp_peers.py +0 -0
  607. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_tcp_recovery.py +0 -0
  608. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_tlv_requests.py +0 -0
  609. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_uart.py +0 -0
  610. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_uart_stream.py +0 -0
  611. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_usb.py +0 -0
  612. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_wire_options.py +0 -0
  613. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_conformance_writer_lease.py +0 -0
  614. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_console_queue_and_reset_settle.py +0 -0
  615. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_core_rules.py +0 -0
  616. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_debug_attach.py +0 -0
  617. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_debug_rules.py +0 -0
  618. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_describe_unset_idle_rules.py +0 -0
  619. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_exact_payload_rules.py +0 -0
  620. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_extension_patterns.py +0 -0
  621. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_fixture_controllers.py +0 -0
  622. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_fixture_link_settings_rules.py +0 -0
  623. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_fixture_out.py +0 -0
  624. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_fixture_targets.py +0 -0
  625. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_flash_console.py +0 -0
  626. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_gpio_drive_and_serve_options.py +0 -0
  627. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_hardware.py +0 -0
  628. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_hid_stream.py +0 -0
  629. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_host_boot_lifecycle.py +0 -0
  630. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_host_recovery_rules.py +0 -0
  631. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_host_rules_bounds_options.py +0 -0
  632. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_host_rules_waits_lines.py +0 -0
  633. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_host_wait_bound.py +0 -0
  634. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_interfaces.py +0 -0
  635. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_link_drop.py +0 -0
  636. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_link_host.py +0 -0
  637. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_link_serial.py +0 -0
  638. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_linktest.py +0 -0
  639. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_literals.py +0 -0
  640. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_memo.py +0 -0
  641. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_minimal_ops.py +0 -0
  642. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_no_resume.py +0 -0
  643. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_open_extensions.py +0 -0
  644. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_passthrough.py +0 -0
  645. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_pins.py +0 -0
  646. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_plan.py +0 -0
  647. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_port_speed.py +0 -0
  648. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_probe_log.py +0 -0
  649. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_request_tails.py +0 -0
  650. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_request_validation_rules.py +0 -0
  651. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_restart.py +0 -0
  652. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_resubscribe_after_reopen.py +0 -0
  653. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_rvswd_rest.py +0 -0
  654. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_session.py +0 -0
  655. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_settings.py +0 -0
  656. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_spec_sections.py +0 -0
  657. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_spec_vectors.py +0 -0
  658. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_state_resource_rules.py +0 -0
  659. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_stimulus.py +0 -0
  660. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_target_parts.py +0 -0
  661. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_tcp_discovery.py +0 -0
  662. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_tlv_reader_rules.py +0 -0
  663. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_trace_capture.py +0 -0
  664. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_trace_common.py +0 -0
  665. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_trace_console.py +0 -0
  666. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_trace_core.py +0 -0
  667. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_trace_core_names.py +0 -0
  668. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_trace_debug.py +0 -0
  669. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_trace_fixture.py +0 -0
  670. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_trace_fixture_drive.py +0 -0
  671. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_trace_link.py +0 -0
  672. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_trace_plan.py +0 -0
  673. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_trace_restart.py +0 -0
  674. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_trace_transports.py +0 -0
  675. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_transport_session_rules.py +0 -0
  676. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_usb_identity.py +0 -0
  677. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_usb_stream.py +0 -0
  678. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_analog_roles.py +0 -0
  679. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_announce.py +0 -0
  680. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture.py +0 -0
  681. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_changing_trigger.py +0 -0
  682. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_channel_time.py +0 -0
  683. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_format_2.py +0 -0
  684. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_initial_trigger_time.py +0 -0
  685. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_lifetime.py +0 -0
  686. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_notifications.py +0 -0
  687. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_one_shot_time.py +0 -0
  688. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_options.py +0 -0
  689. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_pretrigger.py +0 -0
  690. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_query.py +0 -0
  691. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_rates.py +0 -0
  692. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_requests.py +0 -0
  693. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_resume_calibration.py +0 -0
  694. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_trigger_modes.py +0 -0
  695. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_trigger_source.py +0 -0
  696. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_trigger_source_more.py +0 -0
  697. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_capture_waiting.py +0 -0
  698. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_pin_constraints.py +0 -0
  699. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_rules_core.py +0 -0
  700. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_rules_ops_lines.py +0 -0
  701. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_serve_reboot.py +0 -0
  702. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_serve_tcp_connections.py +0 -0
  703. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_spec.py +0 -0
  704. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_bench_targets.py +0 -0
  705. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_core.py +0 -0
  706. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_virtual_core_bool.py +0 -0
  707. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/test_wire_hold.py +0 -0
  708. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/SPEC_COMMIT +0 -0
  709. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/SPEC_SHA256 +0 -0
  710. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/capture_formats.json +0 -0
  711. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/checks.json +0 -0
  712. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/cobs.json +0 -0
  713. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/confirm.json +0 -0
  714. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/core_extensions.json +0 -0
  715. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/core_lifecycle.json +0 -0
  716. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/core_policy.json +0 -0
  717. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/discovery.json +0 -0
  718. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/headers.json +0 -0
  719. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/interface_boundaries.json +0 -0
  720. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/interface_profiles.json +0 -0
  721. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/logic_layout.json +0 -0
  722. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/ops.json +0 -0
  723. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/ops_encoding.json +0 -0
  724. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/refusals.json +0 -0
  725. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/sessions.json +0 -0
  726. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/tests/vectors/settings_file.json +0 -0
  727. {oep_client_python-0.0.47 → oep_client_python-0.0.49}/udev/70-oep-probe.rules +0 -0
@@ -2,6 +2,40 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.0.49
6
+ - (EN) Changed (virtual bench): a stream follows the probe's clock as a real probe's does. Logic samples are made at once
7
+ with numpy (a second of 1 MS/s on 2 lines: format 0 0.04 s instead of 4.6 s, format 1 about 0.2 to 0.3 s), sample by
8
+ sample only where a track needs it (the glitch filter, the external clock, analog, a test's own value()). The samples
9
+ the clock has taken and the bench has not made yet count as held in its stream buffer: a tick makes a bounded number
10
+ and catches up over ticks; stop makes every sample up to the stop; behind by more than the stream buffer holds, the
11
+ track stops in error as a probe whose buffer overflowed (state 6, error storage). Before, on a busy host the stream ran
12
+ late and ended before the stop: a heading placed by the probe's clock fell past its end (4 cores with 8 busy
13
+ processes, during=steps at 1 MS/s on 2 lines: 8 of 8 by 0.5 to 1.1 s; now 0 of 8, none lost).
14
+ - (JA) 変更(仮想ベンチ): stream は、実機と同じくプローブの時計に従う。ロジックの標本は numpy でまとめて作る(2 本・
15
+ 1 MS/s の 1 秒分が、format 0 で 4.6 s から 0.04 s、format 1 で約 0.2〜0.3 s)。1 標本ずつ作るのは、そうしか作れない track
16
+ だけ(グリッチフィルタ、外部クロック、アナログ、試験が差し替えた value())。時計が取ったのにまだ作っていない標本は、
17
+ ストリーム用のバッファに持っている分とみなす。tick は上限つきで作り、何回かで追いつく。stop は止めた時刻までの標本を
18
+ 全部作る。遅れがストリーム用のバッファを超えたら、バッファのあふれた実機と同じく track を error で止める(state 6、
19
+ error storage)。これまでは、混んだ host で stream が遅れたまま止めた時刻より前で終わり、プローブの時計で置いた見出しが
20
+ その後になった(4 コアに 8 本の空回り、during=steps で 2 本・1 MS/s: 8 回中 8 回、0.5〜1.1 s。直した後は 8 回中 0 回、
21
+ 欠損なし)。
22
+ - (EN) Fixed (0.0.48): a format 1 stream put together on disk failed with a KeyError (a segment's position): the loop
23
+ joining a segment's lines bit by bit reused the name of the loop over the segments, so the next segment taken was the
24
+ wrong one. A format 1 stream on disk is tested now.
25
+ - (JA) 修正(0.0.48): ディスクで組み立てる format 1 の stream が KeyError(区画の位置)で落ちていた。区画の線を 1 bit ずつ
26
+ つなぐループが、区画を回すループと同じ変数名を使っていて、次に取る区画を取り違えていた。ディスクで組み立てる format 1 の
27
+ stream の試験を足した。
28
+
29
+ ## 0.0.48
30
+ - (EN) Fixed: a stream's segments join bit by bit, so a stream is one part unless data was lost. A segment whose
31
+ samples did not fill whole bytes of each line (the ESP32-P4's 65332 samples of 2 lines at 5 and 10 MS/s) started a new
32
+ part every time: 300 to 550 parts, none lost. A format 1 segment whose samples are not a multiple of every D still
33
+ starts a new part (its ticks restart, capture §1.3).
34
+ - (JA) 修正: stream の区画を 1 bit ずつつなぐ。欠損がなければ、stream は 1 つの部分になる。線ごとに標本がバイトの切れ目で
35
+ 終わらない区画(ESP32-P4 の 2 本の線の 65332 標本、5 MS/s と 10 MS/s)では、そのたびに新しい部分を始めていて、欠損なしで
36
+ 300〜550 の部分に分かれていた。format 1 で標本数がどの D の倍数でもない区画は、今までどおり新しい部分を始める
37
+ (その刻みが始め直しになるため、capture §1.3)。
38
+
5
39
  ## 0.0.47
6
40
  - (EN) Added: `acquire.Request(during=steps)` for a stream in place of `seconds`: it streams until `steps(wait)`
7
41
  returns, `wait(seconds)` collecting while it waits, so a script marks sections and sends ops or console commands on
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: oep-client-python
3
- Version: 0.0.47
3
+ Version: 0.0.49
4
4
  Summary: Open Embedded Probe (OEP) v1 host: serial / USB / TCP transports, the session rules, the standard interfaces, and a virtual bench
5
5
  Project-URL: Homepage, https://github.com/Open-Embedded-Probe/oep-client-python
6
6
  Project-URL: Repository, https://github.com/Open-Embedded-Probe/oep-client-python
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "oep-client-python"
7
- version = "0.0.47"
7
+ version = "0.0.49"
8
8
  description = "Open Embedded Probe (OEP) v1 host: serial / USB / TCP transports, the session rules, the standard interfaces, and a virtual bench"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -2,4 +2,4 @@
2
2
 
3
3
  __all__ = ["__version__"]
4
4
 
5
- __version__ = "0.0.47"
5
+ __version__ = "0.0.49"
@@ -1655,14 +1655,14 @@ class _Spool:
1655
1655
  p, nxt = ready[k][0], ready[j][1]
1656
1656
  x = self.segs[p]
1657
1657
  samples = sum(self.segs.pop(q).samples for q, _ in ready[k:j + 1])
1658
- if self.cur is not None and (self.cur["samples"] % 8 or any(self.cur["samples"] % d for d in self.ds)):
1658
+ if self.cur is not None and any(self.cur["samples"] % d for d in self.ds):
1659
1659
  self._close(follows=True) # a grid restart (format 1) is not a loss: the next part follows on
1660
1660
  self._open(p, x)
1661
1661
  data = bytes(self.pending[p - self.at:nxt - self.at])
1662
1662
  cols = _segment_columns(self.cap, data, samples, len(self.names), self.cfg)
1663
- for col, f, ev in zip(cols, self.cur["files"], self.cur["events"]):
1664
- if isinstance(col, bytes):
1665
- f.write(col[:(samples + 7) // 8])
1663
+ for c, (col, f, ev) in enumerate(zip(cols, self.cur["files"], self.cur["events"])):
1664
+ if isinstance(col, bytes): # joined bit by bit: a segment need not end on a whole byte
1665
+ self.cur["carry"][c] = _write_bits(f, self.cur["carry"][c], col, samples)
1666
1666
  else:
1667
1667
  ev[0].append(col[0] + self.cur["samples"] // col[4])
1668
1668
  ev[1].append(col[1])
@@ -1693,7 +1693,7 @@ class _Spool:
1693
1693
  k = len(self.parts)
1694
1694
  files = [open(os.path.join(self.dir, f"p{k}-{j}.bits"), "wb") for j in range(len(self.names))]
1695
1695
  self.cur = {"tick0": tick0, "meta": _seg_meta(seg) if seg is not None else {}, "samples": 0, "files": files,
1696
- "events": [[[], [], [], None] for _ in self.names]}
1696
+ "events": [[[], [], [], None] for _ in self.names], "carry": [None] * len(self.names)}
1697
1697
  self._follows = False
1698
1698
 
1699
1699
  _last_samples, _last_end, _follows = 0, None, False
@@ -1705,6 +1705,7 @@ class _Spool:
1705
1705
  cur, n = self.cur, self.cur["samples"]
1706
1706
  chans = []
1707
1707
  for role, (name, ch, f, ev) in enumerate(zip(self.names, self.ids, cur["files"], cur["events"])):
1708
+ _flush_bits(f, cur["carry"][role])
1708
1709
  f.close()
1709
1710
  d = self.cfg.event_d.get(role) if self.blocks else None
1710
1711
  if d is not None:
@@ -1791,7 +1792,7 @@ def _stream_parts(cap, cfg, got, names, ids, req: Request) -> tuple[list, list]:
1791
1792
  chans = from_interleaved(data, names, cfg.width, cfg.positions, samples)
1792
1793
  else:
1793
1794
  chans = _from_blocks(cap, data, names, samples, cfg)
1794
- restart = acc is not None and (acc_samples % 8 or any(acc_samples % d for d in ds))
1795
+ restart = acc is not None and any(acc_samples % d for d in ds)
1795
1796
  if acc is None or restart: # a grid restart (format 1) is not a loss: the next part follows on
1796
1797
  if acc is not None:
1797
1798
  parts.append(_part(_built(acc, acc_samples, ids), acc_meta, tick0))
@@ -1865,10 +1866,41 @@ def _samples_at_once(run, names, ids, cfg, samples: int) -> list:
1865
1866
  for name, ch, bits in zip(names, ids, packed)]
1866
1867
 
1867
1868
 
1869
+ def _write_bits(f, carry, col: bytes, samples: int):
1870
+ """Append `samples` bits of `col` (sample i at bit i % 8 of byte i // 8) to file `f` after the `carry` bits not
1871
+ yet written (None: none): whole bytes go to the file, the bits left over (fewer than 8) come back as the carry."""
1872
+ if carry is None and samples % 8 == 0:
1873
+ f.write(col[:samples // 8])
1874
+ return None
1875
+ import numpy as np
1876
+ bits = np.unpackbits(np.frombuffer(col, np.uint8, (samples + 7) // 8), bitorder="little")[:samples]
1877
+ if carry is not None:
1878
+ bits = np.concatenate([carry, bits])
1879
+ whole = len(bits) // 8 * 8
1880
+ f.write(np.packbits(bits[:whole], bitorder="little").tobytes())
1881
+ return bits[whole:] if whole < len(bits) else None
1882
+
1883
+
1884
+ def _flush_bits(f, carry) -> None:
1885
+ """The last carry of _write_bits: its bits in one byte, the rest 0."""
1886
+ if carry is not None and len(carry):
1887
+ import numpy as np
1888
+ f.write(np.packbits(carry, bitorder="little").tobytes())
1889
+
1890
+
1891
+ def _join_bits(pieces) -> bytes:
1892
+ """Pieces (bits, n) joined bit by bit: n need not be a multiple of 8."""
1893
+ if all(n % 8 == 0 for _, n in pieces[:-1]):
1894
+ return b"".join(b[:(n + 7) // 8] for b, n in pieces)
1895
+ import numpy as np
1896
+ return np.packbits(np.concatenate([np.unpackbits(np.frombuffer(b, np.uint8, (n + 7) // 8), bitorder="little")[:n]
1897
+ for b, n in pieces]), bitorder="little").tobytes()
1898
+
1899
+
1868
1900
  class _Acc:
1869
- """One channel of a part being joined from its segments (bits: whole bytes, the part's samples so far a multiple
1870
- of 8; events: quanta offset by the samples so far, a multiple of D). A segment that follows on carries the level
1871
- before it as its start (§1.3), so its changes join the part's as they are."""
1901
+ """One channel of a part being joined from its segments (bits: joined bit by bit; events: quanta offset by the
1902
+ samples so far, a multiple of D). A segment that follows on carries the level before it as its start (§1.3), so
1903
+ its changes join the part's as they are."""
1872
1904
  def __init__(self, c):
1873
1905
  self.first, self.pieces = c, []
1874
1906
  self.start = getattr(c, "start_level", None)
@@ -1894,8 +1926,7 @@ def _built(acc: list, samples: int, ids) -> list:
1894
1926
  ct += c_
1895
1927
  out.append(changes(c.name, ks, lv, ct, -(-samples // c.step), c.step, 0, a.start, pin=ch))
1896
1928
  else:
1897
- out.append(Bits(c.name, b"".join(b for b, _ in a.pieces)[:(samples + 7) // 8], samples, 1, 0,
1898
- {"pin": ch}))
1929
+ out.append(Bits(c.name, _join_bits(a.pieces)[:(samples + 7) // 8], samples, 1, 0, {"pin": ch}))
1899
1930
  return out
1900
1931
 
1901
1932
 
@@ -82,11 +82,11 @@ BITS = 12 # the analog value's b (layout)
82
82
  BLOCK_TOP = 4096 # its own: the longest block L it makes (§1.3)
83
83
  STREAM_BUFFER_BYTES = 1 << 20 # its own: what a stream holds unsent, said in the answer (stream_buffer, §3.3)
84
84
  UNKNOWN_END = 1 << 62 # streaming format 1: a segment dropped whole whose end is not taken yet
85
- BLOCKS_A_TICK = 1 << 14 # streaming: the most samples one tick makes - Python makes far below a fast rate,
86
- # and catching up on all the time passed fell further behind every tick until the
87
- # bench answered nothing (wireskein: format 1 at 2 MHz x 4 lines; format 0 at 1 MHz
88
- # x 2 lines, stop answered after 12.8 s): it makes what it can and the stream runs
89
- # late instead
85
+ FAST_A_TICK = 1 << 17 # streaming: the most one tick makes when numpy makes them at once (a_tick)
86
+ BLOCKS_A_TICK = 1 << 14 # streaming: the most samples one tick makes sample by sample - catching up on all
87
+ # the time passed at once fell further behind every tick until the bench answered
88
+ # nothing (wireskein: format 1 at 2 MHz x 4 lines; format 0 at 1 MHz x 2 lines,
89
+ # stop answered after 12.8 s): it catches up over ticks (held_most)
90
90
 
91
91
 
92
92
  TIMEBASE_HZ = 100_000_000 # its own: format 3's delta tick (the answer's timebase, §3.8)
@@ -206,6 +206,38 @@ def logic_block(raw: list[list[int]], events: list[list[int]], ds: list[int], be
206
206
  return fallback + start + struct.pack("<I", len(ev)) + body + b"".join(ev)
207
207
 
208
208
 
209
+ def logic_block_np(np, raw: list, events: list, ds: list[int], before: list[int], L: int) -> bytes:
210
+ """logic_block with each channel's levels a numpy array: the same bytes, made at once."""
211
+ r = len((raw + events)[0])
212
+ E = len(events)
213
+ fb, ev = [], []
214
+ for e, lv in enumerate(events):
215
+ d = ds[e]
216
+ q = -(-r // d)
217
+ prev = np.concatenate([np.array([before[e]], np.uint8), lv[:-1]])
218
+ changed = np.zeros(q * d, np.int64)
219
+ changed[:r] = lv != prev
220
+ counts = changed.reshape(q, d).sum(axis=1)
221
+ last = lv[np.minimum((np.arange(q) + 1) * d, r) - 1].astype(np.int64)
222
+ t = np.nonzero(counts)[0]
223
+ rec = np.zeros(len(t), dtype=[("t", "<u2"), ("e", "u1"), ("v", "u1")])
224
+ rec["t"], rec["e"], rec["v"] = t, e, (last[t] << 7) | np.minimum(counts[t], 127)
225
+ if len(t) * 4 > L // 8:
226
+ fb.append(e)
227
+ else:
228
+ ev.append(rec.tobytes())
229
+ nb = (E + 7) // 8
230
+ fallback = sum(1 << e for e in fb).to_bytes(nb, "little")
231
+ start = sum(before[e] << e for e in range(E)).to_bytes(nb, "little")
232
+ cols = raw + [events[e] for e in fb]
233
+ body = b""
234
+ if cols:
235
+ bits = np.stack(cols, axis=1).astype(np.uint8)
236
+ body = np.packbits(bits.reshape(-1), bitorder="little").tobytes()
237
+ n_ev = sum(len(x) // 4 for x in ev)
238
+ return fallback + start + struct.pack("<I", n_ev) + body + b"".join(ev)
239
+
240
+
209
241
  def analog_part(values: list[int], kind: int, d: int, b: int) -> bytes:
210
242
  """One channel's part of a format 2 block (§1.4): packed the r values of b bits; else for every interval of d
211
243
  (the last one partial) min and max (b bits each) and / or the sum (b + ceil(log2 d) bits), in that order - bits by
@@ -230,6 +262,15 @@ def analog_part(values: list[int], kind: int, d: int, b: int) -> bytes:
230
262
  return acc.to_bytes((at + 7) // 8, "little")
231
263
 
232
264
 
265
+ class _wave:
266
+ """A logic wave: wave(i, rate) for one sample, wave.many(np, samples, rate) for an array of them (numpy)."""
267
+ def __init__(self, one, many):
268
+ self.one, self.many = one, many
269
+
270
+ def __call__(self, i, rate):
271
+ return self.one(i, rate)
272
+
273
+
233
274
  def logic_wave(spec: str):
234
275
  """A logic channel's waveform instead of the counter's bit: `counter`; `quiet[:LEVEL]` (never changes, default
235
276
  high); `square:PERIOD` (samples); `uart:BAUD[:TEXT]` - 8N1 characters of TEXT (default "OEP\\n") one after another
@@ -239,10 +280,10 @@ def logic_wave(spec: str):
239
280
  return None
240
281
  if kind == "quiet":
241
282
  level = int(args[0]) if args else 1
242
- return lambda i, rate: level
283
+ return _wave(lambda i, rate: level, lambda np, i, rate: np.full(len(i), level, np.uint8))
243
284
  if kind == "square":
244
285
  half = max(1, int(args[0]) // 2)
245
- return lambda i, rate: (i // half) & 1
286
+ return _wave(lambda i, rate: (i // half) & 1, lambda np, i, rate: ((i // half) & 1).astype(np.uint8))
246
287
  if kind == "uart":
247
288
  baud = int(args[0])
248
289
  text = (args[1] if len(args) > 1 else "OEP\n").encode()
@@ -255,7 +296,14 @@ def logic_wave(spec: str):
255
296
  if at <= 8:
256
297
  return text[char % len(text)] >> (at - 1) & 1 # LSB first
257
298
  return 1 # stop, idle
258
- return uart
299
+
300
+ def many(np, i, rate): # the same, for an array of samples
301
+ r = Fraction(rate) # the track's rate is exact: so is the bit time
302
+ bit = (i * (baud * r.denominator)) // r.numerator
303
+ char, at = np.divmod(bit, 20)
304
+ data = (np.frombuffer(text, np.uint8)[char % len(text)] >> np.clip(at - 1, 0, 7)) & 1
305
+ return np.where(at == 0, 0, np.where(at <= 8, data, 1)).astype(np.uint8)
306
+ return _wave(uart, many)
259
307
  raise ValueError(f"logic wave {spec!r}: counter, quiet[:LEVEL], square:PERIOD or uart:BAUD[:TEXT]")
260
308
 
261
309
 
@@ -702,8 +750,39 @@ class VirtualCapture:
702
750
  slot = "H" if self.width == 2 * self.channels else "I"
703
751
  return b"".join(struct.pack(f"<{self.channels}{slot}", *(self.value(k, first + i) for k in self.analog_roles))
704
752
  for i in range(n))
753
+ levels = self._levels(first, n)
754
+ if levels is not None: # numpy: the samples at once
755
+ import numpy as np
756
+ bits = np.zeros((n, self.width), np.uint8)
757
+ bits[:, :] = np.stack(levels[:self.width], axis=1)
758
+ return np.packbits(bits.reshape(-1), bitorder="little").tobytes()
705
759
  return pack_samples([sum(self.value(k, first + i) << k for k in range(self.width)) for i in range(n)], self.width)
706
760
 
761
+ def _levels(self, first: int, n: int):
762
+ """Logic channels 0 .. max(width, channels) - 1 at samples first .. first + n - 1 as numpy arrays, as value() gives them; None
763
+ where only value() can (numpy missing, the glitch filter, the external clock, a wave without its array form, a
764
+ value() a test put on the track).
765
+ Python made a sample a microsecond or more: a bench behind 1 MS/s on a busy host."""
766
+ ns = max(self.glitch_ns.values(), default=0)
767
+ if self.analog or self.clock is not None or n <= 0 or (ns and -(-ns * self.rate // 1_000_000_000) > 1) or \
768
+ "value" in vars(self): # a test's own value(): only it says
769
+ return None
770
+ try:
771
+ import numpy as np
772
+ except ImportError:
773
+ return None
774
+ i = np.arange(first, first + n, dtype=np.int64)
775
+ out = []
776
+ for k in range(max(self.width, self.channels)): # format 1: the channels, its w apart (0 or less)
777
+ wave = self.waves.get(self.logic_roles[k]) if k < len(self.logic_roles) else None
778
+ if wave is None:
779
+ out.append(((i >> k) & 1).astype(np.uint8))
780
+ elif isinstance(wave, _wave):
781
+ out.append(wave.many(np, i, self.rate))
782
+ else:
783
+ return None
784
+ return out
785
+
707
786
  def _blocks(self, first: int, n: int, contiguous: bool, segment_start: bool = True) -> bytes:
708
787
  """A format 1 segment (§1.3): blocks of L from its sample 0; start_level the sample before when it is
709
788
  contiguous in the generation, else the block's first. Format 2: _analog_blocks; format 3: _timed."""
@@ -715,10 +794,18 @@ class VirtualCapture:
715
794
  raw = [k for k in roles if self.carriages.get(k, (CARRIAGE["raw"], 1))[0] == CARRIAGE["raw"]]
716
795
  ev = [k for k in roles if k not in raw]
717
796
  ds = [self.carriages[k][1] for k in ev]
797
+ levels = self._levels(first, n) # numpy: the samples and the blocks at once
718
798
  out = bytearray()
719
799
  for b in range(0, n, self.block):
720
800
  r = min(self.block, n - b)
721
801
  at = first + b
802
+ if levels is not None:
803
+ before = [int(levels[k][b - 1]) if b else (self.value(k, at - 1) if contiguous else int(levels[k][0]))
804
+ for k in ev]
805
+ import numpy as np
806
+ out += logic_block_np(np, [levels[k][b:b + r] for k in raw], [levels[k][b:b + r] for k in ev], ds,
807
+ before, self.block)
808
+ continue
722
809
  before = [self.value(k, at - 1) if (b or contiguous) else self.value(k, at) for k in ev]
723
810
  out += logic_block([[self.value(k, at + i) for i in range(r)] for k in raw],
724
811
  [[self.value(k, at + i) for i in range(r)] for k in ev], ds, before, self.block)
@@ -1018,22 +1105,43 @@ class VirtualCapture:
1018
1105
  if len(self.segs) >= self.segments_max:
1019
1106
  self.state = STATE["paused"]
1020
1107
  break
1108
+ elif self.mode == MODE["streaming"] and due - self.produced > self.held_most():
1109
+ events += self.overflow() # behind by more than its stream holds (below)
1021
1110
  elif self.mode == MODE["streaming"] and self.format in PIECES:
1022
1111
  self._stream_blocks(due, whole=True)
1023
1112
  elif self.mode == MODE["streaming"]:
1024
- per_byte = 1 if self.analog else 8 // math.gcd(self.width, 8) # whole bytes only (§2.2)
1025
- n = min((due - self.produced) // per_byte * per_byte, BLOCKS_A_TICK)
1026
- if n > 0:
1027
- self.data += self._pack(self.produced, n)
1028
- self.produced += n
1029
- taken = self.produced - self.capture_begin
1030
- first = self.first_segment_samples or self.samples
1031
- complete = 0 if taken < first else 1 + (taken - first) // self.samples
1032
- self.serial_done = complete & 0xFFFFFFFF
1033
- done_samples = 0 if not complete else first + (complete - 1) * self.samples
1034
- self.stream_committed_bytes = self.bytes_of(done_samples)
1113
+ self._stream_samples(due)
1035
1114
  return events
1036
1115
 
1116
+ # Streaming follows the clock as a probe's does: sample i is the one taken at t0 + i / rate, and the samples the
1117
+ # clock has taken that the bench has not made yet are as a probe's samples held unsent in its stream buffer. A tick
1118
+ # makes a bounded number (the bench keeps answering), so it may be behind for a while and catch up; stop makes every
1119
+ # sample up to the stop (a probe sends all it holds); behind by more than the stream buffer holds, the track stops
1120
+ # in error as a probe whose buffer overflowed (state 6, error storage) - never a stream that silently ran late
1121
+ # (a section placed by the probe's clock past the stream's end, wireskein on a busy host).
1122
+ def held_most(self) -> int:
1123
+ """The samples its stream buffer holds (stream_buffer, §3.3), at format 0's bytes a sample."""
1124
+ return STREAM_BUFFER_BYTES // max(1, self.width) if self.analog else STREAM_BUFFER_BYTES * 8 // max(1, self.width)
1125
+
1126
+ def a_tick(self) -> int:
1127
+ """The most samples one tick makes: more when numpy makes them at once (a sample a microsecond or more in
1128
+ Python, about a hundredth of that at once)."""
1129
+ return FAST_A_TICK if self._levels(self.produced, 1) is not None else BLOCKS_A_TICK
1130
+
1131
+ def _stream_samples(self, due: int, most: int | None = None) -> None:
1132
+ """Format 0 streaming: the samples up to `due`, at most `most` (a_tick() by default), whole bytes only."""
1133
+ per_byte = 1 if self.analog else 8 // math.gcd(self.width, 8) # whole bytes only (§2.2)
1134
+ n = min((due - self.produced) // per_byte * per_byte, self.a_tick() if most is None else most)
1135
+ if n > 0:
1136
+ self.data += self._pack(self.produced, n)
1137
+ self.produced += n
1138
+ taken = self.produced - self.capture_begin
1139
+ first = self.first_segment_samples or self.samples
1140
+ complete = 0 if taken < first else 1 + (taken - first) // self.samples
1141
+ self.serial_done = complete & 0xFFFFFFFF
1142
+ done_samples = 0 if not complete else first + (complete - 1) * self.samples
1143
+ self.stream_committed_bytes = self.bytes_of(done_samples)
1144
+
1037
1145
  def _stream_geometry(self, rel: int) -> tuple[int, int, int]:
1038
1146
  """Streaming: the segment holding sample `rel` (from the retained start) -> (its number, first sample, size)."""
1039
1147
  first = self.first_segment_samples or self.samples
@@ -1046,7 +1154,7 @@ class VirtualCapture:
1046
1154
  """Format 1 streaming: the blocks the clock has taken - each whole (a block counts its events first, §1.3), at
1047
1155
  most BLOCKS_A_TICK samples a call; `whole` False at stop: the block being taken ends there, short."""
1048
1156
  if whole:
1049
- due = min(due, self.produced + BLOCKS_A_TICK)
1157
+ due = min(due, self.produced + self.a_tick())
1050
1158
  else: # stop: only the block begun, not all the time behind
1051
1159
  rel = self.produced - self.capture_begin
1052
1160
  _, at, size = self._stream_geometry(rel)
@@ -1104,6 +1212,18 @@ class VirtualCapture:
1104
1212
  index = self.first_trigger_index if self.first_trigger_index < partial else NONE
1105
1213
  segment = self._segment(partial, index, flags=FLAG["short"])
1106
1214
  events.append(bytes([EVENT["segment"]]) + segment.pack())
1215
+ if self.state == STATE["capturing"] and self.mode == MODE["streaming"] and now_ms is not None:
1216
+ due = self.kept(int((now_ms - self.started_ms) * self.rate / 1000)) # every sample up to the stop: the
1217
+ if due - self.produced > self.held_most(): # stream holds them (tick's rules, above)
1218
+ return events + self.overflow()
1219
+ while self.state == STATE["capturing"]:
1220
+ before = self.produced
1221
+ if self.format in PIECES:
1222
+ self._stream_blocks(due, whole=True)
1223
+ else:
1224
+ self._stream_samples(due, most=due)
1225
+ if self.produced == before:
1226
+ break
1107
1227
  if self.state == STATE["capturing"] and self.mode == MODE["streaming"] and self.format in PIECES:
1108
1228
  if now_ms is not None: # the taken samples, a short last block
1109
1229
  self._stream_blocks(self.kept(int((now_ms - self.started_ms) * self.rate / 1000)), whole=False)
@@ -115,6 +115,15 @@ def test_during_is_for_a_stream_in_place_of_seconds():
115
115
  acquire.Request([("A", "GPIO10")], 1_000_000, 100, during=lambda wait: None, **kw)
116
116
 
117
117
 
118
+ def test_a_format_1_stream_on_disk(probe, tmp_path):
119
+ """Streamed in format 1, raw and changes lines, put together on disk as it comes: every segment joined in order."""
120
+ for resolution in ({"B": 1}, {"A": 4, "B": 1}):
121
+ req = acquire.Request([("A", "GPIO10"), ("B", "GPIO11")], 1_000_000, 0, mode="stream", seconds=0.3,
122
+ resolution=resolution, spool_dir=str(tmp_path))
123
+ res = acquire.capture_at(probe(), req)
124
+ assert res.complete and len(res.parts) == 1, resolution
125
+
126
+
118
127
  def test_format_1_lines_as_their_changes(probe):
119
128
  req = acquire.Request([("A", "GPIO10"), ("B", "GPIO11")], 20_000_000, 1000, resolution={"B": 1})
120
129
  res = acquire.capture_at(probe(), req)
@@ -165,3 +174,43 @@ def test_lines_are_named_by_channel_name_or_label(probe):
165
174
  acquire.capture_at(probe(), acquire.Request([("A", "10")], 20_000_000, 100)) # a number is not a name
166
175
  with pytest.raises(ValueError, match="no channel carries that label"):
167
176
  acquire.capture_at(probe(), acquire.Request([("A", "x035.nrst")], 20_000_000, 100))
177
+
178
+
179
+ def test_stream_segments_join_bit_by_bit(tmp_path):
180
+ """A stream's segments need not end on a whole byte of each line (2 lines in 2-bit samples, 65332 samples a
181
+ segment on the P4): they join into one part, bit by bit - parts are cut only where data was lost."""
182
+ import random
183
+ import types
184
+ from oep_client.capture import SegmentInfo
185
+ rnd = random.Random(1)
186
+ n_seg, per = 3, 12 # 12 samples: 3 bytes of the stream, 1.5 bytes a line
187
+ a = [rnd.randrange(2) for _ in range(n_seg * per)]
188
+ b = [rnd.randrange(2) for _ in range(n_seg * per)]
189
+ data = bytearray()
190
+ for i in range(0, len(a), 4): # sample i: bits 2i (A) and 2i + 1 (B) of the stream
191
+ v = 0
192
+ for j in range(4):
193
+ v |= (a[i + j] | b[i + j] << 1) << (2 * j)
194
+ data.append(v)
195
+ segs = {k * 3: SegmentInfo(k * 3, per, 1_000_000 + k * per * 200, 50) for k in range(n_seg)}
196
+ got = types.SimpleNamespace(data=data, segments=segs, gaps=[], start=0)
197
+ cfg = types.SimpleNamespace(rate=5_000_000, width=2, positions=None, event_d={})
198
+ req = acquire.Request([("A", "x"), ("B", "y")], 5_000_000, 0, mode="stream", seconds=1)
199
+ parts, lost = acquire._stream_parts(None, cfg, got, ["A", "B"], [10, 11], req)
200
+ assert not lost and len(parts) == 1
201
+ got_a, got_b = (list(levels(c)) for c in parts[0].channels)
202
+ assert got_a == a and got_b == b
203
+
204
+
205
+ def test_bits_written_across_bytes(tmp_path):
206
+ import io
207
+ rnd = __import__("random").Random(2)
208
+ want, f, carry = [], io.BytesIO(), None
209
+ for n in (5, 12, 3, 16, 7):
210
+ bits = [rnd.randrange(2) for _ in range(n)]
211
+ want += bits
212
+ col = bytes(sum(bits[i + j] << j for j in range(min(8, n - i))) for i in range(0, n, 8))
213
+ carry = acquire._write_bits(f, carry, col, n)
214
+ acquire._flush_bits(f, carry)
215
+ out = np.unpackbits(np.frombuffer(f.getvalue(), np.uint8), bitorder="little")[: len(want)]
216
+ assert list(out) == want and len(f.getvalue()) == (len(want) + 7) // 8
@@ -297,10 +297,10 @@ def test_streaming_answer_says_its_stream_buffer():
297
297
  assert lc.configure(rate=10_000_000, samples=100).stream_buffer is None # one-shot: not said
298
298
 
299
299
 
300
- def test_format_0_streaming_makes_a_tick_at_most_and_stop_answers():
301
- """Streaming format 0: a tick makes at most BLOCKS_A_TICK samples, so a bench far behind a fast rate still answers
302
- (the stream runs late) - catching up on all the time passed at once answered stop after 12.8 s (wireskein: 1 MHz x
303
- 2 lines)."""
300
+ def test_format_0_streaming_catches_up_over_ticks_and_stop_makes_every_sample():
301
+ """Streaming format 0: a tick makes a bounded number of samples (a_tick), so a bench behind a fast rate still
302
+ answers and catches up over ticks; stop makes every sample up to the stop (a probe sends what its stream buffer
303
+ holds) - before, the stream ran late and ended before the stop (wireskein: a section past its end on a busy host)."""
304
304
  from oep_client import virtual_bench_capture as vbc
305
305
  ep, hst, lc, clock = bench()
306
306
  planned(hst, lc, 2)
@@ -310,12 +310,30 @@ def test_format_0_streaming_makes_a_tick_at_most_and_stop_answers():
310
310
  cap = ep.captures[lc.fn]
311
311
  clock.t += 2_000 # 2 s (within the lease): two million samples due
312
312
  cap.tick(clock.t)
313
- assert cap.produced == vbc.BLOCKS_A_TICK
313
+ assert cap.produced == cap.a_tick() < 2_000_000
314
314
  lc.stop()
315
- assert cap.produced <= 4 * vbc.BLOCKS_A_TICK < 2_000_000 # a tick or a few (the requests tick too), not 2 s
315
+ assert cap.produced == 2_000_000 # all of them, at the stop
316
316
  assert lc.status().state == c.STATE["configured"]
317
317
 
318
318
 
319
+ def test_streaming_behind_more_than_its_buffer_stops_in_error(monkeypatch):
320
+ """Behind by more than its stream buffer holds, the track stops in error as a probe whose buffer overflowed: never a
321
+ stream that silently ran late."""
322
+ from oep_client import virtual_bench_capture as vbc
323
+ monkeypatch.setattr(vbc, "STREAM_BUFFER_BYTES", 1 << 12) # 16384 samples of 2 lines: 16 ms at 1 MS/s
324
+ ep, hst, lc, clock = bench()
325
+ planned(hst, lc, 2)
326
+ lc.configure(rate=1_000_000, mode=c.STREAMING)
327
+ lc.subscribe(16384, 20)
328
+ lc.start()
329
+ cap = ep.captures[lc.fn]
330
+ assert cap.held_most() == 16384
331
+ clock.t += 30 # more than the buffer's time, in one go
332
+ cap.tick(clock.t)
333
+ st = lc.status()
334
+ assert st.state == c.STATE["error"]
335
+
336
+
319
337
  def test_format_1_with_every_channel_events_has_w_and_c_0():
320
338
  ep, hst, lc, clock = bench()
321
339
  roles = planned(hst, lc, 3)
@@ -0,0 +1,64 @@
1
+ """The virtual bench's logic samples made at once with numpy are the ones value() gives, sample by sample: the counter,
2
+ the logic waves, every w, any first sample and length; and a second of 1 MS/s on 2 lines takes well under a second."""
3
+
4
+ import random
5
+ import time
6
+ from fractions import Fraction
7
+
8
+ import pytest
9
+
10
+ from oep_client import virtual_bench_capture as vbc
11
+
12
+ pytest.importorskip("numpy")
13
+
14
+ WAVES = ["quiet", "quiet:0", "square:6", "square:7", "uart:115200", "uart:9600:Hi", "uart:1000000:OEP\n"]
15
+
16
+
17
+ def track(width, channels, rate, waves):
18
+ cap = vbc.VirtualCapture({0, 3}, {width}, 1, 1 << 30)
19
+ cap.width, cap.channels, cap.rate, cap.format = width, channels, Fraction(rate), vbc.FORMAT["raw"] \
20
+ if "raw" in vbc.FORMAT else 0
21
+ cap.logic_roles = tuple(range(channels))
22
+ cap.waves = {k: vbc.logic_wave(w) for k, w in waves.items()}
23
+ return cap
24
+
25
+
26
+ def slow(cap, first, n):
27
+ return vbc.pack_samples([sum(cap.value(k, first + i) << k for k in range(cap.width)) for i in range(n)], cap.width)
28
+
29
+
30
+ def test_at_once_is_value_sample_by_sample():
31
+ rnd = random.Random(5)
32
+ for _ in range(200):
33
+ width = rnd.choice([1, 2, 3, 4, 5, 8, 12, 16])
34
+ channels = rnd.randint(1, width)
35
+ rate = rnd.choice([1_000_000, 3_000_000, Fraction(80_000_000, 3), 48_000])
36
+ waves = {k: rnd.choice(WAVES) for k in range(channels) if rnd.random() < 0.6}
37
+ cap = track(width, channels, rate, waves)
38
+ first, n = rnd.randrange(0, 1 << 24), rnd.randint(1, 300)
39
+ assert cap._levels(first, n) is not None
40
+ assert cap._pack(first, n) == slow(cap, first, n), (width, channels, rate, waves, first, n)
41
+
42
+
43
+ def test_a_second_of_1_ms_s_on_2_lines_is_fast():
44
+ cap = track(2, 2, 1_000_000, {1: "uart:115200"})
45
+ t = time.perf_counter()
46
+ for at in range(0, 1_000_000, vbc.BLOCKS_A_TICK):
47
+ cap._pack(at, vbc.BLOCKS_A_TICK)
48
+ assert time.perf_counter() - t < 0.5
49
+
50
+
51
+ def test_format_1_blocks_at_once_are_the_same():
52
+ rnd = random.Random(6)
53
+ for _ in range(150):
54
+ channels = rnd.randint(1, 4)
55
+ cap = track(8, channels, 1_000_000, {k: rnd.choice(WAVES) for k in range(channels) if rnd.random() < 0.6})
56
+ cap.block = rnd.choice([64, 256])
57
+ cap.carriages = {k: (vbc.CARRIAGE["events"], rnd.choice([1, 4])) for k in range(channels) if rnd.random() < 0.5}
58
+ first, n = rnd.randrange(1, 1 << 20), rnd.randint(1, 700)
59
+ contiguous = rnd.random() < 0.5
60
+ fast = cap._blocks(first, n, contiguous=contiguous)
61
+ levels = cap._levels
62
+ cap._levels = lambda first, n: None
63
+ assert fast == cap._blocks(first, n, contiguous=contiguous)
64
+ cap._levels = levels