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