diff --git a/firmware/ldpc_demo/test_vectors.h b/firmware/ldpc_demo/test_vectors.h new file mode 100644 index 0000000..9a38792 --- /dev/null +++ b/firmware/ldpc_demo/test_vectors.h @@ -0,0 +1,500 @@ +/* + * Auto-generated test vectors for LDPC decoder firmware + * Generated by model/gen_firmware_vectors.py + * + * LLR packing: 5 LLRs per 32-bit word, 6 bits each (two's complement) + * Word bits [5:0] = LLR[5*i+0] + * Word bits [11:6] = LLR[5*i+1] + * Word bits [17:12] = LLR[5*i+2] + * Word bits [23:18] = LLR[5*i+3] + * Word bits [29:24] = LLR[5*i+4] + */ + +#ifndef TEST_VECTORS_H +#define TEST_VECTORS_H + +#include + +#define NUM_TEST_VECTORS 20 +#define LLR_WORDS_PER_VECTOR 52 + +/* Vector 0: converged=True, iterations=1, syndrome_weight=0, bit_errors=0 */ +static const uint32_t tv0_llr[52] = { + 0x1F7DF81F, 0x20C9F7E0, 0x207CC7DF, 0x1F82081F, + 0x328207E0, 0x20820820, 0x208207CC, 0x1F81F7DF, + 0x1F7F27DF, 0x1F7CC81F, 0x0C81F81F, 0x207E07F2, + 0x1F820820, 0x207DF7CC, 0x1F81F7E0, 0x2082081F, + 0x0C31F81F, 0x2081F7DF, 0x1FCA081F, 0x20820820, + 0x1F7DF7DF, 0x207E07E0, 0x208207CC, 0x1F8207DF, + 0x0C7DF7DF, 0x2030C820, 0x207DF7E0, 0x1F82081F, + 0x203207DF, 0x20832820, 0x2081F820, 0x20820832, + 0x1F82081F, 0x207E081F, 0x207DF820, 0x1F7E0320, + 0x1F7E07E0, 0x1F81F820, 0x20CA07CC, 0x0C81F7E0, + 0x1F820820, 0x1FCA07DF, 0x1F7E080C, 0x208207F2, + 0x207E081F, 0x20820820, 0x207E07DF, 0x2082081F, + 0x1F7E07DF, 0x1F7DF7E0, 0x207DF820, 0x00000020 +}; +static const uint32_t tv0_decoded = 0x3FD74222; +static const int tv0_converged = 1; +static const int tv0_iterations = 1; +static const int tv0_syndrome_weight = 0; + +/* Vector 1: converged=True, iterations=1, syndrome_weight=0, bit_errors=0 */ +static const uint32_t tv1_llr[52] = { + 0x1F8207F2, 0x207DF820, 0x2081F7DF, 0x1F81F81F, + 0x2081F81F, 0x1F7E07DF, 0x1F7E031F, 0x207DF7DF, + 0x1F8207E0, 0x1F7DF81F, 0x1F81F820, 0x1F81F7E0, + 0x1F7DF820, 0x1F82081F, 0x207E07DF, 0x207E0820, + 0x207E07DF, 0x2080C7DF, 0x2081F81F, 0x207DF30C, + 0x2081F31F, 0x207E081F, 0x1F7DF30C, 0x208207DF, + 0x1F81F7E0, 0x207E07DF, 0x1F7E07DF, 0x0C82081F, + 0x1F81F7E0, 0x1F7DFC9F, 0x2082081F, 0x1F7E07DF, + 0x207DF7DF, 0x208207DF, 0x207E0320, 0x327DF81F, + 0x2082030C, 0x1F820820, 0x0CC9F7E0, 0x1F8207DF, + 0x1F7E07DF, 0x2081F820, 0x1F7E0820, 0x1F81F320, + 0x207E081F, 0x2081F81F, 0x1F81F7E0, 0x1F7DF820, + 0x2081F81F, 0x1F81F7E0, 0x20820820, 0x00000020 +}; +static const uint32_t tv1_decoded = 0x09A5626C; +static const int tv1_converged = 1; +static const int tv1_iterations = 1; +static const int tv1_syndrome_weight = 0; + +/* Vector 2: converged=True, iterations=1, syndrome_weight=0, bit_errors=0 */ +static const uint32_t tv2_llr[52] = { + 0x2082030C, 0x1F820820, 0x1F81F7E0, 0x2080C7DF, + 0x20832820, 0x207E0820, 0x327E031F, 0x207DF7CC, + 0x20820C8C, 0x1F7F27F2, 0x1F7DF7E0, 0x20832820, + 0x1F820820, 0x3281F81F, 0x1F30C7E0, 0x1F8207E0, + 0x207E07E0, 0x1F7DF820, 0x0C7DF7DF, 0x20CA07DF, + 0x207DF81F, 0x2082081F, 0x1F81F820, 0x20820CA0, + 0x2081F81F, 0x1F7E0820, 0x1F81F81F, 0x20820820, + 0x1F7DF81F, 0x20CA081F, 0x1F7E07DF, 0x1F7DF81F, + 0x1F7E080C, 0x1F82080C, 0x0C81F820, 0x1F81F7DF, + 0x1F7CC7E0, 0x328207E0, 0x1F81F820, 0x2081F7DF, + 0x1F7E0CA0, 0x1F81F820, 0x2081F81F, 0x20820820, + 0x2081F31F, 0x1F81F820, 0x1F7E081F, 0x0C7E081F, + 0x1F7E07E0, 0x1F82081F, 0x2081F7DF, 0x00000020 +}; +static const uint32_t tv2_decoded = 0x2FFC25FC; +static const int tv2_converged = 1; +static const int tv2_iterations = 1; +static const int tv2_syndrome_weight = 0; + +/* Vector 3: converged=True, iterations=1, syndrome_weight=0, bit_errors=0 */ +static const uint32_t tv3_llr[52] = { + 0x1F81F820, 0x1F81F7DF, 0x208207E0, 0x327E0820, + 0x2081F81F, 0x1F82081F, 0x1F8207E0, 0x1FCA07E0, + 0x1F7DF7E0, 0x207E07E0, 0x20820820, 0x0C81F81F, + 0x2081F820, 0x1F81F7E0, 0x1F7E07E0, 0x1F8207DF, + 0x1F7E031F, 0x1F82081F, 0x207E07E0, 0x1F820820, + 0x1F7DF7E0, 0x207DF820, 0x1F81F7CC, 0x1F7E07E0, + 0x208207E0, 0x207DF81F, 0x2081F81F, 0x20820820, + 0x1F820820, 0x1F81F7DF, 0x203207E0, 0x1F8207DF, + 0x0C7DF7DF, 0x1F7E07E0, 0x2081F7E0, 0x1F7E07E0, + 0x1F81F81F, 0x2081F7E0, 0x1F7DF820, 0x2081F820, + 0x1F7F281F, 0x2081F7E0, 0x207DF7E0, 0x207E07E0, + 0x1F31F820, 0x1F7E07E0, 0x1F7DF7E0, 0x207DF820, + 0x1F7DF31F, 0x1F31F7E0, 0x208207DF, 0x00000020 +}; +static const uint32_t tv3_decoded = 0x5DABF50B; +static const int tv3_converged = 1; +static const int tv3_iterations = 1; +static const int tv3_syndrome_weight = 0; + +/* Vector 4: converged=True, iterations=1, syndrome_weight=0, bit_errors=0 */ +static const uint32_t tv4_llr[52] = { + 0x207DF820, 0x207DF7E0, 0x2081F81F, 0x207DF7E0, + 0x208207E0, 0x1F7DFC9F, 0x1F7DF7DF, 0x1F82031F, + 0x1F7E081F, 0x1F81F81F, 0x1F7E0820, 0x207E081F, + 0x2081F820, 0x1F81F7DF, 0x1F820820, 0x1F7DF81F, + 0x1F7CC820, 0x1F81F31F, 0x207E07DF, 0x207E081F, + 0x1F8207CC, 0x1F7CC31F, 0x1F82081F, 0x207F2820, + 0x207E0820, 0x2082081F, 0x207E07E0, 0x207E0820, + 0x1F8207E0, 0x1F7E07E0, 0x2082081F, 0x207DF81F, + 0x1F31F7E0, 0x2081F820, 0x1F81F7DF, 0x2081F820, + 0x2081F820, 0x2081F81F, 0x207DF7E0, 0x20820820, + 0x1F81F7E0, 0x207E07E0, 0x2081F81F, 0x208207DF, + 0x0C81F820, 0x1F7E081F, 0x2082081F, 0x207E0820, + 0x207E0820, 0x1F81F81F, 0x2080C7E0, 0x0000001F +}; +static const uint32_t tv4_decoded = 0x05D8EA33; +static const int tv4_converged = 1; +static const int tv4_iterations = 1; +static const int tv4_syndrome_weight = 0; + +/* Vector 5: converged=True, iterations=1, syndrome_weight=0, bit_errors=0 */ +static const uint32_t tv5_llr[52] = { + 0x327DF820, 0x1F7DF820, 0x1F3207E0, 0x2082081F, + 0x2081FC9F, 0x1F8207DF, 0x1F8207DF, 0x0C8207DF, + 0x1F82081F, 0x207E07DF, 0x2081F7DF, 0x1F81F820, + 0x0C31F820, 0x207E0820, 0x207DF7DF, 0x1F82031F, + 0x20820820, 0x1F7E0C8C, 0x20C9F81F, 0x20820820, + 0x1F7DF7E0, 0x2081F7E0, 0x1F7CC7DF, 0x208207E0, + 0x207E0820, 0x2032081F, 0x208207DF, 0x207DF81F, + 0x1F7E07E0, 0x1F81F820, 0x2081F820, 0x3281F30C, + 0x1F7DF81F, 0x207DFC8C, 0x2083281F, 0x1F8207E0, + 0x1F7E07E0, 0x0C7DF820, 0x207E07DF, 0x2031F320, + 0x1F7DF820, 0x1F32081F, 0x207DF81F, 0x207DF7DF, + 0x1F7E07DF, 0x1F81F31F, 0x1F7DF81F, 0x1F81F80C, + 0x208207E0, 0x1F81F7CC, 0x0C81FC9F, 0x00000020 +}; +static const uint32_t tv5_decoded = 0x19AF1473; +static const int tv5_converged = 1; +static const int tv5_iterations = 1; +static const int tv5_syndrome_weight = 0; + +/* Vector 6: converged=True, iterations=1, syndrome_weight=0, bit_errors=0 */ +static const uint32_t tv6_llr[52] = { + 0x2031FCA0, 0x1F83281F, 0x1F81F7E0, 0x207DF81F, + 0x1F8207E0, 0x2081F81F, 0x2081F7DF, 0x1F82031F, + 0x2081F81F, 0x1F7E07E0, 0x1F81F7E0, 0x207E081F, + 0x0C81F7E0, 0x207E07DF, 0x207DF7E0, 0x1F7DF7E0, + 0x1F7DF81F, 0x1F81F7CC, 0x2081FC9F, 0x1F81F31F, + 0x1F7E0820, 0x1F820820, 0x1F82081F, 0x1F7E0820, + 0x1F31F81F, 0x1F81F81F, 0x1F8207F2, 0x1F820820, + 0x2081F820, 0x207E07DF, 0x1F7E0820, 0x1F81F7DF, + 0x1F7E07DF, 0x207E07E0, 0x1F31F7E0, 0x20820820, + 0x1F7DF820, 0x1F80C7DF, 0x0C81F81F, 0x2082081F, + 0x207E081F, 0x1F7CC820, 0x2032081F, 0x2031F81F, + 0x1F7E0820, 0x2081F820, 0x1F7E07E0, 0x207DF7DF, + 0x1F81F81F, 0x2081F7E0, 0x1F7E081F, 0x0000001F +}; +static const uint32_t tv6_decoded = 0x34D925D3; +static const int tv6_converged = 1; +static const int tv6_iterations = 1; +static const int tv6_syndrome_weight = 0; + +/* Vector 7: converged=True, iterations=1, syndrome_weight=0, bit_errors=0 */ +static const uint32_t tv7_llr[52] = { + 0x207CC7DF, 0x2031F81F, 0x2081F7E0, 0x0C7DF820, + 0x208207DF, 0x1F7DF81F, 0x0C7DF7E0, 0x1F7DF7E0, + 0x1F81F81F, 0x1F7E081F, 0x1F820820, 0x207DF7DF, + 0x2081F820, 0x3282081F, 0x1F7E07E0, 0x1F7E07DF, + 0x1F820820, 0x1F81F31F, 0x207E0832, 0x0C7E07E0, + 0x1F81F81F, 0x0CCA081F, 0x1FC8C7DF, 0x207DF81F, + 0x1F81F7DF, 0x207CC7DF, 0x1F7E081F, 0x1F81F7DF, + 0x1F82081F, 0x1F82081F, 0x2081F820, 0x1F8207DF, + 0x2081F7E0, 0x2030C81F, 0x20820820, 0x1F81F7DF, + 0x1F81F31F, 0x2080C7E0, 0x1F32081F, 0x1F7DF81F, + 0x207DF7DF, 0x20C9F31F, 0x1F7DF7E0, 0x208207E0, + 0x327E07DF, 0x1F81F81F, 0x1F7DF820, 0x2081F7DF, + 0x1F8207DF, 0x1F81F7E0, 0x1F8207E0, 0x00000020 +}; +static const uint32_t tv7_decoded = 0x45C1E650; +static const int tv7_converged = 1; +static const int tv7_iterations = 1; +static const int tv7_syndrome_weight = 0; + +/* Vector 8: converged=True, iterations=1, syndrome_weight=0, bit_errors=0 */ +static const uint32_t tv8_llr[52] = { + 0x1F81F7E0, 0x1F81F81F, 0x20820820, 0x203207DF, + 0x1F8207DF, 0x207CC81F, 0x207DF81F, 0x1F7E081F, + 0x1F81F7E0, 0x208207E0, 0x207DF820, 0x207DF81F, + 0x2081F7E0, 0x207F27DF, 0x2031F7E0, 0x1F8207E0, + 0x208207E0, 0x207DF7CC, 0x1F82081F, 0x2081F81F, + 0x1F81F820, 0x207E07DF, 0x1F7DF820, 0x2081F81F, + 0x1F8207DF, 0x207E0820, 0x207DF820, 0x1F81F820, + 0x20820820, 0x0C81F81F, 0x1F7E07DF, 0x2081F80C, + 0x1F820832, 0x1F7DF820, 0x1F8207CC, 0x207E07DF, + 0x1F82080C, 0x1F8207DF, 0x207E080C, 0x1FCA07DF, + 0x2081F7DF, 0x1F81F820, 0x1F7DF31F, 0x1F7DF820, + 0x1F7E07DF, 0x2081F81F, 0x207E0820, 0x0C7DF81F, + 0x207DF7DF, 0x2082081F, 0x1F81F7E0, 0x0000001F +}; +static const uint32_t tv8_decoded = 0xA4CA7D49; +static const int tv8_converged = 1; +static const int tv8_iterations = 1; +static const int tv8_syndrome_weight = 0; + +/* Vector 9: converged=True, iterations=1, syndrome_weight=0, bit_errors=0 */ +static const uint32_t tv9_llr[52] = { + 0x1F30C7DF, 0x208207DF, 0x2081F81F, 0x207DF820, + 0x1F7E07DF, 0x1FCA07DF, 0x1F820820, 0x1F31F820, + 0x207DF7DF, 0x1F81F820, 0x1F820820, 0x207DF80C, + 0x1F7DF7DF, 0x20820820, 0x208327DF, 0x203207DF, + 0x32CA07DF, 0x1F81F7E0, 0x1F7E07DF, 0x207E07CC, + 0x207E081F, 0x1F81F81F, 0x1F81F7DF, 0x328327DF, + 0x0C81F7E0, 0x1F7F27DF, 0x1F81F7DF, 0x208207E0, + 0x207E07DF, 0x1F7DF7E0, 0x1F7DF81F, 0x1F320832, + 0x207E081F, 0x2081F7DF, 0x207E080C, 0x207E081F, + 0x20C9F320, 0x207E07E0, 0x207E081F, 0x1F7E07DF, + 0x207E081F, 0x1F7E07E0, 0x1F81F7E0, 0x1F8207E0, + 0x0C8207E0, 0x20820820, 0x1F7DF81F, 0x1F81F7E0, + 0x1F7E0320, 0x1F81F320, 0x2081F820, 0x0000001F +}; +static const uint32_t tv9_decoded = 0xD849EB80; +static const int tv9_converged = 1; +static const int tv9_iterations = 1; +static const int tv9_syndrome_weight = 0; + +/* Vector 10: converged=True, iterations=1, syndrome_weight=0, bit_errors=0 */ +static const uint32_t tv10_llr[52] = { + 0x0C30C30C, 0x0C30C80C, 0x0C30CEBA, 0x0C32733A, + 0x279E030C, 0x0C820320, 0x0C32780C, 0x0C30C30C, + 0x0CE8CEBA, 0x3A9CC80C, 0x3A32030C, 0x2030C9FA, + 0x203209CC, 0x0C80C30C, 0x3A30C320, 0x0C30CE8C, + 0x209CC320, 0x209CC327, 0x0C30C320, 0x3A9CCE8C, + 0x2080C30C, 0x27820EA7, 0x2083A30C, 0x0C9FA33A, + 0x0CEA0EA0, 0x20327EBA, 0x2030C320, 0x2732730C, + 0x3A820EA0, 0x0C9FA320, 0x0C9FA30C, 0x0C80C320, + 0x0CEBA9FA, 0x2780CEBA, 0x0C3209E0, 0x3AE8CE8C, + 0x2030C320, 0x2030CE8C, 0x0C30CE8C, 0x2730C327, + 0x0C30C30C, 0x0C327327, 0x209E730C, 0x27E8C80C, + 0x0CE8C30C, 0x209E030C, 0x3A30C320, 0x0C32730C, + 0x0C30CE8C, 0x2030C320, 0x0C32780C, 0x0000000C +}; +static const uint32_t tv10_decoded = 0x9BCA9A40; +static const int tv10_converged = 1; +static const int tv10_iterations = 1; +static const int tv10_syndrome_weight = 0; + +/* Vector 11: converged=False, iterations=30, syndrome_weight=67, bit_errors=20 */ +static const uint32_t tv11_llr[52] = { + 0x0C30C80C, 0x0C30C30C, 0x2730C820, 0x0C80C30C, + 0x0C32730C, 0x0C30C9E7, 0x0CE8C33A, 0x0C9CC320, + 0x2032030C, 0x0C32030C, 0x0C30C9E0, 0x209CC320, + 0x0C9E730C, 0x0C33A9CC, 0x3A80C30C, 0x0C30C80C, + 0x279CC320, 0x0CEA080C, 0x0C30C9CC, 0x279E0320, + 0x2730C30C, 0x0CE8C30C, 0x0C80C9CC, 0x0C9CC30C, + 0x3AE8CEA0, 0x20E8C320, 0x0C33A80C, 0x0CEBA33A, + 0x0C30C9CC, 0x27EA0E8C, 0x0C30CEBA, 0x0CE8C30C, + 0x0CEA7EA7, 0x0C30C30C, 0x0C83A327, 0x0CEBA30C, + 0x0C83AEA0, 0x2033A80C, 0x0C80C30C, 0x0C30C30C, + 0x0C82730C, 0x3A30C33A, 0x3A820E8C, 0x0C30C320, + 0x0C30C9E7, 0x279CC320, 0x2080C30C, 0x27320327, + 0x3A32083A, 0x0C33A80C, 0x0C9CC30C, 0x0000000C +}; +static const uint32_t tv11_decoded = 0x79FFC352; +static const int tv11_converged = 0; +static const int tv11_iterations = 30; +static const int tv11_syndrome_weight = 67; + +/* Vector 12: converged=False, iterations=30, syndrome_weight=59, bit_errors=13 */ +static const uint32_t tv12_llr[52] = { + 0x3A82030C, 0x0CE8C827, 0x2083A327, 0x2780C827, + 0x2730C320, 0x0C3279FA, 0x2730C30C, 0x2030C83A, + 0x279E09E7, 0x3A320320, 0x0CEA7EBA, 0x20320327, + 0x0CE8C9CC, 0x0C30C80C, 0x0CE8C33A, 0x0C9CC9E0, + 0x0C30C80C, 0x2033A320, 0x0C32780C, 0x0C30C30C, + 0x0C33AEBA, 0x0C80C327, 0x0CEA79CC, 0x0C30C320, + 0x0C30CEA7, 0x2033A820, 0x0C30C327, 0x2080CE8C, + 0x0C32080C, 0x3A82030C, 0x0C30C30C, 0x0C327320, + 0x0C80C30C, 0x20EA730C, 0x27E8C80C, 0x3AEA7E8C, + 0x2733AE8C, 0x0CE8C80C, 0x2730C33A, 0x3AE8C30C, + 0x279CCE8C, 0x0C33AE8C, 0x0C3209E0, 0x0C30C30C, + 0x0C30C80C, 0x2780C327, 0x0C320EA0, 0x0C33AEA0, + 0x0C9E79E0, 0x2030CEA0, 0x2033AE8C, 0x00000020 +}; +static const uint32_t tv12_decoded = 0x5D2534DC; +static const int tv12_converged = 0; +static const int tv12_iterations = 30; +static const int tv12_syndrome_weight = 59; + +/* Vector 13: converged=False, iterations=30, syndrome_weight=61, bit_errors=19 */ +static const uint32_t tv13_llr[52] = { + 0x0CE8C80C, 0x2032730C, 0x0CE8CE8C, 0x3A30C9FA, + 0x209CC820, 0x0C80CE8C, 0x3A9CC30C, 0x0CE8C30C, + 0x2730CEA7, 0x0C30C80C, 0x2783A30C, 0x0C320EBA, + 0x2030C33A, 0x0CEA080C, 0x20EA730C, 0x0C30C9E0, + 0x0C30C30C, 0x0C827320, 0x0C33A33A, 0x0CEA730C, + 0x3A9E09FA, 0x0CE8C327, 0x0C9CC33A, 0x0C80CEA7, + 0x0CEA7EA0, 0x0C8209FA, 0x3A3209CC, 0x20327327, + 0x0C30CE8C, 0x2030C320, 0x3A30C327, 0x0CEA030C, + 0x3A9E0E8C, 0x0CEA0E8C, 0x3AE8C80C, 0x0C9E730C, + 0x0C30C30C, 0x2032030C, 0x0C320820, 0x0C33A30C, + 0x27E8CEBA, 0x20EA730C, 0x0C30C30C, 0x3A30C820, + 0x3A32730C, 0x0C80CEA0, 0x0C82780C, 0x20EA0320, + 0x0C32033A, 0x2030C30C, 0x27320EA0, 0x0000003A +}; +static const uint32_t tv13_decoded = 0xF21718ED; +static const int tv13_converged = 0; +static const int tv13_iterations = 30; +static const int tv13_syndrome_weight = 61; + +/* Vector 14: converged=False, iterations=30, syndrome_weight=65, bit_errors=17 */ +static const uint32_t tv14_llr[52] = { + 0x0CEA0327, 0x0C80CEBA, 0x209CC327, 0x0C30C33A, + 0x0C30C30C, 0x0C9CC83A, 0x0C9CC80C, 0x3A32730C, + 0x0C9CC30C, 0x0C32033A, 0x0C3209FA, 0x0C82730C, + 0x0CEA0E8C, 0x2732730C, 0x0C30C30C, 0x3AE8CEBA, + 0x3A30C33A, 0x0C80C9E7, 0x20E8CE8C, 0x2783A327, + 0x2083A320, 0x2732030C, 0x2730C30C, 0x0C80C30C, + 0x3A327327, 0x0C80C327, 0x0C30CEA7, 0x0C30CE8C, + 0x0C80C80C, 0x3A820327, 0x3A30C30C, 0x0CE8C320, + 0x3AE8C80C, 0x209FA80C, 0x0C30C320, 0x0C30C33A, + 0x2080C80C, 0x0C30C33A, 0x3A9E09E0, 0x0C9CC320, + 0x3A30C320, 0x0C83A9FA, 0x0C30C30C, 0x0C30C827, + 0x0C327E8C, 0x2730C80C, 0x0C80C30C, 0x3A30C30C, + 0x0CE8C33A, 0x0C9E0E8C, 0x0C30C327, 0x0000000C +}; +static const uint32_t tv14_decoded = 0x7FE0197C; +static const int tv14_converged = 0; +static const int tv14_iterations = 30; +static const int tv14_syndrome_weight = 65; + +/* Vector 15: converged=False, iterations=30, syndrome_weight=75, bit_errors=16 */ +static const uint32_t tv15_llr[52] = { + 0x2780C30C, 0x27827E8C, 0x0C30CE8C, 0x0C32783A, + 0x3A80C320, 0x0C30C30C, 0x0C30C30C, 0x0C33A33A, + 0x2730C9FA, 0x0CE8C827, 0x0C32030C, 0x0C32033A, + 0x2080CEBA, 0x0C9CC30C, 0x2030C9E0, 0x0C30C9FA, + 0x2732030C, 0x0C9CC9CC, 0x3A80C320, 0x0C33AE8C, + 0x3A80CEBA, 0x2733AEA7, 0x3A80C83A, 0x0CE8C33A, + 0x0C327820, 0x27E8CEA7, 0x0CEA7EA0, 0x0C30C30C, + 0x0CE8C30C, 0x0C33A9CC, 0x0C30C9FA, 0x0C80C80C, + 0x3A30C327, 0x3AE8C80C, 0x0C32033A, 0x3A3209E0, + 0x2730C30C, 0x20320E8C, 0x3A33A9CC, 0x2033A33A, + 0x3A9CCEBA, 0x0CEA030C, 0x279CCE8C, 0x0C9CC30C, + 0x0C820320, 0x0C32033A, 0x0C3209CC, 0x2082033A, + 0x3A30C320, 0x20320EA7, 0x27E8C33A, 0x0000000C +}; +static const uint32_t tv15_decoded = 0x9E869CC2; +static const int tv15_converged = 0; +static const int tv15_iterations = 30; +static const int tv15_syndrome_weight = 75; + +/* Vector 16: converged=False, iterations=30, syndrome_weight=56, bit_errors=14 */ +static const uint32_t tv16_llr[52] = { + 0x3A30C327, 0x3AE8C320, 0x3A33A30C, 0x0C80C9E0, + 0x0CE8CE8C, 0x2032030C, 0x3A33A320, 0x3A33A33A, + 0x0C3279CC, 0x2730C827, 0x0CEBA83A, 0x0C9CC33A, + 0x0C80C320, 0x27327EA7, 0x0C320327, 0x0C9CC83A, + 0x3A80CE8C, 0x0C30C33A, 0x0C3209E0, 0x0C30CEBA, + 0x0C82783A, 0x0C30C320, 0x0C30CEBA, 0x0C33A30C, + 0x0CE8C30C, 0x2030C320, 0x27EBA9E0, 0x0C30C327, + 0x3AE8C320, 0x3A30CE8C, 0x2030C827, 0x0C9CC9E0, + 0x273209FA, 0x3A30CEA0, 0x3A82730C, 0x0CEBA30C, + 0x0C320E8C, 0x0C80C9FA, 0x3A32080C, 0x2032730C, + 0x0C33A30C, 0x0C33A327, 0x0C80CEA0, 0x0C327320, + 0x0C80C320, 0x20E8C320, 0x0C30C9CC, 0x0C30C820, + 0x3A820327, 0x3A82780C, 0x0C32033A, 0x0000003A +}; +static const uint32_t tv16_decoded = 0x4E7507D9; +static const int tv16_converged = 0; +static const int tv16_iterations = 30; +static const int tv16_syndrome_weight = 56; + +/* Vector 17: converged=False, iterations=30, syndrome_weight=51, bit_errors=19 */ +static const uint32_t tv17_llr[52] = { + 0x3A30C30C, 0x0C80C30C, 0x2033A30C, 0x3AEBA33A, + 0x27E8C33A, 0x0CE8C30C, 0x0C80C33A, 0x0C33A80C, + 0x0C33A30C, 0x2030C320, 0x0C30C30C, 0x0C30C327, + 0x0C33A820, 0x3AEBA30C, 0x2730C80C, 0x0C82080C, + 0x0CE8C30C, 0x0CE8CE8C, 0x3A80C327, 0x0C33A30C, + 0x0C30CE8C, 0x2732030C, 0x3A30C33A, 0x0CE8C33A, + 0x209CC80C, 0x0C30CE8C, 0x0CE8C30C, 0x0C33A9E7, + 0x3A83AEA7, 0x2780C30C, 0x2030C33A, 0x0CEBA83A, + 0x2080C30C, 0x209CC30C, 0x0C30C30C, 0x0C33A327, + 0x0C32030C, 0x3A80C33A, 0x0C83A9CC, 0x0C9FA30C, + 0x3A33A30C, 0x0C9CC80C, 0x2782730C, 0x2032730C, + 0x0C33AEBA, 0x2033AEA0, 0x2732730C, 0x0C9E7320, + 0x0C80C9FA, 0x0C32030C, 0x0C83A9E0, 0x00000020 +}; +static const uint32_t tv17_decoded = 0xBB5F2BF1; +static const int tv17_converged = 0; +static const int tv17_iterations = 30; +static const int tv17_syndrome_weight = 51; + +/* Vector 18: converged=False, iterations=30, syndrome_weight=76, bit_errors=18 */ +static const uint32_t tv18_llr[52] = { + 0x3A9E083A, 0x2080C30C, 0x27E8C320, 0x3A327EA7, + 0x203209E7, 0x0CE8C33A, 0x0C80C33A, 0x278209E7, + 0x0CE8C9FA, 0x0C327EA0, 0x209E0827, 0x209FA80C, + 0x0C9E083A, 0x0C30C327, 0x0C32730C, 0x0CEA083A, + 0x20EA7327, 0x2730C30C, 0x0C9E09E7, 0x2033AEBA, + 0x0C30CEBA, 0x0C30C30C, 0x0C9E7EBA, 0x3AE8C9CC, + 0x3A30C30C, 0x0C33A9E0, 0x0C9FA30C, 0x3A33A30C, + 0x2080C30C, 0x0C9FA30C, 0x3A32730C, 0x27827E8C, + 0x2782730C, 0x2080CE8C, 0x0C80C320, 0x2030CE8C, + 0x0C82030C, 0x0CEBA30C, 0x20EA79FA, 0x3A32030C, + 0x2730C30C, 0x0C3209CC, 0x209E0820, 0x0C9CC33A, + 0x3A9CC320, 0x0C9E780C, 0x0C30C80C, 0x0C30C9E0, + 0x0C30CE8C, 0x209CC30C, 0x0C80C30C, 0x00000027 +}; +static const uint32_t tv18_decoded = 0xAA500741; +static const int tv18_converged = 0; +static const int tv18_iterations = 30; +static const int tv18_syndrome_weight = 76; + +/* Vector 19: converged=False, iterations=30, syndrome_weight=42, bit_errors=16 */ +static const uint32_t tv19_llr[52] = { + 0x3A80C33A, 0x0CEA7327, 0x0C32780C, 0x0C30C30C, + 0x279CC9CC, 0x3A33A30C, 0x3A32030C, 0x0C30C30C, + 0x273209E0, 0x2032030C, 0x0CE8C30C, 0x0C30C30C, + 0x3A33A327, 0x0C30C9E0, 0x0C80CEA0, 0x0C30C30C, + 0x0C30C320, 0x0C83A33A, 0x0CEA030C, 0x3A80CE8C, + 0x0C327EA0, 0x0C80C9E0, 0x3A320827, 0x0C320EA0, + 0x0C30C30C, 0x0CE8CE8C, 0x0C30C320, 0x0C327827, + 0x203279E0, 0x0C30C30C, 0x0C33A9E7, 0x3A32030C, + 0x2030C83A, 0x0C9E09CC, 0x0C3209CC, 0x27E8C9CC, + 0x27EBA83A, 0x3AE8C327, 0x27E8C327, 0x0C30C30C, + 0x0C80CE8C, 0x0CEA0EBA, 0x0C32730C, 0x2730C9E0, + 0x279CC33A, 0x0C30CEBA, 0x2730C320, 0x0C30C30C, + 0x0C3209FA, 0x3A33A327, 0x209CCE8C, 0x0000000C +}; +static const uint32_t tv19_decoded = 0xF98E6EFE; +static const int tv19_converged = 0; +static const int tv19_iterations = 30; +static const int tv19_syndrome_weight = 42; + +/* Array of LLR pointers for iteration */ +static const uint32_t * const tv_llr[NUM_TEST_VECTORS] = { + tv0_llr, + tv1_llr, + tv2_llr, + tv3_llr, + tv4_llr, + tv5_llr, + tv6_llr, + tv7_llr, + tv8_llr, + tv9_llr, + tv10_llr, + tv11_llr, + tv12_llr, + tv13_llr, + tv14_llr, + tv15_llr, + tv16_llr, + tv17_llr, + tv18_llr, + tv19_llr +}; + +static const uint32_t tv_decoded[NUM_TEST_VECTORS] = { + 0x3FD74222, /* tv0 */ + 0x09A5626C, /* tv1 */ + 0x2FFC25FC, /* tv2 */ + 0x5DABF50B, /* tv3 */ + 0x05D8EA33, /* tv4 */ + 0x19AF1473, /* tv5 */ + 0x34D925D3, /* tv6 */ + 0x45C1E650, /* tv7 */ + 0xA4CA7D49, /* tv8 */ + 0xD849EB80, /* tv9 */ + 0x9BCA9A40, /* tv10 */ + 0x79FFC352, /* tv11 */ + 0x5D2534DC, /* tv12 */ + 0xF21718ED, /* tv13 */ + 0x7FE0197C, /* tv14 */ + 0x9E869CC2, /* tv15 */ + 0x4E7507D9, /* tv16 */ + 0xBB5F2BF1, /* tv17 */ + 0xAA500741, /* tv18 */ + 0xF98E6EFE /* tv19 */ +}; + +static const int tv_converged[NUM_TEST_VECTORS] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static const int tv_iterations[NUM_TEST_VECTORS] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 30, 30, 30, 30, 30, 30, 30, 30, 30 +}; + +static const int tv_syndrome_weight[NUM_TEST_VECTORS] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 59, 61, 65, 75, 56, 51, 76, 42 +}; + +#endif /* TEST_VECTORS_H */ diff --git a/verilog/dv/cocotb/ldpc_tests/__init__.py b/verilog/dv/cocotb/ldpc_tests/__init__.py new file mode 100644 index 0000000..0fa5aac --- /dev/null +++ b/verilog/dv/cocotb/ldpc_tests/__init__.py @@ -0,0 +1 @@ +# LDPC decoder test package for cocotb diff --git a/verilog/dv/cocotb/ldpc_tests/test_data.py b/verilog/dv/cocotb/ldpc_tests/test_data.py new file mode 100644 index 0000000..5b24a5d --- /dev/null +++ b/verilog/dv/cocotb/ldpc_tests/test_data.py @@ -0,0 +1,398 @@ +""" +Auto-generated test vector data for LDPC decoder cocotb tests. +Generated by model/gen_firmware_vectors.py + +LLR packing: 5 LLRs per 32-bit word, 6 bits each (two's complement) + Word bits [5:0] = LLR[5*i+0] + Word bits [11:6] = LLR[5*i+1] + Word bits [17:12] = LLR[5*i+2] + Word bits [23:18] = LLR[5*i+3] + Word bits [29:24] = LLR[5*i+4] +""" + +# Number of test vectors +NUM_VECTORS = 20 +LLR_WORDS_PER_VECTOR = 52 + +# Wishbone register offsets (byte-addressed) +# Note: LLR write range (0x10-0xDC) overlaps read-only registers. +# This is safe because LLRs are write-only and DECODED/VERSION are read-only. +REG_CTRL = 0x00 +REG_STATUS = 0x04 +REG_LLR_BASE = 0x10 # 52 words: 0x10, 0x14, ..., 0xDC (write-only) +REG_DECODED = 0x50 # read-only +REG_VERSION = 0x54 # read-only + + +TEST_VECTORS = [ + { + 'index': 0, + 'llr_words': [ + 0x1F7DF81F, 0x20C9F7E0, 0x207CC7DF, 0x1F82081F, 0x328207E0, 0x20820820, 0x208207CC, 0x1F81F7DF, + 0x1F7F27DF, 0x1F7CC81F, 0x0C81F81F, 0x207E07F2, 0x1F820820, 0x207DF7CC, 0x1F81F7E0, 0x2082081F, + 0x0C31F81F, 0x2081F7DF, 0x1FCA081F, 0x20820820, 0x1F7DF7DF, 0x207E07E0, 0x208207CC, 0x1F8207DF, + 0x0C7DF7DF, 0x2030C820, 0x207DF7E0, 0x1F82081F, 0x203207DF, 0x20832820, 0x2081F820, 0x20820832, + 0x1F82081F, 0x207E081F, 0x207DF820, 0x1F7E0320, 0x1F7E07E0, 0x1F81F820, 0x20CA07CC, 0x0C81F7E0, + 0x1F820820, 0x1FCA07DF, 0x1F7E080C, 0x208207F2, 0x207E081F, 0x20820820, 0x207E07DF, 0x2082081F, + 0x1F7E07DF, 0x1F7DF7E0, 0x207DF820, 0x00000020 + ], + 'decoded_word': 0x3FD74222, + 'info_bits': [0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0], + 'converged': True, + 'iterations': 1, + 'syndrome_weight': 0, + 'bit_errors': 0, + }, + { + 'index': 1, + 'llr_words': [ + 0x1F8207F2, 0x207DF820, 0x2081F7DF, 0x1F81F81F, 0x2081F81F, 0x1F7E07DF, 0x1F7E031F, 0x207DF7DF, + 0x1F8207E0, 0x1F7DF81F, 0x1F81F820, 0x1F81F7E0, 0x1F7DF820, 0x1F82081F, 0x207E07DF, 0x207E0820, + 0x207E07DF, 0x2080C7DF, 0x2081F81F, 0x207DF30C, 0x2081F31F, 0x207E081F, 0x1F7DF30C, 0x208207DF, + 0x1F81F7E0, 0x207E07DF, 0x1F7E07DF, 0x0C82081F, 0x1F81F7E0, 0x1F7DFC9F, 0x2082081F, 0x1F7E07DF, + 0x207DF7DF, 0x208207DF, 0x207E0320, 0x327DF81F, 0x2082030C, 0x1F820820, 0x0CC9F7E0, 0x1F8207DF, + 0x1F7E07DF, 0x2081F820, 0x1F7E0820, 0x1F81F320, 0x207E081F, 0x2081F81F, 0x1F81F7E0, 0x1F7DF820, + 0x2081F81F, 0x1F81F7E0, 0x20820820, 0x00000020 + ], + 'decoded_word': 0x09A5626C, + 'info_bits': [0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0], + 'converged': True, + 'iterations': 1, + 'syndrome_weight': 0, + 'bit_errors': 0, + }, + { + 'index': 2, + 'llr_words': [ + 0x2082030C, 0x1F820820, 0x1F81F7E0, 0x2080C7DF, 0x20832820, 0x207E0820, 0x327E031F, 0x207DF7CC, + 0x20820C8C, 0x1F7F27F2, 0x1F7DF7E0, 0x20832820, 0x1F820820, 0x3281F81F, 0x1F30C7E0, 0x1F8207E0, + 0x207E07E0, 0x1F7DF820, 0x0C7DF7DF, 0x20CA07DF, 0x207DF81F, 0x2082081F, 0x1F81F820, 0x20820CA0, + 0x2081F81F, 0x1F7E0820, 0x1F81F81F, 0x20820820, 0x1F7DF81F, 0x20CA081F, 0x1F7E07DF, 0x1F7DF81F, + 0x1F7E080C, 0x1F82080C, 0x0C81F820, 0x1F81F7DF, 0x1F7CC7E0, 0x328207E0, 0x1F81F820, 0x2081F7DF, + 0x1F7E0CA0, 0x1F81F820, 0x2081F81F, 0x20820820, 0x2081F31F, 0x1F81F820, 0x1F7E081F, 0x0C7E081F, + 0x1F7E07E0, 0x1F82081F, 0x2081F7DF, 0x00000020 + ], + 'decoded_word': 0x2FFC25FC, + 'info_bits': [0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0], + 'converged': True, + 'iterations': 1, + 'syndrome_weight': 0, + 'bit_errors': 0, + }, + { + 'index': 3, + 'llr_words': [ + 0x1F81F820, 0x1F81F7DF, 0x208207E0, 0x327E0820, 0x2081F81F, 0x1F82081F, 0x1F8207E0, 0x1FCA07E0, + 0x1F7DF7E0, 0x207E07E0, 0x20820820, 0x0C81F81F, 0x2081F820, 0x1F81F7E0, 0x1F7E07E0, 0x1F8207DF, + 0x1F7E031F, 0x1F82081F, 0x207E07E0, 0x1F820820, 0x1F7DF7E0, 0x207DF820, 0x1F81F7CC, 0x1F7E07E0, + 0x208207E0, 0x207DF81F, 0x2081F81F, 0x20820820, 0x1F820820, 0x1F81F7DF, 0x203207E0, 0x1F8207DF, + 0x0C7DF7DF, 0x1F7E07E0, 0x2081F7E0, 0x1F7E07E0, 0x1F81F81F, 0x2081F7E0, 0x1F7DF820, 0x2081F820, + 0x1F7F281F, 0x2081F7E0, 0x207DF7E0, 0x207E07E0, 0x1F31F820, 0x1F7E07E0, 0x1F7DF7E0, 0x207DF820, + 0x1F7DF31F, 0x1F31F7E0, 0x208207DF, 0x00000020 + ], + 'decoded_word': 0x5DABF50B, + 'info_bits': [1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0], + 'converged': True, + 'iterations': 1, + 'syndrome_weight': 0, + 'bit_errors': 0, + }, + { + 'index': 4, + 'llr_words': [ + 0x207DF820, 0x207DF7E0, 0x2081F81F, 0x207DF7E0, 0x208207E0, 0x1F7DFC9F, 0x1F7DF7DF, 0x1F82031F, + 0x1F7E081F, 0x1F81F81F, 0x1F7E0820, 0x207E081F, 0x2081F820, 0x1F81F7DF, 0x1F820820, 0x1F7DF81F, + 0x1F7CC820, 0x1F81F31F, 0x207E07DF, 0x207E081F, 0x1F8207CC, 0x1F7CC31F, 0x1F82081F, 0x207F2820, + 0x207E0820, 0x2082081F, 0x207E07E0, 0x207E0820, 0x1F8207E0, 0x1F7E07E0, 0x2082081F, 0x207DF81F, + 0x1F31F7E0, 0x2081F820, 0x1F81F7DF, 0x2081F820, 0x2081F820, 0x2081F81F, 0x207DF7E0, 0x20820820, + 0x1F81F7E0, 0x207E07E0, 0x2081F81F, 0x208207DF, 0x0C81F820, 0x1F7E081F, 0x2082081F, 0x207E0820, + 0x207E0820, 0x1F81F81F, 0x2080C7E0, 0x0000001F + ], + 'decoded_word': 0x05D8EA33, + 'info_bits': [1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0], + 'converged': True, + 'iterations': 1, + 'syndrome_weight': 0, + 'bit_errors': 0, + }, + { + 'index': 5, + 'llr_words': [ + 0x327DF820, 0x1F7DF820, 0x1F3207E0, 0x2082081F, 0x2081FC9F, 0x1F8207DF, 0x1F8207DF, 0x0C8207DF, + 0x1F82081F, 0x207E07DF, 0x2081F7DF, 0x1F81F820, 0x0C31F820, 0x207E0820, 0x207DF7DF, 0x1F82031F, + 0x20820820, 0x1F7E0C8C, 0x20C9F81F, 0x20820820, 0x1F7DF7E0, 0x2081F7E0, 0x1F7CC7DF, 0x208207E0, + 0x207E0820, 0x2032081F, 0x208207DF, 0x207DF81F, 0x1F7E07E0, 0x1F81F820, 0x2081F820, 0x3281F30C, + 0x1F7DF81F, 0x207DFC8C, 0x2083281F, 0x1F8207E0, 0x1F7E07E0, 0x0C7DF820, 0x207E07DF, 0x2031F320, + 0x1F7DF820, 0x1F32081F, 0x207DF81F, 0x207DF7DF, 0x1F7E07DF, 0x1F81F31F, 0x1F7DF81F, 0x1F81F80C, + 0x208207E0, 0x1F81F7CC, 0x0C81FC9F, 0x00000020 + ], + 'decoded_word': 0x19AF1473, + 'info_bits': [1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0], + 'converged': True, + 'iterations': 1, + 'syndrome_weight': 0, + 'bit_errors': 0, + }, + { + 'index': 6, + 'llr_words': [ + 0x2031FCA0, 0x1F83281F, 0x1F81F7E0, 0x207DF81F, 0x1F8207E0, 0x2081F81F, 0x2081F7DF, 0x1F82031F, + 0x2081F81F, 0x1F7E07E0, 0x1F81F7E0, 0x207E081F, 0x0C81F7E0, 0x207E07DF, 0x207DF7E0, 0x1F7DF7E0, + 0x1F7DF81F, 0x1F81F7CC, 0x2081FC9F, 0x1F81F31F, 0x1F7E0820, 0x1F820820, 0x1F82081F, 0x1F7E0820, + 0x1F31F81F, 0x1F81F81F, 0x1F8207F2, 0x1F820820, 0x2081F820, 0x207E07DF, 0x1F7E0820, 0x1F81F7DF, + 0x1F7E07DF, 0x207E07E0, 0x1F31F7E0, 0x20820820, 0x1F7DF820, 0x1F80C7DF, 0x0C81F81F, 0x2082081F, + 0x207E081F, 0x1F7CC820, 0x2032081F, 0x2031F81F, 0x1F7E0820, 0x2081F820, 0x1F7E07E0, 0x207DF7DF, + 0x1F81F81F, 0x2081F7E0, 0x1F7E081F, 0x0000001F + ], + 'decoded_word': 0x34D925D3, + 'info_bits': [1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0], + 'converged': True, + 'iterations': 1, + 'syndrome_weight': 0, + 'bit_errors': 0, + }, + { + 'index': 7, + 'llr_words': [ + 0x207CC7DF, 0x2031F81F, 0x2081F7E0, 0x0C7DF820, 0x208207DF, 0x1F7DF81F, 0x0C7DF7E0, 0x1F7DF7E0, + 0x1F81F81F, 0x1F7E081F, 0x1F820820, 0x207DF7DF, 0x2081F820, 0x3282081F, 0x1F7E07E0, 0x1F7E07DF, + 0x1F820820, 0x1F81F31F, 0x207E0832, 0x0C7E07E0, 0x1F81F81F, 0x0CCA081F, 0x1FC8C7DF, 0x207DF81F, + 0x1F81F7DF, 0x207CC7DF, 0x1F7E081F, 0x1F81F7DF, 0x1F82081F, 0x1F82081F, 0x2081F820, 0x1F8207DF, + 0x2081F7E0, 0x2030C81F, 0x20820820, 0x1F81F7DF, 0x1F81F31F, 0x2080C7E0, 0x1F32081F, 0x1F7DF81F, + 0x207DF7DF, 0x20C9F31F, 0x1F7DF7E0, 0x208207E0, 0x327E07DF, 0x1F81F81F, 0x1F7DF820, 0x2081F7DF, + 0x1F8207DF, 0x1F81F7E0, 0x1F8207E0, 0x00000020 + ], + 'decoded_word': 0x45C1E650, + 'info_bits': [0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0], + 'converged': True, + 'iterations': 1, + 'syndrome_weight': 0, + 'bit_errors': 0, + }, + { + 'index': 8, + 'llr_words': [ + 0x1F81F7E0, 0x1F81F81F, 0x20820820, 0x203207DF, 0x1F8207DF, 0x207CC81F, 0x207DF81F, 0x1F7E081F, + 0x1F81F7E0, 0x208207E0, 0x207DF820, 0x207DF81F, 0x2081F7E0, 0x207F27DF, 0x2031F7E0, 0x1F8207E0, + 0x208207E0, 0x207DF7CC, 0x1F82081F, 0x2081F81F, 0x1F81F820, 0x207E07DF, 0x1F7DF820, 0x2081F81F, + 0x1F8207DF, 0x207E0820, 0x207DF820, 0x1F81F820, 0x20820820, 0x0C81F81F, 0x1F7E07DF, 0x2081F80C, + 0x1F820832, 0x1F7DF820, 0x1F8207CC, 0x207E07DF, 0x1F82080C, 0x1F8207DF, 0x207E080C, 0x1FCA07DF, + 0x2081F7DF, 0x1F81F820, 0x1F7DF31F, 0x1F7DF820, 0x1F7E07DF, 0x2081F81F, 0x207E0820, 0x0C7DF81F, + 0x207DF7DF, 0x2082081F, 0x1F81F7E0, 0x0000001F + ], + 'decoded_word': 0xA4CA7D49, + 'info_bits': [1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1], + 'converged': True, + 'iterations': 1, + 'syndrome_weight': 0, + 'bit_errors': 0, + }, + { + 'index': 9, + 'llr_words': [ + 0x1F30C7DF, 0x208207DF, 0x2081F81F, 0x207DF820, 0x1F7E07DF, 0x1FCA07DF, 0x1F820820, 0x1F31F820, + 0x207DF7DF, 0x1F81F820, 0x1F820820, 0x207DF80C, 0x1F7DF7DF, 0x20820820, 0x208327DF, 0x203207DF, + 0x32CA07DF, 0x1F81F7E0, 0x1F7E07DF, 0x207E07CC, 0x207E081F, 0x1F81F81F, 0x1F81F7DF, 0x328327DF, + 0x0C81F7E0, 0x1F7F27DF, 0x1F81F7DF, 0x208207E0, 0x207E07DF, 0x1F7DF7E0, 0x1F7DF81F, 0x1F320832, + 0x207E081F, 0x2081F7DF, 0x207E080C, 0x207E081F, 0x20C9F320, 0x207E07E0, 0x207E081F, 0x1F7E07DF, + 0x207E081F, 0x1F7E07E0, 0x1F81F7E0, 0x1F8207E0, 0x0C8207E0, 0x20820820, 0x1F7DF81F, 0x1F81F7E0, + 0x1F7E0320, 0x1F81F320, 0x2081F820, 0x0000001F + ], + 'decoded_word': 0xD849EB80, + 'info_bits': [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1], + 'converged': True, + 'iterations': 1, + 'syndrome_weight': 0, + 'bit_errors': 0, + }, + { + 'index': 10, + 'llr_words': [ + 0x0C30C30C, 0x0C30C80C, 0x0C30CEBA, 0x0C32733A, 0x279E030C, 0x0C820320, 0x0C32780C, 0x0C30C30C, + 0x0CE8CEBA, 0x3A9CC80C, 0x3A32030C, 0x2030C9FA, 0x203209CC, 0x0C80C30C, 0x3A30C320, 0x0C30CE8C, + 0x209CC320, 0x209CC327, 0x0C30C320, 0x3A9CCE8C, 0x2080C30C, 0x27820EA7, 0x2083A30C, 0x0C9FA33A, + 0x0CEA0EA0, 0x20327EBA, 0x2030C320, 0x2732730C, 0x3A820EA0, 0x0C9FA320, 0x0C9FA30C, 0x0C80C320, + 0x0CEBA9FA, 0x2780CEBA, 0x0C3209E0, 0x3AE8CE8C, 0x2030C320, 0x2030CE8C, 0x0C30CE8C, 0x2730C327, + 0x0C30C30C, 0x0C327327, 0x209E730C, 0x27E8C80C, 0x0CE8C30C, 0x209E030C, 0x3A30C320, 0x0C32730C, + 0x0C30CE8C, 0x2030C320, 0x0C32780C, 0x0000000C + ], + 'decoded_word': 0x9BCA9A40, + 'info_bits': [0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1], + 'converged': True, + 'iterations': 1, + 'syndrome_weight': 0, + 'bit_errors': 0, + }, + { + 'index': 11, + 'llr_words': [ + 0x0C30C80C, 0x0C30C30C, 0x2730C820, 0x0C80C30C, 0x0C32730C, 0x0C30C9E7, 0x0CE8C33A, 0x0C9CC320, + 0x2032030C, 0x0C32030C, 0x0C30C9E0, 0x209CC320, 0x0C9E730C, 0x0C33A9CC, 0x3A80C30C, 0x0C30C80C, + 0x279CC320, 0x0CEA080C, 0x0C30C9CC, 0x279E0320, 0x2730C30C, 0x0CE8C30C, 0x0C80C9CC, 0x0C9CC30C, + 0x3AE8CEA0, 0x20E8C320, 0x0C33A80C, 0x0CEBA33A, 0x0C30C9CC, 0x27EA0E8C, 0x0C30CEBA, 0x0CE8C30C, + 0x0CEA7EA7, 0x0C30C30C, 0x0C83A327, 0x0CEBA30C, 0x0C83AEA0, 0x2033A80C, 0x0C80C30C, 0x0C30C30C, + 0x0C82730C, 0x3A30C33A, 0x3A820E8C, 0x0C30C320, 0x0C30C9E7, 0x279CC320, 0x2080C30C, 0x27320327, + 0x3A32083A, 0x0C33A80C, 0x0C9CC30C, 0x0000000C + ], + 'decoded_word': 0x79FFC352, + 'info_bits': [0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0], + 'converged': False, + 'iterations': 30, + 'syndrome_weight': 67, + 'bit_errors': 20, + }, + { + 'index': 12, + 'llr_words': [ + 0x3A82030C, 0x0CE8C827, 0x2083A327, 0x2780C827, 0x2730C320, 0x0C3279FA, 0x2730C30C, 0x2030C83A, + 0x279E09E7, 0x3A320320, 0x0CEA7EBA, 0x20320327, 0x0CE8C9CC, 0x0C30C80C, 0x0CE8C33A, 0x0C9CC9E0, + 0x0C30C80C, 0x2033A320, 0x0C32780C, 0x0C30C30C, 0x0C33AEBA, 0x0C80C327, 0x0CEA79CC, 0x0C30C320, + 0x0C30CEA7, 0x2033A820, 0x0C30C327, 0x2080CE8C, 0x0C32080C, 0x3A82030C, 0x0C30C30C, 0x0C327320, + 0x0C80C30C, 0x20EA730C, 0x27E8C80C, 0x3AEA7E8C, 0x2733AE8C, 0x0CE8C80C, 0x2730C33A, 0x3AE8C30C, + 0x279CCE8C, 0x0C33AE8C, 0x0C3209E0, 0x0C30C30C, 0x0C30C80C, 0x2780C327, 0x0C320EA0, 0x0C33AEA0, + 0x0C9E79E0, 0x2030CEA0, 0x2033AE8C, 0x00000020 + ], + 'decoded_word': 0x5D2534DC, + 'info_bits': [0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1], + 'converged': False, + 'iterations': 30, + 'syndrome_weight': 59, + 'bit_errors': 13, + }, + { + 'index': 13, + 'llr_words': [ + 0x0CE8C80C, 0x2032730C, 0x0CE8CE8C, 0x3A30C9FA, 0x209CC820, 0x0C80CE8C, 0x3A9CC30C, 0x0CE8C30C, + 0x2730CEA7, 0x0C30C80C, 0x2783A30C, 0x0C320EBA, 0x2030C33A, 0x0CEA080C, 0x20EA730C, 0x0C30C9E0, + 0x0C30C30C, 0x0C827320, 0x0C33A33A, 0x0CEA730C, 0x3A9E09FA, 0x0CE8C327, 0x0C9CC33A, 0x0C80CEA7, + 0x0CEA7EA0, 0x0C8209FA, 0x3A3209CC, 0x20327327, 0x0C30CE8C, 0x2030C320, 0x3A30C327, 0x0CEA030C, + 0x3A9E0E8C, 0x0CEA0E8C, 0x3AE8C80C, 0x0C9E730C, 0x0C30C30C, 0x2032030C, 0x0C320820, 0x0C33A30C, + 0x27E8CEBA, 0x20EA730C, 0x0C30C30C, 0x3A30C820, 0x3A32730C, 0x0C80CEA0, 0x0C82780C, 0x20EA0320, + 0x0C32033A, 0x2030C30C, 0x27320EA0, 0x0000003A + ], + 'decoded_word': 0xF21718ED, + 'info_bits': [0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0], + 'converged': False, + 'iterations': 30, + 'syndrome_weight': 61, + 'bit_errors': 19, + }, + { + 'index': 14, + 'llr_words': [ + 0x0CEA0327, 0x0C80CEBA, 0x209CC327, 0x0C30C33A, 0x0C30C30C, 0x0C9CC83A, 0x0C9CC80C, 0x3A32730C, + 0x0C9CC30C, 0x0C32033A, 0x0C3209FA, 0x0C82730C, 0x0CEA0E8C, 0x2732730C, 0x0C30C30C, 0x3AE8CEBA, + 0x3A30C33A, 0x0C80C9E7, 0x20E8CE8C, 0x2783A327, 0x2083A320, 0x2732030C, 0x2730C30C, 0x0C80C30C, + 0x3A327327, 0x0C80C327, 0x0C30CEA7, 0x0C30CE8C, 0x0C80C80C, 0x3A820327, 0x3A30C30C, 0x0CE8C320, + 0x3AE8C80C, 0x209FA80C, 0x0C30C320, 0x0C30C33A, 0x2080C80C, 0x0C30C33A, 0x3A9E09E0, 0x0C9CC320, + 0x3A30C320, 0x0C83A9FA, 0x0C30C30C, 0x0C30C827, 0x0C327E8C, 0x2730C80C, 0x0C80C30C, 0x3A30C30C, + 0x0CE8C33A, 0x0C9E0E8C, 0x0C30C327, 0x0000000C + ], + 'decoded_word': 0x7FE0197C, + 'info_bits': [1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1], + 'converged': False, + 'iterations': 30, + 'syndrome_weight': 65, + 'bit_errors': 17, + }, + { + 'index': 15, + 'llr_words': [ + 0x2780C30C, 0x27827E8C, 0x0C30CE8C, 0x0C32783A, 0x3A80C320, 0x0C30C30C, 0x0C30C30C, 0x0C33A33A, + 0x2730C9FA, 0x0CE8C827, 0x0C32030C, 0x0C32033A, 0x2080CEBA, 0x0C9CC30C, 0x2030C9E0, 0x0C30C9FA, + 0x2732030C, 0x0C9CC9CC, 0x3A80C320, 0x0C33AE8C, 0x3A80CEBA, 0x2733AEA7, 0x3A80C83A, 0x0CE8C33A, + 0x0C327820, 0x27E8CEA7, 0x0CEA7EA0, 0x0C30C30C, 0x0CE8C30C, 0x0C33A9CC, 0x0C30C9FA, 0x0C80C80C, + 0x3A30C327, 0x3AE8C80C, 0x0C32033A, 0x3A3209E0, 0x2730C30C, 0x20320E8C, 0x3A33A9CC, 0x2033A33A, + 0x3A9CCEBA, 0x0CEA030C, 0x279CCE8C, 0x0C9CC30C, 0x0C820320, 0x0C32033A, 0x0C3209CC, 0x2082033A, + 0x3A30C320, 0x20320EA7, 0x27E8C33A, 0x0000000C + ], + 'decoded_word': 0x9E869CC2, + 'info_bits': [0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0], + 'converged': False, + 'iterations': 30, + 'syndrome_weight': 75, + 'bit_errors': 16, + }, + { + 'index': 16, + 'llr_words': [ + 0x3A30C327, 0x3AE8C320, 0x3A33A30C, 0x0C80C9E0, 0x0CE8CE8C, 0x2032030C, 0x3A33A320, 0x3A33A33A, + 0x0C3279CC, 0x2730C827, 0x0CEBA83A, 0x0C9CC33A, 0x0C80C320, 0x27327EA7, 0x0C320327, 0x0C9CC83A, + 0x3A80CE8C, 0x0C30C33A, 0x0C3209E0, 0x0C30CEBA, 0x0C82783A, 0x0C30C320, 0x0C30CEBA, 0x0C33A30C, + 0x0CE8C30C, 0x2030C320, 0x27EBA9E0, 0x0C30C327, 0x3AE8C320, 0x3A30CE8C, 0x2030C827, 0x0C9CC9E0, + 0x273209FA, 0x3A30CEA0, 0x3A82730C, 0x0CEBA30C, 0x0C320E8C, 0x0C80C9FA, 0x3A32080C, 0x2032730C, + 0x0C33A30C, 0x0C33A327, 0x0C80CEA0, 0x0C327320, 0x0C80C320, 0x20E8C320, 0x0C30C9CC, 0x0C30C820, + 0x3A820327, 0x3A82780C, 0x0C32033A, 0x0000003A + ], + 'decoded_word': 0x4E7507D9, + 'info_bits': [1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0], + 'converged': False, + 'iterations': 30, + 'syndrome_weight': 56, + 'bit_errors': 14, + }, + { + 'index': 17, + 'llr_words': [ + 0x3A30C30C, 0x0C80C30C, 0x2033A30C, 0x3AEBA33A, 0x27E8C33A, 0x0CE8C30C, 0x0C80C33A, 0x0C33A80C, + 0x0C33A30C, 0x2030C320, 0x0C30C30C, 0x0C30C327, 0x0C33A820, 0x3AEBA30C, 0x2730C80C, 0x0C82080C, + 0x0CE8C30C, 0x0CE8CE8C, 0x3A80C327, 0x0C33A30C, 0x0C30CE8C, 0x2732030C, 0x3A30C33A, 0x0CE8C33A, + 0x209CC80C, 0x0C30CE8C, 0x0CE8C30C, 0x0C33A9E7, 0x3A83AEA7, 0x2780C30C, 0x2030C33A, 0x0CEBA83A, + 0x2080C30C, 0x209CC30C, 0x0C30C30C, 0x0C33A327, 0x0C32030C, 0x3A80C33A, 0x0C83A9CC, 0x0C9FA30C, + 0x3A33A30C, 0x0C9CC80C, 0x2782730C, 0x2032730C, 0x0C33AEBA, 0x2033AEA0, 0x2732730C, 0x0C9E7320, + 0x0C80C9FA, 0x0C32030C, 0x0C83A9E0, 0x00000020 + ], + 'decoded_word': 0xBB5F2BF1, + 'info_bits': [0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1], + 'converged': False, + 'iterations': 30, + 'syndrome_weight': 51, + 'bit_errors': 19, + }, + { + 'index': 18, + 'llr_words': [ + 0x3A9E083A, 0x2080C30C, 0x27E8C320, 0x3A327EA7, 0x203209E7, 0x0CE8C33A, 0x0C80C33A, 0x278209E7, + 0x0CE8C9FA, 0x0C327EA0, 0x209E0827, 0x209FA80C, 0x0C9E083A, 0x0C30C327, 0x0C32730C, 0x0CEA083A, + 0x20EA7327, 0x2730C30C, 0x0C9E09E7, 0x2033AEBA, 0x0C30CEBA, 0x0C30C30C, 0x0C9E7EBA, 0x3AE8C9CC, + 0x3A30C30C, 0x0C33A9E0, 0x0C9FA30C, 0x3A33A30C, 0x2080C30C, 0x0C9FA30C, 0x3A32730C, 0x27827E8C, + 0x2782730C, 0x2080CE8C, 0x0C80C320, 0x2030CE8C, 0x0C82030C, 0x0CEBA30C, 0x20EA79FA, 0x3A32030C, + 0x2730C30C, 0x0C3209CC, 0x209E0820, 0x0C9CC33A, 0x3A9CC320, 0x0C9E780C, 0x0C30C80C, 0x0C30C9E0, + 0x0C30CE8C, 0x209CC30C, 0x0C80C30C, 0x00000027 + ], + 'decoded_word': 0xAA500741, + 'info_bits': [1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1], + 'converged': False, + 'iterations': 30, + 'syndrome_weight': 76, + 'bit_errors': 18, + }, + { + 'index': 19, + 'llr_words': [ + 0x3A80C33A, 0x0CEA7327, 0x0C32780C, 0x0C30C30C, 0x279CC9CC, 0x3A33A30C, 0x3A32030C, 0x0C30C30C, + 0x273209E0, 0x2032030C, 0x0CE8C30C, 0x0C30C30C, 0x3A33A327, 0x0C30C9E0, 0x0C80CEA0, 0x0C30C30C, + 0x0C30C320, 0x0C83A33A, 0x0CEA030C, 0x3A80CE8C, 0x0C327EA0, 0x0C80C9E0, 0x3A320827, 0x0C320EA0, + 0x0C30C30C, 0x0CE8CE8C, 0x0C30C320, 0x0C327827, 0x203279E0, 0x0C30C30C, 0x0C33A9E7, 0x3A32030C, + 0x2030C83A, 0x0C9E09CC, 0x0C3209CC, 0x27E8C9CC, 0x27EBA83A, 0x3AE8C327, 0x27E8C327, 0x0C30C30C, + 0x0C80CE8C, 0x0CEA0EBA, 0x0C32730C, 0x2730C9E0, 0x279CC33A, 0x0C30CEBA, 0x2730C320, 0x0C30C30C, + 0x0C3209FA, 0x3A33A327, 0x209CCE8C, 0x0000000C + ], + 'decoded_word': 0xF98E6EFE, + 'info_bits': [1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0], + 'converged': False, + 'iterations': 30, + 'syndrome_weight': 42, + 'bit_errors': 16, + }, +] + + +def get_converged_vectors(): + """Return only vectors that converged (for positive testing).""" + return [v for v in TEST_VECTORS if v['converged']] + + +def get_failed_vectors(): + """Return only vectors that did not converge (for negative testing).""" + return [v for v in TEST_VECTORS if not v['converged']]