Not a member of Pastebin yet?
                        Sign Up,
                        it unlocks many cool features!                    
                - #define _POSIX_C_SOURCE 200112L
 - #include "taps.h"
 - #include <stdio.h>
 - #include <stdlib.h>
 - #include <unistd.h>
 - static const short *
 - find(int n)
 - {
 - for (int i = 0; i < NTAPS; i++)
 - if (taps[i * 5] == n)
 - return taps + i * 5 + 1;
 - return 0;
 - }
 - static void
 - generate_c_ull_shr(int n)
 - {
 - const short *t = find(n);
 - int blocks = (n + 63) / 64;
 - unsigned long long masks[4096 / 64] = {0};
 - for (int i = 0; i < 4; i++) {
 - if (t[i]) {
 - int b = t[i] - 1;
 - masks[b / 64] |= 1ULL << (b % 64);
 - }
 - }
 - printf("#define LFSR%d_TAPS {", n);
 - for (int i = 0; i < 4; i++)
 - if (t[i])
 - printf("%s%d", i ? ", " : "", t[i]);
 - printf("}\n");
 - printf("static int\nlfsr%d(unsigned long long s[%d])\n{\n", n, blocks);
 - printf(" unsigned long long b = s[0] & 1ULL;\n");
 - for (int i = 0; i < blocks - 1; i++)
 - printf(" s[%d] = s[%d] >> 1 | s[%d] << 63;\n", i, i, i + 1);
 - printf(" s[%d] = s[%d] >> 1;\n", blocks - 1, blocks - 1);
 - for (int i = 0; i < blocks; i++)
 - if (masks[i])
 - printf(" s[%d] ^= -b & 0x%016llxULL;\n", i, masks[i]);
 - printf(" return b;\n}\n");
 - }
 - static void
 - generate_c_ull_shl(int n)
 - {
 - const short *t = find(n);
 - int blocks = (n + 63) / 64;
 - unsigned long long masks[4096 / 64] = {0};
 - for (int i = 0; i < 4; i++) {
 - if (t[i]) {
 - int b = t[i] - 1;
 - masks[b / 64] |= 1ULL << (63 - (b % 64));
 - }
 - }
 - printf("#define LFSR%d_TAPS {", n);
 - for (int i = 0; i < 4; i++)
 - if (t[i])
 - printf("%s%d", i ? ", " : "", t[i]);
 - printf("}\n");
 - printf("static int\nlfsr%d(unsigned long long s[%d])\n{\n", n, blocks);
 - printf(" unsigned long long b = s[0] >> 63;\n");
 - for (int i = 0; i < blocks - 1; i++)
 - printf(" s[%d] = s[%d] << 1 | s[%d] >> 63;\n", i, i, i + 1);
 - printf(" s[%d] = s[%d] << 1;\n", blocks - 1, blocks - 1);
 - for (int i = 0; i < blocks; i++)
 - if (masks[i])
 - printf(" s[%d] ^= -b & 0x%016llxULL;\n", i, masks[i]);
 - printf(" return b;\n}\n");
 - }
 - static void
 - generate_js(int n)
 - {
 - const short *t = find(n);
 - int blocks = (n + 31) / 32;
 - unsigned long tbits = n % 32;
 - unsigned long masks[4096 / 32] = {0};
 - for (int i = 0; i < 4; i++) {
 - if (t[i]) {
 - int b = t[i] - 1;
 - masks[b / 32] |= 1ULL << (b % 32);
 - }
 - }
 - printf("function lfsr%d() {\n", n);
 - printf(" let taps = [");
 - for (int i = 0; i < 4; i++)
 - if (t[i])
 - printf("%s%d", i ? ", " : "", t[i]);
 - printf("];\n");
 - printf(" let s = new Uint32Array(%d);\n", blocks);
 - printf(" for (let i = 0; i < %d; i++)\n", tbits ? blocks - 1 : blocks);
 - printf(" s[i] = Math.random() * 4294967296;\n" );
 - if (tbits)
 - printf(" s[%d] = Math.random() * %lu;\n", blocks - 1, 1UL << tbits);
 - printf(" function next() {\n");
 - printf(" let b = s[0] & 1;\n");
 - for (int i = 0; i < blocks - 1; i++)
 - printf(" s[%d] = s[%d] >>> 1 | s[%d] << 31;\n", i, i, i + 1);
 - printf(" s[%d] = s[%d] >>> 1;\n", blocks - 1, blocks - 1);
 - for (int i = 0; i < blocks; i++)
 - if (masks[i])
 - printf(" s[%d] ^= -b & 0x%08lx;\n", i, masks[i]);
 - printf(" return b;\n }\n");
 - printf(" function bit(n) {\n");
 - printf(" return s[Math.floor(n / 32)] >> (n %% 32) & 1;\n");
 - printf(" }\n");
 - printf(" return {next: next, bit: bit, n: %d, taps: taps};\n", n);
 - printf("}\n");
 - }
 - static void
 - usage(FILE *f)
 - {
 - fprintf(f, "usage: lfsrgen [-hr] [-l LANG] [-n BITS]\n");
 - fprintf(f, " -h print this message\n");
 - fprintf(f, " -l LANG output language (c, js)\n");
 - fprintf(f, " -n BITS LFSR size\n");
 - fprintf(f, " -r reverse shift\n");
 - }
 - int
 - main(int argc, char *argv[])
 - {
 - int n = 256;
 - int option;
 - int shift = 'L';
 - const char *lang = "c";
 - while ((option = getopt(argc, argv, "hl:n:r")) != -1) {
 - switch (option) {
 - case 'h': {
 - usage(stdout);
 - exit(EXIT_SUCCESS);
 - } break;
 - case 'l': {
 - lang = optarg;
 - } break;
 - case 'n': {
 - n = atoi(optarg);
 - } break;
 - case 'r': {
 - shift = 'R';
 - } break;
 - default: {
 - usage(stderr);
 - exit(EXIT_FAILURE);
 - } break;
 - }
 - }
 - if (!find(n)) {
 - fprintf(stderr, "lfsrgen: %d bits unsupported\n", n);
 - exit(EXIT_FAILURE);
 - }
 - switch (lang[0]) {
 - case 'c':
 - switch (shift) {
 - case 'R': generate_c_ull_shr(n); break;
 - case 'L': generate_c_ull_shl(n); break;
 - }
 - break;
 - case 'j':
 - generate_js(n);
 - break;
 - default:
 - fprintf(stderr, "lfsrgen: unknown language -- %s\n", lang);
 - exit(EXIT_FAILURE);
 - break;
 - }
 - }
 
                    Add Comment                
                
                        Please, Sign In to add comment