112855Sgabeblack@google.com#include "systemc.h"
212855Sgabeblack@google.com
312855Sgabeblack@google.com
412855Sgabeblack@google.cominline void dump(sc_signed& value)
512855Sgabeblack@google.com{
612855Sgabeblack@google.com	sc_digit* ptr = value.get_raw();
712855Sgabeblack@google.com	printf("    %08x_%08x_%08x_%08x\n",
812855Sgabeblack@google.com		(int)ptr[3], (int)ptr[2], (int)ptr[1], (int)ptr[0]);
912855Sgabeblack@google.com	cout << "    " << value << endl;
1012855Sgabeblack@google.com}
1112855Sgabeblack@google.com
1212855Sgabeblack@google.cominline void dump(sc_unsigned& value)
1312855Sgabeblack@google.com{
1412855Sgabeblack@google.com	sc_digit* ptr = value.get_raw();
1512855Sgabeblack@google.com	printf("    %08x_%08x_%08x_%08x\n",
1612855Sgabeblack@google.com		(int)ptr[3], (int)ptr[2], (int)ptr[1], (int)ptr[0]);
1712855Sgabeblack@google.com	cout << "    " << value << endl;
1812855Sgabeblack@google.com}
1912855Sgabeblack@google.com
2012855Sgabeblack@google.com#define PARSE( SUBJECT ) \
2112855Sgabeblack@google.com{ \
2212855Sgabeblack@google.com	src_p = SUBJECT; \
2312855Sgabeblack@google.com	cout << endl << #SUBJECT << ":" << endl; \
2412855Sgabeblack@google.com	svalue = src_p; \
2512855Sgabeblack@google.com    dump(svalue); \
2612855Sgabeblack@google.com	cout << endl; \
2712855Sgabeblack@google.com	value = src_p; \
2812855Sgabeblack@google.com    dump(value); \
2912855Sgabeblack@google.com}
3012855Sgabeblack@google.com#define TEST(SUBJECT,EXPECTED) \
3112855Sgabeblack@google.com{ \
3212855Sgabeblack@google.com    value = SUBJECT; \
3312855Sgabeblack@google.com	if ( value.to_uint64() != EXPECTED ) \
3412855Sgabeblack@google.com	{ \
3512855Sgabeblack@google.com		printf("%s(%d): %s: %llx != %llx\n", \
3612855Sgabeblack@google.com			__FILE__, __LINE__,  SUBJECT, value.to_uint64(), (uint64)EXPECTED);\
3712855Sgabeblack@google.com	} \
3812855Sgabeblack@google.com}
3912855Sgabeblack@google.com
4012855Sgabeblack@google.com#define TESTs64(SUBJECT,EXPECTED) \
4112855Sgabeblack@google.com{ \
4212855Sgabeblack@google.com	svalue64 = SUBJECT; \
4312855Sgabeblack@google.com	if ( svalue64 != (long long)EXPECTED )  \
4412855Sgabeblack@google.com	{ \
4512855Sgabeblack@google.com		printf("%s(%d): %s: %llx != %llx\n", \
4612855Sgabeblack@google.com			__FILE__, __LINE__,  SUBJECT, value.to_uint64(), (uint64)EXPECTED);\
4712855Sgabeblack@google.com	}\
4812855Sgabeblack@google.com}
4912855Sgabeblack@google.com
5012855Sgabeblack@google.com#define TESTu64(SUBJECT,EXPECTED) \
5112855Sgabeblack@google.com{ \
5212855Sgabeblack@google.com	uvalue64 = SUBJECT; \
5312855Sgabeblack@google.com	if ( uvalue64 != EXPECTED )  \
5412855Sgabeblack@google.com	{ \
5512855Sgabeblack@google.com		printf("%s(%d): %s: %llx != %llx\n", \
5612855Sgabeblack@google.com			__FILE__, __LINE__,  SUBJECT, value.to_uint64(), (uint64)EXPECTED);\
5712855Sgabeblack@google.com	}\
5812855Sgabeblack@google.com}
5912855Sgabeblack@google.com
6012855Sgabeblack@google.com
6112855Sgabeblack@google.comint sc_main(int, char**)
6212855Sgabeblack@google.com{
6312855Sgabeblack@google.com	char               buffer[128];
6412855Sgabeblack@google.com	unsigned long long expected;
6512855Sgabeblack@google.com	sc_bigint<120>     svalue;
6612855Sgabeblack@google.com	sc_int<64>         svalue64;
6712855Sgabeblack@google.com	sc_uint<64>        uvalue64;
6812855Sgabeblack@google.com	sc_biguint<120>    value;
6912855Sgabeblack@google.com
7012855Sgabeblack@google.com
7112855Sgabeblack@google.com	TESTs64("0xusffffffff", 0xffffffff);
7212855Sgabeblack@google.com	TESTs64("0xusffffffff", 0xffffffff);
7312855Sgabeblack@google.com	TESTs64("0xusfffffff", 0xfffffff);
7412855Sgabeblack@google.com	TESTs64("0XUSfedcab876543210", 0xfedcab876543210ull);
7512855Sgabeblack@google.com	TESTs64("0ous77777777", 077777777);
7612855Sgabeblack@google.com	TESTs64("0ous77777777", 077777777);
7712855Sgabeblack@google.com	TESTs64("0Ous7654321076543", 07654321076543ull);
7812855Sgabeblack@google.com	TESTs64("55555555555555", 55555555555555ull);
7912855Sgabeblack@google.com	TESTs64("0bus1100110011001100", 0xcccc);
8012855Sgabeblack@google.com	TESTs64("0bus1111111011011100101110101001100001110110010101000011001000010000",
8112855Sgabeblack@google.com		  0xfedcba9876543210ll);
8212855Sgabeblack@google.com
8312855Sgabeblack@google.com	TESTu64("0xusffffffff", 0xffffffff);
8412855Sgabeblack@google.com	TESTu64("0xusffffffff", 0xffffffff);
8512855Sgabeblack@google.com	TESTu64("0xusfffffff", 0xfffffff);
8612855Sgabeblack@google.com	TESTu64("0XUSfedcab876543210", 0xfedcab876543210ull);
8712855Sgabeblack@google.com	TESTu64("0ous77777777", 077777777);
8812855Sgabeblack@google.com	TESTu64("0ous77777777", 077777777);
8912855Sgabeblack@google.com	TESTu64("0Ous7654321076543", 07654321076543ull);
9012855Sgabeblack@google.com	TESTu64("55555555555555", 55555555555555ull);
9112855Sgabeblack@google.com	TESTu64("0bus1100110011001100", 0xcccc);
9212855Sgabeblack@google.com	TESTu64("0bus1111111011011100101110101001100001110110010101000011001000010000",
9312855Sgabeblack@google.com		  0xfedcba9876543210ll);
9412855Sgabeblack@google.com	for ( int i = 0; i < 60; i++ )
9512855Sgabeblack@google.com	{
9612855Sgabeblack@google.com		for ( int j = 0; j < 16; j++ )
9712855Sgabeblack@google.com		{
9812855Sgabeblack@google.com			expected = j;
9912855Sgabeblack@google.com			expected = expected << i;
10012855Sgabeblack@google.com			sprintf(buffer, "0Xus%llx", expected);
10112855Sgabeblack@google.com			TEST(buffer, expected);
10212855Sgabeblack@google.com			TESTs64(buffer, expected);
10312855Sgabeblack@google.com			TESTu64(buffer, expected);
10412855Sgabeblack@google.com			sprintf(buffer, "0ous%llo", expected);
10512855Sgabeblack@google.com			TEST(buffer, expected);
10612855Sgabeblack@google.com			TESTs64(buffer, expected);
10712855Sgabeblack@google.com			TESTu64(buffer, expected);
10812855Sgabeblack@google.com			sprintf(buffer, "%lld", expected);
10912855Sgabeblack@google.com			TEST(buffer, expected);
11012855Sgabeblack@google.com			TESTs64(buffer, expected);
11112855Sgabeblack@google.com			TESTu64(buffer, expected);
11212855Sgabeblack@google.com		}
11312855Sgabeblack@google.com	}
11412855Sgabeblack@google.com	TEST("0xusffffffff", 0xffffffff);
11512855Sgabeblack@google.com	TEST("0xusffffffff", 0xffffffff);
11612855Sgabeblack@google.com	TEST("0xusfffffff", 0xfffffff);
11712855Sgabeblack@google.com	TEST("0XUSfedcab876543210", 0xfedcab876543210ull);
11812855Sgabeblack@google.com	TEST("0ous77777777", 077777777);
11912855Sgabeblack@google.com	TEST("0ous77777777", 077777777);
12012855Sgabeblack@google.com	TEST("0Ous7654321076543", 07654321076543ull);
12112855Sgabeblack@google.com	TEST("55555555555555", 55555555555555ull);
12212855Sgabeblack@google.com	TEST("0bus1100110011001100", 0xcccc);
12312855Sgabeblack@google.com	TEST("0bus1111111011011100101110101001100001110110010101000011001000010000",
12412855Sgabeblack@google.com		  0xfedcba9876543210ll);
12512855Sgabeblack@google.com
12613158Sgabeblack@google.com	cout << "Program completed" << endl;
12712855Sgabeblack@google.com	return 0;
12812855Sgabeblack@google.com}
129