Exemple #1
0
void generateUseDef(vertex_t* vertex_list, int nvertex, int nsym, int nactive, Random* r, bool print_input){
    //printf("in generateUseDef\n");
	int j;
	int sym;

    for(int i = 0; i < nvertex; ++i){

		if(print_input){
			printf("[%d] usedef = {", vertex_list[i].index);
		}
		for (j = 0; j < nactive; ++j) {
			sym = abs(nextRand(r)) % nsym;

			if (j % 4 != 0) {
				if(!bitset_get_bit(vertex_list[i].def, sym)){//!bitset_get_bit(v->def, sym)){

					if(print_input){
						printf(" u %d", sym);
					}
					bitset_set_bit(vertex_list[i].use, sym);//bitset_set_bit(v->use, sym, true);
				}
			}else{
				if(!bitset_get_bit(vertex_list[i].use, sym)){//!bitset_get_bit(v->use, sym)){
					if(print_input){
						printf(" d %d", sym);
					}
					bitset_set_bit(vertex_list[i].def, sym);//bitset_set_bit(v->def, sym, true);
				}
			}
		}
		if(print_input){
			printf("}\n");
		}
	}
}
int32_t				bitset_gol_get_bit_neighbours(register const t_bitset *const bitset,
												register const size_t const *x,
												register const size_t const *y)
{
	register int32_t			n = 0;

	n += bitset_get_bit(bitset, (*x + 7) & 7, (*y + 7) & 7);
	n += bitset_get_bit(bitset, *x, (*y + 7) & 7);
	n += bitset_get_bit(bitset, (*x + 1) & 7, (*y + 7) & 7);
	n += bitset_get_bit(bitset, (*x + 7) & 7, *y);
	n += bitset_get_bit(bitset, (*x + 1) & 7, *y);
	n += bitset_get_bit(bitset, (*x + 7) & 7, (*y + 1) & 7);
	n += bitset_get_bit(bitset, *x, (*y + 1) & 7);
	n += bitset_get_bit(bitset, (*x + 1) & 7, (*y + 1) & 7);
	return (n);
}
static int huffman_tree_deserialize_recurse(huffman_node* curr_node, bitset* tree_binary_rep, int *bits_read) {
    if((*bits_read) >= tree_binary_rep->total_bits) {
        return HUFFMAN_SUCCESS;
    }

    int node_creation_status, deserialization_status;

    unsigned int curr_bit;
    bitset_get_bit(tree_binary_rep, *bits_read, &curr_bit);
    (*bits_read)++;

    if(curr_bit == 0) {
        
        huffman_node* new_node;
        node_creation_status = huffman_node_create(&new_node);
        if(node_creation_status != HUFFMAN_SUCCESS) {
            return node_creation_status;
        }

        deserialization_status = huffman_tree_deserialize_recurse(new_node, tree_binary_rep, bits_read);
        if(deserialization_status != HUFFMAN_SUCCESS) {
            huffman_node_destroy(new_node);
            return deserialization_status;
        }

        curr_node->left = new_node;

        node_creation_status = huffman_node_create(&new_node);
        if(node_creation_status != HUFFMAN_SUCCESS) {
            return node_creation_status;
        }

        deserialization_status = huffman_tree_deserialize_recurse(new_node, tree_binary_rep, bits_read);
        if(deserialization_status != HUFFMAN_SUCCESS) {
            huffman_node_destroy(new_node);
            return deserialization_status;
        }

        curr_node->right = new_node;

        curr_node->is_leaf = 0;
    } else {

        unsigned char byte = 0;

        
        for(int i = 0; i < 8; i++) {
            
            unsigned int bit;
            int bit_read_status = bitset_get_bit(tree_binary_rep, *bits_read, &bit);
            if(bit_read_status == BITSET_OUT_OF_BOUNDS) {
                return HUFFMAN_ENCODING_ERROR;
            }
            (*bits_read)++;

            if(bit == 1) {  
                unsigned char mask = 1 << (8 - i - 1);      
                byte |= mask;
            }
        }

        curr_node->which_char = byte;
    }

    return HUFFMAN_SUCCESS;
}
Exemple #4
0
void work(param_t param)
{
printf("SPU[%u] work()\n", param.proc);
	unsigned int inbox, offset;
    unsigned int *in = malloc_align(param.bitset_size, ALIGN_EXP);
    unsigned int *out = malloc_align(param.bitset_size, ALIGN_EXP);
    unsigned int *use = malloc_align(param.bitset_size, ALIGN_EXP);
    unsigned int *def = malloc_align(param.bitset_size, ALIGN_EXP);
    if(in == NULL || out == NULL || use == NULL || def == NULL) {
	    printf("malloc_align() failed\n");
	    exit(1);
    }
    unsigned tag_1, tag_2, tag_3, tag_4;
    unsigned int tag_id;   
    /* Reserve a tag for application usage */ 
    if ((tag_1 = mfc_tag_reserve()) == MFC_TAG_INVALID) 
    {
        printf("ERROR: unable to reserve a tag_1\n"); 
    }
    if ((tag_2 = mfc_tag_reserve()) == MFC_TAG_INVALID) 
    {
        printf("ERROR: unable to reserve a tag_2\n"); 
    }
    if ((tag_3 = mfc_tag_reserve()) == MFC_TAG_INVALID) 
    {
        printf("ERROR: unable to reserve a tag_3\n"); 
    }
    if ((tag_4 = mfc_tag_reserve()) == MFC_TAG_INVALID) 
    {
        printf("ERROR: unable to reserve a tag_4\n");
    } 

	while(1) {
		inbox = spu_read_in_mbox();

        if(inbox == UINT_MAX)
        {
            printf("SPU[%u] received exit signal.. exiting.\n", param.proc);
            return;
        }
		
		offset = param.bitset_subsets*inbox;

		mfc_get(in,  (unsigned int) (param.bs_in_addr  + offset), param.bitset_size, tag_1, 0, 0);
		mfc_get(out, (unsigned int) (param.bs_out_addr + offset), param.bitset_size, tag_2, 0, 0);
		mfc_get(use, (unsigned int) (param.bs_use_addr + offset), param.bitset_size, tag_3, 0, 0);
		mfc_get(def, (unsigned int) (param.bs_def_addr + offset), param.bitset_size, tag_4, 0, 0);
		mfc_write_tag_mask(1 << tag_1 | 1 << tag_2 | 1 << tag_3 | 1 << tag_4);
		mfc_read_tag_status_all();

D(printf("SPU[%d] index: %u  bitset_subsets: %u  offset: %u\n", param.proc, inbox, param.bitset_subsets, offset);
printf("SPU[%d]\t&use: %p\n\t&def: %p\n\t&out: %p\n\t&in:  %p\n", param.proc, (void*)param.bs_use_addr, (void*)param.bs_def_addr, (void*)param.bs_out_addr, (void*)param.bs_in_addr);
void *tmp_ptr = (void*) (param.bs_use_addr  + offset);
printf("SPU[%d] read\t\t&%p = use(%p)={", param.proc, (void*)use, tmp_ptr);
	for (int i = 0; i < 100; ++i){
	if ( bitset_get_bit(use, i) ) {
			printf("%d ", i);
		}
	}
printf("}\n");
tmp_ptr = (void*) (param.bs_def_addr  + offset);
printf("SPU[%d] read\t\t&%p = def(%p)={", param.proc, (void*)def, tmp_ptr);
	for (int i = 0; i < 100; ++i){
	if ( bitset_get_bit(def, i) ) {
			printf("%d ", i);
		}
	}
printf("}\n");
tmp_ptr = (void*) (param.bs_out_addr  + offset);
printf("SPU[%d] read\t\t&%p = out(%p)={", param.proc, (void*)out, tmp_ptr);
	for (int i = 0; i < 100; ++i){
	if ( bitset_get_bit(out, i) ) {
			printf("%d ", i);
		}
	}
printf("}\n");
tmp_ptr = (void*) (param.bs_in_addr  + offset);
printf("SPU[%d] read\t\t&%p = in (%p)={", param.proc, (void*)in, tmp_ptr);
	for (int i = 0; i < 100; ++i){
	if ( bitset_get_bit(in, i) ) {
			printf("%d ", i);
		}
	}
printf("}\n"));
		bitset_megaop(param, in, out, use, def);		

D(printf("SPU[%d] calculated\tin={", param.proc);
	for (int i = 0; i < 100; ++i){
	if ( bitset_get_bit(in, i) ) {
			printf("%d ", i);
		}
	}
printf("}\n");)

		mfc_put(in, (unsigned int)  (param.bs_in_addr  +  offset), param.bitset_size, tag_1, 0, 0);
		mfc_write_tag_mask(1 << tag_1);
		mfc_read_tag_status_all();

		spu_write_out_intr_mbox(inbox);
	}