xref: /aosp_15_r20/external/stressapptest/src/pattern.cc (revision 424fb153c814cbcb3e8904974796228774b3229a)
1*424fb153SAndroid Build Coastguard Worker // Copyright 2006 Google Inc. All Rights Reserved.
2*424fb153SAndroid Build Coastguard Worker 
3*424fb153SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*424fb153SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*424fb153SAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*424fb153SAndroid Build Coastguard Worker 
7*424fb153SAndroid Build Coastguard Worker //      http://www.apache.org/licenses/LICENSE-2.0
8*424fb153SAndroid Build Coastguard Worker 
9*424fb153SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*424fb153SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*424fb153SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*424fb153SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*424fb153SAndroid Build Coastguard Worker // limitations under the License.
14*424fb153SAndroid Build Coastguard Worker 
15*424fb153SAndroid Build Coastguard Worker // pattern.cc : library of stressful data patterns
16*424fb153SAndroid Build Coastguard Worker 
17*424fb153SAndroid Build Coastguard Worker #include <sys/types.h>
18*424fb153SAndroid Build Coastguard Worker 
19*424fb153SAndroid Build Coastguard Worker // This file must work with autoconf on its public version,
20*424fb153SAndroid Build Coastguard Worker // so these includes are correct.
21*424fb153SAndroid Build Coastguard Worker #include "pattern.h"
22*424fb153SAndroid Build Coastguard Worker #include "sattypes.h"
23*424fb153SAndroid Build Coastguard Worker 
24*424fb153SAndroid Build Coastguard Worker // Static data patterns.
25*424fb153SAndroid Build Coastguard Worker 
26*424fb153SAndroid Build Coastguard Worker static unsigned int walkingOnes_data[] =   {
27*424fb153SAndroid Build Coastguard Worker   0x00000001, 0x00000002, 0x00000004, 0x00000008,
28*424fb153SAndroid Build Coastguard Worker   0x00000010, 0x00000020, 0x00000040, 0x00000080,
29*424fb153SAndroid Build Coastguard Worker   0x00000100, 0x00000200, 0x00000400, 0x00000800,
30*424fb153SAndroid Build Coastguard Worker   0x00001000, 0x00002000, 0x00004000, 0x00008000,
31*424fb153SAndroid Build Coastguard Worker   0x00010000, 0x00020000, 0x00040000, 0x00080000,
32*424fb153SAndroid Build Coastguard Worker   0x00100000, 0x00200000, 0x00400000, 0x00800000,
33*424fb153SAndroid Build Coastguard Worker   0x01000000, 0x02000000, 0x04000000, 0x08000000,
34*424fb153SAndroid Build Coastguard Worker   0x10000000, 0x20000000, 0x40000000, 0x80000000,
35*424fb153SAndroid Build Coastguard Worker   0x40000000, 0x20000000, 0x10000000, 0x08000000,
36*424fb153SAndroid Build Coastguard Worker   0x04000000, 0x02000000, 0x01000000, 0x00800000,
37*424fb153SAndroid Build Coastguard Worker   0x00400000, 0x00200000, 0x00100000, 0x00080000,
38*424fb153SAndroid Build Coastguard Worker   0x00040000, 0x00020000, 0x00010000, 0x00008000,
39*424fb153SAndroid Build Coastguard Worker   0x00004000, 0x00002000, 0x00001000, 0x00000800,
40*424fb153SAndroid Build Coastguard Worker   0x00000400, 0x00000200, 0x00000100, 0x00000080,
41*424fb153SAndroid Build Coastguard Worker   0x00000040, 0x00000020, 0x00000010, 0x00000008,
42*424fb153SAndroid Build Coastguard Worker   0x00000004, 0x00000002, 0x00000001, 0x00000000
43*424fb153SAndroid Build Coastguard Worker };
44*424fb153SAndroid Build Coastguard Worker static const struct PatternData walkingOnes = {
45*424fb153SAndroid Build Coastguard Worker   "walkingOnes",
46*424fb153SAndroid Build Coastguard Worker   walkingOnes_data,
47*424fb153SAndroid Build Coastguard Worker   (sizeof walkingOnes_data / sizeof walkingOnes_data[0]) - 1,
48*424fb153SAndroid Build Coastguard Worker   {1, 1, 2, 1}  // Weight for choosing 32/64/128/256 bit wide of this pattern
49*424fb153SAndroid Build Coastguard Worker };
50*424fb153SAndroid Build Coastguard Worker 
51*424fb153SAndroid Build Coastguard Worker static unsigned int walkingInvOnes_data[] =   {
52*424fb153SAndroid Build Coastguard Worker   0x00000001, 0xfffffffe, 0x00000002, 0xfffffffd,
53*424fb153SAndroid Build Coastguard Worker   0x00000004, 0xfffffffb, 0x00000008, 0xfffffff7,
54*424fb153SAndroid Build Coastguard Worker   0x00000010, 0xffffffef, 0x00000020, 0xffffffdf,
55*424fb153SAndroid Build Coastguard Worker   0x00000040, 0xffffffbf, 0x00000080, 0xffffff7f,
56*424fb153SAndroid Build Coastguard Worker   0x00000100, 0xfffffeff, 0x00000200, 0xfffffdff,
57*424fb153SAndroid Build Coastguard Worker   0x00000400, 0xfffffbff, 0x00000800, 0xfffff7ff,
58*424fb153SAndroid Build Coastguard Worker   0x00001000, 0xffffefff, 0x00002000, 0xffffdfff,
59*424fb153SAndroid Build Coastguard Worker   0x00004000, 0xffffbfff, 0x00008000, 0xffff7fff,
60*424fb153SAndroid Build Coastguard Worker   0x00010000, 0xfffeffff, 0x00020000, 0xfffdffff,
61*424fb153SAndroid Build Coastguard Worker   0x00040000, 0xfffbffff, 0x00080000, 0xfff7ffff,
62*424fb153SAndroid Build Coastguard Worker   0x00100000, 0xffefffff, 0x00200000, 0xffdfffff,
63*424fb153SAndroid Build Coastguard Worker   0x00400000, 0xffbfffff, 0x00800000, 0xff7fffff,
64*424fb153SAndroid Build Coastguard Worker   0x01000000, 0xfeffffff, 0x02000000, 0xfdffffff,
65*424fb153SAndroid Build Coastguard Worker   0x04000000, 0xfbffffff, 0x08000000, 0xf7ffffff,
66*424fb153SAndroid Build Coastguard Worker   0x10000000, 0xefffffff, 0x20000000, 0xdfffffff,
67*424fb153SAndroid Build Coastguard Worker   0x40000000, 0xbfffffff, 0x80000000, 0x7fffffff,
68*424fb153SAndroid Build Coastguard Worker   0x40000000, 0xbfffffff, 0x20000000, 0xdfffffff,
69*424fb153SAndroid Build Coastguard Worker   0x10000000, 0xefffffff, 0x08000000, 0xf7ffffff,
70*424fb153SAndroid Build Coastguard Worker   0x04000000, 0xfbffffff, 0x02000000, 0xfdffffff,
71*424fb153SAndroid Build Coastguard Worker   0x01000000, 0xfeffffff, 0x00800000, 0xff7fffff,
72*424fb153SAndroid Build Coastguard Worker   0x00400000, 0xffbfffff, 0x00200000, 0xffdfffff,
73*424fb153SAndroid Build Coastguard Worker   0x00100000, 0xffefffff, 0x00080000, 0xfff7ffff,
74*424fb153SAndroid Build Coastguard Worker   0x00040000, 0xfffbffff, 0x00020000, 0xfffdffff,
75*424fb153SAndroid Build Coastguard Worker   0x00010000, 0xfffeffff, 0x00008000, 0xffff7fff,
76*424fb153SAndroid Build Coastguard Worker   0x00004000, 0xffffbfff, 0x00002000, 0xffffdfff,
77*424fb153SAndroid Build Coastguard Worker   0x00001000, 0xffffefff, 0x00000800, 0xfffff7ff,
78*424fb153SAndroid Build Coastguard Worker   0x00000400, 0xfffffbff, 0x00000200, 0xfffffdff,
79*424fb153SAndroid Build Coastguard Worker   0x00000100, 0xfffffeff, 0x00000080, 0xffffff7f,
80*424fb153SAndroid Build Coastguard Worker   0x00000040, 0xffffffbf, 0x00000020, 0xffffffdf,
81*424fb153SAndroid Build Coastguard Worker   0x00000010, 0xffffffef, 0x00000008, 0xfffffff7,
82*424fb153SAndroid Build Coastguard Worker   0x00000004, 0xfffffffb, 0x00000002, 0xfffffffd,
83*424fb153SAndroid Build Coastguard Worker   0x00000001, 0xfffffffe, 0x00000000, 0xffffffff
84*424fb153SAndroid Build Coastguard Worker };
85*424fb153SAndroid Build Coastguard Worker static const struct PatternData walkingInvOnes = {
86*424fb153SAndroid Build Coastguard Worker   "walkingInvOnes",
87*424fb153SAndroid Build Coastguard Worker   walkingInvOnes_data,
88*424fb153SAndroid Build Coastguard Worker   (sizeof walkingInvOnes_data / sizeof walkingInvOnes_data[0]) - 1,
89*424fb153SAndroid Build Coastguard Worker   {2, 2, 5, 5}
90*424fb153SAndroid Build Coastguard Worker };
91*424fb153SAndroid Build Coastguard Worker 
92*424fb153SAndroid Build Coastguard Worker static unsigned int walkingZeros_data[] =   {
93*424fb153SAndroid Build Coastguard Worker   0xfffffffe, 0xfffffffd, 0xfffffffb, 0xfffffff7,
94*424fb153SAndroid Build Coastguard Worker   0xffffffef, 0xffffffdf, 0xffffffbf, 0xffffff7f,
95*424fb153SAndroid Build Coastguard Worker   0xfffffeff, 0xfffffdff, 0xfffffbff, 0xfffff7ff,
96*424fb153SAndroid Build Coastguard Worker   0xffffefff, 0xffffdfff, 0xffffbfff, 0xffff7fff,
97*424fb153SAndroid Build Coastguard Worker   0xfffeffff, 0xfffdffff, 0xfffbffff, 0xfff7ffff,
98*424fb153SAndroid Build Coastguard Worker   0xffefffff, 0xffdfffff, 0xffbfffff, 0xff7fffff,
99*424fb153SAndroid Build Coastguard Worker   0xfeffffff, 0xfdffffff, 0xfbffffff, 0xf7ffffff,
100*424fb153SAndroid Build Coastguard Worker   0xefffffff, 0xdfffffff, 0xbfffffff, 0x7fffffff,
101*424fb153SAndroid Build Coastguard Worker   0xbfffffff, 0xdfffffff, 0xefffffff, 0xf7ffffff,
102*424fb153SAndroid Build Coastguard Worker   0xfbffffff, 0xfdffffff, 0xfeffffff, 0xff7fffff,
103*424fb153SAndroid Build Coastguard Worker   0xffbfffff, 0xffdfffff, 0xffefffff, 0xfff7ffff,
104*424fb153SAndroid Build Coastguard Worker   0xfffbffff, 0xfffdffff, 0xfffeffff, 0xffff7fff,
105*424fb153SAndroid Build Coastguard Worker   0xffffbfff, 0xffffdfff, 0xffffefff, 0xfffff7ff,
106*424fb153SAndroid Build Coastguard Worker   0xfffffbff, 0xfffffdff, 0xfffffeff, 0xffffff7f,
107*424fb153SAndroid Build Coastguard Worker   0xffffffbf, 0xffffffdf, 0xffffffef, 0xfffffff7,
108*424fb153SAndroid Build Coastguard Worker   0xfffffffb, 0xfffffffd, 0xfffffffe, 0xffffffff
109*424fb153SAndroid Build Coastguard Worker };
110*424fb153SAndroid Build Coastguard Worker static const struct PatternData walkingZeros = {
111*424fb153SAndroid Build Coastguard Worker   "walkingZeros",
112*424fb153SAndroid Build Coastguard Worker   walkingZeros_data,
113*424fb153SAndroid Build Coastguard Worker   (sizeof walkingZeros_data / sizeof walkingZeros_data[0]) - 1,
114*424fb153SAndroid Build Coastguard Worker   {1, 1, 2, 1}
115*424fb153SAndroid Build Coastguard Worker };
116*424fb153SAndroid Build Coastguard Worker 
117*424fb153SAndroid Build Coastguard Worker static unsigned int OneZero_data[] =   { 0x00000000, 0xffffffff};
118*424fb153SAndroid Build Coastguard Worker static const struct PatternData OneZero = {
119*424fb153SAndroid Build Coastguard Worker   "OneZero",
120*424fb153SAndroid Build Coastguard Worker   OneZero_data,
121*424fb153SAndroid Build Coastguard Worker   (sizeof OneZero_data / sizeof OneZero_data[0]) - 1,
122*424fb153SAndroid Build Coastguard Worker   {5, 5, 15, 5}
123*424fb153SAndroid Build Coastguard Worker };
124*424fb153SAndroid Build Coastguard Worker 
125*424fb153SAndroid Build Coastguard Worker static unsigned int JustZero_data[] =   { 0x00000000, 0x00000000};
126*424fb153SAndroid Build Coastguard Worker static const struct PatternData JustZero = {
127*424fb153SAndroid Build Coastguard Worker   "JustZero",
128*424fb153SAndroid Build Coastguard Worker   JustZero_data,
129*424fb153SAndroid Build Coastguard Worker   (sizeof JustZero_data / sizeof JustZero_data[0]) - 1,
130*424fb153SAndroid Build Coastguard Worker   {2, 0, 0, 0}
131*424fb153SAndroid Build Coastguard Worker };
132*424fb153SAndroid Build Coastguard Worker 
133*424fb153SAndroid Build Coastguard Worker static unsigned int JustOne_data[] =   { 0xffffffff, 0xffffffff};
134*424fb153SAndroid Build Coastguard Worker static const struct PatternData JustOne = {
135*424fb153SAndroid Build Coastguard Worker   "JustOne",
136*424fb153SAndroid Build Coastguard Worker   JustOne_data,
137*424fb153SAndroid Build Coastguard Worker   (sizeof JustOne_data / sizeof JustOne_data[0]) - 1,
138*424fb153SAndroid Build Coastguard Worker   {2, 0, 0, 0}
139*424fb153SAndroid Build Coastguard Worker };
140*424fb153SAndroid Build Coastguard Worker 
141*424fb153SAndroid Build Coastguard Worker static unsigned int JustFive_data[] =   { 0x55555555, 0x55555555};
142*424fb153SAndroid Build Coastguard Worker static const struct PatternData JustFive = {
143*424fb153SAndroid Build Coastguard Worker   "JustFive",
144*424fb153SAndroid Build Coastguard Worker   JustFive_data,
145*424fb153SAndroid Build Coastguard Worker   (sizeof JustFive_data / sizeof JustFive_data[0]) - 1,
146*424fb153SAndroid Build Coastguard Worker   {2, 0, 0, 0}
147*424fb153SAndroid Build Coastguard Worker };
148*424fb153SAndroid Build Coastguard Worker 
149*424fb153SAndroid Build Coastguard Worker static unsigned int JustA_data[] =   { 0xaaaaaaaa, 0xaaaaaaaa};
150*424fb153SAndroid Build Coastguard Worker static const struct PatternData JustA = {
151*424fb153SAndroid Build Coastguard Worker   "JustA",
152*424fb153SAndroid Build Coastguard Worker   JustA_data,
153*424fb153SAndroid Build Coastguard Worker   (sizeof JustA_data / sizeof JustA_data[0]) - 1,
154*424fb153SAndroid Build Coastguard Worker   {2, 0, 0, 0}
155*424fb153SAndroid Build Coastguard Worker };
156*424fb153SAndroid Build Coastguard Worker 
157*424fb153SAndroid Build Coastguard Worker static unsigned int FiveA_data[] =   { 0x55555555, 0xaaaaaaaa};
158*424fb153SAndroid Build Coastguard Worker static const struct PatternData FiveA = {
159*424fb153SAndroid Build Coastguard Worker   "FiveA",
160*424fb153SAndroid Build Coastguard Worker   FiveA_data,
161*424fb153SAndroid Build Coastguard Worker   (sizeof FiveA_data / sizeof FiveA_data[0]) - 1,
162*424fb153SAndroid Build Coastguard Worker   {1, 1, 1, 1}
163*424fb153SAndroid Build Coastguard Worker };
164*424fb153SAndroid Build Coastguard Worker 
165*424fb153SAndroid Build Coastguard Worker static unsigned int FiveA8_data[] =   {
166*424fb153SAndroid Build Coastguard Worker   0x5aa5a55a, 0xa55a5aa5, 0xa55a5aa5, 0x5aa5a55a
167*424fb153SAndroid Build Coastguard Worker };
168*424fb153SAndroid Build Coastguard Worker static const struct PatternData FiveA8 = {
169*424fb153SAndroid Build Coastguard Worker   "FiveA8",
170*424fb153SAndroid Build Coastguard Worker   FiveA8_data,
171*424fb153SAndroid Build Coastguard Worker   (sizeof FiveA8_data / sizeof FiveA8_data[0]) - 1,
172*424fb153SAndroid Build Coastguard Worker   {1, 1, 1, 1}
173*424fb153SAndroid Build Coastguard Worker };
174*424fb153SAndroid Build Coastguard Worker 
175*424fb153SAndroid Build Coastguard Worker static unsigned int Long8b10b_data[] =   { 0x16161616, 0x16161616 };
176*424fb153SAndroid Build Coastguard Worker static const struct PatternData Long8b10b = {
177*424fb153SAndroid Build Coastguard Worker   "Long8b10b",
178*424fb153SAndroid Build Coastguard Worker   Long8b10b_data,
179*424fb153SAndroid Build Coastguard Worker   (sizeof Long8b10b_data / sizeof Long8b10b_data[0]) - 1,
180*424fb153SAndroid Build Coastguard Worker   {2, 0, 0, 0}
181*424fb153SAndroid Build Coastguard Worker };
182*424fb153SAndroid Build Coastguard Worker 
183*424fb153SAndroid Build Coastguard Worker static unsigned int Short8b10b_data[] =   { 0xb5b5b5b5, 0xb5b5b5b5 };
184*424fb153SAndroid Build Coastguard Worker static const struct PatternData Short8b10b = {
185*424fb153SAndroid Build Coastguard Worker   "Short8b10b",
186*424fb153SAndroid Build Coastguard Worker   Short8b10b_data,
187*424fb153SAndroid Build Coastguard Worker   (sizeof Short8b10b_data / sizeof Short8b10b_data[0]) - 1,
188*424fb153SAndroid Build Coastguard Worker   {2, 0, 0, 0}
189*424fb153SAndroid Build Coastguard Worker };
190*424fb153SAndroid Build Coastguard Worker 
191*424fb153SAndroid Build Coastguard Worker static unsigned int Checker8b10b_data[] =   { 0xb5b5b5b5, 0x4a4a4a4a };
192*424fb153SAndroid Build Coastguard Worker static const struct PatternData Checker8b10b = {
193*424fb153SAndroid Build Coastguard Worker   "Checker8b10b",
194*424fb153SAndroid Build Coastguard Worker   Checker8b10b_data,
195*424fb153SAndroid Build Coastguard Worker   (sizeof Checker8b10b_data / sizeof Checker8b10b_data[0]) - 1,
196*424fb153SAndroid Build Coastguard Worker   {1, 0, 0, 1}
197*424fb153SAndroid Build Coastguard Worker };
198*424fb153SAndroid Build Coastguard Worker 
199*424fb153SAndroid Build Coastguard Worker static unsigned int Five7_data[] =   { 0x55555557, 0x55575555 };
200*424fb153SAndroid Build Coastguard Worker static const struct PatternData Five7 = {
201*424fb153SAndroid Build Coastguard Worker   "Five7",
202*424fb153SAndroid Build Coastguard Worker   Five7_data,
203*424fb153SAndroid Build Coastguard Worker   (sizeof Five7_data / sizeof Five7_data[0]) - 1,
204*424fb153SAndroid Build Coastguard Worker   {0, 2, 0, 0}
205*424fb153SAndroid Build Coastguard Worker };
206*424fb153SAndroid Build Coastguard Worker 
207*424fb153SAndroid Build Coastguard Worker static unsigned int Zero2fd_data[] =   { 0x00020002, 0xfffdfffd };
208*424fb153SAndroid Build Coastguard Worker static const struct PatternData Zero2fd = {
209*424fb153SAndroid Build Coastguard Worker   "Zero2fd",
210*424fb153SAndroid Build Coastguard Worker   Zero2fd_data,
211*424fb153SAndroid Build Coastguard Worker   (sizeof Zero2fd_data / sizeof Zero2fd_data[0]) - 1,
212*424fb153SAndroid Build Coastguard Worker   {0, 2, 0, 0}
213*424fb153SAndroid Build Coastguard Worker };
214*424fb153SAndroid Build Coastguard Worker 
215*424fb153SAndroid Build Coastguard Worker // Extern array of useable patterns.
216*424fb153SAndroid Build Coastguard Worker static const struct PatternData pattern_array[] = {
217*424fb153SAndroid Build Coastguard Worker   walkingOnes,
218*424fb153SAndroid Build Coastguard Worker   walkingInvOnes,
219*424fb153SAndroid Build Coastguard Worker   walkingZeros,
220*424fb153SAndroid Build Coastguard Worker   OneZero,
221*424fb153SAndroid Build Coastguard Worker   JustZero,
222*424fb153SAndroid Build Coastguard Worker   JustOne,
223*424fb153SAndroid Build Coastguard Worker   JustFive,
224*424fb153SAndroid Build Coastguard Worker   JustA,
225*424fb153SAndroid Build Coastguard Worker   FiveA,
226*424fb153SAndroid Build Coastguard Worker   FiveA8,
227*424fb153SAndroid Build Coastguard Worker   Long8b10b,
228*424fb153SAndroid Build Coastguard Worker   Short8b10b,
229*424fb153SAndroid Build Coastguard Worker   Checker8b10b,
230*424fb153SAndroid Build Coastguard Worker   Five7,
231*424fb153SAndroid Build Coastguard Worker   Zero2fd,
232*424fb153SAndroid Build Coastguard Worker };
233*424fb153SAndroid Build Coastguard Worker static const int pattern_array_size =
234*424fb153SAndroid Build Coastguard Worker     sizeof pattern_array / sizeof pattern_array[0];
235*424fb153SAndroid Build Coastguard Worker 
Pattern()236*424fb153SAndroid Build Coastguard Worker Pattern::Pattern() {
237*424fb153SAndroid Build Coastguard Worker   crc_ = NULL;
238*424fb153SAndroid Build Coastguard Worker }
239*424fb153SAndroid Build Coastguard Worker 
~Pattern()240*424fb153SAndroid Build Coastguard Worker Pattern::~Pattern() {
241*424fb153SAndroid Build Coastguard Worker   if (crc_ != NULL) {
242*424fb153SAndroid Build Coastguard Worker     delete crc_;
243*424fb153SAndroid Build Coastguard Worker   }
244*424fb153SAndroid Build Coastguard Worker }
245*424fb153SAndroid Build Coastguard Worker 
246*424fb153SAndroid Build Coastguard Worker // Calculate CRC for this pattern. This must match
247*424fb153SAndroid Build Coastguard Worker // the CRC calculation in worker.cc.
CalculateCrc()248*424fb153SAndroid Build Coastguard Worker int Pattern::CalculateCrc() {
249*424fb153SAndroid Build Coastguard Worker   // TODO(johnhuang):
250*424fb153SAndroid Build Coastguard Worker   // Consider refactoring to the form:
251*424fb153SAndroid Build Coastguard Worker   // while (i < count) AdlerInc(uint64, uint64, AdlerChecksum*)
252*424fb153SAndroid Build Coastguard Worker   uint64 a1 = 1;
253*424fb153SAndroid Build Coastguard Worker   uint64 a2 = 1;
254*424fb153SAndroid Build Coastguard Worker   uint64 b1 = 0;
255*424fb153SAndroid Build Coastguard Worker   uint64 b2 = 0;
256*424fb153SAndroid Build Coastguard Worker 
257*424fb153SAndroid Build Coastguard Worker   // checksum is calculated using only the first 4096 bytes of data.
258*424fb153SAndroid Build Coastguard Worker   int i = 0;
259*424fb153SAndroid Build Coastguard Worker   int blocksize = 4096;
260*424fb153SAndroid Build Coastguard Worker   int count = blocksize / sizeof i;
261*424fb153SAndroid Build Coastguard Worker   while (i < count) {
262*424fb153SAndroid Build Coastguard Worker     a1 += pattern(i);
263*424fb153SAndroid Build Coastguard Worker     b1 += a1;
264*424fb153SAndroid Build Coastguard Worker     i++;
265*424fb153SAndroid Build Coastguard Worker     a1 += pattern(i);
266*424fb153SAndroid Build Coastguard Worker     b1 += a1;
267*424fb153SAndroid Build Coastguard Worker     i++;
268*424fb153SAndroid Build Coastguard Worker 
269*424fb153SAndroid Build Coastguard Worker     a2 += pattern(i);
270*424fb153SAndroid Build Coastguard Worker     b2 += a2;
271*424fb153SAndroid Build Coastguard Worker     i++;
272*424fb153SAndroid Build Coastguard Worker     a2 += pattern(i);
273*424fb153SAndroid Build Coastguard Worker     b2 += a2;
274*424fb153SAndroid Build Coastguard Worker     i++;
275*424fb153SAndroid Build Coastguard Worker   }
276*424fb153SAndroid Build Coastguard Worker   if (crc_ != NULL) {
277*424fb153SAndroid Build Coastguard Worker     delete crc_;
278*424fb153SAndroid Build Coastguard Worker   }
279*424fb153SAndroid Build Coastguard Worker   crc_ = new AdlerChecksum();
280*424fb153SAndroid Build Coastguard Worker   crc_->Set(a1, a2, b1, b2);
281*424fb153SAndroid Build Coastguard Worker   return 0;
282*424fb153SAndroid Build Coastguard Worker }
283*424fb153SAndroid Build Coastguard Worker 
284*424fb153SAndroid Build Coastguard Worker // Initialize pattern's CRC.
Initialize(const struct PatternData & pattern_init,int buswidth,bool invert,int weight)285*424fb153SAndroid Build Coastguard Worker int Pattern::Initialize(const struct PatternData &pattern_init,
286*424fb153SAndroid Build Coastguard Worker                         int buswidth,
287*424fb153SAndroid Build Coastguard Worker                         bool invert,
288*424fb153SAndroid Build Coastguard Worker                         int weight) {
289*424fb153SAndroid Build Coastguard Worker   int result = 1;
290*424fb153SAndroid Build Coastguard Worker 
291*424fb153SAndroid Build Coastguard Worker   pattern_ = &pattern_init;
292*424fb153SAndroid Build Coastguard Worker   busshift_ = 2;
293*424fb153SAndroid Build Coastguard Worker   inverse_ = invert;
294*424fb153SAndroid Build Coastguard Worker   weight_ = weight;
295*424fb153SAndroid Build Coastguard Worker 
296*424fb153SAndroid Build Coastguard Worker   name_.clear();
297*424fb153SAndroid Build Coastguard Worker   name_.append(pattern_->name);
298*424fb153SAndroid Build Coastguard Worker 
299*424fb153SAndroid Build Coastguard Worker   if (invert)
300*424fb153SAndroid Build Coastguard Worker     name_.append("~");
301*424fb153SAndroid Build Coastguard Worker 
302*424fb153SAndroid Build Coastguard Worker   if (buswidth == 32) {
303*424fb153SAndroid Build Coastguard Worker     name_.append("32");
304*424fb153SAndroid Build Coastguard Worker     busshift_ = 0;
305*424fb153SAndroid Build Coastguard Worker   } else if (buswidth == 64) {
306*424fb153SAndroid Build Coastguard Worker     name_.append("64");
307*424fb153SAndroid Build Coastguard Worker     busshift_ = 1;
308*424fb153SAndroid Build Coastguard Worker   } else if (buswidth == 128) {
309*424fb153SAndroid Build Coastguard Worker     name_.append("128");
310*424fb153SAndroid Build Coastguard Worker     busshift_ = 2;
311*424fb153SAndroid Build Coastguard Worker   } else if (buswidth == 256) {
312*424fb153SAndroid Build Coastguard Worker     name_.append("256");
313*424fb153SAndroid Build Coastguard Worker     busshift_ = 3;
314*424fb153SAndroid Build Coastguard Worker   } else {
315*424fb153SAndroid Build Coastguard Worker     logprintf(0, "Process Error: Confused by bus width %d\n",
316*424fb153SAndroid Build Coastguard Worker               buswidth);
317*424fb153SAndroid Build Coastguard Worker     name_.append("Broken");
318*424fb153SAndroid Build Coastguard Worker     result = 0;
319*424fb153SAndroid Build Coastguard Worker   }
320*424fb153SAndroid Build Coastguard Worker 
321*424fb153SAndroid Build Coastguard Worker   CalculateCrc();
322*424fb153SAndroid Build Coastguard Worker 
323*424fb153SAndroid Build Coastguard Worker   return result;
324*424fb153SAndroid Build Coastguard Worker }
325*424fb153SAndroid Build Coastguard Worker 
326*424fb153SAndroid Build Coastguard Worker 
PatternList()327*424fb153SAndroid Build Coastguard Worker PatternList::PatternList() {
328*424fb153SAndroid Build Coastguard Worker   size_= 0;
329*424fb153SAndroid Build Coastguard Worker   initialized_ = 0;
330*424fb153SAndroid Build Coastguard Worker }
331*424fb153SAndroid Build Coastguard Worker 
~PatternList()332*424fb153SAndroid Build Coastguard Worker PatternList::~PatternList() {
333*424fb153SAndroid Build Coastguard Worker   if (initialized_) {
334*424fb153SAndroid Build Coastguard Worker     Destroy();
335*424fb153SAndroid Build Coastguard Worker   }
336*424fb153SAndroid Build Coastguard Worker }
337*424fb153SAndroid Build Coastguard Worker 
338*424fb153SAndroid Build Coastguard Worker // Fill in the class with references to the static data patterns
Initialize()339*424fb153SAndroid Build Coastguard Worker int PatternList::Initialize() {
340*424fb153SAndroid Build Coastguard Worker   int patterncount = 0;
341*424fb153SAndroid Build Coastguard Worker   int weightcount = 0;
342*424fb153SAndroid Build Coastguard Worker 
343*424fb153SAndroid Build Coastguard Worker   patterns_.resize(pattern_array_size * 8);
344*424fb153SAndroid Build Coastguard Worker   for (int i = 0; i < pattern_array_size; i++) {
345*424fb153SAndroid Build Coastguard Worker     // Non inverted.
346*424fb153SAndroid Build Coastguard Worker     weightcount += pattern_array[i].weight[0];
347*424fb153SAndroid Build Coastguard Worker     patterns_[patterncount++].Initialize(pattern_array[i], 32, false,
348*424fb153SAndroid Build Coastguard Worker                                          pattern_array[i].weight[0]);
349*424fb153SAndroid Build Coastguard Worker     weightcount += pattern_array[i].weight[1];
350*424fb153SAndroid Build Coastguard Worker     patterns_[patterncount++].Initialize(pattern_array[i], 64, false,
351*424fb153SAndroid Build Coastguard Worker                                          pattern_array[i].weight[1]);
352*424fb153SAndroid Build Coastguard Worker     weightcount += pattern_array[i].weight[2];
353*424fb153SAndroid Build Coastguard Worker     patterns_[patterncount++].Initialize(pattern_array[i], 128, false,
354*424fb153SAndroid Build Coastguard Worker                                          pattern_array[i].weight[2]);
355*424fb153SAndroid Build Coastguard Worker     weightcount += pattern_array[i].weight[3];
356*424fb153SAndroid Build Coastguard Worker     patterns_[patterncount++].Initialize(pattern_array[i], 256, false,
357*424fb153SAndroid Build Coastguard Worker                                          pattern_array[i].weight[3]);
358*424fb153SAndroid Build Coastguard Worker 
359*424fb153SAndroid Build Coastguard Worker     // Inverted.
360*424fb153SAndroid Build Coastguard Worker     weightcount += pattern_array[i].weight[0];
361*424fb153SAndroid Build Coastguard Worker     patterns_[patterncount++].Initialize(pattern_array[i], 32, true,
362*424fb153SAndroid Build Coastguard Worker                                          pattern_array[i].weight[0]);
363*424fb153SAndroid Build Coastguard Worker     weightcount += pattern_array[i].weight[1];
364*424fb153SAndroid Build Coastguard Worker     patterns_[patterncount++].Initialize(pattern_array[i], 64, true,
365*424fb153SAndroid Build Coastguard Worker                                          pattern_array[i].weight[1]);
366*424fb153SAndroid Build Coastguard Worker     weightcount += pattern_array[i].weight[2];
367*424fb153SAndroid Build Coastguard Worker     patterns_[patterncount++].Initialize(pattern_array[i], 128, true,
368*424fb153SAndroid Build Coastguard Worker                                          pattern_array[i].weight[2]);
369*424fb153SAndroid Build Coastguard Worker     weightcount += pattern_array[i].weight[3];
370*424fb153SAndroid Build Coastguard Worker     patterns_[patterncount++].Initialize(pattern_array[i], 256, true,
371*424fb153SAndroid Build Coastguard Worker                                          pattern_array[i].weight[3]);
372*424fb153SAndroid Build Coastguard Worker   }
373*424fb153SAndroid Build Coastguard Worker   size_ = patterncount;
374*424fb153SAndroid Build Coastguard Worker   weightcount_ = weightcount;
375*424fb153SAndroid Build Coastguard Worker   initialized_ = 1;
376*424fb153SAndroid Build Coastguard Worker 
377*424fb153SAndroid Build Coastguard Worker   logprintf(12, "Log: initialized %d data patterns\n", size_);
378*424fb153SAndroid Build Coastguard Worker 
379*424fb153SAndroid Build Coastguard Worker   return 1;
380*424fb153SAndroid Build Coastguard Worker }
381*424fb153SAndroid Build Coastguard Worker 
382*424fb153SAndroid Build Coastguard Worker // Free the stuff.
Destroy()383*424fb153SAndroid Build Coastguard Worker int PatternList::Destroy() {
384*424fb153SAndroid Build Coastguard Worker   if (!initialized_)
385*424fb153SAndroid Build Coastguard Worker     return 0;
386*424fb153SAndroid Build Coastguard Worker 
387*424fb153SAndroid Build Coastguard Worker   patterns_.clear();
388*424fb153SAndroid Build Coastguard Worker   size_ = 0;
389*424fb153SAndroid Build Coastguard Worker   initialized_ = 0;
390*424fb153SAndroid Build Coastguard Worker 
391*424fb153SAndroid Build Coastguard Worker   return 1;
392*424fb153SAndroid Build Coastguard Worker }
393*424fb153SAndroid Build Coastguard Worker 
394*424fb153SAndroid Build Coastguard Worker // Return pattern numbered "i"
GetPattern(int i)395*424fb153SAndroid Build Coastguard Worker Pattern *PatternList::GetPattern(int i) {
396*424fb153SAndroid Build Coastguard Worker   if (static_cast<unsigned int>(i) < size_) {
397*424fb153SAndroid Build Coastguard Worker     return &patterns_[i];
398*424fb153SAndroid Build Coastguard Worker   }
399*424fb153SAndroid Build Coastguard Worker 
400*424fb153SAndroid Build Coastguard Worker   logprintf(0, "Process Error: Out of bounds pattern access\n");
401*424fb153SAndroid Build Coastguard Worker   return 0;
402*424fb153SAndroid Build Coastguard Worker }
403*424fb153SAndroid Build Coastguard Worker 
404*424fb153SAndroid Build Coastguard Worker // Return a randomly selected pattern.
GetRandomPattern()405*424fb153SAndroid Build Coastguard Worker Pattern *PatternList::GetRandomPattern() {
406*424fb153SAndroid Build Coastguard Worker   int target = random();
407*424fb153SAndroid Build Coastguard Worker   unsigned int i = 0;
408*424fb153SAndroid Build Coastguard Worker   target = (target % weightcount_) + 1;
409*424fb153SAndroid Build Coastguard Worker 
410*424fb153SAndroid Build Coastguard Worker   do {
411*424fb153SAndroid Build Coastguard Worker     target -= patterns_[i].weight();
412*424fb153SAndroid Build Coastguard Worker     if (target <= 0)
413*424fb153SAndroid Build Coastguard Worker       break;
414*424fb153SAndroid Build Coastguard Worker     i++;
415*424fb153SAndroid Build Coastguard Worker   } while (i < size_);
416*424fb153SAndroid Build Coastguard Worker 
417*424fb153SAndroid Build Coastguard Worker   if (i < size_) {
418*424fb153SAndroid Build Coastguard Worker     return &patterns_[i];
419*424fb153SAndroid Build Coastguard Worker   }
420*424fb153SAndroid Build Coastguard Worker 
421*424fb153SAndroid Build Coastguard Worker   logprintf(0, "Process Error: Out of bounds pattern access\n");
422*424fb153SAndroid Build Coastguard Worker   return 0;
423*424fb153SAndroid Build Coastguard Worker }
424