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.
- laddercodec-0.2.2/.github/scripts/check_public_site.py +80 -0
- laddercodec-0.2.2/.github/scripts/prune_public_site.py +45 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/.github/workflows/docs.yml +13 -3
- {laddercodec-0.2.1 → laddercodec-0.2.2}/.gitignore +1 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/AGENTS.md +3 -3
- {laddercodec-0.2.1 → laddercodec-0.2.2}/CHANGELOG.md +14 -2
- {laddercodec-0.2.1 → laddercodec-0.2.2}/Makefile +11 -5
- laddercodec-0.2.2/PKG-INFO +97 -0
- laddercodec-0.2.2/README.md +75 -0
- laddercodec-0.2.2/docs/gen_llms.py +95 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/docs/gen_reference.py +8 -9
- {laddercodec-0.2.1 → laddercodec-0.2.2}/docs/guides/csv-format.md +6 -6
- {laddercodec-0.2.1 → laddercodec-0.2.2}/docs/guides/troubleshooting.md +1 -1
- {laddercodec-0.2.1 → laddercodec-0.2.2}/docs/index.md +6 -4
- {laddercodec-0.2.1 → laddercodec-0.2.2}/docs/internals/binary-format.md +71 -30
- {laddercodec-0.2.1 → laddercodec-0.2.2}/docs/internals/wire-rendering.md +14 -4
- laddercodec-0.2.2/docs/stylesheets/extra.css +12 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/mkdocs.yml +18 -15
- {laddercodec-0.2.1 → laddercodec-0.2.2}/pyproject.toml +2 -5
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/_grid.py +1 -1
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/cell.py +8 -5
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/decode.py +4 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/decode_program.py +152 -267
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/encode.py +4 -1
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-coil-timer-ret.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-coil-timer-ret.csv +2 -2
- laddercodec-0.2.2/tests/fixtures/scr_captures/README.md +31 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/scr_captures/or_topology.csv +9 -9
- laddercodec-0.2.2/tests/fixtures/scr_captures/time_drum_b_column.bin +0 -0
- laddercodec-0.2.2/tests/fixtures/scr_captures/time_drum_b_column.csv +4 -0
- laddercodec-0.2.2/tests/fixtures/scr_captures/time_drum_b_column.scr +0 -0
- laddercodec-0.2.2/tests/fixtures/scr_captures/time_drum_insert_rows.bin +0 -0
- laddercodec-0.2.2/tests/fixtures/scr_captures/time_drum_insert_rows.csv +11 -0
- laddercodec-0.2.2/tests/fixtures/scr_captures/time_drum_insert_rows.png +0 -0
- laddercodec-0.2.2/tests/fixtures/scr_captures/time_drum_insert_rows.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/ladder/test_decode_program.py +284 -54
- {laddercodec-0.2.1 → laddercodec-0.2.2}/uv.lock +97 -354
- laddercodec-0.2.1/PKG-INFO +0 -96
- laddercodec-0.2.1/README.md +0 -74
- {laddercodec-0.2.1 → laddercodec-0.2.2}/.claude/settings.local.json +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/.github/workflows/ci.yml +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/.github/workflows/publish.yml +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/CLAUDE.md +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/LICENSE +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/add-features-workflow.md +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/devtools/analyze_scr.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/devtools/combine_coverage.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/devtools/compare_blobs.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/devtools/compare_csv.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/devtools/coverage_golden.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/devtools/create_mr_max_csv.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/devtools/diag_blob.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/devtools/dump_scr_tags.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/devtools/gen_modbus_coverage.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/devtools/golden.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/devtools/inspect_bin.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/devtools/inspect_scr.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/devtools/lint.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/devtools/pdf_to_png.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/devtools/test_decode_scr.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/devtools/validate_scr.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/devtools/walk_scr.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/docs/AGENTS.md +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/docs/CLAUDE.md +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/docs/guides/adding-instructions.md +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/docs/guides/decoding.md +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/docs/guides/encoding.md +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/docs/internals/instruction-blobs.md +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/__init__.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/binary_helpers.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/csv/__init__.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/csv/ast.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/csv/bundle.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/csv/contract.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/csv/converter.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/csv/parser.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/csv/token_parser.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/csv/writer.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/empty_multirow.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/encode_multi.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/__init__.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/call.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/coil.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/comparison.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/contact.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/copy.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/counter.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/drum.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/email.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/end.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/family.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/forloop.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/home.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/math.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/position.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/raw.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/return_.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/search.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/send_receive.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/shift.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/timer.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/instructions/velocity.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/model.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/resources/empty_multirow_rule_minimal.scaffold.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/src/laddercodec/topology.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/__init__.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/csv/test_bundle.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/csv/test_contract.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/csv/test_converter.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/csv/test_parser.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/csv/test_token_parser.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/csv/test_writer.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/csv/test_writer_raw_validator.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/coverage.ckp +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/blockcopy__block.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/blockcopy__block.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/blockcopy__oneshot.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/blockcopy__oneshot.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/blockcopy__to_ascii.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/blockcopy__to_ascii.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/blockcopy__to_value.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/blockcopy__to_value.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/call__basic.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/call__basic.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__and.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__and.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__eq.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__eq.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__fall.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__fall.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__ge.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__ge.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__gt.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__gt.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__immediate.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__immediate.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__le.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__le.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__lt.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__lt.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__nc.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__nc.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__ne.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__ne.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__no.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__no.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__or.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__or.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__rise.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/cond__rise.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__literal_float.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__literal_float.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__literal_int.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__literal_int.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__oneshot.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__oneshot.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__tag.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__tag.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_ascii.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_ascii.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_binary.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_binary.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_text.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_text.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_text_exp.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_text_exp.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_text_sz.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_text_sz.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_text_term.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_text_term.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_value.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/copy__to_value.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/count_down.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/count_down.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/count_up__down.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/count_up__down.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/count_up__reset.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/count_up__reset.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/end.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/end.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/event_drum__basic.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/event_drum__basic.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/event_drum__full.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/event_drum__full.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/event_drum__jog.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/event_drum__jog.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/event_drum__jump.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/event_drum__jump.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/event_drum__max.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/event_drum__max.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/fill__literal.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/fill__literal.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/fill__oneshot.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/fill__oneshot.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/fill__tag.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/fill__tag.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/forloop__basic.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/forloop__basic.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/forloop__oneshot.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/forloop__oneshot.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/latch__block.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/latch__block.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/latch__immediate.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/latch__immediate.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/latch__tag.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/latch__tag.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/math__decimal.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/math__decimal.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/math__hex.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/math__hex.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/math__oneshot.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/math__oneshot.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/off_delay__tof.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/off_delay__tof.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/on_delay__rton.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/on_delay__rton.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/on_delay__ton.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/on_delay__ton.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/out__block.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/out__block.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/out__immediate.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/out__immediate.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/out__oneshot.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/out__oneshot.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/out__tag.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/out__tag.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_bits.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_bits.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_bits__oneshot.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_bits__oneshot.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_text.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_text.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_text__allow_whitespace.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_text__allow_whitespace.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_text__oneshot.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_text__oneshot.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_words.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_words.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_words__oneshot.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/pack_words__oneshot.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/raw_instructions__email.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/raw_instructions__email.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/raw_instructions__home.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/raw_instructions__home.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/raw_instructions__position.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/raw_instructions__position.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/raw_instructions__velocity.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/raw_instructions__velocity.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__rtu_click_block.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__rtu_click_block.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__rtu_click_single.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__rtu_click_single.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__rtu_modbus_block.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__rtu_modbus_block.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__rtu_modbus_single.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__rtu_modbus_single.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__tcp_click_coil.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__tcp_click_coil.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__tcp_click_input.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__tcp_click_input.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__tcp_click_input_reg.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__tcp_click_input_reg.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__tcp_click_wordswap.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/receive__tcp_click_wordswap.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/reset__block.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/reset__block.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/reset__immediate.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/reset__immediate.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/reset__tag.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/reset__tag.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/return_early__basic.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/return_early__basic.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__continuous.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__continuous.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__eq.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__eq.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__ge.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__ge.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__gt.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__gt.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__le.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__le.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__lt.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__lt.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__ne.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__ne.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__oneshot.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/search__oneshot.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__error_off.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__error_off.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__errorcode_off.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__errorcode_off.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__rtu_click_block.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__rtu_click_block.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__rtu_click_single.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__rtu_click_single.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__rtu_modbus_block.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__rtu_modbus_block.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__rtu_modbus_single.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__rtu_modbus_single.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__sending_off.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__sending_off.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__success_off.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__success_off.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__tcp_click_coil.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__tcp_click_coil.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__tcp_click_coils.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__tcp_click_coils.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__tcp_click_wordswap.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/send__tcp_click_wordswap.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/shift__basic.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/shift__basic.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/time_drum__basic.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/time_drum__basic.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/time_drum__basic_td.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/time_drum__basic_td.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/unpack_to_bits.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/unpack_to_bits.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/unpack_to_bits__oneshot.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/unpack_to_bits__oneshot.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/unpack_to_words.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/unpack_to_words.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/unpack_to_words__oneshot.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/unpack_to_words__oneshot.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/golden/verify_progress.log +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/coverage/subroutines/coverage_sub.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/drum_weird_branch.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-1row-fullwire-nop.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-1row-fullwire-nop.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-1row-max1400.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-1row-max1400.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-1row-styled-mixed.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-1row-styled-mixed.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-2row-max1324.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-2row-max1324.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-2row-nop-wire.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-2row-nop-wire.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-32row-sparse.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-32row-sparse.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-3row-mixed.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/cmt-3row-mixed.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-2row-cond__and.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-2row-cond__and.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-2row-r0only.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-2row-r0only.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-2row-spread.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-2row-spread.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-3row-branch.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-3row-branch.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-3row-or-colA.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-3row-or-colA.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-3row-or.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-3row-or.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-3row-scatter.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-3row-scatter.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-6row-multi-output.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-6row-multi-output.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-compare-ge.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-compare-ge.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-compare-series.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-compare-series.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-compare-timer.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-compare-timer.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-cond__and.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-cond__and.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-copy-multirow-2af-T.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-copy-multirow-2af-T.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-copy-multirow-2af.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-copy-multirow-2af.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-count_down-row0-data.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-count_down-row0-data.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-no-out.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-no-out.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-series.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-series.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-timer-off.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-timer-off.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-timer-on.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-timer-on.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-timer-ret.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/instr-timer-ret.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-2rung-2row.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-2rung-2row.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-2rung-wire.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-2rung-wire.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-3rung-wire-nop.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-3rung-wire-nop.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-2row.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-2row.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-both.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-both.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-r1-max1400.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-r1-max1400.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-all.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-all.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow-multiinstructions.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow-multiinstructions.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow-nopaddedrows.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow-nopaddedrows.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-instr-2rung.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-instr-2rung.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-instr-cond__and.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/mr-instr-cond__and.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/nc-1row-empty.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/nc-1row-empty.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/nc-1row-fullwire-nop.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/nc-1row-fullwire-nop.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/nc-32row-empty.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/nc-32row-empty.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/nc-3row-t-junction.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/nc-3row-t-junction.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/nc-4row-vertical.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/nc-4row-vertical.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/ladder_captures/golden/verify_progress.log +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/scr_captures/counter_scr.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/scr_captures/counter_scr.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/scr_captures/counter_scr.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/scr_captures/coverage.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/scr_captures/coverage.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/scr_captures/coverage.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/scr_captures/or_topology.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/scr_captures/or_topology.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/scr_captures/shift_scr.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/scr_captures/shift_scr.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/scr_captures/shift_scr.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/scr_captures/time_drums.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/scr_captures/time_drums.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/scr_captures/time_drums.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/main.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/main.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/main.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/main.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AckAlarm.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AckAlarm.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AckAlarm.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AckAlarm.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AckAndClearAllAlarms.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AckAndClearAllAlarms.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AckAndClearAllAlarms.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AckAndClearAllAlarms.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AckWarning.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AckWarning.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AckWarning.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AckWarning.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AlmHistorian.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AlmHistorian.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AlmHistorian.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/AlmHistorian.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Blower.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Blower.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Blower.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Blower.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/DisableOutputs.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/DisableOutputs.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/DisableOutputs.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/DisableOutputs.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Heat.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Heat.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Heat.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Heat.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Init.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Init.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Init.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Init.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Maint.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Maint.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Maint.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Maint.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Manual.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Manual.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Manual.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Manual.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ModeChange.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ModeChange.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ModeChange.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ModeChange.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/PLCDateTime.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/PLCDateTime.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/PLCDateTime.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/PLCDateTime.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/PLCErrors.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/PLCErrors.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/PLCErrors.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/PLCErrors.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionBoilerplate.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionBoilerplate.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionBoilerplate.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionBoilerplate.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionErrors.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionErrors.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionErrors.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionErrors.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionExecuteSteps.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionExecuteSteps.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionExecuteSteps.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionExecuteSteps.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionHMI.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionHMI.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionHMI.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionHMI.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionStates.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionStates.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionStates.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ProductionStates.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ReadInputs.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ReadInputs.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ReadInputs.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ReadInputs.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/RecipeChange.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/RecipeChange.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/RecipeChange.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/RecipeChange.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Rotate.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Rotate.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Rotate.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Rotate.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/SFCExample.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/SFCExample.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/SFCExample.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/SFCExample.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/SetOutputs.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/SetOutputs.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/SetOutputs.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/SetOutputs.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/SetOutputsManual.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/SetOutputsManual.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/SetOutputsManual.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/SetOutputsManual.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ThermErrors.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ThermErrors.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ThermErrors.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/ThermErrors.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Validation.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Validation.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Validation.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/Validation.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/WarnTimestamp.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/WarnTimestamp.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/WarnTimestamp.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/WarnTimestamp.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_CopyOrJumpState.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_CopyOrJumpState.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_CopyOrJumpState.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_CopyOrJumpState.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_CtrlCmd2StateRequest.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_CtrlCmd2StateRequest.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_CtrlCmd2StateRequest.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_CtrlCmd2StateRequest.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_IsCmdValid.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_IsCmdValid.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_IsCmdValid.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_IsCmdValid.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_MapCmd2Val.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_MapCmd2Val.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_MapCmd2Val.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_MapCmd2Val.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_MapVal2State.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_MapVal2State.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_MapVal2State.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_MapVal2State.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_StateComplete2Request.clipboard.bin +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_StateComplete2Request.clipboard.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_StateComplete2Request.csv +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/fixtures/tumbler/subroutines/sm_StateComplete2Request.scr +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/golden_io.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/ladder/test_counter.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/ladder/test_decode.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/ladder/test_decode_multi.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/ladder/test_decode_program_tumbler.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/ladder/test_decode_rtf_oracle.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/ladder/test_empty_multirow.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/ladder/test_encode.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/ladder/test_encode_multi.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/ladder/test_forloop.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/ladder/test_math.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/ladder/test_model.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/ladder/test_shift.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/ladder/test_verify_status.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/test_coverage.py +0 -0
- {laddercodec-0.2.1 → laddercodec-0.2.2}/tests/test_public_api.py +0 -0
- {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:
|
|
39
|
-
|
|
40
|
-
|
|
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:
|
|
@@ -115,7 +115,7 @@ tests/
|
|
|
115
115
|
└── tumbler/ # 34 real programs: <name>.scr + <name>.clipboard.{bin,csv}
|
|
116
116
|
```
|
|
117
117
|
|
|
118
|
-
|
|
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.
|
|
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.
|
|
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**:
|
|
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-
|
|
33
|
-
|
|
32
|
+
docs-generate:
|
|
33
|
+
uv run --group docs python docs/gen_reference.py
|
|
34
34
|
|
|
35
|
-
docs-
|
|
36
|
-
|
|
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
|
|
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
|
-
|
|
113
|
-
|
|
114
|
-
|
|
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
|
-
|
|
137
|
-
|
|
138
|
-
|
|
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 (`
|
|
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
|
-
## `
|
|
176
|
+
## `Or(...)` expansion
|
|
177
177
|
|
|
178
178
|
### Simple OR at power rail
|
|
179
179
|
|
|
180
|
-
`
|
|
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,
|
|
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
|
-
`
|
|
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,
|
|
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 |
|
|
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
|
-
**
|
|
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
|
|
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
|
-
**[
|
|
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
|
|
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
|
|