summaryrefslogtreecommitdiff
path: root/src/systemc/tests/systemc/datatypes/int/misc/test02/test02.cpp
blob: d27e98062140995c586d928b4b812947033df492 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include "systemc.h"


inline void dump(sc_signed& value)
{
	sc_digit* ptr = value.get_raw();
	printf("    %08x_%08x_%08x_%08x\n", 
		(int)ptr[3], (int)ptr[2], (int)ptr[1], (int)ptr[0]);
	cout << "    " << value << endl;
}

inline void dump(sc_unsigned& value)
{
	sc_digit* ptr = value.get_raw();
	printf("    %08x_%08x_%08x_%08x\n", 
		(int)ptr[3], (int)ptr[2], (int)ptr[1], (int)ptr[0]);
	cout << "    " << value << endl;
}

#define PARSE( SUBJECT ) \
{ \
	src_p = SUBJECT; \
	cout << endl << #SUBJECT << ":" << endl; \
	svalue = src_p; \
    dump(svalue); \
	cout << endl; \
	value = src_p; \
    dump(value); \
}
#define TEST(SUBJECT,EXPECTED) \
{ \
    value = SUBJECT; \
	if ( value.to_uint64() != EXPECTED ) \
	{ \
		printf("%s(%d): %s: %llx != %llx\n", \
			__FILE__, __LINE__,  SUBJECT, value.to_uint64(), (uint64)EXPECTED);\
	} \
}

#define TESTs64(SUBJECT,EXPECTED) \
{ \
	svalue64 = SUBJECT; \
	if ( svalue64 != (long long)EXPECTED )  \
	{ \
		printf("%s(%d): %s: %llx != %llx\n", \
			__FILE__, __LINE__,  SUBJECT, value.to_uint64(), (uint64)EXPECTED);\
	}\
}
	
#define TESTu64(SUBJECT,EXPECTED) \
{ \
	uvalue64 = SUBJECT; \
	if ( uvalue64 != EXPECTED )  \
	{ \
		printf("%s(%d): %s: %llx != %llx\n", \
			__FILE__, __LINE__,  SUBJECT, value.to_uint64(), (uint64)EXPECTED);\
	}\
}
	

int sc_main(int, char**)
{
	char               buffer[128];
	unsigned long long expected;
	sc_bigint<120>     svalue;
	sc_int<64>         svalue64;
	sc_uint<64>        uvalue64;
	sc_biguint<120>    value;


	TESTs64("0xusffffffff", 0xffffffff);
	TESTs64("0xusffffffff", 0xffffffff);
	TESTs64("0xusfffffff", 0xfffffff);
	TESTs64("0XUSfedcab876543210", 0xfedcab876543210ull);
	TESTs64("0ous77777777", 077777777);
	TESTs64("0ous77777777", 077777777);
	TESTs64("0Ous7654321076543", 07654321076543ull);
	TESTs64("55555555555555", 55555555555555ull);
	TESTs64("0bus1100110011001100", 0xcccc);
	TESTs64("0bus1111111011011100101110101001100001110110010101000011001000010000",
		  0xfedcba9876543210ll);

	TESTu64("0xusffffffff", 0xffffffff);
	TESTu64("0xusffffffff", 0xffffffff);
	TESTu64("0xusfffffff", 0xfffffff);
	TESTu64("0XUSfedcab876543210", 0xfedcab876543210ull);
	TESTu64("0ous77777777", 077777777);
	TESTu64("0ous77777777", 077777777);
	TESTu64("0Ous7654321076543", 07654321076543ull);
	TESTu64("55555555555555", 55555555555555ull);
	TESTu64("0bus1100110011001100", 0xcccc);
	TESTu64("0bus1111111011011100101110101001100001110110010101000011001000010000",
		  0xfedcba9876543210ll);
	for ( int i = 0; i < 60; i++ )
	{
		for ( int j = 0; j < 16; j++ )
		{
			expected = j;
			expected = expected << i;
			sprintf(buffer, "0Xus%llx", expected);
			TEST(buffer, expected);
			TESTs64(buffer, expected);
			TESTu64(buffer, expected);
			sprintf(buffer, "0ous%llo", expected);
			TEST(buffer, expected);
			TESTs64(buffer, expected);
			TESTu64(buffer, expected);
			sprintf(buffer, "%lld", expected);
			TEST(buffer, expected);
			TESTs64(buffer, expected);
			TESTu64(buffer, expected);
		}
	}
	TEST("0xusffffffff", 0xffffffff);
	TEST("0xusffffffff", 0xffffffff);
	TEST("0xusfffffff", 0xfffffff);
	TEST("0XUSfedcab876543210", 0xfedcab876543210ull);
	TEST("0ous77777777", 077777777);
	TEST("0ous77777777", 077777777);
	TEST("0Ous7654321076543", 07654321076543ull);
	TEST("55555555555555", 55555555555555ull);
	TEST("0bus1100110011001100", 0xcccc);
	TEST("0bus1111111011011100101110101001100001110110010101000011001000010000",
		  0xfedcba9876543210ll);

	cerr << "Program completed" << endl;
	return 0;
}