Skip to content
Snippets Groups Projects
Commit 7685850a authored by lang0909's avatar lang0909
Browse files

Add sce212sim.c

parent 07082b9d
Branches
No related tags found
No related merge requests found
Pipeline #2191 canceled
/***************************************************************/
/* */
/* MIPS-32 Instruction Level Simulator */
/* */
/* SCE212 Ajou University */
/* sce212.c */
/* Adapted from CS311@KAIST */
/* */
/***************************************************************/
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
/* DO NOT MODIFY THIS FILE! */
/* You should only the parse.c and run.c files! */
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include "util.h"
#include "parse.h"
#include "run.h"
/**************************************************************/
/* */
/* Procedure : load_program */
/* */
/* Purpose : Load program and service routines into mem. */
/* */
/**************************************************************/
void load_program(char *program_filename) {
FILE *prog;
int ii, word;
char buffer[33];
//to notifying data & text segment size
int flag = 0;
int text_index = 0;
int data_index = 0;
/* Open program file. */
prog = fopen(program_filename, "r");
if (prog == NULL) {
printf("Error: Can't open program file %s\n", program_filename);
exit(-1);
}
/* Read in the program. */
ii = 0;
//read 32bits + '\0' = 33
while (fgets(buffer,33,prog) != NULL) {
if (flag == 0) {
//check text segment size
text_size = fromBinary(buffer);
NUM_INST = text_size/4;
//initial memory allocation of text segment
INST_INFO = malloc(sizeof(instruction)*(text_size/4));
init_inst_info(text_size/4);
} else if (flag == 1) {
//check data segment size
data_size = fromBinary(buffer);
//initial memory allocation of data segment
//if you would like to add data, you can re-allocate memory.
/* data_seg = malloc(sizeof(uint32_t)*(data_size/4)); */
} else {
if(ii < text_size) {
INST_INFO[text_index++] = parsing_instr(buffer, ii);
} else if(ii < text_size + data_size) {
parsing_data(buffer, ii-text_size);
} else {
//Do not enter this case
//assert(0);
//However, there is a newline in the input file
}
ii += 4;
}
flag++;
}
CURRENT_STATE.PC = MEM_TEXT_START;
//printf("Read %d words from program into memory.\n\n", ii/4);
}
/************************************************************/
/* */
/* Procedure : initialize */
/* */
/* Purpose : Load machine language program */
/* and set up initial state of the machine. */
/* */
/************************************************************/
void initialize(char *program_filename) {
int i;
init_memory();
load_program(program_filename);
RUN_BIT = TRUE;
}
/***************************************************************/
/* */
/* Procedure : main */
/* */
/***************************************************************/
int main(int argc, char *argv[]) {
char** tokens;
int count = 1;
int addr1 = 0;
int addr2 = 0;
int num_inst = 0;
int i = 100; //for loop
int mem_dump_set = 0;
int debug_set = 0;
int num_inst_set = 0;
/* Error Checking */
if (argc < 2) {
printf("Error: usage: %s [-m addr1:addr2] [-d] [-n num_instr] inputBinary\n", argv[0]);
exit(1);
}
initialize(argv[argc-1]);
//for checking parse result
//print_parse_result();
while (count != argc-1) {
if (strcmp(argv[count], "-m") == 0) {
tokens = str_split(argv[++count],':');
addr1 = (int)strtol(*(tokens), NULL, 16);
addr2 = (int)strtol(*(tokens+1), NULL, 16);
mem_dump_set = 1;
} else if(strcmp(argv[count], "-d") == 0) {
debug_set = 1;
} else if(strcmp(argv[count], "-n") == 0) {
num_inst = (int)strtol(argv[++count], NULL, 10);
num_inst_set = 1;
} else{
printf("Error: usage: %s [-m addr1:addr2] [-d] [-n num_instr] inputBinary\n", argv[0]);
exit(1);
}
count++;
}
if (num_inst_set) {
i = num_inst;
}
if (debug_set) {
printf("Simulating for %d cycles...\n\n", i);
for(; i > 0; i--){
cycle();
rdump();
if (mem_dump_set) {
mdump(addr1, addr2);
}
}
} else {
run(i);
rdump();
if (mem_dump_set) {
mdump(addr1, addr2);
}
}
return 0;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment