Esempio n. 1
0
instruction parsing_instr(const char *buffer, const int index) {
    instruction i = {0, };
    
    uint32_t b = fromBinary((char*)buffer);
    mem_write_32(MEM_TEXT_START + index, b);

    i.value = b;
    i.opcode = (short)(b >> 26);
    if (i.opcode == 0x02 || i.opcode == 0x03) { // J Type
	i.r_t.target = b << 6 >> 6;
	return i;
    }
Esempio n. 2
0
File: cache.c Progetto: Cybuster/cpu
int cache_line_write_to_mem (uint8 *data, pa_t p_addr) 
{
	int i, rc;

	for (i = 0; i < 64; i++) {
		rc = mem_write_32 (p_addr, ((uint32 *)data)[i]);
		if (rc < 0) {	
			printf ("ERROR: mem_write_32 failed for p_addr %x\n", p_addr);
			return -1;
		}
	}
	return 0;
}
Esempio n. 3
0
File: run.c Progetto: Suckzoo/CS311
mem_wb_reg run_MEM()
{
	ex_mem_reg EX_MEM = CURRENT_STATE.EX_MEM;
	mem_wb_reg reg;
	mem_wb_reg MEM_WB = CURRENT_STATE.MEM_WB;
	//handling lw, sw
	if(EX_MEM.cMemRd)
	{
		//TODO: read from memory!(hazardous!)
		if(DEBUG) printf("EX_MEM ALU: %d\n",EX_MEM.ALUResult);
		reg.memV = mem_read_32(EX_MEM.ALUResult);
		if(DEBUG) printf("reg.memV: %d\n",reg.memV);
	}
	if(EX_MEM.cMemWrt)
	{
		//TODO: write to memory!
		if(MEM_WB.cRegWrt && EX_MEM.cMemWrt && MEM_WB.wrtReg == EX_MEM.wrtReg)
		{
			if(noforward_set)
			{
				CURRENT_STATE.MEM_bubble_count = 1;
				memset(&reg, 0, sizeof(reg));
				return reg;
			}
			mem_write_32(EX_MEM.ALUResult, MEM_WB.memV);
		}
		else
			mem_write_32(EX_MEM.ALUResult, EX_MEM.wrtData);
	}
	reg.PC = EX_MEM.PC;
	if(EX_MEM.cMemRd) reg.ALUResult = reg.memV;
	else reg.ALUResult = EX_MEM.ALUResult;
	reg.wrtReg = EX_MEM.wrtReg;
	reg.cMem2Reg = EX_MEM.cMem2Reg;
	reg.cRegWrt = EX_MEM.cRegWrt;
	return reg;
}
Esempio n. 4
0
instruction parsing_instr(const char *buffer, const int index) {
    instruction instr = INST_INFO[index];
    uint32_t inst_binary = fromBinary((char *) buffer);

    mem_write_32(MEM_TEXT_START + index, inst_binary);

    instr.value = inst_binary;
    instr.opcode = inst_binary >> 26;
    switch (instr.opcode) {
        // R-type
        case 0:
            instr.func_code = inst_binary & 0x3F;
            switch (instr.func_code) {
                // JR
                case 8:
                    instr.r_t.r_i.rs = (inst_binary >> 21) & 0x1F;
                    break;
                // SLL
                case 0:
                // SRL
                case 2:
                    instr.r_t.r_i.rt = (inst_binary >> 16) & 0x1F;
                    instr.r_t.r_i.r_i.r.rd = (inst_binary >> 11) & 0x1F;
                    instr.r_t.r_i.r_i.r.shamt = (inst_binary >> 6) & 0x1F;
                    break;
                // ADDU, AND, NOR, OR, SLTU, SUBU
                default:
                    instr.r_t.r_i.rs = (inst_binary >> 21) & 0x1F;
                    instr.r_t.r_i.rt = (inst_binary >> 16) & 0x1F;
                    instr.r_t.r_i.r_i.r.rd = (inst_binary >> 11) & 0x1F;
                    break;
            }
            break;
        // J-type
        case 2:
        case 3:
            instr.r_t.target = inst_binary & 0x3FFFFFF;
            break;
        // I-type
        default:
            instr.r_t.r_i.rt = (inst_binary >> 16) & 0x1F;
            instr.r_t.r_i.r_i.imm = inst_binary & 0xFFFF;
            // Not LUI
            if (instr.opcode != 15) {
                instr.r_t.r_i.rs = (inst_binary >> 21) & 0x1F;
            }
            break;
    }
Esempio n. 5
0
/*                                                       
 * Procedure : load_program                               
 * Purpose   : Load program and service routines into mem.   
 */                                                           
void load_program(FILE *prog) {
  int ii, word;

  /* Open program file. */
  if (prog == NULL) {
    printf("[Error] Can't open program file\n");
    exit(-1);
  }

  /* Read in the program. */
  ii = 0;
  while (fscanf(prog, "%x\n", &word) != EOF) {
    mem_write_32(MEM_TEXT_START + ii, word);
    ii += 4;
  }

  CURRENT_STATE.PC = MEM_TEXT_START;

  return;
}
Esempio n. 6
0
void process_instruction(){

    /* Your code */
  CURRENT_STATE.PC+=4;
  int index =  (CURRENT_STATE.PC - MEM_TEXT_START - 4)/4 ;
//  printf(" index %d, NUM_INST %d \n",index,NUM_INST);
  if( index+1 >= NUM_INST ) {
    RUN_BIT=FALSE;
//    printf("Run bit unset pc: %x\n",CURRENT_STATE.PC);
  }
  short opcode = INST_INFO[ index ].opcode;
  short func_code = INST_INFO[ index ].func_code;
  char rs;
  char rt;
  char rd;
  unsigned int rs_data;
  unsigned int rt_data;
  unsigned int rd_data;
  char shamt;
  unsigned int imm;

  switch(opcode) {
    case 0:  // 000000 ~

      switch(func_code) {
        case 0:   // sll
          rt = INST_INFO[ index ].r_t.r_i.rt;
          rd = INST_INFO[ index ].r_t.r_i.r_i.r.rd;
          shamt = INST_INFO[ index ].r_t.r_i.r_i.r.shamt;
          CURRENT_STATE.REGS[ rd ] = CURRENT_STATE.REGS[ rt ] << shamt;
          break;
        case 2:   //  srl
          rt = INST_INFO[ index ].r_t.r_i.rt;
          rd = INST_INFO[ index ].r_t.r_i.r_i.r.rd;
          shamt = INST_INFO[ index ].r_t.r_i.r_i.r.shamt;
          CURRENT_STATE.REGS[ rd ] = CURRENT_STATE.REGS[ rt ] >> shamt;
          break;
        case 8:  //  jr
          CURRENT_STATE.PC = CURRENT_STATE.REGS[ INST_INFO[ index ].r_t.r_i.rs ];
          break;
        case 33: //  addu
          rs = INST_INFO[ index ].r_t.r_i.rs;
          rt = INST_INFO[ index ].r_t.r_i.rt;
          rd = INST_INFO[ index ].r_t.r_i.r_i.r.rd;
          CURRENT_STATE.REGS[ rd ] = CURRENT_STATE.REGS[ rs ]+ CURRENT_STATE.REGS[ rt ];
          break;
        case 35: //  subu
          rs = INST_INFO[ index ].r_t.r_i.rs;
          rt = INST_INFO[ index ].r_t.r_i.rt;
          rd = INST_INFO[ index ].r_t.r_i.r_i.r.rd;
          CURRENT_STATE.REGS[ rd ] = CURRENT_STATE.REGS[ rs ] - CURRENT_STATE.REGS[ rt ];
          break;
        case 36: //  and
          rs = INST_INFO[ index ].r_t.r_i.rs;
          rt = INST_INFO[ index ].r_t.r_i.rt;
          rd = INST_INFO[ index ].r_t.r_i.r_i.r.rd;
          CURRENT_STATE.REGS[ rd ] = CURRENT_STATE.REGS[ rs ] & CURRENT_STATE.REGS[ rt ];
          break;
        case 37: //  or
          rs = INST_INFO[ index ].r_t.r_i.rs;
          rt = INST_INFO[ index ].r_t.r_i.rt;
          rd = INST_INFO[ index ].r_t.r_i.r_i.r.rd;
          CURRENT_STATE.REGS[ rd ] = (CURRENT_STATE.REGS[ rs ] | CURRENT_STATE.REGS[ rt ]);
          break;
        case 39: //  nor
          rs = INST_INFO[ index ].r_t.r_i.rs;
          rt = INST_INFO[ index ].r_t.r_i.rt;
          rd = INST_INFO[ index ].r_t.r_i.r_i.r.rd;
          CURRENT_STATE.REGS[ rd ] = ~(CURRENT_STATE.REGS[ rs ] | CURRENT_STATE.REGS[ rt ]);
          break;
        case 43: //  sltu
          rs = INST_INFO[ index ].r_t.r_i.rs;
          rt = INST_INFO[ index ].r_t.r_i.rt;
          rd = INST_INFO[ index ].r_t.r_i.r_i.r.rd;
          if( CURRENT_STATE.REGS[rs] < CURRENT_STATE.REGS[rt] ) {
            CURRENT_STATE.REGS[rd] = 1;
          }
          else {
            CURRENT_STATE.REGS[rd] = 0;
          }

          break;
      }
      break;
    case 2: // j
      CURRENT_STATE.PC = (CURRENT_STATE.PC & 0xf0000000) | INST_INFO[ index ].r_t.target<<2;
      break;
    case 3: // jal
      CURRENT_STATE.REGS[31] = CURRENT_STATE.PC;
      CURRENT_STATE.PC = (CURRENT_STATE.PC & 0xf0000000) | INST_INFO[ index ].r_t.target<<2;
      break;
    case 4: // beq
      rs_data = CURRENT_STATE.REGS[ INST_INFO[ index ].r_t.r_i.rs ];
      rt_data = CURRENT_STATE.REGS[ INST_INFO[ index ].r_t.r_i.rt ];
      imm = INST_INFO[ index ].r_t.r_i.r_i.imm;
      if( rs_data == rt_data  ) {
        CURRENT_STATE.PC += imm<<2;
      }
      break;
    case 5: // bne
      rs_data = CURRENT_STATE.REGS[ INST_INFO[ index ].r_t.r_i.rs ];
      rt_data = CURRENT_STATE.REGS[ INST_INFO[ index ].r_t.r_i.rt ];
      imm = INST_INFO[ index ].r_t.r_i.r_i.imm;
      if( rs_data != rt_data  ) {
        CURRENT_STATE.PC += imm<<2;
      }
      break;
    case 9: // addiu
      rs_data = CURRENT_STATE.REGS[ INST_INFO[ index ].r_t.r_i.rs ];
      imm =   INST_INFO[ index ].r_t.r_i.r_i.imm;
//      printf("rs_data is %d imm is %hd \n",rs_data,imm);
      CURRENT_STATE.REGS[ INST_INFO[ index ].r_t.r_i.rt ] = rs_data+imm;
      break;
    case 11:// sltiu
      rs_data = CURRENT_STATE.REGS[ INST_INFO[ index ].r_t.r_i.rs ];
      imm =   INST_INFO[ index ].r_t.r_i.r_i.imm;
//      printf("imm is %x\n", imm);
      if( rs_data< imm) {
        CURRENT_STATE.REGS[ INST_INFO[ index ].r_t.r_i.rt ] = 1;
      } else {
        CURRENT_STATE.REGS[ INST_INFO[ index ].r_t.r_i.rt ] = 0;
      }
      break;
    case 12:// andi
      rs_data = CURRENT_STATE.REGS[ INST_INFO[ index ].r_t.r_i.rs ];
      imm =  (unsigned short) INST_INFO[ index ].r_t.r_i.r_i.imm;
//      printf(" rs_data %p imm %p",rs_data,imm);
      CURRENT_STATE.REGS[ INST_INFO[ index ].r_t.r_i.rt ] = rs_data&imm;
      break;
    case 13:// ori
//      printf(" reg num is %hd\n",INST_INFO[ index ].r_t.r_i.rs );
      rs_data = CURRENT_STATE.REGS[ INST_INFO[ index ].r_t.r_i.rs ];
//      printf("rs is %p \n",rs);
      imm =  (unsigned short) INST_INFO[ index ].r_t.r_i.r_i.imm;
      CURRENT_STATE.REGS[ INST_INFO[ index ].r_t.r_i.rt ] = rs_data|imm;
      break;
    case 15:// lui
      imm =  (unsigned short) INST_INFO[ index ].r_t.r_i.r_i.imm;
//      printf("rt is %hd\n",INST_INFO[ index ].r_t.r_i.rt); 
      CURRENT_STATE.REGS[ INST_INFO[ index ].r_t.r_i.rt ] = imm<<16;
//      printf("imm<<16 is p\n",imm<<16);
      break;
    case 35:// lw
      rt = INST_INFO[ index ].r_t.r_i.rt;
      rs_data = CURRENT_STATE.REGS[ INST_INFO[ index ].r_t.r_i.rs ];
      imm = INST_INFO[ index ].r_t.r_i.r_i.imm;
      CURRENT_STATE.REGS[ rt ] = mem_read_32( rs_data+imm );
      break;
    case 43:// sw
      rt_data = CURRENT_STATE.REGS[ INST_INFO[ index ].r_t.r_i.rt ];
      rs_data = CURRENT_STATE.REGS[ INST_INFO[ index ].r_t.r_i.rs ];
      imm = INST_INFO[ index ].r_t.r_i.r_i.imm;
      mem_write_32( imm+rs_data, rt_data );
      break;
  }


}
Esempio n. 7
0
void parsing_data(const char *buffer, const int index)
{
    uint32_t word;
    word = fromBinary(buffer);
    mem_write_32(MEM_DATA_START + index, word);
}
Esempio n. 8
0
instruction parsing_instr(const char *buffer, const int index)
{
    instruction instr;
    char opcode[7],rs[6],rt[6],rd[6],shamt[6],imm[17],target[27],func_code[7] = {0};
    int word;
    word = fromBinary(buffer);
    mem_write_32(MEM_TEXT_START + index, word);
    sscanf(buffer, "%6s", opcode);

    instr.value = word;
    instr.opcode = (short)fromBinary(opcode);

    switch(instr.opcode)
    {
	//Type I
	case 0x9:		//(0x001001)ADDIU
	case 0xc:		//(0x001100)ANDI
	case 0xf:		//(0x001111)LUI	
	case 0xd:		//(0x001101)ORI
	case 0xb:		//(0x001011)SLTIU
	case 0x23:		//(0x100011)LW	
	case 0x2b:		//(0x101011)SW
	case 0x4:		//(0x000100)BEQ
	case 0x5:		//(0x000101)BNE
	    sscanf(buffer,"%6s%5s%5s%16s",opcode,rs,rt,imm);
	    instr.r_t.r_i.rs = (unsigned char)fromBinary(rs);
	    instr.r_t.r_i.rt = (unsigned char)fromBinary(rt);
	    instr.r_t.r_i.r_i.imm = (short)fromBinary(imm);
	    break;

	    //TYPE R
	case 0x0:		//(0x000000)ADDU, AND, NOR, OR, SLTU, SLL, SRL, SUBU  if JR
	    sscanf(buffer,"%6s%5s%5s%5s%5s%6s",opcode,rs,rt,rd,shamt,func_code);
	    instr.func_code = (short)fromBinary(func_code);

	    //JR exception
	    if(instr.func_code == 0x8)
		instr.r_t.r_i.rs = (unsigned char)fromBinary(rs);
	    else
	    {
		instr.r_t.r_i.rs = (unsigned char)fromBinary(rs);
		instr.r_t.r_i.rt = (unsigned char)fromBinary(rt);
		instr.r_t.r_i.r_i.r.rd = (unsigned char)fromBinary(rd);
		instr.r_t.r_i.r_i.r.shamt = (unsigned char)fromBinary(shamt);
	    }
	    break;

	    //TYPE J
	case 0x2:		//(0x000010)J
	case 0x3:		//(0x000011)JAL
	    sscanf(buffer,"%6s%26s",opcode,target);
	    instr.r_t.target = fromBinary(target);
	    break;

	default:
	    printf("Not available instruction\n");
	    assert(0);
    }

    return instr;
}
Esempio n. 9
0
void parsing_data(const char *buffer, const int index) {
    
    mem_write_32 (MEM_DATA_START + index, strtol (buffer, NULL, 2));

}
Esempio n. 10
0
void parsing_data(const char *buffer, const int index) {

	mem_write_32(0x10000000+index, fromBinary((char *)buffer));
    /* Your code */

}