示例#1
0
文件: parse.c 项目: yous/architecture
void print_parse_result()
{
    int i;
    printf("Instruction Information\n");

    for(i = 0; i < text_size/4; i++)
    {
	printf("INST_INFO[%d].value : %x\n",i, INST_INFO[i].value);
	printf("INST_INFO[%d].opcode : %d\n",i, INST_INFO[i].opcode);

	switch(INST_INFO[i].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
		printf("INST_INFO[%d].rs : %d\n",i, INST_INFO[i].r_t.r_i.rs);
		printf("INST_INFO[%d].rt : %d\n",i, INST_INFO[i].r_t.r_i.rt);
		printf("INST_INFO[%d].imm : %d\n",i, INST_INFO[i].r_t.r_i.r_i.imm);
		break;

    	    //TYPE R
	    case 0x0:		//(0x000000)ADDU, AND, NOR, OR, SLTU, SLL, SRL, SUBU  if JR
		printf("INST_INFO[%d].func_code : %d\n",i, INST_INFO[i].func_code);
		printf("INST_INFO[%d].rs : %d\n",i, INST_INFO[i].r_t.r_i.rs);
		printf("INST_INFO[%d].rt : %d\n",i, INST_INFO[i].r_t.r_i.rt);
		printf("INST_INFO[%d].rd : %d\n",i, INST_INFO[i].r_t.r_i.r_i.r.rd);
		printf("INST_INFO[%d].shamt : %d\n",i, INST_INFO[i].r_t.r_i.r_i.r.shamt);
		break;

    	    //TYPE J
	    case 0x2:		//(0x000010)J
	    case 0x3:		//(0x000011)JAL
		printf("INST_INFO[%d].target : %d\n",i, INST_INFO[i].r_t.target);
		break;

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

    printf("Memory Dump - Text Segment\n");
    for(i = 0; i < text_size; i+=4)
	printf("text_seg[%d] : %x\n", i, mem_read_32(MEM_TEXT_START + i));
    for(i = 0; i < data_size; i+=4)
	printf("data_seg[%d] : %x\n", i, mem_read_32(MEM_DATA_START + i));
    printf("Current PC: %x\n", CURRENT_STATE.PC);
}
示例#2
0
文件: shell.c 项目: Skidro/MIPS_SIM
/*                                                         
 * Procedure : mdump                                        
 * Purpose   : Dump a word-aligned region of memory to the   
 *             output file.                                   
 */
void mdump(FILE* dumpsim_file) {
  int start = MEM_REGIONS[1].start;
  int size  = MEM_REGIONS[1].size;
  int i, j;

  fprintf(dumpsim_file, "\nMemory content [0x%08x..0x%08x] :\n", start, start + size);
  fprintf(dumpsim_file, "-------------------------------------\n");

  for (i = 0; i < size/4; i++) {
    for (j = 0; j < 4; j++) {
      fprintf(dumpsim_file, "MEM[%03d] : 0x%08x\t", (i*4 + j), mem_read_32(start + (i*4 + j)));
    }
    fprintf(dumpsim_file, "\n");
  }

  fprintf(dumpsim_file, "\n");
}
示例#3
0
文件: cache.c 项目: Cybuster/cpu
int cache_line_read_from_mem (va_t v_addr, pa_t p_addr) 
{
	uint32 buffer[64]; 
	int i, rc;

	for (i = 0; i < 64; i++) {
		//printf ("reading mem at addr %u\n", p_addr + (i * 4));
		rc = mem_read_32 (p_addr + (i * 4), &buffer[i]);
		if (rc < 0) {	
			printf ("ERROR: mem_read_32 failed for p_addr %x\n", p_addr);
			return -1;
		}
		//printf ("read %u : %x\n", i, buffer[i]);
	}
	
	rc = cache_add_data (v_addr, (p_addr & 0xFFFFF000), (uint8 *)buffer, 256);
	return rc;
}
示例#4
0
文件: run.c 项目: 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;
}
示例#5
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;
  }


}