void testBigInt() { std::vector<DataType> ints; ints.push_back ( (uint32) 0x12345678 ); ints.push_back ( (uint32) 0x9abcdef0 ); DataType bi = DataType::as_bigint_datatype( ints ); CPPUNIT_ASSERT_EQUAL ( BIGINT_DATA, bi.get_type() ); DataType bi2 = bi; CPPUNIT_ASSERT_EQUAL ( BIGINT_DATA, bi.get_type() ); std::vector<DataType> ints2 = DataType::as_bigints ( bi2 ); CPPUNIT_ASSERT_EQUAL ( ints, ints2 ); }
mpz_class bi_from_dt ( const DataType &data ) { if ( data.get_type() == INT_DATA ) return mpz_class ( (int32) data ); if ( data.get_type() == UINT_DATA ) return mpz_class ( (uint32) data ); if ( data.get_type() == STR_DATA ) return mpz_class ( (std::string) data ); if ( data.get_type() == BIGINT_DATA ) { mpz_class res(0); std::vector<DataType> ints = DataType::as_bigints ( data ); while (ints.size()) { res <<= 32; res |= mpz_class ( (uint32) ints.back() ); ints.pop_back(); } return res; } throw Exception ( INVALID_CAST , "Unsupported cast to bigint from datatype." , data ); }
Data Func::eval(VarTable *vars, FuncTable *funcs, vector<Data> &argv) { VarTable new_vars(vars); m_args->apply(&new_vars, argv); bool retstat = false; Data ret = m_block->eval(&new_vars, funcs, &retstat); DataType type = m_var_decl->get_type(); if (type != ret.get_type()) { if (type.get_type() == "int") { printf("Error: function conversion from float to int\n"); exit(1); } int ival = ret.get_int(); ret.set_float((float)ival); ret.set_type(DataType("float", 0)); } return ret; }
void testBigReg() { //cout << " -- set big_sub2 -- " << endl; dev.set ( "int_term" , "wide_reg.big_sub2", 0xd ); DataType dt = dev.get ( "int_term", "wide_reg.big_sub2" ); CPPUNIT_ASSERT_EQUAL ( 0xd, (int32) dt ); //dev.get ( "int_term", "wide_reg.big_sub2" ) ); //cout << " -- set big_sub3 -- " << endl; dev.set ( "int_term", "wide_reg.big_sub3", (uint32)0x12345678 ); CPPUNIT_ASSERT_EQUAL ( (uint32)0x12345678, (uint32) dev.get("int_term", "wide_reg.big_sub3" ) ); //cout << " -- set big_sub2 -- " << endl; dev.set ( "int_term", "wide_reg.big_sub2", 1 ); //dev.debug(); CPPUNIT_ASSERT_EQUAL ( (uint32)0x12345678, (uint32) dev.get("int_term", "wide_reg.big_sub3" ) ); // 37 bits, 4 bits, 33 bits = 74 bits vector<DataType> big1; big1.push_back ( (uint32)0x12345678 ); big1.push_back ( (uint32)0x90123456 ); big1.push_back ( (uint32)0x3ff ); DataType bigdt = DataType::as_bigint_datatype(big1); CPPUNIT_ASSERT_NO_THROW ( dev.set ( "int_term", "wide_reg" , bigdt) ); bigdt = dev.get( "int_term", "wide_reg" ); CPPUNIT_ASSERT_EQUAL ( BIGINT_DATA, bigdt.get_type() ); big1 = bigdt.as_bigints(bigdt); CPPUNIT_ASSERT_EQUAL ( (uint32) 0x12345678 , (uint32) big1.at(0) ); CPPUNIT_ASSERT_EQUAL ( 2, (int) dev.get ( "int_term", "wide_reg.big_sub2" ) ); bigdt = dev.get( "int_term", "wide_reg.big_sub1" ); CPPUNIT_ASSERT_EQUAL ( BIGINT_DATA, bigdt.get_type() ); big1 = bigdt.as_bigints(bigdt); CPPUNIT_ASSERT_EQUAL ( 2, (int) big1.size() ); // 37 bits CPPUNIT_ASSERT_EQUAL ( (uint32) 0x12345678, (uint32) big1.at(0) ); CPPUNIT_ASSERT_EQUAL ( (uint32) 0x16, (uint32) big1.at(1) ); CPPUNIT_ASSERT_EQUAL ( 184 , (int) dev.get_register ( "int_term", "many_subregs" )->get_attr("width" ) ); dev.clear(); dev.set("int_term", "many_subregs.fifteen" , 500 ); dev.set("int_term", "many_subregs.fourteen", 0xfff ); dev.set("int_term", "many_subregs.sixteen", 0xfff ); CPPUNIT_ASSERT_EQUAL ( 500, (int) dev.get ( "int_term", "many_subregs.fifteen" ) ); }