From 427fc81e38c8d4bfe521aaea331987f60bd2b1de Mon Sep 17 00:00:00 2001 From: Wolfgang Spraul Date: Sat, 23 Jun 2012 00:55:54 +0200 Subject: [PATCH] added some boolean algebra (part I) --- bit2txt.c | 156 +++++++++++++++++++++++++++++++++++++++++++++----- fpgastyle.css | 21 +++++++ lut.svg | 22 +++++++ 3 files changed, 185 insertions(+), 14 deletions(-) create mode 100644 fpgastyle.css create mode 100644 lut.svg diff --git a/bit2txt.c b/bit2txt.c index 003175b..3465a6d 100644 --- a/bit2txt.c +++ b/bit2txt.c @@ -604,6 +604,131 @@ void print_ramb16_cfg(ramb16_cfg_t* cfg) } +int bool_nextlen(const char* expr, int len) +{ + int i, depth; + + if (!len) return -1; + i = 0; + if (expr[i] == '~') { + i++; + if (i >= len) return -1; + } + if (expr[i] == '(') { + if (i+2 >= len) return -1; + i++; + for (depth = 1; depth && i < len; i++) { + if (expr[i] == '(') + depth++; + else if (expr[i] == ')') + depth--; + } + if (depth) return -1; + return i; + } + if (expr[i] == 'A') { + i++; + if (i >= len) return -1; + if (expr[i] < '1' || expr[i] > '6') return -1; + return i+1; + } + return -1; +} + +// + or, * and, @ xor, ~ not +// var must point to array of A1..A6 variables +int bool_eval(const char* expr, int len, const int* var) +{ + int i, negate, result, oplen; + + oplen = bool_nextlen(expr, len); + if (oplen < 1) goto fail; + i = 0; + negate = 0; + if (expr[i] == '~') { + negate = 1; + if (++i >= oplen) goto fail; + } + if (expr[i] == '(') { + if (i+2 >= oplen) goto fail; + result = bool_eval(&expr[i+1], oplen-i-2, var); + if (result == -1) goto fail; + } else if (expr[i] == 'A') { + if (i+1 >= oplen) goto fail; + if (expr[i+1] < '1' || expr[i+1] > '6') + goto fail; + result = var[expr[i+1]-'1']; + if (oplen != i+2) goto fail; + } else goto fail; + if (negate) result = !result; + i = oplen; + while (i < len) { + if (expr[i] == '+') { + if (result) return 1; + return bool_eval(&expr[i+1], len-i-1, var); + } + if (expr[i] == '@') { + int right_side = bool_eval(&expr[i+1], len-i-1, var); + if (right_side == -1) goto fail; + return (result && !right_side) || (!result && right_side); + } + if (expr[i] != '*') goto fail; + if (!result) break; + if (++i >= len) goto fail; + + oplen = bool_nextlen(&expr[i], len-i); + if (oplen < 1) goto fail; + result = bool_eval(&expr[i], oplen, var); + if (result == -1) goto fail; + i += oplen; + } + return result; +fail: + return -1; +} + +int parse_boolexpr(const char* expr, uint64_t* lut) +{ + int i, j, result, vars[6]; + const int base_vars[6] = {0 /* A1 */, 1, 0, 0, 0, 1 /* A6 */}; + + *lut = 0; + for (i = 0; i < 64; i++) { + memcpy(vars, base_vars, sizeof(vars)); + for (j = 0; j < 6; j++) { + if (i & (1<= type1_bram_data_start_frame) break; @@ -1441,8 +1566,8 @@ int main(int argc, char** argv) continue; } - middle_word = __be16_to_cpu(*(uint16_t*) - &bit_data[bit_cur+i*130+64]); + middle_byte0 = bit_data[bit_cur+i*130+64]; + middle_byte1 = bit_data[bit_cur+i*130+65]; first64_all_zero = 1; last64_all_zero = 1; @@ -1459,28 +1584,31 @@ int main(int argc, char** argv) } } - if (!(first64_all_zero && !middle_word && last64_all_zero)) { + if (!(first64_all_zero && !middle_byte0 && + !middle_byte1 && last64_all_zero)) { for (j = 0; j < 16; j++) { - if (middle_word & (1<= 8 && middle_byte0 & (1<<(7-j-8)))) printf("cfg r%i m%i-%i/%i c%i ?\n", cur_row, cur_major, cur_minor, majors[cur_major].minors, j); } - for (j = 0; j < 512; j++) { - if (bit_data[bit_cur+i*130+j/8] & (1<<(j%8))) + for (j = 0; j < 1024; j++) { + int word_o, byte_o, bit_o; + + word_o = j / 16; + if (word_o >= 64) + word_o++; + byte_o = !((j/8)%2); + bit_o = 7-(j%8); + + if (bit_data[bit_cur+i*130+word_o*2+byte_o] & (1< + + + + + MAJ+1 + MAJ + + b0 + + + + + + + + + + + + +