Exemplo n.º 1
0
        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 );
        }
Exemplo n.º 2
0
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 );
}
Exemplo n.º 3
0
Arquivo: func.cpp Projeto: kotrenn/c8
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;
}
Exemplo n.º 4
0
    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" ) );


      }