oep-client-python 0.0.32__tar.gz → 0.0.34__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 (732) hide show
  1. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/CHANGELOG.md +15 -0
  2. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/PKG-INFO +1 -1
  3. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/spec-follow-notes.ja.md +39 -0
  4. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/pyproject.toml +1 -1
  5. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/__init__.py +1 -1
  6. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/__main__.py +16 -0
  7. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/config.py +47 -0
  8. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/endpoint.py +84 -17
  9. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/registry.py +7 -7
  10. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/riscv.py +30 -2
  11. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_attach_model.py +3 -2
  12. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_bench.py +7 -3
  13. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_oep_declaration_model.py +3 -3
  14. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_registered_ops_model.py +1 -1
  15. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_scan_options_model.py +1 -1
  16. oep_client_python-0.0.34/tests/hw/results/9489dd2ae0953650-0.0.32+1491c13-0.0.31-20261016T133559.json +393 -0
  17. oep_client_python-0.0.34/tests/hw/results/9489dd2ae0953650-0.0.32+672bf7b-0.0.32-20261016T164655.json +391 -0
  18. oep_client_python-0.0.34/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131458.json +372 -0
  19. oep_client_python-0.0.34/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131510.json +162 -0
  20. oep_client_python-0.0.34/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131526.json +372 -0
  21. oep_client_python-0.0.34/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131532.json +372 -0
  22. oep_client_python-0.0.34/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131656.json +361 -0
  23. oep_client_python-0.0.34/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131703.json +372 -0
  24. oep_client_python-0.0.34/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131708.json +372 -0
  25. oep_client_python-0.0.34/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T132050.json +364 -0
  26. oep_client_python-0.0.34/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T132057.json +364 -0
  27. oep_client_python-0.0.34/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T132104.json +364 -0
  28. oep_client_python-0.0.34/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.32+1491c13-0.0.31-20261016T133501.json +752 -0
  29. oep_client_python-0.0.34/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.32+672bf7b-0.0.32-20261016T164559.json +753 -0
  30. oep_client_python-0.0.34/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.32-0.0.31-20261016T130922.json +719 -0
  31. oep_client_python-0.0.34/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.32-0.0.31-20261016T131024.json +228 -0
  32. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/test_probe.py +15 -2
  33. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/spec/oep-v1.toml +25 -1
  34. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_config.py +2 -1
  35. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_oep_declarations.py +2 -1
  36. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_host_rules_2026_10_02.py +2 -2
  37. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_passthrough.py +2 -0
  38. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_request_tails.py +1 -0
  39. oep_client_python-0.0.34/tests/test_rvswd_rest.py +61 -0
  40. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_trace_debug.py +1 -1
  41. oep_client_python-0.0.34/tests/test_wire_hold.py +59 -0
  42. oep_client_python-0.0.34/tests/vectors/SPEC_COMMIT +1 -0
  43. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/vectors/SPEC_SHA256 +3 -3
  44. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/vectors/ops.json +4 -4
  45. oep_client_python-0.0.32/tests/vectors/SPEC_COMMIT +0 -1
  46. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/.gitignore +0 -0
  47. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/LICENSE +0 -0
  48. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/README.ja.md +0 -0
  49. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/README.md +0 -0
  50. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/README.ja.md +0 -0
  51. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/allocator-conformance.ja.md +0 -0
  52. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/analog-conformance.ja.md +0 -0
  53. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/analog-payload-conformance.ja.md +0 -0
  54. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/arm-adi-conformance.ja.md +0 -0
  55. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/attach-conformance.ja.md +0 -0
  56. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/block-conformance.ja.md +0 -0
  57. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/capture-group-conformance.ja.md +0 -0
  58. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/capture-group-geometry-conformance.ja.md +0 -0
  59. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/capture-metadata-conformance.ja.md +0 -0
  60. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/capture-serial-conformance.ja.md +0 -0
  61. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/capture-timeline-conformance.ja.md +0 -0
  62. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/capture-timeline-lifecycle-conformance.ja.md +0 -0
  63. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/clock-conformance.ja.md +0 -0
  64. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/config-conformance.ja.md +0 -0
  65. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/config-execution-conformance.ja.md +0 -0
  66. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/config-fallback-conformance.ja.md +0 -0
  67. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/config-paging-conformance.ja.md +0 -0
  68. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/config-power-loss-conformance.ja.md +0 -0
  69. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/config-storage-conformance.ja.md +0 -0
  70. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/conformance-checks.ja.md +0 -0
  71. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/conformance-spec-compatibility.ja.md +0 -0
  72. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/core-fixed-fields-review.ja.md +0 -0
  73. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/core-smoke-conformance.ja.md +0 -0
  74. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/corr-conformance.ja.md +0 -0
  75. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/cut-conformance.ja.md +0 -0
  76. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/data-conformance.ja.md +0 -0
  77. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/debug-conformance.ja.md +0 -0
  78. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/dependency-conformance.ja.md +0 -0
  79. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/discovery-conformance.ja.md +0 -0
  80. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/dmseq-conformance.ja.md +0 -0
  81. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/dmseq-target-conformance.ja.md +0 -0
  82. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/execution-order-conformance.ja.md +0 -0
  83. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/exhausted-conformance.ja.md +0 -0
  84. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/fixture-metadata-conformance.ja.md +0 -0
  85. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/gpio-conformance.ja.md +0 -0
  86. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/gpio-lifecycle-conformance.ja.md +0 -0
  87. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/hardware-configuration.ja.md +0 -0
  88. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/hardware-quickstart.ja.md +0 -0
  89. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/hardware-schema.ja.md +0 -0
  90. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/host-core-shapes-conformance.ja.md +0 -0
  91. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/host-deadline-conformance.ja.md +0 -0
  92. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/host-notification-conformance.ja.md +0 -0
  93. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/host-request-conformance.ja.md +0 -0
  94. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/host-resend-conformance.ja.md +0 -0
  95. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/host-tlv-conformance.ja.md +0 -0
  96. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/host-value-conformance.ja.md +0 -0
  97. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/host-wait-conformance.ja.md +0 -0
  98. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/i2c-conformance.ja.md +0 -0
  99. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/interface-conformance.ja.md +0 -0
  100. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/interface-smoke-conformance.ja.md +0 -0
  101. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/lease-conformance.ja.md +0 -0
  102. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/link-routes-conformance.ja.md +0 -0
  103. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/link-transfer-conformance.ja.md +0 -0
  104. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/logic-conformance.ja.md +0 -0
  105. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/mailbox-conformance.ja.md +0 -0
  106. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/notification-output-sample.ja.md +0 -0
  107. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/notification-retention-conformance.ja.md +0 -0
  108. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/notification-sequence-conformance.ja.md +0 -0
  109. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/oep-declaration-conformance.ja.md +0 -0
  110. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/oep-example-smoke-conformance.ja.md +0 -0
  111. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/outcome-conformance.ja.md +0 -0
  112. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/pin-constraints-conformance.ja.md +0 -0
  113. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/pipeline-conformance.ja.md +0 -0
  114. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/port-speed-conformance.ja.md +0 -0
  115. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/probe-input-conformance.ja.md +0 -0
  116. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/recovery-conformance.ja.md +0 -0
  117. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/recovery-races-conformance.ja.md +0 -0
  118. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/refusal-order-conformance.ja.md +0 -0
  119. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/registered-ops-conformance.ja.md +0 -0
  120. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/replay-pressure-conformance.ja.md +0 -0
  121. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/reset-conformance.ja.md +0 -0
  122. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/resource-conformance.ja.md +0 -0
  123. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/response-race-conformance.ja.md +0 -0
  124. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/restart-conformance.ja.md +0 -0
  125. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/retention-conformance.ja.md +0 -0
  126. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/retention-lifecycle-conformance.ja.md +0 -0
  127. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/retry-conformance.ja.md +0 -0
  128. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/route-conformance.ja.md +0 -0
  129. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/run-conformance.ja.md +0 -0
  130. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/scan-conformance.ja.md +0 -0
  131. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/scan-options-conformance.ja.md +0 -0
  132. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/selected-metadata-conformance.ja.md +0 -0
  133. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/session-loss-conformance.ja.md +0 -0
  134. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/session-smoke-conformance.ja.md +0 -0
  135. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/spec-a09fa45-sections.ja.md +0 -0
  136. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/spi-conformance.ja.md +0 -0
  137. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/stage9-rule-trace.ja.md +0 -0
  138. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/step-conformance.ja.md +0 -0
  139. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/stream-conformance.ja.md +0 -0
  140. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/subscription-conformance.ja.md +0 -0
  141. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/tcp-recovery-conformance.ja.md +0 -0
  142. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/testing-consumers.ja.md +0 -0
  143. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/testing-policy.ja.md +0 -0
  144. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/tlv-request-conformance.ja.md +0 -0
  145. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/README.ja.md +0 -0
  146. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/capture.json +0 -0
  147. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/common.json +0 -0
  148. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/console.json +0 -0
  149. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/core.json +0 -0
  150. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/debug.json +0 -0
  151. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/fixture.json +0 -0
  152. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/link.json +0 -0
  153. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/plan.json +0 -0
  154. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/probe-config.json +0 -0
  155. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/restart.json +0 -0
  156. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review/capture.json +0 -0
  157. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review/common.json +0 -0
  158. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review/console.json +0 -0
  159. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review/core.json +0 -0
  160. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review/debug.json +0 -0
  161. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review/fixture.json +0 -0
  162. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review/link.json +0 -0
  163. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review/plan.json +0 -0
  164. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review/probe-config.json +0 -0
  165. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review/restart.json +0 -0
  166. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review/sample-audit.ja.md +0 -0
  167. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review/transports.json +0 -0
  168. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review2/capture.json +0 -0
  169. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review2/common.json +0 -0
  170. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review2/console.json +0 -0
  171. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review2/core.0.json +0 -0
  172. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review2/core.1-6.json +0 -0
  173. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review2/core.7-13.json +0 -0
  174. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review2/debug.json +0 -0
  175. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review2/fixture.json +0 -0
  176. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review2/link.json +0 -0
  177. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review2/plan.json +0 -0
  178. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review2/probe-config.json +0 -0
  179. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review2/restart.json +0 -0
  180. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review2/transports.json +0 -0
  181. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review3/capture.json +0 -0
  182. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review3/core-a.json +0 -0
  183. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review3/core-b.json +0 -0
  184. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review3/debug-a.json +0 -0
  185. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review3/debug-b.json +0 -0
  186. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review3/rest.json +0 -0
  187. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review4/capture.json +0 -0
  188. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review4/core-rest.json +0 -0
  189. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review4/core-sessions.json +0 -0
  190. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review4/debug.json +0 -0
  191. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review4/fixture-console.json +0 -0
  192. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review4/small.json +0 -0
  193. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review5/capture.json +0 -0
  194. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review5/core-a.json +0 -0
  195. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review5/core-b.json +0 -0
  196. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review5/debug-targets.json +0 -0
  197. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review5/debug-wires.json +0 -0
  198. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review5/small.json +0 -0
  199. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review6/capture-console.json +0 -0
  200. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review6/core-early.json +0 -0
  201. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review6/core-late.json +0 -0
  202. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review6/debug-a.json +0 -0
  203. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review6/debug-b.json +0 -0
  204. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review6/rest.json +0 -0
  205. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review7/exact-payload.json +0 -0
  206. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review7/host-recovery.json +0 -0
  207. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review7/optional-as-required.json +0 -0
  208. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review7/request-validation.json +0 -0
  209. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review7/state-and-resources.json +0 -0
  210. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review7/tlv-readers.json +0 -0
  211. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review8/core-1.json +0 -0
  212. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review8/core-2.json +0 -0
  213. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/review8/debug.json +0 -0
  214. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/trace/transports.json +0 -0
  215. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/uart-conformance.ja.md +0 -0
  216. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/uart-stream-conformance.ja.md +0 -0
  217. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/usb-conformance.ja.md +0 -0
  218. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/wire-options-conformance.ja.md +0 -0
  219. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/docs/writer-lease-conformance.ja.md +0 -0
  220. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/arm.py +0 -0
  221. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/capture.py +0 -0
  222. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/catalog.py +0 -0
  223. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/ch32_flash.py +0 -0
  224. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/cobs.py +0 -0
  225. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance.py +0 -0
  226. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_allocator.py +0 -0
  227. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_allocator_sample.py +0 -0
  228. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_analog.py +0 -0
  229. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_analog_payload.py +0 -0
  230. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_analog_sample.py +0 -0
  231. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_arm_adi.py +0 -0
  232. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_arm_adi_blocks.py +0 -0
  233. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_arm_adi_sample.py +0 -0
  234. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_attach.py +0 -0
  235. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_attach_sample.py +0 -0
  236. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_block_sample.py +0 -0
  237. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_blocks.py +0 -0
  238. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_capture_group.py +0 -0
  239. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_capture_group_geometry.py +0 -0
  240. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_capture_group_sample.py +0 -0
  241. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_capture_metadata.py +0 -0
  242. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_capture_serial.py +0 -0
  243. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_capture_serial_sample.py +0 -0
  244. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_capture_timeline.py +0 -0
  245. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_capture_timeline_lifecycle.py +0 -0
  246. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_capture_timeline_sample.py +0 -0
  247. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_clock.py +0 -0
  248. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_clock_sample.py +0 -0
  249. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_config.py +0 -0
  250. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_config_execution.py +0 -0
  251. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_config_execution_sample.py +0 -0
  252. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_config_fallback.py +0 -0
  253. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_config_fallback_sample.py +0 -0
  254. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_config_paging.py +0 -0
  255. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_config_paging_sample.py +0 -0
  256. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_config_power_loss.py +0 -0
  257. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_config_power_loss_sample.py +0 -0
  258. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_config_sample.py +0 -0
  259. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_config_storage.py +0 -0
  260. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_config_storage_sample.py +0 -0
  261. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_core_fixed_fields.py +0 -0
  262. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_core_smoke.py +0 -0
  263. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_corr.py +0 -0
  264. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_cut.py +0 -0
  265. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_cut_sample.py +0 -0
  266. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_data.py +0 -0
  267. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_data_sample.py +0 -0
  268. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_debug.py +0 -0
  269. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_debug_sample.py +0 -0
  270. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_dependencies.py +0 -0
  271. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_dependency_sample.py +0 -0
  272. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_discovery.py +0 -0
  273. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_dmseq.py +0 -0
  274. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_dmseq_sample.py +0 -0
  275. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_dmseq_target.py +0 -0
  276. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_dmseq_target_sample.py +0 -0
  277. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_execution_order.py +0 -0
  278. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_execution_order_sample.py +0 -0
  279. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_exhausted.py +0 -0
  280. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_exhausted_sample.py +0 -0
  281. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_fixture_metadata.py +0 -0
  282. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_gpio.py +0 -0
  283. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_gpio_lifecycle.py +0 -0
  284. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_gpio_lifecycle_sample.py +0 -0
  285. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_gpio_sample.py +0 -0
  286. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_host_core.py +0 -0
  287. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_host_core_sample.py +0 -0
  288. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_host_deadline.py +0 -0
  289. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_host_deadline_sample.py +0 -0
  290. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_host_notifications.py +0 -0
  291. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_host_notifications_sample.py +0 -0
  292. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_host_request_sample.py +0 -0
  293. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_host_requests.py +0 -0
  294. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_host_resend.py +0 -0
  295. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_host_resend_sample.py +0 -0
  296. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_host_tlv.py +0 -0
  297. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_host_tlv_sample.py +0 -0
  298. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_host_values.py +0 -0
  299. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_host_values_sample.py +0 -0
  300. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_host_wait.py +0 -0
  301. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_host_wait_sample.py +0 -0
  302. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_i2c.py +0 -0
  303. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_i2c_sample.py +0 -0
  304. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_interface_smoke.py +0 -0
  305. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_interfaces.py +0 -0
  306. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_lease.py +0 -0
  307. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_lease_sample.py +0 -0
  308. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_link_routes.py +0 -0
  309. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_link_routes_sample.py +0 -0
  310. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_link_transfer_sample.py +0 -0
  311. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_link_transfers.py +0 -0
  312. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_logic.py +0 -0
  313. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_logic_sample.py +0 -0
  314. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_mailbox.py +0 -0
  315. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_mailbox_sample.py +0 -0
  316. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_notification_retention.py +0 -0
  317. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_notification_retention_sample.py +0 -0
  318. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_notification_sequence.py +0 -0
  319. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_notification_sequence_sample.py +0 -0
  320. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_oep_declarations.py +0 -0
  321. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_oep_smoke.py +0 -0
  322. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_outcome_sample.py +0 -0
  323. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_outcomes.py +0 -0
  324. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_pipeline.py +0 -0
  325. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_pipeline_sample.py +0 -0
  326. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_port_speed.py +0 -0
  327. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_port_speed_execution.py +0 -0
  328. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_port_speed_execution_sample.py +0 -0
  329. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_port_speed_lifecycle.py +0 -0
  330. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_port_speed_sample.py +0 -0
  331. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_probe_input.py +0 -0
  332. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_probe_input_sample.py +0 -0
  333. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_recovery.py +0 -0
  334. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_recovery_race_sample.py +0 -0
  335. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_recovery_races.py +0 -0
  336. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_recovery_sample.py +0 -0
  337. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_refusal_order.py +0 -0
  338. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_refusal_order_sample.py +0 -0
  339. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_registered_ops.py +0 -0
  340. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_replay_pressure.py +0 -0
  341. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_reset.py +0 -0
  342. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_reset_sample.py +0 -0
  343. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_resource_sample.py +0 -0
  344. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_resources.py +0 -0
  345. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_response_race.py +0 -0
  346. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_response_race_sample.py +0 -0
  347. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_restart.py +0 -0
  348. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_restart_sample.py +0 -0
  349. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_retention.py +0 -0
  350. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_retention_lifecycle.py +0 -0
  351. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_retention_lifecycle_sample.py +0 -0
  352. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_retention_sample.py +0 -0
  353. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_retry.py +0 -0
  354. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_retry_sample.py +0 -0
  355. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_route_sample.py +0 -0
  356. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_routes.py +0 -0
  357. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_run.py +0 -0
  358. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_run_sample.py +0 -0
  359. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_scan.py +0 -0
  360. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_scan_options.py +0 -0
  361. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_scan_options_sample.py +0 -0
  362. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_scan_sample.py +0 -0
  363. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_selected_metadata.py +0 -0
  364. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_serial.py +0 -0
  365. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_session_loss.py +0 -0
  366. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_session_loss_sample.py +0 -0
  367. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_session_smoke.py +0 -0
  368. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_spi.py +0 -0
  369. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_spi_sample.py +0 -0
  370. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_step.py +0 -0
  371. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_step_sample.py +0 -0
  372. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_stream.py +0 -0
  373. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_stream_sample.py +0 -0
  374. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_subscription_sample.py +0 -0
  375. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_subscriptions.py +0 -0
  376. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_tcp.py +0 -0
  377. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_tcp_peers.py +0 -0
  378. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_tcp_recovery.py +0 -0
  379. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_tcp_recovery_sample.py +0 -0
  380. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_tlv_requests.py +0 -0
  381. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_uart.py +0 -0
  382. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_uart_sample.py +0 -0
  383. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_uart_stream.py +0 -0
  384. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_uart_stream_sample.py +0 -0
  385. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_usb.py +0 -0
  386. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_usb_cases.py +0 -0
  387. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_usb_model.py +0 -0
  388. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_wire_options.py +0 -0
  389. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_wire_options_sample.py +0 -0
  390. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_writer_lease.py +0 -0
  391. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/conformance_writer_lease_sample.py +0 -0
  392. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/console.py +0 -0
  393. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/core.py +0 -0
  394. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/decode.py +0 -0
  395. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/discovery.py +0 -0
  396. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/dump.py +0 -0
  397. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/fixture.py +0 -0
  398. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/frames.py +0 -0
  399. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/hardware.py +0 -0
  400. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/hid_stream.py +0 -0
  401. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/host.py +0 -0
  402. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/interfaces.py +0 -0
  403. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/kept_session.py +0 -0
  404. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/link.py +0 -0
  405. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/linktest.py +0 -0
  406. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/message.py +0 -0
  407. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/names.py +0 -0
  408. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/pins.py +0 -0
  409. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/pytest_conformance.py +0 -0
  410. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/rp2350.py +0 -0
  411. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/speed_record.py +0 -0
  412. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/targets.py +0 -0
  413. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/uiapduino.py +0 -0
  414. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/usb_stream.py +0 -0
  415. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_allocator_model.py +0 -0
  416. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_analog_model.py +0 -0
  417. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_arm_adi_model.py +0 -0
  418. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_bench_capture.py +0 -0
  419. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_bench_mdns.py +0 -0
  420. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_bench_serial.py +0 -0
  421. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_bench_serve.py +0 -0
  422. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_bench_usb.py +0 -0
  423. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_block_model.py +0 -0
  424. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_capture_group_geometry_model.py +0 -0
  425. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_capture_group_model.py +0 -0
  426. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_capture_metadata_model.py +0 -0
  427. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_capture_timeline_model.py +0 -0
  428. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_clock_model.py +0 -0
  429. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_config_execution_model.py +0 -0
  430. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_config_model.py +0 -0
  431. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_config_paging_model.py +0 -0
  432. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_config_power_loss_model.py +0 -0
  433. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_config_storage_model.py +0 -0
  434. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_core.py +0 -0
  435. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_cut_model.py +0 -0
  436. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_data_model.py +0 -0
  437. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_debug_model.py +0 -0
  438. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_declaration_model.py +0 -0
  439. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_dependency_model.py +0 -0
  440. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_dmseq_model.py +0 -0
  441. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_dmseq_target_model.py +0 -0
  442. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_fixture_metadata_model.py +0 -0
  443. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_gpio_lifecycle_model.py +0 -0
  444. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_gpio_model.py +0 -0
  445. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_i2c_model.py +0 -0
  446. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_link_routes_model.py +0 -0
  447. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_link_transfer_model.py +0 -0
  448. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_logic_model.py +0 -0
  449. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_mailbox_model.py +0 -0
  450. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_names.py +0 -0
  451. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_notification_model.py +0 -0
  452. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_outcome_model.py +0 -0
  453. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_pipeline_model.py +0 -0
  454. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_port_speed_execution_model.py +0 -0
  455. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_port_speed_model.py +0 -0
  456. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_reset_model.py +0 -0
  457. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_resource_model.py +0 -0
  458. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_restart_model.py +0 -0
  459. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_retention_model.py +0 -0
  460. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_retry_model.py +0 -0
  461. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_route_model.py +0 -0
  462. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_run_model.py +0 -0
  463. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_scan_model.py +0 -0
  464. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_selected_metadata_model.py +0 -0
  465. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_spi_model.py +0 -0
  466. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_step_model.py +0 -0
  467. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_stream_model.py +0 -0
  468. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_tlv_request_model.py +0 -0
  469. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_uart_model.py +0 -0
  470. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_wire_options_model.py +0 -0
  471. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/src/oep_client/virtual_writer_lease_model.py +0 -0
  472. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/conftest.py +0 -0
  473. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/equipment/.env.example +0 -0
  474. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/equipment/test_core_contract.py +0 -0
  475. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/equipment/test_preflight.py +0 -0
  476. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/fixtures/hardware.virtual.toml +0 -0
  477. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/.env.example +0 -0
  478. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/.env.virtual.example +0 -0
  479. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/README.ja.md +0 -0
  480. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/README.md +0 -0
  481. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/__init__.py +0 -0
  482. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/boards.py +0 -0
  483. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/conftest.py +0 -0
  484. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/firmware.py +0 -0
  485. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/flash.py +0 -0
  486. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/hardware.example.toml +0 -0
  487. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/hardware.resolved.example.toml +0 -0
  488. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/record.py +0 -0
  489. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/results/.gitignore +0 -0
  490. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/results/9489dd2ae0953650-0.0.26+5bafb92-0.0.26.json +0 -0
  491. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/results/9489dd2ae0953650-0.0.26+654b06a-0.0.26.json +0 -0
  492. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/results/9489dd2ae0953650-0.0.27+ec1df99-0.0.27.json +0 -0
  493. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.26+4fad559-0.0.26.json +0 -0
  494. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.26+5bafb92-0.0.26.json +0 -0
  495. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.25-0.0.26.json +0 -0
  496. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.26+5bafb92-0.0.26.json +0 -0
  497. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.26+654b06a-0.0.26.json +0 -0
  498. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.26+e877631-0.0.26.json +0 -0
  499. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.27+ac80e07-0.0.27.json +0 -0
  500. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.27+ec1df99-0.0.27.json +0 -0
  501. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.27-0.0.27.json +0 -0
  502. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.28-0.0.28.json +0 -0
  503. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/results/esp32-pico-d4-50029191fe34-unknown-0.0.26.json +0 -0
  504. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/results/esp32-series-30eda0e31108-0.0.26+5bafb92-0.0.26.json +0 -0
  505. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/results/esp32-series-30eda0e31108-0.0.26+654b06a-0.0.26.json +0 -0
  506. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/results/esp32-series-30eda0e343c6-0.0.26+5bafb92-0.0.26.json +0 -0
  507. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/results/esp32-series-30eda0e343c6-0.0.26+654b06a-0.0.26.json +0 -0
  508. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/results/esp32-series-30eda0e343c6-0.0.27+ec1df99-0.0.27.json +0 -0
  509. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/results/esp32-series-30eda0e343c6-0.0.28+ffe4eb1-0.0.28.json +0 -0
  510. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/results/esp32-series-30eda0e343c6-0.0.28-0.0.28.json +0 -0
  511. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+0f013b7-0.0.28.json +0 -0
  512. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+1c940ca-0.0.28.json +0 -0
  513. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+4ef21db+4ef21db-dirty-0.0.28.json +0 -0
  514. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+68d9694-0.0.28.json +0 -0
  515. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+ec38b1d-0.0.28.json +0 -0
  516. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+ffe4eb1-0.0.28.json +0 -0
  517. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28-0.0.28.json +0 -0
  518. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/hw/test_harness.py +0 -0
  519. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/spec_names.py +0 -0
  520. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_capabilities.py +0 -0
  521. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_capture.py +0 -0
  522. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_cobs.py +0 -0
  523. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_config_disable.py +0 -0
  524. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_config_idle.py +0 -0
  525. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_config_network.py +0 -0
  526. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance.py +0 -0
  527. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_allocator.py +0 -0
  528. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_analog.py +0 -0
  529. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_analog_payload.py +0 -0
  530. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_arm_adi.py +0 -0
  531. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_arm_adi_blocks.py +0 -0
  532. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_attach.py +0 -0
  533. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_blocks.py +0 -0
  534. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_capture_group.py +0 -0
  535. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_capture_group_geometry.py +0 -0
  536. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_capture_metadata.py +0 -0
  537. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_capture_serial.py +0 -0
  538. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_capture_timeline.py +0 -0
  539. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_capture_timeline_lifecycle.py +0 -0
  540. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_clock.py +0 -0
  541. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_config.py +0 -0
  542. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_config_execution.py +0 -0
  543. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_config_fallback.py +0 -0
  544. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_config_paging.py +0 -0
  545. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_config_power_loss.py +0 -0
  546. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_config_storage.py +0 -0
  547. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_core_fixed_fields.py +0 -0
  548. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_core_smoke.py +0 -0
  549. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_corr.py +0 -0
  550. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_cut.py +0 -0
  551. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_data.py +0 -0
  552. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_debug.py +0 -0
  553. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_dependencies.py +0 -0
  554. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_discovery.py +0 -0
  555. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_dmseq.py +0 -0
  556. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_dmseq_target.py +0 -0
  557. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_execution_order.py +0 -0
  558. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_exhausted.py +0 -0
  559. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_fixture_metadata.py +0 -0
  560. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_gpio.py +0 -0
  561. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_gpio_lifecycle.py +0 -0
  562. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_host_core.py +0 -0
  563. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_host_critical_calls.py +0 -0
  564. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_host_deadline.py +0 -0
  565. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_host_notifications.py +0 -0
  566. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_host_requests.py +0 -0
  567. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_host_resend.py +0 -0
  568. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_host_tlv.py +0 -0
  569. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_host_values.py +0 -0
  570. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_host_wait.py +0 -0
  571. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_i2c.py +0 -0
  572. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_interface_smoke.py +0 -0
  573. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_interfaces.py +0 -0
  574. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_lease.py +0 -0
  575. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_link_routes.py +0 -0
  576. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_link_transfers.py +0 -0
  577. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_logic.py +0 -0
  578. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_mailbox.py +0 -0
  579. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_notification_output.py +0 -0
  580. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_notification_retention.py +0 -0
  581. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_notification_sequence.py +0 -0
  582. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_oep_smoke.py +0 -0
  583. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_outcomes.py +0 -0
  584. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_pipeline.py +0 -0
  585. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_port_speed.py +0 -0
  586. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_port_speed_execution.py +0 -0
  587. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_port_speed_lifecycle.py +0 -0
  588. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_probe_input.py +0 -0
  589. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_reconnect.py +0 -0
  590. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_recovery.py +0 -0
  591. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_recovery_races.py +0 -0
  592. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_refusal_order.py +0 -0
  593. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_registered_ops.py +0 -0
  594. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_replay_pressure.py +0 -0
  595. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_replay_records_optional.py +0 -0
  596. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_reset.py +0 -0
  597. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_resources.py +0 -0
  598. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_response_race.py +0 -0
  599. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_restart.py +0 -0
  600. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_retention.py +0 -0
  601. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_retention_lifecycle.py +0 -0
  602. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_retry.py +0 -0
  603. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_routes.py +0 -0
  604. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_run.py +0 -0
  605. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_scan.py +0 -0
  606. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_scan_options.py +0 -0
  607. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_selected_metadata.py +0 -0
  608. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_serial.py +0 -0
  609. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_session_loss.py +0 -0
  610. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_session_smoke.py +0 -0
  611. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_spec_guard.py +0 -0
  612. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_spi.py +0 -0
  613. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_step.py +0 -0
  614. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_stream.py +0 -0
  615. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_subscriptions.py +0 -0
  616. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_tcp.py +0 -0
  617. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_tcp_peers.py +0 -0
  618. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_tcp_recovery.py +0 -0
  619. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_tlv_requests.py +0 -0
  620. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_uart.py +0 -0
  621. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_uart_stream.py +0 -0
  622. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_usb.py +0 -0
  623. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_wire_options.py +0 -0
  624. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_conformance_writer_lease.py +0 -0
  625. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_console_queue_and_reset_settle.py +0 -0
  626. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_debug_attach.py +0 -0
  627. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_extension_patterns.py +0 -0
  628. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_fixture_targets.py +0 -0
  629. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_flash_console.py +0 -0
  630. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_gpio_drive_and_serve_options.py +0 -0
  631. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_hardware.py +0 -0
  632. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_hid_stream.py +0 -0
  633. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_host_boot_lifecycle.py +0 -0
  634. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_host_rules_2026_10_06.py +0 -0
  635. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_host_wait_bound.py +0 -0
  636. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_interfaces.py +0 -0
  637. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_link_drop.py +0 -0
  638. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_link_host.py +0 -0
  639. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_link_serial.py +0 -0
  640. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_linktest.py +0 -0
  641. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_literals.py +0 -0
  642. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_minimal_ops.py +0 -0
  643. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_no_resume.py +0 -0
  644. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_pins.py +0 -0
  645. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_plan.py +0 -0
  646. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_port_speed.py +0 -0
  647. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_restart.py +0 -0
  648. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_resubscribe_after_reopen.py +0 -0
  649. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_review4_capture.py +0 -0
  650. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_review4_debug.py +0 -0
  651. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_review4_small.py +0 -0
  652. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_review5_capture.py +0 -0
  653. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_review5_core_a.py +0 -0
  654. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_review5_core_b.py +0 -0
  655. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_review5_debug_targets.py +0 -0
  656. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_review5_debug_wires.py +0 -0
  657. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_review5_small.py +0 -0
  658. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_review6_capture_console.py +0 -0
  659. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_review6_core_early.py +0 -0
  660. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_review6_core_late.py +0 -0
  661. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_review6_debug_a.py +0 -0
  662. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_review6_debug_b.py +0 -0
  663. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_review6_rest.py +0 -0
  664. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_review7_exact_payload.py +0 -0
  665. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_review7_host_recovery.py +0 -0
  666. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_review7_request_validation.py +0 -0
  667. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_review7_state_resources.py +0 -0
  668. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_review7_tlv_readers.py +0 -0
  669. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_review8_core_1.py +0 -0
  670. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_review8_core_2.py +0 -0
  671. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_review8_debug.py +0 -0
  672. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_session.py +0 -0
  673. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_spec_283e5b5.py +0 -0
  674. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_spec_2c6d18d.py +0 -0
  675. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_spec_3cc50c8.py +0 -0
  676. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_spec_sections.py +0 -0
  677. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_spec_vectors.py +0 -0
  678. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_target_parts.py +0 -0
  679. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_tcp_discovery.py +0 -0
  680. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_trace_capture.py +0 -0
  681. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_trace_common.py +0 -0
  682. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_trace_console.py +0 -0
  683. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_trace_core.py +0 -0
  684. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_trace_core_names.py +0 -0
  685. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_trace_fixture.py +0 -0
  686. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_trace_link.py +0 -0
  687. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_trace_plan.py +0 -0
  688. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_trace_probe_config.py +0 -0
  689. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_trace_restart.py +0 -0
  690. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_trace_transports.py +0 -0
  691. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_usb_identity.py +0 -0
  692. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_usb_stream.py +0 -0
  693. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_virtual_bench_analog_roles.py +0 -0
  694. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_virtual_bench_announce.py +0 -0
  695. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_virtual_bench_capture.py +0 -0
  696. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_virtual_bench_capture_changing_trigger.py +0 -0
  697. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_virtual_bench_capture_channel_time.py +0 -0
  698. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_virtual_bench_capture_initial_trigger_time.py +0 -0
  699. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_virtual_bench_capture_lifetime.py +0 -0
  700. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_virtual_bench_capture_notifications.py +0 -0
  701. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_virtual_bench_capture_one_shot_time.py +0 -0
  702. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_virtual_bench_capture_pretrigger.py +0 -0
  703. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_virtual_bench_capture_query.py +0 -0
  704. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_virtual_bench_capture_rates.py +0 -0
  705. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_virtual_bench_capture_requests.py +0 -0
  706. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_virtual_bench_capture_resume_calibration.py +0 -0
  707. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_virtual_bench_capture_trigger_modes.py +0 -0
  708. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_virtual_bench_capture_waiting.py +0 -0
  709. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_virtual_bench_pin_constraints.py +0 -0
  710. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_virtual_bench_rules_2026_10_02.py +0 -0
  711. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_virtual_bench_rules_2026_10_06.py +0 -0
  712. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_virtual_bench_serve_reboot.py +0 -0
  713. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_virtual_bench_serve_tcp_connections.py +0 -0
  714. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_virtual_bench_spec.py +0 -0
  715. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_virtual_bench_targets.py +0 -0
  716. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_virtual_core.py +0 -0
  717. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/test_virtual_core_bool.py +0 -0
  718. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/vectors/checks.json +0 -0
  719. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/vectors/cobs.json +0 -0
  720. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/vectors/confirm.json +0 -0
  721. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/vectors/core_extensions.json +0 -0
  722. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/vectors/core_lifecycle.json +0 -0
  723. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/vectors/core_policy.json +0 -0
  724. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/vectors/discovery.json +0 -0
  725. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/vectors/headers.json +0 -0
  726. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/vectors/interface_boundaries.json +0 -0
  727. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/vectors/interface_profiles.json +0 -0
  728. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/vectors/logic_layout.json +0 -0
  729. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/vectors/ops_encoding.json +0 -0
  730. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/vectors/refusals.json +0 -0
  731. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/tests/vectors/sessions.json +0 -0
  732. {oep_client_python-0.0.32 → oep_client_python-0.0.34}/udev/70-oep-probe.rules +0 -0
@@ -2,6 +2,21 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.0.34
6
+ - (JA) oep-spec bc52327(debug §2 の閉じた後の保持、§2.2 holds、probe.config の wire-hold、core §8 の例外)に追従。仮想ベンチは、線切れ以外で
7
+ 接続を閉じたらその口の休みの状態を保持し、ピンを取られる、wire-hold が off、idle / disable の項目、で保持を終える。駆動が止まると halt を失う
8
+ target(`VirtualTarget.needs_drive`、CH32L103)を表せる。クライアントは `WireBase.holds()`、`config.WireHold`、`oep config wire-hold PROBE CH on|off`。
9
+
10
+ ## 0.0.33
11
+ - (JA) oep-spec ba4e8ee(debug §3.1、core §12 規則 8、probe.config の rvswd-rest)に追従。rvswd の線の休ませ方は、attach の idle_clock が無ければ
12
+ probe が決める(その SWCLK の channel の設定 rvswd-rest、無ければ target_id の系統: CH32L103 は low)。仮想ベンチはそのとおりに休ませ、attach の応答と
13
+ connections に使う休ませ方を返す。クライアントは `Wire.idle_clock`、`ConnectionInfo.idle_clock` で読み、`config.RvswdRest` と
14
+ `oep config rvswd-rest PROBE CH auto|high|low` で口ごとに自動を止められる。
15
+ - (JA) oep-spec 91209aa の線の名前(swdio / swclk / swio / rx / tx)を registry から引く(`config.LINE_NAMES`)。console-passthrough は 13 byte のまま
16
+ (91209aa の idle_clock の欄は oep-spec edbe841 で取り下げ)。
17
+ - (JA) tests/hw: `OEP_HW_IDLE_CLOCK=low|high` で rvswd の attach に休ませ方を明示できる。無ければ probe の判定に任せ、結果に使った休ませ方を記録する。
18
+ - (JA) CI: equipment の段が走ったときだけ証跡を upload する(テストの段が落ちると .pytest-results/ が空で警告が出ていた)。
19
+
5
20
  ## 0.0.32
6
21
  - (JA) 仮想ベンチに `--minimal-ops`(`virtual_bench.minimal_ops`)を足す。console と fixture UART の任意の op(marks、clear、mark、write)を
7
22
  ops から外し、unknown_operation で答える。host が任意の op を describe の ops を見ずに使っていないかを、実機なしで試せる
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: oep-client-python
3
- Version: 0.0.32
3
+ Version: 0.0.34
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
@@ -595,3 +595,42 @@ B にした。core §12 の規則 7 を「他者は名前で識別する所か
595
595
 
596
596
  **仕様への提案の候補(まだ出していない)**: 共有ベクタのうち「仕様書の例の probe」に固有の値(fn 19 の CPU 捕捉の 16 ms、analog の skew や scale の値)を前提にするものは、
597
597
  実装の harness が名前で見分けて飛ばしている。ベクタに「例の probe の構成」を示す欄があれば、各実装が機械的に扱える。小さいので、ch32rv の追従の後にまとめて判断する。
598
+
599
+ ## 実機の入れ替え(2026-10-16、リリース 0.0.32)
600
+
601
+ 既存の OEP プローブ 6 台(RP2040 `53032847491a571c`、Pico 2 `9489dd2ae0953650`、P4 `30eda0ea068b` / `30eda0e34a0e`、
602
+ P4X `e8f60ae84e28`、classic ESP32 `0070070d9394`)を Arduino 0.0.32 のリリース版に入れ替え、設定を新しい形(ラベル `S.N`、素通し、wifi)で入れ直した。
603
+
604
+ | # | 見つけたこと | 判断 |
605
+ |---|---|---|
606
+ | H1 | capture の start の応答に、Arduino が仕様に無い blocking_ms(u32) を generation の前に残していた(logic、analog)。仕様の形で読む host は generation を TLV と読んで落ちる。共有ベクタは start の応答を見ていなかった | Arduino を直した(ffd6a14、未リリース。実機は 0.0.32 のまま)。**ベクタへの提案の候補**: capture / analog の start の応答の形 |
607
+ | H2 | CH32L103(Pico 2 の rvswd)は、線を休ませる間に SWCLK が high だと debug module がリセットされる(DMCONTROL 0、hart が走る。リセット要因は増えない)。idle_clock low の attach なら halt が保たれる。旧設定の slot は idle_clock low を持っていた | tests/hw に OEP_HW_IDLE_CLOCK を足した。**仕様への提案の候補**: probe.config の console-passthrough(§1.2)に idle_clock が無く、L103 のような target では素通しを使えない(attach と同じ値を持たせる)。ベンチでは L103 の素通しを外した |
608
+
609
+ ### 決定: rvswd の線の休ませ方(2026-10-16、所有者が決定。oep-spec 3b32b12 / ba4e8ee)
610
+
611
+ 仕様にはまだ入れていない(oep-spec edbe841 で 1ad434f と 91209aa の欄を取り下げ、判断基準を probe ガイド §12 に書いた e25a654)。実装の試作は
612
+ oep-client-python の `wip/rvswd-rest` ブランチ。
613
+
614
+ - 事実: CH32L103 は high で休ませると約 1 ms で debug module がリセットされる。CH32X035 は low で休ませると attach できない。attach は 2 本とも high
615
+ から始まるので、どの系統でも target_id(DMI 0x7F)までは読める。ch32rv は今、L103 を見たら low で attach し直す回避を持っている(B になれば外す)。
616
+ - 方向(所有者の意見): 自動の決定は足してよい。初期設定はブラウザから行う予定で、時間の猶予が無い操作は host から間に合わない。
617
+ ただし自動を OFF にする手段もあった方がよい。
618
+ - 案:
619
+ 1. attach に idle_clock の TLV が無ければ、probe は target_id の系統(bit 31〜20)から決める。系統の表は registry(名前で引くデータ)。
620
+ 2. 使った休ませ方は attach の応答と connections に必ず出す。
621
+ 3. OFF は probe.config の項目 `rvswd-rest`(値: auto / high / low。項目が無ければ auto)。**口ごとに決める**: 1 台に X035 の口と L103 の口が
622
+ 並ぶことがあるので、key は wire の fn ではなく、その口の SWCLK の channel(label / idle と同じ「channel が key」。attach は swclk を固定部で
623
+ 名指すので probe はその channel の項目を引く。ユーザーと ch32rv の指摘)。host の居ない場面(素通し、ブラウザで設定した probe)にも効き、
624
+ console-passthrough に idle_clock の欄は要らない。
625
+ 4. 優先: attach の TLV > 設定の `rvswd-rest`(high / low)> 自動(auto)。
626
+ 5. 1 つの接続の休ませ方は 1 つ。変えるには detach が要る(違う TLV の attach は、生きた接続のピンなので cause 1 で断られる。ch32rv の
627
+ ブローカーは応答の休ませ方と合えば貸し、違えば断る)。
628
+ 6. 系統の事実の正本は ch32-device-data の family 属性。registry の表はそこから作るか CI で突き合わせ、2 つの正本にしない。
629
+ DMI 0x7F の bit 31〜20 で系統を引けるかは、古い系統(V103 など)の id の形で確かめる(ch32rv の DB には例外の形がある)。
630
+ - 残る論点: core §12 規則 8(チップ固有の処理を汎用のインターフェースに入れない)との関係。rvswd は対象の系統が限られる線なので、
631
+ その線の定義の中に置いてよいか。
632
+
633
+ 決定(所有者): 基本は host が判定し、タイミング系などは probe の自動判定を足せる。自動判定は設定で OFF にでき、判定したことが分かるようにする
634
+ (core §12 規則 8)。仕様は上の案のとおり(key は SWCLK の channel)。Python ebcf306 以降、Arduino 77a8002。
635
+ 実機(77a8002): idle_clock 無しの attach で Pico 2 + L103 は low(halt を 3 秒保つ)、P4 + X035 は high。`rvswd-rest=high` で L103 は high になり halt が
636
+ 0.1 s で外れる(OFF が効く)。
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "oep-client-python"
7
- version = "0.0.32"
7
+ version = "0.0.34"
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.32"
5
+ __version__ = "0.0.34"
@@ -353,6 +353,18 @@ def _config_parser(sub) -> None:
353
353
  idle.add_argument("channel", type=int)
354
354
  idle.add_argument("mode", choices=sorted(config.IDLE))
355
355
  idle.add_argument("--save", action="store_true")
356
+ rest = cs.add_parser("rvswd-rest", help="how rvswd rests a port's SWCLK: auto (the probe decides from the target_id), "
357
+ "or high / low fixed (the automatic choice off; debug §3.1)")
358
+ rest.add_argument("probe")
359
+ rest.add_argument("channel", type=int, help="the port's SWCLK channel")
360
+ rest.add_argument("mode", choices=sorted(config.REST_MODE))
361
+ rest.add_argument("--save", action="store_true")
362
+ hold = cs.add_parser("wire-hold", help="whether a debug wire's lines stay held at their rest after a close "
363
+ "(on, the default) or go free at once (off; debug §2)")
364
+ hold.add_argument("probe")
365
+ hold.add_argument("channel", type=int, help="the port's SWDIO channel")
366
+ hold.add_argument("mode", choices=sorted(config.HOLD_MODE))
367
+ hold.add_argument("--save", action="store_true")
356
368
  dis = cs.add_parser("disable", help="channels the probe never drives or sets up (not on this board)")
357
369
  dis.add_argument("probe")
358
370
  dis.add_argument("channels", type=int, nargs="+")
@@ -435,6 +447,10 @@ def _config(args) -> int:
435
447
  _change(hst, cfg, [config.Label(channel=args.channel, text=args.text)], args.save)
436
448
  elif args.action == "idle":
437
449
  _change(hst, cfg, [config.Idle(channel=args.channel, mode=args.mode)], args.save)
450
+ elif args.action == "wire-hold":
451
+ _change(hst, cfg, [config.WireHold(channel=args.channel, mode=args.mode)], args.save)
452
+ elif args.action == "rvswd-rest":
453
+ _change(hst, cfg, [config.RvswdRest(channel=args.channel, mode=args.mode)], args.save)
438
454
  elif args.action == "disable":
439
455
  _change(hst, cfg, [config.Disable(channel=ch) for ch in args.channels], args.save)
440
456
  elif args.action == "remove":
@@ -36,6 +36,8 @@ NAMES = tuple(_CFG.names["setting"]) # the standard i
36
36
  ITEM = {k.replace("-", "_"): i + 1 for i, k in enumerate(NAMES)}
37
37
  DESCRIBE = _CFG.tlv["describe"]
38
38
  IDLE = {k.replace("_", "-"): v for k, v in _CFG.enum["idle_mode"].items()}
39
+ REST_MODE = dict(_CFG.enum["rvswd_rest_mode"]) # rvswd-rest: auto / high / low (debug §3.1)
40
+ HOLD_MODE = dict(_CFG.enum["wire_hold_mode"]) # wire-hold: off / on (debug §2)
39
41
  STORAGE_STATE = {v: k for k, v in _CFG.enum["storage_state"].items()}
40
42
  UNREADABLE = {v: k for k, v in _CFG.enum["storage_unreadable"].items()}
41
43
  FORM = _CFG.enum["setting_form"]
@@ -140,6 +142,47 @@ class Passthrough:
140
142
  return struct.pack("<HHIB", self.fn, self.rx, self.baud, self.format)
141
143
 
142
144
 
145
+ @dataclass
146
+ class RvswdRest:
147
+ """How an rvswd attach without idle_clock rests the SWCLK on `channel` (the port's SWCLK; debug §3.1): auto - the
148
+ probe's choice from the target_id it reads (also with no item) - or high / low fixed, the automatic choice off for
149
+ that port. An attach's idle_clock TLV still decides."""
150
+ channel: int
151
+ mode: str = "auto"
152
+ NAME = "rvswd-rest"
153
+
154
+ def key(self) -> int:
155
+ return self.channel
156
+
157
+ def value(self) -> bytes:
158
+ return struct.pack("<H", self.key()) + self.data()
159
+
160
+ def data(self) -> bytes:
161
+ if self.mode not in REST_MODE:
162
+ raise ValueError(f"rvswd-rest mode {self.mode!r}: one of {', '.join(REST_MODE)}")
163
+ return bytes([REST_MODE[self.mode]])
164
+
165
+
166
+ @dataclass
167
+ class WireHold:
168
+ """Whether a debug wire's lines on the port whose SWDIO is `channel` stay held at their rest after its connection
169
+ closes (debug §2): on - also with no item - or off (back to the free state at once)."""
170
+ channel: int
171
+ mode: str = "on"
172
+ NAME = "wire-hold"
173
+
174
+ def key(self) -> int:
175
+ return self.channel
176
+
177
+ def value(self) -> bytes:
178
+ return struct.pack("<H", self.key()) + self.data()
179
+
180
+ def data(self) -> bytes:
181
+ if self.mode not in HOLD_MODE:
182
+ raise ValueError(f"wire-hold mode {self.mode!r}: one of {', '.join(HOLD_MODE)}")
183
+ return bytes([HOLD_MODE[self.mode]])
184
+
185
+
143
186
  @dataclass(kw_only=True)
144
187
  class ConsolePassthrough:
145
188
  """Serial port `port` carries the target's debug console - read by the probe itself over `wire_fn` on (swdio, swclk)
@@ -293,6 +336,10 @@ def decode(name: str, key: int, d: bytes, setting: Setting | None = None, netifs
293
336
  try:
294
337
  if name == "label":
295
338
  return Label(channel=key, text=d.decode("utf-8", "replace"))
339
+ if name == "wire-hold" and len(d) == 1 and d[0] in HOLD_MODE.values():
340
+ return WireHold(channel=key, mode={v: k for k, v in HOLD_MODE.items()}[d[0]])
341
+ if name == "rvswd-rest" and len(d) == 1 and d[0] in REST_MODE.values():
342
+ return RvswdRest(channel=key, mode={v: k for k, v in REST_MODE.items()}[d[0]])
296
343
  if name == "idle" and len(d) == 1:
297
344
  return Idle(channel=key, mode=_name(IDLE, d[0]))
298
345
  if name == "disable" and not d:
@@ -117,7 +117,9 @@ RESET_MODE = _RV.enum["reset_mode"]
117
117
  READ_FROM = reg.COMMON.enum["read_from"] # position, oldest, now, last_mark (common §1.2)
118
118
  STEP_LEFT = _RV.tlv["step_answer"]["step_left"] # step's answer: the hart could not be halted again (§4.2)
119
119
  ITEM = {k.replace("-", "_"): k for k in cfgmod.NAMES} # the standard items by name (probe.config §1, core §7.7)
120
- CHANNEL_ITEMS = (ITEM["label"], ITEM["idle"], ITEM["disable"]) # items keyed by a channel (probe.config §1)
120
+ CHANNEL_ITEMS = (ITEM["label"], ITEM["idle"], ITEM["disable"], ITEM["rvswd_rest"], ITEM["wire_hold"]) # keyed by a channel
121
+ HOLD_MODE = cfgmod.HOLD_MODE
122
+ REST_MODE = cfgmod.REST_MODE
121
123
  IDLE_MODE = _CFG.enum["idle_mode"]
122
124
  CFG_DESCRIBE = cfgmod.DESCRIBE
123
125
  SETTING_FORM = _CFG.enum["setting_form"]
@@ -137,7 +139,18 @@ I2C_FEATURES, SPI_FEATURES = _I2C.enum["features"], _SPI.enum["features"]
137
139
  TARGET_ROLES = {"oep.fixture.gpio": {1}, "oep.fixture.uart": {1, 2}, _I2C.name: set(_I2C.enum["role"].values()),
138
140
  _SPI.name: set(_SPI.enum["role"].values())} # the plan roles each fixture takes
139
141
  UART_FORMAT_MASK = 0x1F # the defined format bits (fixture §2)
140
- _T_SCAN, _T_ATTACH, _T_ATTACH_ANSWER = (reg.WIRE_RVSWD.tlv[k] for k in ("scan", "attach", "attach_answer"))
142
+ _T_SCAN, _T_ATTACH, _T_ATTACH_ANSWER, _T_CONNECTIONS_ANSWER = (
143
+ reg.WIRE_RVSWD.tlv[k] for k in ("scan", "attach", "attach_answer", "connections_answer"))
144
+ _IDLE_CLOCK = reg.WIRE_RVSWD.enum["idle_clock"]
145
+
146
+
147
+ def rvswd_rest(target_id: int | None) -> int:
148
+ """The rest an rvswd attach without idle_clock uses (debug §3.1): low for a family in the registry's
149
+ idle_low_family (target_id >> target_id_family.shift), high otherwise and when no target_id was read."""
150
+ if target_id is None:
151
+ return _IDLE_CLOCK["high"]
152
+ family = target_id >> reg.WIRE_RVSWD.enum["target_id_family"]["shift"]
153
+ return _IDLE_CLOCK["low"] if family in reg.WIRE_RVSWD.enum["idle_low_family"].values() else _IDLE_CLOCK["high"]
141
154
  _WIRE_INDEX = reg.WIRE_RVSWD.tlv["unsupported_payload"]["index"] # scan's candidate index (debug §1)
142
155
  ATTACH_METHOD = reg.WIRE_RVSWD.enum["attach_method"]
143
156
  GPIO_MODE_MAX = max(_GPIO.enum["mode"].values()) # 6: the modes revision 1 defines are 0-6 (fixture §1)
@@ -315,6 +328,7 @@ class VirtualTarget:
315
328
  havereset: bool = True
316
329
  resume_misses: int = 0 # resumes that do not take (status state, dpc unchanged)
317
330
  present: bool = True # something answers on this pin pair (scan, attach)
331
+ needs_drive: bool = False # loses its halt once the probe stops driving the line (a CH32L103)
318
332
  target_id: int | None = None # the dmi_7f target_id attach reports (None: none)
319
333
  # run(pc, regs) -> (stopped, dpc, elapsed_us); default: halts 0x10 past the start
320
334
  run_hook: Callable | None = None
@@ -542,7 +556,7 @@ class Connection:
542
556
 
543
557
 
544
558
  ITEM_SIZES = {ITEM["idle"]: 1, ITEM["disable"]: 0, ITEM["passthrough"]: 9, # the data of a fixed length (probe.config §1)
545
- ITEM["console_passthrough"]: 13, ITEM["ipv4"]: 14}
559
+ ITEM["console_passthrough"]: 13, ITEM["ipv4"]: 14, ITEM["rvswd_rest"]: 1, ITEM["wire_hold"]: 1}
546
560
  PASSTHROUGHS = (ITEM["passthrough"], ITEM["console_passthrough"])
547
561
 
548
562
 
@@ -772,6 +786,7 @@ class Endpoint:
772
786
  self.session_ports: set[int] = set() # the transports the lock holder's requests came on (probe.config §1.1)
773
787
  self.passthrough_out: dict[int, bytearray] = {} # a serial port's pass-through bytes not sent yet
774
788
  self.resident: dict[int, bool] = {} # console_passthrough's own connection per port: attached (config §1.2)
789
+ self.holds: dict[tuple[int, tuple[int, int]], int] = {} # (wire fn, pair) -> rest: lines held after a close (debug §2)
775
790
  self.last: int | None = None # S: the id that holds or last held the lock (the resend table's, §5.2)
776
791
  self.owner: bytes | None = None # the holder's owner, while the lock is held (core §6.4)
777
792
  self.lease_ms = self.lease_default_ms
@@ -1549,7 +1564,7 @@ class Endpoint:
1549
1564
  connections closed (an unknown `cid`: none)."""
1550
1565
  gone = [c for c in (list(self.conns) if cid is None else [cid]) if c in self.conns]
1551
1566
  for c in gone:
1552
- self._close_conn(c)
1567
+ self._close_conn(c, lost=True)
1553
1568
  return gone
1554
1569
 
1555
1570
  # ---- core -----------------------------------------------------------------------------------
@@ -2293,8 +2308,11 @@ class Endpoint:
2293
2308
  if tg.havereset:
2294
2309
  tg.havereset, flags = False, flags | ATTACH_FLAGS["havereset_acked"]
2295
2310
  c = self.conns[cid]
2296
- if idle_clock is not None:
2297
- c.idle_clock = idle_clock
2311
+ if rvswd: # the host's TLV, the setting, else from target_id (§3.1)
2312
+ setting = self.config.get((ITEM["rvswd_rest"], pair[1]), bytes([REST_MODE["auto"]]))[0]
2313
+ c.idle_clock = (idle_clock if idle_clock is not None
2314
+ else _IDLE_CLOCK["high"] if setting == REST_MODE["high"]
2315
+ else _IDLE_CLOCK["low"] if setting == REST_MODE["low"] else rvswd_rest(c.tid))
2298
2316
  if reset is not None and tg.reset_line not in (None, channel):
2299
2317
  if method == 1: # a line that resets nothing: halted where it ran
2300
2318
  tg.halted, tg.dpc = True, tg.reset_vector + 0x2f8
@@ -2308,6 +2326,8 @@ class Endpoint:
2308
2326
  if tg.halted and method == 1: # bit3: the probe saw hart 0 halted (§3)
2309
2327
  flags |= ATTACH_FLAGS["halted"]
2310
2328
  tail += m.tlv(_T_ATTACH_ANSWER["dpc"], struct.pack("<I", tg.dpc))
2329
+ if rvswd: # the rest in use, always (§3.1)
2330
+ tail += m.tlv(_T_ATTACH_ANSWER["idle_clock"], bytes([c.idle_clock]))
2311
2331
  return self._answer(struct.pack("<IIBI", cid, tg.dmstatus(), flags, c.speed) + tail)
2312
2332
  if op == O["detach"]:
2313
2333
  cid = t.take("I")
@@ -2317,28 +2337,40 @@ class Endpoint:
2317
2337
  raise wrong_kind() # another wire's connection
2318
2338
  self._close_conn(cid)
2319
2339
  return m.COMPLETED, m.SUCCESS, b""
2340
+ if op == O["holds"]: # lock-free, paged by first (debug §2.2)
2341
+ first = t.take("B")
2342
+ t.tail()
2343
+ rows = [struct.pack("<HHB", *pair, rest) for pair, rest in self.held_ports(fn)]
2344
+ return m.COMPLETED, m.SUCCESS, self._paged(rows, first)
2320
2345
  if op == O["connections"]: # lock-free, paged by first (debug §2.1)
2321
2346
  first = t.take("B")
2322
2347
  t.tail()
2323
2348
  mine = sorted((c.order, cid) for cid, c in self.conns.items() if c.fn == fn)
2324
- rows = []
2349
+ rows, rests = [], []
2325
2350
  for _, cid in mine:
2326
2351
  c = self.conns[cid]
2327
2352
  tid = b"" if c.tid is None else struct.pack("<I", c.tid)
2328
2353
  scheme = TARGET_ID_SCHEME["dmi_7f"] if tid else 0
2329
2354
  rows.append(struct.pack("<IHHIBB", cid, *c.pair, c.speed, scheme, len(tid)) + tid)
2330
- return m.COMPLETED, m.SUCCESS, self._paged(rows, first)
2355
+ rests.append(c.idle_clock)
2356
+ # rvswd: TLV idle_clock (entry_index, rest) for every entry of the page (§2.1, §3.1)
2357
+ return m.COMPLETED, m.SUCCESS, self._paged(rows, first, rests if rvswd else None)
2331
2358
  return m.REJECTED, m.UNKNOWN_OPERATION, b""
2332
2359
 
2333
- def _paged(self, rows: list[bytes], first: int) -> bytes:
2334
- """more(u8) count(u8) the rows from `first` that fit the frame (connections, streams: core §2.3's lists)."""
2360
+ def _paged(self, rows: list[bytes], first: int, rests: list[int] | None = None) -> bytes:
2361
+ """more(u8) count(u8) the rows from `first` that fit the frame (connections, streams: core §2.3's lists);
2362
+ with `rests` (rvswd's connections), each row's TLV idle_clock (entry_index, rest) after them, counted in."""
2335
2363
  budget = self.probe.max_frame - m.RESULT_HEADER - 2
2336
2364
  out: list[bytes] = []
2337
- for row in rows[first:]:
2338
- if out and sum(map(len, out)) + len(row) > budget:
2365
+ tail: list[bytes] = []
2366
+ for i, row in enumerate(rows[first:]):
2367
+ extra = b"" if rests is None else m.tlv(_T_CONNECTIONS_ANSWER["idle_clock"], bytes([len(out), rests[first + i]]))
2368
+ if out and sum(map(len, out + tail)) + len(row) + len(extra) > budget:
2339
2369
  break
2340
2370
  out.append(row)
2341
- return bytes([int(first + len(out) < len(rows)), len(out)]) + b"".join(out)
2371
+ if extra:
2372
+ tail.append(extra)
2373
+ return bytes([int(first + len(out) < len(rows)), len(out)]) + b"".join(out) + b"".join(tail)
2342
2374
 
2343
2375
  def _attach_methods(self, fn: int) -> set[int]:
2344
2376
  """method 0, and 1 when the wire declares features bit0 attach_halt (debug §3)."""
@@ -2385,14 +2417,45 @@ class Endpoint:
2385
2417
  self.conns[cid] = Connection(fn, pair, self._order, speed, tid)
2386
2418
  return cid
2387
2419
 
2388
- def _close_conn(self, cid: int) -> None:
2389
- """The connection goes, its console streams first (common §2); its pins go back to their idle state."""
2420
+ def _close_conn(self, cid: int, lost: bool = False) -> None:
2421
+ """The connection goes, its console streams first (common §2). Its lines stay held at its rest unless the line
2422
+ was lost, the port's wire-hold is off or a pin has an idle / disable item (debug §2); else to their idle state,
2423
+ and a target that needs the drive loses its halt."""
2390
2424
  for sid in [k for k, st in self.streams.items() if st.conn == cid]:
2391
2425
  self._close_stream(sid)
2392
2426
  gone = self.conns.pop(cid, None)
2393
2427
  self.resources.pop(cid, None)
2394
- if gone is not None:
2395
- self._park(gone.pair)
2428
+ if gone is None:
2429
+ return
2430
+ if not lost and self._may_hold(gone.pair):
2431
+ self.holds[(gone.fn, gone.pair)] = gone.idle_clock if self.names[gone.fn] == "oep.wire.rvswd" else 0
2432
+ return
2433
+ self._park(gone.pair)
2434
+ tg = self.targets.get((gone.fn, gone.pair))
2435
+ if tg is not None and tg.needs_drive:
2436
+ tg.halted = False # its debug module dropped the link: the hart runs
2437
+
2438
+ def _may_hold(self, pair: tuple[int, int]) -> bool:
2439
+ """debug §2: wire-hold on (no item: on) for the port's SWDIO, and no idle / disable item on its pins."""
2440
+ mode = self.config.get((ITEM["wire_hold"], pair[0]), bytes([HOLD_MODE["on"]]))[0]
2441
+ pins = [p for p in pair if p != 0xFFFF]
2442
+ return (mode == HOLD_MODE["on"] and not any((ITEM["idle"], p) in self.config for p in pins)
2443
+ and not any(p in self.disabled for p in pins))
2444
+
2445
+ def held_ports(self, fn: int) -> list[tuple[tuple[int, int], int]]:
2446
+ """The ports wire `fn` holds now (debug §2.2): a hold ends once its pins are taken (a plan, a connection), its
2447
+ wire-hold goes off or an idle / disable item lands on them; an ended hold's pins go to their free state."""
2448
+ busy = {a[2] for a in self.plan if not self._listens(a[0])} | {p for c in self.conns.values() for p in c.pair}
2449
+ for key in list(self.holds):
2450
+ hfn, pair = key
2451
+ if any(p in busy for p in pair if p != 0xFFFF) or not self._may_hold(pair):
2452
+ del self.holds[key]
2453
+ if not any(p in busy for p in pair if p != 0xFFFF):
2454
+ self._park(pair)
2455
+ tg = self.targets.get(key)
2456
+ if tg is not None and tg.needs_drive:
2457
+ tg.halted = False
2458
+ return [(pair, rest) for (hfn, pair), rest in self.holds.items() if hfn == fn]
2396
2459
 
2397
2460
  def _cleanup_failed(self, cid: int, done: int, payload: bytes) -> tuple[int, int, bytes]:
2398
2461
  """A block op whose restore of DATA0 / DATA1 failed: partial when done > 0 (all words included), else failed,
@@ -3275,6 +3338,10 @@ class Endpoint:
3275
3338
  return True
3276
3339
  if mode in (IDLE_MODE["pull_up"], IDLE_MODE["pull_down"]) and mode in self.no_pull.get(key, ()):
3277
3340
  return True
3341
+ if name == ITEM["rvswd_rest"] and d[0] not in REST_MODE.values():
3342
+ return True # a mode the definition leaves unused (§1)
3343
+ if name == ITEM["wire_hold"] and d[0] not in HOLD_MODE.values():
3344
+ return True
3278
3345
  return False
3279
3346
 
3280
3347
  def _shown(self, name: str, d: bytes) -> bytes:
@@ -3,7 +3,7 @@
3
3
 
4
4
  from types import SimpleNamespace as _NS
5
5
 
6
- REGISTRY_HASH = "0aaae1a1afbb5b02"
6
+ REGISTRY_HASH = "32b9f952338089a5"
7
7
  SCHEMA = 1
8
8
  PROTOCOL_REVISION = 1
9
9
  CONFIRM_REQUEST_MAGIC = 'OEP?'
@@ -41,15 +41,15 @@ PROBE_LINK = _NS(name="oep.probe.link", revision=1, target=None, op={"source": 0
41
41
  tlv={}, event={}, enum={"port_speed_step": {"try": 0x00, "commit": 0x01, "revert": 0x02}, "port_state": {"boot": 0x00, "trying": 0x01, "committed": 0x02, "recovery_pending": 0x03}}, own={},
42
42
  line_names={}, names={})
43
43
  INTERFACES["oep.probe.link"] = PROBE_LINK
44
- WIRE_RVSWD = _NS(name="oep.wire.rvswd", revision=1, target="RISC-V targets whose debug module is reached over the two-wire RVSWD line", op={"scan": 0x10, "attach": 0x11, "detach": 0x12, "connections": 0x13}, lock_free={0x13},
45
- tlv={"describe": {"max_connections": 0x40}, "scan": {"max_speed": 0x01, "idle_clock": 0x03}, "attach": {"idle_clock": 0x03, "reset": 0x04}, "attach_answer": {"target_id": 0x01, "dpc": 0x02}, "unavailable_payload": {"index": 0x40}, "unsupported_payload": {"index": 0x40}}, event={}, enum={"scan_kind": {"riscv_dm": 0x01}, "attach_flags": {"havereset_acked": 0x01, "halted": 0x08}, "features": {"attach_halt": 0x01}, "attach_method": {"run": 0x00, "halt": 0x01}, "pin_role": {"swdio": 0x01, "swclk": 0x02, "reset": 0x03}, "idle_clock": {"high": 0x00, "low": 0x01}}, own={},
44
+ WIRE_RVSWD = _NS(name="oep.wire.rvswd", revision=1, target="RISC-V targets whose debug module is reached over the two-wire RVSWD line", op={"scan": 0x10, "attach": 0x11, "detach": 0x12, "connections": 0x13, "holds": 0x14}, lock_free={0x13, 0x14},
45
+ tlv={"describe": {"max_connections": 0x40}, "scan": {"max_speed": 0x01, "idle_clock": 0x03}, "attach": {"idle_clock": 0x03, "reset": 0x04}, "attach_answer": {"target_id": 0x01, "dpc": 0x02, "idle_clock": 0x03}, "connections_answer": {"idle_clock": 0x02}, "unavailable_payload": {"index": 0x40}, "unsupported_payload": {"index": 0x40}}, event={}, enum={"scan_kind": {"riscv_dm": 0x01}, "attach_flags": {"havereset_acked": 0x01, "halted": 0x08}, "features": {"attach_halt": 0x01}, "attach_method": {"run": 0x00, "halt": 0x01}, "pin_role": {"swdio": 0x01, "swclk": 0x02, "reset": 0x03}, "idle_clock": {"high": 0x00, "low": 0x01}, "target_id_family": {"shift": 0x14}, "idle_low_family": {"ch32l103": 0x103}}, own={},
46
46
  line_names={}, names={})
47
47
  INTERFACES["oep.wire.rvswd"] = WIRE_RVSWD
48
- WIRE_SWIO = _NS(name="oep.wire.swio", revision=1, target="RISC-V targets whose debug module is reached over the one-wire SWIO line", op={"scan": 0x10, "attach": 0x11, "detach": 0x12, "connections": 0x13}, lock_free={0x13},
48
+ WIRE_SWIO = _NS(name="oep.wire.swio", revision=1, target="RISC-V targets whose debug module is reached over the one-wire SWIO line", op={"scan": 0x10, "attach": 0x11, "detach": 0x12, "connections": 0x13, "holds": 0x14}, lock_free={0x13, 0x14},
49
49
  tlv={"describe": {"max_connections": 0x40}, "scan": {"max_speed": 0x01}, "attach": {"reset": 0x04}, "attach_answer": {"target_id": 0x01, "dpc": 0x02}, "unavailable_payload": {"index": 0x40}, "unsupported_payload": {"index": 0x40}}, event={}, enum={"scan_kind": {"riscv_dm": 0x01}, "attach_flags": {"havereset_acked": 0x01, "halted": 0x08}, "features": {"attach_halt": 0x01}, "attach_method": {"run": 0x00, "halt": 0x01}, "pin_role": {"swdio": 0x01, "reset": 0x03}}, own={},
50
50
  line_names={}, names={})
51
51
  INTERFACES["oep.wire.swio"] = WIRE_SWIO
52
- WIRE_SWD = _NS(name="oep.wire.swd", revision=1, target="ARM targets with an SWD debug port", op={"scan": 0x10, "attach": 0x11, "detach": 0x12, "connections": 0x13}, lock_free={0x13},
52
+ WIRE_SWD = _NS(name="oep.wire.swd", revision=1, target="ARM targets with an SWD debug port", op={"scan": 0x10, "attach": 0x11, "detach": 0x12, "connections": 0x13, "holds": 0x14}, lock_free={0x13, 0x14},
53
53
  tlv={"describe": {"max_connections": 0x40}, "scan": {"max_speed": 0x01, "targetsel": 0x02}, "attach": {"targetsel": 0x02, "reset": 0x04}, "attach_answer": {"target_id": 0x01}, "connections_answer": {"selected_target": 0x01}, "unavailable_payload": {"index": 0x40}, "unsupported_payload": {"index": 0x40}}, event={}, enum={"scan_kind": {"arm_adi": 0x02}, "attach_flags": {"dormant_woken": 0x04}, "features": {}, "attach_method": {"run": 0x00}, "pin_role": {"swdio": 0x01, "swclk": 0x02, "reset": 0x03}}, own={},
54
54
  line_names={}, names={})
55
55
  INTERFACES["oep.wire.swd"] = WIRE_SWD
@@ -94,6 +94,6 @@ FIXTURE_CAPTURE_GROUP = _NS(name="oep.fixture.capture-group", revision=1, target
94
94
  line_names={}, names={})
95
95
  INTERFACES["oep.fixture.capture-group"] = FIXTURE_CAPTURE_GROUP
96
96
  PROBE_CONFIG = _NS(name="oep.probe.config", revision=1, target=None, op={"get": 0x10, "set": 0x11, "save": 0x12, "erase": 0x13, "unset": 0x14, "state": 0x15, "network": 0x16}, lock_free={0x10, 0x15, 0x16},
97
- tlv={"describe": {"storage": 0x40, "setting": 0x41, "netif": 0x42}}, event={}, enum={"idle_mode": {"hi_z": 0x00, "pull_up": 0x01, "pull_down": 0x02, "output_low": 0x03, "output_high": 0x04}, "ipv4_mode": {"dhcp": 0x00, "static": 0x01}, "network_state": {"off": 0x00, "connecting": 0x01, "up": 0x02, "waiting": 0x03}, "network_reason": {"none": 0x00, "not_found": 0x01, "auth": 0x02, "no_address": 0x03, "other": 0x04}, "setting_form": {"named": 0x00, "bytes": 0x01, "text": 0x02, "u32": 0x03, "ipv4": 0x04, "bool": 0x05}, "setting_flag": {"secret": 0x01, "restart": 0x02}, "storage_state": {"none": 0x00, "applied": 0x01, "unreadable": 0x02, "partial": 0x03}, "storage_unreadable": {"none": 0x00, "form": 0x01, "item": 0x02, "capacity": 0x03}}, own={},
98
- line_names={'nrst': 'the target reset line (Host only)', 'power_hi': 'target power on when high (Host only)', 'power_lo': 'target power on when low (Host only)'}, names={'setting': {'label': 'key channel; text 1-32 bytes', 'idle': 'key channel; mode(u8)', 'disable': 'key channel; no data', 'passthrough': 'key port; fn(u16) rx(u16) baud(u32) format(u8)', 'console-passthrough': 'key port; wire_fn(u16) swdio(u16) swclk(u16) max_speed(u32) console_fn(u16) mechanism(u8)', 'wifi': 'key entry; ssid_len(u8) ssid pass_len(u8) passphrase; passphrase write-only', 'ipv4': 'key netif; mode(u8) address(4) prefix(u8) gateway(4) dns(4)'}, 'netif': {'wifi': 'Wi-Fi station', 'ethernet': 'wired Ethernet'}})
97
+ tlv={"describe": {"storage": 0x40, "setting": 0x41, "netif": 0x42}}, event={}, enum={"idle_mode": {"hi_z": 0x00, "pull_up": 0x01, "pull_down": 0x02, "output_low": 0x03, "output_high": 0x04}, "rvswd_rest_mode": {"auto": 0x00, "high": 0x01, "low": 0x02}, "wire_hold_mode": {"off": 0x00, "on": 0x01}, "ipv4_mode": {"dhcp": 0x00, "static": 0x01}, "network_state": {"off": 0x00, "connecting": 0x01, "up": 0x02, "waiting": 0x03}, "network_reason": {"none": 0x00, "not_found": 0x01, "auth": 0x02, "no_address": 0x03, "other": 0x04}, "setting_form": {"named": 0x00, "bytes": 0x01, "text": 0x02, "u32": 0x03, "ipv4": 0x04, "bool": 0x05}, "setting_flag": {"secret": 0x01, "restart": 0x02}, "storage_state": {"none": 0x00, "applied": 0x01, "unreadable": 0x02, "partial": 0x03}, "storage_unreadable": {"none": 0x00, "form": 0x01, "item": 0x02, "capacity": 0x03}}, own={},
98
+ line_names={'swdio': 'the debug data line (2 wires: rvswd, swd) (Host only)', 'swclk': 'the debug clock line (2 wires: rvswd, swd) (Host only)', 'swio': 'the one debug wire (swio) (Host only)', 'rx': 'the fixture UART receive, wired to the target TX (Host only)', 'tx': 'the fixture UART transmit, wired to the target RX (Host only)', 'nrst': 'the target reset line (Host only)', 'power_hi': 'target power on when high (Host only)', 'power_lo': 'target power on when low (Host only)'}, names={'setting': {'label': 'key channel; text 1-32 bytes', 'idle': 'key channel; mode(u8)', 'disable': 'key channel; no data', 'passthrough': 'key port; fn(u16) rx(u16) baud(u32) format(u8)', 'console-passthrough': 'key port; wire_fn(u16) swdio(u16) swclk(u16) max_speed(u32) console_fn(u16) mechanism(u8)', 'wifi': 'key entry; ssid_len(u8) ssid pass_len(u8) passphrase; passphrase write-only', 'ipv4': 'key netif; mode(u8) address(4) prefix(u8) gateway(4) dns(4)', 'rvswd-rest': "key channel (the port's SWCLK); mode(u8): rvswd_rest_mode", 'wire-hold': "key channel (the port's SWDIO); mode(u8): wire_hold_mode"}, 'netif': {'wifi': 'Wi-Fi station', 'ethernet': 'wired Ethernet'}})
99
99
  INTERFACES["oep.probe.config"] = PROBE_CONFIG
@@ -188,7 +188,7 @@ class WireBase(Interface):
188
188
  """oep.wire.<link>: scan / attach / detach / connections (oep-if-debug §0-§2). The shared part; each link's attach
189
189
  takes its own arguments. A failed scan, attach or detach is completed failed with `status(u8) [TLV]` (common §3).
190
190
  attach names its pins in the fixed part (§1): `pins` None takes the wire's one candidate pair (candidate_pairs)."""
191
- SCAN, ATTACH, DETACH, CONNECTIONS = (_WIRE.op[k] for k in ("scan", "attach", "detach", "connections"))
191
+ SCAN, ATTACH, DETACH, CONNECTIONS, HOLDS = (_WIRE.op[k] for k in ("scan", "attach", "detach", "connections", "holds"))
192
192
  REVISION = 1
193
193
  TAG_RESET = _WIRE.tlv["attach"]["reset"] # channel(u16) hold_ms(u16), critical: attach under reset (§3)
194
194
  TAG_SCAN_MAX_SPEED = _WIRE.tlv["scan"]["max_speed"]
@@ -197,6 +197,10 @@ class WireBase(Interface):
197
197
  ONE_WIRE = False # swio: swclk is 0xFFFF (§3)
198
198
  DEFAULT_MAX_SPEED = 1_000_000 # when the wire declares no max_clock_hz either
199
199
 
200
+ def _is_rvswd(self) -> bool:
201
+ """The rest TLVs are rvswd's (debug §3.1); the name as opened, else the class's."""
202
+ return getattr(self, "name", self.NAME) == "oep.wire.rvswd"
203
+
200
204
  def _description(self) -> catalog.Description:
201
205
  return catalog.decode_description(b"".join(catalog.tlv(t, v) for t, v in describe(self.host, self.fn)))
202
206
 
@@ -295,6 +299,19 @@ class WireBase(Interface):
295
299
  """Close the connection and its streams (oep-if-debug §2)."""
296
300
  self._call(self.DETACH, struct.pack("<I", conn))
297
301
 
302
+ def holds(self) -> list[tuple[tuple[int, int], int]]:
303
+ """The ports this wire holds at their rest after a close (oep-if-debug §2.2, lock-free; paged like connections):
304
+ [((swdio, swclk), rest)] - rest: rvswd's idle_clock value (0 high, 1 low), 0 on other wires. Not connections."""
305
+ out: list[tuple[tuple[int, int], int]] = []
306
+ while True:
307
+ rd = m.Reader(self._call(self.HOLDS, bytes([len(out)]), locked=False).payload)
308
+ more, count = rd.take("BB")
309
+ page = [((d, c), r) for d, c, r in (rd.take("HHB") for _ in range(count))]
310
+ rd.tail()
311
+ out += page
312
+ if not more or not count or len(out) > 0xFF:
313
+ return out
314
+
298
315
  def connections(self) -> list["ConnectionInfo"]:
299
316
  """The wire's live connections, in the order they were made (oep-if-debug §2.1, lock-free; paged: the request
300
317
  is first(u8), the answer more count entries [TLV], followed until more is 0). swd's selected_target TLVs
@@ -307,17 +324,22 @@ class WireBase(Interface):
307
324
  for _ in range(count):
308
325
  conn, swdio, swclk, speed, scheme, n = rd.take("IHHIBB")
309
326
  tid = rd.bytes(n)
310
- page.append([conn, (swdio, swclk), speed, (scheme, tid) if scheme else None, None])
327
+ page.append([conn, (swdio, swclk), speed, (scheme, tid) if scheme else None, None, None])
311
328
  for tag, value in m.split_tlvs(rd.rest()):
312
329
  # entry_index(u8) targetsel(u32), repeatable; bit 7 in an answer: an unknown tag (core §2.2, §2.3)
313
330
  if tag == _SELECTED_TARGET and len(value) == 5 and value[0] < len(page):
314
331
  page[value[0]][4] = struct.unpack_from("<I", value, 1)[0]
332
+ # rvswd: entry_index(u8) idle_clock(u8) for every entry (debug §2.1, §3.1)
333
+ if self._is_rvswd() and tag == _REST and len(value) == 2 and value[0] < len(page):
334
+ page[value[0]][5] = _REST_NAMES.get(value[1])
315
335
  out += [ConnectionInfo(*row) for row in page]
316
336
  if not more or not count or len(out) > 0xFF:
317
337
  return out
318
338
 
319
339
 
320
340
  _SELECTED_TARGET = reg.WIRE_SWD.tlv["connections_answer"]["selected_target"]
341
+ _REST = reg.WIRE_RVSWD.tlv["connections_answer"]["idle_clock"]
342
+ _REST_NAMES = {v: k for k, v in reg.WIRE_RVSWD.enum["idle_clock"].items()}
321
343
 
322
344
 
323
345
  @dataclass(frozen=True)
@@ -329,6 +351,7 @@ class ConnectionInfo:
329
351
  speed_hz: int
330
352
  target_id: tuple[int, bytes] | None
331
353
  targetsel: int | None = None
354
+ idle_clock: str | None = None # rvswd: "high" / "low", the rest the connection uses (debug §3.1)
332
355
 
333
356
 
334
357
  class Wire(WireBase):
@@ -342,6 +365,7 @@ class Wire(WireBase):
342
365
  SCHEME_DMI_7F = reg.COMMON.enum["target_id_scheme"]["dmi_7f"] # the u32 at DMI 0x7F (oep-if-debug §3)
343
366
 
344
367
  TAG_DPC = reg.WIRE_RVSWD.tlv["attach_answer"]["dpc"]
368
+ TAG_REST = reg.WIRE_RVSWD.tlv["attach_answer"]["idle_clock"]
345
369
 
346
370
  def __init__(self, hst: h.Host, name: str = "oep.wire.rvswd"):
347
371
  super().__init__(hst, name)
@@ -397,6 +421,10 @@ class Wire(WireBase):
397
421
  dpc = tail.get(self.TAG_DPC)
398
422
  # dpc is a u32: a value of another length is broken, not used (core §2.3)
399
423
  self.dpc = struct.unpack("<I", dpc)[0] if self.halted and dpc is not None and len(dpc) == 4 else None
424
+ # rvswd: the rest the connection uses, the host's or the probe's choice from target_id (debug §3.1)
425
+ rest = tail.get(self.TAG_REST) if self._is_rvswd() else None
426
+ names = {v: k for k, v in self.IDLE_CLOCK.items()}
427
+ self.idle_clock = names.get(rest[0]) if rest is not None and len(rest) == 1 else None
400
428
  return conn, status
401
429
 
402
430
  def attach_under_reset(self, channel: int, hold_ms: int = 20, max_speed: int | None = None,
@@ -36,7 +36,7 @@ class Attachments(Dependencies):
36
36
  return bytes(page)
37
37
  def describe(self,fn):
38
38
  if fn==4:return (tlv(DC['ops'],pack_ops(set(COP.values()))),*(tlv(CD['mechanism'],name.encode()) for name in self.mechanisms))
39
- rows=[tlv(DC['ops'],pack_ops({WOP['attach'],WOP['detach'],WOP['connections']})),tlv(WT['describe']['max_connections'],b'\x02'),tlv(DC['min_clock_hz'],struct.pack('<I',1000))]
39
+ rows=[tlv(DC['ops'],pack_ops({WOP['attach'],WOP['detach'],WOP['connections'],WOP['holds']})),tlv(WT['describe']['max_connections'],b'\x02'),tlv(DC['min_clock_hz'],struct.pack('<I',1000))]
40
40
  for index,pair in enumerate(self.pairs[fn]):
41
41
  members=[(WE['pin_role']['swdio'],pair[0])] if fn==2 else [(WE['pin_role']['swdio'],pair[0]),(WE['pin_role']['swclk'],pair[1])]
42
42
  rows.append(tlv(DC['channel_group'],bytes((index,len(members)))+b''.join(struct.pack('<BH',*row) for row in members)))
@@ -79,6 +79,7 @@ class Attachments(Dependencies):
79
79
  def dispatch_request(self,fn,op,payload,tags):
80
80
  if fn<=3:
81
81
  if op==WOP['connections']:return self.connection_page(fn,payload[0])
82
+ if op==WOP['holds']:return b'\0\0'+extension() # no port held in this model (debug §2.2)
82
83
  if op==WOP['detach']:
83
84
  rid=struct.unpack('<I',payload)[0];self.resource(rid,'connection')
84
85
  if self.connections[rid]['fn']!=fn:raise Reject(R['unavailable'],cause('wrong_state'))
@@ -131,7 +132,7 @@ class AttachModel(DependencyModel):
131
132
  if len(request)>=6 and struct.unpack_from('<H',request,3)[0]==4:
132
133
  e.fixed={COP['open']:5,COP['read']:15,COP['marks']:8,COP['clear']:4,COP['mark']:5,COP['write']:6,COP['close']:4,COP['streams']:2};e.free={COP['read'],COP['marks'],COP['streams']}
133
134
  if request[5]==COP['write'] and len(request)>=16:e.fixed[COP['write']]=6+struct.unpack_from('<H',request,14)[0]
134
- else:e.fixed={WOP['attach']:9,WOP['detach']:4,WOP['connections']:1};e.free={WOP['connections']}
135
+ else:e.fixed={WOP['attach']:9,WOP['detach']:4,WOP['connections']:1,WOP['holds']:1};e.free={WOP['connections'],WOP['holds']}
135
136
  try:return self.ep.handle(request)
136
137
  finally:e.fixed,e.free=fixed,free
137
138
  def restart_fixture(self):
@@ -262,7 +262,7 @@ def _setting(name: str, keys: int, form: int = 0, max_len: int = 0, flags: int =
262
262
 
263
263
 
264
264
  def _config(fn: int, instance: int, storage: int = 4096, *, channels: int = 64, ports: int = 4, netifs=(), wifi_entries: int = 4,
265
- own=()) -> Offered:
265
+ own=(), rvswd: bool = False, hold: bool = True) -> Offered:
266
266
  """oep.probe.config's declarations (probe.config §4): the standard items label / idle / disable (keys: the
267
267
  channels), passthrough / console-passthrough (keys: the transports), with `netifs` (names) wifi / ipv4 and the
268
268
  network op; `own`: the probe's own items as (name, form, keys, max_len, flags) (§1.6). storage 0 = none - no storage
@@ -274,6 +274,10 @@ def _config(fn: int, instance: int, storage: int = 4096, *, channels: int = 64,
274
274
  if "wifi" in netifs:
275
275
  settings.append(_setting("wifi", wifi_entries))
276
276
  settings.append(_setting("ipv4", len(netifs) + 1))
277
+ if rvswd: # its automatic rest can be turned off per port (debug §3.1)
278
+ settings.append(_setting("rvswd-rest", channels))
279
+ if hold: # a debug wire's hold after a close, per port (debug §2)
280
+ settings.append(_setting("wire-hold", channels))
277
281
  settings += [_setting(name, keys, form, max_len, flags) for name, form, keys, max_len, flags in own]
278
282
  return Offered(fn, instance, "oep.probe.config", ops_of("oep.probe.config", *drop)
279
283
  + ((catalog.u32(_CFG["storage"], storage),) if storage else ()) + tuple(settings)
@@ -388,7 +392,7 @@ def p4_x035() -> VirtualProbe:
388
392
  max_stretch_us=100_000), # stretch
389
393
  Offered(9, 0, "oep.fixture.spi-target", _roles({1: pins, 2: pins, 3: pins, 4: pins})
390
394
  + _spi_decl(max_length=64, max_hz=3_000_000, features=0b1, queue_depth=8)), # LSB first
391
- _config(10, 0, channels=55, ports=4, netifs=("ethernet",)),
395
+ _config(10, 0, channels=55, ports=4, netifs=("ethernet",), rvswd=True),
392
396
  # the P4's ADC1 (GPIO16-23): one ADC for all its channels, 611 Hz - 83.3 kHz in all; ESP32-style attenuations
393
397
  Offered(11, 0, "oep.fixture.analog", _roles({k: list(range(16, 24)) for k in range(4)})
394
398
  + _analog_decl([(0, 0, 950), (1, 0, 1250), (2, 0, 1750), (3, 0, 3100)], 65536, 611, 83_333),
@@ -465,7 +469,7 @@ def p4_bench() -> VirtualProbe:
465
469
  _console(3),
466
470
  _gpio(4, pins),
467
471
  _uart(5, 0, pins, 3_000_000),
468
- _config(6, 0, channels=55, ports=4),
472
+ _config(6, 0, channels=55, ports=4, rvswd=True),
469
473
  _link(7),
470
474
  _plan(8),
471
475
  _restart(9),