stattest.cc revision 2716:b9114064d77a
1/*
2 * Copyright (c) 2003-2005 The Regents of The University of Michigan
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;
9 * redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution;
12 * neither the name of the copyright holders nor the names of its
13 * contributors may be used to endorse or promote products derived from
14 * this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 * Authors: Nathan Binkert
29 */
30
31#include <iomanip>
32#include <iostream>
33#include <fstream>
34#include <string>
35#include <unistd.h>
36
37#include "base/cprintf.hh"
38#include "base/misc.hh"
39#include "base/statistics.hh"
40#include "base/stats/text.hh"
41#include "base/stats/mysql.hh"
42#include "sim/host.hh"
43
44using namespace std;
45using namespace Stats;
46
47Tick curTick = 0;
48Tick ticksPerSecond = ULL(2000000000);
49
50Scalar<> s1;
51Scalar<> s2;
52Average<> s3;
53Scalar<> s4;
54Vector<> s5;
55Distribution<> s6;
56Vector<> s7;
57AverageVector<> s8;
58StandardDeviation<> s9;
59AverageDeviation<> s10;
60Scalar<> s11;
61Distribution<> s12;
62VectorDistribution<> s13;
63VectorStandardDeviation<> s14;
64VectorAverageDeviation<> s15;
65Vector2d<> s16;
66
67Formula f1;
68Formula f2;
69Formula f3;
70Value f4;
71Value f5;
72Formula f6;
73Formula f7;
74
75ostream *outputStream = &cout;
76
77double
78testfunc()
79{
80    return 9.8;
81}
82
83class TestClass {
84  public:
85    double operator()() { return 9.7; }
86};
87
88char *progname = "";
89
90void
91usage()
92{
93    panic("incorrect usage.\n"
94          "usage:\n"
95          "\t%s [-t [-c] [-d]]\n", progname);
96}
97
98int
99main(int argc, char *argv[])
100{
101    bool descriptions = false;
102    bool compat = false;
103    bool text = false;
104    string mysql_name;
105    string mysql_host;
106    string mysql_user = "binkertn";
107    string mysql_passwd;
108
109    char c;
110    progname = argv[0];
111    while ((c = getopt(argc, argv, "cdh:P:p:s:tu:")) != -1) {
112        switch (c) {
113          case 'c':
114            compat = true;
115            break;
116          case 'd':
117            descriptions = true;
118            break;
119          case 'h':
120            mysql_host = optarg;
121            break;
122          case 'P':
123            mysql_passwd = optarg;
124            break;
125          case 's':
126            mysql_name = optarg;
127            break;
128          case 't':
129            text = true;
130            break;
131          case 'u':
132            mysql_user = optarg;
133            break;
134          default:
135            usage();
136        }
137    }
138
139    if (!text && (compat || descriptions))
140        usage();
141
142    s5.init(5);
143    s6.init(1, 100, 13);
144    s7.init(7);
145    s8.init(10);
146    s12.init(1, 100, 13);
147    s13.init(4, 0, 99, 10);
148    s14.init(9);
149    s15.init(10);
150    s16.init(2, 9);
151
152    s1
153        .name("Stat01")
154        .desc("this is statistic 1")
155        ;
156
157    s2
158        .name("Stat02")
159        .desc("this is statistic 2")
160        .prereq(s11)
161        ;
162
163    s3
164        .name("Stat03")
165        .desc("this is statistic 3")
166        .prereq(f7)
167        ;
168
169    s4
170        .name("Stat04")
171        .desc("this is statistic 4")
172        .prereq(s11)
173        ;
174
175    s5
176        .name("Stat05")
177        .desc("this is statistic 5")
178        .prereq(s11)
179        .subname(0, "foo1")
180        .subname(1, "foo2")
181        .subname(2, "foo3")
182        .subname(3, "foo4")
183        .subname(4, "foo5")
184        ;
185
186    s6
187        .name("Stat06")
188        .desc("this is statistic 6")
189        .prereq(s11)
190        ;
191
192    s7
193        .name("Stat07")
194        .desc("this is statistic 7")
195        .precision(1)
196        .flags(pdf | total)
197        .prereq(s11)
198        ;
199
200    s8
201        .name("Stat08")
202        .desc("this is statistic 8")
203        .precision(2)
204        .prereq(s11)
205        .subname(4, "blarg")
206        ;
207
208    s9
209        .name("Stat09")
210        .desc("this is statistic 9")
211        .precision(4)
212        .prereq(s11)
213        ;
214
215    s10
216        .name("Stat10")
217        .desc("this is statistic 10")
218        .prereq(s11)
219        ;
220
221    s12
222        .name("Stat12")
223        .desc("this is statistic 12")
224        ;
225
226    s13
227        .name("Stat13")
228        .desc("this is statistic 13")
229        ;
230
231    s14
232        .name("Stat14")
233        .desc("this is statistic 14")
234        ;
235
236    s15
237        .name("Stat15")
238        .desc("this is statistic 15")
239        ;
240
241    s16
242        .name("Stat16")
243        .desc("this is statistic 16")
244        .flags(total)
245        .subname(0, "sub0")
246        .subname(1, "sub1")
247        .ysubname(0, "y0")
248        .ysubname(1, "y1")
249        ;
250
251    f1
252        .name("Formula1")
253        .desc("this is formula 1")
254        .prereq(s11)
255        ;
256
257    f2
258        .name("Formula2")
259        .desc("this is formula 2")
260        .prereq(s11)
261        .precision(1)
262        ;
263
264    f3
265        .name("Formula3")
266        .desc("this is formula 3")
267        .prereq(s11)
268        .subname(0, "bar1")
269        .subname(1, "bar2")
270        .subname(2, "bar3")
271        .subname(3, "bar4")
272        .subname(4, "bar5")
273        ;
274
275    f4
276        .functor(testfunc)
277        .name("Formula4")
278        .desc("this is formula 4")
279        ;
280
281    TestClass testclass;
282    f5
283        .functor(testclass)
284        .name("Formula5")
285        .desc("this is formula 5")
286        ;
287
288    f6
289        .name("Formula6")
290        .desc("this is formula 6")
291        ;
292
293    f1 = s1 + s2;
294    f2 = (-s1) / (-s2) * (-s3 + ULL(100) + s4);
295    f3 = sum(s5) * s7;
296    f6 += constant(10.0);
297    f6 += s5[3];
298    f7 = constant(1);
299
300    check();
301    reset();
302
303    s16[1][0] = 1;
304    s16[0][1] = 3;
305    s16[0][0] = 2;
306    s16[1][1] = 9;
307    s16[1][1] += 9;
308    s16[1][8] += 8;
309    s16[1][7] += 7;
310    s16[1][6] += 6;
311    s16[1][5] += 5;
312    s16[1][4] += 4;
313
314    s11 = 1;
315    s3 = 9;
316    s8[3] = 9;
317    s15[0].sample(1234);
318    s15[1].sample(1234);
319    s15[2].sample(1234);
320    s15[3].sample(1234);
321    s15[4].sample(1234);
322    s15[5].sample(1234);
323    s15[6].sample(1234);
324    s15[7].sample(1234);
325    s15[8].sample(1234);
326    s15[9].sample(1234);
327
328    s10.sample(1000000000);
329    curTick += ULL(1000000);
330    s10.sample(100000);
331    s10.sample(100000);
332    s10.sample(100000);
333    s10.sample(100000);
334    s10.sample(100000);
335    s10.sample(100000);
336    s10.sample(100000);
337    s10.sample(100000);
338    s10.sample(100000);
339    s10.sample(100000);
340    s10.sample(100000);
341    s10.sample(100000);
342    s10.sample(100000);
343    s13[0].sample(12);
344    s13[1].sample(29);
345    s13[2].sample(12);
346    s13[3].sample(29);
347    s13[0].sample(42);
348    s13[1].sample(29);
349    s13[2].sample(42);
350    s13[3].sample(32);
351    s13[0].sample(52);
352    s13[1].sample(49);
353    s13[2].sample(42);
354    s13[3].sample(25);
355    s13[0].sample(32);
356    s13[1].sample(49);
357    s13[2].sample(22);
358    s13[3].sample(49);
359    s13[0].sample(62);
360    s13[1].sample(99);
361    s13[2].sample(72);
362    s13[3].sample(23);
363    s13[0].sample(52);
364    s13[1].sample(78);
365    s13[2].sample(69);
366    s13[3].sample(49);
367
368    s14[0].sample(1234);
369    s14[1].sample(4134);
370    s14[4].sample(1213);
371    s14[3].sample(1124);
372    s14[2].sample(1243);
373    s14[7].sample(1244);
374    s14[4].sample(7234);
375    s14[2].sample(9234);
376    s14[3].sample(1764);
377    s14[7].sample(1564);
378    s14[3].sample(3234);
379    s14[1].sample(2234);
380    s14[5].sample(1234);
381    s14[2].sample(4334);
382    s14[2].sample(1234);
383    s14[4].sample(4334);
384    s14[6].sample(1234);
385    s14[8].sample(8734);
386    s14[1].sample(5234);
387    s14[3].sample(8234);
388    s14[7].sample(5234);
389    s14[4].sample(4434);
390    s14[3].sample(7234);
391    s14[2].sample(1934);
392    s14[1].sample(9234);
393    s14[5].sample(5634);
394    s14[3].sample(1264);
395    s14[7].sample(5223);
396    s14[0].sample(1234);
397    s14[0].sample(5434);
398    s14[3].sample(8634);
399    s14[1].sample(1234);
400
401
402    s15[0].sample(1234);
403    s15[1].sample(4134);
404    curTick += ULL(1000000);
405    s15[4].sample(1213);
406    curTick += ULL(1000000);
407    s15[3].sample(1124);
408    curTick += ULL(1000000);
409    s15[2].sample(1243);
410    curTick += ULL(1000000);
411    s15[7].sample(1244);
412    curTick += ULL(1000000);
413    s15[4].sample(7234);
414    s15[2].sample(9234);
415    s15[3].sample(1764);
416    s15[7].sample(1564);
417    s15[3].sample(3234);
418    s15[1].sample(2234);
419    curTick += ULL(1000000);
420    s15[5].sample(1234);
421    curTick += ULL(1000000);
422    s15[9].sample(4334);
423    curTick += ULL(1000000);
424    s15[2].sample(1234);
425    curTick += ULL(1000000);
426    s15[4].sample(4334);
427    s15[6].sample(1234);
428    curTick += ULL(1000000);
429    s15[8].sample(8734);
430    curTick += ULL(1000000);
431    s15[1].sample(5234);
432    curTick += ULL(1000000);
433    s15[3].sample(8234);
434    curTick += ULL(1000000);
435    s15[7].sample(5234);
436    s15[4].sample(4434);
437    s15[3].sample(7234);
438    s15[2].sample(1934);
439    s15[1].sample(9234);
440    curTick += ULL(1000000);
441    s15[5].sample(5634);
442    s15[3].sample(1264);
443    s15[7].sample(5223);
444    s15[0].sample(1234);
445    s15[0].sample(5434);
446    s15[3].sample(8634);
447    curTick += ULL(1000000);
448    s15[1].sample(1234);
449
450    s4 = curTick;
451
452    s8[3] = 99999;
453
454    s3 = 12;
455    s3++;
456    curTick += 9;
457
458    s1 = 9;
459    s1 += 9;
460    s1 -= 11;
461    s1++;
462    ++s1;
463    s1--;
464    --s1;
465
466    s2 = 9;
467
468    s5[0] += 1;
469    s5[1] += 2;
470    s5[2] += 3;
471    s5[3] += 4;
472    s5[4] += 5;
473
474    s7[0] = 10;
475    s7[1] = 20;
476    s7[2] = 30;
477    s7[3] = 40;
478    s7[4] = 50;
479    s7[5] = 60;
480    s7[6] = 70;
481
482    s6.sample(0);
483    s6.sample(1);
484    s6.sample(2);
485    s6.sample(3);
486    s6.sample(4);
487    s6.sample(5);
488    s6.sample(6);
489    s6.sample(7);
490    s6.sample(8);
491    s6.sample(9);
492
493    s6.sample(10);
494    s6.sample(10);
495    s6.sample(10);
496    s6.sample(10);
497    s6.sample(10);
498    s6.sample(10);
499    s6.sample(10);
500    s6.sample(10);
501    s6.sample(11);
502    s6.sample(19);
503    s6.sample(20);
504    s6.sample(20);
505    s6.sample(21);
506    s6.sample(21);
507    s6.sample(31);
508    s6.sample(98);
509    s6.sample(99);
510    s6.sample(99);
511    s6.sample(99);
512
513    s7[0] = 700;
514    s7[1] = 600;
515    s7[2] = 500;
516    s7[3] = 400;
517    s7[4] = 300;
518    s7[5] = 200;
519    s7[6] = 100;
520
521    s9.sample(100);
522    s9.sample(100);
523    s9.sample(100);
524    s9.sample(100);
525    s9.sample(10);
526    s9.sample(10);
527    s9.sample(10);
528    s9.sample(10);
529    s9.sample(10);
530
531    curTick += 9;
532    s4 = curTick;
533    s6.sample(100);
534    s6.sample(100);
535    s6.sample(100);
536    s6.sample(101);
537    s6.sample(102);
538
539    s12.sample(100);
540
541    if (text) {
542        Text out(cout);
543        out.descriptions = descriptions;
544        out.compat = compat;
545        out();
546    }
547
548    if (!mysql_name.empty()) {
549        MySql out;
550        out.connect(mysql_host, mysql_user, mysql_passwd, "m5stats",
551                    mysql_name, "test");
552        out();
553    }
554
555    return 0;
556}
557