laddercodec 0.1.9__tar.gz → 0.2.1__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.1.9 → laddercodec-0.2.1}/.github/workflows/ci.yml +3 -3
- {laddercodec-0.1.9 → laddercodec-0.2.1}/.github/workflows/docs.yml +3 -3
- {laddercodec-0.1.9 → laddercodec-0.2.1}/.github/workflows/publish.yml +3 -3
- laddercodec-0.1.9/CLAUDE.md → laddercodec-0.2.1/AGENTS.md +8 -5
- {laddercodec-0.1.9 → laddercodec-0.2.1}/CHANGELOG.md +25 -0
- laddercodec-0.2.1/CLAUDE.md +1 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/PKG-INFO +2 -2
- {laddercodec-0.1.9 → laddercodec-0.2.1}/devtools/compare_csv.py +13 -2
- {laddercodec-0.1.9 → laddercodec-0.2.1}/devtools/dump_scr_tags.py +7 -13
- {laddercodec-0.1.9 → laddercodec-0.2.1}/devtools/inspect_bin.py +3 -3
- laddercodec-0.1.9/docs/CLAUDE.md → laddercodec-0.2.1/docs/AGENTS.md +1 -1
- laddercodec-0.2.1/docs/CLAUDE.md +1 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/docs/internals/binary-format.md +40 -10
- {laddercodec-0.1.9 → laddercodec-0.2.1}/docs/internals/wire-rendering.md +1 -1
- {laddercodec-0.1.9 → laddercodec-0.2.1}/mkdocs.yml +4 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/pyproject.toml +6 -3
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/csv/converter.py +9 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/csv/writer.py +7 -0
- laddercodec-0.2.1/src/laddercodec/decode_program.py +911 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/instructions/send_receive.py +6 -1
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/csv/test_writer.py +87 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/main.clipboard.bin +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/main.clipboard.csv +217 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/main.csv +217 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/main.scr +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/AckAlarm.clipboard.bin +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/AckAlarm.clipboard.csv +5 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/AckAlarm.csv +5 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/AckAlarm.scr +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/AckAndClearAllAlarms.clipboard.bin +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/AckAndClearAllAlarms.clipboard.csv +8 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/AckAndClearAllAlarms.csv +8 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/AckAndClearAllAlarms.scr +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/AckWarning.clipboard.bin +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/AckWarning.clipboard.csv +5 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/AckWarning.csv +5 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/AckWarning.scr +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/AlmHistorian.clipboard.bin +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/AlmHistorian.clipboard.csv +50 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/AlmHistorian.csv +50 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/AlmHistorian.scr +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/Blower.clipboard.bin +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/Blower.clipboard.csv +86 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/Blower.csv +86 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/Blower.scr +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/DisableOutputs.clipboard.bin +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/DisableOutputs.clipboard.csv +6 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/DisableOutputs.csv +6 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/DisableOutputs.scr +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/Heat.clipboard.bin +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/Heat.clipboard.csv +100 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/Heat.csv +100 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/Heat.scr +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/Init.clipboard.bin +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/Init.clipboard.csv +19 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/Init.csv +19 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/Init.scr +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/Maint.clipboard.bin +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/Maint.clipboard.csv +14 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/Maint.csv +14 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/Maint.scr +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/Manual.clipboard.bin +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/Manual.clipboard.csv +11 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/Manual.csv +11 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/Manual.scr +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/ModeChange.clipboard.bin +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/ModeChange.clipboard.csv +17 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/ModeChange.csv +17 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/ModeChange.scr +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/PLCDateTime.clipboard.bin +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/PLCDateTime.clipboard.csv +26 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/PLCDateTime.csv +26 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/PLCDateTime.scr +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/PLCErrors.clipboard.bin +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/PLCErrors.clipboard.csv +15 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/PLCErrors.csv +15 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/PLCErrors.scr +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/ProductionBoilerplate.clipboard.bin +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/ProductionBoilerplate.clipboard.csv +11 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/ProductionBoilerplate.csv +11 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/ProductionBoilerplate.scr +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/ProductionErrors.clipboard.bin +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/ProductionErrors.clipboard.csv +45 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/ProductionErrors.csv +45 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/ProductionErrors.scr +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/ProductionExecuteSteps.clipboard.bin +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/ProductionExecuteSteps.clipboard.csv +48 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/ProductionExecuteSteps.csv +48 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/ProductionExecuteSteps.scr +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/ProductionHMI.clipboard.bin +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/ProductionHMI.clipboard.csv +15 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/ProductionHMI.csv +15 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/ProductionHMI.scr +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/ProductionStates.clipboard.bin +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/ProductionStates.clipboard.csv +39 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/ProductionStates.csv +39 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/ProductionStates.scr +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/ReadInputs.clipboard.bin +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/ReadInputs.clipboard.csv +8 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/ReadInputs.csv +8 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/ReadInputs.scr +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/RecipeChange.clipboard.bin +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/RecipeChange.clipboard.csv +14 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/RecipeChange.csv +14 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/RecipeChange.scr +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/Rotate.clipboard.bin +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/Rotate.clipboard.csv +95 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/Rotate.csv +95 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/Rotate.scr +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/SFCExample.clipboard.bin +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/SFCExample.clipboard.csv +144 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/SFCExample.csv +144 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/SFCExample.scr +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/SetOutputs.clipboard.bin +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/SetOutputs.clipboard.csv +8 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/SetOutputs.csv +8 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/SetOutputs.scr +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/SetOutputsManual.clipboard.bin +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/SetOutputsManual.clipboard.csv +6 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/SetOutputsManual.csv +6 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/SetOutputsManual.scr +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/ThermErrors.clipboard.bin +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/ThermErrors.clipboard.csv +7 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/ThermErrors.csv +7 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/ThermErrors.scr +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/Validation.clipboard.bin +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/Validation.clipboard.csv +11 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/Validation.csv +11 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/Validation.scr +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/WarnTimestamp.clipboard.bin +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/WarnTimestamp.clipboard.csv +28 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/WarnTimestamp.csv +28 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/WarnTimestamp.scr +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/sm_CopyOrJumpState.clipboard.bin +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/sm_CopyOrJumpState.clipboard.csv +34 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/sm_CopyOrJumpState.csv +34 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/sm_CopyOrJumpState.scr +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/sm_CtrlCmd2StateRequest.clipboard.bin +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/sm_CtrlCmd2StateRequest.clipboard.csv +72 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/sm_CtrlCmd2StateRequest.csv +72 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/sm_CtrlCmd2StateRequest.scr +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/sm_IsCmdValid.clipboard.bin +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/sm_IsCmdValid.clipboard.csv +29 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/sm_IsCmdValid.csv +29 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/sm_IsCmdValid.scr +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/sm_MapCmd2Val.clipboard.bin +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/sm_MapCmd2Val.clipboard.csv +35 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/sm_MapCmd2Val.csv +35 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/sm_MapCmd2Val.scr +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/sm_MapVal2State.clipboard.bin +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/sm_MapVal2State.clipboard.csv +19 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/sm_MapVal2State.csv +19 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/sm_MapVal2State.scr +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/sm_StateComplete2Request.clipboard.bin +0 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/sm_StateComplete2Request.clipboard.csv +14 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/sm_StateComplete2Request.csv +14 -0
- laddercodec-0.2.1/tests/fixtures/tumbler/subroutines/sm_StateComplete2Request.scr +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/ladder/test_decode_program.py +204 -296
- laddercodec-0.2.1/tests/ladder/test_decode_program_tumbler.py +33 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/uv.lock +48 -44
- laddercodec-0.1.9/src/laddercodec/decode_program.py +0 -1174
- {laddercodec-0.1.9 → laddercodec-0.2.1}/.claude/settings.local.json +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/.gitignore +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/LICENSE +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/Makefile +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/README.md +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/add-features-workflow.md +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/devtools/analyze_scr.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/devtools/combine_coverage.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/devtools/compare_blobs.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/devtools/coverage_golden.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/devtools/create_mr_max_csv.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/devtools/diag_blob.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/devtools/gen_modbus_coverage.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/devtools/golden.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/devtools/inspect_scr.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/devtools/lint.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/devtools/pdf_to_png.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/devtools/test_decode_scr.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/devtools/validate_scr.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/devtools/walk_scr.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/docs/gen_reference.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/docs/guides/adding-instructions.md +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/docs/guides/csv-format.md +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/docs/guides/decoding.md +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/docs/guides/encoding.md +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/docs/guides/troubleshooting.md +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/docs/index.md +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/docs/internals/instruction-blobs.md +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/__init__.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/_grid.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/binary_helpers.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/cell.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/csv/__init__.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/csv/ast.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/csv/bundle.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/csv/contract.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/csv/parser.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/csv/token_parser.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/decode.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/empty_multirow.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/encode.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/encode_multi.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/instructions/__init__.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/instructions/call.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/instructions/coil.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/instructions/comparison.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/instructions/contact.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/instructions/copy.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/instructions/counter.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/instructions/drum.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/instructions/email.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/instructions/end.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/instructions/family.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/instructions/forloop.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/instructions/home.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/instructions/math.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/instructions/position.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/instructions/raw.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/instructions/return_.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/instructions/search.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/instructions/shift.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/instructions/timer.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/instructions/velocity.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/model.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/resources/empty_multirow_rule_minimal.scaffold.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/src/laddercodec/topology.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/__init__.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/csv/test_bundle.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/csv/test_contract.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/csv/test_converter.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/csv/test_parser.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/csv/test_token_parser.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/csv/test_writer_raw_validator.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/coverage.ckp +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/blockcopy__block.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/blockcopy__block.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/blockcopy__oneshot.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/blockcopy__oneshot.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/blockcopy__to_ascii.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/blockcopy__to_ascii.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/blockcopy__to_value.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/blockcopy__to_value.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/call__basic.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/call__basic.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__and.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__and.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__eq.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__eq.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__fall.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__fall.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__ge.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__ge.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__gt.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__gt.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__immediate.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__immediate.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__le.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__le.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__lt.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__lt.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__nc.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__nc.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__ne.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__ne.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__no.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__no.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__or.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__or.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__rise.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/cond__rise.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__literal_float.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__literal_float.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__literal_int.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__literal_int.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__oneshot.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__oneshot.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__tag.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__tag.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__to_ascii.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__to_ascii.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__to_binary.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__to_binary.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__to_text.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__to_text.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__to_text_exp.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__to_text_exp.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__to_text_sz.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__to_text_sz.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__to_text_term.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__to_text_term.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__to_value.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/copy__to_value.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/count_down.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/count_down.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/count_up__down.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/count_up__down.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/count_up__reset.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/count_up__reset.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/end.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/end.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/event_drum__basic.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/event_drum__basic.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/event_drum__full.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/event_drum__full.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/event_drum__jog.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/event_drum__jog.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/event_drum__jump.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/event_drum__jump.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/event_drum__max.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/event_drum__max.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/fill__literal.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/fill__literal.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/fill__oneshot.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/fill__oneshot.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/fill__tag.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/fill__tag.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/forloop__basic.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/forloop__basic.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/forloop__oneshot.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/forloop__oneshot.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/latch__block.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/latch__block.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/latch__immediate.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/latch__immediate.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/latch__tag.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/latch__tag.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/math__decimal.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/math__decimal.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/math__hex.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/math__hex.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/math__oneshot.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/math__oneshot.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/off_delay__tof.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/off_delay__tof.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/on_delay__rton.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/on_delay__rton.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/on_delay__ton.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/on_delay__ton.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/out__block.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/out__block.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/out__immediate.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/out__immediate.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/out__oneshot.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/out__oneshot.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/out__tag.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/out__tag.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/pack_bits.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/pack_bits.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/pack_bits__oneshot.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/pack_bits__oneshot.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/pack_text.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/pack_text.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/pack_text__allow_whitespace.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/pack_text__allow_whitespace.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/pack_text__oneshot.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/pack_text__oneshot.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/pack_words.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/pack_words.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/pack_words__oneshot.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/pack_words__oneshot.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/raw_instructions__email.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/raw_instructions__email.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/raw_instructions__home.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/raw_instructions__home.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/raw_instructions__position.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/raw_instructions__position.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/raw_instructions__velocity.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/raw_instructions__velocity.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/receive__rtu_click_block.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/receive__rtu_click_block.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/receive__rtu_click_single.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/receive__rtu_click_single.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/receive__rtu_modbus_block.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/receive__rtu_modbus_block.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/receive__rtu_modbus_single.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/receive__rtu_modbus_single.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/receive__tcp_click_coil.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/receive__tcp_click_coil.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/receive__tcp_click_input.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/receive__tcp_click_input.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/receive__tcp_click_input_reg.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/receive__tcp_click_input_reg.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/receive__tcp_click_wordswap.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/receive__tcp_click_wordswap.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/reset__block.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/reset__block.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/reset__immediate.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/reset__immediate.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/reset__tag.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/reset__tag.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/return_early__basic.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/return_early__basic.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/search__continuous.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/search__continuous.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/search__eq.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/search__eq.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/search__ge.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/search__ge.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/search__gt.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/search__gt.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/search__le.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/search__le.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/search__lt.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/search__lt.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/search__ne.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/search__ne.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/search__oneshot.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/search__oneshot.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__error_off.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__error_off.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__errorcode_off.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__errorcode_off.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__rtu_click_block.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__rtu_click_block.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__rtu_click_single.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__rtu_click_single.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__rtu_modbus_block.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__rtu_modbus_block.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__rtu_modbus_single.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__rtu_modbus_single.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__sending_off.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__sending_off.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__success_off.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__success_off.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__tcp_click_coil.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__tcp_click_coil.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__tcp_click_coils.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__tcp_click_coils.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__tcp_click_wordswap.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/send__tcp_click_wordswap.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/shift__basic.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/shift__basic.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/time_drum__basic.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/time_drum__basic.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/time_drum__basic_td.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/time_drum__basic_td.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/unpack_to_bits.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/unpack_to_bits.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/unpack_to_bits__oneshot.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/unpack_to_bits__oneshot.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/unpack_to_words.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/unpack_to_words.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/unpack_to_words__oneshot.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/unpack_to_words__oneshot.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/golden/verify_progress.log +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/coverage/subroutines/coverage_sub.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/drum_weird_branch.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/cmt-1row-fullwire-nop.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/cmt-1row-fullwire-nop.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/cmt-1row-max1400.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/cmt-1row-max1400.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/cmt-1row-styled-mixed.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/cmt-1row-styled-mixed.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/cmt-2row-max1324.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/cmt-2row-max1324.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/cmt-2row-nop-wire.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/cmt-2row-nop-wire.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/cmt-32row-sparse.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/cmt-32row-sparse.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/cmt-3row-mixed.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/cmt-3row-mixed.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-2row-cond__and.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-2row-cond__and.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-2row-r0only.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-2row-r0only.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-2row-spread.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-2row-spread.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-3row-branch.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-3row-branch.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-3row-or-colA.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-3row-or-colA.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-3row-or.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-3row-or.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-3row-scatter.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-3row-scatter.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-6row-multi-output.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-6row-multi-output.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-coil-timer-ret.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-coil-timer-ret.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-compare-ge.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-compare-ge.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-compare-series.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-compare-series.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-compare-timer.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-compare-timer.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-cond__and.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-cond__and.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-copy-multirow-2af-T.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-copy-multirow-2af-T.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-copy-multirow-2af.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-copy-multirow-2af.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-count_down-row0-data.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-count_down-row0-data.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-no-out.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-no-out.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-series.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-series.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-timer-off.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-timer-off.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-timer-on.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-timer-on.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-timer-ret.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/instr-timer-ret.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-2rung-2row.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-2rung-2row.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-2rung-wire.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-2rung-wire.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-3rung-wire-nop.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-3rung-wire-nop.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-2row.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-2row.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-both.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-both.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-r1-max1400.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-cmt-2rung-r1-max1400.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-all.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-all.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow-multiinstructions.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow-multiinstructions.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow-nopaddedrows.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow-nopaddedrows.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-cmt-3rung-multirow.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-instr-2rung.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-instr-2rung.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-instr-cond__and.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/mr-instr-cond__and.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/nc-1row-empty.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/nc-1row-empty.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/nc-1row-fullwire-nop.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/nc-1row-fullwire-nop.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/nc-32row-empty.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/nc-32row-empty.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/nc-3row-t-junction.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/nc-3row-t-junction.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/nc-4row-vertical.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/nc-4row-vertical.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/ladder_captures/golden/verify_progress.log +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/scr_captures/counter_scr.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/scr_captures/counter_scr.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/scr_captures/counter_scr.scr +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/scr_captures/coverage.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/scr_captures/coverage.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/scr_captures/coverage.scr +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/scr_captures/or_topology.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/scr_captures/or_topology.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/scr_captures/or_topology.scr +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/scr_captures/shift_scr.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/scr_captures/shift_scr.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/scr_captures/shift_scr.scr +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/scr_captures/time_drums.bin +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/scr_captures/time_drums.csv +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/fixtures/scr_captures/time_drums.scr +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/golden_io.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/ladder/test_counter.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/ladder/test_decode.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/ladder/test_decode_multi.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/ladder/test_decode_rtf_oracle.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/ladder/test_empty_multirow.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/ladder/test_encode.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/ladder/test_encode_multi.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/ladder/test_forloop.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/ladder/test_math.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/ladder/test_model.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/ladder/test_shift.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/ladder/test_verify_status.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/test_coverage.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/test_public_api.py +0 -0
- {laddercodec-0.1.9 → laddercodec-0.2.1}/tests/test_smoke.py +0 -0
|
@@ -25,10 +25,10 @@ jobs:
|
|
|
25
25
|
fetch-depth: 0
|
|
26
26
|
|
|
27
27
|
- name: Install uv (official Astral action)
|
|
28
|
-
uses: astral-sh/setup-uv@
|
|
28
|
+
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
29
29
|
with:
|
|
30
|
-
version: "0.
|
|
31
|
-
enable-cache:
|
|
30
|
+
version: "0.11.29"
|
|
31
|
+
enable-cache: auto
|
|
32
32
|
python-version: ${{ matrix.python-version }}
|
|
33
33
|
|
|
34
34
|
- name: Set up Python (using uv)
|
|
@@ -22,10 +22,10 @@ jobs:
|
|
|
22
22
|
uses: actions/checkout@v6
|
|
23
23
|
|
|
24
24
|
- name: Install uv
|
|
25
|
-
uses: astral-sh/setup-uv@
|
|
25
|
+
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
26
26
|
with:
|
|
27
|
-
version: "0.
|
|
28
|
-
enable-cache:
|
|
27
|
+
version: "0.11.29"
|
|
28
|
+
enable-cache: auto
|
|
29
29
|
python-version: "3.12"
|
|
30
30
|
|
|
31
31
|
- name: Set up Python
|
|
@@ -18,10 +18,10 @@ jobs:
|
|
|
18
18
|
fetch-depth: 0
|
|
19
19
|
|
|
20
20
|
- name: Install uv (official Astral action)
|
|
21
|
-
uses: astral-sh/setup-uv@
|
|
21
|
+
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
22
22
|
with:
|
|
23
|
-
version: "0.
|
|
24
|
-
enable-cache:
|
|
23
|
+
version: "0.11.29"
|
|
24
|
+
enable-cache: auto
|
|
25
25
|
python-version: "3.12"
|
|
26
26
|
|
|
27
27
|
- name: Set up Python (using uv)
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
#
|
|
1
|
+
# laddercodec Agent Guidance
|
|
2
2
|
|
|
3
3
|
**IMPORTANT: Don't use `cd` before commands. The working directory is already set to the project root.**
|
|
4
4
|
**IMPORTANT: Always use `make` commands, not direct `uv run` commands.**
|
|
5
5
|
|
|
6
|
-
This file provides guidance to
|
|
6
|
+
This file provides guidance to coding agents working in this repository.
|
|
7
7
|
|
|
8
8
|
## Project Overview
|
|
9
9
|
|
|
@@ -98,6 +98,7 @@ tests/
|
|
|
98
98
|
│ ├── test_decode.py # decode() tests
|
|
99
99
|
│ ├── test_decode_multi.py # decode() multi-rung tests
|
|
100
100
|
│ ├── test_decode_program.py # decode_program() program file tests
|
|
101
|
+
│ ├── test_decode_program_tumbler.py # 34 real programs: scr decode == clipboard CSV
|
|
101
102
|
│ ├── test_verify_status.py # Golden verification status check
|
|
102
103
|
│ ├── test_model.py # InstructionType, operand validation
|
|
103
104
|
│ └── test_empty_multirow.py # Payload synthesis for rows 1..32
|
|
@@ -109,10 +110,12 @@ tests/
|
|
|
109
110
|
│ ├── test_token_parser.py # Condition + AF token parsing
|
|
110
111
|
│ └── test_writer.py # CSV writer tests
|
|
111
112
|
└── fixtures/
|
|
112
|
-
|
|
113
|
+
├── ladder_captures/golden/ # Golden CSV/BIN fixtures
|
|
114
|
+
├── scr_captures/ # Scr program files + clipboard bins (decode_program)
|
|
115
|
+
└── tumbler/ # 34 real programs: <name>.scr + <name>.clipboard.{bin,csv}
|
|
113
116
|
```
|
|
114
117
|
|
|
115
|
-
Golden fixtures verified through Click paste round-trip.
|
|
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.
|
|
116
119
|
|
|
117
120
|
## Binary Format
|
|
118
121
|
|
|
@@ -157,7 +160,7 @@ All tested shapes pass Click round-trip (verified via paste → copy-back):
|
|
|
157
160
|
|
|
158
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.
|
|
159
162
|
|
|
160
|
-
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 114-rung coverage fixture
|
|
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".
|
|
161
164
|
|
|
162
165
|
**All standard Click instruction types decoded natively:**
|
|
163
166
|
- Contacts: NO, NC, edge (rise/fall), immediate (NO/NC)
|
|
@@ -8,6 +8,31 @@
|
|
|
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)
|
|
12
|
+
|
|
13
|
+
### Fixed
|
|
14
|
+
- **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).
|
|
15
|
+
- **CSV writer**: a `count_up` with `.reset()` wired but `.down()` unused always dehydrates the empty `.down()` row, so the `.reset()` pin row directly follows the counter row even when the reset branch has a floating OR-leg below it.
|
|
16
|
+
- **CSV read**: rows after a counter/shift `.reset()` pin row stay below the instruction's span instead of being absorbed into it, which misplaced a floating OR-leg onto the unused `.down()` row.
|
|
17
|
+
|
|
18
|
+
### Added
|
|
19
|
+
- **Tests**: synthetic regression coverage for default-elided Send/Receive fields and for floating OR-leg rows below every pinned instruction span (timer, count_up, count_down, shift).
|
|
20
|
+
|
|
21
|
+
## 0.2.0
|
|
22
|
+
|
|
23
|
+
### Fixed
|
|
24
|
+
- **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
|
+
- **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.
|
|
27
|
+
|
|
28
|
+
### Changed
|
|
29
|
+
- **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.
|
|
30
|
+
- **SCR decode**: `decode_program()` now parses rung records with a single forward cursor — comments, topology, and instructions are read from explicit lengths and counts instead of scanning for signatures, so comments attach to their own rung by construction and malformed files fail loudly with the byte offset (see §"SCR rung records" in the binary format doc).
|
|
31
|
+
|
|
32
|
+
### Added
|
|
33
|
+
- **Tumbler fixture**: 34 real Click programs (`tests/fixtures/tumbler/`), each pairing the internal `.scr` program file with a clipboard capture of the same program; `decode_program()` output is regression-tested byte-identical against the clipboard CSVs.
|
|
34
|
+
- **Devtools**: `compare_csv.py` normalizes `R` vs `R1`/`R2` rung markers before comparing, so scr-derived and clipboard-saved CSVs diff cleanly.
|
|
35
|
+
|
|
11
36
|
## 0.1.9
|
|
12
37
|
|
|
13
38
|
### Added
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@AGENTS.md
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: laddercodec
|
|
3
|
-
Version: 0.1
|
|
3
|
+
Version: 0.2.1
|
|
4
4
|
Summary: Binary codec for AutomationDirect CLICK PLC ladder clipboard format
|
|
5
5
|
Project-URL: Repository, https://github.com/ssweber/laddercodec
|
|
6
6
|
Project-URL: Documentation, https://ssweber.github.io/laddercodec/
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
"""Compare {slug}.csv against {slug}.clipboard.csv in a directory.
|
|
2
2
|
|
|
3
|
-
Reports which pairs are identical and which differ.
|
|
3
|
+
Reports which pairs are identical and which differ. Rung markers are
|
|
4
|
+
normalized before comparison (indexed ``R1``/``R2`` vs plain ``R``), since
|
|
5
|
+
scr-derived bundles are written with ``index=True`` while clipboard saves
|
|
6
|
+
are not.
|
|
4
7
|
|
|
5
8
|
Usage:
|
|
6
9
|
uv run devtools/compare_csv.py <directory>
|
|
@@ -8,9 +11,17 @@ Usage:
|
|
|
8
11
|
|
|
9
12
|
from __future__ import annotations
|
|
10
13
|
|
|
14
|
+
import re
|
|
11
15
|
import sys
|
|
12
16
|
from pathlib import Path
|
|
13
17
|
|
|
18
|
+
_INDEXED_MARKER = re.compile(r"^R\d+(?=,)")
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def _normalized_lines(path: Path) -> list[str]:
|
|
22
|
+
text = path.read_text(encoding="utf-8")
|
|
23
|
+
return [_INDEXED_MARKER.sub("R", line) for line in text.splitlines()]
|
|
24
|
+
|
|
14
25
|
|
|
15
26
|
def main() -> None:
|
|
16
27
|
if len(sys.argv) != 2:
|
|
@@ -42,7 +53,7 @@ def main() -> None:
|
|
|
42
53
|
missing += 1
|
|
43
54
|
continue
|
|
44
55
|
|
|
45
|
-
if base_path
|
|
56
|
+
if _normalized_lines(base_path) == _normalized_lines(clip_path):
|
|
46
57
|
print(f" IDENTICAL {slug}")
|
|
47
58
|
identical += 1
|
|
48
59
|
else:
|
|
@@ -25,20 +25,14 @@ def main() -> None:
|
|
|
25
25
|
print(f"\nRung {si}:")
|
|
26
26
|
cursor = sec_off + 6
|
|
27
27
|
for ii in range(count):
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
if blob8:
|
|
31
|
-
row = data[cursor]
|
|
32
|
-
col = data[cursor + 1]
|
|
33
|
-
blob_start = cursor + 8
|
|
34
|
-
cls, typ, end_off, next_pos, m1 = blob8
|
|
35
|
-
elif blob9:
|
|
36
|
-
row = data[cursor + 1]
|
|
37
|
-
col = data[cursor + 2]
|
|
38
|
-
blob_start = cursor + 9
|
|
39
|
-
cls, typ, end_off, next_pos, m1 = blob9
|
|
40
|
-
else:
|
|
28
|
+
blob = _parse_blob(data, cursor + 8)
|
|
29
|
+
if not blob:
|
|
41
30
|
break
|
|
31
|
+
row = data[cursor]
|
|
32
|
+
col = data[cursor + 1]
|
|
33
|
+
blob_start = cursor + 8
|
|
34
|
+
cls, typ, end_off, m1 = blob
|
|
35
|
+
next_pos = end_off + 2 + data[end_off] # trailer-aware advance
|
|
42
36
|
|
|
43
37
|
# Parse tagged fields
|
|
44
38
|
pos = blob_start
|
|
@@ -150,12 +150,12 @@ def main() -> None:
|
|
|
150
150
|
print(f"{'=' * 60}")
|
|
151
151
|
|
|
152
152
|
result = decode(data)
|
|
153
|
-
if isinstance(result,
|
|
153
|
+
if isinstance(result, Rung):
|
|
154
|
+
_print_rung(result, 0)
|
|
155
|
+
else:
|
|
154
156
|
print(f" Multi-rung: {len(result)} rungs")
|
|
155
157
|
for i, rung in enumerate(result):
|
|
156
158
|
_print_rung(rung, i)
|
|
157
|
-
else:
|
|
158
|
-
_print_rung(result, 0)
|
|
159
159
|
|
|
160
160
|
|
|
161
161
|
if __name__ == "__main__":
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@AGENTS.md
|
|
@@ -198,24 +198,54 @@ The instruction blob content (tag IDs, operand values, wire types) is **identica
|
|
|
198
198
|
|
|
199
199
|
The embedded fields at offsets +0 through +6 after the type code correspond to clipboard cell header offsets +0x09 through +0x10. The `end_offset` is an absolute file pointer to the blob boundary — the same boundary that clipboard's `find_blob_boundary()` derives by scanning tags. Tags use length-prefixed strings (no `FFFFFFFF` sentinel).
|
|
200
200
|
|
|
201
|
+
The byte at `end_offset` is a 1-byte trailer length (observed 0 or 1): the next structure starts at `end_offset + 2 + data[end_offset]`. Certain instruction encodings (`RD`/`SD` always; `Copy`/`Math`/`Out`/`Drum` sometimes) emit a 1-byte trailer whose value is opaque.
|
|
202
|
+
|
|
203
|
+
## SCR rung records
|
|
204
|
+
|
|
205
|
+
An SCR file is a header followed by one rung record per rung, in order, parseable with a single forward cursor:
|
|
206
|
+
|
|
207
|
+
```
|
|
208
|
+
RUNG = [2B rung_index] -- 1-based ordinal; asserted sequential
|
|
209
|
+
[4B rtf_len][rtf body] -- comment; rtf_len = 0 means none
|
|
210
|
+
TOPOLOGY -- row-topology block (below)
|
|
211
|
+
[2B instr_count] -- 0 = empty rung (nothing follows)
|
|
212
|
+
[4B section_marker] -- only when instr_count > 0
|
|
213
|
+
instr_count x ENTRY -- 8-byte header + blob (see framing above)
|
|
214
|
+
ENTRY = [1B row_1based][1B col][1B b2][1B b3][1B entry_seq][3B 00] + blob
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
Rung 0 carries a 7-byte file prelude instead of `rung_index`: `[2B file_marker][0d][4B total_rung_records]`. `file_marker` equals the per-file `section_marker` constant (opaque; validation magic only), and `total_rung_records` counts every rung record in the file.
|
|
218
|
+
|
|
219
|
+
Programs end with 1–4 ordinary content-less rungs (the empty editor rungs below the last programmed rung; some carry a fully-wired row) — the decoder drops trailing records with no instructions and no comment. Files with `prog_idx == 1` (the main program) carry a 2-byte tail after the last record; subroutines end exactly at the last record.
|
|
220
|
+
|
|
201
221
|
## SCR row-topology blocks
|
|
202
222
|
|
|
203
223
|
SCR files store per-rung wire topology in structured blocks that precede each rung's instruction section. Each block encodes the right-wire and segment-flag data that clipboard stores per-cell in the grid.
|
|
204
224
|
|
|
205
225
|
```
|
|
206
|
-
[2B row_word][03 00 00]
|
|
207
|
-
|
|
208
|
-
[
|
|
209
|
-
[
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
226
|
+
[2B row_word][03 00 00] -- 5-byte header; row_word = stored rows + 1
|
|
227
|
+
{ row block } x (row_word - 1) -- one per grid row, in row order (row 0 first)
|
|
228
|
+
[20 00] -- end marker
|
|
229
|
+
[wire-down table] -- exactly 32 column entries (see below)
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
Every row block — including row 0's — has the same uniform format:
|
|
233
|
+
|
|
213
234
|
```
|
|
235
|
+
[1B flag][1B count][00] + count x ([1B seg][1B col])
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
- `flag` — the +0x19 segment flag of the row's AF (col 31) cell. 1 for normal output/coil/NOP rows, 0 for tall segment-0 instructions (timer/counter/drum).
|
|
239
|
+
- `count` — number of right-wired cells on the row (condition cells plus AF when present). `count = 0` is an empty row: the 3-byte block `[flag][00][00]`.
|
|
240
|
+
- Each entry pairs a cell's +0x19 segment flag with its column index (0–31, 31 = AF). Entries are **placement-ordered** — the column sequence is usually ascending but not guaranteed (native captures include orders like `[6,1,0,3,2,4,5]`), so columns must be treated as a set.
|
|
241
|
+
|
|
242
|
+
A row block whose entries include col 0 with every condition-cell seg = 1 carries the grid-row-0 signature (row 0 is exempt from the per-row segment boundary). SCR can retain orphaned wire rows *above* the true row 0 — editor debris under a tall instruction box — which Click's own clipboard copy omits; the decoder drops non-empty stored rows preceding the first row with the row-0 signature.
|
|
214
243
|
|
|
215
|
-
|
|
244
|
+
The wire-down table after the `20 00` marker has exactly one entry per column 0–31:
|
|
216
245
|
|
|
217
246
|
```
|
|
218
|
-
|
|
247
|
+
no down wires: [00 00]
|
|
248
|
+
down wires: [1B count][00][count x 1-based row index]
|
|
219
249
|
```
|
|
220
250
|
|
|
221
|
-
|
|
251
|
+
This table is the SCR serialization of the per-cell down flag (+0x21) that clipboard stores on each cell — it lists every down wire, including those carried by contact cells (rendered as a `T:` prefix, see [wire rendering](wire-rendering.md)). It is therefore a superset of the visible `T`/`|` wire tokens.
|
|
@@ -21,7 +21,7 @@ Wire tokens are classified by (right, down) only — the segment flag is indepen
|
|
|
21
21
|
| 1 | 1 | `T` | Branch junction (right + down) |
|
|
22
22
|
| 0 | 0 | *(blank)* | No wire |
|
|
23
23
|
|
|
24
|
-
Instruction cells (contacts, coils) also set right=1 — they behave like horizontal wires with instruction data layered on top.
|
|
24
|
+
Instruction cells (contacts, coils) also set right=1 — they behave like horizontal wires with instruction data layered on top. A contact cell can additionally set down=1 (a branch rooted directly under the contact): since right is already 1, that's the T shape, and the CSV renders it as a `T:` prefix on the contact token (e.g. `T:C1204`), mapping to `wire_down=True` on `Contact`/`CompareContact`.
|
|
25
25
|
|
|
26
26
|
## Left-edge rendering
|
|
27
27
|
|
|
@@ -40,9 +40,9 @@ dependencies = []
|
|
|
40
40
|
[dependency-groups]
|
|
41
41
|
dev = [
|
|
42
42
|
"pytest>=8.3.5",
|
|
43
|
-
"ruff>=0.
|
|
43
|
+
"ruff>=0.16.0",
|
|
44
44
|
"striprtf>=0.0.29",
|
|
45
|
-
"ty>=0.0.
|
|
45
|
+
"ty>=0.0.65",
|
|
46
46
|
]
|
|
47
47
|
docs = [
|
|
48
48
|
"mkdocs>=1.6.1,<2",
|
|
@@ -74,12 +74,15 @@ bump = true
|
|
|
74
74
|
packages = ["src/laddercodec"]
|
|
75
75
|
|
|
76
76
|
[tool.uv]
|
|
77
|
+
required-version = ">=0.11.29"
|
|
77
78
|
exclude-newer = "7 days"
|
|
79
|
+
exclude-newer-package = { ty = "0 days" }
|
|
78
80
|
|
|
79
81
|
# ---- Settings ----
|
|
80
82
|
|
|
81
83
|
[tool.ruff]
|
|
82
84
|
line-length = 100
|
|
85
|
+
extend-exclude = ["*.md"]
|
|
83
86
|
|
|
84
87
|
[tool.ruff.lint]
|
|
85
88
|
select = [
|
|
@@ -113,7 +116,7 @@ python-version = "3.11"
|
|
|
113
116
|
root = ["./src", "./tests", "./devtools"]
|
|
114
117
|
|
|
115
118
|
[tool.ty.src]
|
|
116
|
-
exclude = ["tests", "scratchpad"]
|
|
119
|
+
exclude = ["tests", "scratchpad", "devtools/pdf_to_png.py"]
|
|
117
120
|
|
|
118
121
|
[tool.ty.rules]
|
|
119
122
|
unresolved-import = "ignore"
|
|
@@ -240,6 +240,15 @@ def _consume_active_row(block: _ActiveBlock, row: _ParsedRow) -> bool:
|
|
|
240
240
|
if len(block.continuations) >= _max_continuations(block):
|
|
241
241
|
return False
|
|
242
242
|
|
|
243
|
+
# .reset() occupies the last row of a counter/shift span, so nothing after
|
|
244
|
+
# it belongs to the block — following rows are floating rows below the
|
|
245
|
+
# span (e.g. the OR-leg of the reset branch). This is what lets the
|
|
246
|
+
# writer dehydrate an unused .down() row above the .reset() pin.
|
|
247
|
+
if isinstance(block.token, (Counter, Shift)) and any(
|
|
248
|
+
c.kind == "pin" and c.pin_name == ".reset" for c in block.continuations
|
|
249
|
+
):
|
|
250
|
+
return False
|
|
251
|
+
|
|
243
252
|
if row.kind == "blank":
|
|
244
253
|
block.continuations.append(row)
|
|
245
254
|
return True
|
|
@@ -201,6 +201,13 @@ def _emit_counter_block(
|
|
|
201
201
|
data_row_count = _append_data_row(
|
|
202
202
|
rows, data_row_count, condition_rows[start + 1], ".down()"
|
|
203
203
|
)
|
|
204
|
+
elif counter.reset_enabled:
|
|
205
|
+
# The unused .down() row is always empty padding, and the .reset()
|
|
206
|
+
# pin row anchors any following floating rows on reparse — so the
|
|
207
|
+
# empty row always dehydrates, even above a floating row.
|
|
208
|
+
data_row_count = _emit_blank_continuation(
|
|
209
|
+
rows, data_row_count, condition_rows[start + 1]
|
|
210
|
+
)
|
|
204
211
|
else:
|
|
205
212
|
data_row_count = _emit_blank_continuation(
|
|
206
213
|
rows, data_row_count, condition_rows[start + 1], keep
|