Guest User

Untitled

a guest
Jan 19th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.01 KB | None | 0 0
  1. #define _POSIX_C_SOURCE 200112L
  2. #include "taps.h"
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <unistd.h>
  6.  
  7. static const short *
  8. find(int n)
  9. {
  10. for (int i = 0; i < NTAPS; i++)
  11. if (taps[i * 5] == n)
  12. return taps + i * 5 + 1;
  13. return 0;
  14. }
  15.  
  16. static void
  17. generate_c_ull_shr(int n)
  18. {
  19. const short *t = find(n);
  20. int blocks = (n + 63) / 64;
  21. unsigned long long masks[4096 / 64] = {0};
  22. for (int i = 0; i < 4; i++) {
  23. if (t[i]) {
  24. int b = t[i] - 1;
  25. masks[b / 64] |= 1ULL << (b % 64);
  26. }
  27. }
  28. printf("#define LFSR%d_TAPS {", n);
  29. for (int i = 0; i < 4; i++)
  30. if (t[i])
  31. printf("%s%d", i ? ", " : "", t[i]);
  32. printf("}\n");
  33. printf("static int\nlfsr%d(unsigned long long s[%d])\n{\n", n, blocks);
  34. printf(" unsigned long long b = s[0] & 1ULL;\n");
  35. for (int i = 0; i < blocks - 1; i++)
  36. printf(" s[%d] = s[%d] >> 1 | s[%d] << 63;\n", i, i, i + 1);
  37. printf(" s[%d] = s[%d] >> 1;\n", blocks - 1, blocks - 1);
  38. for (int i = 0; i < blocks; i++)
  39. if (masks[i])
  40. printf(" s[%d] ^= -b & 0x%016llxULL;\n", i, masks[i]);
  41. printf(" return b;\n}\n");
  42. }
  43.  
  44. static void
  45. generate_c_ull_shl(int n)
  46. {
  47. const short *t = find(n);
  48. int blocks = (n + 63) / 64;
  49. unsigned long long masks[4096 / 64] = {0};
  50. for (int i = 0; i < 4; i++) {
  51. if (t[i]) {
  52. int b = t[i] - 1;
  53. masks[b / 64] |= 1ULL << (63 - (b % 64));
  54. }
  55. }
  56. printf("#define LFSR%d_TAPS {", n);
  57. for (int i = 0; i < 4; i++)
  58. if (t[i])
  59. printf("%s%d", i ? ", " : "", t[i]);
  60. printf("}\n");
  61. printf("static int\nlfsr%d(unsigned long long s[%d])\n{\n", n, blocks);
  62. printf(" unsigned long long b = s[0] >> 63;\n");
  63. for (int i = 0; i < blocks - 1; i++)
  64. printf(" s[%d] = s[%d] << 1 | s[%d] >> 63;\n", i, i, i + 1);
  65. printf(" s[%d] = s[%d] << 1;\n", blocks - 1, blocks - 1);
  66. for (int i = 0; i < blocks; i++)
  67. if (masks[i])
  68. printf(" s[%d] ^= -b & 0x%016llxULL;\n", i, masks[i]);
  69. printf(" return b;\n}\n");
  70. }
  71.  
  72. static void
  73. generate_js(int n)
  74. {
  75. const short *t = find(n);
  76. int blocks = (n + 31) / 32;
  77. unsigned long tbits = n % 32;
  78. unsigned long masks[4096 / 32] = {0};
  79. for (int i = 0; i < 4; i++) {
  80. if (t[i]) {
  81. int b = t[i] - 1;
  82. masks[b / 32] |= 1ULL << (b % 32);
  83. }
  84. }
  85. printf("function lfsr%d() {\n", n);
  86. printf(" let taps = [");
  87. for (int i = 0; i < 4; i++)
  88. if (t[i])
  89. printf("%s%d", i ? ", " : "", t[i]);
  90. printf("];\n");
  91. printf(" let s = new Uint32Array(%d);\n", blocks);
  92. printf(" for (let i = 0; i < %d; i++)\n", tbits ? blocks - 1 : blocks);
  93. printf(" s[i] = Math.random() * 4294967296;\n" );
  94. if (tbits)
  95. printf(" s[%d] = Math.random() * %lu;\n", blocks - 1, 1UL << tbits);
  96. printf(" function next() {\n");
  97. printf(" let b = s[0] & 1;\n");
  98. for (int i = 0; i < blocks - 1; i++)
  99. printf(" s[%d] = s[%d] >>> 1 | s[%d] << 31;\n", i, i, i + 1);
  100. printf(" s[%d] = s[%d] >>> 1;\n", blocks - 1, blocks - 1);
  101. for (int i = 0; i < blocks; i++)
  102. if (masks[i])
  103. printf(" s[%d] ^= -b & 0x%08lx;\n", i, masks[i]);
  104. printf(" return b;\n }\n");
  105. printf(" function bit(n) {\n");
  106. printf(" return s[Math.floor(n / 32)] >> (n %% 32) & 1;\n");
  107. printf(" }\n");
  108. printf(" return {next: next, bit: bit, n: %d, taps: taps};\n", n);
  109. printf("}\n");
  110. }
  111.  
  112. static void
  113. usage(FILE *f)
  114. {
  115. fprintf(f, "usage: lfsrgen [-hr] [-l LANG] [-n BITS]\n");
  116. fprintf(f, " -h print this message\n");
  117. fprintf(f, " -l LANG output language (c, js)\n");
  118. fprintf(f, " -n BITS LFSR size\n");
  119. fprintf(f, " -r reverse shift\n");
  120. }
  121.  
  122. int
  123. main(int argc, char *argv[])
  124. {
  125. int n = 256;
  126. int option;
  127. int shift = 'L';
  128. const char *lang = "c";
  129.  
  130. while ((option = getopt(argc, argv, "hl:n:r")) != -1) {
  131. switch (option) {
  132. case 'h': {
  133. usage(stdout);
  134. exit(EXIT_SUCCESS);
  135. } break;
  136. case 'l': {
  137. lang = optarg;
  138. } break;
  139. case 'n': {
  140. n = atoi(optarg);
  141. } break;
  142. case 'r': {
  143. shift = 'R';
  144. } break;
  145. default: {
  146. usage(stderr);
  147. exit(EXIT_FAILURE);
  148. } break;
  149. }
  150. }
  151.  
  152. if (!find(n)) {
  153. fprintf(stderr, "lfsrgen: %d bits unsupported\n", n);
  154. exit(EXIT_FAILURE);
  155. }
  156. switch (lang[0]) {
  157. case 'c':
  158. switch (shift) {
  159. case 'R': generate_c_ull_shr(n); break;
  160. case 'L': generate_c_ull_shl(n); break;
  161. }
  162. break;
  163. case 'j':
  164. generate_js(n);
  165. break;
  166. default:
  167. fprintf(stderr, "lfsrgen: unknown language -- %s\n", lang);
  168. exit(EXIT_FAILURE);
  169. break;
  170. }
  171. }
Add Comment
Please, Sign In to add comment