int get_twos_complement(string s) {
	int num = 0;
	if (s[0] == '0') {
		return get_int_from_string(s);
	}
	else {
		// if 2'complement of a negative no y is x then ~x + 1 = -y
		for(int i = 0; i < s.size(); ++i) {
			s[i] = '0' + (1 - (s[i] - '0'));
		}
		num = get_int_from_string(s);
		num++;
		return (-num);
	}
}
Beispiel #2
0
static void setDummyTarget(void) {
    int x, y;
    char buf[50];

    consume_uart_arg("x", buf, 50);
    if (!get_int_from_string(buf, &x)) {
        xil_printf("Not a valid integer: %s\r\n", buf);
        return;
    }
    consume_uart_arg("y", buf, 50);
    if (!get_int_from_string(buf, &y)) {
        xil_printf("Not a valid integer: %s\r\n", buf);
        return;
    }

    generate_debug_target(x,y);
}
Beispiel #3
0
static void SetObjId(void) {
    char buf[50];
    int result;

    consume_uart_arg("obj id [0-255]", buf, 50);
    if (get_int_from_string(buf, &result)) {
        SetObjIdValue(result);
    } else {
        xil_printf("Not a valid integer: %s\r\n", buf);
    }
}
Beispiel #4
0
static void SetRedThreshold(void) {
    char buf[50];
    int result;

    consume_uart_arg("thresh", buf, 50);
    if (get_int_from_string(buf, &result)) {
        SetRedThresholdValue(result);
    } else {
        xil_printf("Not a valid integer: %s\r\n", buf);
    }
}
Beispiel #5
0
static void SetSizeThreshold(void) {
    char buf[50];
    int result;

    consume_uart_arg("size threshold:", buf, 50);
    if (get_int_from_string(buf, &result)) {
        setMinObjSize(result);
    } else {
        xil_printf("Not a valid integer: %s\r\n", buf);
    }
}
void Simulator::decode(pipeline_instr& p){


	string IR = p.IR;
	p.opcode = get_int_from_string(IR.substr(0,3));
	p.immediate = (get_int_from_string(IR.substr(3,1)) >= 1)?true:false;

	if(p.opcode == 7 && p.immediate == 0)
		p.opcode = 7;

	if (p.opcode == 5){ // jump instruction
		p.op1 = get_twos_complement(IR.substr(4,8));
	}
	else if (p.opcode == 6){ // BEQZ
		p.op1 = get_int_from_string(IR.substr(4,4));
		p.op2 = get_twos_complement(IR.substr(8,8));

	}
	else if (p.opcode <= 4) { // add, sub, mul, ld,st
		p.op1 = get_int_from_string(IR.substr(4,4));
		p.op2 = get_int_from_string(IR.substr(8,4));
		if (p.immediate) {
			p.op3 = get_twos_complement(IR.substr(12,4));
		}
		else {
			p.op3 = get_int_from_string(IR.substr(12,4));
		}

	}
}
Beispiel #7
0
static void TestArgs(void) {
    char buf[50];
    int result;
    consume_uart_arg("derp", buf, 50);

    xil_printf("You typed out: %s\r\n", buf);

    consume_uart_arg("num", buf, 50);
    if (get_int_from_string(buf, &result)) {
        xil_printf("Got number: %d\r\n", result);
    } else {
        xil_printf("Not a valid integer: %s\r\n", buf);
    }
}
uint32      http_fill_body_data(HTTP_RESPONSE* response, const char* p_data, uint32 data_len)
{
    uint32 ret = SUCCEEDED;
    uint32 content_len = (uint32)-1;
    uint32 left = 0;
    char*  body_pos = 0, *is_chunked = 0, *temp_content = 0;
    uint32 number_len = 0, chunked_len = 0;
    //ret = get_http_response_int_value_for_key(response->header.header, "Content-Length", &content_len);
    //if (ret != SUCCEEDED)
    content_len = response->header.content_len;
    if (content_len == (uint32)-1 && response->header.chunked == 0)
    {
        return FAILED;
    }

    if(content_len != (uint32)-1)
    {
        if (response->content == 0)
        {
            response->content = malloc(content_len);
            response->current_len = 0;
            response->content_len = content_len;
            response->chunk_remaind = content_len;
        }
        if (data_len <= response->chunk_remaind)
        {
            memcpy(response->content + response->current_len, p_data, data_len);
            response->current_len += data_len;
            response->chunk_remaind -= data_len;
        }
        else
        {
            memcpy(response->content + response->current_len, p_data, response->chunk_remaind);
            response->current_len += response->chunk_remaind;
            response->chunk_remaind -= response->chunk_remaind;
        }
        printf("on http_fill_body_data remaind:%d\r\n", response->chunk_remaind);
        return response->chunk_remaind <= 0 ? 0: 1;
    }
    else
    {
        while(1)
        {
            if (response->chunk_remaind > 0)
            {
                if (check_and_ensure_enough_response(response, response->chunk_remaind) != SUCCEEDED)
                    return 0;
                if (response->chunk_remaind > data_len)
                {
                    memcpy(response->content + response->current_len, p_data, data_len);
                    response->current_len += data_len;
                    response->chunk_remaind -= data_len;
                    return 1;
                }
                memcpy(response->content + response->current_len, p_data, response->chunk_remaind);
                response->current_len += response->chunk_remaind;
                data_len -= response->chunk_remaind;
                p_data += response->chunk_remaind;
                response->chunk_remaind = 0;
                if (data_len > 2)
                {
                    data_len -= 2;
                    p_data += 2;
                }
            }
            ret = get_int_from_string(p_data, data_len, &chunked_len, &number_len);
            if (ret != SUCCEEDED) return 1;
            printf("on http_fill_body_data next chunk length:%d\r\n", chunked_len);
            data_len -= (number_len + 2); p_data += (number_len + 2);
            if (chunked_len == 0)
            {
                printf("on http_fill_body_data find the last chunk: %s\r\nremain_data:%d\r\n", p_data, data_len);
                if (p_data[0] == '\r' && p_data[1] == '\n')
                {
                    printf("on http_fill_body_data all done...\r\n");
                    p_data += 2; data_len -= 2;
                    if (data_len > 0)
                        http_fill_foottag(response, p_data, data_len);
                    return 0;
                }
                else
                    return 1;
            }
            if (check_and_ensure_enough_response(response, chunked_len) != SUCCEEDED)
                return 0;
            if (chunked_len > data_len)
            {
                memcpy(response->content + response->current_len, p_data, data_len);
                response->current_len += data_len;
                response->chunk_remaind = chunked_len - data_len;
                return 1;
            }
            else
            {
                memcpy(response->content + response->current_len, p_data, chunked_len);
                response->chunk_remaind = 0;
                response->current_len += chunked_len;
                p_data += (chunked_len + 2); data_len -= (chunked_len + 2);
            }
        }
    }
}
int Simulator::decode(int ins_index){

	bool is_raw = false;

	if (prev_raw_flag){
		prev_raw_flag = false;
		temp_fetch = ins_pipeline[ins_index];
		ins_pipeline[ins_index].opcode = 7;
		ins_pipeline[ins_index].IR = "1111000000000000";
	}


	if(prev_ins_decoded_is_branch){
		prev_ins_decoded_is_branch = false;
		ins_pipeline[ins_index].opcode = 7;
		ins_pipeline[ins_index].IR = "1111000000000000";
		if (!branch_pred_enabled) {
			pc -= 2;
		}
	}

	string IR = ins_pipeline[ins_index].IR;
	ins_pipeline[ins_index].opcode = get_int_from_string(IR.substr(0,3));
	ins_pipeline[ins_index].immediate = (get_int_from_string(IR.substr(3,1)) >= 1)?true:false;

	out << ins_pipeline[ins_index].IR << endl;
	if(ins_pipeline[ins_index].opcode == 7 && ins_pipeline[ins_index].immediate == 0)
		ins_pipeline[ins_index].opcode = 8;

	if (ins_pipeline[ins_index].opcode == 5){ // jump instruction
		ins_pipeline[ins_index].op1 = get_twos_complement(IR.substr(4,8));
		prev_ins_decoded_is_branch = true;
		control_flag = true;
		if (branch_pred_enabled) {
			control_flag = false;
			if (bp.count(ins_pipeline[ins_index].pc) == 0) {
				bp[ins_pipeline[ins_index].pc] = BranchPredictor();
				btb[ins_pipeline[ins_index].pc] = ins_pipeline[ins_index].pc + 2;
			}
			if (bp[ins_pipeline[ins_index].pc].predict()) {
			   pc = btb[ins_pipeline[ins_index].pc];
			}
			else {
			   prev_ins_decoded_is_branch = false;
			}
		}			
	}
	else if (ins_pipeline[ins_index].opcode == 6){ // BEQZ
		ins_pipeline[ins_index].op1 = get_int_from_string(IR.substr(4,4));
		ins_pipeline[ins_index].op2 = get_twos_complement(IR.substr(8,8));
		prev_ins_decoded_is_branch = true;
		control_flag = true;
		
		if (branch_pred_enabled) {
			control_flag = false;
			if (bp.count(ins_pipeline[ins_index].pc) == 0) {
				bp[ins_pipeline[ins_index].pc] = BranchPredictor();
				btb[ins_pipeline[ins_index].pc] = ins_pipeline[ins_index].pc + 2;
			}
			if (bp[ins_pipeline[ins_index].pc].predict()) {
			   pc = btb[ins_pipeline[ins_index].pc];
			}
			else {
			   prev_ins_decoded_is_branch = false;
			}
		}			
		if (register_status[ins_pipeline[ins_index].op1] != -1){
			is_raw = true;
			wait_on_reg[ins_pipeline[ins_index].op1] = true;
			ins_pipeline[ins_index].wait_for_op1 = true;
		}

	}
	else if (ins_pipeline[ins_index].opcode <= 4) { // add, sub, mul, ld,st
		ins_pipeline[ins_index].op1 = get_int_from_string(IR.substr(4,4));
		ins_pipeline[ins_index].op2 = get_int_from_string(IR.substr(8,4));
		if (ins_pipeline[ins_index].immediate) {
			ins_pipeline[ins_index].op3 = get_twos_complement(IR.substr(12,4));
		}
		else {
			ins_pipeline[ins_index].op3 = get_int_from_string(IR.substr(12,4));
		}


		if( (ins_pipeline[ins_index].opcode <= 2 && ins_pipeline[ins_index].immediate) || ins_pipeline[ins_index].opcode == 3 )
			if (register_status[ins_pipeline[ins_index].op2] != -1){
				is_raw = true;
				ins_pipeline[ins_index].wait_for_op2 = true;
				wait_on_reg[ins_pipeline[ins_index].op2] = true;
			}

		if( (ins_pipeline[ins_index].opcode <=2 && !ins_pipeline[ins_index].immediate) ){
			if (register_status[ins_pipeline[ins_index].op2] != -1){
				wait_on_reg[ins_pipeline[ins_index].op2] = true;
				is_raw = true;
				ins_pipeline[ins_index].wait_for_op2 = true;
			} 
			if (register_status[ins_pipeline[ins_index].op3] != -1){
				wait_on_reg[ins_pipeline[ins_index].op3] = true;
				is_raw = true;
				ins_pipeline[ins_index].wait_for_op3 = true;
			}
		}



		if(ins_pipeline[ins_index].opcode == 4) {

			if (register_status[ins_pipeline[ins_index].op1] != -1){
				wait_on_reg[ins_pipeline[ins_index].op1] = true;
				is_raw = true;
				ins_pipeline[ins_index].wait_for_op1 = true;
			}
			if (register_status[ins_pipeline[ins_index].op2] != -1){
				wait_on_reg[ins_pipeline[ins_index].op2] = true;
				is_raw = true;
				ins_pipeline[ins_index].wait_for_op2 = true;
			}
		}

	}

	if (is_raw){
		raw_flag = true;
		prev_raw_flag = true;
		temp_decode = ins_pipeline[ins_index];
		ins_pipeline[ins_index].opcode = 7;
		ins_pipeline[ins_index].IR = "1111000000000000";
	}

	else{

		if(ins_pipeline[ins_index].opcode <= 3)
			register_status[ins_pipeline[ins_index].op1] = ins_pipeline[ins_index].pc;
	}



	return 1;
}