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.h : global pattern references and initialization
16*424fb153SAndroid Build Coastguard Worker
17*424fb153SAndroid Build Coastguard Worker // This file implements easy access to statically declared
18*424fb153SAndroid Build Coastguard Worker // data patterns.
19*424fb153SAndroid Build Coastguard Worker
20*424fb153SAndroid Build Coastguard Worker #ifndef STRESSAPPTEST_PATTERN_H_
21*424fb153SAndroid Build Coastguard Worker #define STRESSAPPTEST_PATTERN_H_
22*424fb153SAndroid Build Coastguard Worker
23*424fb153SAndroid Build Coastguard Worker #include <vector>
24*424fb153SAndroid Build Coastguard Worker #include <string>
25*424fb153SAndroid Build Coastguard Worker
26*424fb153SAndroid Build Coastguard Worker // This file must work with autoconf on its public version,
27*424fb153SAndroid Build Coastguard Worker // so these includes are correct.
28*424fb153SAndroid Build Coastguard Worker #include "adler32memcpy.h"
29*424fb153SAndroid Build Coastguard Worker #include "sattypes.h"
30*424fb153SAndroid Build Coastguard Worker
31*424fb153SAndroid Build Coastguard Worker // 2 = 128 bit bus, 1 = 64 bit bus, 0 = 32 bit bus
32*424fb153SAndroid Build Coastguard Worker const int kBusShift = 2;
33*424fb153SAndroid Build Coastguard Worker
34*424fb153SAndroid Build Coastguard Worker // Pattern and CRC data structure
35*424fb153SAndroid Build Coastguard Worker struct PatternData {
36*424fb153SAndroid Build Coastguard Worker const char *name; // Name of this pattern.
37*424fb153SAndroid Build Coastguard Worker unsigned int *pat; // Data array.
38*424fb153SAndroid Build Coastguard Worker unsigned int mask; // Size - 1. data[index & mask] is always valid.
39*424fb153SAndroid Build Coastguard Worker unsigned char weight[4]; // Weighted frequency of this pattern.
40*424fb153SAndroid Build Coastguard Worker // Each pattern has 32,64,128,256 width versions.
41*424fb153SAndroid Build Coastguard Worker // All weights are added up, a random number is
42*424fb153SAndroid Build Coastguard Worker // chosen between 0-sum(weights), and the
43*424fb153SAndroid Build Coastguard Worker // appropriate pattern is chosen. Thus a weight of
44*424fb153SAndroid Build Coastguard Worker // 1 is rare, a weight of 10 is 2x as likely to be
45*424fb153SAndroid Build Coastguard Worker // chosen as a weight of 5.
46*424fb153SAndroid Build Coastguard Worker };
47*424fb153SAndroid Build Coastguard Worker
48*424fb153SAndroid Build Coastguard Worker // Data structure to access data patterns.
49*424fb153SAndroid Build Coastguard Worker class Pattern {
50*424fb153SAndroid Build Coastguard Worker public:
51*424fb153SAndroid Build Coastguard Worker Pattern();
52*424fb153SAndroid Build Coastguard Worker ~Pattern();
53*424fb153SAndroid Build Coastguard Worker // Fill pattern data and calculate CRC.
54*424fb153SAndroid Build Coastguard Worker int Initialize(const struct PatternData &pattern_init,
55*424fb153SAndroid Build Coastguard Worker int buswidth,
56*424fb153SAndroid Build Coastguard Worker bool invert,
57*424fb153SAndroid Build Coastguard Worker int weight);
58*424fb153SAndroid Build Coastguard Worker
59*424fb153SAndroid Build Coastguard Worker // Access data members.
60*424fb153SAndroid Build Coastguard Worker // "busshift_" allows for repeating each pattern word 1, 2, 4, etc. times.
61*424fb153SAndroid Build Coastguard Worker // in order to create patterns of different width.
pattern(unsigned int offset)62*424fb153SAndroid Build Coastguard Worker unsigned int pattern(unsigned int offset) {
63*424fb153SAndroid Build Coastguard Worker unsigned int data = pattern_->pat[(offset >> busshift_) & pattern_->mask];
64*424fb153SAndroid Build Coastguard Worker if (inverse_)
65*424fb153SAndroid Build Coastguard Worker data = ~data;
66*424fb153SAndroid Build Coastguard Worker return data;
67*424fb153SAndroid Build Coastguard Worker }
crc()68*424fb153SAndroid Build Coastguard Worker const AdlerChecksum *crc() {return crc_;}
mask()69*424fb153SAndroid Build Coastguard Worker unsigned int mask() {return pattern_->mask;}
weight()70*424fb153SAndroid Build Coastguard Worker unsigned int weight() {return weight_;}
name()71*424fb153SAndroid Build Coastguard Worker const char *name() {return name_.c_str();}
72*424fb153SAndroid Build Coastguard Worker
73*424fb153SAndroid Build Coastguard Worker private:
74*424fb153SAndroid Build Coastguard Worker int CalculateCrc();
75*424fb153SAndroid Build Coastguard Worker const struct PatternData *pattern_;
76*424fb153SAndroid Build Coastguard Worker int busshift_; // Target data bus width.
77*424fb153SAndroid Build Coastguard Worker bool inverse_; // Invert the data from the original pattern.
78*424fb153SAndroid Build Coastguard Worker AdlerChecksum *crc_; // CRC of this pattern.
79*424fb153SAndroid Build Coastguard Worker string name_; // The human readable pattern name.
80*424fb153SAndroid Build Coastguard Worker int weight_; // This is the likelihood that this
81*424fb153SAndroid Build Coastguard Worker // pattern will be chosen.
82*424fb153SAndroid Build Coastguard Worker // We want to copy this!
83*424fb153SAndroid Build Coastguard Worker // DISALLOW_COPY_AND_ASSIGN(Pattern);
84*424fb153SAndroid Build Coastguard Worker };
85*424fb153SAndroid Build Coastguard Worker
86*424fb153SAndroid Build Coastguard Worker // Object used to access global pattern list.
87*424fb153SAndroid Build Coastguard Worker class PatternList {
88*424fb153SAndroid Build Coastguard Worker public:
89*424fb153SAndroid Build Coastguard Worker PatternList();
90*424fb153SAndroid Build Coastguard Worker ~PatternList();
91*424fb153SAndroid Build Coastguard Worker // Initialize pointers to global data patterns, and calculate CRC.
92*424fb153SAndroid Build Coastguard Worker int Initialize();
93*424fb153SAndroid Build Coastguard Worker int Destroy();
94*424fb153SAndroid Build Coastguard Worker
95*424fb153SAndroid Build Coastguard Worker // Return the pattern designated by index i.
96*424fb153SAndroid Build Coastguard Worker Pattern *GetPattern(int i);
97*424fb153SAndroid Build Coastguard Worker // Return a random pattern according to the specified weighted probability.
98*424fb153SAndroid Build Coastguard Worker Pattern *GetRandomPattern();
99*424fb153SAndroid Build Coastguard Worker // Return the number of patterns available.
Size()100*424fb153SAndroid Build Coastguard Worker int Size() {return size_;}
101*424fb153SAndroid Build Coastguard Worker
102*424fb153SAndroid Build Coastguard Worker private:
103*424fb153SAndroid Build Coastguard Worker vector<class Pattern> patterns_;
104*424fb153SAndroid Build Coastguard Worker int weightcount_; // Total count of pattern weights.
105*424fb153SAndroid Build Coastguard Worker unsigned int size_;
106*424fb153SAndroid Build Coastguard Worker int initialized_;
107*424fb153SAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(PatternList);
108*424fb153SAndroid Build Coastguard Worker };
109*424fb153SAndroid Build Coastguard Worker
110*424fb153SAndroid Build Coastguard Worker // CrcIncrement allows an abstracted way to add a 32bit
111*424fb153SAndroid Build Coastguard Worker // value into a running CRC. This function should be fast, and
112*424fb153SAndroid Build Coastguard Worker // generate meaningful CRCs for the types of data patterns that
113*424fb153SAndroid Build Coastguard Worker // we are using here.
114*424fb153SAndroid Build Coastguard Worker // This CRC formula may not be optimal, but it does work.
115*424fb153SAndroid Build Coastguard Worker // It may be improved in the future.
CrcIncrement(uint32 crc,uint32 expected,int index)116*424fb153SAndroid Build Coastguard Worker static inline uint32 CrcIncrement(uint32 crc, uint32 expected, int index) {
117*424fb153SAndroid Build Coastguard Worker uint32 addition = (expected ^ index);
118*424fb153SAndroid Build Coastguard Worker uint32 carry = (addition & crc) >> 31;
119*424fb153SAndroid Build Coastguard Worker
120*424fb153SAndroid Build Coastguard Worker return crc + addition + carry;
121*424fb153SAndroid Build Coastguard Worker }
122*424fb153SAndroid Build Coastguard Worker
123*424fb153SAndroid Build Coastguard Worker
124*424fb153SAndroid Build Coastguard Worker #endif // STRESSAPPTEST_PATTERN_H_
125