From 16fa8d7cc8c92f5ab879e4cf9c6c0bbb3567860f Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Thu, 24 May 2018 01:37:55 -0700 Subject: systemc: Import tests from the Accellera systemc distribution. Change-Id: Iad76b398949a55d768a34d027a2d8e3739953da6 Reviewed-on: https://gem5-review.googlesource.com/10845 Reviewed-by: Giacomo Travaglini Maintainer: Gabe Black --- .../datatypes/int/arith/arith05/arith05.cpp | 182 +++++ .../datatypes/int/arith/arith05/golden/arith05.log | 842 +++++++++++++++++++++ .../systemc/datatypes/int/arith/arith05/isaac.h | 272 +++++++ 3 files changed, 1296 insertions(+) create mode 100644 src/systemc/tests/systemc/datatypes/int/arith/arith05/arith05.cpp create mode 100644 src/systemc/tests/systemc/datatypes/int/arith/arith05/golden/arith05.log create mode 100644 src/systemc/tests/systemc/datatypes/int/arith/arith05/isaac.h (limited to 'src/systemc/tests/systemc/datatypes/int/arith/arith05') diff --git a/src/systemc/tests/systemc/datatypes/int/arith/arith05/arith05.cpp b/src/systemc/tests/systemc/datatypes/int/arith/arith05/arith05.cpp new file mode 100644 index 000000000..7eb83eaff --- /dev/null +++ b/src/systemc/tests/systemc/datatypes/int/arith/arith05/arith05.cpp @@ -0,0 +1,182 @@ +/***************************************************************************** + + Licensed to Accellera Systems Initiative Inc. (Accellera) under one or + more contributor license agreements. See the NOTICE file distributed + with this work for additional information regarding copyright ownership. + Accellera licenses this file to you under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with the + License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied. See the License for the specific language governing + permissions and limitations under the License. + + *****************************************************************************/ + +/***************************************************************************** + + arith05.cpp -- + + Original Author: Martin Janssen, Synopsys, Inc., 2002-02-15 + + *****************************************************************************/ + +/***************************************************************************** + + MODIFICATION LOG - modifiers, enter your name, affiliation, date and + changes you are making here. + + Name, Affiliation, Date: + Description of Modification: + + *****************************************************************************/ + +#include +#include "systemc.h" +#include "isaac.h" + +QTIsaac<8> rng; // Platform independent random number generator. + +void +check_string( const sc_signed& z, int v ) +{ + std::string buf( z.to_string( SC_BIN ) ); + if (z < 0) { + sc_assert(buf[2] == '1'); + } else { + sc_assert(buf[2] == '0'); + } +} + +int +sc_main( int argc, char* argv[] ) +{ + unsigned vali[5] = { 0, 1, (unsigned)-1, 7, (unsigned)-8 }; + unsigned valj[5] = { 0, 1, (unsigned)-1, 7, (unsigned)-8 }; + + for (unsigned i = 3; i < 32; ++i) { + for (unsigned j = 3; j < 32; ++j) { + cout << "i = " << i << ", j = " << j << endl; + + sc_unsigned x(i); + sc_unsigned y(j); + sc_unsigned z(64); + + vali[3] = (1 << (i - 1)) - 1; + vali[4] = - (1 << (i - 1)); + + valj[3] = (1 << (j - 1)) - 1; + valj[4] = - (1 << (j - 1)); + + for (unsigned ii = 0; ii < 100; ++ii) { + for (unsigned jj = 0; jj < 100; ++jj) { + unsigned qi = (ii < 5) ? vali[ii] : (rng.rand() & ((1 << i) - 1)); + unsigned qj = (jj < 5) ? valj[jj] : (rng.rand() & ((1 << j) - 1)); + unsigned tqi; + + if (qi & (1 << (i - 1))) { + qi = (qi << (32 - i)) >> (32 - i); + } + if (qj & (1 << (j - 1))) { + qj = (qj << (32 - j)) >> (32 - j); + } + + x = qi; + tqi = qi; + sc_assert( x == qi ); + y = qj; + sc_assert( y == qj ); + sc_assert((x == qj) == (qi == qj)); + sc_assert((x == qj) == (qj == x)); + sc_assert((x != qj) == (qi != qj)); + sc_assert((x != qj) == (qj != x)); + sc_assert((x < qj) == (qi < qj)); + sc_assert((x < qj) == (qj > x)); + sc_assert((x <= qj) == (qi <= qj)); + sc_assert((x <= qj) == (qj >= x)); + sc_assert((x > qj) == (qi > qj)); + sc_assert((x > qj) == (qj < x)); + sc_assert((x >= qj) == (qi >= qj)); + sc_assert((x >= qj) == (qj <= x)); + + x += y; + tqi += qj; + tqi = (tqi << (32 - i)) >> (32 - i); + sc_assert( x == tqi ); + + x = qi; + tqi = qi; + x -= y; + tqi -= qj; + tqi = (tqi << (32 - i)) >> (32 - i); + sc_assert( x == tqi ); + + x = qi; + tqi = qi; + x *= y; + tqi *= qj; + tqi = (tqi << (32 - i)) >> (32 - i); + sc_assert( x == tqi ); + + if (y != 0) { + x = qi; + tqi = qi; + x /= y; + tqi /= qj; + tqi = (tqi << (32 - i)) >> (32 - i); + sc_assert( x == tqi ); + + x = qi; + tqi = qi; + x %= y; + tqi %= qj; + tqi = (tqi << (32 - i)) >> (32 - i); + sc_assert( x == tqi ); + } + + x = qi; + tqi = qi; + x &= y; + tqi &= qj; + tqi = (tqi << (32 - i)) >> (32 - i); + sc_assert( x == tqi ); + + x = qi; + tqi = qi; + x |= y; + tqi |= qj; + tqi = (tqi << (32 - i)) >> (32 - i); + sc_assert( x == tqi ); + + x = qi; + tqi = qi; + x ^= y; + tqi ^= qj; + tqi = (tqi << (32 - i)) >> (32 - i); + sc_assert( x == tqi ); + + if (jj < i - 1) { + x = qi; + tqi = qi; + x <<= jj; + tqi <<= jj; + tqi = (tqi << (32 - i)) >> (32 - i); + sc_assert( x == tqi ); + + x = qi; + tqi = qi; + x >>= jj; + tqi >>= jj; + tqi = (tqi << (32 - i)) >> (32 - i); + sc_assert( x == tqi ); + } + } + } + } + } + return 0; +} diff --git a/src/systemc/tests/systemc/datatypes/int/arith/arith05/golden/arith05.log b/src/systemc/tests/systemc/datatypes/int/arith/arith05/golden/arith05.log new file mode 100644 index 000000000..4e17a8196 --- /dev/null +++ b/src/systemc/tests/systemc/datatypes/int/arith/arith05/golden/arith05.log @@ -0,0 +1,842 @@ +SystemC Simulation +i = 3, j = 3 +i = 3, j = 4 +i = 3, j = 5 +i = 3, j = 6 +i = 3, j = 7 +i = 3, j = 8 +i = 3, j = 9 +i = 3, j = 10 +i = 3, j = 11 +i = 3, j = 12 +i = 3, j = 13 +i = 3, j = 14 +i = 3, j = 15 +i = 3, j = 16 +i = 3, j = 17 +i = 3, j = 18 +i = 3, j = 19 +i = 3, j = 20 +i = 3, j = 21 +i = 3, j = 22 +i = 3, j = 23 +i = 3, j = 24 +i = 3, j = 25 +i = 3, j = 26 +i = 3, j = 27 +i = 3, j = 28 +i = 3, j = 29 +i = 3, j = 30 +i = 3, j = 31 +i = 4, j = 3 +i = 4, j = 4 +i = 4, j = 5 +i = 4, j = 6 +i = 4, j = 7 +i = 4, j = 8 +i = 4, j = 9 +i = 4, j = 10 +i = 4, j = 11 +i = 4, j = 12 +i = 4, j = 13 +i = 4, j = 14 +i = 4, j = 15 +i = 4, j = 16 +i = 4, j = 17 +i = 4, j = 18 +i = 4, j = 19 +i = 4, j = 20 +i = 4, j = 21 +i = 4, j = 22 +i = 4, j = 23 +i = 4, j = 24 +i = 4, j = 25 +i = 4, j = 26 +i = 4, j = 27 +i = 4, j = 28 +i = 4, j = 29 +i = 4, j = 30 +i = 4, j = 31 +i = 5, j = 3 +i = 5, j = 4 +i = 5, j = 5 +i = 5, j = 6 +i = 5, j = 7 +i = 5, j = 8 +i = 5, j = 9 +i = 5, j = 10 +i = 5, j = 11 +i = 5, j = 12 +i = 5, j = 13 +i = 5, j = 14 +i = 5, j = 15 +i = 5, j = 16 +i = 5, j = 17 +i = 5, j = 18 +i = 5, j = 19 +i = 5, j = 20 +i = 5, j = 21 +i = 5, j = 22 +i = 5, j = 23 +i = 5, j = 24 +i = 5, j = 25 +i = 5, j = 26 +i = 5, j = 27 +i = 5, j = 28 +i = 5, j = 29 +i = 5, j = 30 +i = 5, j = 31 +i = 6, j = 3 +i = 6, j = 4 +i = 6, j = 5 +i = 6, j = 6 +i = 6, j = 7 +i = 6, j = 8 +i = 6, j = 9 +i = 6, j = 10 +i = 6, j = 11 +i = 6, j = 12 +i = 6, j = 13 +i = 6, j = 14 +i = 6, j = 15 +i = 6, j = 16 +i = 6, j = 17 +i = 6, j = 18 +i = 6, j = 19 +i = 6, j = 20 +i = 6, j = 21 +i = 6, j = 22 +i = 6, j = 23 +i = 6, j = 24 +i = 6, j = 25 +i = 6, j = 26 +i = 6, j = 27 +i = 6, j = 28 +i = 6, j = 29 +i = 6, j = 30 +i = 6, j = 31 +i = 7, j = 3 +i = 7, j = 4 +i = 7, j = 5 +i = 7, j = 6 +i = 7, j = 7 +i = 7, j = 8 +i = 7, j = 9 +i = 7, j = 10 +i = 7, j = 11 +i = 7, j = 12 +i = 7, j = 13 +i = 7, j = 14 +i = 7, j = 15 +i = 7, j = 16 +i = 7, j = 17 +i = 7, j = 18 +i = 7, j = 19 +i = 7, j = 20 +i = 7, j = 21 +i = 7, j = 22 +i = 7, j = 23 +i = 7, j = 24 +i = 7, j = 25 +i = 7, j = 26 +i = 7, j = 27 +i = 7, j = 28 +i = 7, j = 29 +i = 7, j = 30 +i = 7, j = 31 +i = 8, j = 3 +i = 8, j = 4 +i = 8, j = 5 +i = 8, j = 6 +i = 8, j = 7 +i = 8, j = 8 +i = 8, j = 9 +i = 8, j = 10 +i = 8, j = 11 +i = 8, j = 12 +i = 8, j = 13 +i = 8, j = 14 +i = 8, j = 15 +i = 8, j = 16 +i = 8, j = 17 +i = 8, j = 18 +i = 8, j = 19 +i = 8, j = 20 +i = 8, j = 21 +i = 8, j = 22 +i = 8, j = 23 +i = 8, j = 24 +i = 8, j = 25 +i = 8, j = 26 +i = 8, j = 27 +i = 8, j = 28 +i = 8, j = 29 +i = 8, j = 30 +i = 8, j = 31 +i = 9, j = 3 +i = 9, j = 4 +i = 9, j = 5 +i = 9, j = 6 +i = 9, j = 7 +i = 9, j = 8 +i = 9, j = 9 +i = 9, j = 10 +i = 9, j = 11 +i = 9, j = 12 +i = 9, j = 13 +i = 9, j = 14 +i = 9, j = 15 +i = 9, j = 16 +i = 9, j = 17 +i = 9, j = 18 +i = 9, j = 19 +i = 9, j = 20 +i = 9, j = 21 +i = 9, j = 22 +i = 9, j = 23 +i = 9, j = 24 +i = 9, j = 25 +i = 9, j = 26 +i = 9, j = 27 +i = 9, j = 28 +i = 9, j = 29 +i = 9, j = 30 +i = 9, j = 31 +i = 10, j = 3 +i = 10, j = 4 +i = 10, j = 5 +i = 10, j = 6 +i = 10, j = 7 +i = 10, j = 8 +i = 10, j = 9 +i = 10, j = 10 +i = 10, j = 11 +i = 10, j = 12 +i = 10, j = 13 +i = 10, j = 14 +i = 10, j = 15 +i = 10, j = 16 +i = 10, j = 17 +i = 10, j = 18 +i = 10, j = 19 +i = 10, j = 20 +i = 10, j = 21 +i = 10, j = 22 +i = 10, j = 23 +i = 10, j = 24 +i = 10, j = 25 +i = 10, j = 26 +i = 10, j = 27 +i = 10, j = 28 +i = 10, j = 29 +i = 10, j = 30 +i = 10, j = 31 +i = 11, j = 3 +i = 11, j = 4 +i = 11, j = 5 +i = 11, j = 6 +i = 11, j = 7 +i = 11, j = 8 +i = 11, j = 9 +i = 11, j = 10 +i = 11, j = 11 +i = 11, j = 12 +i = 11, j = 13 +i = 11, j = 14 +i = 11, j = 15 +i = 11, j = 16 +i = 11, j = 17 +i = 11, j = 18 +i = 11, j = 19 +i = 11, j = 20 +i = 11, j = 21 +i = 11, j = 22 +i = 11, j = 23 +i = 11, j = 24 +i = 11, j = 25 +i = 11, j = 26 +i = 11, j = 27 +i = 11, j = 28 +i = 11, j = 29 +i = 11, j = 30 +i = 11, j = 31 +i = 12, j = 3 +i = 12, j = 4 +i = 12, j = 5 +i = 12, j = 6 +i = 12, j = 7 +i = 12, j = 8 +i = 12, j = 9 +i = 12, j = 10 +i = 12, j = 11 +i = 12, j = 12 +i = 12, j = 13 +i = 12, j = 14 +i = 12, j = 15 +i = 12, j = 16 +i = 12, j = 17 +i = 12, j = 18 +i = 12, j = 19 +i = 12, j = 20 +i = 12, j = 21 +i = 12, j = 22 +i = 12, j = 23 +i = 12, j = 24 +i = 12, j = 25 +i = 12, j = 26 +i = 12, j = 27 +i = 12, j = 28 +i = 12, j = 29 +i = 12, j = 30 +i = 12, j = 31 +i = 13, j = 3 +i = 13, j = 4 +i = 13, j = 5 +i = 13, j = 6 +i = 13, j = 7 +i = 13, j = 8 +i = 13, j = 9 +i = 13, j = 10 +i = 13, j = 11 +i = 13, j = 12 +i = 13, j = 13 +i = 13, j = 14 +i = 13, j = 15 +i = 13, j = 16 +i = 13, j = 17 +i = 13, j = 18 +i = 13, j = 19 +i = 13, j = 20 +i = 13, j = 21 +i = 13, j = 22 +i = 13, j = 23 +i = 13, j = 24 +i = 13, j = 25 +i = 13, j = 26 +i = 13, j = 27 +i = 13, j = 28 +i = 13, j = 29 +i = 13, j = 30 +i = 13, j = 31 +i = 14, j = 3 +i = 14, j = 4 +i = 14, j = 5 +i = 14, j = 6 +i = 14, j = 7 +i = 14, j = 8 +i = 14, j = 9 +i = 14, j = 10 +i = 14, j = 11 +i = 14, j = 12 +i = 14, j = 13 +i = 14, j = 14 +i = 14, j = 15 +i = 14, j = 16 +i = 14, j = 17 +i = 14, j = 18 +i = 14, j = 19 +i = 14, j = 20 +i = 14, j = 21 +i = 14, j = 22 +i = 14, j = 23 +i = 14, j = 24 +i = 14, j = 25 +i = 14, j = 26 +i = 14, j = 27 +i = 14, j = 28 +i = 14, j = 29 +i = 14, j = 30 +i = 14, j = 31 +i = 15, j = 3 +i = 15, j = 4 +i = 15, j = 5 +i = 15, j = 6 +i = 15, j = 7 +i = 15, j = 8 +i = 15, j = 9 +i = 15, j = 10 +i = 15, j = 11 +i = 15, j = 12 +i = 15, j = 13 +i = 15, j = 14 +i = 15, j = 15 +i = 15, j = 16 +i = 15, j = 17 +i = 15, j = 18 +i = 15, j = 19 +i = 15, j = 20 +i = 15, j = 21 +i = 15, j = 22 +i = 15, j = 23 +i = 15, j = 24 +i = 15, j = 25 +i = 15, j = 26 +i = 15, j = 27 +i = 15, j = 28 +i = 15, j = 29 +i = 15, j = 30 +i = 15, j = 31 +i = 16, j = 3 +i = 16, j = 4 +i = 16, j = 5 +i = 16, j = 6 +i = 16, j = 7 +i = 16, j = 8 +i = 16, j = 9 +i = 16, j = 10 +i = 16, j = 11 +i = 16, j = 12 +i = 16, j = 13 +i = 16, j = 14 +i = 16, j = 15 +i = 16, j = 16 +i = 16, j = 17 +i = 16, j = 18 +i = 16, j = 19 +i = 16, j = 20 +i = 16, j = 21 +i = 16, j = 22 +i = 16, j = 23 +i = 16, j = 24 +i = 16, j = 25 +i = 16, j = 26 +i = 16, j = 27 +i = 16, j = 28 +i = 16, j = 29 +i = 16, j = 30 +i = 16, j = 31 +i = 17, j = 3 +i = 17, j = 4 +i = 17, j = 5 +i = 17, j = 6 +i = 17, j = 7 +i = 17, j = 8 +i = 17, j = 9 +i = 17, j = 10 +i = 17, j = 11 +i = 17, j = 12 +i = 17, j = 13 +i = 17, j = 14 +i = 17, j = 15 +i = 17, j = 16 +i = 17, j = 17 +i = 17, j = 18 +i = 17, j = 19 +i = 17, j = 20 +i = 17, j = 21 +i = 17, j = 22 +i = 17, j = 23 +i = 17, j = 24 +i = 17, j = 25 +i = 17, j = 26 +i = 17, j = 27 +i = 17, j = 28 +i = 17, j = 29 +i = 17, j = 30 +i = 17, j = 31 +i = 18, j = 3 +i = 18, j = 4 +i = 18, j = 5 +i = 18, j = 6 +i = 18, j = 7 +i = 18, j = 8 +i = 18, j = 9 +i = 18, j = 10 +i = 18, j = 11 +i = 18, j = 12 +i = 18, j = 13 +i = 18, j = 14 +i = 18, j = 15 +i = 18, j = 16 +i = 18, j = 17 +i = 18, j = 18 +i = 18, j = 19 +i = 18, j = 20 +i = 18, j = 21 +i = 18, j = 22 +i = 18, j = 23 +i = 18, j = 24 +i = 18, j = 25 +i = 18, j = 26 +i = 18, j = 27 +i = 18, j = 28 +i = 18, j = 29 +i = 18, j = 30 +i = 18, j = 31 +i = 19, j = 3 +i = 19, j = 4 +i = 19, j = 5 +i = 19, j = 6 +i = 19, j = 7 +i = 19, j = 8 +i = 19, j = 9 +i = 19, j = 10 +i = 19, j = 11 +i = 19, j = 12 +i = 19, j = 13 +i = 19, j = 14 +i = 19, j = 15 +i = 19, j = 16 +i = 19, j = 17 +i = 19, j = 18 +i = 19, j = 19 +i = 19, j = 20 +i = 19, j = 21 +i = 19, j = 22 +i = 19, j = 23 +i = 19, j = 24 +i = 19, j = 25 +i = 19, j = 26 +i = 19, j = 27 +i = 19, j = 28 +i = 19, j = 29 +i = 19, j = 30 +i = 19, j = 31 +i = 20, j = 3 +i = 20, j = 4 +i = 20, j = 5 +i = 20, j = 6 +i = 20, j = 7 +i = 20, j = 8 +i = 20, j = 9 +i = 20, j = 10 +i = 20, j = 11 +i = 20, j = 12 +i = 20, j = 13 +i = 20, j = 14 +i = 20, j = 15 +i = 20, j = 16 +i = 20, j = 17 +i = 20, j = 18 +i = 20, j = 19 +i = 20, j = 20 +i = 20, j = 21 +i = 20, j = 22 +i = 20, j = 23 +i = 20, j = 24 +i = 20, j = 25 +i = 20, j = 26 +i = 20, j = 27 +i = 20, j = 28 +i = 20, j = 29 +i = 20, j = 30 +i = 20, j = 31 +i = 21, j = 3 +i = 21, j = 4 +i = 21, j = 5 +i = 21, j = 6 +i = 21, j = 7 +i = 21, j = 8 +i = 21, j = 9 +i = 21, j = 10 +i = 21, j = 11 +i = 21, j = 12 +i = 21, j = 13 +i = 21, j = 14 +i = 21, j = 15 +i = 21, j = 16 +i = 21, j = 17 +i = 21, j = 18 +i = 21, j = 19 +i = 21, j = 20 +i = 21, j = 21 +i = 21, j = 22 +i = 21, j = 23 +i = 21, j = 24 +i = 21, j = 25 +i = 21, j = 26 +i = 21, j = 27 +i = 21, j = 28 +i = 21, j = 29 +i = 21, j = 30 +i = 21, j = 31 +i = 22, j = 3 +i = 22, j = 4 +i = 22, j = 5 +i = 22, j = 6 +i = 22, j = 7 +i = 22, j = 8 +i = 22, j = 9 +i = 22, j = 10 +i = 22, j = 11 +i = 22, j = 12 +i = 22, j = 13 +i = 22, j = 14 +i = 22, j = 15 +i = 22, j = 16 +i = 22, j = 17 +i = 22, j = 18 +i = 22, j = 19 +i = 22, j = 20 +i = 22, j = 21 +i = 22, j = 22 +i = 22, j = 23 +i = 22, j = 24 +i = 22, j = 25 +i = 22, j = 26 +i = 22, j = 27 +i = 22, j = 28 +i = 22, j = 29 +i = 22, j = 30 +i = 22, j = 31 +i = 23, j = 3 +i = 23, j = 4 +i = 23, j = 5 +i = 23, j = 6 +i = 23, j = 7 +i = 23, j = 8 +i = 23, j = 9 +i = 23, j = 10 +i = 23, j = 11 +i = 23, j = 12 +i = 23, j = 13 +i = 23, j = 14 +i = 23, j = 15 +i = 23, j = 16 +i = 23, j = 17 +i = 23, j = 18 +i = 23, j = 19 +i = 23, j = 20 +i = 23, j = 21 +i = 23, j = 22 +i = 23, j = 23 +i = 23, j = 24 +i = 23, j = 25 +i = 23, j = 26 +i = 23, j = 27 +i = 23, j = 28 +i = 23, j = 29 +i = 23, j = 30 +i = 23, j = 31 +i = 24, j = 3 +i = 24, j = 4 +i = 24, j = 5 +i = 24, j = 6 +i = 24, j = 7 +i = 24, j = 8 +i = 24, j = 9 +i = 24, j = 10 +i = 24, j = 11 +i = 24, j = 12 +i = 24, j = 13 +i = 24, j = 14 +i = 24, j = 15 +i = 24, j = 16 +i = 24, j = 17 +i = 24, j = 18 +i = 24, j = 19 +i = 24, j = 20 +i = 24, j = 21 +i = 24, j = 22 +i = 24, j = 23 +i = 24, j = 24 +i = 24, j = 25 +i = 24, j = 26 +i = 24, j = 27 +i = 24, j = 28 +i = 24, j = 29 +i = 24, j = 30 +i = 24, j = 31 +i = 25, j = 3 +i = 25, j = 4 +i = 25, j = 5 +i = 25, j = 6 +i = 25, j = 7 +i = 25, j = 8 +i = 25, j = 9 +i = 25, j = 10 +i = 25, j = 11 +i = 25, j = 12 +i = 25, j = 13 +i = 25, j = 14 +i = 25, j = 15 +i = 25, j = 16 +i = 25, j = 17 +i = 25, j = 18 +i = 25, j = 19 +i = 25, j = 20 +i = 25, j = 21 +i = 25, j = 22 +i = 25, j = 23 +i = 25, j = 24 +i = 25, j = 25 +i = 25, j = 26 +i = 25, j = 27 +i = 25, j = 28 +i = 25, j = 29 +i = 25, j = 30 +i = 25, j = 31 +i = 26, j = 3 +i = 26, j = 4 +i = 26, j = 5 +i = 26, j = 6 +i = 26, j = 7 +i = 26, j = 8 +i = 26, j = 9 +i = 26, j = 10 +i = 26, j = 11 +i = 26, j = 12 +i = 26, j = 13 +i = 26, j = 14 +i = 26, j = 15 +i = 26, j = 16 +i = 26, j = 17 +i = 26, j = 18 +i = 26, j = 19 +i = 26, j = 20 +i = 26, j = 21 +i = 26, j = 22 +i = 26, j = 23 +i = 26, j = 24 +i = 26, j = 25 +i = 26, j = 26 +i = 26, j = 27 +i = 26, j = 28 +i = 26, j = 29 +i = 26, j = 30 +i = 26, j = 31 +i = 27, j = 3 +i = 27, j = 4 +i = 27, j = 5 +i = 27, j = 6 +i = 27, j = 7 +i = 27, j = 8 +i = 27, j = 9 +i = 27, j = 10 +i = 27, j = 11 +i = 27, j = 12 +i = 27, j = 13 +i = 27, j = 14 +i = 27, j = 15 +i = 27, j = 16 +i = 27, j = 17 +i = 27, j = 18 +i = 27, j = 19 +i = 27, j = 20 +i = 27, j = 21 +i = 27, j = 22 +i = 27, j = 23 +i = 27, j = 24 +i = 27, j = 25 +i = 27, j = 26 +i = 27, j = 27 +i = 27, j = 28 +i = 27, j = 29 +i = 27, j = 30 +i = 27, j = 31 +i = 28, j = 3 +i = 28, j = 4 +i = 28, j = 5 +i = 28, j = 6 +i = 28, j = 7 +i = 28, j = 8 +i = 28, j = 9 +i = 28, j = 10 +i = 28, j = 11 +i = 28, j = 12 +i = 28, j = 13 +i = 28, j = 14 +i = 28, j = 15 +i = 28, j = 16 +i = 28, j = 17 +i = 28, j = 18 +i = 28, j = 19 +i = 28, j = 20 +i = 28, j = 21 +i = 28, j = 22 +i = 28, j = 23 +i = 28, j = 24 +i = 28, j = 25 +i = 28, j = 26 +i = 28, j = 27 +i = 28, j = 28 +i = 28, j = 29 +i = 28, j = 30 +i = 28, j = 31 +i = 29, j = 3 +i = 29, j = 4 +i = 29, j = 5 +i = 29, j = 6 +i = 29, j = 7 +i = 29, j = 8 +i = 29, j = 9 +i = 29, j = 10 +i = 29, j = 11 +i = 29, j = 12 +i = 29, j = 13 +i = 29, j = 14 +i = 29, j = 15 +i = 29, j = 16 +i = 29, j = 17 +i = 29, j = 18 +i = 29, j = 19 +i = 29, j = 20 +i = 29, j = 21 +i = 29, j = 22 +i = 29, j = 23 +i = 29, j = 24 +i = 29, j = 25 +i = 29, j = 26 +i = 29, j = 27 +i = 29, j = 28 +i = 29, j = 29 +i = 29, j = 30 +i = 29, j = 31 +i = 30, j = 3 +i = 30, j = 4 +i = 30, j = 5 +i = 30, j = 6 +i = 30, j = 7 +i = 30, j = 8 +i = 30, j = 9 +i = 30, j = 10 +i = 30, j = 11 +i = 30, j = 12 +i = 30, j = 13 +i = 30, j = 14 +i = 30, j = 15 +i = 30, j = 16 +i = 30, j = 17 +i = 30, j = 18 +i = 30, j = 19 +i = 30, j = 20 +i = 30, j = 21 +i = 30, j = 22 +i = 30, j = 23 +i = 30, j = 24 +i = 30, j = 25 +i = 30, j = 26 +i = 30, j = 27 +i = 30, j = 28 +i = 30, j = 29 +i = 30, j = 30 +i = 30, j = 31 +i = 31, j = 3 +i = 31, j = 4 +i = 31, j = 5 +i = 31, j = 6 +i = 31, j = 7 +i = 31, j = 8 +i = 31, j = 9 +i = 31, j = 10 +i = 31, j = 11 +i = 31, j = 12 +i = 31, j = 13 +i = 31, j = 14 +i = 31, j = 15 +i = 31, j = 16 +i = 31, j = 17 +i = 31, j = 18 +i = 31, j = 19 +i = 31, j = 20 +i = 31, j = 21 +i = 31, j = 22 +i = 31, j = 23 +i = 31, j = 24 +i = 31, j = 25 +i = 31, j = 26 +i = 31, j = 27 +i = 31, j = 28 +i = 31, j = 29 +i = 31, j = 30 +i = 31, j = 31 diff --git a/src/systemc/tests/systemc/datatypes/int/arith/arith05/isaac.h b/src/systemc/tests/systemc/datatypes/int/arith/arith05/isaac.h new file mode 100644 index 000000000..9625be2ac --- /dev/null +++ b/src/systemc/tests/systemc/datatypes/int/arith/arith05/isaac.h @@ -0,0 +1,272 @@ +#ifndef __ISAAC_HPP +#define __ISAAC_HPP + + +/* + + C++ TEMPLATE VERSION OF Robert J. Jenkins Jr.'s + ISAAC Random Number Generator. + + Ported from vanilla C to to template C++ class + by Quinn Tyler Jackson on 16-23 July 1998. + + quinn@qtj.net + + The function for the expected period of this + random number generator, according to Jenkins is: + + f(a,b) = 2**((a+b*(3+2^^a)-1) + + (where a is ALPHA and b is bitwidth) + + So, for a bitwidth of 32 and an ALPHA of 8, + the expected period of ISAAC is: + + 2^^(8+32*(3+2^^8)-1) = 2^^8295 + + Jackson has been able to run implementations + with an ALPHA as high as 16, or + + 2^^2097263 + +*/ + + +typedef unsigned int UINT32; +const UINT32 GOLDEN_RATIO = UINT32(0x9e3779b9); + + +template +class QTIsaac +{ + public: + + typedef unsigned char byte; + + struct randctx + { + randctx(void) + { + randrsl = new UINT32[N]; + randmem = new UINT32[N]; + } + + ~randctx(void) + { + delete [] randrsl; + delete [] randmem; + } + + UINT32 randcnt; + UINT32* randrsl; + UINT32* randmem; + UINT32 randa; + UINT32 randb; + UINT32 randc; + }; + + QTIsaac(UINT32 a = 0, UINT32 b = 0, UINT32 c = 0); + virtual ~QTIsaac(void); + + UINT32 rand(void); + virtual void randinit(randctx* ctx, bool bUseSeed); + virtual void srand( + UINT32 a = 0, UINT32 b = 0, UINT32 c = 0, UINT32* s = NULL); + + enum {N = (1< +QTIsaac::QTIsaac(UINT32 a, UINT32 b, UINT32 c) : m_rc() +{ + srand(a, b, c); +} + + +template +QTIsaac::~QTIsaac(void) +{ + // DO NOTHING +} + + +template +void QTIsaac::srand(UINT32 a, UINT32 b, UINT32 c, UINT32* s) +{ + for(int i = 0; i < N; i++) + { + m_rc.randrsl[i] = s != NULL ? s[i] : 0; + } + + m_rc.randa = a; + m_rc.randb = b; + m_rc.randc = c; + + randinit(&m_rc, true); +} + + +template +inline UINT32 QTIsaac::rand(void) +{ + return 0x7fffffff & (!m_rc.randcnt-- ? + (isaac(&m_rc), m_rc.randcnt=(N-1), m_rc.randrsl[m_rc.randcnt]) : + m_rc.randrsl[m_rc.randcnt]); +} + + +template +inline void QTIsaac::randinit(randctx* ctx, bool bUseSeed) +{ + UINT32 a,b,c,d,e,f,g,h; + int i; + + a = b = c = d = e = f = g = h = GOLDEN_RATIO; + + UINT32* m = (ctx->randmem); + UINT32* r = (ctx->randrsl); + + if(!bUseSeed) + { + ctx->randa = 0; + ctx->randb = 0; + ctx->randc = 0; + } + + // scramble it + for(i=0; i < 4; ++i) + { + shuffle(a,b,c,d,e,f,g,h); + } + + if(bUseSeed) + { + // initialize using the contents of r[] as the seed + + for(i=0; i < N; i+=8) + { + a+=r[i ]; b+=r[i+1]; c+=r[i+2]; d+=r[i+3]; + e+=r[i+4]; f+=r[i+5]; g+=r[i+6]; h+=r[i+7]; + + shuffle(a,b,c,d,e,f,g,h); + + m[i ]=a; m[i+1]=b; m[i+2]=c; m[i+3]=d; + m[i+4]=e; m[i+5]=f; m[i+6]=g; m[i+7]=h; + } + + //do a second pass to make all of the seed affect all of m + + for(i=0; i < N; i += 8) + { + a+=m[i ]; b+=m[i+1]; c+=m[i+2]; d+=m[i+3]; + e+=m[i+4]; f+=m[i+5]; g+=m[i+6]; h+=m[i+7]; + + shuffle(a,b,c,d,e,f,g,h); + + m[i ]=a; m[i+1]=b; m[i+2]=c; m[i+3]=d; + m[i+4]=e; m[i+5]=f; m[i+6]=g; m[i+7]=h; + } + } + else + { + // fill in mm[] with messy stuff + + shuffle(a,b,c,d,e,f,g,h); + + m[i ]=a; m[i+1]=b; m[i+2]=c; m[i+3]=d; + m[i+4]=e; m[i+5]=f; m[i+6]=g; m[i+7]=h; + + } + + isaac(ctx); // fill in the first set of results + ctx->randcnt = N; // prepare to use the first set of results +} + + +template +inline UINT32 QTIsaac::ind(UINT32* mm, UINT32 x) +{ + return (*(UINT32*)((byte*)(mm) + ((x) & ((N-1)<<2)))); +} + + +template +inline void QTIsaac::rngstep(UINT32 mix, UINT32& a, UINT32& b, UINT32*& mm, UINT32*& m, UINT32*& m2, UINT32*& r, UINT32& x, UINT32& y) +{ + x = *m; + a = (a^(mix)) + *(m2++); + *(m++) = y = ind(mm,x) + a + b; + *(r++) = b = ind(mm,y>>ALPHA) + x; +} + + +template +inline void QTIsaac::shuffle(UINT32& a, UINT32& b, UINT32& c, UINT32& d, UINT32& e, UINT32& f, UINT32& g, UINT32& h) +{ + a^=b<<11; d+=a; b+=c; + b^=c>>2; e+=b; c+=d; + c^=d<<8; f+=c; d+=e; + d^=e>>16; g+=d; e+=f; + e^=f<<10; h+=e; f+=g; + f^=g>>4; a+=f; g+=h; + g^=h<<8; b+=g; h+=a; + h^=a>>9; c+=h; a+=b; +} + + +template +inline void QTIsaac::isaac(randctx* ctx) +{ + UINT32 x,y; + + UINT32* mm = ctx->randmem; + UINT32* r = ctx->randrsl; + + UINT32 a = (ctx->randa); + UINT32 b = (ctx->randb + (++ctx->randc)); + + UINT32* m = mm; + UINT32* m2 = (m+(N/2)); + UINT32* mend = m2; + + for(; m>6) , a, b, mm, m, m2, r, x, y); + rngstep((a<<2) , a, b, mm, m, m2, r, x, y); + rngstep((a>>16), a, b, mm, m, m2, r, x, y); + } + + m2 = mm; + + for(; m2>6) , a, b, mm, m, m2, r, x, y); + rngstep((a<<2) , a, b, mm, m, m2, r, x, y); + rngstep((a>>16), a, b, mm, m, m2, r, x, y); + } + + ctx->randb = b; + ctx->randa = a; +} + + +#endif // __ISAAC_HPP + -- cgit v1.2.3