laddercodec 0.2.1__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.1 → laddercodec-0.2.2}/.github/workflows/docs.yml +13 -3
  4. {laddercodec-0.2.1 → laddercodec-0.2.2}/.gitignore +1 -0
  5. {laddercodec-0.2.1 → laddercodec-0.2.2}/AGENTS.md +3 -3
  6. {laddercodec-0.2.1 → laddercodec-0.2.2}/CHANGELOG.md +14 -2
  7. {laddercodec-0.2.1 → laddercodec-0.2.2}/Makefile +11 -5
  8. laddercodec-0.2.2/PKG-INFO +97 -0
  9. laddercodec-0.2.2/README.md +75 -0
  10. laddercodec-0.2.2/docs/gen_llms.py +95 -0
  11. {laddercodec-0.2.1 → laddercodec-0.2.2}/docs/gen_reference.py +8 -9
  12. {laddercodec-0.2.1 → laddercodec-0.2.2}/docs/guides/csv-format.md +6 -6
  13. {laddercodec-0.2.1 → laddercodec-0.2.2}/docs/guides/troubleshooting.md +1 -1
  14. {laddercodec-0.2.1 → laddercodec-0.2.2}/docs/index.md +6 -4
  15. {laddercodec-0.2.1 → laddercodec-0.2.2}/docs/internals/binary-format.md +71 -30
  16. {laddercodec-0.2.1 → laddercodec-0.2.2}/docs/internals/wire-rendering.md +14 -4
  17. laddercodec-0.2.2/docs/stylesheets/extra.css +12 -0
  18. {laddercodec-0.2.1 → laddercodec-0.2.2}/mkdocs.yml +18 -15
  19. {laddercodec-0.2.1 → laddercodec-0.2.2}/pyproject.toml +2 -5
  20. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/_grid.py +1 -1
  21. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/cell.py +8 -5
  22. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/decode.py +4 -0
  23. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/decode_program.py +152 -267
  24. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/encode.py +4 -1
  25. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-coil-timer-ret.bin +0 -0
  26. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-coil-timer-ret.csv +2 -2
  27. laddercodec-0.2.2/tests/fixtures/scr_captures/README.md +31 -0
  28. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/scr_captures/or_topology.csv +9 -9
  29. laddercodec-0.2.2/tests/fixtures/scr_captures/time_drum_b_column.bin +0 -0
  30. laddercodec-0.2.2/tests/fixtures/scr_captures/time_drum_b_column.csv +4 -0
  31. laddercodec-0.2.2/tests/fixtures/scr_captures/time_drum_b_column.scr +0 -0
  32. laddercodec-0.2.2/tests/fixtures/scr_captures/time_drum_insert_rows.bin +0 -0
  33. laddercodec-0.2.2/tests/fixtures/scr_captures/time_drum_insert_rows.csv +11 -0
  34. laddercodec-0.2.2/tests/fixtures/scr_captures/time_drum_insert_rows.png +0 -0
  35. laddercodec-0.2.2/tests/fixtures/scr_captures/time_drum_insert_rows.scr +0 -0
  36. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/ladder/test_decode_program.py +284 -54
  37. {laddercodec-0.2.1 → laddercodec-0.2.2}/uv.lock +97 -354
  38. laddercodec-0.2.1/PKG-INFO +0 -96
  39. laddercodec-0.2.1/README.md +0 -74
  40. {laddercodec-0.2.1 → laddercodec-0.2.2}/.claude/settings.local.json +0 -0
  41. {laddercodec-0.2.1 → laddercodec-0.2.2}/.github/workflows/ci.yml +0 -0
  42. {laddercodec-0.2.1 → laddercodec-0.2.2}/.github/workflows/publish.yml +0 -0
  43. {laddercodec-0.2.1 → laddercodec-0.2.2}/CLAUDE.md +0 -0
  44. {laddercodec-0.2.1 → laddercodec-0.2.2}/LICENSE +0 -0
  45. {laddercodec-0.2.1 → laddercodec-0.2.2}/add-features-workflow.md +0 -0
  46. {laddercodec-0.2.1 → laddercodec-0.2.2}/devtools/analyze_scr.py +0 -0
  47. {laddercodec-0.2.1 → laddercodec-0.2.2}/devtools/combine_coverage.py +0 -0
  48. {laddercodec-0.2.1 → laddercodec-0.2.2}/devtools/compare_blobs.py +0 -0
  49. {laddercodec-0.2.1 → laddercodec-0.2.2}/devtools/compare_csv.py +0 -0
  50. {laddercodec-0.2.1 → laddercodec-0.2.2}/devtools/coverage_golden.py +0 -0
  51. {laddercodec-0.2.1 → laddercodec-0.2.2}/devtools/create_mr_max_csv.py +0 -0
  52. {laddercodec-0.2.1 → laddercodec-0.2.2}/devtools/diag_blob.py +0 -0
  53. {laddercodec-0.2.1 → laddercodec-0.2.2}/devtools/dump_scr_tags.py +0 -0
  54. {laddercodec-0.2.1 → laddercodec-0.2.2}/devtools/gen_modbus_coverage.py +0 -0
  55. {laddercodec-0.2.1 → laddercodec-0.2.2}/devtools/golden.py +0 -0
  56. {laddercodec-0.2.1 → laddercodec-0.2.2}/devtools/inspect_bin.py +0 -0
  57. {laddercodec-0.2.1 → laddercodec-0.2.2}/devtools/inspect_scr.py +0 -0
  58. {laddercodec-0.2.1 → laddercodec-0.2.2}/devtools/lint.py +0 -0
  59. {laddercodec-0.2.1 → laddercodec-0.2.2}/devtools/pdf_to_png.py +0 -0
  60. {laddercodec-0.2.1 → laddercodec-0.2.2}/devtools/test_decode_scr.py +0 -0
  61. {laddercodec-0.2.1 → laddercodec-0.2.2}/devtools/validate_scr.py +0 -0
  62. {laddercodec-0.2.1 → laddercodec-0.2.2}/devtools/walk_scr.py +0 -0
  63. {laddercodec-0.2.1 → laddercodec-0.2.2}/docs/AGENTS.md +0 -0
  64. {laddercodec-0.2.1 → laddercodec-0.2.2}/docs/CLAUDE.md +0 -0
  65. {laddercodec-0.2.1 → laddercodec-0.2.2}/docs/guides/adding-instructions.md +0 -0
  66. {laddercodec-0.2.1 → laddercodec-0.2.2}/docs/guides/decoding.md +0 -0
  67. {laddercodec-0.2.1 → laddercodec-0.2.2}/docs/guides/encoding.md +0 -0
  68. {laddercodec-0.2.1 → laddercodec-0.2.2}/docs/internals/instruction-blobs.md +0 -0
  69. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/__init__.py +0 -0
  70. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/binary_helpers.py +0 -0
  71. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/csv/__init__.py +0 -0
  72. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/csv/ast.py +0 -0
  73. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/csv/bundle.py +0 -0
  74. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/csv/contract.py +0 -0
  75. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/csv/converter.py +0 -0
  76. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/csv/parser.py +0 -0
  77. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/csv/token_parser.py +0 -0
  78. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/csv/writer.py +0 -0
  79. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/empty_multirow.py +0 -0
  80. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/encode_multi.py +0 -0
  81. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/__init__.py +0 -0
  82. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/call.py +0 -0
  83. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/coil.py +0 -0
  84. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/comparison.py +0 -0
  85. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/contact.py +0 -0
  86. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/copy.py +0 -0
  87. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/counter.py +0 -0
  88. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/drum.py +0 -0
  89. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/email.py +0 -0
  90. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/end.py +0 -0
  91. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/family.py +0 -0
  92. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/forloop.py +0 -0
  93. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/home.py +0 -0
  94. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/math.py +0 -0
  95. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/position.py +0 -0
  96. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/raw.py +0 -0
  97. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/return_.py +0 -0
  98. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/search.py +0 -0
  99. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/send_receive.py +0 -0
  100. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/shift.py +0 -0
  101. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/timer.py +0 -0
  102. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/velocity.py +0 -0
  103. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/model.py +0 -0
  104. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/resources/empty_multirow_rule_minimal.scaffold.bin +0 -0
  105. {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/topology.py +0 -0
  106. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/__init__.py +0 -0
  107. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/csv/test_bundle.py +0 -0
  108. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/csv/test_contract.py +0 -0
  109. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/csv/test_converter.py +0 -0
  110. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/csv/test_parser.py +0 -0
  111. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/csv/test_token_parser.py +0 -0
  112. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/csv/test_writer.py +0 -0
  113. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/csv/test_writer_raw_validator.py +0 -0
  114. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/coverage.ckp +0 -0
  115. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/blockcopy__block.bin +0 -0
  116. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/blockcopy__block.csv +0 -0
  117. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/blockcopy__oneshot.bin +0 -0
  118. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/blockcopy__oneshot.csv +0 -0
  119. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/blockcopy__to_ascii.bin +0 -0
  120. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/blockcopy__to_ascii.csv +0 -0
  121. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/blockcopy__to_value.bin +0 -0
  122. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/blockcopy__to_value.csv +0 -0
  123. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/call__basic.bin +0 -0
  124. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/call__basic.csv +0 -0
  125. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__and.bin +0 -0
  126. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__and.csv +0 -0
  127. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__eq.bin +0 -0
  128. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__eq.csv +0 -0
  129. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__fall.bin +0 -0
  130. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__fall.csv +0 -0
  131. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__ge.bin +0 -0
  132. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__ge.csv +0 -0
  133. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__gt.bin +0 -0
  134. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__gt.csv +0 -0
  135. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__immediate.bin +0 -0
  136. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__immediate.csv +0 -0
  137. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__le.bin +0 -0
  138. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__le.csv +0 -0
  139. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__lt.bin +0 -0
  140. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__lt.csv +0 -0
  141. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__nc.bin +0 -0
  142. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__nc.csv +0 -0
  143. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__ne.bin +0 -0
  144. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__ne.csv +0 -0
  145. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__no.bin +0 -0
  146. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__no.csv +0 -0
  147. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__or.bin +0 -0
  148. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__or.csv +0 -0
  149. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__rise.bin +0 -0
  150. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__rise.csv +0 -0
  151. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__literal_float.bin +0 -0
  152. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__literal_float.csv +0 -0
  153. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__literal_int.bin +0 -0
  154. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__literal_int.csv +0 -0
  155. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__oneshot.bin +0 -0
  156. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__oneshot.csv +0 -0
  157. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__tag.bin +0 -0
  158. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__tag.csv +0 -0
  159. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_ascii.bin +0 -0
  160. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_ascii.csv +0 -0
  161. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_binary.bin +0 -0
  162. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_binary.csv +0 -0
  163. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_text.bin +0 -0
  164. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_text.csv +0 -0
  165. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_text_exp.bin +0 -0
  166. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_text_exp.csv +0 -0
  167. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_text_sz.bin +0 -0
  168. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_text_sz.csv +0 -0
  169. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_text_term.bin +0 -0
  170. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_text_term.csv +0 -0
  171. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_value.bin +0 -0
  172. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_value.csv +0 -0
  173. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/count_down.bin +0 -0
  174. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/count_down.csv +0 -0
  175. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/count_up__down.bin +0 -0
  176. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/count_up__down.csv +0 -0
  177. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/count_up__reset.bin +0 -0
  178. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/count_up__reset.csv +0 -0
  179. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/end.bin +0 -0
  180. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/end.csv +0 -0
  181. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/event_drum__basic.bin +0 -0
  182. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/event_drum__basic.csv +0 -0
  183. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/event_drum__full.bin +0 -0
  184. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/event_drum__full.csv +0 -0
  185. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/event_drum__jog.bin +0 -0
  186. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/event_drum__jog.csv +0 -0
  187. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/event_drum__jump.bin +0 -0
  188. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/event_drum__jump.csv +0 -0
  189. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/event_drum__max.bin +0 -0
  190. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/event_drum__max.csv +0 -0
  191. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/fill__literal.bin +0 -0
  192. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/fill__literal.csv +0 -0
  193. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/fill__oneshot.bin +0 -0
  194. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/fill__oneshot.csv +0 -0
  195. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/fill__tag.bin +0 -0
  196. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/fill__tag.csv +0 -0
  197. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/forloop__basic.bin +0 -0
  198. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/forloop__basic.csv +0 -0
  199. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/forloop__oneshot.bin +0 -0
  200. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/forloop__oneshot.csv +0 -0
  201. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/latch__block.bin +0 -0
  202. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/latch__block.csv +0 -0
  203. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/latch__immediate.bin +0 -0
  204. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/latch__immediate.csv +0 -0
  205. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/latch__tag.bin +0 -0
  206. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/latch__tag.csv +0 -0
  207. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/math__decimal.bin +0 -0
  208. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/math__decimal.csv +0 -0
  209. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/math__hex.bin +0 -0
  210. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/math__hex.csv +0 -0
  211. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/math__oneshot.bin +0 -0
  212. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/math__oneshot.csv +0 -0
  213. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/off_delay__tof.bin +0 -0
  214. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/off_delay__tof.csv +0 -0
  215. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/on_delay__rton.bin +0 -0
  216. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/on_delay__rton.csv +0 -0
  217. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/on_delay__ton.bin +0 -0
  218. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/on_delay__ton.csv +0 -0
  219. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/out__block.bin +0 -0
  220. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/out__block.csv +0 -0
  221. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/out__immediate.bin +0 -0
  222. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/out__immediate.csv +0 -0
  223. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/out__oneshot.bin +0 -0
  224. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/out__oneshot.csv +0 -0
  225. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/out__tag.bin +0 -0
  226. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/out__tag.csv +0 -0
  227. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_bits.bin +0 -0
  228. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_bits.csv +0 -0
  229. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_bits__oneshot.bin +0 -0
  230. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_bits__oneshot.csv +0 -0
  231. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_text.bin +0 -0
  232. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_text.csv +0 -0
  233. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_text__allow_whitespace.bin +0 -0
  234. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_text__allow_whitespace.csv +0 -0
  235. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_text__oneshot.bin +0 -0
  236. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_text__oneshot.csv +0 -0
  237. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_words.bin +0 -0
  238. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_words.csv +0 -0
  239. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_words__oneshot.bin +0 -0
  240. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_words__oneshot.csv +0 -0
  241. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/raw_instructions__email.bin +0 -0
  242. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/raw_instructions__email.csv +0 -0
  243. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/raw_instructions__home.bin +0 -0
  244. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/raw_instructions__home.csv +0 -0
  245. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/raw_instructions__position.bin +0 -0
  246. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/raw_instructions__position.csv +0 -0
  247. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/raw_instructions__velocity.bin +0 -0
  248. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/raw_instructions__velocity.csv +0 -0
  249. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__rtu_click_block.bin +0 -0
  250. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__rtu_click_block.csv +0 -0
  251. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__rtu_click_single.bin +0 -0
  252. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__rtu_click_single.csv +0 -0
  253. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__rtu_modbus_block.bin +0 -0
  254. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__rtu_modbus_block.csv +0 -0
  255. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__rtu_modbus_single.bin +0 -0
  256. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__rtu_modbus_single.csv +0 -0
  257. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__tcp_click_coil.bin +0 -0
  258. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__tcp_click_coil.csv +0 -0
  259. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__tcp_click_input.bin +0 -0
  260. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__tcp_click_input.csv +0 -0
  261. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__tcp_click_input_reg.bin +0 -0
  262. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__tcp_click_input_reg.csv +0 -0
  263. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__tcp_click_wordswap.bin +0 -0
  264. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__tcp_click_wordswap.csv +0 -0
  265. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/reset__block.bin +0 -0
  266. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/reset__block.csv +0 -0
  267. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/reset__immediate.bin +0 -0
  268. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/reset__immediate.csv +0 -0
  269. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/reset__tag.bin +0 -0
  270. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/reset__tag.csv +0 -0
  271. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/return_early__basic.bin +0 -0
  272. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/return_early__basic.csv +0 -0
  273. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__continuous.bin +0 -0
  274. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__continuous.csv +0 -0
  275. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__eq.bin +0 -0
  276. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__eq.csv +0 -0
  277. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__ge.bin +0 -0
  278. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__ge.csv +0 -0
  279. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__gt.bin +0 -0
  280. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__gt.csv +0 -0
  281. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__le.bin +0 -0
  282. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__le.csv +0 -0
  283. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__lt.bin +0 -0
  284. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__lt.csv +0 -0
  285. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__ne.bin +0 -0
  286. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__ne.csv +0 -0
  287. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__oneshot.bin +0 -0
  288. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__oneshot.csv +0 -0
  289. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__error_off.bin +0 -0
  290. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__error_off.csv +0 -0
  291. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__errorcode_off.bin +0 -0
  292. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__errorcode_off.csv +0 -0
  293. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__rtu_click_block.bin +0 -0
  294. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__rtu_click_block.csv +0 -0
  295. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__rtu_click_single.bin +0 -0
  296. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__rtu_click_single.csv +0 -0
  297. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__rtu_modbus_block.bin +0 -0
  298. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__rtu_modbus_block.csv +0 -0
  299. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__rtu_modbus_single.bin +0 -0
  300. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__rtu_modbus_single.csv +0 -0
  301. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__sending_off.bin +0 -0
  302. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__sending_off.csv +0 -0
  303. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__success_off.bin +0 -0
  304. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__success_off.csv +0 -0
  305. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__tcp_click_coil.bin +0 -0
  306. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__tcp_click_coil.csv +0 -0
  307. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__tcp_click_coils.bin +0 -0
  308. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__tcp_click_coils.csv +0 -0
  309. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__tcp_click_wordswap.bin +0 -0
  310. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__tcp_click_wordswap.csv +0 -0
  311. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/shift__basic.bin +0 -0
  312. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/shift__basic.csv +0 -0
  313. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/time_drum__basic.bin +0 -0
  314. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/time_drum__basic.csv +0 -0
  315. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/time_drum__basic_td.bin +0 -0
  316. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/time_drum__basic_td.csv +0 -0
  317. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/unpack_to_bits.bin +0 -0
  318. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/unpack_to_bits.csv +0 -0
  319. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/unpack_to_bits__oneshot.bin +0 -0
  320. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/unpack_to_bits__oneshot.csv +0 -0
  321. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/unpack_to_words.bin +0 -0
  322. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/unpack_to_words.csv +0 -0
  323. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/unpack_to_words__oneshot.bin +0 -0
  324. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/unpack_to_words__oneshot.csv +0 -0
  325. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/verify_progress.log +0 -0
  326. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/subroutines/coverage_sub.csv +0 -0
  327. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/drum_weird_branch.bin +0 -0
  328. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-1row-fullwire-nop.bin +0 -0
  329. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-1row-fullwire-nop.csv +0 -0
  330. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-1row-max1400.bin +0 -0
  331. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-1row-max1400.csv +0 -0
  332. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-1row-styled-mixed.bin +0 -0
  333. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-1row-styled-mixed.csv +0 -0
  334. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-2row-max1324.bin +0 -0
  335. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-2row-max1324.csv +0 -0
  336. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-2row-nop-wire.bin +0 -0
  337. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-2row-nop-wire.csv +0 -0
  338. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-32row-sparse.bin +0 -0
  339. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-32row-sparse.csv +0 -0
  340. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-3row-mixed.bin +0 -0
  341. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-3row-mixed.csv +0 -0
  342. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-2row-cond__and.bin +0 -0
  343. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-2row-cond__and.csv +0 -0
  344. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-2row-r0only.bin +0 -0
  345. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-2row-r0only.csv +0 -0
  346. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-2row-spread.bin +0 -0
  347. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-2row-spread.csv +0 -0
  348. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-3row-branch.bin +0 -0
  349. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-3row-branch.csv +0 -0
  350. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-3row-or-colA.bin +0 -0
  351. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-3row-or-colA.csv +0 -0
  352. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-3row-or.bin +0 -0
  353. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-3row-or.csv +0 -0
  354. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-3row-scatter.bin +0 -0
  355. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-3row-scatter.csv +0 -0
  356. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-6row-multi-output.bin +0 -0
  357. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-6row-multi-output.csv +0 -0
  358. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-compare-ge.bin +0 -0
  359. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-compare-ge.csv +0 -0
  360. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-compare-series.bin +0 -0
  361. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-compare-series.csv +0 -0
  362. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-compare-timer.bin +0 -0
  363. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-compare-timer.csv +0 -0
  364. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-cond__and.bin +0 -0
  365. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-cond__and.csv +0 -0
  366. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-copy-multirow-2af-T.bin +0 -0
  367. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-copy-multirow-2af-T.csv +0 -0
  368. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-copy-multirow-2af.bin +0 -0
  369. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-copy-multirow-2af.csv +0 -0
  370. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-count_down-row0-data.bin +0 -0
  371. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-count_down-row0-data.csv +0 -0
  372. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-no-out.bin +0 -0
  373. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-no-out.csv +0 -0
  374. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-series.bin +0 -0
  375. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-series.csv +0 -0
  376. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-timer-off.bin +0 -0
  377. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-timer-off.csv +0 -0
  378. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-timer-on.bin +0 -0
  379. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-timer-on.csv +0 -0
  380. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-timer-ret.bin +0 -0
  381. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-timer-ret.csv +0 -0
  382. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-2rung-2row.bin +0 -0
  383. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-2rung-2row.csv +0 -0
  384. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-2rung-wire.bin +0 -0
  385. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-2rung-wire.csv +0 -0
  386. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-3rung-wire-nop.bin +0 -0
  387. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-3rung-wire-nop.csv +0 -0
  388. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-2row.bin +0 -0
  389. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-2row.csv +0 -0
  390. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-both.bin +0 -0
  391. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-both.csv +0 -0
  392. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-r1-max1400.bin +0 -0
  393. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-r1-max1400.csv +0 -0
  394. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-all.bin +0 -0
  395. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-all.csv +0 -0
  396. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow-multiinstructions.bin +0 -0
  397. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow-multiinstructions.csv +0 -0
  398. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow-nopaddedrows.bin +0 -0
  399. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow-nopaddedrows.csv +0 -0
  400. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow.bin +0 -0
  401. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow.csv +0 -0
  402. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-instr-2rung.bin +0 -0
  403. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-instr-2rung.csv +0 -0
  404. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-instr-cond__and.bin +0 -0
  405. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-instr-cond__and.csv +0 -0
  406. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/nc-1row-empty.bin +0 -0
  407. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/nc-1row-empty.csv +0 -0
  408. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/nc-1row-fullwire-nop.bin +0 -0
  409. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/nc-1row-fullwire-nop.csv +0 -0
  410. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/nc-32row-empty.bin +0 -0
  411. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/nc-32row-empty.csv +0 -0
  412. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/nc-3row-t-junction.bin +0 -0
  413. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/nc-3row-t-junction.csv +0 -0
  414. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/nc-4row-vertical.bin +0 -0
  415. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/nc-4row-vertical.csv +0 -0
  416. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/verify_progress.log +0 -0
  417. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/scr_captures/counter_scr.bin +0 -0
  418. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/scr_captures/counter_scr.csv +0 -0
  419. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/scr_captures/counter_scr.scr +0 -0
  420. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/scr_captures/coverage.bin +0 -0
  421. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/scr_captures/coverage.csv +0 -0
  422. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/scr_captures/coverage.scr +0 -0
  423. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/scr_captures/or_topology.bin +0 -0
  424. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/scr_captures/or_topology.scr +0 -0
  425. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/scr_captures/shift_scr.bin +0 -0
  426. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/scr_captures/shift_scr.csv +0 -0
  427. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/scr_captures/shift_scr.scr +0 -0
  428. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/scr_captures/time_drums.bin +0 -0
  429. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/scr_captures/time_drums.csv +0 -0
  430. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/scr_captures/time_drums.scr +0 -0
  431. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/main.clipboard.bin +0 -0
  432. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/main.clipboard.csv +0 -0
  433. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/main.csv +0 -0
  434. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/main.scr +0 -0
  435. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AckAlarm.clipboard.bin +0 -0
  436. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AckAlarm.clipboard.csv +0 -0
  437. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AckAlarm.csv +0 -0
  438. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AckAlarm.scr +0 -0
  439. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AckAndClearAllAlarms.clipboard.bin +0 -0
  440. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AckAndClearAllAlarms.clipboard.csv +0 -0
  441. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AckAndClearAllAlarms.csv +0 -0
  442. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AckAndClearAllAlarms.scr +0 -0
  443. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AckWarning.clipboard.bin +0 -0
  444. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AckWarning.clipboard.csv +0 -0
  445. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AckWarning.csv +0 -0
  446. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AckWarning.scr +0 -0
  447. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AlmHistorian.clipboard.bin +0 -0
  448. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AlmHistorian.clipboard.csv +0 -0
  449. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AlmHistorian.csv +0 -0
  450. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AlmHistorian.scr +0 -0
  451. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Blower.clipboard.bin +0 -0
  452. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Blower.clipboard.csv +0 -0
  453. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Blower.csv +0 -0
  454. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Blower.scr +0 -0
  455. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/DisableOutputs.clipboard.bin +0 -0
  456. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/DisableOutputs.clipboard.csv +0 -0
  457. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/DisableOutputs.csv +0 -0
  458. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/DisableOutputs.scr +0 -0
  459. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Heat.clipboard.bin +0 -0
  460. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Heat.clipboard.csv +0 -0
  461. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Heat.csv +0 -0
  462. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Heat.scr +0 -0
  463. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Init.clipboard.bin +0 -0
  464. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Init.clipboard.csv +0 -0
  465. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Init.csv +0 -0
  466. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Init.scr +0 -0
  467. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Maint.clipboard.bin +0 -0
  468. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Maint.clipboard.csv +0 -0
  469. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Maint.csv +0 -0
  470. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Maint.scr +0 -0
  471. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Manual.clipboard.bin +0 -0
  472. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Manual.clipboard.csv +0 -0
  473. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Manual.csv +0 -0
  474. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Manual.scr +0 -0
  475. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ModeChange.clipboard.bin +0 -0
  476. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ModeChange.clipboard.csv +0 -0
  477. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ModeChange.csv +0 -0
  478. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ModeChange.scr +0 -0
  479. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/PLCDateTime.clipboard.bin +0 -0
  480. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/PLCDateTime.clipboard.csv +0 -0
  481. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/PLCDateTime.csv +0 -0
  482. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/PLCDateTime.scr +0 -0
  483. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/PLCErrors.clipboard.bin +0 -0
  484. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/PLCErrors.clipboard.csv +0 -0
  485. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/PLCErrors.csv +0 -0
  486. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/PLCErrors.scr +0 -0
  487. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionBoilerplate.clipboard.bin +0 -0
  488. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionBoilerplate.clipboard.csv +0 -0
  489. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionBoilerplate.csv +0 -0
  490. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionBoilerplate.scr +0 -0
  491. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionErrors.clipboard.bin +0 -0
  492. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionErrors.clipboard.csv +0 -0
  493. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionErrors.csv +0 -0
  494. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionErrors.scr +0 -0
  495. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionExecuteSteps.clipboard.bin +0 -0
  496. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionExecuteSteps.clipboard.csv +0 -0
  497. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionExecuteSteps.csv +0 -0
  498. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionExecuteSteps.scr +0 -0
  499. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionHMI.clipboard.bin +0 -0
  500. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionHMI.clipboard.csv +0 -0
  501. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionHMI.csv +0 -0
  502. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionHMI.scr +0 -0
  503. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionStates.clipboard.bin +0 -0
  504. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionStates.clipboard.csv +0 -0
  505. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionStates.csv +0 -0
  506. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionStates.scr +0 -0
  507. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ReadInputs.clipboard.bin +0 -0
  508. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ReadInputs.clipboard.csv +0 -0
  509. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ReadInputs.csv +0 -0
  510. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ReadInputs.scr +0 -0
  511. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/RecipeChange.clipboard.bin +0 -0
  512. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/RecipeChange.clipboard.csv +0 -0
  513. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/RecipeChange.csv +0 -0
  514. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/RecipeChange.scr +0 -0
  515. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Rotate.clipboard.bin +0 -0
  516. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Rotate.clipboard.csv +0 -0
  517. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Rotate.csv +0 -0
  518. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Rotate.scr +0 -0
  519. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/SFCExample.clipboard.bin +0 -0
  520. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/SFCExample.clipboard.csv +0 -0
  521. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/SFCExample.csv +0 -0
  522. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/SFCExample.scr +0 -0
  523. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/SetOutputs.clipboard.bin +0 -0
  524. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/SetOutputs.clipboard.csv +0 -0
  525. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/SetOutputs.csv +0 -0
  526. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/SetOutputs.scr +0 -0
  527. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/SetOutputsManual.clipboard.bin +0 -0
  528. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/SetOutputsManual.clipboard.csv +0 -0
  529. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/SetOutputsManual.csv +0 -0
  530. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/SetOutputsManual.scr +0 -0
  531. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ThermErrors.clipboard.bin +0 -0
  532. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ThermErrors.clipboard.csv +0 -0
  533. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ThermErrors.csv +0 -0
  534. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ThermErrors.scr +0 -0
  535. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Validation.clipboard.bin +0 -0
  536. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Validation.clipboard.csv +0 -0
  537. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Validation.csv +0 -0
  538. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Validation.scr +0 -0
  539. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/WarnTimestamp.clipboard.bin +0 -0
  540. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/WarnTimestamp.clipboard.csv +0 -0
  541. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/WarnTimestamp.csv +0 -0
  542. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/WarnTimestamp.scr +0 -0
  543. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_CopyOrJumpState.clipboard.bin +0 -0
  544. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_CopyOrJumpState.clipboard.csv +0 -0
  545. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_CopyOrJumpState.csv +0 -0
  546. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_CopyOrJumpState.scr +0 -0
  547. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_CtrlCmd2StateRequest.clipboard.bin +0 -0
  548. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_CtrlCmd2StateRequest.clipboard.csv +0 -0
  549. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_CtrlCmd2StateRequest.csv +0 -0
  550. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_CtrlCmd2StateRequest.scr +0 -0
  551. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_IsCmdValid.clipboard.bin +0 -0
  552. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_IsCmdValid.clipboard.csv +0 -0
  553. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_IsCmdValid.csv +0 -0
  554. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_IsCmdValid.scr +0 -0
  555. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_MapCmd2Val.clipboard.bin +0 -0
  556. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_MapCmd2Val.clipboard.csv +0 -0
  557. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_MapCmd2Val.csv +0 -0
  558. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_MapCmd2Val.scr +0 -0
  559. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_MapVal2State.clipboard.bin +0 -0
  560. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_MapVal2State.clipboard.csv +0 -0
  561. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_MapVal2State.csv +0 -0
  562. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_MapVal2State.scr +0 -0
  563. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_StateComplete2Request.clipboard.bin +0 -0
  564. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_StateComplete2Request.clipboard.csv +0 -0
  565. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_StateComplete2Request.csv +0 -0
  566. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_StateComplete2Request.scr +0 -0
  567. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/golden_io.py +0 -0
  568. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/ladder/test_counter.py +0 -0
  569. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/ladder/test_decode.py +0 -0
  570. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/ladder/test_decode_multi.py +0 -0
  571. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/ladder/test_decode_program_tumbler.py +0 -0
  572. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/ladder/test_decode_rtf_oracle.py +0 -0
  573. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/ladder/test_empty_multirow.py +0 -0
  574. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/ladder/test_encode.py +0 -0
  575. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/ladder/test_encode_multi.py +0 -0
  576. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/ladder/test_forloop.py +0 -0
  577. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/ladder/test_math.py +0 -0
  578. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/ladder/test_model.py +0 -0
  579. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/ladder/test_shift.py +0 -0
  580. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/ladder/test_verify_status.py +0 -0
  581. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/test_coverage.py +0 -0
  582. {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/test_public_api.py +0 -0
  583. {laddercodec-0.2.1 → 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())
@@ -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
 
@@ -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,7 +8,19 @@
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.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)
12
24
 
13
25
  ### Fixed
14
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).
@@ -23,7 +35,7 @@
23
35
  ### Fixed
24
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.
25
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.
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.
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.
27
39
 
28
40
  ### Changed
29
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.
@@ -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)
@@ -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()
@@ -115,7 +115,7 @@ No explicit `+` topology token is emitted.
115
115
 
116
116
  ## Vertical topology
117
117
 
118
- OR conditions (`any_of`), multi-output stacking, and `branch()` conditions all
118
+ OR conditions (`Or()`), multi-output stacking, and `branch()` conditions all
119
119
  use continuation rows within a rung. These mechanisms share the same vertical
120
120
  space - OR branch rows double as multi-output and branch rows.
121
121
 
@@ -173,11 +173,11 @@ merge/split columns even when their own column has no marker below.
173
173
  conditions. Shared AND-prefix contacts from earlier columns are not repeated.
174
174
  - Each continuation row has at most one AF token or is blank in AF.
175
175
 
176
- ## `any_of(...)` OR expansion
176
+ ## `Or(...)` expansion
177
177
 
178
178
  ### Simple OR at power rail
179
179
 
180
- `any_of(X001, X002, X003)`:
180
+ `Or(X001, X002, X003)`:
181
181
 
182
182
  ```text
183
183
  A B ... AF
@@ -191,7 +191,7 @@ blank.
191
191
 
192
192
  ### Mid-rung OR
193
193
 
194
- `X001, any_of(X002, C1)`:
194
+ `X001, Or(X002, C1)`:
195
195
 
196
196
  ```text
197
197
  A B C ... AF
@@ -204,7 +204,7 @@ blank. Shared AND-prefix (`X001`) appears only on the first row.
204
204
 
205
205
  ### Series ORs
206
206
 
207
- `any_of(X001, X002), any_of(C1, C2)`:
207
+ `Or(X001, X002), Or(C1, C2)`:
208
208
 
209
209
  ```text
210
210
  A B C D ... AF
@@ -261,7 +261,7 @@ When a rung has both OR conditions and multiple outputs/branches, they share the
261
261
  same set of continuation rows. The OR branches provide the rows needed for the
262
262
  outputs.
263
263
 
264
- `X001, any_of(X002, X003, X004)` -> `out(Y001)`, `branch(C1): out(Y002)`,
264
+ `X001, Or(X002, X003, X004)` -> `out(Y001)`, `branch(C1): out(Y002)`,
265
265
  `out(Y003)`:
266
266
 
267
267
  ```text
@@ -70,7 +70,7 @@ The cell header is 0x25 (37) bytes. Key fields:
70
70
  | +0x09 | row_span | How many grid rows this cell occupies |
71
71
  | +0x0A | visual_rows | Visual sub-row count (1 = normal, 2 = timer, 3 = retained timer) |
72
72
  | +0x0D | instr_index | 4-byte LE signed. `-1` (0xFFFFFFFF) for data cells |
73
- | +0x15 | contact_flag | 4-byte LE |
73
+ | +0x15 | row_start_flag (column A) | 4-byte LE |
74
74
  | +0x19 | segment | 4-byte LE — load-bearing flag |
75
75
  | +0x1D | wire_right | 4-byte LE |
76
76
  | +0x21 | wire_down | 4-byte LE |
@@ -1,6 +1,8 @@
1
1
  # laddercodec
2
2
 
3
- **Binary codec for AutomationDirect CLICK PLC ladder clipboard format.** Encodes and decodes the native clipboard binary used by [CLICK Programming Software](https://www.automationdirect.com/clickplcs). Tested against v2.60-v3.9x captures. Zero runtime dependencies.
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.
4
6
 
5
7
  ## Install
6
8
 
@@ -31,17 +33,17 @@ print(rung.instructions)
31
33
 
32
34
  **[Encoder](guides/encoding.md)** — `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.
33
35
 
34
- **[Decoder](guides/decoding.md)** — `decode()` reads clipboard binary back into structured Python objects (contacts, coils, timers, wires, comments). `decode_program()` reads Click's internal `Scr*.tmp` program files.
36
+ **[Decoder](guides/decoding.md)** — `decode()` reads clipboard binary back into structured Python objects (contacts, coils, timers, wires, comments). `decode_program()` reads ladder data from native CLICK program files.
35
37
 
36
38
  **[CSV I/O](guides/csv-format.md)** — `read_csv()` and `write_csv()` convert between the 33-column canonical CSV format and `Rung` objects. Multi-file program bundles supported.
37
39
 
38
- **[Binary format docs](internals/binary-format.md)** — Byte-level reverse engineering of Click's clipboard and program file formats: buffer layout, cell grid, wire flags, instruction blobs, and multi-rung framing.
40
+ **[CLICK format reference](internals/binary-format.md)** — Technical reference for CLICK's native clipboard and program representations, including binary layouts and instruction records.
39
41
 
40
42
  ## Status
41
43
 
42
44
  `laddercodec` is **beta** for clipboard encode/decode, CSV I/O, and `decode_program()`.
43
45
 
44
- `Email`, `Home`, `Position`, and `Velocity` still intentionally surface as `raw(...)` passthroughs so binary and SCR round-trips stay lossless while those families remain opaque.
46
+ `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.
45
47
 
46
48
  ## Guide overview
47
49