tests: Migrated refcnt.cc test from src/unitttest to a gtest
[gem5.git] / src / unittest / stattest.cc
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 "pybind11/pybind11.h"
32
33 #include <iomanip>
34 #include <iostream>
35 #include <string>
36
37 #include "base/cprintf.hh"
38 #include "base/logging.hh"
39 #include "base/statistics.hh"
40 #include "base/types.hh"
41 #include "sim/core.hh"
42 #include "sim/init.hh"
43 #include "sim/stat_control.hh"
44
45 namespace py = pybind11;
46
47 // override the default main() code for this unittest
48 const char *m5MainCommands[] = {
49 "import m5.stattestmain",
50 "m5.stattestmain.main()",
51 0 // sentinel is required
52 };
53
54 using namespace std;
55 using namespace Stats;
56
57 double testfunc();
58 struct StatTest;
59 StatTest & __stattest();
60
61
62 double
63 testfunc()
64 {
65 return 9.8;
66 }
67
68 class TestClass {
69 public:
70 double operator()() { return 9.7; }
71 };
72
73 struct StatTest
74 {
75 Scalar s1;
76 Scalar s2;
77 Average s3;
78 Scalar s4;
79 Vector s5;
80 Distribution s6;
81 Vector s7;
82 AverageVector s8;
83 StandardDeviation s9;
84 AverageDeviation s10;
85 Scalar s11;
86 Distribution s12;
87 VectorDistribution s13;
88 VectorStandardDeviation s14;
89 VectorAverageDeviation s15;
90 Vector2d s16;
91 Value s17;
92 Value s18;
93 Histogram h01;
94 Histogram h02;
95 Histogram h03;
96 Histogram h04;
97 Histogram h05;
98 Histogram h06;
99 Histogram h07;
100 Histogram h08;
101 Histogram h09;
102 Histogram h10;
103 Histogram h11;
104 Histogram h12;
105 SparseHistogram sh1;
106
107 Vector s19;
108 Vector s20;
109
110 Formula f1;
111 Formula f2;
112 Formula f3;
113 Formula f4;
114 Formula f5;
115 Formula f6;
116
117 void run();
118 void init();
119 };
120
121 StatTest &
122 __stattest()
123 {
124 static StatTest st;
125 return st;
126 }
127
128 void
129 StatTest::init()
130 {
131 EventQueue *q = getEventQueue(0);
132 curEventQueue(q);
133
134 cprintf("sizeof(Scalar) = %d\n", sizeof(Scalar));
135 cprintf("sizeof(Vector) = %d\n", sizeof(Vector));
136 cprintf("sizeof(Distribution) = %d\n", sizeof(Distribution));
137
138 s1
139 .name("Stat01")
140 .desc("this is statistic 1")
141 ;
142
143 s2
144 .name("Stat02")
145 .desc("this is statistic 2")
146 .prereq(s11)
147 ;
148
149 s3
150 .name("Stat03")
151 .desc("this is statistic 3")
152 .prereq(f5)
153 ;
154
155 s4
156 .name("Stat04")
157 .desc("this is statistic 4")
158 .prereq(s11)
159 ;
160
161 s5
162 .init(5)
163 .name("Stat05")
164 .desc("this is statistic 5")
165 .prereq(s11)
166 .subname(0, "foo1")
167 .subname(1, "foo2")
168 .subname(2, "foo3")
169 .subname(3, "foo4")
170 .subname(4, "foo5")
171 ;
172
173 s6
174 .init(1, 100, 13)
175 .name("Stat06")
176 .desc("this is statistic 6")
177 .prereq(s11)
178 ;
179
180 s7
181 .init(7)
182 .name("Stat07")
183 .desc("this is statistic 7")
184 .precision(1)
185 .flags(pdf | total)
186 .prereq(s11)
187 ;
188
189 s8
190 .init(10)
191 .name("Stat08")
192 .desc("this is statistic 8")
193 .precision(2)
194 .prereq(s11)
195 .subname(4, "blarg")
196 ;
197
198 s9
199 .name("Stat09")
200 .desc("this is statistic 9")
201 .precision(4)
202 .prereq(s11)
203 ;
204
205 s10
206 .name("Stat10")
207 .desc("this is statistic 10")
208 .prereq(s11)
209 ;
210
211 s12
212 .init(1, 100, 13)
213 .name("Stat12")
214 .desc("this is statistic 12")
215 ;
216
217 s13
218 .init(4, 0, 99, 10)
219 .name("Stat13")
220 .desc("this is statistic 13")
221 ;
222
223 s14
224 .init(9)
225 .name("Stat14")
226 .desc("this is statistic 14")
227 ;
228
229 s15
230 .init(10)
231 .name("Stat15")
232 .desc("this is statistic 15")
233 ;
234
235 s16
236 .init(2, 9)
237 .name("Stat16")
238 .desc("this is statistic 16")
239 .flags(total)
240 .subname(0, "sub0")
241 .subname(1, "sub1")
242 .ysubname(0, "y0")
243 .ysubname(1, "y1")
244 ;
245
246 s17
247 .functor(testfunc)
248 .name("Stat17")
249 .desc("this is stat 17")
250 ;
251
252 TestClass testclass;
253 s18
254 .functor(testclass)
255 .name("Stat18")
256 .desc("this is stat 18")
257 ;
258
259 h01
260 .init(11)
261 .name("Histogram01")
262 .desc("this is histogram 1")
263 ;
264
265 h02
266 .init(10)
267 .name("Histogram02")
268 .desc("this is histogram 2")
269 ;
270
271 h03
272 .init(11)
273 .name("Histogram03")
274 .desc("this is histogram 3")
275 ;
276
277 h04
278 .init(10)
279 .name("Histogram04")
280 .desc("this is histogram 4")
281 ;
282
283 h05
284 .init(11)
285 .name("Histogram05")
286 .desc("this is histogram 5")
287 ;
288
289 h06
290 .init(10)
291 .name("Histogram06")
292 .desc("this is histogram 6")
293 ;
294
295 h07
296 .init(11)
297 .name("Histogram07")
298 .desc("this is histogram 7")
299 ;
300
301 h08
302 .init(10)
303 .name("Histogram08")
304 .desc("this is histogram 8")
305 ;
306
307 h09
308 .init(11)
309 .name("Histogram09")
310 .desc("this is histogram 9")
311 ;
312
313 h10
314 .init(10)
315 .name("Histogram10")
316 .desc("this is histogram 10")
317 ;
318
319 h11
320 .init(11)
321 .name("Histogram11")
322 .desc("this is histogram 11")
323 ;
324
325 h12
326 .init(10)
327 .name("Histogram12")
328 .desc("this is histogram 12")
329 ;
330
331 sh1
332 .init(0)
333 .name("SparseHistogram1")
334 .desc("this is sparse histogram 1")
335 ;
336
337 f1
338 .name("Formula1")
339 .desc("this is formula 1")
340 .prereq(s11)
341 ;
342
343 f2
344 .name("Formula2")
345 .desc("this is formula 2")
346 .prereq(s11)
347 .precision(1)
348 ;
349
350 f3
351 .name("Formula3")
352 .desc("this is formula 3")
353 .prereq(s11)
354 .subname(0, "bar1")
355 .subname(1, "bar2")
356 .subname(2, "bar3")
357 .subname(3, "bar4")
358 .subname(4, "bar5")
359 ;
360
361 f4
362 .name("Formula4")
363 .desc("this is formula 4")
364 ;
365
366 s19
367 .init(2)
368 .name("Stat19")
369 .desc("this is statistic 19 for vector op testing")
370 .flags(total | nozero | nonan)
371 ;
372 s20
373 .init(2)
374 .name("Stat20")
375 .desc("this is statistic 20 for vector op testing")
376 .flags(total | nozero | nonan)
377 ;
378
379 f6
380 .name("vector_op_test_formula")
381 .desc("The total stat should equal 1")
382 .flags(total |nozero |nonan)
383 ;
384
385 f1 = s1 + s2;
386 f2 = (-s1) / (-s2) * (-s3 + ULL(100) + s4);
387 f3 = sum(s5) * s7;
388 f4 += constant(10.0);
389 f4 += s5[3];
390 f5 = constant(1);
391 f6 = s19/s20;
392 }
393
394 void
395 StatTest::run()
396 {
397 s16[1][0] = 1;
398 s16[0][1] = 3;
399 s16[0][0] = 2;
400 s16[1][1] = 9;
401 s16[1][1] += 9;
402 s16[1][8] += 8;
403 s16[1][7] += 7;
404 s16[1][6] += 6;
405 s16[1][5] += 5;
406 s16[1][4] += 4;
407
408 s11 = 1;
409 s3 = 9;
410 s8[3] = 9;
411 s15[0].sample(1234);
412 s15[1].sample(1234);
413 s15[2].sample(1234);
414 s15[3].sample(1234);
415 s15[4].sample(1234);
416 s15[5].sample(1234);
417 s15[6].sample(1234);
418 s15[7].sample(1234);
419 s15[8].sample(1234);
420 s15[9].sample(1234);
421
422 s10.sample(1000000000);
423 curEventQueue()->setCurTick(curTick() + ULL(1000000));
424 s10.sample(100000);
425 s10.sample(100000);
426 s10.sample(100000);
427 s10.sample(100000);
428 s10.sample(100000);
429 s10.sample(100000);
430 s10.sample(100000);
431 s10.sample(100000);
432 s10.sample(100000);
433 s10.sample(100000);
434 s10.sample(100000);
435 s10.sample(100000);
436 s10.sample(100000);
437 s13[0].sample(12);
438 s13[1].sample(29);
439 s13[2].sample(12);
440 s13[3].sample(29);
441 s13[0].sample(42);
442 s13[1].sample(29);
443 s13[2].sample(42);
444 s13[3].sample(32);
445 s13[0].sample(52);
446 s13[1].sample(49);
447 s13[2].sample(42);
448 s13[3].sample(25);
449 s13[0].sample(32);
450 s13[1].sample(49);
451 s13[2].sample(22);
452 s13[3].sample(49);
453 s13[0].sample(62);
454 s13[1].sample(99);
455 s13[2].sample(72);
456 s13[3].sample(23);
457 s13[0].sample(52);
458 s13[1].sample(78);
459 s13[2].sample(69);
460 s13[3].sample(49);
461
462 s14[0].sample(1234);
463 s14[1].sample(4134);
464 s14[4].sample(1213);
465 s14[3].sample(1124);
466 s14[2].sample(1243);
467 s14[7].sample(1244);
468 s14[4].sample(7234);
469 s14[2].sample(9234);
470 s14[3].sample(1764);
471 s14[7].sample(1564);
472 s14[3].sample(3234);
473 s14[1].sample(2234);
474 s14[5].sample(1234);
475 s14[2].sample(4334);
476 s14[2].sample(1234);
477 s14[4].sample(4334);
478 s14[6].sample(1234);
479 s14[8].sample(8734);
480 s14[1].sample(5234);
481 s14[3].sample(8234);
482 s14[7].sample(5234);
483 s14[4].sample(4434);
484 s14[3].sample(7234);
485 s14[2].sample(1934);
486 s14[1].sample(9234);
487 s14[5].sample(5634);
488 s14[3].sample(1264);
489 s14[7].sample(5223);
490 s14[0].sample(1234);
491 s14[0].sample(5434);
492 s14[3].sample(8634);
493 s14[1].sample(1234);
494
495
496 s15[0].sample(1234);
497 s15[1].sample(4134);
498 curEventQueue()->setCurTick(curTick() + ULL(1000000));
499 s15[4].sample(1213);
500 curEventQueue()->setCurTick(curTick() + ULL(1000000));
501 s15[3].sample(1124);
502 curEventQueue()->setCurTick(curTick() + ULL(1000000));
503 s15[2].sample(1243);
504 curEventQueue()->setCurTick(curTick() + ULL(1000000));
505 s15[7].sample(1244);
506 curEventQueue()->setCurTick(curTick() + ULL(1000000));
507 s15[4].sample(7234);
508 s15[2].sample(9234);
509 s15[3].sample(1764);
510 s15[7].sample(1564);
511 s15[3].sample(3234);
512 s15[1].sample(2234);
513 curEventQueue()->setCurTick(curTick() + ULL(1000000));
514 s15[5].sample(1234);
515 curEventQueue()->setCurTick(curTick() + ULL(1000000));
516 s15[9].sample(4334);
517 curEventQueue()->setCurTick(curTick() + ULL(1000000));
518 s15[2].sample(1234);
519 curEventQueue()->setCurTick(curTick() + ULL(1000000));
520 s15[4].sample(4334);
521 s15[6].sample(1234);
522 curEventQueue()->setCurTick(curTick() + ULL(1000000));
523 s15[8].sample(8734);
524 curEventQueue()->setCurTick(curTick() + ULL(1000000));
525 s15[1].sample(5234);
526 curEventQueue()->setCurTick(curTick() + ULL(1000000));
527 s15[3].sample(8234);
528 curEventQueue()->setCurTick(curTick() + ULL(1000000));
529 s15[7].sample(5234);
530 s15[4].sample(4434);
531 s15[3].sample(7234);
532 s15[2].sample(1934);
533 s15[1].sample(9234);
534 curEventQueue()->setCurTick(curTick() + ULL(1000000));
535 s15[5].sample(5634);
536 s15[3].sample(1264);
537 s15[7].sample(5223);
538 s15[0].sample(1234);
539 s15[0].sample(5434);
540 s15[3].sample(8634);
541 curEventQueue()->setCurTick(curTick() + ULL(1000000));
542 s15[1].sample(1234);
543
544 s4 = curTick();
545
546 s8[3] = 99999;
547
548 s3 = 12;
549 s3++;
550 curEventQueue()->setCurTick(curTick() + 9);
551
552 s1 = 9;
553 s1 += 9;
554 s1 -= 11;
555 s1++;
556 ++s1;
557 s1--;
558 --s1;
559
560 s2 = 9;
561
562 s5[0] += 1;
563 s5[1] += 2;
564 s5[2] += 3;
565 s5[3] += 4;
566 s5[4] += 5;
567
568 s7[0] = 10;
569 s7[1] = 20;
570 s7[2] = 30;
571 s7[3] = 40;
572 s7[4] = 50;
573 s7[5] = 60;
574 s7[6] = 70;
575
576 s6.sample(0);
577 s6.sample(1);
578 s6.sample(2);
579 s6.sample(3);
580 s6.sample(4);
581 s6.sample(5);
582 s6.sample(6);
583 s6.sample(7);
584 s6.sample(8);
585 s6.sample(9);
586
587 s6.sample(10);
588 s6.sample(10);
589 s6.sample(10);
590 s6.sample(10);
591 s6.sample(10);
592 s6.sample(10);
593 s6.sample(10);
594 s6.sample(10);
595 s6.sample(11);
596 s6.sample(19);
597 s6.sample(20);
598 s6.sample(20);
599 s6.sample(21);
600 s6.sample(21);
601 s6.sample(31);
602 s6.sample(98);
603 s6.sample(99);
604 s6.sample(99);
605 s6.sample(99);
606
607 s7[0] = 700;
608 s7[1] = 600;
609 s7[2] = 500;
610 s7[3] = 400;
611 s7[4] = 300;
612 s7[5] = 200;
613 s7[6] = 100;
614
615 s9.sample(100);
616 s9.sample(100);
617 s9.sample(100);
618 s9.sample(100);
619 s9.sample(10);
620 s9.sample(10);
621 s9.sample(10);
622 s9.sample(10);
623 s9.sample(10);
624
625 curEventQueue()->setCurTick(curTick() + 9);
626 s4 = curTick();
627 s6.sample(100);
628 s6.sample(100);
629 s6.sample(100);
630 s6.sample(101);
631 s6.sample(102);
632
633 s12.sample(100);
634 for (int i = 0; i < 100; i++) {
635 h01.sample(i);
636 h02.sample(i);
637 }
638
639 for (int i = -100; i < 100; i++) {
640 h03.sample(i);
641 h04.sample(i);
642 }
643
644 for (int i = -100; i < 1000; i++) {
645 h05.sample(i);
646 h06.sample(i);
647 }
648
649 for (int i = 100; i >= -1000; i--) {
650 h07.sample(i);
651 h08.sample(i);
652 }
653
654 for (int i = 0; i <= 1023; i++) {
655 h09.sample(i);
656 h10.sample(i);
657 }
658
659 for (int i = -1024; i <= 1023; i++) {
660 h11.sample(i);
661 h12.sample(i);
662 }
663
664 for (int i = 0; i < 1000; i++) {
665 sh1.sample(random() % 10000);
666 }
667
668 s19[0] = 1;
669 s19[1] = 100000;
670 s20[0] = 100000;
671 s20[1] = 1;
672
673 }
674
675 static void
676 stattest_init_pybind(py::module &m_internal)
677 {
678 py::module m = m_internal.def_submodule("stattest");
679
680 m
681 .def("stattest_init", []() { __stattest().init(); })
682 .def("stattest_run", []() { __stattest().run(); })
683 ;
684 }
685
686 static EmbeddedPyBind embed_("stattest", stattest_init_pybind);