/* Error correction for CAFÉ NAND controller Author: Tom Chiou @ Marvell GPL'd */ #include #include #include #include static unsigned int gf4096_mul(unsigned int, unsigned int); static unsigned int gf64_mul(unsigned int, unsigned int); static void syndrome_gen(unsigned int *); static void crc_gen(unsigned int *); static unsigned int crc_lut(unsigned int); static void conv_pgdat_12bit(unsigned int *, unsigned int *); static void conv_pgdat_32bit(unsigned int *, unsigned int *, unsigned int *); static void cnt_fill_pgdat_byte(unsigned int *); static void rnd_fill_pgdat_byte(int, unsigned int, unsigned int *); static void chk_syndrome_gen(unsigned int *, unsigned int *); static void chk_err(unsigned int *, unsigned int *); static unsigned int gf64_inv(unsigned int); static unsigned int gf4096_inv(unsigned int); static unsigned int err_pos_lut(unsigned int); static void find_4bit_err_coefs(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int *); static void zero_4x5_col3(unsigned int[4][5]); static void zero_4x5_col2(unsigned int[4][5]); static void zero_4x5_col1(unsigned int[4][5]); static void swap_4x5_rows(unsigned int[4][5], int, int, int); static void swap_row_order(int *, int, int); static void solve_4x5(unsigned int m[4][5], unsigned int *, int *); static void sort_coefs(int *, unsigned int *, int); static void find_4bit_err_pats(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int *); static void find_3bit_err_coefs(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int *); static void zero_3x4_col2(unsigned int[3][4]); static void zero_3x4_col1(unsigned int[3][4]); static void swap_3x4_rows(unsigned int[3][4], int, int, int); static void solve_3x4(unsigned int[3][4], unsigned int *, int *); static void find_3bit_err_pats(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int *); static void find_2bit_err_pats(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int *); static void find_2x2_soln(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int *); static void swap_2x3_rows(unsigned int[2][3]); static void solve_2x3(unsigned int[2][3], unsigned int *); static void sort_info(unsigned int *); static void syn_poly_gen(unsigned int, int); static int chk_no_err_only(unsigned int *, unsigned int *); static int chk_1_err_only(unsigned int *, unsigned int *); static int chk_2_err_only(unsigned int *, unsigned int *); static int chk_3_err_only(unsigned int *, unsigned int *); static int chk_4_err_only(unsigned int *, unsigned int *); //testing only function static void weishi_fill_pgdat_byte(unsigned int *); static void conv_32bit_to_12bit_loc_pat(int); int main(void) { unsigned int chk_syn[8] = { 2628, 4047, 1424, 464, 443, 3596, 3079, 2726 }; unsigned int err_info[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; printf("syn: %d %d %d %d %d %d %d %d\n", chk_syn[0], chk_syn[1], chk_syn[2], chk_syn[3], chk_syn[4], chk_syn[5], chk_syn[6], chk_syn[7]); chk_err(chk_syn, err_info); printf("err: %d %d %d %d %d %d %d %d\n", err_info[0], err_info[1], err_info[2], err_info[3], err_info[4], err_info[5], err_info[6], err_info[7]); return 0; } static unsigned int gf64_mul(unsigned int a, unsigned int b) { unsigned int tmp1, tmp2, tmp3, tmp4, tmp5; unsigned int c_bit0, c_bit1, c_bit2, c_bit3, c_bit4, c_bit5, c; tmp1 = ((a) ^ (a >> 5)); tmp2 = ((a >> 4) ^ (a >> 5)); tmp3 = ((a >> 3) ^ (a >> 4)); tmp4 = ((a >> 2) ^ (a >> 3)); tmp5 = ((a >> 1) ^ (a >> 2)); c_bit0 = ((a & b) ^ ((a >> 5) & (b >> 1)) ^ ((a >> 4) & (b >> 2)) ^ ((a >> 3) & (b >> 3)) ^ ((a >> 2) & (b >> 4)) ^ ((a >> 1) & (b >> 5))) & 0x1; c_bit1 = (((a >> 1) & b) ^ (tmp1 & (b >> 1)) ^ (tmp2 & (b >> 2)) ^ (tmp3 & (b >> 3)) ^ (tmp4 & (b >> 4)) ^ (tmp5 & (b >> 5))) & 0x1; c_bit2 = (((a >> 2) & b) ^ ((a >> 1) & (b >> 1)) ^ (tmp1 & (b >> 2)) ^ (tmp2 & (b >> 3)) ^ (tmp3 & (b >> 4)) ^ (tmp4 & (b >> 5))) & 0x1; c_bit3 = (((a >> 3) & b) ^ ((a >> 2) & (b >> 1)) ^ ((a >> 1) & (b >> 2)) ^ (tmp1 & (b >> 3)) ^ (tmp2 & (b >> 4)) ^ (tmp3 & (b >> 5))) & 0x1; c_bit4 = (((a >> 4) & b) ^ ((a >> 3) & (b >> 1)) ^ ((a >> 2) & (b >> 2)) ^ ((a >> 1) & (b >> 3)) ^ (tmp1 & (b >> 4)) ^ (tmp2 & (b >> 5))) & 0x1; c_bit5 = (((a >> 5) & b) ^ ((a >> 4) & (b >> 1)) ^ ((a >> 3) & (b >> 2)) ^ ((a >> 2) & (b >> 3)) ^ ((a >> 1) & (b >> 4)) ^ (tmp1 & (b >> 5))) & 0x1; c = c_bit0 | (c_bit1 << 1) | (c_bit2 << 2) | (c_bit3 << 3) | (c_bit4 << 4) | (c_bit5 << 5); return c; } static unsigned int gf4096_mul(unsigned int a, unsigned int b) { unsigned int ah, al, bh, bl, alxah, blxbh, ablh, albl, ahbh, ahbhB, c; ah = (a >> 6) & 0x3f; al = a & 0x3f; bh = (b >> 6) & 0x3f; bl = b & 0x3f; alxah = al ^ ah; blxbh = bl ^ bh; ablh = gf64_mul(alxah, blxbh); albl = gf64_mul(al, bl); ahbh = gf64_mul(ah, bh); ahbhB = ((ahbh & 0x1) << 5) | ((ahbh & 0x20) >> 1) | ((ahbh & 0x10) >> 1) | ((ahbh & 0x8) >> 1) | ((ahbh & 0x4) >> 1) | (((ahbh >> 1) ^ ahbh) & 0x1); c = ((ablh ^ albl) << 6) | (ahbhB ^ albl); return c; } static void chk_err(unsigned int *chk_syndrome_list, unsigned int *err_info) { if (chk_no_err_only(chk_syndrome_list, err_info)) { } else if (chk_1_err_only(chk_syndrome_list, err_info)) { } else if (chk_2_err_only(chk_syndrome_list, err_info)) { } else if (chk_3_err_only(chk_syndrome_list, err_info)) { } else { chk_4_err_only(chk_syndrome_list, err_info); } } static void find_2bit_err_pats(unsigned int s0, unsigned int s1, unsigned int r0, unsigned int r1, unsigned int *pats) { find_2x2_soln(0x1, 0x1, r0, r1, s0, s1, pats); } static void find_3bit_err_coefs(unsigned int s0, unsigned int s1, unsigned int s2, unsigned int s3, unsigned int s4, unsigned int s5, unsigned int *coefs) { unsigned int m[3][4]; int row_order[3]; row_order[0] = 0; row_order[1] = 1; row_order[2] = 2; m[0][0] = s2; m[0][1] = s1; m[0][2] = s0; m[0][3] = s3; m[1][0] = s3; m[1][1] = s2; m[1][2] = s1; m[1][3] = s4; m[2][0] = s4; m[2][1] = s3; m[2][2] = s2; m[2][3] = s5; if (m[0][2] != 0x0) { zero_3x4_col2(m); } else if (m[1][2] != 0x0) { swap_3x4_rows(m, 0, 1, 4); zero_3x4_col2(m); } else if (m[2][2] != 0x0) { swap_3x4_rows(m, 0, 2, 4); zero_3x4_col2(m); } else { printf("Warning: find_3bit_err_coefs, s0,s1,s2 all zeros!\n"); } if (m[1][1] != 0x0) { zero_3x4_col1(m); } else if (m[2][1] != 0x0) { swap_3x4_rows(m, 1, 2, 4); zero_3x4_col1(m); } else { printf("Warning: find_3bit_err_coefs, cannot resolve col 1!\n"); } /* solve coefs */ solve_3x4(m, coefs, row_order); } static void zero_3x4_col2(unsigned int m[3][4]) { unsigned int minv1, minv2; minv1 = gf4096_mul(m[1][2], gf4096_inv(m[0][2])); minv2 = gf4096_mul(m[2][2], gf4096_inv(m[0][2])); m[1][0] = m[1][0] ^ gf4096_mul(m[0][0], minv1); m[1][1] = m[1][1] ^ gf4096_mul(m[0][1], minv1); m[1][3] = m[1][3] ^ gf4096_mul(m[0][3], minv1); m[2][0] = m[2][0] ^ gf4096_mul(m[0][0], minv2); m[2][1] = m[2][1] ^ gf4096_mul(m[0][1], minv2); m[2][3] = m[2][3] ^ gf4096_mul(m[0][3], minv2); } static void zero_3x4_col1(unsigned int m[3][4]) { unsigned int minv; minv = gf4096_mul(m[2][1], gf4096_inv(m[1][1])); m[2][0] = m[2][0] ^ gf4096_mul(m[1][0], minv); m[2][3] = m[2][3] ^ gf4096_mul(m[1][3], minv); } static void swap_3x4_rows(unsigned int m[3][4], int i, int j, int col_width) { unsigned int tmp0; int cnt; for (cnt = 0; cnt < col_width; cnt++) { tmp0 = m[i][cnt]; m[i][cnt] = m[j][cnt]; m[j][cnt] = tmp0; } } static void solve_3x4(unsigned int m[3][4], unsigned int *coefs, int *row_order) { unsigned int tmp[3]; tmp[0] = gf4096_mul(m[2][3], gf4096_inv(m[2][0])); tmp[1] = gf4096_mul((gf4096_mul(tmp[0], m[1][0]) ^ m[1][3]), gf4096_inv(m[1][1])); tmp[2] = gf4096_mul((gf4096_mul(tmp[0], m[0][0]) ^ gf4096_mul(tmp[1], m[0][1]) ^ m[0][3]), gf4096_inv(m[0][2])); sort_coefs(row_order, tmp, 3); coefs[0] = tmp[0]; coefs[1] = tmp[1]; coefs[2] = tmp[2]; } static void find_3bit_err_pats(unsigned int s0, unsigned int s1, unsigned int s2, unsigned int r0, unsigned int r1, unsigned int r2, unsigned int *pats) { /* //for (x+alpha) find_2x2_soln(gf4096_mul(r2^r0,r0), gf4096_mul(r1^r2,r1), gf4096_mul(gf4096_mul(r0,r2)^gf4096_mul(r0,r0),r0), gf4096_mul(gf4096_mul(r1,r2)^gf4096_mul(r1,r1),r1), gf4096_mul(s0,r2)^s1, gf4096_mul(s1,r2)^s2, pats); pats[2]=gf4096_mul(gf4096_mul(pats[0],r0)^gf4096_mul(pats[1],r1)^s0,gf4096_inv(r2)); */ //for(x+1) find_2x2_soln(r0 ^ r2, r1 ^ r2, gf4096_mul(r0, r0 ^ r2), gf4096_mul(r1, r1 ^ r2), gf4096_mul(s0, r2) ^ s1, gf4096_mul(s1, r2) ^ s2, pats); pats[2] = s0 ^ pats[0] ^ pats[1]; } static void find_4bit_err_coefs(unsigned int s0, unsigned int s1, unsigned int s2, unsigned int s3, unsigned int s4, unsigned int s5, unsigned int s6, unsigned int s7, unsigned int *coefs) { unsigned int m[4][5]; int row_order[4]; row_order[0] = 0; row_order[1] = 1; row_order[2] = 2; row_order[3] = 3; m[0][0] = s3; m[0][1] = s2; m[0][2] = s1; m[0][3] = s0; m[0][4] = s4; m[1][0] = s4; m[1][1] = s3; m[1][2] = s2; m[1][3] = s1; m[1][4] = s5; m[2][0] = s5; m[2][1] = s4; m[2][2] = s3; m[2][3] = s2; m[2][4] = s6; m[3][0] = s6; m[3][1] = s5; m[3][2] = s4; m[3][3] = s3; m[3][4] = s7; if (m[0][3] != 0x0) { zero_4x5_col3(m); } else if (m[1][3] != 0x0) { swap_4x5_rows(m, 0, 1, 5); zero_4x5_col3(m); } else if (m[2][3] != 0x0) { swap_4x5_rows(m, 0, 2, 5); zero_4x5_col3(m); } else if (m[3][3] != 0x0) { swap_4x5_rows(m, 0, 3, 5); zero_4x5_col3(m); } else { printf("Error: find_4bit_err_coefs, s0,s1,s2,s3 all zeros!\n"); } if (m[1][2] != 0x0) { zero_4x5_col2(m); } else if (m[2][2] != 0x0) { swap_4x5_rows(m, 1, 2, 5); zero_4x5_col2(m); } else if (m[3][2] != 0x0) { swap_4x5_rows(m, 1, 3, 5); zero_4x5_col2(m); } else { printf("Error: find_4bit_err_coefs, cannot resolve col 2!\n"); } if (m[2][1] != 0x0) { zero_4x5_col1(m); } else if (m[3][1] != 0x0) { swap_4x5_rows(m, 2, 3, 5); zero_4x5_col1(m); } else { printf("Error: find_4bit_err_coefs, cannot resolve col 1!\n"); } //solve coefs solve_4x5(m, coefs, row_order); } static void zero_4x5_col3(unsigned int m[4][5]) { unsigned int minv1, minv2, minv3; minv1 = gf4096_mul(m[1][3], gf4096_inv(m[0][3])); minv2 = gf4096_mul(m[2][3], gf4096_inv(m[0][3])); minv3 = gf4096_mul(m[3][3], gf4096_inv(m[0][3])); m[1][0] = m[1][0] ^ gf4096_mul(m[0][0], minv1); m[1][1] = m[1][1] ^ gf4096_mul(m[0][1], minv1); m[1][2] = m[1][2] ^ gf4096_mul(m[0][2], minv1); m[1][4] = m[1][4] ^ gf4096_mul(m[0][4], minv1); m[2][0] = m[2][0] ^ gf4096_mul(m[0][0], minv2); m[2][1] = m[2][1] ^ gf4096_mul(m[0][1], minv2); m[2][2] = m[2][2] ^ gf4096_mul(m[0][2], minv2); m[2][4] = m[2][4] ^ gf4096_mul(m[0][4], minv2); m[3][0] = m[3][0] ^ gf4096_mul(m[0][0], minv3); m[3][1] = m[3][1] ^ gf4096_mul(m[0][1], minv3); m[3][2] = m[3][2] ^ gf4096_mul(m[0][2], minv3); m[3][4] = m[3][4] ^ gf4096_mul(m[0][4], minv3); } static void zero_4x5_col2(unsigned int m[4][5]) { unsigned int minv2, minv3; minv2 = gf4096_mul(m[2][2], gf4096_inv(m[1][2])); minv3 = gf4096_mul(m[3][2], gf4096_inv(m[1][2])); m[2][0] = m[2][0] ^ gf4096_mul(m[1][0], minv2); m[2][1] = m[2][1] ^ gf4096_mul(m[1][1], minv2); m[2][4] = m[2][4] ^ gf4096_mul(m[1][4], minv2); m[3][0] = m[3][0] ^ gf4096_mul(m[1][0], minv3); m[3][1] = m[3][1] ^ gf4096_mul(m[1][1], minv3); m[3][4] = m[3][4] ^ gf4096_mul(m[1][4], minv3); } static void zero_4x5_col1(unsigned int m[4][5]) { unsigned int minv; minv = gf4096_mul(m[3][1], gf4096_inv(m[2][1])); m[3][0] = m[3][0] ^ gf4096_mul(m[2][0], minv); m[3][4] = m[3][4] ^ gf4096_mul(m[2][4], minv); } static void swap_4x5_rows(unsigned int m[4][5], int i, int j, int col_width) { unsigned int tmp0; int cnt; for (cnt = 0; cnt < col_width; cnt++) { tmp0 = m[i][cnt]; m[i][cnt] = m[j][cnt]; m[j][cnt] = tmp0; } } static void solve_4x5(unsigned int m[4][5], unsigned int *coefs, int *row_order) { unsigned int tmp[4]; tmp[0] = gf4096_mul(m[3][4], gf4096_inv(m[3][0])); tmp[1] = gf4096_mul((gf4096_mul(tmp[0], m[2][0]) ^ m[2][4]), gf4096_inv(m[2][1])); tmp[2] = gf4096_mul((gf4096_mul(tmp[0], m[1][0]) ^ gf4096_mul(tmp[1], m[1][1]) ^ m[1][4]), gf4096_inv(m[1][2])); tmp[3] = gf4096_mul((gf4096_mul(tmp[0], m[0][0]) ^ gf4096_mul(tmp[1], m[0][1]) ^ gf4096_mul(tmp[2], m[0][2]) ^ m[0][4]), gf4096_inv(m[0][3])); sort_coefs(row_order, tmp, 4); coefs[0] = tmp[0]; coefs[1] = tmp[1]; coefs[2] = tmp[2]; coefs[3] = tmp[3]; } static void sort_coefs(int *order, unsigned int *soln, int len) { int cnt, start_cnt, least_ord, least_cnt; unsigned int tmp0; for (start_cnt = 0; start_cnt < len; start_cnt++) { for (cnt = start_cnt; cnt < len; cnt++) { if (cnt == start_cnt) { least_ord = order[cnt]; least_cnt = start_cnt; } else { if (least_ord > order[cnt]) { least_ord = order[cnt]; least_cnt = cnt; } } } if (least_cnt != start_cnt) { tmp0 = order[least_cnt]; order[least_cnt] = order[start_cnt]; order[start_cnt] = tmp0; tmp0 = soln[least_cnt]; soln[least_cnt] = soln[start_cnt]; soln[start_cnt] = tmp0; } } } static void find_4bit_err_pats(unsigned int s0, unsigned int s1, unsigned int s2, unsigned int s3, unsigned int z1, unsigned int z2, unsigned int z3, unsigned int z4, unsigned int *pats) { /* //for (x+alpha) unsigned int z1z4_z1z1, z3z3z4_z3z3z3, z2z4_z2z2, z1z1z4_z1z1z1, z3z4_z3z3, z2z2z4_z2z2z2, z3z3z3z4_z3z3z3z3, z1z1z1z4_z1z1z1z1, z2z2z2z4_z2z2z2z2, s0z4_s1, s1z4_s2, s2z4_s3; unsigned int tmp0,tmp1,tmp2,tmp3; z1z4_z1z1 = gf4096_mul(z1,z4)^gf4096_mul(z1,z1); z3z3z4_z3z3z3 = gf4096_mul(gf4096_mul(z3,z3),z4)^gf4096_mul(gf4096_mul(z3,z3),z3); z2z4_z2z2 = gf4096_mul(z2,z4)^gf4096_mul(z2,z2); z1z1z4_z1z1z1 = gf4096_mul(gf4096_mul(z1,z1),z4)^gf4096_mul(gf4096_mul(z1,z1),z1); z3z4_z3z3 = gf4096_mul(z3,z4)^gf4096_mul(z3,z3); z2z2z4_z2z2z2 = gf4096_mul(gf4096_mul(z2,z2),z4)^gf4096_mul(gf4096_mul(z2,z2),z2); z3z3z3z4_z3z3z3z3=gf4096_mul(z3z3z4_z3z3z3,z3); z1z1z1z4_z1z1z1z1=gf4096_mul(z1z1z4_z1z1z1,z1); z2z2z2z4_z2z2z2z2=gf4096_mul(z2z2z4_z2z2z2,z2); s0z4_s1 = gf4096_mul(s0,z4)^s1; s1z4_s2 = gf4096_mul(s1,z4)^s2; s2z4_s3 = gf4096_mul(s2,z4)^s3; find_2x2_soln(gf4096_mul(z1z4_z1z1,z3z3z4_z3z3z3)^gf4096_mul(z1z1z4_z1z1z1,z3z4_z3z3), gf4096_mul(z2z4_z2z2,z3z3z4_z3z3z3)^gf4096_mul(z2z2z4_z2z2z2,z3z4_z3z3), gf4096_mul(z1z1z4_z1z1z1,z3z3z3z4_z3z3z3z3)^gf4096_mul(z1z1z1z4_z1z1z1z1,z3z3z4_z3z3z3), gf4096_mul(z2z2z4_z2z2z2,z3z3z3z4_z3z3z3z3)^gf4096_mul(z2z2z2z4_z2z2z2z2,z3z3z4_z3z3z3), gf4096_mul(s0z4_s1,z3z3z4_z3z3z3)^gf4096_mul(s1z4_s2,z3z4_z3z3), gf4096_mul(s1z4_s2,z3z3z3z4_z3z3z3z3)^gf4096_mul(s2z4_s3,z3z3z4_z3z3z3), pats); tmp0 = pats[0]; tmp1 = pats[1]; tmp2 = gf4096_mul(pats[0],z1)^gf4096_mul(pats[1],z2)^s0; tmp3 = gf4096_mul(gf4096_mul(pats[0],z1),z1)^gf4096_mul(gf4096_mul(pats[1],z2),z2)^s1; find_2x2_soln(z3, z4, gf4096_mul(z3,z3), gf4096_mul(z4,z4), tmp2, tmp3, pats); pats[2]=pats[0]; pats[3]=pats[1]; pats[0]=tmp0; pats[1]=tmp1; */ //for (x+1) unsigned int z4_z1, z3z4_z3z3, z4_z2, s0z4_s1, z1z4_z1z1, z4_z3, z2z4_z2z2, s1z4_s2, z3z3z4_z3z3z3, z1z1z4_z1z1z1, z2z2z4_z2z2z2, s2z4_s3; unsigned int tmp0, tmp1, tmp2, tmp3; z4_z1 = z4 ^ z1; z3z4_z3z3 = gf4096_mul(z3, z4) ^ gf4096_mul(z3, z3); z4_z2 = z4 ^ z2; s0z4_s1 = gf4096_mul(s0, z4) ^ s1; z1z4_z1z1 = gf4096_mul(z1, z4) ^ gf4096_mul(z1, z1); z4_z3 = z4 ^ z3; z2z4_z2z2 = gf4096_mul(z2, z4) ^ gf4096_mul(z2, z2); s1z4_s2 = gf4096_mul(s1, z4) ^ s2; z3z3z4_z3z3z3 = gf4096_mul(gf4096_mul(z3, z3), z4) ^ gf4096_mul(gf4096_mul(z3, z3), z3); z1z1z4_z1z1z1 = gf4096_mul(gf4096_mul(z1, z1), z4) ^ gf4096_mul(gf4096_mul(z1, z1), z1); z2z2z4_z2z2z2 = gf4096_mul(gf4096_mul(z2, z2), z4) ^ gf4096_mul(gf4096_mul(z2, z2), z2); s2z4_s3 = gf4096_mul(s2, z4) ^ s3; //find err pat 0,1 find_2x2_soln(gf4096_mul(z4_z1, z3z4_z3z3) ^ gf4096_mul(z1z4_z1z1, z4_z3), gf4096_mul(z4_z2, z3z4_z3z3) ^ gf4096_mul(z2z4_z2z2, z4_z3), gf4096_mul(z1z4_z1z1, z3z3z4_z3z3z3) ^ gf4096_mul(z1z1z4_z1z1z1, z3z4_z3z3), gf4096_mul(z2z4_z2z2, z3z3z4_z3z3z3) ^ gf4096_mul(z2z2z4_z2z2z2, z3z4_z3z3), gf4096_mul(s0z4_s1, z3z4_z3z3) ^ gf4096_mul(s1z4_s2, z4_z3), gf4096_mul(s1z4_s2, z3z3z4_z3z3z3) ^ gf4096_mul(s2z4_s3, z3z4_z3z3), pats); tmp0 = pats[0]; tmp1 = pats[1]; tmp2 = pats[0] ^ pats[1] ^ s0; tmp3 = gf4096_mul(pats[0], z1) ^ gf4096_mul(pats[1], z2) ^ s1; //find err pat 2,3 find_2x2_soln(0x1, 0x1, z3, z4, tmp2, tmp3, pats); pats[2] = pats[0]; pats[3] = pats[1]; pats[0] = tmp0; pats[1] = tmp1; } static void find_2x2_soln(unsigned int c00, unsigned int c01, unsigned int c10, unsigned int c11, unsigned int lval0, unsigned int lval1, unsigned int *soln) { unsigned int m[2][3]; m[0][0] = c00; m[0][1] = c01; m[0][2] = lval0; m[1][0] = c10; m[1][1] = c11; m[1][2] = lval1; if (m[0][1] != 0x0) { } else if (m[1][1] != 0x0) { swap_2x3_rows(m); } else { printf("Warning: find_2bit_err_coefs, s0,s1 all zeros!\n"); } solve_2x3(m, soln); } static void swap_2x3_rows(unsigned int m[2][3]) { unsigned int tmp0; int cnt; for (cnt = 0; cnt < 3; cnt++) { tmp0 = m[0][cnt]; m[0][cnt] = m[1][cnt]; m[1][cnt] = tmp0; } } static void solve_2x3(unsigned int m[2][3], unsigned int *coefs) { unsigned int minv; minv = gf4096_mul(m[1][1], gf4096_inv(m[0][1])); m[1][0] = m[1][0] ^ gf4096_mul(m[0][0], minv); m[1][2] = m[1][2] ^ gf4096_mul(m[0][2], minv); coefs[0] = gf4096_mul(m[1][2], gf4096_inv(m[1][0])); coefs[1] = gf4096_mul((gf4096_mul(coefs[0], m[0][0]) ^ m[0][2]), gf4096_inv(m[0][1])); } static unsigned int gf64_inv(unsigned int din) { unsigned int dout; switch (din) { case 0: dout = 0x0; break; case 1: dout = 0x1; break; case 2: dout = 0x21; break; case 3: dout = 0x3e; break; case 4: dout = 0x31; break; case 5: dout = 0x2b; break; case 6: dout = 0x1f; break; case 7: dout = 0x2c; break; case 8: dout = 0x39; break; case 9: dout = 0x25; break; case 10: dout = 0x34; break; case 11: dout = 0x1c; break; case 12: dout = 0x2e; break; case 13: dout = 0x28; break; case 14: dout = 0x16; break; case 15: dout = 0x19; break; case 16: dout = 0x3d; break; case 17: dout = 0x36; break; case 18: dout = 0x33; break; case 19: dout = 0x27; break; case 20: dout = 0x1a; break; case 21: dout = 0x23; break; case 22: dout = 0xe; break; case 23: dout = 0x18; break; case 24: dout = 0x17; break; case 25: dout = 0xf; break; case 26: dout = 0x14; break; case 27: dout = 0x22; break; case 28: dout = 0xb; break; case 29: dout = 0x35; break; case 30: dout = 0x2d; break; case 31: dout = 0x6; break; case 32: dout = 0x3f; break; case 33: dout = 0x2; break; case 34: dout = 0x1b; break; case 35: dout = 0x15; break; case 36: dout = 0x38; break; case 37: dout = 0x9; break; case 38: dout = 0x32; break; case 39: dout = 0x13; break; case 40: dout = 0xd; break; case 41: dout = 0x2f; break; case 42: dout = 0x30; break; case 43: dout = 0x5; break; case 44: dout = 0x7; break; case 45: dout = 0x1e; break; case 46: dout = 0xc; break; case 47: dout = 0x29; break; case 48: dout = 0x2a; break; case 49: dout = 0x4; break; case 50: dout = 0x26; break; case 51: dout = 0x12; break; case 52: dout = 0xa; break; case 53: dout = 0x1d; break; case 54: dout = 0x11; break; case 55: dout = 0x3c; break; case 56: dout = 0x24; break; case 57: dout = 0x8; break; case 58: dout = 0x3b; break; case 59: dout = 0x3a; break; case 60: dout = 0x37; break; case 61: dout = 0x10; break; case 62: dout = 0x3; break; case 63: dout = 0x20; break; default: dout = 0xffffffff; printf("Error: Invalid gf64_inv input!!\n");; break; } return dout; } static unsigned int gf4096_inv(unsigned int din) { unsigned int alahxal, ah2B, deno, inv, bl, bh; unsigned int ah, al, ahxal; unsigned dout; ah = (din >> 6) & 0x3f; al = din & 0x3f; ahxal = ah ^ al; ah2B = (((ah ^ (ah >> 3)) & 0x1) << 5) | ((ah >> 1) & 0x10) | ((((ah >> 5) ^ (ah >> 2)) & 0x1) << 3) | ((ah >> 2) & 0x4) | ((((ah >> 4) ^ (ah >> 1)) & 0x1) << 1) | (ah & 0x1); alahxal = gf64_mul(ahxal, al); deno = alahxal ^ ah2B; inv = gf64_inv(deno); bl = gf64_mul(inv, ahxal); bh = gf64_mul(inv, ah); dout = ((bh & 0x3f) << 6) | (bl & 0x3f); return (((bh & 0x3f) << 6) | (bl & 0x3f)); } static unsigned int err_pos_lut(unsigned int din) { unsigned int dout; switch (din) { case 0x001: dout = 0x000; break; case 0xe01: dout = 0x001; break; case 0xfff: dout = 0x002; break; case 0xfd6: dout = 0x003; break; case 0xabf: dout = 0x004; break; case 0x970: dout = 0x005; break; case 0xa8d: dout = 0x006; break; case 0x802: dout = 0x007; break; case 0xdd0: dout = 0x008; break; case 0xf5c: dout = 0x009; break; case 0x84d: dout = 0x00a; break; case 0xa43: dout = 0x00b; break; case 0xde8: dout = 0x00c; break; case 0x0a4: dout = 0x00d; break; case 0xc1c: dout = 0x00e; break; case 0xe07: dout = 0x00f; break; case 0xa79: dout = 0x010; break; case 0xed2: dout = 0x011; break; case 0xb88: dout = 0x012; break; case 0x734: dout = 0x013; break; case 0xc6b: dout = 0x014; break; case 0x66c: dout = 0x015; break; case 0xc9c: dout = 0x016; break; case 0x27f: dout = 0x017; break; case 0xa46: dout = 0x018; break; case 0xaad: dout = 0x019; break; case 0x122: dout = 0x01a; break; case 0xd91: dout = 0x01b; break; case 0xf01: dout = 0x01c; break; case 0x78c: dout = 0x01d; break; case 0xfeb: dout = 0x01e; break; case 0x202: dout = 0x01f; break; case 0xca7: dout = 0x020; break; case 0xf44: dout = 0x021; break; case 0xe95: dout = 0x022; break; case 0xe53: dout = 0x023; break; case 0x9f1: dout = 0x024; break; case 0x8f4: dout = 0x025; break; case 0x7c2: dout = 0x026; break; case 0x679: dout = 0x027; break; case 0xf49: dout = 0x028; break; case 0xb98: dout = 0x029; break; case 0x3a4: dout = 0x02a; break; case 0x40a: dout = 0x02b; break; case 0xe03: dout = 0x02c; break; case 0x33d: dout = 0x02d; break; case 0x0ab: dout = 0x02e; break; case 0x5d3: dout = 0x02f; break; case 0xc8d: dout = 0x030; break; case 0x8ee: dout = 0x031; break; case 0xdd8: dout = 0x032; break; case 0xd14: dout = 0x033; break; case 0x43c: dout = 0x034; break; case 0x635: dout = 0x035; break; case 0xa19: dout = 0x036; break; case 0x9ae: dout = 0x037; break; case 0xbf7: dout = 0x038; break; case 0xd17: dout = 0x039; break; case 0x6ff: dout = 0x03a; break; case 0x6b7: dout = 0x03b; break; case 0xaa3: dout = 0x03c; break; case 0x6ec: dout = 0x03d; break; case 0x0e4: dout = 0x03e; break; case 0x240: dout = 0x03f; break; case 0xe39: dout = 0x040; break; case 0x007: dout = 0x041; break; case 0xb87: dout = 0x042; break; case 0xefb: dout = 0x043; break; case 0xee1: dout = 0x044; break; case 0x4fb: dout = 0x045; break; case 0xf96: dout = 0x046; break; case 0x4e3: dout = 0x047; break; case 0x94e: dout = 0x048; break; case 0x0f3: dout = 0x049; break; case 0xd57: dout = 0x04a; break; case 0x8a3: dout = 0x04b; break; case 0x689: dout = 0x04c; break; case 0x0dd: dout = 0x04d; break; case 0x3b9: dout = 0x04e; break; case 0x597: dout = 0x04f; break; case 0xb95: dout = 0x050; break; case 0x6a9: dout = 0x051; break; case 0x9fd: dout = 0x052; break; case 0x3f8: dout = 0x053; break; case 0x5ca: dout = 0x054; break; case 0x454: dout = 0x055; break; case 0x301: dout = 0x056; break; case 0x617: dout = 0x057; break; case 0xffb: dout = 0x058; break; case 0x692: dout = 0x059; break; case 0x4c6: dout = 0x05a; break; case 0x72b: dout = 0x05b; break; case 0x134: dout = 0x05c; break; case 0xc87: dout = 0x05d; break; case 0x664: dout = 0x05e; break; case 0xed4: dout = 0x05f; break; case 0xe0e: dout = 0x060; break; case 0x630: dout = 0x061; break; case 0xd5c: dout = 0x062; break; case 0x828: dout = 0x063; break; case 0xa7a: dout = 0x064; break; case 0xc11: dout = 0x065; break; case 0xb0a: dout = 0x066; break; case 0x78e: dout = 0x067; break; case 0x329: dout = 0x068; break; case 0xd7f: dout = 0x069; break; case 0x3cb: dout = 0x06a; break; case 0xab9: dout = 0x06b; break; case 0xcf6: dout = 0x06c; break; case 0xb89: dout = 0x06d; break; case 0x935: dout = 0x06e; break; case 0x394: dout = 0x06f; break; case 0x9ba: dout = 0x070; break; case 0x623: dout = 0x071; break; case 0xb0f: dout = 0x072; break; case 0x0cb: dout = 0x073; break; case 0x2af: dout = 0x074; break; case 0xcf2: dout = 0x075; break; case 0x2cd: dout = 0x076; break; case 0x74c: dout = 0x077; break; case 0xdcf: dout = 0x078; break; case 0x203: dout = 0x079; break; case 0x2a6: dout = 0x07a; break; case 0x0bb: dout = 0x07b; break; case 0x143: dout = 0x07c; break; case 0x4ec: dout = 0x07d; break; case 0x081: dout = 0x07e; break; case 0x279: dout = 0x07f; break; case 0xfc0: dout = 0x080; break; case 0xba9: dout = 0x081; break; case 0x015: dout = 0x082; break; case 0x3d5: dout = 0x083; break; case 0x9e7: dout = 0x084; break; case 0x9e2: dout = 0x085; break; case 0xea7: dout = 0x086; break; case 0xf21: dout = 0x087; break; case 0xeac: dout = 0x088; break; case 0xfaa: dout = 0x089; break; case 0x25f: dout = 0x08a; break; case 0x366: dout = 0x08b; break; case 0xaec: dout = 0x08c; break; case 0x17f: dout = 0x08d; break; case 0x250: dout = 0x08e; break; case 0xaa9: dout = 0x08f; break; case 0x866: dout = 0x090; break; case 0x3e8: dout = 0x091; break; case 0x15a: dout = 0x092; break; case 0xc35: dout = 0x093; break; case 0xb6e: dout = 0x094; break; case 0x9b6: dout = 0x095; break; case 0xd2f: dout = 0x096; break; case 0x907: dout = 0x097; break; case 0x2e6: dout = 0x098; break; case 0xee7: dout = 0x099; break; case 0x17d: dout = 0x09a; break; case 0xe92: dout = 0x09b; break; case 0x5d4: dout = 0x09c; break; case 0x70a: dout = 0x09d; break; case 0x615: dout = 0x09e; break; case 0x339: dout = 0x09f; break; case 0x9ef: dout = 0x0a0; break; case 0xbaa: dout = 0x0a1; break; case 0x2d6: dout = 0x0a2; break; case 0x357: dout = 0x0a3; break; case 0x95d: dout = 0x0a4; break; case 0x6a0: dout = 0x0a5; break; case 0x5b4: dout = 0x0a6; break; case 0x076: dout = 0x0a7; break; case 0x66a: dout = 0x0a8; break; case 0x91a: dout = 0x0a9; break; case 0x37b: dout = 0x0aa; break; case 0xb71: dout = 0x0ab; break; case 0x4e9: dout = 0x0ac; break; case 0x7c4: dout = 0x0ad; break; case 0x3ff: dout = 0x0ae; break; case 0xe4d: dout = 0x0af; break; case 0xaaf: dout = 0x0b0; break; case 0xde0: dout = 0x0b1; break; case 0x2ec: dout = 0x0b2; break; case 0x06d: dout = 0x0b3; break; case 0x271: dout = 0x0b4; break; case 0xd88: dout = 0x0b5; break; case 0x7d8: dout = 0x0b6; break; case 0xc63: dout = 0x0b7; break; case 0x424: dout = 0x0b8; break; case 0x0ed: dout = 0x0b9; break; case 0xe09: dout = 0x0ba; break; case 0xdb7: dout = 0x0bb; break; case 0x3a7: dout = 0x0bc; break; case 0x6c9: dout = 0x0bd; break; case 0xe81: dout = 0x0be; break; case 0x387: dout = 0x0bf; break; case 0xfe9: dout = 0x0c0; break; case 0xec0: dout = 0x0c1; break; case 0x3da: dout = 0x0c2; break; case 0x028: dout = 0x0c3; break; case 0xb68: dout = 0x0c4; break; case 0xc30: dout = 0x0c5; break; case 0xc2b: dout = 0x0c6; break; case 0x830: dout = 0x0c7; break; case 0xca2: dout = 0x0c8; break; case 0x801: dout = 0x0c9; break; case 0xf13: dout = 0x0ca; break; case 0xfde: dout = 0x0cb; break; case 0x8f7: dout = 0x0cc; break; case 0x501: dout = 0x0cd; break; case 0x6fb: dout = 0x0ce; break; case 0xff3: dout = 0x0cf; break; case 0x4da: dout = 0x0d0; break; case 0x8b7: dout = 0x0d1; break; case 0xb5d: dout = 0x0d2; break; case 0x6c5: dout = 0x0d3; break; case 0x58d: dout = 0x0d4; break; case 0x18f: dout = 0x0d5; break; case 0xdc4: dout = 0x0d6; break; case 0x288: dout = 0x0d7; break; case 0xe55: dout = 0x0d8; break; case 0xc77: dout = 0x0d9; break; case 0x9f0: dout = 0x0da; break; case 0x6f5: dout = 0x0db; break; case 0x83d: dout = 0x0dc; break; case 0x9af: dout = 0x0dd; break; case 0x5f6: dout = 0x0de; break; case 0x2e8: dout = 0x0df; break; case 0x929: dout = 0x0e0; break; case 0xc08: dout = 0x0e1; break; case 0x3d3: dout = 0x0e2; break; case 0xc61: dout = 0x0e3; break; case 0x8e6: dout = 0x0e4; break; case 0xf90: dout = 0x0e5; break; case 0x165: dout = 0x0e6; break; case 0x84a: dout = 0x0e7; break; case 0x1c4: dout = 0x0e8; break; case 0x313: dout = 0x0e9; break; case 0xe45: dout = 0x0ea; break; case 0x8e7: dout = 0x0eb; break; case 0x191: dout = 0x0ec; break; case 0xe9a: dout = 0x0ed; break; case 0x79c: dout = 0x0ee; break; case 0xb7b: dout = 0x0ef; break; case 0xa63: dout = 0x0f0; break; case 0x4c8: dout = 0x0f1; break; case 0x0e5: dout = 0x0f2; break; case 0xc41: dout = 0x0f3; break; case 0x1c6: dout = 0x0f4; break; case 0xfd1: dout = 0x0f5; break; case 0x138: dout = 0x0f6; break; case 0x78b: dout = 0x0f7; break; case 0x46c: dout = 0x0f8; break; case 0xcf9: dout = 0x0f9; break; case 0x246: dout = 0x0fa; break; case 0xbbf: dout = 0x0fb; break; case 0x103: dout = 0x0fc; break; case 0xab0: dout = 0x0fd; break; case 0x0bf: dout = 0x0fe; break; case 0x807: dout = 0x0ff; break; case 0xa95: dout = 0x100; break; case 0xeda: dout = 0x101; break; case 0x9c0: dout = 0x102; break; case 0xb45: dout = 0x103; break; case 0x01d: dout = 0x104; break; case 0x19d: dout = 0x105; break; case 0x596: dout = 0x106; break; case 0x594: dout = 0x107; break; case 0x956: dout = 0x108; break; case 0x62b: dout = 0x109; break; case 0x947: dout = 0x10a; break; case 0xcba: dout = 0x10b; break; case 0xed9: dout = 0x10c; break; case 0xb03: dout = 0x10d; break; case 0xbc7: dout = 0x10e; break; case 0x0a7: dout = 0x10f; break; case 0xedf: dout = 0x110; break; case 0xe85: dout = 0x111; break; case 0xac3: dout = 0x112; break; case 0x190: dout = 0x113; break; case 0x09b: dout = 0x114; break; case 0x863: dout = 0x115; break; case 0x4ad: dout = 0x116; break; case 0x0dc: dout = 0x117; break; case 0xdb8: dout = 0x118; break; case 0xa68: dout = 0x119; break; case 0x443: dout = 0x11a; break; case 0xc16: dout = 0x11b; break; case 0x08d: dout = 0x11c; break; case 0x975: dout = 0x11d; break; case 0xdc8: dout = 0x11e; break; case 0x984: dout = 0x11f; break; case 0xc5d: dout = 0x120; break; case 0xe5a: dout = 0x121; break; case 0x5b8: dout = 0x122; break; case 0xb7a: dout = 0x123; break; case 0x462: dout = 0x124; break; case 0xb37: dout = 0x125; break; case 0xf33: dout = 0x126; break; case 0x6fe: dout = 0x127; break; case 0x8b6: dout = 0x128; break; case 0x55c: dout = 0x129; break; case 0x93a: dout = 0x12a; break; case 0xa5b: dout = 0x12b; break; case 0xb30: dout = 0x12c; break; case 0x4b4: dout = 0x12d; break; case 0x805: dout = 0x12e; break; case 0x657: dout = 0x12f; break; case 0x1a7: dout = 0x130; break; case 0x6ac: dout = 0x131; break; case 0xeb8: dout = 0x132; break; case 0x27e: dout = 0x133; break; case 0x447: dout = 0x134; break; case 0x552: dout = 0x135; break; case 0xef4: dout = 0x136; break; case 0x72e: dout = 0x137; break; case 0x671: dout = 0x138; break; case 0xd01: dout = 0x139; break; case 0x7e9: dout = 0x13a; break; case 0xfd2: dout = 0x13b; break; case 0x3fb: dout = 0x13c; break; case 0x709: dout = 0x13d; break; case 0x4d6: dout = 0x13e; break; case 0x3bb: dout = 0x13f; break; case 0x955: dout = 0x140; break; case 0x4e8: dout = 0x141; break; case 0x9c5: dout = 0x142; break; case 0xc00: dout = 0x143; break; case 0x19b: dout = 0x144; break; case 0x010: dout = 0x145; break; case 0x490: dout = 0x146; break; case 0x861: dout = 0x147; break; case 0x86f: dout = 0x148; break; case 0xfa1: dout = 0x149; break; case 0x2d4: dout = 0x14a; break; case 0xf95: dout = 0x14b; break; case 0x620: dout = 0x14c; break; case 0x9cc: dout = 0x14d; break; case 0x049: dout = 0x14e; break; case 0x215: dout = 0x14f; break; case 0x3b0: dout = 0x150; break; case 0x9de: dout = 0x151; break; case 0x81b: dout = 0x152; break; case 0x509: dout = 0x153; break; case 0x4b3: dout = 0x154; break; case 0x382: dout = 0x155; break; case 0x8ac: dout = 0x156; break; case 0xf46: dout = 0x157; break; case 0x257: dout = 0x158; break; case 0x12e: dout = 0x159; break; case 0x69d: dout = 0x15a; break; case 0xd09: dout = 0x15b; break; case 0x5a1: dout = 0x15c; break; case 0x3a3: dout = 0x15d; break; case 0xf8d: dout = 0x15e; break; case 0x0f8: dout = 0x15f; break; case 0xddc: dout = 0x160; break; case 0x450: dout = 0x161; break; case 0xa45: dout = 0x162; break; case 0x86e: dout = 0x163; break; case 0x1a0: dout = 0x164; break; case 0xd2b: dout = 0x165; break; case 0x043: dout = 0x166; break; case 0xc9f: dout = 0x167; break; case 0x0bc: dout = 0x168; break; case 0xac4: dout = 0x169; break; case 0xa17: dout = 0x16a; break; case 0xe60: dout = 0x16b; break; case 0x682: dout = 0x16c; break; case 0x056: dout = 0x16d; break; case 0xf4a: dout = 0x16e; break; case 0x95b: dout = 0x16f; break; case 0x326: dout = 0x170; break; case 0x4b0: dout = 0x171; break; case 0x141: dout = 0x172; break; case 0x82e: dout = 0x173; break; case 0xffc: dout = 0x174; break; case 0xd15: dout = 0x175; break; case 0xa3d: dout = 0x176; break; case 0x9ca: dout = 0x177; break; case 0x5cf: dout = 0x178; break; case 0x311: dout = 0x179; break; case 0x287: dout = 0x17a; break; case 0x79a: dout = 0x17b; break; case 0xefd: dout = 0x17c; break; case 0xb67: dout = 0x17d; break; case 0x5ff: dout = 0x17e; break; case 0xea1: dout = 0x17f; break; case 0xaa7: dout = 0x180; break; case 0xfa8: dout = 0x181; break; case 0xe9d: dout = 0x182; break; case 0xc1b: dout = 0x183; break; case 0x580: dout = 0x184; break; case 0x482: dout = 0x185; break; case 0x033: dout = 0x186; break; case 0xf73: dout = 0x187; break; case 0x8a2: dout = 0x188; break; case 0x888: dout = 0x189; break; case 0xf22: dout = 0x18a; break; case 0xc6f: dout = 0x18b; break; case 0xf28: dout = 0x18c; break; case 0x2e5: dout = 0x18d; break; case 0xc24: dout = 0x18e; break; case 0x1ff: dout = 0x18f; break; case 0xe28: dout = 0x190; break; case 0xa96: dout = 0x191; break; case 0xc19: dout = 0x192; break; case 0x942: dout = 0x193; break; case 0xbff: dout = 0x194; break; case 0xf5f: dout = 0x195; break; case 0xa8e: dout = 0x196; break; case 0xac1: dout = 0x197; break; case 0xd52: dout = 0x198; break; case 0xfe6: dout = 0x199; break; case 0x70f: dout = 0x19a; break; case 0x150: dout = 0x19b; break; case 0x2bf: dout = 0x19c; break; case 0x862: dout = 0x19d; break; case 0xaac: dout = 0x19e; break; case 0xf23: dout = 0x19f; break; case 0x26e: dout = 0x1a0; break; case 0x0d7: dout = 0x1a1; break; case 0xd33: dout = 0x1a2; break; case 0x69b: dout = 0x1a3; break; case 0x88f: dout = 0x1a4; break; case 0x4a5: dout = 0x1a5; break; case 0x294: dout = 0x1a6; break; case 0x1c9: dout = 0x1a7; break; case 0x61e: dout = 0x1a8; break; case 0x3b2: dout = 0x1a9; break; case 0x51c: dout = 0x1aa; break; case 0x766: dout = 0x1ab; break; case 0xa65: dout = 0x1ac; break; case 0x14e: dout = 0x1ad; break; case 0x1e1: dout = 0x1ae; break; case 0xd76: dout = 0x1af; break; case 0xf82: dout = 0x1b0; break; case 0x937: dout = 0x1b1; break; case 0xf56: dout = 0x1b2; break; case 0x6c7: dout = 0x1b3; break; case 0x94f: dout = 0x1b4; break; case 0xef2: dout = 0x1b5; break; case 0x2a8: dout = 0x1b6; break; case 0x775: dout = 0x1b7; break; case 0xc36: dout = 0x1b8; break; case 0x9ad: dout = 0x1b9; break; case 0x934: dout = 0x1ba; break; case 0xd95: dout = 0x1bb; break; case 0x645: dout = 0x1bc; break; case 0x9f5: dout = 0x1bd; break; case 0x1b0: dout = 0x1be; break; case 0x9bb: dout = 0x1bf; break; case 0x822: dout = 0x1c0; break; case 0x4f0: dout = 0x1c1; break; case 0xf1d: dout = 0x1c2; break; case 0x810: dout = 0x1c3; break; case 0x582: dout = 0x1c4; break; case 0x840: dout = 0x1c5; break; case 0xf4e: dout = 0x1c6; break; case 0x01f: dout = 0x1c7; break; case 0xd5f: dout = 0x1c8; break; case 0xaeb: dout = 0x1c9; break; case 0xaf8: dout = 0x1ca; break; case 0xcab: dout = 0x1cb; break; case 0x448: dout = 0x1cc; break; case 0xc9d: dout = 0x1cd; break; case 0xc7e: dout = 0x1ce; break; case 0x5b9: dout = 0x1cf; break; case 0x57b: dout = 0x1d0; break; case 0xb9d: dout = 0x1d1; break; case 0x4e1: dout = 0x1d2; break; case 0x58c: dout = 0x1d3; break; case 0xf8e: dout = 0x1d4; break; case 0x23b: dout = 0x1d5; break; case 0xd5e: dout = 0x1d6; break; case 0x4ea: dout = 0x1d7; break; case 0x507: dout = 0x1d8; break; case 0x37d: dout = 0x1d9; break; case 0xef7: dout = 0x1da; break; case 0x5ed: dout = 0x1db; break; case 0x6f3: dout = 0x1dc; break; case 0xdbb: dout = 0x1dd; break; case 0x8ab: dout = 0x1de; break; case 0x4c1: dout = 0x1df; break; case 0xcac: dout = 0x1e0; break; case 0xfcf: dout = 0x1e1; break; case 0x266: dout = 0x1e2; break; case 0x29f: dout = 0x1e3; break; case 0x142: dout = 0x1e4; break; case 0xaed: dout = 0x1e5; break; case 0xf7e: dout = 0x1e6; break; case 0xdaf: dout = 0x1e7; break; case 0x57f: dout = 0x1e8; break; case 0x2d9: dout = 0x1e9; break; case 0xa98: dout = 0x1ea; break; case 0xbd7: dout = 0x1eb; break; case 0x437: dout = 0x1ec; break; case 0x6be: dout = 0x1ed; break; case 0x6ea: dout = 0x1ee; break; case 0x562: dout = 0x1ef; break; case 0x344: dout = 0x1f0; break; case 0xf0e: dout = 0x1f1; break; case 0xe43: dout = 0x1f2; break; case 0xd61: dout = 0x1f3; break; case 0x095: dout = 0x1f4; break; case 0xfad: dout = 0x1f5; break; case 0x9d8: dout = 0x1f6; break; case 0xd9d: dout = 0x1f7; break; case 0x40d: dout = 0x1f8; break; case 0x584: dout = 0x1f9; break; case 0xdc6: dout = 0x1fa; break; case 0xe4a: dout = 0x1fb; break; case 0x128: dout = 0x1fc; break; case 0x31b: dout = 0x1fd; break; case 0xc0d: dout = 0x1fe; break; case 0x496: dout = 0x1ff; break; case 0xde7: dout = 0x200; break; case 0x96b: dout = 0x201; break; case 0xe96: dout = 0x202; break; case 0xc90: dout = 0x203; break; case 0x973: dout = 0x204; break; case 0x84e: dout = 0x205; break; case 0x880: dout = 0x206; break; case 0xd6a: dout = 0x207; break; case 0x01e: dout = 0x208; break; case 0x35e: dout = 0x209; break; case 0x514: dout = 0x20a; break; case 0x52e: dout = 0x20b; break; case 0x614: dout = 0x20c; break; case 0xd38: dout = 0x20d; break; case 0x610: dout = 0x20e; break; case 0x47c: dout = 0x20f; break; case 0x869: dout = 0x210; break; case 0xa27: dout = 0x211; break; case 0x3d0: dout = 0x212; break; case 0xea2: dout = 0x213; break; case 0x864: dout = 0x214; break; case 0xf2a: dout = 0x215; break; case 0xe27: dout = 0x216; break; case 0x359: dout = 0x217; break; case 0xe93: dout = 0x218; break; case 0xbd5: dout = 0x219; break; case 0x8f5: dout = 0x21a; break; case 0x9c3: dout = 0x21b; break; case 0x986: dout = 0x21c; break; case 0x09f: dout = 0x21d; break; case 0x127: dout = 0x21e; break; case 0xad4: dout = 0x21f; break; case 0xe87: dout = 0x220; break; case 0x601: dout = 0x221; break; case 0xeed: dout = 0x222; break; case 0xff7: dout = 0x223; break; case 0xd9e: dout = 0x224; break; case 0x6ce: dout = 0x225; break; case 0x506: dout = 0x226; break; case 0xd7c: dout = 0x227; break; case 0x108: dout = 0x228; break; case 0xa3b: dout = 0x229; break; case 0xc4c: dout = 0x22a; break; case 0x4cb: dout = 0x22b; break; case 0x226: dout = 0x22c; break; case 0xcc3: dout = 0x22d; break; case 0x17c: dout = 0x22e; break; case 0x093: dout = 0x22f; break; case 0xa2b: dout = 0x230; break; case 0x8dc: dout = 0x231; break; case 0xcaa: dout = 0x232; break; case 0xa49: dout = 0x233; break; case 0x362: dout = 0x234; break; case 0x3a8: dout = 0x235; break; case 0xf06: dout = 0x236; break; case 0xc0b: dout = 0x237; break; case 0x110: dout = 0x238; break; case 0xce3: dout = 0x239; break; case 0x85c: dout = 0x23a; break; case 0x0d2: dout = 0x23b; break; case 0xa76: dout = 0x23c; break; case 0x71d: dout = 0x23d; break; case 0x902: dout = 0x23e; break; case 0x5a3: dout = 0x23f; break; case 0xf61: dout = 0x240; break; case 0x0f0: dout = 0x241; break; case 0xf94: dout = 0x242; break; case 0x821: dout = 0x243; break; case 0x633: dout = 0x244; break; case 0xf9f: dout = 0x245; break; case 0x8aa: dout = 0x246; break; case 0xac0: dout = 0x247; break; case 0x353: dout = 0x248; break; case 0x019: dout = 0x249; break; case 0x8d9: dout = 0x24a; break; case 0xbef: dout = 0x24b; break; case 0xbcf: dout = 0x24c; break; case 0x2ef: dout = 0x24d; break; case 0x2ae: dout = 0x24e; break; case 0x2f3: dout = 0x24f; break; case 0xd32: dout = 0x250; break; case 0x89a: dout = 0x251; break; case 0x770: dout = 0x252; break; case 0xb73: dout = 0x253; break; case 0x82b: dout = 0x254; break; case 0x8b9: dout = 0x255; break; case 0xc93: dout = 0x256; break; case 0xbb0: dout = 0x257; break; case 0x8cc: dout = 0x258; break; case 0x83a: dout = 0x259; break; case 0x228: dout = 0x25a; break; case 0xb0d: dout = 0x25b; break; case 0xc09: dout = 0x25c; break; case 0xdd2: dout = 0x25d; break; case 0x39e: dout = 0x25e; break; case 0x730: dout = 0x25f; break; case 0x52f: dout = 0x260; break; case 0x815: dout = 0x261; break; case 0x2c7: dout = 0x262; break; case 0x9c6: dout = 0x263; break; case 0xec3: dout = 0x264; break; case 0x119: dout = 0x265; break; case 0x0aa: dout = 0x266; break; case 0xbd2: dout = 0x267; break; case 0x372: dout = 0x268; break; case 0x738: dout = 0x269; break; case 0x767: dout = 0x26a; break; case 0x464: dout = 0x26b; break; case 0xeb1: dout = 0x26c; break; case 0xe37: dout = 0x26d; break; case 0x7c9: dout = 0x26e; break; case 0x6f2: dout = 0x26f; break; case 0x3ba: dout = 0x270; break; case 0x754: dout = 0x271; break; case 0xb17: dout = 0x272; break; case 0x613: dout = 0x273; break; case 0x6bf: dout = 0x274; break; case 0x8eb: dout = 0x275; break; case 0xa9d: dout = 0x276; break; case 0xc92: dout = 0x277; break; case 0x5b1: dout = 0x278; break; case 0x733: dout = 0x279; break; case 0x7ec: dout = 0x27a; break; case 0x897: dout = 0x27b; break; case 0x27d: dout = 0x27c; break; case 0x684: dout = 0x27d; break; case 0x5d0: dout = 0x27e; break; case 0xe4e: dout = 0x27f; break; case 0x86c: dout = 0x280; break; case 0xd62: dout = 0x281; break; case 0x256: dout = 0x282; break; case 0xf2f: dout = 0x283; break; case 0x962: dout = 0x284; break; case 0x2df: dout = 0x285; break; case 0xf1e: dout = 0x286; break; case 0xad3: dout = 0x287; break; case 0x500: dout = 0x288; break; case 0x8fa: dout = 0x289; break; case 0x00c: dout = 0x28a; break; case 0xb0c: dout = 0x28b; break; case 0x208: dout = 0x28c; break; case 0x22d: dout = 0x28d; break; case 0xc48: dout = 0x28e; break; case 0xd8f: dout = 0x28f; break; case 0xc5f: dout = 0x290; break; case 0x298: dout = 0x291; break; case 0xac5: dout = 0x292; break; case 0x416: dout = 0x293; break; case 0x19f: dout = 0x294; break; case 0x954: dout = 0x295; break; case 0xae9: dout = 0x296; break; case 0x63a: dout = 0x297; break; case 0x3d6: dout = 0x298; break; case 0xb24: dout = 0x299; break; case 0x960: dout = 0x29a; break; case 0xe1d: dout = 0x29b; break; case 0x063: dout = 0x29c; break; case 0x5bf: dout = 0x29d; break; case 0x0fd: dout = 0x29e; break; case 0xa99: dout = 0x29f; break; case 0x5d6: dout = 0x2a0; break; case 0xbc8: dout = 0x2a1; break; case 0x968: dout = 0x2a2; break; case 0xc55: dout = 0x2a3; break; case 0xc12: dout = 0x2a4; break; case 0x9c9: dout = 0x2a5; break; case 0x70c: dout = 0x2a6; break; case 0x393: dout = 0x2a7; break; case 0x23d: dout = 0x2a8; break; case 0x8d8: dout = 0x2a9; break; case 0x5ee: dout = 0x2aa; break; case 0x430: dout = 0x2ab; break; case 0xd39: dout = 0x2ac; break; case 0x811: dout = 0x2ad; break; case 0xb83: dout = 0x2ae; break; case 0x7bf: dout = 0x2af; break; case 0x098: dout = 0x2b0; break; case 0xaa0: dout = 0x2b1; break; case 0x42f: dout = 0x2b2; break; case 0x066: dout = 0x2b3; break; case 0x2fa: dout = 0x2b4; break; case 0x17b: dout = 0x2b5; break; case 0xb14: dout = 0x2b6; break; case 0x4d0: dout = 0x2b7; break; case 0x63d: dout = 0x2b8; break; case 0x851: dout = 0x2b9; break; case 0x5df: dout = 0x2ba; break; case 0x781: dout = 0x2bb; break; case 0xae6: dout = 0x2bc; break; case 0xff5: dout = 0x2bd; break; case 0x15c: dout = 0x2be; break; case 0x9b3: dout = 0x2bf; break; case 0xa6a: dout = 0x2c0; break; case 0x881: dout = 0x2c1; break; case 0x36b: dout = 0x2c2; break; case 0xfe1: dout = 0x2c3; break; case 0xc88: dout = 0x2c4; break; case 0xfab: dout = 0x2c5; break; case 0xc5e: dout = 0x2c6; break; case 0xc99: dout = 0x2c7; break; case 0x53a: dout = 0x2c8; break; case 0xbc0: dout = 0x2c9; break; case 0xb20: dout = 0x2ca; break; case 0x024: dout = 0x2cb; break; case 0x064: dout = 0x2cc; break; case 0xe38: dout = 0x2cd; break; case 0xe06: dout = 0x2ce; break; case 0x478: dout = 0x2cf; break; case 0x12d: dout = 0x2d0; break; case 0x45e: dout = 0x2d1; break; case 0xd8b: dout = 0x2d2; break; case 0x51b: dout = 0x2d3; break; case 0xce1: dout = 0x2d4; break; case 0x49e: dout = 0x2d5; break; case 0xfaf: dout = 0x2d6; break; case 0x51a: dout = 0x2d7; break; case 0x2e0: dout = 0x2d8; break; case 0xb61: dout = 0x2d9; break; case 0x079: dout = 0x2da; break; case 0xfa5: dout = 0x2db; break; case 0xb90: dout = 0x2dc; break; case 0x1ec: dout = 0x2dd; break; case 0x87b: dout = 0x2de; break; case 0x275: dout = 0x2df; break; case 0x4cc: dout = 0x2e0; break; case 0x9a1: dout = 0x2e1; break; case 0x238: dout = 0x2e2; break; case 0xf9d: dout = 0x2e3; break; case 0x468: dout = 0x2e4; break; case 0x5bd: dout = 0x2e5; break; case 0xc3f: dout = 0x2e6; break; case 0x5e4: dout = 0x2e7; break; case 0xaba: dout = 0x2e8; break; case 0xe35: dout = 0x2e9; break; case 0xb0b: dout = 0x2ea; break; case 0x98f: dout = 0x2eb; break; case 0xcd6: dout = 0x2ec; break; case 0x2a9: dout = 0x2ed; break; case 0x974: dout = 0x2ee; break; case 0x3c9: dout = 0x2ef; break; case 0x67b: dout = 0x2f0; break; case 0x38b: dout = 0x2f1; break; case 0x4e5: dout = 0x2f2; break; case 0xcc8: dout = 0x2f3; break; case 0x1f7: dout = 0x2f4; break; case 0xc60: dout = 0x2f5; break; case 0x6e7: dout = 0x2f6; break; case 0x06f: dout = 0x2f7; break; case 0xeb3: dout = 0x2f8; break; case 0x2f5: dout = 0x2f9; break; case 0x8b4: dout = 0x2fa; break; case 0x99e: dout = 0x2fb; break; case 0x647: dout = 0x2fc; break; case 0x537: dout = 0x2fd; break; case 0xecd: dout = 0x2fe; break; case 0x6d7: dout = 0x2ff; break; case 0xddf: dout = 0x300; break; case 0x693: dout = 0x301; break; case 0xac7: dout = 0x302; break; case 0x8d4: dout = 0x303; break; case 0xee2: dout = 0x304; break; case 0x638: dout = 0x305; break; case 0xf14: dout = 0x306; break; case 0x459: dout = 0x307; break; case 0x60c: dout = 0x308; break; case 0xbe0: dout = 0x309; break; case 0x200: dout = 0x30a; break; case 0x065: dout = 0x30b; break; case 0x039: dout = 0x30c; break; case 0x1f9: dout = 0x30d; break; case 0xbae: dout = 0x30e; break; case 0xb92: dout = 0x30f; break; case 0xd2e: dout = 0x310; break; case 0x706: dout = 0x311; break; case 0xd19: dout = 0x312; break; case 0x131: dout = 0x313; break; case 0xbc2: dout = 0x314; break; case 0x7e2: dout = 0x315; break; case 0xf59: dout = 0x316; break; case 0xf08: dout = 0x317; break; case 0xbc5: dout = 0x318; break; case 0xc65: dout = 0x319; break; case 0x1a2: dout = 0x31a; break; case 0x1e9: dout = 0x31b; break; case 0xf3e: dout = 0x31c; break; case 0x3f3: dout = 0x31d; break; case 0x541: dout = 0x31e; break; case 0x8a7: dout = 0x31f; break; case 0xfcd: dout = 0x320; break; case 0xea4: dout = 0x321; break; case 0xde2: dout = 0x322; break; case 0xe2e: dout = 0x323; break; case 0xf10: dout = 0x324; break; case 0xd1d: dout = 0x325; break; case 0x875: dout = 0x326; break; case 0x5bb: dout = 0x327; break; case 0x9b9: dout = 0x328; break; case 0x4e0: dout = 0x329; break; case 0xb8d: dout = 0x32a; break; case 0x071: dout = 0x32b; break; case 0xded: dout = 0x32c; break; case 0x7e1: dout = 0x32d; break; case 0xd9a: dout = 0x32e; break; case 0xf8a: dout = 0x32f; break; case 0xb7f: dout = 0x330; break; case 0x327: dout = 0x331; break; case 0xab1: dout = 0x332; break; case 0xebe: dout = 0x333; break; case 0x7f8: dout = 0x334; break; case 0x543: dout = 0x335; break; case 0x465: dout = 0x336; break; case 0x0b0: dout = 0x337; break; case 0x1c8: dout = 0x338; break; case 0x81f: dout = 0x339; break; case 0xc4d: dout = 0x33a; break; case 0xaca: dout = 0x33b; break; case 0xdd9: dout = 0x33c; break; case 0x315: dout = 0x33d; break; case 0xbc3: dout = 0x33e; break; case 0x9e3: dout = 0x33f; break; case 0x0a6: dout = 0x340; break; case 0x0de: dout = 0x341; break; case 0x17a: dout = 0x342; break; case 0x515: dout = 0x343; break; case 0xb2f: dout = 0x344; break; case 0x9eb: dout = 0x345; break; case 0x2ee: dout = 0x346; break; case 0xcaf: dout = 0x347; break; case 0xd0c: dout = 0x348; break; case 0x2e4: dout = 0x349; break; case 0x225: dout = 0x34a; break; case 0xe00: dout = 0x34b; break; case 0x1fe: dout = 0x34c; break; case 0x029: dout = 0x34d; break; case 0x569: dout = 0x34e; break; case 0x3cf: dout = 0x34f; break; case 0x3fd: dout = 0x350; break; case 0x28f: dout = 0x351; break; case 0x5d2: dout = 0x352; break; case 0x28c: dout = 0x353; break; case 0x711: dout = 0x354; break; case 0x20e: dout = 0x355; break; case 0x7ab: dout = 0x356; break; case 0xd4c: dout = 0x357; break; case 0xcb8: dout = 0x358; break; case 0x21b: dout = 0x359; break; case 0x47e: dout = 0x35a; break; case 0x4ab: dout = 0x35b; break; case 0x55a: dout = 0x35c; break; case 0xcbc: dout = 0x35d; break; case 0xb5f: dout = 0x35e; break; case 0xa07: dout = 0x35f; break; case 0xaf0: dout = 0x360; break; case 0xee3: dout = 0x361; break; case 0x839: dout = 0x362; break; case 0x0eb: dout = 0x363; break; case 0xb8f: dout = 0x364; break; case 0xcb3: dout = 0x365; break; case 0x290: dout = 0x366; break; case 0x88d: dout = 0x367; break; case 0x867: dout = 0x368; break; case 0xde9: dout = 0x369; break; case 0xea5: dout = 0x36a; break; case 0x3e3: dout = 0x36b; break; case 0x1d1: dout = 0x36c; break; case 0x0c6: dout = 0x36d; break; case 0x7a2: dout = 0x36e; break; case 0x105: dout = 0x36f; break; case 0xf36: dout = 0x370; break; case 0x1bb: dout = 0x371; break; case 0x930: dout = 0x372; break; case 0x4d1: dout = 0x373; break; case 0x83c: dout = 0x374; break; case 0x7ae: dout = 0x375; break; case 0xa09: dout = 0x376; break; case 0xd3e: dout = 0x377; break; case 0x396: dout = 0x378; break; case 0x578: dout = 0x379; break; case 0x95e: dout = 0x37a; break; case 0x463: dout = 0x37b; break; case 0x536: dout = 0x37c; break; case 0x0cc: dout = 0x37d; break; case 0x928: dout = 0x37e; break; case 0x209: dout = 0x37f; break; case 0xc2c: dout = 0x380; break; case 0x3b7: dout = 0x381; break; case 0x259: dout = 0x382; break; case 0x6e0: dout = 0x383; break; case 0xbe8: dout = 0x384; break; case 0x048: dout = 0x385; break; case 0xc14: dout = 0x386; break; case 0xc4f: dout = 0x387; break; case 0x608: dout = 0x388; break; case 0x2a4: dout = 0x389; break; case 0xc79: dout = 0x38a; break; case 0xe3e: dout = 0x38b; break; case 0xb80: dout = 0x38c; break; case 0x57c: dout = 0x38d; break; case 0x01a: dout = 0x38e; break; case 0xa1a: dout = 0x38f; break; case 0xb6d: dout = 0x390; break; case 0xb75: dout = 0x391; break; case 0xdad: dout = 0x392; break; case 0x9bd: dout = 0x393; break; case 0xda4: dout = 0x394; break; case 0x5f4: dout = 0x395; break; case 0xe2a: dout = 0x396; break; case 0x654: dout = 0x397; break; case 0x364: dout = 0x398; break; case 0x62e: dout = 0x399; break; case 0xe02: dout = 0x39a; break; case 0xd3c: dout = 0x39b; break; case 0xf54: dout = 0x39c; break; case 0xa05: dout = 0x39d; break; case 0x632: dout = 0x39e; break; case 0x19e: dout = 0x39f; break; case 0x755: dout = 0x3a0; break; case 0x516: dout = 0x3a1; break; case 0x9ec: dout = 0x3a2; break; case 0x969: dout = 0x3a3; break; case 0x254: dout = 0x3a4; break; case 0x3ed: dout = 0x3a5; break; case 0x61f: dout = 0x3a6; break; case 0xdb3: dout = 0x3a7; break; case 0xae3: dout = 0x3a8; break; case 0x8b0: dout = 0x3a9; break; case 0x0da: dout = 0x3aa; break; case 0x83e: dout = 0x3ab; break; case 0xb6c: dout = 0x3ac; break; case 0x574: dout = 0x3ad; break; case 0x252: dout = 0x3ae; break; case 0x66b: dout = 0x3af; break; case 0x71b: dout = 0x3b0; break; case 0xc84: dout = 0x3b1; break; case 0x4a7: dout = 0x3b2; break; case 0xe56: dout = 0x3b3; break; case 0xeb4: dout = 0x3b4; break; case 0x972: dout = 0x3b5; break; case 0x64f: dout = 0x3b6; break; case 0x77f: dout = 0x3b7; break; case 0x2bc: dout = 0x3b8; break; case 0xaa1: dout = 0x3b9; break; case 0xa2e: dout = 0x3ba; break; case 0xf99: dout = 0x3bb; break; case 0xd2c: dout = 0x3bc; break; case 0xbc4: dout = 0x3bd; break; case 0x264: dout = 0x3be; break; case 0xe5d: dout = 0x3bf; break; case 0xe3f: dout = 0x3c0; break; case 0x581: dout = 0x3c1; break; case 0xa83: dout = 0x3c2; break; case 0xfcc: dout = 0x3c3; break; case 0x0a5: dout = 0x3c4; break; case 0x21d: dout = 0x3c5; break; case 0x1f8: dout = 0x3c6; break; case 0x5af: dout = 0x3c7; break; case 0x46d: dout = 0x3c8; break; case 0x2f8: dout = 0x3c9; break; case 0xdb9: dout = 0x3ca; break; case 0x469: dout = 0x3cb; break; case 0xbbc: dout = 0x3cc; break; case 0x3c0: dout = 0x3cd; break; case 0xa32: dout = 0x3ce; break; case 0x005: dout = 0x3cf; break; case 0x745: dout = 0x3d0; break; case 0x186: dout = 0x3d1; break; case 0x18d: dout = 0x3d2; break; case 0x106: dout = 0x3d3; break; case 0xdf5: dout = 0x3d4; break; case 0x139: dout = 0x3d5; break; case 0x98a: dout = 0x3d6; break; case 0xb93: dout = 0x3d7; break; case 0x32f: dout = 0x3d8; break; case 0x8f9: dout = 0x3d9; break; case 0x2cf: dout = 0x3da; break; case 0xb8e: dout = 0x3db; break; case 0x2b2: dout = 0x3dc; break; case 0xd6f: dout = 0x3dd; break; case 0x75b: dout = 0x3de; break; case 0x2d8: dout = 0x3df; break; case 0x499: dout = 0x3e0; break; case 0x428: dout = 0x3e1; break; case 0xbe1: dout = 0x3e2; break; case 0xc01: dout = 0x3e3; break; case 0xf9a: dout = 0x3e4; break; case 0xfef: dout = 0x3e5; break; case 0xb46: dout = 0x3e6; break; case 0x2de: dout = 0x3e7; break; case 0x11f: dout = 0x3e8; break; case 0x52c: dout = 0x3e9; break; case 0xad6: dout = 0x3ea; break; case 0x245: dout = 0x3eb; break; case 0x97c: dout = 0x3ec; break; case 0x181: dout = 0x3ed; break; case 0xa0a: dout = 0x3ee; break; case 0xffd: dout = 0x3ef; break; case 0x314: dout = 0x3f0; break; case 0x5c2: dout = 0x3f1; break; case 0x61c: dout = 0x3f2; break; case 0xf70: dout = 0x3f3; break; case 0xa61: dout = 0x3f4; break; case 0x80a: dout = 0x3f5; break; case 0xf98: dout = 0x3f6; break; case 0x32d: dout = 0x3f7; break; case 0x43b: dout = 0x3f8; break; case 0xdb2: dout = 0x3f9; break; case 0x4e2: dout = 0x3fa; break; case 0x74f: dout = 0x3fb; break; case 0xf0c: dout = 0x3fc; break; case 0x281: dout = 0x3fd; break; case 0x21c: dout = 0x3fe; break; case 0xff9: dout = 0x3ff; break; case 0xa50: dout = 0x400; break; case 0xbbb: dout = 0x401; break; case 0x847: dout = 0x402; break; case 0x4c9: dout = 0x403; break; case 0xee4: dout = 0x404; break; case 0x3be: dout = 0x405; break; case 0xe10: dout = 0x406; break; case 0x56e: dout = 0x407; break; case 0x848: dout = 0x408; break; case 0xd06: dout = 0x409; break; case 0xc6e: dout = 0x40a; break; case 0x129: dout = 0x40b; break; case 0xd1a: dout = 0x40c; break; case 0x3f2: dout = 0x40d; break; case 0xb40: dout = 0x40e; break; case 0x758: dout = 0x40f; break; case 0x01b: dout = 0x410; break; case 0x41b: dout = 0x411; break; case 0x492: dout = 0x412; break; case 0x4a3: dout = 0x413; break; case 0x712: dout = 0x414; break; case 0x0cd: dout = 0x415; break; case 0x729: dout = 0x416; break; case 0xdf6: dout = 0x417; break; case 0x3fa: dout = 0x418; break; case 0x908: dout = 0x419; break; case 0xb29: dout = 0x41a; break; case 0xc6d: dout = 0x41b; break; case 0x3ea: dout = 0x41c; break; case 0xd98: dout = 0x41d; break; case 0x348: dout = 0x41e; break; case 0x402: dout = 0x41f; break; case 0xc4b: dout = 0x420; break; case 0xf4c: dout = 0x421; break; case 0xcdd: dout = 0x422; break; case 0x222: dout = 0x423; break; case 0x587: dout = 0x424; break; case 0xf05: dout = 0x425; break; case 0xec8: dout = 0x426; break; case 0x192: dout = 0x427; break; case 0xc59: dout = 0x428; break; case 0x71e: dout = 0x429; break; case 0xbc1: dout = 0x42a; break; case 0x521: dout = 0x42b; break; case 0xfdb: dout = 0x42c; break; case 0xfb2: dout = 0x42d; break; case 0x487: dout = 0x42e; break; case 0x776: dout = 0x42f; break; case 0xef5: dout = 0x430; break; case 0x92f: dout = 0x431; break; case 0x98e: dout = 0x432; break; case 0x2d7: dout = 0x433; break; case 0xd56: dout = 0x434; break; case 0x6a2: dout = 0x435; break; case 0x976: dout = 0x436; break; case 0xf0b: dout = 0x437; break; case 0x906: dout = 0x438; break; case 0xce7: dout = 0x439; break; case 0x118: dout = 0x43a; break; case 0xeab: dout = 0x43b; break; case 0x42d: dout = 0x43c; break; case 0xca4: dout = 0x43d; break; case 0xd87: dout = 0x43e; break; case 0xe17: dout = 0x43f; break; case 0xee9: dout = 0x440; break; case 0x6b3: dout = 0x441; break; case 0x3e7: dout = 0x442; break; case 0x895: dout = 0x443; break; case 0xebf: dout = 0x444; break; case 0x9f9: dout = 0x445; break; case 0xabc: dout = 0x446; break; case 0xbb3: dout = 0x447; break; case 0xa0f: dout = 0x448; break; case 0x8b8: dout = 0x449; break; case 0x292: dout = 0x44a; break; case 0x44f: dout = 0x44b; break; case 0x71a: dout = 0x44c; break; case 0x285: dout = 0x44d; break; case 0xb58: dout = 0x44e; break; case 0x180: dout = 0x44f; break; case 0x40b: dout = 0x450; break; case 0x002: dout = 0x451; break; case 0xcc2: dout = 0x452; break; case 0xf7d: dout = 0x453; break; case 0xf6c: dout = 0x454; break; case 0x5fd: dout = 0x455; break; case 0x263: dout = 0x456; break; case 0x5da: dout = 0x457; break; case 0x0c4: dout = 0x458; break; case 0xb60: dout = 0x459; break; case 0xe78: dout = 0x45a; break; case 0x05a: dout = 0x45b; break; case 0x446: dout = 0x45c; break; case 0xb53: dout = 0x45d; break; case 0x10b: dout = 0x45e; break; case 0x8f8: dout = 0x45f; break; case 0xcce: dout = 0x460; break; case 0x471: dout = 0x461; break; case 0xd64: dout = 0x462; break; case 0x7d0: dout = 0x463; break; case 0xe2b: dout = 0x464; break; case 0x855: dout = 0x465; break; case 0xc9b: dout = 0x466; break; case 0x9f8: dout = 0x467; break; case 0x4bd: dout = 0x468; break; case 0x44c: dout = 0x469; break; case 0x5d9: dout = 0x46a; break; case 0x207: dout = 0x46b; break; case 0xbe2: dout = 0x46c; break; case 0xec2: dout = 0x46d; break; case 0xf18: dout = 0x46e; break; case 0xf55: dout = 0x46f; break; case 0x404: dout = 0x470; break; case 0x9cd: dout = 0x471; break; case 0xe48: dout = 0x472; break; case 0xdea: dout = 0x473; break; case 0xc66: dout = 0x474; break; case 0x361: dout = 0x475; break; case 0x16b: dout = 0x476; break; case 0xf84: dout = 0x477; break; case 0xcb1: dout = 0x478; break; case 0xe52: dout = 0x479; break; case 0x7f0: dout = 0x47a; break; case 0x70b: dout = 0x47b; break; case 0x814: dout = 0x47c; break; case 0xcc6: dout = 0x47d; break; case 0x639: dout = 0x47e; break; case 0x115: dout = 0x47f; break; case 0xba6: dout = 0x480; break; case 0x9da: dout = 0x481; break; case 0x15f: dout = 0x482; break; case 0xb70: dout = 0x483; break; case 0xae8: dout = 0x484; break; case 0x83b: dout = 0x485; break; case 0xc29: dout = 0x486; break; case 0x4f2: dout = 0x487; break; case 0x3df: dout = 0x488; break; case 0x76d: dout = 0x489; break; case 0xaee: dout = 0x48a; break; case 0xdbd: dout = 0x48b; break; case 0xd2d: dout = 0x48c; break; case 0x5c5: dout = 0x48d; break; case 0xd9b: dout = 0x48e; break; case 0x18b: dout = 0x48f; break; case 0x480: dout = 0x490; break; case 0xcf1: dout = 0x491; break; case 0x00e: dout = 0x492; break; case 0x7ce: dout = 0x493; break; case 0xd75: dout = 0x494; break; case 0xd41: dout = 0x495; break; case 0x9b5: dout = 0x496; break; case 0xfec: dout = 0x497; break; case 0x985: dout = 0x498; break; case 0x25c: dout = 0x499; break; case 0x1a5: dout = 0x49a; break; case 0xa6e: dout = 0x49b; break; case 0x1c5: dout = 0x49c; break; case 0xd12: dout = 0x49d; break; case 0x1ba: dout = 0x49e; break; case 0x731: dout = 0x49f; break; case 0xb2e: dout = 0x4a0; break; case 0x7ea: dout = 0x4a1; break; case 0xd11: dout = 0x4a2; break; case 0x379: dout = 0x4a3; break; case 0x7b3: dout = 0x4a4; break; case 0xb94: dout = 0x4a5; break; case 0x8a8: dout = 0x4a6; break; case 0x602: dout = 0x4a7; break; case 0xc2e: dout = 0x4a8; break; case 0xf75: dout = 0x4a9; break; case 0xd24: dout = 0x4aa; break; case 0x98c: dout = 0x4ab; break; case 0xe15: dout = 0x4ac; break; case 0x22b: dout = 0x4ad; break; case 0x9ce: dout = 0x4ae; break; case 0xc8b: dout = 0x4af; break; case 0xd68: dout = 0x4b0; break; case 0xcdc: dout = 0x4b1; break; case 0xc23: dout = 0x4b2; break; case 0xa78: dout = 0x4b3; break; case 0x0d3: dout = 0x4b4; break; case 0x477: dout = 0x4b5; break; case 0x8e2: dout = 0x4b6; break; case 0x6d4: dout = 0x4b7; break; case 0xf1c: dout = 0x4b8; break; case 0x611: dout = 0x4b9; break; case 0xa7d: dout = 0x4ba; break; case 0x796: dout = 0x4bb; break; case 0x5f1: dout = 0x4bc; break; case 0x96f: dout = 0x4bd; break; case 0x7d2: dout = 0x4be; break; case 0x2e9: dout = 0x4bf; break; case 0x728: dout = 0x4c0; break; case 0x3f7: dout = 0x4c1; break; case 0xc05: dout = 0x4c2; break; case 0x6de: dout = 0x4c3; break; case 0x196: dout = 0x4c4; break; case 0x51d: dout = 0x4c5; break; case 0x967: dout = 0x4c6; break; case 0x59a: dout = 0x4c7; break; case 0xe98: dout = 0x4c8; break; case 0xb5e: dout = 0x4c9; break; case 0x406: dout = 0x4ca; break; case 0x50f: dout = 0x4cb; break; case 0x135: dout = 0x4cc; break; case 0x286: dout = 0x4cd; break; case 0x99b: dout = 0x4ce; break; case 0x102: dout = 0x4cf; break; case 0x4b1: dout = 0x4d0; break; case 0xf40: dout = 0x4d1; break; case 0x7d1: dout = 0x4d2; break; case 0x02a: dout = 0x4d3; break; case 0x7aa: dout = 0x4d4; break; case 0x34d: dout = 0x4d5; break; case 0x347: dout = 0x4d6; break; case 0xdcd: dout = 0x4d7; break; case 0xec1: dout = 0x4d8; break; case 0xddb: dout = 0x4d9; break; case 0xfd7: dout = 0x4da; break; case 0x4be: dout = 0x4db; break; case 0x68f: dout = 0x4dc; break; case 0x55b: dout = 0x4dd; break; case 0x2bd: dout = 0x4de; break; case 0x4a0: dout = 0x4df; break; case 0x5d1: dout = 0x4e0; break; case 0x04f: dout = 0x4e1; break; case 0x793: dout = 0x4e2; break; case 0x2b4: dout = 0x4e3; break; case 0x8e9: dout = 0x4e4; break; case 0x65f: dout = 0x4e5; break; case 0x3ef: dout = 0x4e6; break; case 0xadd: dout = 0x4e7; break; case 0x2ce: dout = 0x4e8; break; case 0x58f: dout = 0x4e9; break; case 0xd4d: dout = 0x4ea; break; case 0x2b9: dout = 0x4eb; break; case 0xde4: dout = 0x4ec; break; case 0xba8: dout = 0x4ed; break; case 0xe14: dout = 0x4ee; break; case 0xc2a: dout = 0x4ef; break; case 0x631: dout = 0x4f0; break; case 0x35d: dout = 0x4f1; break; case 0x7d7: dout = 0x4f2; break; case 0x5ac: dout = 0x4f3; break; case 0x6ae: dout = 0x4f4; break; case 0x27a: dout = 0x4f5; break; case 0xd03: dout = 0x4f6; break; case 0xb2b: dout = 0x4f7; break; case 0x0af: dout = 0x4f8; break; case 0xc97: dout = 0x4f9; break; case 0x2f4: dout = 0x4fa; break; case 0x6b5: dout = 0x4fb; break; case 0x661: dout = 0x4fc; break; case 0x991: dout = 0x4fd; break; case 0xf88: dout = 0x4fe; break; case 0x7bd: dout = 0x4ff; break; case 0xc5a: dout = 0x500; break; case 0x5dd: dout = 0x501; break; case 0xb43: dout = 0x502; break; case 0x59b: dout = 0x503; break; case 0x099: dout = 0x504; break; case 0x4a1: dout = 0x505; break; case 0xbd0: dout = 0x506; break; case 0xfb0: dout = 0x507; break; case 0x845: dout = 0x508; break; case 0x80b: dout = 0x509; break; case 0x199: dout = 0x50a; break; case 0xcd2: dout = 0x50b; break; case 0xbed: dout = 0x50c; break; case 0x70d: dout = 0x50d; break; case 0xd92: dout = 0x50e; break; case 0xdc2: dout = 0x50f; break; case 0x70e: dout = 0x510; break; case 0xf51: dout = 0x511; break; case 0xd40: dout = 0x512; break; case 0x7b4: dout = 0x513; break; case 0x013: dout = 0x514; break; case 0x653: dout = 0x515; break; case 0x8e3: dout = 0x516; break; case 0x8d5: dout = 0x517; break; case 0x0e3: dout = 0x518; break; case 0x9c7: dout = 0x519; break; case 0x0c2: dout = 0x51a; break; case 0xee6: dout = 0x51b; break; case 0xf7c: dout = 0x51c; break; case 0x16d: dout = 0x51d; break; case 0xa02: dout = 0x51e; break; case 0xdb5: dout = 0x51f; break; case 0xf65: dout = 0x520; break; case 0x9b4: dout = 0x521; break; case 0x1ed: dout = 0x522; break; case 0x67a: dout = 0x523; break; case 0xd8a: dout = 0x524; break; case 0xb1a: dout = 0x525; break; case 0x31e: dout = 0x526; break; case 0xb48: dout = 0x527; break; case 0x510: dout = 0x528; break; case 0xc6a: dout = 0x529; break; case 0x86d: dout = 0x52a; break; case 0x363: dout = 0x52b; break; case 0xda9: dout = 0x52c; break; case 0x0f9: dout = 0x52d; break; case 0x3dd: dout = 0x52e; break; case 0xbaf: dout = 0x52f; break; case 0x593: dout = 0x530; break; case 0x2d1: dout = 0x531; break; case 0x8d0: dout = 0x532; break; case 0x7a6: dout = 0x533; break; case 0x841: dout = 0x534; break; case 0x14f: dout = 0x535; break; case 0xfe0: dout = 0x536; break; case 0x289: dout = 0x537; break; case 0x054: dout = 0x538; break; case 0x388: dout = 0x539; break; case 0x626: dout = 0x53a; break; case 0xc4a: dout = 0x53b; break; case 0x14d: dout = 0x53c; break; case 0x322: dout = 0x53d; break; case 0xdf4: dout = 0x53e; break; case 0xf38: dout = 0x53f; break; case 0x675: dout = 0x540; break; case 0x445: dout = 0x541; break; case 0x990: dout = 0x542; break; case 0x189: dout = 0x543; break; case 0x842: dout = 0x544; break; case 0x38c: dout = 0x545; break; case 0xf62: dout = 0x546; break; case 0x233: dout = 0x547; break; case 0xf16: dout = 0x548; break; case 0x89b: dout = 0x549; break; case 0x971: dout = 0x54a; break; case 0x48c: dout = 0x54b; break; case 0x7fd: dout = 0x54c; break; case 0x206: dout = 0x54d; break; case 0x5e3: dout = 0x54e; break; case 0x13d: dout = 0x54f; break; case 0x0ce: dout = 0x550; break; case 0x5ea: dout = 0x551; break; case 0xd74: dout = 0x552; break; case 0x340: dout = 0x553; break; case 0x64a: dout = 0x554; break; case 0x03a: dout = 0x555; break; case 0x33a: dout = 0x556; break; case 0xb2c: dout = 0x557; break; case 0xb28: dout = 0x558; break; case 0x26c: dout = 0x559; break; case 0xc15: dout = 0x55a; break; case 0x24e: dout = 0x55b; break; case 0x9f7: dout = 0x55c; break; case 0xd72: dout = 0x55d; break; case 0x6c6: dout = 0x55e; break; default: dout = 0xfff; printf("Warning: Invalid error position!!\n");; break; } return dout; } static int chk_no_err_only(unsigned int *chk_syndrome_list, unsigned int *err_info) { if ((chk_syndrome_list[0] | chk_syndrome_list[1] | chk_syndrome_list[2] | chk_syndrome_list[3] | chk_syndrome_list[4] | chk_syndrome_list[5] | chk_syndrome_list[6] | chk_syndrome_list[7]) != 0x0) { return (0); } else { err_info[0] = 0x0; return (1); } } static int chk_1_err_only(unsigned int *chk_syndrome_list, unsigned int *err_info) { unsigned int tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6; tmp0 = gf4096_mul(chk_syndrome_list[1], gf4096_inv(chk_syndrome_list[0])); tmp1 = gf4096_mul(chk_syndrome_list[2], gf4096_inv(chk_syndrome_list[1])); tmp2 = gf4096_mul(chk_syndrome_list[3], gf4096_inv(chk_syndrome_list[2])); tmp3 = gf4096_mul(chk_syndrome_list[4], gf4096_inv(chk_syndrome_list[3])); tmp4 = gf4096_mul(chk_syndrome_list[5], gf4096_inv(chk_syndrome_list[4])); tmp5 = gf4096_mul(chk_syndrome_list[6], gf4096_inv(chk_syndrome_list[5])); tmp6 = gf4096_mul(chk_syndrome_list[7], gf4096_inv(chk_syndrome_list[6])); if ((tmp0 == tmp1) & (tmp1 == tmp2) & (tmp2 == tmp3) & (tmp3 == tmp4) & (tmp4 == tmp5) & (tmp5 == tmp6)) { err_info[0] = 0x1; // encode 1-symbol error as 0x1 err_info[1] = err_pos_lut(tmp0); err_info[1] = (unsigned int)(0x55e - err_info[1]); err_info[5] = chk_syndrome_list[0]; return (1); } else return (0); } static int chk_2_err_only(unsigned int *chk_syndrome_list, unsigned int *err_info) { unsigned int tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; unsigned int coefs[4]; unsigned int err_pats[4]; int found_num_root = 0; unsigned int bit2_root0, bit2_root1; unsigned int bit2_root0_inv, bit2_root1_inv; unsigned int err_loc_eqn, test_root; unsigned int bit2_loc0, bit2_loc1; unsigned int bit2_pat0, bit2_pat1; find_2x2_soln(chk_syndrome_list[1], chk_syndrome_list[0], chk_syndrome_list[2], chk_syndrome_list[1], chk_syndrome_list[2], chk_syndrome_list[3], coefs); for (test_root = 0x1; test_root < 0xfff; test_root++) { err_loc_eqn = gf4096_mul(coefs[1], gf4096_mul(test_root, test_root)) ^ gf4096_mul(coefs[0], test_root) ^ 0x1; if (err_loc_eqn == 0x0) { if (found_num_root == 0) { bit2_root0 = test_root; found_num_root = 1; } else if (found_num_root == 1) { bit2_root1 = test_root; found_num_root = 2; break; } } } if (found_num_root != 2) return (0); else { bit2_root0_inv = gf4096_inv(bit2_root0); bit2_root1_inv = gf4096_inv(bit2_root1); find_2bit_err_pats(chk_syndrome_list[0], chk_syndrome_list[1], bit2_root0_inv, bit2_root1_inv, err_pats); bit2_pat0 = err_pats[0]; bit2_pat1 = err_pats[1]; /* //for(x+alpha) tmp0 = gf4096_mul(gf4096_mul(gf4096_mul(bit2_root0_inv,bit2_root0_inv), gf4096_mul(bit2_root0_inv,bit2_root0_inv)),bit2_root0_inv); //rinv0^5 tmp1 = gf4096_mul(bit2_root0_inv,tmp0); //rinv0^6 tmp2 = gf4096_mul(bit2_root0_inv,tmp1); //rinv0^7 tmp3 = gf4096_mul(bit2_root0_inv,tmp2); //rinv0^8 tmp4 = gf4096_mul(gf4096_mul(gf4096_mul(bit2_root1_inv,bit2_root1_inv), gf4096_mul(bit2_root1_inv,bit2_root1_inv)),bit2_root1_inv); //rinv1^5 tmp5 = gf4096_mul(bit2_root1_inv,tmp4); //rinv1^6 tmp6 = gf4096_mul(bit2_root1_inv,tmp5); //rinv1^7 tmp7 = gf4096_mul(bit2_root1_inv,tmp6); //rinv1^8 */ //for(x+1) tmp0 = gf4096_mul(gf4096_mul(bit2_root0_inv, bit2_root0_inv), gf4096_mul(bit2_root0_inv, bit2_root0_inv)); //rinv0^4 tmp1 = gf4096_mul(bit2_root0_inv, tmp0); //rinv0^5 tmp2 = gf4096_mul(bit2_root0_inv, tmp1); //rinv0^6 tmp3 = gf4096_mul(bit2_root0_inv, tmp2); //rinv0^7 tmp4 = gf4096_mul(gf4096_mul(bit2_root1_inv, bit2_root1_inv), gf4096_mul(bit2_root1_inv, bit2_root1_inv)); //rinv1^4 tmp5 = gf4096_mul(bit2_root1_inv, tmp4); //rinv1^5 tmp6 = gf4096_mul(bit2_root1_inv, tmp5); //rinv1^6 tmp7 = gf4096_mul(bit2_root1_inv, tmp6); //rinv1^7 //check if only 2-bit error if ((chk_syndrome_list[4] == (gf4096_mul(bit2_pat0, tmp0) ^ gf4096_mul(bit2_pat1, tmp4))) & (chk_syndrome_list[5] == (gf4096_mul(bit2_pat0, tmp1) ^ gf4096_mul(bit2_pat1, tmp5))) & (chk_syndrome_list[6] == (gf4096_mul(bit2_pat0, tmp2) ^ gf4096_mul(bit2_pat1, tmp6))) & (chk_syndrome_list[7] == (gf4096_mul(bit2_pat0, tmp3) ^ gf4096_mul(bit2_pat1, tmp7)))) { if ((err_pos_lut(bit2_root0_inv) == 0xfff) | (err_pos_lut(bit2_root1_inv) == 0xfff)) { return (0); } else { bit2_loc0 = 0x55e - err_pos_lut(bit2_root0_inv); bit2_loc1 = 0x55e - err_pos_lut(bit2_root1_inv); err_info[0] = 0x2; // encode 2-symbol error as 0x2 err_info[1] = bit2_loc0; err_info[2] = bit2_loc1; err_info[5] = bit2_pat0; err_info[6] = bit2_pat1; return (1); } } else return (0); } } static int chk_3_err_only(unsigned int *chk_syndrome_list, unsigned int *err_info) { unsigned int tmp0, tmp1, tmp2, tmp3, tmp4, tmp5; unsigned int coefs[4]; unsigned int err_pats[4]; int found_num_root = 0; unsigned int bit3_root0, bit3_root1, bit3_root2; unsigned int bit3_root0_inv, bit3_root1_inv, bit3_root2_inv; unsigned int err_loc_eqn, test_root; unsigned int bit3_loc0, bit3_loc1, bit3_loc2; unsigned int bit3_pat0, bit3_pat1, bit3_pat2; find_3bit_err_coefs(chk_syndrome_list[0], chk_syndrome_list[1], chk_syndrome_list[2], chk_syndrome_list[3], chk_syndrome_list[4], chk_syndrome_list[5], coefs); for (test_root = 0x1; test_root < 0xfff; test_root++) { err_loc_eqn = gf4096_mul(coefs[2], gf4096_mul(gf4096_mul(test_root, test_root), test_root)) ^ gf4096_mul(coefs[1], gf4096_mul(test_root, test_root)) ^ gf4096_mul(coefs[0], test_root) ^ 0x1; if (err_loc_eqn == 0x0) { if (found_num_root == 0) { bit3_root0 = test_root; found_num_root = 1; } else if (found_num_root == 1) { bit3_root1 = test_root; found_num_root = 2; } else if (found_num_root == 2) { bit3_root2 = test_root; found_num_root = 3; break; } } } if (found_num_root != 3) return (0); else { bit3_root0_inv = gf4096_inv(bit3_root0); bit3_root1_inv = gf4096_inv(bit3_root1); bit3_root2_inv = gf4096_inv(bit3_root2); find_3bit_err_pats(chk_syndrome_list[0], chk_syndrome_list[1], chk_syndrome_list[2], bit3_root0_inv, bit3_root1_inv, bit3_root2_inv, err_pats); /* //for(x+alpah) tmp0=gf4096_mul(bit3_root0_inv,bit3_root0_inv); tmp0=gf4096_mul(tmp0,tmp0); tmp0=gf4096_mul(tmp0,bit3_root0_inv); tmp0=gf4096_mul(tmp0,bit3_root0_inv); tmp0=gf4096_mul(tmp0,bit3_root0_inv); //rinv0^7 tmp1=gf4096_mul(tmp0,bit3_root0_inv); //rinv0^8 tmp2=gf4096_mul(bit3_root1_inv,bit3_root1_inv); tmp2=gf4096_mul(tmp2,tmp2); tmp2=gf4096_mul(tmp2,bit3_root1_inv); tmp2=gf4096_mul(tmp2,bit3_root1_inv); tmp2=gf4096_mul(tmp2,bit3_root1_inv); //rinv1^7 tmp3=gf4096_mul(tmp2,bit3_root1_inv); //rinv1^8 tmp4=gf4096_mul(bit3_root2_inv,bit3_root2_inv); tmp4=gf4096_mul(tmp4,tmp4); tmp4=gf4096_mul(tmp4,bit3_root2_inv); tmp4=gf4096_mul(tmp4,bit3_root2_inv); tmp4=gf4096_mul(tmp4,bit3_root2_inv); //rinv2^7 tmp5=gf4096_mul(tmp4,bit3_root2_inv); //rinv2^8 */ //for(x+1) //check if only 3-bit error tmp0 = gf4096_mul(bit3_root0_inv, bit3_root0_inv); tmp0 = gf4096_mul(tmp0, tmp0); tmp0 = gf4096_mul(tmp0, bit3_root0_inv); tmp0 = gf4096_mul(tmp0, bit3_root0_inv); //rinv0^6 tmp1 = gf4096_mul(tmp0, bit3_root0_inv); //rinv0^7 tmp2 = gf4096_mul(bit3_root1_inv, bit3_root1_inv); tmp2 = gf4096_mul(tmp2, tmp2); tmp2 = gf4096_mul(tmp2, bit3_root1_inv); tmp2 = gf4096_mul(tmp2, bit3_root1_inv); //rinv1^6 tmp3 = gf4096_mul(tmp2, bit3_root1_inv); //rinv1^7 tmp4 = gf4096_mul(bit3_root2_inv, bit3_root2_inv); tmp4 = gf4096_mul(tmp4, tmp4); tmp4 = gf4096_mul(tmp4, bit3_root2_inv); tmp4 = gf4096_mul(tmp4, bit3_root2_inv); //rinv2^6 tmp5 = gf4096_mul(tmp4, bit3_root2_inv); //rinv2^7 //check if only 3 errors if ((chk_syndrome_list[6] == (gf4096_mul(err_pats[0], tmp0) ^ gf4096_mul(err_pats[1], tmp2) ^ gf4096_mul(err_pats[2], tmp4))) & (chk_syndrome_list[7] == (gf4096_mul(err_pats[0], tmp1) ^ gf4096_mul(err_pats[1], tmp3) ^ gf4096_mul(err_pats[2], tmp5)))) { if ((err_pos_lut(bit3_root0_inv) == 0xfff) | (err_pos_lut(bit3_root1_inv) == 0xfff) | (err_pos_lut(bit3_root2_inv) == 0xfff)) { return (0); } else { err_info[0] = 0x3; err_info[1] = (0x55e - err_pos_lut(bit3_root0_inv)); err_info[2] = (0x55e - err_pos_lut(bit3_root1_inv)); err_info[3] = (0x55e - err_pos_lut(bit3_root2_inv)); err_info[5] = err_pats[0]; err_info[6] = err_pats[1]; err_info[7] = err_pats[2]; return (1); } } else return (0); } } static int chk_4_err_only(unsigned int *chk_syndrome_list, unsigned int *err_info) { unsigned int tmp0, tmp1, tmp2, tmp3, tmp4, tmp5; unsigned int coefs[4]; unsigned int err_pats[4]; int found_num_root = 0; unsigned int bit4_root0, bit4_root1, bit4_root2, bit4_root3; unsigned int bit4_root0_inv, bit4_root1_inv, bit4_root2_inv, bit4_root3_inv; unsigned int err_loc_eqn, test_root; unsigned int bit4_loc0, bit4_loc1, bit4_loc2, bit4_loc3; unsigned int bit4_pat0, bit4_pat1, bit4_pat2, bit4_pat3; find_4bit_err_coefs(chk_syndrome_list[0], chk_syndrome_list[1], chk_syndrome_list[2], chk_syndrome_list[3], chk_syndrome_list[4], chk_syndrome_list[5], chk_syndrome_list[6], chk_syndrome_list[7], coefs); for (test_root = 0x1; test_root < 0xfff; test_root++) { err_loc_eqn = gf4096_mul(coefs[3], gf4096_mul(gf4096_mul (gf4096_mul(test_root, test_root), test_root), test_root)) ^ gf4096_mul(coefs[2], gf4096_mul (gf4096_mul(test_root, test_root), test_root)) ^ gf4096_mul(coefs[1], gf4096_mul(test_root, test_root)) ^ gf4096_mul(coefs[0], test_root) ^ 0x1; if (err_loc_eqn == 0x0) { if (found_num_root == 0) { bit4_root0 = test_root; found_num_root = 1; } else if (found_num_root == 1) { bit4_root1 = test_root; found_num_root = 2; } else if (found_num_root == 2) { bit4_root2 = test_root; found_num_root = 3; } else { found_num_root = 4; bit4_root3 = test_root; break; } } } if (found_num_root != 4) { //err_info[0]=0xfff40001; err_info[0] = 0xffff0000; return (0); } else { bit4_root0_inv = gf4096_inv(bit4_root0); bit4_root1_inv = gf4096_inv(bit4_root1); bit4_root2_inv = gf4096_inv(bit4_root2); bit4_root3_inv = gf4096_inv(bit4_root3); find_4bit_err_pats(chk_syndrome_list[0], chk_syndrome_list[1], chk_syndrome_list[2], chk_syndrome_list[3], bit4_root0_inv, bit4_root1_inv, bit4_root2_inv, bit4_root3_inv, err_pats); err_info[0] = 0x4; err_info[1] = (0x55e - err_pos_lut(bit4_root0_inv)); err_info[2] = (0x55e - err_pos_lut(bit4_root1_inv)); err_info[3] = (0x55e - err_pos_lut(bit4_root2_inv)); err_info[4] = (0x55e - err_pos_lut(bit4_root3_inv)); err_info[5] = err_pats[0]; err_info[6] = err_pats[1]; err_info[7] = err_pats[2]; err_info[8] = err_pats[3]; return (1); } }