This source file includes following definitions.
- galois
- opal_srand
- opal_rand
- opal_random
1
2
3
4
5
6
7
8
9
10
11
12
13 #include "opal_config.h"
14
15 #include <string.h>
16
17 #include "alfg.h"
18
19
20
21
22
23
24
25
26 #define MASK 0x80000057U
27
28
29
30
31
32
33
34
35 #define TAP1 127
36 #define TAP2 97
37 #define CBIT 21
38
39
40
41
42
43
44
45
46
47
48 static uint32_t galois(unsigned int *seed){
49
50 uint32_t lsb;
51 lsb = (*seed & 1) ? 1 : 0;
52 *seed >>= 1;
53
54 *seed = *seed ^ (lsb*MASK);
55
56 return lsb;
57 }
58
59
60 static opal_rng_buff_t alfg_buffer;
61
62
63
64
65
66
67
68 int opal_srand(opal_rng_buff_t *buff, uint32_t seed) {
69
70 int i, j;
71 uint32_t seed_cpy = seed;
72 buff->tap1 = TAP1 - 1;
73 buff->tap2 = TAP2 - 1;
74
75
76 for( i = 0; i < TAP1; i++){
77 buff->alfg[i] = 0;
78 }
79
80 buff->alfg[CBIT] = 1;
81
82
83
84
85 for ( j = 1; j < TAP1; j++){
86 for( i = 1; i < 32; i++){
87 buff->alfg[j] = buff->alfg[j] ^ ((galois(&seed_cpy))<<i);
88 }
89 }
90
91 memcpy(&alfg_buffer, buff, sizeof(alfg_buffer));
92
93 return 1;
94
95 }
96
97
98
99
100
101
102
103
104 uint32_t opal_rand(opal_rng_buff_t *buff){
105
106 int *tap1 = &(buff->tap1);
107 int *tap2 = &(buff->tap2);
108 uint64_t overflow;
109 uint32_t temp;
110
111
112 overflow = (uint64_t) buff->alfg[*tap1] + (uint64_t) buff->alfg[*tap2];
113
114 temp = (*tap1 + 1) == TAP1 ? 0 : (*tap1 + 1);
115
116 buff->alfg[temp] = (uint32_t) ( overflow & ((1ULL<<32) -1));
117
118
119 *tap1 = (*tap1 + 1)%TAP1;
120 *tap2 = (*tap2 + 1)%TAP1;
121
122 return buff->alfg[temp];
123
124 }
125
126
127
128
129
130
131
132 int opal_random(void){
133
134 return (int)(opal_rand(&alfg_buffer) & 0x7FFFFFFF);
135 }