/* * Copyright (c) 2003-2005 The Regents of The University of Michigan * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer; * redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution; * neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Authors: Nathan Binkert */ #include "pybind11/pybind11.h" #include #include #include #include "base/cprintf.hh" #include "base/logging.hh" #include "base/statistics.hh" #include "base/types.hh" #include "sim/core.hh" #include "sim/init.hh" #include "sim/stat_control.hh" namespace py = pybind11; // override the default main() code for this unittest const char *m5MainCommands[] = { "import m5.stattestmain", "m5.stattestmain.main()", 0 // sentinel is required }; using namespace std; using namespace Stats; double testfunc(); struct StatTest; StatTest & __stattest(); double testfunc() { return 9.8; } class TestClass { public: double operator()() { return 9.7; } }; struct StatTest { Scalar s1; Scalar s2; Average s3; Scalar s4; Vector s5; Distribution s6; Vector s7; AverageVector s8; StandardDeviation s9; AverageDeviation s10; Scalar s11; Distribution s12; VectorDistribution s13; VectorStandardDeviation s14; VectorAverageDeviation s15; Vector2d s16; Value s17; Value s18; Histogram h01; Histogram h02; Histogram h03; Histogram h04; Histogram h05; Histogram h06; Histogram h07; Histogram h08; Histogram h09; Histogram h10; Histogram h11; Histogram h12; SparseHistogram sh1; Vector s19; Vector s20; Formula f1; Formula f2; Formula f3; Formula f4; Formula f5; Formula f6; void run(); void init(); }; StatTest & __stattest() { static StatTest st; return st; } void StatTest::init() { EventQueue *q = getEventQueue(0); curEventQueue(q); cprintf("sizeof(Scalar) = %d\n", sizeof(Scalar)); cprintf("sizeof(Vector) = %d\n", sizeof(Vector)); cprintf("sizeof(Distribution) = %d\n", sizeof(Distribution)); s1 .name("Stat01") .desc("this is statistic 1") ; s2 .name("Stat02") .desc("this is statistic 2") .prereq(s11) ; s3 .name("Stat03") .desc("this is statistic 3") .prereq(f5) ; s4 .name("Stat04") .desc("this is statistic 4") .prereq(s11) ; s5 .init(5) .name("Stat05") .desc("this is statistic 5") .prereq(s11) .subname(0, "foo1") .subname(1, "foo2") .subname(2, "foo3") .subname(3, "foo4") .subname(4, "foo5") ; s6 .init(1, 100, 13) .name("Stat06") .desc("this is statistic 6") .prereq(s11) ; s7 .init(7) .name("Stat07") .desc("this is statistic 7") .precision(1) .flags(pdf | total) .prereq(s11) ; s8 .init(10) .name("Stat08") .desc("this is statistic 8") .precision(2) .prereq(s11) .subname(4, "blarg") ; s9 .name("Stat09") .desc("this is statistic 9") .precision(4) .prereq(s11) ; s10 .name("Stat10") .desc("this is statistic 10") .prereq(s11) ; s12 .init(1, 100, 13) .name("Stat12") .desc("this is statistic 12") ; s13 .init(4, 0, 99, 10) .name("Stat13") .desc("this is statistic 13") ; s14 .init(9) .name("Stat14") .desc("this is statistic 14") ; s15 .init(10) .name("Stat15") .desc("this is statistic 15") ; s16 .init(2, 9) .name("Stat16") .desc("this is statistic 16") .flags(total) .subname(0, "sub0") .subname(1, "sub1") .ysubname(0, "y0") .ysubname(1, "y1") ; s17 .functor(testfunc) .name("Stat17") .desc("this is stat 17") ; TestClass testclass; s18 .functor(testclass) .name("Stat18") .desc("this is stat 18") ; h01 .init(11) .name("Histogram01") .desc("this is histogram 1") ; h02 .init(10) .name("Histogram02") .desc("this is histogram 2") ; h03 .init(11) .name("Histogram03") .desc("this is histogram 3") ; h04 .init(10) .name("Histogram04") .desc("this is histogram 4") ; h05 .init(11) .name("Histogram05") .desc("this is histogram 5") ; h06 .init(10) .name("Histogram06") .desc("this is histogram 6") ; h07 .init(11) .name("Histogram07") .desc("this is histogram 7") ; h08 .init(10) .name("Histogram08") .desc("this is histogram 8") ; h09 .init(11) .name("Histogram09") .desc("this is histogram 9") ; h10 .init(10) .name("Histogram10") .desc("this is histogram 10") ; h11 .init(11) .name("Histogram11") .desc("this is histogram 11") ; h12 .init(10) .name("Histogram12") .desc("this is histogram 12") ; sh1 .init(0) .name("SparseHistogram1") .desc("this is sparse histogram 1") ; f1 .name("Formula1") .desc("this is formula 1") .prereq(s11) ; f2 .name("Formula2") .desc("this is formula 2") .prereq(s11) .precision(1) ; f3 .name("Formula3") .desc("this is formula 3") .prereq(s11) .subname(0, "bar1") .subname(1, "bar2") .subname(2, "bar3") .subname(3, "bar4") .subname(4, "bar5") ; f4 .name("Formula4") .desc("this is formula 4") ; s19 .init(2) .name("Stat19") .desc("this is statistic 19 for vector op testing") .flags(total | nozero | nonan) ; s20 .init(2) .name("Stat20") .desc("this is statistic 20 for vector op testing") .flags(total | nozero | nonan) ; f6 .name("vector_op_test_formula") .desc("The total stat should equal 1") .flags(total |nozero |nonan) ; f1 = s1 + s2; f2 = (-s1) / (-s2) * (-s3 + ULL(100) + s4); f3 = sum(s5) * s7; f4 += constant(10.0); f4 += s5[3]; f5 = constant(1); f6 = s19/s20; } void StatTest::run() { s16[1][0] = 1; s16[0][1] = 3; s16[0][0] = 2; s16[1][1] = 9; s16[1][1] += 9; s16[1][8] += 8; s16[1][7] += 7; s16[1][6] += 6; s16[1][5] += 5; s16[1][4] += 4; s11 = 1; s3 = 9; s8[3] = 9; s15[0].sample(1234); s15[1].sample(1234); s15[2].sample(1234); s15[3].sample(1234); s15[4].sample(1234); s15[5].sample(1234); s15[6].sample(1234); s15[7].sample(1234); s15[8].sample(1234); s15[9].sample(1234); s10.sample(1000000000); curEventQueue()->setCurTick(curTick() + ULL(1000000)); s10.sample(100000); s10.sample(100000); s10.sample(100000); s10.sample(100000); s10.sample(100000); s10.sample(100000); s10.sample(100000); s10.sample(100000); s10.sample(100000); s10.sample(100000); s10.sample(100000); s10.sample(100000); s10.sample(100000); s13[0].sample(12); s13[1].sample(29); s13[2].sample(12); s13[3].sample(29); s13[0].sample(42); s13[1].sample(29); s13[2].sample(42); s13[3].sample(32); s13[0].sample(52); s13[1].sample(49); s13[2].sample(42); s13[3].sample(25); s13[0].sample(32); s13[1].sample(49); s13[2].sample(22); s13[3].sample(49); s13[0].sample(62); s13[1].sample(99); s13[2].sample(72); s13[3].sample(23); s13[0].sample(52); s13[1].sample(78); s13[2].sample(69); s13[3].sample(49); s14[0].sample(1234); s14[1].sample(4134); s14[4].sample(1213); s14[3].sample(1124); s14[2].sample(1243); s14[7].sample(1244); s14[4].sample(7234); s14[2].sample(9234); s14[3].sample(1764); s14[7].sample(1564); s14[3].sample(3234); s14[1].sample(2234); s14[5].sample(1234); s14[2].sample(4334); s14[2].sample(1234); s14[4].sample(4334); s14[6].sample(1234); s14[8].sample(8734); s14[1].sample(5234); s14[3].sample(8234); s14[7].sample(5234); s14[4].sample(4434); s14[3].sample(7234); s14[2].sample(1934); s14[1].sample(9234); s14[5].sample(5634); s14[3].sample(1264); s14[7].sample(5223); s14[0].sample(1234); s14[0].sample(5434); s14[3].sample(8634); s14[1].sample(1234); s15[0].sample(1234); s15[1].sample(4134); curEventQueue()->setCurTick(curTick() + ULL(1000000)); s15[4].sample(1213); curEventQueue()->setCurTick(curTick() + ULL(1000000)); s15[3].sample(1124); curEventQueue()->setCurTick(curTick() + ULL(1000000)); s15[2].sample(1243); curEventQueue()->setCurTick(curTick() + ULL(1000000)); s15[7].sample(1244); curEventQueue()->setCurTick(curTick() + ULL(1000000)); s15[4].sample(7234); s15[2].sample(9234); s15[3].sample(1764); s15[7].sample(1564); s15[3].sample(3234); s15[1].sample(2234); curEventQueue()->setCurTick(curTick() + ULL(1000000)); s15[5].sample(1234); curEventQueue()->setCurTick(curTick() + ULL(1000000)); s15[9].sample(4334); curEventQueue()->setCurTick(curTick() + ULL(1000000)); s15[2].sample(1234); curEventQueue()->setCurTick(curTick() + ULL(1000000)); s15[4].sample(4334); s15[6].sample(1234); curEventQueue()->setCurTick(curTick() + ULL(1000000)); s15[8].sample(8734); curEventQueue()->setCurTick(curTick() + ULL(1000000)); s15[1].sample(5234); curEventQueue()->setCurTick(curTick() + ULL(1000000)); s15[3].sample(8234); curEventQueue()->setCurTick(curTick() + ULL(1000000)); s15[7].sample(5234); s15[4].sample(4434); s15[3].sample(7234); s15[2].sample(1934); s15[1].sample(9234); curEventQueue()->setCurTick(curTick() + ULL(1000000)); s15[5].sample(5634); s15[3].sample(1264); s15[7].sample(5223); s15[0].sample(1234); s15[0].sample(5434); s15[3].sample(8634); curEventQueue()->setCurTick(curTick() + ULL(1000000)); s15[1].sample(1234); s4 = curTick(); s8[3] = 99999; s3 = 12; s3++; curEventQueue()->setCurTick(curTick() + 9); s1 = 9; s1 += 9; s1 -= 11; s1++; ++s1; s1--; --s1; s2 = 9; s5[0] += 1; s5[1] += 2; s5[2] += 3; s5[3] += 4; s5[4] += 5; s7[0] = 10; s7[1] = 20; s7[2] = 30; s7[3] = 40; s7[4] = 50; s7[5] = 60; s7[6] = 70; s6.sample(0); s6.sample(1); s6.sample(2); s6.sample(3); s6.sample(4); s6.sample(5); s6.sample(6); s6.sample(7); s6.sample(8); s6.sample(9); s6.sample(10); s6.sample(10); s6.sample(10); s6.sample(10); s6.sample(10); s6.sample(10); s6.sample(10); s6.sample(10); s6.sample(11); s6.sample(19); s6.sample(20); s6.sample(20); s6.sample(21); s6.sample(21); s6.sample(31); s6.sample(98); s6.sample(99); s6.sample(99); s6.sample(99); s7[0] = 700; s7[1] = 600; s7[2] = 500; s7[3] = 400; s7[4] = 300; s7[5] = 200; s7[6] = 100; s9.sample(100); s9.sample(100); s9.sample(100); s9.sample(100); s9.sample(10); s9.sample(10); s9.sample(10); s9.sample(10); s9.sample(10); curEventQueue()->setCurTick(curTick() + 9); s4 = curTick(); s6.sample(100); s6.sample(100); s6.sample(100); s6.sample(101); s6.sample(102); s12.sample(100); for (int i = 0; i < 100; i++) { h01.sample(i); h02.sample(i); } for (int i = -100; i < 100; i++) { h03.sample(i); h04.sample(i); } for (int i = -100; i < 1000; i++) { h05.sample(i); h06.sample(i); } for (int i = 100; i >= -1000; i--) { h07.sample(i); h08.sample(i); } for (int i = 0; i <= 1023; i++) { h09.sample(i); h10.sample(i); } for (int i = -1024; i <= 1023; i++) { h11.sample(i); h12.sample(i); } for (int i = 0; i < 1000; i++) { sh1.sample(random() % 10000); } s19[0] = 1; s19[1] = 100000; s20[0] = 100000; s20[1] = 1; } static void stattest_init_pybind(py::module &m_internal) { py::module m = m_internal.def_submodule("stattest"); m .def("stattest_init", []() { __stattest().init(); }) .def("stattest_run", []() { __stattest().run(); }) ; } static EmbeddedPyBind embed_("stattest", stattest_init_pybind);