laddercodec 0.2.0__tar.gz → 0.2.2__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 (583) hide show
  1. laddercodec-0.2.2/.github/scripts/check_public_site.py +80 -0
  2. laddercodec-0.2.2/.github/scripts/prune_public_site.py +45 -0
  3. {laddercodec-0.2.0 → laddercodec-0.2.2}/.github/workflows/ci.yml +3 -3
  4. {laddercodec-0.2.0 → laddercodec-0.2.2}/.github/workflows/docs.yml +16 -6
  5. {laddercodec-0.2.0 → laddercodec-0.2.2}/.github/workflows/publish.yml +3 -3
  6. {laddercodec-0.2.0 → laddercodec-0.2.2}/.gitignore +1 -0
  7. laddercodec-0.2.0/CLAUDE.md → laddercodec-0.2.2/AGENTS.md +5 -5
  8. {laddercodec-0.2.0 → laddercodec-0.2.2}/CHANGELOG.md +23 -1
  9. laddercodec-0.2.2/CLAUDE.md +1 -0
  10. {laddercodec-0.2.0 → laddercodec-0.2.2}/Makefile +11 -5
  11. laddercodec-0.2.2/PKG-INFO +97 -0
  12. laddercodec-0.2.2/README.md +75 -0
  13. {laddercodec-0.2.0 → laddercodec-0.2.2}/devtools/inspect_bin.py +3 -3
  14. laddercodec-0.2.0/docs/CLAUDE.md → laddercodec-0.2.2/docs/AGENTS.md +1 -1
  15. laddercodec-0.2.2/docs/CLAUDE.md +1 -0
  16. laddercodec-0.2.2/docs/gen_llms.py +95 -0
  17. {laddercodec-0.2.0 → laddercodec-0.2.2}/docs/gen_reference.py +8 -9
  18. {laddercodec-0.2.0 → laddercodec-0.2.2}/docs/guides/csv-format.md +6 -6
  19. {laddercodec-0.2.0 → laddercodec-0.2.2}/docs/guides/troubleshooting.md +1 -1
  20. {laddercodec-0.2.0 → laddercodec-0.2.2}/docs/index.md +6 -4
  21. {laddercodec-0.2.0 → laddercodec-0.2.2}/docs/internals/binary-format.md +71 -30
  22. {laddercodec-0.2.0 → laddercodec-0.2.2}/docs/internals/wire-rendering.md +14 -4
  23. laddercodec-0.2.2/docs/stylesheets/extra.css +12 -0
  24. {laddercodec-0.2.0 → laddercodec-0.2.2}/mkdocs.yml +21 -14
  25. {laddercodec-0.2.0 → laddercodec-0.2.2}/pyproject.toml +8 -8
  26. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/_grid.py +1 -1
  27. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/cell.py +8 -5
  28. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/csv/converter.py +9 -0
  29. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/csv/writer.py +7 -0
  30. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/decode.py +4 -0
  31. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/decode_program.py +152 -267
  32. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/encode.py +4 -1
  33. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/instructions/send_receive.py +6 -1
  34. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/csv/test_writer.py +87 -0
  35. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-coil-timer-ret.bin +0 -0
  36. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-coil-timer-ret.csv +2 -2
  37. laddercodec-0.2.2/tests/fixtures/scr_captures/README.md +31 -0
  38. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/scr_captures/or_topology.csv +9 -9
  39. laddercodec-0.2.2/tests/fixtures/scr_captures/time_drum_b_column.bin +0 -0
  40. laddercodec-0.2.2/tests/fixtures/scr_captures/time_drum_b_column.csv +4 -0
  41. laddercodec-0.2.2/tests/fixtures/scr_captures/time_drum_b_column.scr +0 -0
  42. laddercodec-0.2.2/tests/fixtures/scr_captures/time_drum_insert_rows.bin +0 -0
  43. laddercodec-0.2.2/tests/fixtures/scr_captures/time_drum_insert_rows.csv +11 -0
  44. laddercodec-0.2.2/tests/fixtures/scr_captures/time_drum_insert_rows.png +0 -0
  45. laddercodec-0.2.2/tests/fixtures/scr_captures/time_drum_insert_rows.scr +0 -0
  46. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/ladder/test_decode_program.py +319 -54
  47. {laddercodec-0.2.0 → laddercodec-0.2.2}/uv.lock +142 -395
  48. laddercodec-0.2.0/PKG-INFO +0 -96
  49. laddercodec-0.2.0/README.md +0 -74
  50. {laddercodec-0.2.0 → laddercodec-0.2.2}/.claude/settings.local.json +0 -0
  51. {laddercodec-0.2.0 → laddercodec-0.2.2}/LICENSE +0 -0
  52. {laddercodec-0.2.0 → laddercodec-0.2.2}/add-features-workflow.md +0 -0
  53. {laddercodec-0.2.0 → laddercodec-0.2.2}/devtools/analyze_scr.py +0 -0
  54. {laddercodec-0.2.0 → laddercodec-0.2.2}/devtools/combine_coverage.py +0 -0
  55. {laddercodec-0.2.0 → laddercodec-0.2.2}/devtools/compare_blobs.py +0 -0
  56. {laddercodec-0.2.0 → laddercodec-0.2.2}/devtools/compare_csv.py +0 -0
  57. {laddercodec-0.2.0 → laddercodec-0.2.2}/devtools/coverage_golden.py +0 -0
  58. {laddercodec-0.2.0 → laddercodec-0.2.2}/devtools/create_mr_max_csv.py +0 -0
  59. {laddercodec-0.2.0 → laddercodec-0.2.2}/devtools/diag_blob.py +0 -0
  60. {laddercodec-0.2.0 → laddercodec-0.2.2}/devtools/dump_scr_tags.py +0 -0
  61. {laddercodec-0.2.0 → laddercodec-0.2.2}/devtools/gen_modbus_coverage.py +0 -0
  62. {laddercodec-0.2.0 → laddercodec-0.2.2}/devtools/golden.py +0 -0
  63. {laddercodec-0.2.0 → laddercodec-0.2.2}/devtools/inspect_scr.py +0 -0
  64. {laddercodec-0.2.0 → laddercodec-0.2.2}/devtools/lint.py +0 -0
  65. {laddercodec-0.2.0 → laddercodec-0.2.2}/devtools/pdf_to_png.py +0 -0
  66. {laddercodec-0.2.0 → laddercodec-0.2.2}/devtools/test_decode_scr.py +0 -0
  67. {laddercodec-0.2.0 → laddercodec-0.2.2}/devtools/validate_scr.py +0 -0
  68. {laddercodec-0.2.0 → laddercodec-0.2.2}/devtools/walk_scr.py +0 -0
  69. {laddercodec-0.2.0 → laddercodec-0.2.2}/docs/guides/adding-instructions.md +0 -0
  70. {laddercodec-0.2.0 → laddercodec-0.2.2}/docs/guides/decoding.md +0 -0
  71. {laddercodec-0.2.0 → laddercodec-0.2.2}/docs/guides/encoding.md +0 -0
  72. {laddercodec-0.2.0 → laddercodec-0.2.2}/docs/internals/instruction-blobs.md +0 -0
  73. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/__init__.py +0 -0
  74. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/binary_helpers.py +0 -0
  75. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/csv/__init__.py +0 -0
  76. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/csv/ast.py +0 -0
  77. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/csv/bundle.py +0 -0
  78. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/csv/contract.py +0 -0
  79. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/csv/parser.py +0 -0
  80. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/csv/token_parser.py +0 -0
  81. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/empty_multirow.py +0 -0
  82. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/encode_multi.py +0 -0
  83. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/instructions/__init__.py +0 -0
  84. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/instructions/call.py +0 -0
  85. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/instructions/coil.py +0 -0
  86. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/instructions/comparison.py +0 -0
  87. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/instructions/contact.py +0 -0
  88. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/instructions/copy.py +0 -0
  89. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/instructions/counter.py +0 -0
  90. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/instructions/drum.py +0 -0
  91. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/instructions/email.py +0 -0
  92. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/instructions/end.py +0 -0
  93. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/instructions/family.py +0 -0
  94. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/instructions/forloop.py +0 -0
  95. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/instructions/home.py +0 -0
  96. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/instructions/math.py +0 -0
  97. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/instructions/position.py +0 -0
  98. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/instructions/raw.py +0 -0
  99. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/instructions/return_.py +0 -0
  100. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/instructions/search.py +0 -0
  101. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/instructions/shift.py +0 -0
  102. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/instructions/timer.py +0 -0
  103. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/instructions/velocity.py +0 -0
  104. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/model.py +0 -0
  105. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/resources/empty_multirow_rule_minimal.scaffold.bin +0 -0
  106. {laddercodec-0.2.0 → laddercodec-0.2.2}/src/laddercodec/topology.py +0 -0
  107. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/__init__.py +0 -0
  108. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/csv/test_bundle.py +0 -0
  109. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/csv/test_contract.py +0 -0
  110. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/csv/test_converter.py +0 -0
  111. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/csv/test_parser.py +0 -0
  112. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/csv/test_token_parser.py +0 -0
  113. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/csv/test_writer_raw_validator.py +0 -0
  114. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/coverage.ckp +0 -0
  115. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/blockcopy__block.bin +0 -0
  116. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/blockcopy__block.csv +0 -0
  117. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/blockcopy__oneshot.bin +0 -0
  118. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/blockcopy__oneshot.csv +0 -0
  119. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/blockcopy__to_ascii.bin +0 -0
  120. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/blockcopy__to_ascii.csv +0 -0
  121. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/blockcopy__to_value.bin +0 -0
  122. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/blockcopy__to_value.csv +0 -0
  123. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/call__basic.bin +0 -0
  124. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/call__basic.csv +0 -0
  125. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__and.bin +0 -0
  126. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__and.csv +0 -0
  127. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__eq.bin +0 -0
  128. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__eq.csv +0 -0
  129. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__fall.bin +0 -0
  130. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__fall.csv +0 -0
  131. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__ge.bin +0 -0
  132. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__ge.csv +0 -0
  133. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__gt.bin +0 -0
  134. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__gt.csv +0 -0
  135. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__immediate.bin +0 -0
  136. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__immediate.csv +0 -0
  137. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__le.bin +0 -0
  138. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__le.csv +0 -0
  139. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__lt.bin +0 -0
  140. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__lt.csv +0 -0
  141. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__nc.bin +0 -0
  142. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__nc.csv +0 -0
  143. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__ne.bin +0 -0
  144. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__ne.csv +0 -0
  145. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__no.bin +0 -0
  146. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__no.csv +0 -0
  147. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__or.bin +0 -0
  148. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__or.csv +0 -0
  149. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__rise.bin +0 -0
  150. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__rise.csv +0 -0
  151. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__literal_float.bin +0 -0
  152. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__literal_float.csv +0 -0
  153. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__literal_int.bin +0 -0
  154. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__literal_int.csv +0 -0
  155. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__oneshot.bin +0 -0
  156. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__oneshot.csv +0 -0
  157. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__tag.bin +0 -0
  158. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__tag.csv +0 -0
  159. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_ascii.bin +0 -0
  160. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_ascii.csv +0 -0
  161. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_binary.bin +0 -0
  162. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_binary.csv +0 -0
  163. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_text.bin +0 -0
  164. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_text.csv +0 -0
  165. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_text_exp.bin +0 -0
  166. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_text_exp.csv +0 -0
  167. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_text_sz.bin +0 -0
  168. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_text_sz.csv +0 -0
  169. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_text_term.bin +0 -0
  170. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_text_term.csv +0 -0
  171. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_value.bin +0 -0
  172. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_value.csv +0 -0
  173. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/count_down.bin +0 -0
  174. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/count_down.csv +0 -0
  175. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/count_up__down.bin +0 -0
  176. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/count_up__down.csv +0 -0
  177. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/count_up__reset.bin +0 -0
  178. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/count_up__reset.csv +0 -0
  179. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/end.bin +0 -0
  180. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/end.csv +0 -0
  181. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/event_drum__basic.bin +0 -0
  182. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/event_drum__basic.csv +0 -0
  183. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/event_drum__full.bin +0 -0
  184. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/event_drum__full.csv +0 -0
  185. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/event_drum__jog.bin +0 -0
  186. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/event_drum__jog.csv +0 -0
  187. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/event_drum__jump.bin +0 -0
  188. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/event_drum__jump.csv +0 -0
  189. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/event_drum__max.bin +0 -0
  190. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/event_drum__max.csv +0 -0
  191. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/fill__literal.bin +0 -0
  192. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/fill__literal.csv +0 -0
  193. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/fill__oneshot.bin +0 -0
  194. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/fill__oneshot.csv +0 -0
  195. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/fill__tag.bin +0 -0
  196. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/fill__tag.csv +0 -0
  197. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/forloop__basic.bin +0 -0
  198. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/forloop__basic.csv +0 -0
  199. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/forloop__oneshot.bin +0 -0
  200. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/forloop__oneshot.csv +0 -0
  201. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/latch__block.bin +0 -0
  202. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/latch__block.csv +0 -0
  203. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/latch__immediate.bin +0 -0
  204. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/latch__immediate.csv +0 -0
  205. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/latch__tag.bin +0 -0
  206. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/latch__tag.csv +0 -0
  207. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/math__decimal.bin +0 -0
  208. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/math__decimal.csv +0 -0
  209. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/math__hex.bin +0 -0
  210. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/math__hex.csv +0 -0
  211. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/math__oneshot.bin +0 -0
  212. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/math__oneshot.csv +0 -0
  213. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/off_delay__tof.bin +0 -0
  214. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/off_delay__tof.csv +0 -0
  215. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/on_delay__rton.bin +0 -0
  216. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/on_delay__rton.csv +0 -0
  217. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/on_delay__ton.bin +0 -0
  218. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/on_delay__ton.csv +0 -0
  219. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/out__block.bin +0 -0
  220. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/out__block.csv +0 -0
  221. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/out__immediate.bin +0 -0
  222. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/out__immediate.csv +0 -0
  223. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/out__oneshot.bin +0 -0
  224. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/out__oneshot.csv +0 -0
  225. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/out__tag.bin +0 -0
  226. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/out__tag.csv +0 -0
  227. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_bits.bin +0 -0
  228. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_bits.csv +0 -0
  229. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_bits__oneshot.bin +0 -0
  230. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_bits__oneshot.csv +0 -0
  231. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_text.bin +0 -0
  232. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_text.csv +0 -0
  233. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_text__allow_whitespace.bin +0 -0
  234. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_text__allow_whitespace.csv +0 -0
  235. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_text__oneshot.bin +0 -0
  236. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_text__oneshot.csv +0 -0
  237. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_words.bin +0 -0
  238. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_words.csv +0 -0
  239. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_words__oneshot.bin +0 -0
  240. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_words__oneshot.csv +0 -0
  241. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/raw_instructions__email.bin +0 -0
  242. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/raw_instructions__email.csv +0 -0
  243. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/raw_instructions__home.bin +0 -0
  244. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/raw_instructions__home.csv +0 -0
  245. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/raw_instructions__position.bin +0 -0
  246. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/raw_instructions__position.csv +0 -0
  247. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/raw_instructions__velocity.bin +0 -0
  248. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/raw_instructions__velocity.csv +0 -0
  249. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__rtu_click_block.bin +0 -0
  250. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__rtu_click_block.csv +0 -0
  251. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__rtu_click_single.bin +0 -0
  252. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__rtu_click_single.csv +0 -0
  253. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__rtu_modbus_block.bin +0 -0
  254. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__rtu_modbus_block.csv +0 -0
  255. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__rtu_modbus_single.bin +0 -0
  256. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__rtu_modbus_single.csv +0 -0
  257. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__tcp_click_coil.bin +0 -0
  258. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__tcp_click_coil.csv +0 -0
  259. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__tcp_click_input.bin +0 -0
  260. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__tcp_click_input.csv +0 -0
  261. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__tcp_click_input_reg.bin +0 -0
  262. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__tcp_click_input_reg.csv +0 -0
  263. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__tcp_click_wordswap.bin +0 -0
  264. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__tcp_click_wordswap.csv +0 -0
  265. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/reset__block.bin +0 -0
  266. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/reset__block.csv +0 -0
  267. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/reset__immediate.bin +0 -0
  268. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/reset__immediate.csv +0 -0
  269. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/reset__tag.bin +0 -0
  270. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/reset__tag.csv +0 -0
  271. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/return_early__basic.bin +0 -0
  272. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/return_early__basic.csv +0 -0
  273. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__continuous.bin +0 -0
  274. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__continuous.csv +0 -0
  275. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__eq.bin +0 -0
  276. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__eq.csv +0 -0
  277. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__ge.bin +0 -0
  278. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__ge.csv +0 -0
  279. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__gt.bin +0 -0
  280. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__gt.csv +0 -0
  281. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__le.bin +0 -0
  282. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__le.csv +0 -0
  283. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__lt.bin +0 -0
  284. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__lt.csv +0 -0
  285. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__ne.bin +0 -0
  286. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__ne.csv +0 -0
  287. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__oneshot.bin +0 -0
  288. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__oneshot.csv +0 -0
  289. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__error_off.bin +0 -0
  290. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__error_off.csv +0 -0
  291. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__errorcode_off.bin +0 -0
  292. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__errorcode_off.csv +0 -0
  293. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__rtu_click_block.bin +0 -0
  294. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__rtu_click_block.csv +0 -0
  295. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__rtu_click_single.bin +0 -0
  296. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__rtu_click_single.csv +0 -0
  297. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__rtu_modbus_block.bin +0 -0
  298. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__rtu_modbus_block.csv +0 -0
  299. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__rtu_modbus_single.bin +0 -0
  300. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__rtu_modbus_single.csv +0 -0
  301. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__sending_off.bin +0 -0
  302. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__sending_off.csv +0 -0
  303. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__success_off.bin +0 -0
  304. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__success_off.csv +0 -0
  305. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__tcp_click_coil.bin +0 -0
  306. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__tcp_click_coil.csv +0 -0
  307. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__tcp_click_coils.bin +0 -0
  308. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__tcp_click_coils.csv +0 -0
  309. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__tcp_click_wordswap.bin +0 -0
  310. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__tcp_click_wordswap.csv +0 -0
  311. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/shift__basic.bin +0 -0
  312. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/shift__basic.csv +0 -0
  313. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/time_drum__basic.bin +0 -0
  314. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/time_drum__basic.csv +0 -0
  315. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/time_drum__basic_td.bin +0 -0
  316. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/time_drum__basic_td.csv +0 -0
  317. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/unpack_to_bits.bin +0 -0
  318. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/unpack_to_bits.csv +0 -0
  319. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/unpack_to_bits__oneshot.bin +0 -0
  320. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/unpack_to_bits__oneshot.csv +0 -0
  321. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/unpack_to_words.bin +0 -0
  322. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/unpack_to_words.csv +0 -0
  323. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/unpack_to_words__oneshot.bin +0 -0
  324. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/unpack_to_words__oneshot.csv +0 -0
  325. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/verify_progress.log +0 -0
  326. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/coverage/subroutines/coverage_sub.csv +0 -0
  327. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/drum_weird_branch.bin +0 -0
  328. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-1row-fullwire-nop.bin +0 -0
  329. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-1row-fullwire-nop.csv +0 -0
  330. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-1row-max1400.bin +0 -0
  331. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-1row-max1400.csv +0 -0
  332. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-1row-styled-mixed.bin +0 -0
  333. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-1row-styled-mixed.csv +0 -0
  334. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-2row-max1324.bin +0 -0
  335. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-2row-max1324.csv +0 -0
  336. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-2row-nop-wire.bin +0 -0
  337. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-2row-nop-wire.csv +0 -0
  338. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-32row-sparse.bin +0 -0
  339. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-32row-sparse.csv +0 -0
  340. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-3row-mixed.bin +0 -0
  341. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-3row-mixed.csv +0 -0
  342. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-2row-cond__and.bin +0 -0
  343. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-2row-cond__and.csv +0 -0
  344. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-2row-r0only.bin +0 -0
  345. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-2row-r0only.csv +0 -0
  346. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-2row-spread.bin +0 -0
  347. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-2row-spread.csv +0 -0
  348. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-3row-branch.bin +0 -0
  349. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-3row-branch.csv +0 -0
  350. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-3row-or-colA.bin +0 -0
  351. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-3row-or-colA.csv +0 -0
  352. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-3row-or.bin +0 -0
  353. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-3row-or.csv +0 -0
  354. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-3row-scatter.bin +0 -0
  355. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-3row-scatter.csv +0 -0
  356. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-6row-multi-output.bin +0 -0
  357. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-6row-multi-output.csv +0 -0
  358. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-compare-ge.bin +0 -0
  359. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-compare-ge.csv +0 -0
  360. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-compare-series.bin +0 -0
  361. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-compare-series.csv +0 -0
  362. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-compare-timer.bin +0 -0
  363. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-compare-timer.csv +0 -0
  364. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-cond__and.bin +0 -0
  365. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-cond__and.csv +0 -0
  366. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-copy-multirow-2af-T.bin +0 -0
  367. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-copy-multirow-2af-T.csv +0 -0
  368. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-copy-multirow-2af.bin +0 -0
  369. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-copy-multirow-2af.csv +0 -0
  370. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-count_down-row0-data.bin +0 -0
  371. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-count_down-row0-data.csv +0 -0
  372. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-no-out.bin +0 -0
  373. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-no-out.csv +0 -0
  374. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-series.bin +0 -0
  375. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-series.csv +0 -0
  376. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-timer-off.bin +0 -0
  377. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-timer-off.csv +0 -0
  378. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-timer-on.bin +0 -0
  379. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-timer-on.csv +0 -0
  380. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-timer-ret.bin +0 -0
  381. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-timer-ret.csv +0 -0
  382. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-2rung-2row.bin +0 -0
  383. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-2rung-2row.csv +0 -0
  384. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-2rung-wire.bin +0 -0
  385. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-2rung-wire.csv +0 -0
  386. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-3rung-wire-nop.bin +0 -0
  387. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-3rung-wire-nop.csv +0 -0
  388. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-2row.bin +0 -0
  389. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-2row.csv +0 -0
  390. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-both.bin +0 -0
  391. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-both.csv +0 -0
  392. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-r1-max1400.bin +0 -0
  393. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-r1-max1400.csv +0 -0
  394. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-all.bin +0 -0
  395. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-all.csv +0 -0
  396. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow-multiinstructions.bin +0 -0
  397. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow-multiinstructions.csv +0 -0
  398. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow-nopaddedrows.bin +0 -0
  399. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow-nopaddedrows.csv +0 -0
  400. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow.bin +0 -0
  401. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow.csv +0 -0
  402. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-instr-2rung.bin +0 -0
  403. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-instr-2rung.csv +0 -0
  404. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-instr-cond__and.bin +0 -0
  405. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-instr-cond__and.csv +0 -0
  406. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/nc-1row-empty.bin +0 -0
  407. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/nc-1row-empty.csv +0 -0
  408. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/nc-1row-fullwire-nop.bin +0 -0
  409. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/nc-1row-fullwire-nop.csv +0 -0
  410. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/nc-32row-empty.bin +0 -0
  411. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/nc-32row-empty.csv +0 -0
  412. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/nc-3row-t-junction.bin +0 -0
  413. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/nc-3row-t-junction.csv +0 -0
  414. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/nc-4row-vertical.bin +0 -0
  415. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/nc-4row-vertical.csv +0 -0
  416. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/verify_progress.log +0 -0
  417. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/scr_captures/counter_scr.bin +0 -0
  418. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/scr_captures/counter_scr.csv +0 -0
  419. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/scr_captures/counter_scr.scr +0 -0
  420. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/scr_captures/coverage.bin +0 -0
  421. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/scr_captures/coverage.csv +0 -0
  422. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/scr_captures/coverage.scr +0 -0
  423. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/scr_captures/or_topology.bin +0 -0
  424. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/scr_captures/or_topology.scr +0 -0
  425. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/scr_captures/shift_scr.bin +0 -0
  426. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/scr_captures/shift_scr.csv +0 -0
  427. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/scr_captures/shift_scr.scr +0 -0
  428. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/scr_captures/time_drums.bin +0 -0
  429. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/scr_captures/time_drums.csv +0 -0
  430. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/scr_captures/time_drums.scr +0 -0
  431. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/main.clipboard.bin +0 -0
  432. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/main.clipboard.csv +0 -0
  433. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/main.csv +0 -0
  434. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/main.scr +0 -0
  435. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AckAlarm.clipboard.bin +0 -0
  436. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AckAlarm.clipboard.csv +0 -0
  437. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AckAlarm.csv +0 -0
  438. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AckAlarm.scr +0 -0
  439. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AckAndClearAllAlarms.clipboard.bin +0 -0
  440. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AckAndClearAllAlarms.clipboard.csv +0 -0
  441. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AckAndClearAllAlarms.csv +0 -0
  442. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AckAndClearAllAlarms.scr +0 -0
  443. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AckWarning.clipboard.bin +0 -0
  444. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AckWarning.clipboard.csv +0 -0
  445. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AckWarning.csv +0 -0
  446. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AckWarning.scr +0 -0
  447. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AlmHistorian.clipboard.bin +0 -0
  448. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AlmHistorian.clipboard.csv +0 -0
  449. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AlmHistorian.csv +0 -0
  450. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AlmHistorian.scr +0 -0
  451. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Blower.clipboard.bin +0 -0
  452. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Blower.clipboard.csv +0 -0
  453. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Blower.csv +0 -0
  454. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Blower.scr +0 -0
  455. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/DisableOutputs.clipboard.bin +0 -0
  456. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/DisableOutputs.clipboard.csv +0 -0
  457. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/DisableOutputs.csv +0 -0
  458. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/DisableOutputs.scr +0 -0
  459. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Heat.clipboard.bin +0 -0
  460. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Heat.clipboard.csv +0 -0
  461. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Heat.csv +0 -0
  462. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Heat.scr +0 -0
  463. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Init.clipboard.bin +0 -0
  464. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Init.clipboard.csv +0 -0
  465. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Init.csv +0 -0
  466. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Init.scr +0 -0
  467. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Maint.clipboard.bin +0 -0
  468. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Maint.clipboard.csv +0 -0
  469. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Maint.csv +0 -0
  470. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Maint.scr +0 -0
  471. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Manual.clipboard.bin +0 -0
  472. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Manual.clipboard.csv +0 -0
  473. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Manual.csv +0 -0
  474. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Manual.scr +0 -0
  475. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ModeChange.clipboard.bin +0 -0
  476. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ModeChange.clipboard.csv +0 -0
  477. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ModeChange.csv +0 -0
  478. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ModeChange.scr +0 -0
  479. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/PLCDateTime.clipboard.bin +0 -0
  480. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/PLCDateTime.clipboard.csv +0 -0
  481. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/PLCDateTime.csv +0 -0
  482. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/PLCDateTime.scr +0 -0
  483. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/PLCErrors.clipboard.bin +0 -0
  484. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/PLCErrors.clipboard.csv +0 -0
  485. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/PLCErrors.csv +0 -0
  486. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/PLCErrors.scr +0 -0
  487. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionBoilerplate.clipboard.bin +0 -0
  488. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionBoilerplate.clipboard.csv +0 -0
  489. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionBoilerplate.csv +0 -0
  490. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionBoilerplate.scr +0 -0
  491. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionErrors.clipboard.bin +0 -0
  492. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionErrors.clipboard.csv +0 -0
  493. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionErrors.csv +0 -0
  494. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionErrors.scr +0 -0
  495. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionExecuteSteps.clipboard.bin +0 -0
  496. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionExecuteSteps.clipboard.csv +0 -0
  497. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionExecuteSteps.csv +0 -0
  498. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionExecuteSteps.scr +0 -0
  499. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionHMI.clipboard.bin +0 -0
  500. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionHMI.clipboard.csv +0 -0
  501. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionHMI.csv +0 -0
  502. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionHMI.scr +0 -0
  503. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionStates.clipboard.bin +0 -0
  504. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionStates.clipboard.csv +0 -0
  505. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionStates.csv +0 -0
  506. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionStates.scr +0 -0
  507. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ReadInputs.clipboard.bin +0 -0
  508. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ReadInputs.clipboard.csv +0 -0
  509. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ReadInputs.csv +0 -0
  510. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ReadInputs.scr +0 -0
  511. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/RecipeChange.clipboard.bin +0 -0
  512. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/RecipeChange.clipboard.csv +0 -0
  513. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/RecipeChange.csv +0 -0
  514. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/RecipeChange.scr +0 -0
  515. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Rotate.clipboard.bin +0 -0
  516. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Rotate.clipboard.csv +0 -0
  517. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Rotate.csv +0 -0
  518. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Rotate.scr +0 -0
  519. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/SFCExample.clipboard.bin +0 -0
  520. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/SFCExample.clipboard.csv +0 -0
  521. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/SFCExample.csv +0 -0
  522. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/SFCExample.scr +0 -0
  523. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/SetOutputs.clipboard.bin +0 -0
  524. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/SetOutputs.clipboard.csv +0 -0
  525. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/SetOutputs.csv +0 -0
  526. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/SetOutputs.scr +0 -0
  527. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/SetOutputsManual.clipboard.bin +0 -0
  528. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/SetOutputsManual.clipboard.csv +0 -0
  529. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/SetOutputsManual.csv +0 -0
  530. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/SetOutputsManual.scr +0 -0
  531. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ThermErrors.clipboard.bin +0 -0
  532. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ThermErrors.clipboard.csv +0 -0
  533. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ThermErrors.csv +0 -0
  534. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ThermErrors.scr +0 -0
  535. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Validation.clipboard.bin +0 -0
  536. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Validation.clipboard.csv +0 -0
  537. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Validation.csv +0 -0
  538. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Validation.scr +0 -0
  539. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/WarnTimestamp.clipboard.bin +0 -0
  540. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/WarnTimestamp.clipboard.csv +0 -0
  541. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/WarnTimestamp.csv +0 -0
  542. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/WarnTimestamp.scr +0 -0
  543. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_CopyOrJumpState.clipboard.bin +0 -0
  544. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_CopyOrJumpState.clipboard.csv +0 -0
  545. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_CopyOrJumpState.csv +0 -0
  546. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_CopyOrJumpState.scr +0 -0
  547. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_CtrlCmd2StateRequest.clipboard.bin +0 -0
  548. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_CtrlCmd2StateRequest.clipboard.csv +0 -0
  549. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_CtrlCmd2StateRequest.csv +0 -0
  550. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_CtrlCmd2StateRequest.scr +0 -0
  551. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_IsCmdValid.clipboard.bin +0 -0
  552. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_IsCmdValid.clipboard.csv +0 -0
  553. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_IsCmdValid.csv +0 -0
  554. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_IsCmdValid.scr +0 -0
  555. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_MapCmd2Val.clipboard.bin +0 -0
  556. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_MapCmd2Val.clipboard.csv +0 -0
  557. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_MapCmd2Val.csv +0 -0
  558. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_MapCmd2Val.scr +0 -0
  559. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_MapVal2State.clipboard.bin +0 -0
  560. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_MapVal2State.clipboard.csv +0 -0
  561. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_MapVal2State.csv +0 -0
  562. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_MapVal2State.scr +0 -0
  563. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_StateComplete2Request.clipboard.bin +0 -0
  564. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_StateComplete2Request.clipboard.csv +0 -0
  565. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_StateComplete2Request.csv +0 -0
  566. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_StateComplete2Request.scr +0 -0
  567. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/golden_io.py +0 -0
  568. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/ladder/test_counter.py +0 -0
  569. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/ladder/test_decode.py +0 -0
  570. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/ladder/test_decode_multi.py +0 -0
  571. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/ladder/test_decode_program_tumbler.py +0 -0
  572. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/ladder/test_decode_rtf_oracle.py +0 -0
  573. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/ladder/test_empty_multirow.py +0 -0
  574. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/ladder/test_encode.py +0 -0
  575. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/ladder/test_encode_multi.py +0 -0
  576. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/ladder/test_forloop.py +0 -0
  577. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/ladder/test_math.py +0 -0
  578. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/ladder/test_model.py +0 -0
  579. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/ladder/test_shift.py +0 -0
  580. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/ladder/test_verify_status.py +0 -0
  581. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/test_coverage.py +0 -0
  582. {laddercodec-0.2.0 → laddercodec-0.2.2}/tests/test_public_api.py +0 -0
  583. {laddercodec-0.2.0 → laddercodec-0.2.2}/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())
@@ -25,10 +25,10 @@ jobs:
25
25
  fetch-depth: 0
26
26
 
27
27
  - name: Install uv (official Astral action)
28
- uses: astral-sh/setup-uv@v7
28
+ uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
29
29
  with:
30
- version: "0.9.25"
31
- enable-cache: true
30
+ version: "0.11.29"
31
+ enable-cache: auto
32
32
  python-version: ${{ matrix.python-version }}
33
33
 
34
34
  - name: Set up Python (using uv)
@@ -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:
@@ -22,10 +24,10 @@ jobs:
22
24
  uses: actions/checkout@v6
23
25
 
24
26
  - name: Install uv
25
- uses: astral-sh/setup-uv@v7
27
+ uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
26
28
  with:
27
- version: "0.9.25"
28
- enable-cache: true
29
+ version: "0.11.29"
30
+ enable-cache: auto
29
31
  python-version: "3.12"
30
32
 
31
33
  - name: Set up Python
@@ -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:
@@ -18,10 +18,10 @@ jobs:
18
18
  fetch-depth: 0
19
19
 
20
20
  - name: Install uv (official Astral action)
21
- uses: astral-sh/setup-uv@v7
21
+ uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
22
22
  with:
23
- version: "0.9.25"
24
- enable-cache: true
23
+ version: "0.11.29"
24
+ enable-cache: auto
25
25
  python-version: "3.12"
26
26
 
27
27
  - name: Set up Python (using uv)
@@ -27,4 +27,5 @@ htmlcov/
27
27
 
28
28
  # Docs
29
29
  site/
30
+ docs/reference/
30
31
 
@@ -1,9 +1,9 @@
1
- # CLAUDE.md
1
+ # laddercodec Agent Guidance
2
2
 
3
3
  **IMPORTANT: Don't use `cd` before commands. The working directory is already set to the project root.**
4
4
  **IMPORTANT: Always use `make` commands, not direct `uv run` commands.**
5
5
 
6
- This file provides guidance to Claude Code when working with code in this repository.
6
+ This file provides guidance to coding agents working in this repository.
7
7
 
8
8
  ## Project Overview
9
9
 
@@ -115,7 +115,7 @@ tests/
115
115
  └── tumbler/ # 34 real programs: <name>.scr + <name>.clipboard.{bin,csv}
116
116
  ```
117
117
 
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.
118
+ 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
119
 
120
120
  ## Binary Format
121
121
 
@@ -127,7 +127,7 @@ Quick reference: three regions — program header (0x0254), payload region (0x02
127
127
 
128
128
  Full spec: [`docs/internals/wire-rendering.md`](docs/internals/wire-rendering.md) — flag bytes, left-edge rendering, segment flag boundary rules.
129
129
 
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.
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. The encoder treats row 0 as exempt; native segment flags retain editing history.
131
131
 
132
132
  ## Instruction Blobs
133
133
 
@@ -160,7 +160,7 @@ All tested shapes pass Click round-trip (verified via paste → copy-back):
160
160
 
161
161
  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
162
 
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".
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). 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
164
 
165
165
  **All standard Click instruction types decoded natively:**
166
166
  - Contacts: NO, NC, edge (rise/fall), immediate (NO/NC)
@@ -8,12 +8,34 @@
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.2 (2026-09-10)
12
+
13
+ ### Fixed
14
+ - **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.
15
+ - **SCR decode**: preserve branch wiring above a later rail-connected row instead of deleting the branch and shifting the lower wire upward.
16
+
17
+ ### Added
18
+ - **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.
19
+
20
+ ### Documentation
21
+ - Correct SCR flag meanings and fixture provenance, and distinguish native persisted flags from the encoder's construction conventions.
22
+
23
+ ## 0.2.1 (2026-08-25)
24
+
25
+ ### Fixed
26
+ - **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).
27
+ - **CSV writer**: a `count_up` with `.reset()` wired but `.down()` unused always dehydrates the empty `.down()` row, so the `.reset()` pin row directly follows the counter row even when the reset branch has a floating OR-leg below it.
28
+ - **CSV read**: rows after a counter/shift `.reset()` pin row stay below the instruction's span instead of being absorbed into it, which misplaced a floating OR-leg onto the unused `.down()` row.
29
+
30
+ ### Added
31
+ - **Tests**: synthetic regression coverage for default-elided Send/Receive fields and for floating OR-leg rows below every pinned instruction span (timer, count_up, count_down, shift).
32
+
11
33
  ## 0.2.0
12
34
 
13
35
  ### Fixed
14
36
  - **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.
15
37
  - **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.
16
- - **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.
38
+ - **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.
17
39
 
18
40
  ### Changed
19
41
  - **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.
@@ -0,0 +1 @@
1
+ @AGENTS.md
@@ -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.2.2
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)
@@ -150,12 +150,12 @@ def main() -> None:
150
150
  print(f"{'=' * 60}")
151
151
 
152
152
  result = decode(data)
153
- if isinstance(result, list):
153
+ if isinstance(result, Rung):
154
+ _print_rung(result, 0)
155
+ else:
154
156
  print(f" Multi-rung: {len(result)} rungs")
155
157
  for i, rung in enumerate(result):
156
158
  _print_rung(rung, i)
157
- else:
158
- _print_rung(result, 0)
159
159
 
160
160
 
161
161
  if __name__ == "__main__":
@@ -1,4 +1,4 @@
1
- # laddercodec Documentation — Context for Claude
1
+ # laddercodec Documentation — Agent Context
2
2
 
3
3
  ## What is laddercodec
4
4
 
@@ -0,0 +1 @@
1
+ @AGENTS.md
@@ -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())
@@ -1,4 +1,4 @@
1
- """Generate curated MkDocs API reference pages for laddercodec public exports."""
1
+ """Generate curated API reference pages for laddercodec public exports."""
2
2
 
3
3
  from __future__ import annotations
4
4
 
@@ -7,9 +7,8 @@ from dataclasses import dataclass
7
7
  from importlib import import_module
8
8
  from pathlib import Path
9
9
 
10
- import mkdocs_gen_files
11
-
12
10
  PACKAGE = "laddercodec"
11
+ DOCS_DIR = Path(__file__).parent
13
12
 
14
13
 
15
14
  @dataclass(frozen=True)
@@ -109,9 +108,9 @@ def _write_reference_page(page: ReferencePage) -> None:
109
108
  lines.append(f"::: {PACKAGE}.{symbol}")
110
109
  lines.append("")
111
110
 
112
- with mkdocs_gen_files.open(doc_rel_path, "w") as fd:
113
- fd.write("\n".join(lines).rstrip() + "\n")
114
- mkdocs_gen_files.set_edit_path(doc_rel_path, Path("docs/gen_reference.py"))
111
+ destination = DOCS_DIR / doc_rel_path
112
+ destination.parent.mkdir(parents=True, exist_ok=True)
113
+ destination.write_text("\n".join(lines).rstrip() + "\n", encoding="utf-8")
115
114
 
116
115
 
117
116
  def _write_index() -> None:
@@ -133,9 +132,9 @@ def _write_index() -> None:
133
132
  for page in advanced_pages:
134
133
  lines.append(f"- [{page.title}](api/{page.slug}.md)")
135
134
 
136
- with mkdocs_gen_files.open("reference/index.md", "w") as fd:
137
- fd.write("\n".join(lines).rstrip() + "\n")
138
- mkdocs_gen_files.set_edit_path("reference/index.md", Path("docs/gen_reference.py"))
135
+ destination = DOCS_DIR / "reference/index.md"
136
+ destination.parent.mkdir(parents=True, exist_ok=True)
137
+ destination.write_text("\n".join(lines).rstrip() + "\n", encoding="utf-8")
139
138
 
140
139
 
141
140
  _validate_manifest()