laddercodec 0.2.1__tar.gz → 0.3.0__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 (637) hide show
  1. laddercodec-0.3.0/.github/scripts/check_public_site.py +80 -0
  2. laddercodec-0.3.0/.github/scripts/prune_public_site.py +45 -0
  3. {laddercodec-0.2.1 → laddercodec-0.3.0}/.github/workflows/docs.yml +13 -3
  4. {laddercodec-0.2.1 → laddercodec-0.3.0}/.gitignore +1 -0
  5. {laddercodec-0.2.1 → laddercodec-0.3.0}/AGENTS.md +11 -5
  6. {laddercodec-0.2.1 → laddercodec-0.3.0}/CHANGELOG.md +38 -2
  7. {laddercodec-0.2.1 → laddercodec-0.3.0}/Makefile +11 -5
  8. laddercodec-0.3.0/PKG-INFO +97 -0
  9. laddercodec-0.3.0/README.md +75 -0
  10. {laddercodec-0.2.1 → laddercodec-0.3.0}/devtools/dump_scr_tags.py +2 -1
  11. laddercodec-0.3.0/docs/gen_llms.py +95 -0
  12. {laddercodec-0.2.1 → laddercodec-0.3.0}/docs/gen_reference.py +21 -10
  13. {laddercodec-0.2.1 → laddercodec-0.3.0}/docs/guides/adding-instructions.md +64 -4
  14. {laddercodec-0.2.1 → laddercodec-0.3.0}/docs/guides/csv-format.md +42 -7
  15. {laddercodec-0.2.1 → laddercodec-0.3.0}/docs/guides/decoding.md +21 -2
  16. {laddercodec-0.2.1 → laddercodec-0.3.0}/docs/guides/encoding.md +1 -1
  17. {laddercodec-0.2.1 → laddercodec-0.3.0}/docs/guides/troubleshooting.md +1 -1
  18. {laddercodec-0.2.1 → laddercodec-0.3.0}/docs/index.md +6 -4
  19. {laddercodec-0.2.1 → laddercodec-0.3.0}/docs/internals/binary-format.md +71 -30
  20. laddercodec-0.3.0/docs/internals/instruction-blobs.md +206 -0
  21. {laddercodec-0.2.1 → laddercodec-0.3.0}/docs/internals/wire-rendering.md +14 -4
  22. laddercodec-0.3.0/docs/stylesheets/extra.css +12 -0
  23. {laddercodec-0.2.1 → laddercodec-0.3.0}/mkdocs.yml +18 -15
  24. {laddercodec-0.2.1 → laddercodec-0.3.0}/pyproject.toml +2 -5
  25. laddercodec-0.3.0/scratchpad/click-v4/captures/.gitignore +2 -0
  26. laddercodec-0.3.0/scratchpad/click-v4/captures/README.md +61 -0
  27. laddercodec-0.3.0/scratchpad/click-v4/captures/drum_fix_stubs.py +84 -0
  28. laddercodec-0.3.0/scratchpad/click-v4/captures/expected/drum.csv +40 -0
  29. laddercodec-0.3.0/scratchpad/click-v4/captures/expected/loop.csv +105 -0
  30. laddercodec-0.3.0/scratchpad/click-v4/captures/expected/math.csv +70 -0
  31. laddercodec-0.3.0/scratchpad/click-v4/captures/expected/out.csv +55 -0
  32. laddercodec-0.3.0/scratchpad/click-v4/captures/expected/pins.csv +56 -0
  33. laddercodec-0.3.0/scratchpad/click-v4/captures/math_edge_stubs.py +175 -0
  34. laddercodec-0.3.0/scratchpad/click-v4/captures/stubs/drum.csv +40 -0
  35. laddercodec-0.3.0/scratchpad/click-v4/captures/stubs/drum_fix.csv +118 -0
  36. laddercodec-0.3.0/scratchpad/click-v4/captures/stubs/drum_fix_te.csv +60 -0
  37. laddercodec-0.3.0/scratchpad/click-v4/captures/stubs/loop.csv +105 -0
  38. laddercodec-0.3.0/scratchpad/click-v4/captures/stubs/math.csv +70 -0
  39. laddercodec-0.3.0/scratchpad/click-v4/captures/stubs/math_edge.csv +92 -0
  40. laddercodec-0.3.0/scratchpad/click-v4/captures/stubs/math_neg2.csv +26 -0
  41. laddercodec-0.3.0/scratchpad/click-v4/captures/stubs/math_operands.csv +65 -0
  42. laddercodec-0.3.0/scratchpad/click-v4/captures/stubs/math_wide.csv +14 -0
  43. laddercodec-0.3.0/scratchpad/click-v4/captures/stubs/out.csv +55 -0
  44. laddercodec-0.3.0/scratchpad/click-v4/captures/stubs/pins.csv +47 -0
  45. laddercodec-0.3.0/scratchpad/click-v4/captures/v4_capture.py +539 -0
  46. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/__init__.py +9 -0
  47. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/_grid.py +2 -2
  48. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/cell.py +8 -5
  49. laddercodec-0.3.0/src/laddercodec/compat.py +64 -0
  50. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/csv/converter.py +172 -314
  51. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/csv/writer.py +100 -200
  52. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/decode.py +10 -6
  53. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/decode_program.py +206 -286
  54. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/encode.py +4 -1
  55. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/__init__.py +21 -4
  56. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/coil.py +6 -0
  57. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/counter.py +33 -5
  58. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/drum.py +184 -31
  59. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/forloop.py +78 -11
  60. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/math.py +124 -35
  61. laddercodec-0.3.0/src/laddercodec/instructions/out_variant.py +269 -0
  62. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/raw.py +3 -2
  63. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/shift.py +18 -6
  64. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/timer.py +18 -5
  65. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/model.py +42 -2
  66. laddercodec-0.3.0/tests/__init__.py +0 -0
  67. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/csv/test_converter.py +110 -0
  68. laddercodec-0.3.0/tests/csv/test_pinned_or_inputs.py +289 -0
  69. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/csv/test_writer.py +2 -1
  70. laddercodec-0.3.0/tests/fixtures/coverage/golden/drum__v4.bin +0 -0
  71. laddercodec-0.3.0/tests/fixtures/coverage/golden/drum__v4.csv +40 -0
  72. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/event_drum__jog.bin +0 -0
  73. laddercodec-0.3.0/tests/fixtures/coverage/golden/loop__v4.bin +0 -0
  74. laddercodec-0.3.0/tests/fixtures/coverage/golden/loop__v4.csv +105 -0
  75. laddercodec-0.3.0/tests/fixtures/coverage/golden/math__negative.bin +0 -0
  76. laddercodec-0.3.0/tests/fixtures/coverage/golden/math__negative.csv +58 -0
  77. laddercodec-0.3.0/tests/fixtures/coverage/golden/math__v4.bin +0 -0
  78. laddercodec-0.3.0/tests/fixtures/coverage/golden/math__v4.csv +70 -0
  79. laddercodec-0.3.0/tests/fixtures/coverage/golden/out__v4.bin +0 -0
  80. laddercodec-0.3.0/tests/fixtures/coverage/golden/out__v4.csv +55 -0
  81. laddercodec-0.3.0/tests/fixtures/coverage/golden/pins__v4.bin +0 -0
  82. laddercodec-0.3.0/tests/fixtures/coverage/golden/pins__v4.csv +56 -0
  83. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/verify_progress.log +7 -1
  84. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-coil-timer-ret.bin +0 -0
  85. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-coil-timer-ret.csv +2 -2
  86. laddercodec-0.3.0/tests/fixtures/pinned_or/conf_counters_count_down.csv +22 -0
  87. laddercodec-0.3.0/tests/fixtures/scr_captures/README.md +33 -0
  88. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/scr_captures/or_topology.csv +9 -9
  89. laddercodec-0.3.0/tests/fixtures/scr_captures/pins.scr +0 -0
  90. laddercodec-0.3.0/tests/fixtures/scr_captures/time_drum_b_column.bin +0 -0
  91. laddercodec-0.3.0/tests/fixtures/scr_captures/time_drum_b_column.csv +4 -0
  92. laddercodec-0.3.0/tests/fixtures/scr_captures/time_drum_b_column.scr +0 -0
  93. laddercodec-0.3.0/tests/fixtures/scr_captures/time_drum_insert_rows.bin +0 -0
  94. laddercodec-0.3.0/tests/fixtures/scr_captures/time_drum_insert_rows.csv +11 -0
  95. laddercodec-0.3.0/tests/fixtures/scr_captures/time_drum_insert_rows.png +0 -0
  96. laddercodec-0.3.0/tests/fixtures/scr_captures/time_drum_insert_rows.scr +0 -0
  97. laddercodec-0.3.0/tests/fixtures/v4_captures/drum.bin +0 -0
  98. laddercodec-0.3.0/tests/fixtures/v4_captures/drum_jog.bin +0 -0
  99. laddercodec-0.3.0/tests/fixtures/v4_captures/loop_exits.bin +0 -0
  100. laddercodec-0.3.0/tests/fixtures/v4_captures/math.bin +0 -0
  101. laddercodec-0.3.0/tests/fixtures/v4_captures/math_typed.bin +0 -0
  102. laddercodec-0.3.0/tests/fixtures/v4_captures/out.bin +0 -0
  103. laddercodec-0.3.0/tests/fixtures/v4_captures/out_debounce_example.bin +0 -0
  104. laddercodec-0.3.0/tests/fixtures/v4_captures/pins.bin +0 -0
  105. laddercodec-0.3.0/tests/fixtures/v4_captures/retyped/math_neg.bin +0 -0
  106. laddercodec-0.3.0/tests/fixtures/v4_captures/retyped/math_wide.bin +0 -0
  107. laddercodec-0.3.0/tests/fixtures/v4_captures/retyped/math_xd.bin +0 -0
  108. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/ladder/test_decode_program.py +311 -54
  109. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/ladder/test_forloop.py +25 -1
  110. laddercodec-0.3.0/tests/ladder/test_math.py +147 -0
  111. laddercodec-0.3.0/tests/test_compat.py +75 -0
  112. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/test_public_api.py +5 -0
  113. laddercodec-0.3.0/tests/test_v4_captures.py +326 -0
  114. {laddercodec-0.2.1 → laddercodec-0.3.0}/uv.lock +97 -354
  115. laddercodec-0.2.1/PKG-INFO +0 -96
  116. laddercodec-0.2.1/README.md +0 -74
  117. laddercodec-0.2.1/docs/internals/instruction-blobs.md +0 -69
  118. laddercodec-0.2.1/tests/ladder/test_math.py +0 -43
  119. {laddercodec-0.2.1 → laddercodec-0.3.0}/.claude/settings.local.json +0 -0
  120. {laddercodec-0.2.1 → laddercodec-0.3.0}/.github/workflows/ci.yml +0 -0
  121. {laddercodec-0.2.1 → laddercodec-0.3.0}/.github/workflows/publish.yml +0 -0
  122. {laddercodec-0.2.1 → laddercodec-0.3.0}/CLAUDE.md +0 -0
  123. {laddercodec-0.2.1 → laddercodec-0.3.0}/LICENSE +0 -0
  124. {laddercodec-0.2.1 → laddercodec-0.3.0}/add-features-workflow.md +0 -0
  125. {laddercodec-0.2.1 → laddercodec-0.3.0}/devtools/analyze_scr.py +0 -0
  126. {laddercodec-0.2.1 → laddercodec-0.3.0}/devtools/combine_coverage.py +0 -0
  127. {laddercodec-0.2.1 → laddercodec-0.3.0}/devtools/compare_blobs.py +0 -0
  128. {laddercodec-0.2.1 → laddercodec-0.3.0}/devtools/compare_csv.py +0 -0
  129. {laddercodec-0.2.1 → laddercodec-0.3.0}/devtools/coverage_golden.py +0 -0
  130. {laddercodec-0.2.1 → laddercodec-0.3.0}/devtools/create_mr_max_csv.py +0 -0
  131. {laddercodec-0.2.1 → laddercodec-0.3.0}/devtools/diag_blob.py +0 -0
  132. {laddercodec-0.2.1 → laddercodec-0.3.0}/devtools/gen_modbus_coverage.py +0 -0
  133. {laddercodec-0.2.1 → laddercodec-0.3.0}/devtools/golden.py +0 -0
  134. {laddercodec-0.2.1 → laddercodec-0.3.0}/devtools/inspect_bin.py +0 -0
  135. {laddercodec-0.2.1 → laddercodec-0.3.0}/devtools/inspect_scr.py +0 -0
  136. {laddercodec-0.2.1 → laddercodec-0.3.0}/devtools/lint.py +0 -0
  137. {laddercodec-0.2.1 → laddercodec-0.3.0}/devtools/pdf_to_png.py +0 -0
  138. {laddercodec-0.2.1 → laddercodec-0.3.0}/devtools/test_decode_scr.py +0 -0
  139. {laddercodec-0.2.1 → laddercodec-0.3.0}/devtools/validate_scr.py +0 -0
  140. {laddercodec-0.2.1 → laddercodec-0.3.0}/devtools/walk_scr.py +0 -0
  141. {laddercodec-0.2.1 → laddercodec-0.3.0}/docs/AGENTS.md +0 -0
  142. {laddercodec-0.2.1 → laddercodec-0.3.0}/docs/CLAUDE.md +0 -0
  143. /laddercodec-0.2.1/tests/__init__.py → /laddercodec-0.3.0/scratchpad/click-v4/captures/copyback/.gitkeep +0 -0
  144. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/binary_helpers.py +0 -0
  145. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/csv/__init__.py +0 -0
  146. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/csv/ast.py +0 -0
  147. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/csv/bundle.py +0 -0
  148. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/csv/contract.py +0 -0
  149. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/csv/parser.py +0 -0
  150. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/csv/token_parser.py +0 -0
  151. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/empty_multirow.py +0 -0
  152. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/encode_multi.py +0 -0
  153. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/call.py +0 -0
  154. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/comparison.py +0 -0
  155. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/contact.py +0 -0
  156. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/copy.py +0 -0
  157. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/email.py +0 -0
  158. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/end.py +0 -0
  159. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/family.py +0 -0
  160. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/home.py +0 -0
  161. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/position.py +0 -0
  162. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/return_.py +0 -0
  163. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/search.py +0 -0
  164. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/send_receive.py +0 -0
  165. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/instructions/velocity.py +0 -0
  166. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/resources/empty_multirow_rule_minimal.scaffold.bin +0 -0
  167. {laddercodec-0.2.1 → laddercodec-0.3.0}/src/laddercodec/topology.py +0 -0
  168. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/csv/test_bundle.py +0 -0
  169. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/csv/test_contract.py +0 -0
  170. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/csv/test_parser.py +0 -0
  171. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/csv/test_token_parser.py +0 -0
  172. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/csv/test_writer_raw_validator.py +0 -0
  173. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/coverage.ckp +0 -0
  174. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/blockcopy__block.bin +0 -0
  175. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/blockcopy__block.csv +0 -0
  176. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/blockcopy__oneshot.bin +0 -0
  177. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/blockcopy__oneshot.csv +0 -0
  178. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/blockcopy__to_ascii.bin +0 -0
  179. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/blockcopy__to_ascii.csv +0 -0
  180. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/blockcopy__to_value.bin +0 -0
  181. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/blockcopy__to_value.csv +0 -0
  182. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/call__basic.bin +0 -0
  183. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/call__basic.csv +0 -0
  184. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__and.bin +0 -0
  185. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__and.csv +0 -0
  186. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__eq.bin +0 -0
  187. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__eq.csv +0 -0
  188. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__fall.bin +0 -0
  189. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__fall.csv +0 -0
  190. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__ge.bin +0 -0
  191. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__ge.csv +0 -0
  192. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__gt.bin +0 -0
  193. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__gt.csv +0 -0
  194. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__immediate.bin +0 -0
  195. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__immediate.csv +0 -0
  196. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__le.bin +0 -0
  197. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__le.csv +0 -0
  198. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__lt.bin +0 -0
  199. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__lt.csv +0 -0
  200. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__nc.bin +0 -0
  201. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__nc.csv +0 -0
  202. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__ne.bin +0 -0
  203. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__ne.csv +0 -0
  204. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__no.bin +0 -0
  205. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__no.csv +0 -0
  206. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__or.bin +0 -0
  207. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__or.csv +0 -0
  208. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__rise.bin +0 -0
  209. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/cond__rise.csv +0 -0
  210. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__literal_float.bin +0 -0
  211. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__literal_float.csv +0 -0
  212. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__literal_int.bin +0 -0
  213. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__literal_int.csv +0 -0
  214. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__oneshot.bin +0 -0
  215. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__oneshot.csv +0 -0
  216. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__tag.bin +0 -0
  217. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__tag.csv +0 -0
  218. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__to_ascii.bin +0 -0
  219. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__to_ascii.csv +0 -0
  220. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__to_binary.bin +0 -0
  221. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__to_binary.csv +0 -0
  222. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__to_text.bin +0 -0
  223. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__to_text.csv +0 -0
  224. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__to_text_exp.bin +0 -0
  225. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__to_text_exp.csv +0 -0
  226. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__to_text_sz.bin +0 -0
  227. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__to_text_sz.csv +0 -0
  228. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__to_text_term.bin +0 -0
  229. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__to_text_term.csv +0 -0
  230. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__to_value.bin +0 -0
  231. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/copy__to_value.csv +0 -0
  232. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/count_down.bin +0 -0
  233. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/count_down.csv +0 -0
  234. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/count_up__down.bin +0 -0
  235. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/count_up__down.csv +0 -0
  236. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/count_up__reset.bin +0 -0
  237. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/count_up__reset.csv +0 -0
  238. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/end.bin +0 -0
  239. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/end.csv +0 -0
  240. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/event_drum__basic.bin +0 -0
  241. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/event_drum__basic.csv +0 -0
  242. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/event_drum__full.bin +0 -0
  243. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/event_drum__full.csv +0 -0
  244. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/event_drum__jog.csv +0 -0
  245. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/event_drum__jump.bin +0 -0
  246. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/event_drum__jump.csv +0 -0
  247. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/event_drum__max.bin +0 -0
  248. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/event_drum__max.csv +0 -0
  249. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/fill__literal.bin +0 -0
  250. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/fill__literal.csv +0 -0
  251. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/fill__oneshot.bin +0 -0
  252. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/fill__oneshot.csv +0 -0
  253. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/fill__tag.bin +0 -0
  254. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/fill__tag.csv +0 -0
  255. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/forloop__basic.bin +0 -0
  256. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/forloop__basic.csv +0 -0
  257. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/forloop__oneshot.bin +0 -0
  258. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/forloop__oneshot.csv +0 -0
  259. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/latch__block.bin +0 -0
  260. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/latch__block.csv +0 -0
  261. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/latch__immediate.bin +0 -0
  262. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/latch__immediate.csv +0 -0
  263. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/latch__tag.bin +0 -0
  264. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/latch__tag.csv +0 -0
  265. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/math__decimal.bin +0 -0
  266. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/math__decimal.csv +0 -0
  267. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/math__hex.bin +0 -0
  268. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/math__hex.csv +0 -0
  269. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/math__oneshot.bin +0 -0
  270. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/math__oneshot.csv +0 -0
  271. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/off_delay__tof.bin +0 -0
  272. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/off_delay__tof.csv +0 -0
  273. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/on_delay__rton.bin +0 -0
  274. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/on_delay__rton.csv +0 -0
  275. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/on_delay__ton.bin +0 -0
  276. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/on_delay__ton.csv +0 -0
  277. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/out__block.bin +0 -0
  278. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/out__block.csv +0 -0
  279. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/out__immediate.bin +0 -0
  280. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/out__immediate.csv +0 -0
  281. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/out__oneshot.bin +0 -0
  282. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/out__oneshot.csv +0 -0
  283. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/out__tag.bin +0 -0
  284. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/out__tag.csv +0 -0
  285. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/pack_bits.bin +0 -0
  286. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/pack_bits.csv +0 -0
  287. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/pack_bits__oneshot.bin +0 -0
  288. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/pack_bits__oneshot.csv +0 -0
  289. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/pack_text.bin +0 -0
  290. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/pack_text.csv +0 -0
  291. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/pack_text__allow_whitespace.bin +0 -0
  292. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/pack_text__allow_whitespace.csv +0 -0
  293. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/pack_text__oneshot.bin +0 -0
  294. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/pack_text__oneshot.csv +0 -0
  295. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/pack_words.bin +0 -0
  296. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/pack_words.csv +0 -0
  297. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/pack_words__oneshot.bin +0 -0
  298. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/pack_words__oneshot.csv +0 -0
  299. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/raw_instructions__email.bin +0 -0
  300. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/raw_instructions__email.csv +0 -0
  301. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/raw_instructions__home.bin +0 -0
  302. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/raw_instructions__home.csv +0 -0
  303. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/raw_instructions__position.bin +0 -0
  304. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/raw_instructions__position.csv +0 -0
  305. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/raw_instructions__velocity.bin +0 -0
  306. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/raw_instructions__velocity.csv +0 -0
  307. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/receive__rtu_click_block.bin +0 -0
  308. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/receive__rtu_click_block.csv +0 -0
  309. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/receive__rtu_click_single.bin +0 -0
  310. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/receive__rtu_click_single.csv +0 -0
  311. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/receive__rtu_modbus_block.bin +0 -0
  312. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/receive__rtu_modbus_block.csv +0 -0
  313. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/receive__rtu_modbus_single.bin +0 -0
  314. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/receive__rtu_modbus_single.csv +0 -0
  315. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/receive__tcp_click_coil.bin +0 -0
  316. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/receive__tcp_click_coil.csv +0 -0
  317. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/receive__tcp_click_input.bin +0 -0
  318. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/receive__tcp_click_input.csv +0 -0
  319. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/receive__tcp_click_input_reg.bin +0 -0
  320. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/receive__tcp_click_input_reg.csv +0 -0
  321. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/receive__tcp_click_wordswap.bin +0 -0
  322. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/receive__tcp_click_wordswap.csv +0 -0
  323. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/reset__block.bin +0 -0
  324. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/reset__block.csv +0 -0
  325. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/reset__immediate.bin +0 -0
  326. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/reset__immediate.csv +0 -0
  327. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/reset__tag.bin +0 -0
  328. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/reset__tag.csv +0 -0
  329. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/return_early__basic.bin +0 -0
  330. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/return_early__basic.csv +0 -0
  331. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/search__continuous.bin +0 -0
  332. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/search__continuous.csv +0 -0
  333. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/search__eq.bin +0 -0
  334. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/search__eq.csv +0 -0
  335. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/search__ge.bin +0 -0
  336. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/search__ge.csv +0 -0
  337. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/search__gt.bin +0 -0
  338. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/search__gt.csv +0 -0
  339. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/search__le.bin +0 -0
  340. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/search__le.csv +0 -0
  341. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/search__lt.bin +0 -0
  342. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/search__lt.csv +0 -0
  343. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/search__ne.bin +0 -0
  344. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/search__ne.csv +0 -0
  345. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/search__oneshot.bin +0 -0
  346. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/search__oneshot.csv +0 -0
  347. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__error_off.bin +0 -0
  348. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__error_off.csv +0 -0
  349. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__errorcode_off.bin +0 -0
  350. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__errorcode_off.csv +0 -0
  351. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__rtu_click_block.bin +0 -0
  352. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__rtu_click_block.csv +0 -0
  353. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__rtu_click_single.bin +0 -0
  354. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__rtu_click_single.csv +0 -0
  355. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__rtu_modbus_block.bin +0 -0
  356. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__rtu_modbus_block.csv +0 -0
  357. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__rtu_modbus_single.bin +0 -0
  358. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__rtu_modbus_single.csv +0 -0
  359. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__sending_off.bin +0 -0
  360. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__sending_off.csv +0 -0
  361. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__success_off.bin +0 -0
  362. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__success_off.csv +0 -0
  363. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__tcp_click_coil.bin +0 -0
  364. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__tcp_click_coil.csv +0 -0
  365. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__tcp_click_coils.bin +0 -0
  366. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__tcp_click_coils.csv +0 -0
  367. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__tcp_click_wordswap.bin +0 -0
  368. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/send__tcp_click_wordswap.csv +0 -0
  369. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/shift__basic.bin +0 -0
  370. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/shift__basic.csv +0 -0
  371. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/time_drum__basic.bin +0 -0
  372. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/time_drum__basic.csv +0 -0
  373. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/time_drum__basic_td.bin +0 -0
  374. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/time_drum__basic_td.csv +0 -0
  375. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/unpack_to_bits.bin +0 -0
  376. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/unpack_to_bits.csv +0 -0
  377. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/unpack_to_bits__oneshot.bin +0 -0
  378. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/unpack_to_bits__oneshot.csv +0 -0
  379. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/unpack_to_words.bin +0 -0
  380. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/unpack_to_words.csv +0 -0
  381. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/unpack_to_words__oneshot.bin +0 -0
  382. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/golden/unpack_to_words__oneshot.csv +0 -0
  383. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/coverage/subroutines/coverage_sub.csv +0 -0
  384. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/drum_weird_branch.bin +0 -0
  385. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/cmt-1row-fullwire-nop.bin +0 -0
  386. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/cmt-1row-fullwire-nop.csv +0 -0
  387. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/cmt-1row-max1400.bin +0 -0
  388. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/cmt-1row-max1400.csv +0 -0
  389. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/cmt-1row-styled-mixed.bin +0 -0
  390. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/cmt-1row-styled-mixed.csv +0 -0
  391. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/cmt-2row-max1324.bin +0 -0
  392. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/cmt-2row-max1324.csv +0 -0
  393. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/cmt-2row-nop-wire.bin +0 -0
  394. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/cmt-2row-nop-wire.csv +0 -0
  395. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/cmt-32row-sparse.bin +0 -0
  396. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/cmt-32row-sparse.csv +0 -0
  397. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/cmt-3row-mixed.bin +0 -0
  398. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/cmt-3row-mixed.csv +0 -0
  399. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-2row-cond__and.bin +0 -0
  400. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-2row-cond__and.csv +0 -0
  401. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-2row-r0only.bin +0 -0
  402. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-2row-r0only.csv +0 -0
  403. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-2row-spread.bin +0 -0
  404. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-2row-spread.csv +0 -0
  405. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-3row-branch.bin +0 -0
  406. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-3row-branch.csv +0 -0
  407. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-3row-or-colA.bin +0 -0
  408. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-3row-or-colA.csv +0 -0
  409. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-3row-or.bin +0 -0
  410. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-3row-or.csv +0 -0
  411. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-3row-scatter.bin +0 -0
  412. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-3row-scatter.csv +0 -0
  413. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-6row-multi-output.bin +0 -0
  414. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-6row-multi-output.csv +0 -0
  415. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-compare-ge.bin +0 -0
  416. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-compare-ge.csv +0 -0
  417. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-compare-series.bin +0 -0
  418. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-compare-series.csv +0 -0
  419. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-compare-timer.bin +0 -0
  420. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-compare-timer.csv +0 -0
  421. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-cond__and.bin +0 -0
  422. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-cond__and.csv +0 -0
  423. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-copy-multirow-2af-T.bin +0 -0
  424. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-copy-multirow-2af-T.csv +0 -0
  425. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-copy-multirow-2af.bin +0 -0
  426. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-copy-multirow-2af.csv +0 -0
  427. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-count_down-row0-data.bin +0 -0
  428. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-count_down-row0-data.csv +0 -0
  429. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-no-out.bin +0 -0
  430. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-no-out.csv +0 -0
  431. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-series.bin +0 -0
  432. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-series.csv +0 -0
  433. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-timer-off.bin +0 -0
  434. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-timer-off.csv +0 -0
  435. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-timer-on.bin +0 -0
  436. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-timer-on.csv +0 -0
  437. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-timer-ret.bin +0 -0
  438. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/instr-timer-ret.csv +0 -0
  439. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-2rung-2row.bin +0 -0
  440. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-2rung-2row.csv +0 -0
  441. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-2rung-wire.bin +0 -0
  442. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-2rung-wire.csv +0 -0
  443. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-3rung-wire-nop.bin +0 -0
  444. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-3rung-wire-nop.csv +0 -0
  445. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-2row.bin +0 -0
  446. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-2row.csv +0 -0
  447. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-both.bin +0 -0
  448. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-both.csv +0 -0
  449. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-r1-max1400.bin +0 -0
  450. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-r1-max1400.csv +0 -0
  451. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-all.bin +0 -0
  452. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-all.csv +0 -0
  453. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow-multiinstructions.bin +0 -0
  454. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow-multiinstructions.csv +0 -0
  455. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow-nopaddedrows.bin +0 -0
  456. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow-nopaddedrows.csv +0 -0
  457. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow.bin +0 -0
  458. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow.csv +0 -0
  459. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-instr-2rung.bin +0 -0
  460. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-instr-2rung.csv +0 -0
  461. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-instr-cond__and.bin +0 -0
  462. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/mr-instr-cond__and.csv +0 -0
  463. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/nc-1row-empty.bin +0 -0
  464. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/nc-1row-empty.csv +0 -0
  465. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/nc-1row-fullwire-nop.bin +0 -0
  466. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/nc-1row-fullwire-nop.csv +0 -0
  467. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/nc-32row-empty.bin +0 -0
  468. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/nc-32row-empty.csv +0 -0
  469. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/nc-3row-t-junction.bin +0 -0
  470. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/nc-3row-t-junction.csv +0 -0
  471. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/nc-4row-vertical.bin +0 -0
  472. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/nc-4row-vertical.csv +0 -0
  473. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/ladder_captures/golden/verify_progress.log +0 -0
  474. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/scr_captures/counter_scr.bin +0 -0
  475. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/scr_captures/counter_scr.csv +0 -0
  476. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/scr_captures/counter_scr.scr +0 -0
  477. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/scr_captures/coverage.bin +0 -0
  478. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/scr_captures/coverage.csv +0 -0
  479. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/scr_captures/coverage.scr +0 -0
  480. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/scr_captures/or_topology.bin +0 -0
  481. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/scr_captures/or_topology.scr +0 -0
  482. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/scr_captures/shift_scr.bin +0 -0
  483. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/scr_captures/shift_scr.csv +0 -0
  484. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/scr_captures/shift_scr.scr +0 -0
  485. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/scr_captures/time_drums.bin +0 -0
  486. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/scr_captures/time_drums.csv +0 -0
  487. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/scr_captures/time_drums.scr +0 -0
  488. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/main.clipboard.bin +0 -0
  489. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/main.clipboard.csv +0 -0
  490. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/main.csv +0 -0
  491. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/main.scr +0 -0
  492. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/AckAlarm.clipboard.bin +0 -0
  493. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/AckAlarm.clipboard.csv +0 -0
  494. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/AckAlarm.csv +0 -0
  495. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/AckAlarm.scr +0 -0
  496. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/AckAndClearAllAlarms.clipboard.bin +0 -0
  497. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/AckAndClearAllAlarms.clipboard.csv +0 -0
  498. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/AckAndClearAllAlarms.csv +0 -0
  499. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/AckAndClearAllAlarms.scr +0 -0
  500. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/AckWarning.clipboard.bin +0 -0
  501. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/AckWarning.clipboard.csv +0 -0
  502. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/AckWarning.csv +0 -0
  503. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/AckWarning.scr +0 -0
  504. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/AlmHistorian.clipboard.bin +0 -0
  505. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/AlmHistorian.clipboard.csv +0 -0
  506. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/AlmHistorian.csv +0 -0
  507. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/AlmHistorian.scr +0 -0
  508. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Blower.clipboard.bin +0 -0
  509. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Blower.clipboard.csv +0 -0
  510. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Blower.csv +0 -0
  511. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Blower.scr +0 -0
  512. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/DisableOutputs.clipboard.bin +0 -0
  513. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/DisableOutputs.clipboard.csv +0 -0
  514. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/DisableOutputs.csv +0 -0
  515. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/DisableOutputs.scr +0 -0
  516. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Heat.clipboard.bin +0 -0
  517. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Heat.clipboard.csv +0 -0
  518. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Heat.csv +0 -0
  519. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Heat.scr +0 -0
  520. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Init.clipboard.bin +0 -0
  521. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Init.clipboard.csv +0 -0
  522. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Init.csv +0 -0
  523. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Init.scr +0 -0
  524. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Maint.clipboard.bin +0 -0
  525. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Maint.clipboard.csv +0 -0
  526. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Maint.csv +0 -0
  527. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Maint.scr +0 -0
  528. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Manual.clipboard.bin +0 -0
  529. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Manual.clipboard.csv +0 -0
  530. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Manual.csv +0 -0
  531. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Manual.scr +0 -0
  532. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ModeChange.clipboard.bin +0 -0
  533. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ModeChange.clipboard.csv +0 -0
  534. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ModeChange.csv +0 -0
  535. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ModeChange.scr +0 -0
  536. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/PLCDateTime.clipboard.bin +0 -0
  537. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/PLCDateTime.clipboard.csv +0 -0
  538. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/PLCDateTime.csv +0 -0
  539. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/PLCDateTime.scr +0 -0
  540. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/PLCErrors.clipboard.bin +0 -0
  541. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/PLCErrors.clipboard.csv +0 -0
  542. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/PLCErrors.csv +0 -0
  543. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/PLCErrors.scr +0 -0
  544. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionBoilerplate.clipboard.bin +0 -0
  545. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionBoilerplate.clipboard.csv +0 -0
  546. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionBoilerplate.csv +0 -0
  547. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionBoilerplate.scr +0 -0
  548. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionErrors.clipboard.bin +0 -0
  549. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionErrors.clipboard.csv +0 -0
  550. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionErrors.csv +0 -0
  551. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionErrors.scr +0 -0
  552. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionExecuteSteps.clipboard.bin +0 -0
  553. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionExecuteSteps.clipboard.csv +0 -0
  554. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionExecuteSteps.csv +0 -0
  555. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionExecuteSteps.scr +0 -0
  556. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionHMI.clipboard.bin +0 -0
  557. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionHMI.clipboard.csv +0 -0
  558. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionHMI.csv +0 -0
  559. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionHMI.scr +0 -0
  560. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionStates.clipboard.bin +0 -0
  561. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionStates.clipboard.csv +0 -0
  562. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionStates.csv +0 -0
  563. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ProductionStates.scr +0 -0
  564. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ReadInputs.clipboard.bin +0 -0
  565. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ReadInputs.clipboard.csv +0 -0
  566. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ReadInputs.csv +0 -0
  567. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ReadInputs.scr +0 -0
  568. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/RecipeChange.clipboard.bin +0 -0
  569. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/RecipeChange.clipboard.csv +0 -0
  570. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/RecipeChange.csv +0 -0
  571. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/RecipeChange.scr +0 -0
  572. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Rotate.clipboard.bin +0 -0
  573. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Rotate.clipboard.csv +0 -0
  574. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Rotate.csv +0 -0
  575. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Rotate.scr +0 -0
  576. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/SFCExample.clipboard.bin +0 -0
  577. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/SFCExample.clipboard.csv +0 -0
  578. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/SFCExample.csv +0 -0
  579. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/SFCExample.scr +0 -0
  580. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/SetOutputs.clipboard.bin +0 -0
  581. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/SetOutputs.clipboard.csv +0 -0
  582. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/SetOutputs.csv +0 -0
  583. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/SetOutputs.scr +0 -0
  584. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/SetOutputsManual.clipboard.bin +0 -0
  585. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/SetOutputsManual.clipboard.csv +0 -0
  586. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/SetOutputsManual.csv +0 -0
  587. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/SetOutputsManual.scr +0 -0
  588. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ThermErrors.clipboard.bin +0 -0
  589. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ThermErrors.clipboard.csv +0 -0
  590. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ThermErrors.csv +0 -0
  591. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/ThermErrors.scr +0 -0
  592. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Validation.clipboard.bin +0 -0
  593. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Validation.clipboard.csv +0 -0
  594. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Validation.csv +0 -0
  595. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/Validation.scr +0 -0
  596. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/WarnTimestamp.clipboard.bin +0 -0
  597. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/WarnTimestamp.clipboard.csv +0 -0
  598. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/WarnTimestamp.csv +0 -0
  599. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/WarnTimestamp.scr +0 -0
  600. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_CopyOrJumpState.clipboard.bin +0 -0
  601. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_CopyOrJumpState.clipboard.csv +0 -0
  602. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_CopyOrJumpState.csv +0 -0
  603. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_CopyOrJumpState.scr +0 -0
  604. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_CtrlCmd2StateRequest.clipboard.bin +0 -0
  605. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_CtrlCmd2StateRequest.clipboard.csv +0 -0
  606. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_CtrlCmd2StateRequest.csv +0 -0
  607. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_CtrlCmd2StateRequest.scr +0 -0
  608. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_IsCmdValid.clipboard.bin +0 -0
  609. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_IsCmdValid.clipboard.csv +0 -0
  610. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_IsCmdValid.csv +0 -0
  611. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_IsCmdValid.scr +0 -0
  612. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_MapCmd2Val.clipboard.bin +0 -0
  613. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_MapCmd2Val.clipboard.csv +0 -0
  614. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_MapCmd2Val.csv +0 -0
  615. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_MapCmd2Val.scr +0 -0
  616. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_MapVal2State.clipboard.bin +0 -0
  617. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_MapVal2State.clipboard.csv +0 -0
  618. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_MapVal2State.csv +0 -0
  619. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_MapVal2State.scr +0 -0
  620. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_StateComplete2Request.clipboard.bin +0 -0
  621. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_StateComplete2Request.clipboard.csv +0 -0
  622. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_StateComplete2Request.csv +0 -0
  623. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/fixtures/tumbler/subroutines/sm_StateComplete2Request.scr +0 -0
  624. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/golden_io.py +0 -0
  625. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/ladder/test_counter.py +0 -0
  626. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/ladder/test_decode.py +0 -0
  627. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/ladder/test_decode_multi.py +0 -0
  628. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/ladder/test_decode_program_tumbler.py +0 -0
  629. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/ladder/test_decode_rtf_oracle.py +0 -0
  630. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/ladder/test_empty_multirow.py +0 -0
  631. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/ladder/test_encode.py +0 -0
  632. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/ladder/test_encode_multi.py +0 -0
  633. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/ladder/test_model.py +0 -0
  634. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/ladder/test_shift.py +0 -0
  635. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/ladder/test_verify_status.py +0 -0
  636. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/test_coverage.py +0 -0
  637. {laddercodec-0.2.1 → laddercodec-0.3.0}/tests/test_smoke.py +0 -0
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env python3
2
+ """Reject private sources and incomplete generated docs in the public site."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import argparse
7
+ from pathlib import Path
8
+
9
+
10
+ BLOCKED_FILENAMES = {
11
+ "agents",
12
+ "agents.html",
13
+ "agents.md",
14
+ "claude",
15
+ "claude.html",
16
+ "claude.md",
17
+ "gen_llms.py",
18
+ "gen_reference.py",
19
+ "llms-full.txt",
20
+ }
21
+ BLOCKED_PATH_PARTS = {"__pycache__", "agents", "claude"}
22
+ EXPECTED_FILES = {
23
+ "index.html",
24
+ "llms.txt",
25
+ "reference/index.html",
26
+ "reference/api/codec/index.html",
27
+ "reference/api/csv/index.html",
28
+ "reference/api/instructions/index.html",
29
+ }
30
+
31
+
32
+ def ascii_text(value: object) -> str:
33
+ return str(value).encode("ascii", errors="backslashreplace").decode("ascii")
34
+
35
+
36
+ def main() -> int:
37
+ parser = argparse.ArgumentParser(description="Check generated public-site paths.")
38
+ parser.add_argument("site", type=Path, help="Generated site directory to inspect")
39
+ args = parser.parse_args()
40
+
41
+ site = args.site
42
+ if not site.is_dir():
43
+ print(f"ERROR: public site directory does not exist: {ascii_text(site)}")
44
+ return 2
45
+
46
+ violations: list[str] = []
47
+ actual_files = {
48
+ path.relative_to(site).as_posix()
49
+ for path in site.rglob("*")
50
+ if path.is_file()
51
+ }
52
+ for relative_path in actual_files:
53
+ path = Path(relative_path)
54
+ if path.name.lower() in BLOCKED_FILENAMES or any(
55
+ part.lower() in BLOCKED_PATH_PARTS for part in path.parts
56
+ ):
57
+ violations.append(f"blocked public-site path: {relative_path}")
58
+
59
+ for missing in sorted(EXPECTED_FILES - actual_files):
60
+ violations.append(f"missing expected public-site path: {missing}")
61
+
62
+ for path in site.rglob("*"):
63
+ if path.suffix.lower() not in {".html", ".md", ".txt"} or not path.is_file():
64
+ continue
65
+ if "::: laddercodec." in path.read_text(encoding="utf-8", errors="replace"):
66
+ relative_path = path.relative_to(site).as_posix()
67
+ violations.append(f"unrendered API directive: {relative_path}")
68
+
69
+ if violations:
70
+ for violation in sorted(violations):
71
+ print(f"ERROR: {ascii_text(violation)}")
72
+ print(f"ERROR: public-site guard found {len(violations)} violation(s).")
73
+ return 1
74
+
75
+ print(f"OK: public-site guard passed: {ascii_text(site)}")
76
+ return 0
77
+
78
+
79
+ if __name__ == "__main__":
80
+ raise SystemExit(main())
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env python3
2
+ """Remove explicitly private source files copied by Zensical 0.0.57."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import argparse
7
+ import shutil
8
+ from pathlib import Path
9
+
10
+
11
+ PRIVATE_ROOT_NAMES = {
12
+ "__pycache__",
13
+ "agents",
14
+ "agents.md",
15
+ "claude",
16
+ "claude.md",
17
+ "gen_llms.py",
18
+ "gen_reference.py",
19
+ }
20
+
21
+
22
+ def main() -> int:
23
+ parser = argparse.ArgumentParser(description="Prune private public-site paths.")
24
+ parser.add_argument("site", type=Path, help="Generated site directory to prune")
25
+ args = parser.parse_args()
26
+
27
+ site = args.site.resolve()
28
+ if not site.is_dir():
29
+ raise RuntimeError(f"Public site directory does not exist: {site}")
30
+
31
+ for path in site.iterdir():
32
+ if path.name.lower() not in PRIVATE_ROOT_NAMES:
33
+ continue
34
+ resolved = path.resolve()
35
+ if resolved.parent != site:
36
+ raise RuntimeError(f"Refusing to prune path outside public site: {resolved}")
37
+ if resolved.is_dir():
38
+ shutil.rmtree(resolved)
39
+ else:
40
+ resolved.unlink()
41
+ return 0
42
+
43
+
44
+ if __name__ == "__main__":
45
+ raise SystemExit(main())
@@ -3,6 +3,8 @@ name: Docs
3
3
  on:
4
4
  push:
5
5
  branches: ["main"]
6
+ pull_request:
7
+ branches: ["main"]
6
8
  workflow_dispatch:
7
9
 
8
10
  permissions:
@@ -34,17 +36,25 @@ jobs:
34
36
  - name: Install docs dependencies
35
37
  run: uv sync --locked --group docs
36
38
 
39
+ - name: Cache-bust extra assets
40
+ run: |
41
+ sed -i -E "s#^(\s*- (stylesheets|javascripts)/[^?[:space:]]+)\$#\1?v=${GITHUB_SHA::8}#" mkdocs.yml
42
+ grep -E '\?v=' mkdocs.yml
43
+
37
44
  - name: Build docs
38
- run: uv run mkdocs build --strict
39
- env:
40
- DISABLE_MKDOCS_2_WARNING: "true"
45
+ run: make docs-check
46
+
47
+ - name: Configure Pages
48
+ uses: actions/configure-pages@v5
41
49
 
42
50
  - name: Upload Pages artifact
51
+ if: github.event_name != 'pull_request'
43
52
  uses: actions/upload-pages-artifact@v4
44
53
  with:
45
54
  path: site
46
55
 
47
56
  deploy:
57
+ if: github.event_name != 'pull_request'
48
58
  needs: build
49
59
  runs-on: ubuntu-latest
50
60
  environment:
@@ -27,4 +27,5 @@ htmlcov/
27
27
 
28
28
  # Docs
29
29
  site/
30
+ docs/reference/
30
31
 
@@ -43,6 +43,7 @@ src/laddercodec/
43
43
  ├── binary_helpers.py # Shared binary primitives: UTF-16LE encode/decode, tagged fields
44
44
  ├── decode.py # Decoder: decode() + internal decode_rung(), decode_rungs()
45
45
  ├── decode_program.py # Program file decoder: decode_program() — Scr*.tmp to Program
46
+ ├── compat.py # find_v4_only() / is_v4_only(): instructions an older CLICK would mangle
46
47
  ├── cell.py # Cell object builders: ClickCell, preamble, terminal, row
47
48
  ├── topology.py # Program header, rung preamble, cell offset math, wire flags
48
49
  ├── empty_multirow.py # Deterministic empty multi-row payload synthesis
@@ -52,6 +53,7 @@ src/laddercodec/
52
53
  │ ├── contact.py # Contact (NO/NC/edge/immediate), build_blob(), cell_params(), parser
53
54
  │ ├── comparison.py # CompareContact (==, !=, >, <, >=, <=), build_blob(), cell_params(), parser
54
55
  │ ├── coil.py # Coil (out/latch/reset, range, immediate, oneshot), build_blob(), cell_params(), parser
56
+ │ ├── out_variant.py # OutVariant (CLICK v4 toggle/debounce/flasher/timed), build_blob(), cell_params(), parser
55
57
  │ ├── timer.py # Timer (on_delay/off_delay, retentive), build_blob(), cell_params(), parser
56
58
  │ ├── copy.py # Copy (single/block/fill), BlockCopy, Fill — build_blob(), cell_params(), parser
57
59
  │ └── raw.py # RawInstruction (opaque blob passthrough), build_blob(), cell_params()
@@ -91,6 +93,7 @@ src/laddercodec/
91
93
  tests/
92
94
  ├── test_smoke.py # Basic sanity check
93
95
  ├── test_coverage.py # Coverage golden fixture tests (instruction variants)
96
+ ├── test_v4_captures.py # CLICK v4 captures: each rung decodes to its comment; native blob matching
94
97
  ├── golden_io.py # Golden CSV/BIN read/write helpers
95
98
  ├── ladder/
96
99
  │ ├── test_encode.py # encode() pipeline, multi-row, comments, wires, NOP
@@ -112,10 +115,11 @@ tests/
112
115
  └── fixtures/
113
116
  ├── ladder_captures/golden/ # Golden CSV/BIN fixtures
114
117
  ├── scr_captures/ # Scr program files + clipboard bins (decode_program)
115
- └── tumbler/ # 34 real programs: <name>.scr + <name>.clipboard.{bin,csv}
118
+ ├── tumbler/ # 34 real programs: <name>.scr + <name>.clipboard.{bin,csv}
119
+ └── v4_captures/ # CLICK v4 copy-backs of pyrung capture stubs (math, out, drum)
116
120
  ```
117
121
 
118
- Golden fixtures verified through Click paste round-trip. The tumbler fixture pairs each Click internal program file (`.scr`) with a clipboard capture of the same program; `devtools/compare_csv.py <dir>` compares `<name>.csv` (scr decode) against `<name>.clipboard.csv` ground truth.
122
+ Ladder golden fixtures are verified through Click paste round-trip. In `scr_captures`, `time_drums.bin` is synthetic (see that directory's README); do not use its differences from SCR as evidence of native cleanup. The tumbler fixture pairs each Click internal program file (`.scr`) with a clipboard capture of the same program; `devtools/compare_csv.py <dir>` compares `<name>.csv` (scr decode) against `<name>.clipboard.csv` ground truth.
119
123
 
120
124
  ## Binary Format
121
125
 
@@ -127,7 +131,7 @@ Quick reference: three regions — program header (0x0254), payload region (0x02
127
131
 
128
132
  Full spec: [`docs/internals/wire-rendering.md`](docs/internals/wire-rendering.md) — flag bytes, left-edge rendering, segment flag boundary rules.
129
133
 
130
- Quick reference: three flag bytes per cell — segment (+0x19), right (+0x1D), down (+0x21). Wire tokens classified by (right, down) only. Segment flag boundary computed per-row. Row 0 exempt.
134
+ Quick reference: three flag bytes per cell — segment (+0x19), right (+0x1D), down (+0x21). Wire tokens classified by (right, down) only. Segment flag boundary computed per-row. The encoder treats row 0 as exempt; native segment flags retain editing history.
131
135
 
132
136
  ## Instruction Blobs
133
137
 
@@ -160,7 +164,7 @@ All tested shapes pass Click round-trip (verified via paste → copy-back):
160
164
 
161
165
  The clipboard decoder (`decode.py`) reads Click clipboard binaries back into structured data. Validated against a 37-rung native capture covering all basic instruction types.
162
166
 
163
- The program file decoder (`decode_program.py`) reads Click's internal `Scr*.tmp` files. Returns a `Program` with name, index, and all rungs. Validated against the 114-rung coverage fixture, shift/counter/drum programs, and the 34-program tumbler fixture (byte-identical CSV vs clipboard captures). Row topology uses the uniform row-block framing documented in `docs/internals/binary-format.md` §"SCR row-topology blocks".
167
+ The program file decoder (`decode_program.py`) reads Click's internal `Scr*.tmp` files. Returns a `Program` with name, index, and all rungs. Validated against the 114-rung coverage fixture, shift/counter/drum programs, and the 34-program tumbler fixture (byte-identical CSV vs clipboard captures). SCR headers use counted numeric widths and independent display flags. Every counted topology row, including the special first row, is parsed without recovery; ordinary stored wire rows are preserved. Row topology uses the uniform row-block framing documented in `docs/internals/binary-format.md` §"SCR row-topology blocks".
164
168
 
165
169
  **All standard Click instruction types decoded natively:**
166
170
  - Contacts: NO, NC, edge (rise/fall), immediate (NO/NC)
@@ -209,8 +213,10 @@ When the user provides a `.bin` + `.csv` from a Click capture:
209
213
 
210
214
  1. **Inspect the capture:** `uv run devtools/inspect_bin.py <file.bin>` — shows known instructions with `to_csv()` output, and RawInstruction/Unknown blobs with full tagged-field breakdown (tag IDs, sentinel types, values).
211
215
  2. **Identify what's new:** RawInstruction means the class name is recognized but the func code isn't. The field breakdown shows exactly which func code / field values differ from existing support.
212
- 3. **Update the code:** add func codes, fields, or new instruction modules as needed. Update `csv/converter.py` to pass new kwargs through.
216
+ 3. **Update the code:** add func codes, fields, or new instruction modules as needed; CSV parsing goes through the family `SPEC`'s `parse_csv_call`.
213
217
  4. **Update coverage CSV:** `tests/fixtures/coverage/golden/<name>.csv` — use kwargs style for boolean flags (e.g. `oneshot=1`).
214
218
  5. **Verify:** `make test` + `make lint`.
215
219
 
220
+ For CLICK v4 instructions captured from pyrung stubs (`tests/fixtures/v4_captures/`, `tests/test_v4_captures.py`), see "Capturing from CLICK v4" in the guide.
221
+
216
222
  See [`docs/guides/adding-instructions.md`](docs/guides/adding-instructions.md) for the full guide.
@@ -8,7 +8,43 @@
8
8
  Review and condense before release — entries accumulate during development and
9
9
  should be edited into shape before moving from Unreleased to a version heading. -->
10
10
 
11
- ## 0.2.1 (Unreleased)
11
+ ## 0.3.0 (2026-11-01)
12
+
13
+ ### Added
14
+ - **CLICK v4 Out variants**: `toggle(C1)`, `debounce(...)`, `flasher(...)` and `timed(...)` decode and encode as `OutVariant`, exported from the root package, matching Click-written blobs byte for byte.
15
+ - **CLICK v4 Time & Event drum**: `time_event_drum(outputs=[...],presets=[1000,None,DS1],events=[None,C1,C2],unit=Tms,...)` decodes and encodes as `Drum(drum_kind="time_event")`, with `None` marking a step without a preset or event.
16
+ - **CLICK v4 Break and Continue**: `break()` and `continue()` decode and encode as `Break` and `Continue`, exported from the root package; both used to decode as `next()`.
17
+ - **CLICK v4 Math**: wide ranges encode up to CLICK's limit of 5000 interior addresses, where more than 500 used to raise `ValueError`, and `XD`/`YD` registers are recognized as operands, including `XD0u` and its place inside a range.
18
+ - **CLICK v4 check**: `find_v4_only(rungs)` lists the instructions an older CLICK would silently change or may not hold (Break/Continue, Out variants, Time & Event drums, time drums with a duration from a register, v4 math functions, SUM over bits, Math ranges past 500 interior addresses), and `is_v4_only()` checks one.
19
+ - **Pin OR legs**: OR legs under a counter, shift or drum pin push the later pins down and grow the box as CLICK does, in clipboard and SCR, exposed as `pin_rows`.
20
+
21
+ ### Changed
22
+ - **CSV read**: a blank-AF row directly under `count_down` is an OR leg of its Down input rather than the bridge row.
23
+ - **CSV errors**: pins out of order or repeated raise `ConvertError` instead of being dropped, a pin a timer does not have (e.g. `.down()`) raises `ConvertError` instead of reading as a blank row, and `write_csv` refuses a leg drawn onto an unused pin's row, which CSV cannot express.
24
+
25
+ ### Fixed
26
+ - **Math encode**: formulas and constants are written the way Click's editor writes them (`ABS(x)*2` → `ABS ( x ) * 2`, `RAND` in its infix form, range interiors listed, `Ah` → `UH10`, `-5` → `H-5`, `-2.5` → `F-2.5`), so pasted formulas no longer raise Math instruction errors or fail CLICK v4's syntax check.
27
+ - **Math encode**: `show_nicknames=True` wraps each operand once, where repeated or overlapping addresses (`DS10 + DS1 + DS1`) came out corrupted.
28
+ - **Math decode**: `XD`/`YD` formulas keep their display constants, instead of `XD0 AND 1h` reading back as `XD0 AND UH1`.
29
+ - **Drum encode**: with Jump off, Jog takes the func code Jump would have, so CLICK v4 no longer rejects a pasted drum with C000A ("all inputs of the box instruction must originate from the same branch").
30
+ - **Unknown coils and drums**: an Out coil with an unknown func code or a drum with an unknown base decodes as `raw(...)`, instead of silently decoding as a plain `out(...)` or `time_drum`.
31
+ - **Raw multi-part instructions**: a `raw(...)` token with part count 2+ rebuilds Click's part bytes, so `write_csv` no longer fails its round-trip check on raw drums and SCR raw blobs carry the right bytes.
32
+ - **CSV read, OR inputs on boxes**: OR legs under any timer, counter, shift or drum input push its later pins down, so a `count_down` fed by a 3+ row OR no longer raises and a retentive timer fed by a 2+ row OR keeps its `.reset()`.
33
+ - **CSV writer**: a box's empty pin rows and a `count_down`'s empty top row stay in place when a blank-AF row or a `count_down` follows, where `write_csv` used to fail its round-trip check.
34
+
35
+ ## 0.2.2 (2026-09-10)
36
+
37
+ ### Fixed
38
+ - **SCR decode**: parse counted column widths, independent display flags, and all stored rows so valid populated special rows no longer trigger recovery, and malformed records fail without silently skipping a rung.
39
+ - **SCR decode**: preserve branch wiring above a later rail-connected row instead of deleting the branch and shifting the lower wire upward.
40
+
41
+ ### Added
42
+ - **Native drum regression fixtures**: preserve the original NOP's wire row and a branch above it after row insertion and drum placement, with native SCR/clipboard and CSV comparisons.
43
+
44
+ ### Documentation
45
+ - Correct SCR flag meanings and fixture provenance, and distinguish native persisted flags from the encoder's construction conventions.
46
+
47
+ ## 0.2.1 (2026-08-25)
12
48
 
13
49
  ### Fixed
14
50
  - **SCR decode**: a Modbus `Send` at `device_id=0` no longer decodes as `device_id=1` — SCR blobs elide fields at their class default, and Send's device_id default (0) differs from Receive's (1).
@@ -23,7 +59,7 @@
23
59
  ### Fixed
24
60
  - **SCR decode**: correct the row-topology block framing — every row (including row 0) uses one uniform block format, fixing branch rungs whose wires (`T`/`|`/`-`) were silently dropped whenever a continuation row's first right-wired cell carried segment flag 1.
25
61
  - **SCR decode**: accept placement-ordered flag-table entries — native captures store columns out of order (e.g. `[6,1,0,3,2,4,5]`), which the old sorted-order validation rejected.
26
- - **SCR decode**: drop orphaned editor-debris wire rows stored above a rung's true row 0 (observed under drum boxes), matching what Click's own clipboard copy produces.
62
+ - **SCR decode**: introduced deletion of presumed orphan wire rows above a later rail-connected row; the claimed native clipboard agreement was based on a synthetic fixture, and this behavior is reversed in 0.2.2.
27
63
 
28
64
  ### Changed
29
65
  - **SCR decode**: replace the heuristic topology parser (leading-row guessing, count_down special cases, end-marker scanning) with a deterministic parser derived from the verified format — see `docs/internals/binary-format.md` §"SCR row-topology blocks" for the spec.
@@ -3,7 +3,7 @@
3
3
 
4
4
  .DEFAULT_GOAL := default
5
5
 
6
- .PHONY: default install lint test golden coverage-golden upgrade build clean docs-serve docs-build docs-check
6
+ .PHONY: default install lint test golden coverage-golden upgrade build clean docs-generate docs-serve docs-build docs-check
7
7
 
8
8
  default: install lint test
9
9
 
@@ -29,11 +29,17 @@ upgrade:
29
29
  build:
30
30
  uv build
31
31
 
32
- docs-serve:
33
- DISABLE_MKDOCS_2_WARNING=true uv run --group docs mkdocs serve
32
+ docs-generate:
33
+ uv run --group docs python docs/gen_reference.py
34
34
 
35
- docs-build:
36
- DISABLE_MKDOCS_2_WARNING=true uv run --group docs mkdocs build --strict
35
+ docs-serve: docs-generate
36
+ uv run --group docs zensical serve
37
+
38
+ docs-build: docs-generate
39
+ uv run --group docs zensical build --clean --strict
40
+ uv run --group docs python .github/scripts/prune_public_site.py site
41
+ uv run --group docs python docs/gen_llms.py site
42
+ uv run --group docs python .github/scripts/check_public_site.py site
37
43
 
38
44
  docs-check: docs-build
39
45
 
@@ -0,0 +1,97 @@
1
+ Metadata-Version: 2.5
2
+ Name: laddercodec
3
+ Version: 0.3.0
4
+ Summary: Binary codec for AutomationDirect CLICK PLC ladder clipboard format
5
+ Project-URL: Repository, https://github.com/ssweber/laddercodec
6
+ Project-URL: Documentation, https://pyrung.com/laddercodec/
7
+ Author-email: ssweber <57631333+ssweber@users.noreply.github.com>
8
+ License-Expression: MPL-2.0
9
+ License-File: LICENSE
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: Operating System :: OS Independent
13
+ Classifier: Programming Language :: Python
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.13
18
+ Classifier: Programming Language :: Python :: 3.14
19
+ Classifier: Typing :: Typed
20
+ Requires-Python: <4.0,>=3.11
21
+ Description-Content-Type: text/markdown
22
+
23
+ # laddercodec
24
+
25
+ **The compatibility layer for CLICK ladder data.** laddercodec reads and writes CLICK's native representations and enables reliable round-tripping between CLICK and the pyrung/ClickNick toolchain. Tested against v2.60 to v3.9x captures. Zero runtime dependencies.
26
+
27
+ It's the layer [ClickNick](https://pyrung.com/clicknick/) pastes through, and it's useful on its own to convert between CLICK ladder data, Python objects, and CSV.
28
+
29
+ - Documentation: https://pyrung.com/laddercodec/
30
+ - LLM docs index: https://pyrung.com/laddercodec/llms.txt
31
+ - LLM full context: https://pyrung.com/laddercodec/llms-full.txt
32
+
33
+ ## Install
34
+
35
+ ```bash
36
+ uv add laddercodec
37
+ # or
38
+ pip install laddercodec
39
+ ```
40
+
41
+ Requires Python 3.11+.
42
+
43
+ ## Quick example
44
+
45
+ ```python
46
+ from laddercodec import read_csv, encode, decode
47
+
48
+ # CSV → binary (ready to paste into Click)
49
+ rungs = read_csv("my_rung.csv")
50
+ binary = encode(rungs[0])
51
+
52
+ # Binary → structured data
53
+ rung = decode(binary)
54
+ print(rung.logical_rows)
55
+ print(rung.instructions)
56
+ ```
57
+
58
+ ## What's included
59
+
60
+ **[Encoder](https://pyrung.com/laddercodec/guides/encoding/)** — `encode()` takes `Rung` objects or canonical CSV and produces clipboard binary ready to paste into Click. Supports all standard instruction types, wire topologies, and styled comments.
61
+
62
+ **[Decoder](https://pyrung.com/laddercodec/guides/decoding/)** — `decode()` reads clipboard binary back into structured Python objects (contacts, coils, timers, wires, comments). `decode_program()` reads ladder data from native CLICK program files.
63
+
64
+ **[CSV I/O](https://pyrung.com/laddercodec/guides/csv-format/)** — `read_csv()` and `write_csv()` convert between the 33-column canonical CSV format and `Rung` objects. Multi-file program bundles supported.
65
+
66
+ **[CLICK format reference](https://pyrung.com/laddercodec/internals/binary-format/)** — Technical reference for CLICK's native clipboard and program representations, including binary layouts and instruction records.
67
+
68
+ ## Status
69
+
70
+ `laddercodec` is **beta** for clipboard encode/decode, CSV I/O, and `decode_program()`.
71
+
72
+ `Email`, `Home`, `Position`, and `Velocity` still intentionally surface as `raw(...)` passthroughs so clipboard and program data round-trips stay lossless while those families remain opaque.
73
+
74
+ ## Learn more
75
+
76
+ | | |
77
+ |---|---|
78
+ | [Encoding guide](https://pyrung.com/laddercodec/guides/encoding/) | Encode, decode, and round-trip your first rung |
79
+ | [Decoding guide](https://pyrung.com/laddercodec/guides/decoding/) | Structured decode, program files, round-trip identity |
80
+ | [CSV format](https://pyrung.com/laddercodec/guides/csv-format/) | 33-column canonical format, bundle layout, topology rules |
81
+ | [Adding instructions](https://pyrung.com/laddercodec/guides/adding-instructions/) | Extend the codec with new instruction types |
82
+ | [API reference](https://pyrung.com/laddercodec/reference/) | Auto-generated from docstrings |
83
+
84
+ ## Development
85
+
86
+ ```bash
87
+ make install # uv sync --all-extras --dev
88
+ make test # pytest
89
+ make lint # ruff + ty
90
+ make golden # regenerate .bin from .csv fixtures
91
+ make docs-serve # local docs dev server
92
+ make # all of the above
93
+ ```
94
+
95
+ ## License
96
+
97
+ [MPL-2.0](LICENSE)
@@ -0,0 +1,75 @@
1
+ # laddercodec
2
+
3
+ **The compatibility layer for CLICK ladder data.** laddercodec reads and writes CLICK's native representations and enables reliable round-tripping between CLICK and the pyrung/ClickNick toolchain. Tested against v2.60 to v3.9x captures. Zero runtime dependencies.
4
+
5
+ It's the layer [ClickNick](https://pyrung.com/clicknick/) pastes through, and it's useful on its own to convert between CLICK ladder data, Python objects, and CSV.
6
+
7
+ - Documentation: https://pyrung.com/laddercodec/
8
+ - LLM docs index: https://pyrung.com/laddercodec/llms.txt
9
+ - LLM full context: https://pyrung.com/laddercodec/llms-full.txt
10
+
11
+ ## Install
12
+
13
+ ```bash
14
+ uv add laddercodec
15
+ # or
16
+ pip install laddercodec
17
+ ```
18
+
19
+ Requires Python 3.11+.
20
+
21
+ ## Quick example
22
+
23
+ ```python
24
+ from laddercodec import read_csv, encode, decode
25
+
26
+ # CSV → binary (ready to paste into Click)
27
+ rungs = read_csv("my_rung.csv")
28
+ binary = encode(rungs[0])
29
+
30
+ # Binary → structured data
31
+ rung = decode(binary)
32
+ print(rung.logical_rows)
33
+ print(rung.instructions)
34
+ ```
35
+
36
+ ## What's included
37
+
38
+ **[Encoder](https://pyrung.com/laddercodec/guides/encoding/)** — `encode()` takes `Rung` objects or canonical CSV and produces clipboard binary ready to paste into Click. Supports all standard instruction types, wire topologies, and styled comments.
39
+
40
+ **[Decoder](https://pyrung.com/laddercodec/guides/decoding/)** — `decode()` reads clipboard binary back into structured Python objects (contacts, coils, timers, wires, comments). `decode_program()` reads ladder data from native CLICK program files.
41
+
42
+ **[CSV I/O](https://pyrung.com/laddercodec/guides/csv-format/)** — `read_csv()` and `write_csv()` convert between the 33-column canonical CSV format and `Rung` objects. Multi-file program bundles supported.
43
+
44
+ **[CLICK format reference](https://pyrung.com/laddercodec/internals/binary-format/)** — Technical reference for CLICK's native clipboard and program representations, including binary layouts and instruction records.
45
+
46
+ ## Status
47
+
48
+ `laddercodec` is **beta** for clipboard encode/decode, CSV I/O, and `decode_program()`.
49
+
50
+ `Email`, `Home`, `Position`, and `Velocity` still intentionally surface as `raw(...)` passthroughs so clipboard and program data round-trips stay lossless while those families remain opaque.
51
+
52
+ ## Learn more
53
+
54
+ | | |
55
+ |---|---|
56
+ | [Encoding guide](https://pyrung.com/laddercodec/guides/encoding/) | Encode, decode, and round-trip your first rung |
57
+ | [Decoding guide](https://pyrung.com/laddercodec/guides/decoding/) | Structured decode, program files, round-trip identity |
58
+ | [CSV format](https://pyrung.com/laddercodec/guides/csv-format/) | 33-column canonical format, bundle layout, topology rules |
59
+ | [Adding instructions](https://pyrung.com/laddercodec/guides/adding-instructions/) | Extend the codec with new instruction types |
60
+ | [API reference](https://pyrung.com/laddercodec/reference/) | Auto-generated from docstrings |
61
+
62
+ ## Development
63
+
64
+ ```bash
65
+ make install # uv sync --all-extras --dev
66
+ make test # pytest
67
+ make lint # ruff + ty
68
+ make golden # regenerate .bin from .csv fixtures
69
+ make docs-serve # local docs dev server
70
+ make # all of the above
71
+ ```
72
+
73
+ ## License
74
+
75
+ [MPL-2.0](LICENSE)
@@ -31,7 +31,8 @@ def main() -> None:
31
31
  row = data[cursor]
32
32
  col = data[cursor + 1]
33
33
  blob_start = cursor + 8
34
- cls, typ, end_off, m1 = blob
34
+ cls, typ, end_off, part_rows = blob
35
+ m1 = len(part_rows)
35
36
  next_pos = end_off + 2 + data[end_off] # trailer-aware advance
36
37
 
37
38
  # Parse tagged fields
@@ -0,0 +1,95 @@
1
+ """Generate a concise llms.txt index for the rendered Zensical site."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import argparse
6
+ import fnmatch
7
+ from collections.abc import Iterator, Sequence
8
+ from pathlib import Path, PurePosixPath
9
+ from urllib.parse import urljoin
10
+
11
+ import yaml
12
+
13
+
14
+ ROOT = Path(__file__).resolve().parent.parent
15
+ CONFIG_PATH = ROOT / "mkdocs.yml"
16
+ DOCS_DIR = ROOT / "docs"
17
+
18
+
19
+ def _navigation_titles(nav: list[object]) -> dict[str, str]:
20
+ titles: dict[str, str] = {}
21
+
22
+ def visit(items: Sequence[object]) -> None:
23
+ for item in items:
24
+ if not isinstance(item, dict):
25
+ continue
26
+ for title, target in item.items():
27
+ if isinstance(target, str):
28
+ titles[target] = str(title)
29
+ elif isinstance(target, list):
30
+ visit(target)
31
+
32
+ visit(nav)
33
+ return titles
34
+
35
+
36
+ def _source_uris(pattern: str) -> Iterator[str]:
37
+ candidates = sorted(
38
+ path.relative_to(DOCS_DIR).as_posix() for path in DOCS_DIR.rglob("*.md")
39
+ )
40
+ yield from fnmatch.filter(candidates, pattern)
41
+
42
+
43
+ def _destination_uri(source_uri: str) -> str:
44
+ source = PurePosixPath(source_uri)
45
+ if source.name == "index.md":
46
+ parent = source.parent.as_posix()
47
+ else:
48
+ parent = source.with_suffix("").as_posix()
49
+ return "" if parent == "." else f"{parent}/"
50
+
51
+
52
+ def main() -> int:
53
+ parser = argparse.ArgumentParser(description="Generate the LLM documentation index.")
54
+ parser.add_argument("site", type=Path, help="Rendered Zensical site directory")
55
+ args = parser.parse_args()
56
+
57
+ config = yaml.safe_load(CONFIG_PATH.read_text(encoding="utf-8"))
58
+ site_dir = args.site.resolve()
59
+ if not site_dir.is_dir():
60
+ raise RuntimeError(f"Rendered site directory does not exist: {site_dir}")
61
+
62
+ base_url = config["site_url"]
63
+ if not base_url.endswith("/"):
64
+ base_url += "/"
65
+ titles = _navigation_titles(config["nav"])
66
+
67
+ output = f"# {config['site_name']}\n\n"
68
+ if description := config.get("site_description"):
69
+ output += f"> {description}\n\n"
70
+
71
+ seen: set[str] = set()
72
+ for section, patterns in config["extra"]["llmstxt"]["sections"].items():
73
+ output += f"## {section}\n\n"
74
+ for pattern in patterns:
75
+ matches = list(_source_uris(pattern)) if "*" in pattern else [pattern]
76
+ for source_uri in matches:
77
+ if source_uri in seen:
78
+ continue
79
+ seen.add(source_uri)
80
+ title = titles.get(source_uri)
81
+ if title is None:
82
+ raise RuntimeError(f"Navigation title not found for {source_uri}")
83
+ destination_uri = _destination_uri(source_uri)
84
+ html_path = site_dir / Path(destination_uri) / "index.html"
85
+ if not html_path.is_file():
86
+ raise RuntimeError(f"Rendered page not found: {html_path}")
87
+ output += f"- [{title}]({urljoin(base_url, destination_uri)})\n"
88
+ output += "\n"
89
+
90
+ (site_dir / "llms.txt").write_text(output, encoding="utf-8")
91
+ return 0
92
+
93
+
94
+ if __name__ == "__main__":
95
+ raise SystemExit(main())