#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; }