CPU: Made the cpu structure, pipelined/non-pipelined selectable at runtime with a flag
This commit is contained in:
parent
48237ccd95
commit
9fbc6bceab
64
cpu.c
64
cpu.c
@ -4,6 +4,10 @@
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
|
||||
/* Known errors:
|
||||
* 1) Exec does the calculations on the first clock cycle, there is a bug where in some cases exec isn't run on the last cycle and because of this the CPU still works.
|
||||
*/
|
||||
|
||||
|
||||
struct fetch_data_t *malloc_fetch_data(){
|
||||
struct fetch_data_t *ret=malloc(sizeof(struct fetch_data_t));
|
||||
@ -606,6 +610,8 @@ int cpu_cycle_clock(struct simdata_t *simdata){
|
||||
free_instr_list(&simdata->cpu_gui_hints->fetching_list);
|
||||
free_instr_list(&simdata->cpu_gui_hints->decoding_list);
|
||||
free_instr_list(&simdata->cpu_gui_hints->executing_list);
|
||||
switch(simdata->cpu_structure){
|
||||
case CPU_STRUCTURE_SIMPLE_PIPELINED:
|
||||
switch(exec(simdata)){
|
||||
case 0: break;
|
||||
case 2: return 4;
|
||||
@ -619,31 +625,39 @@ int cpu_cycle_clock(struct simdata_t *simdata){
|
||||
case 0: break;
|
||||
default: return 3;
|
||||
}
|
||||
// switch(state){
|
||||
// case 0:
|
||||
// switch(fetch(simdata)){
|
||||
// case 0: break;
|
||||
// default: return 3;
|
||||
// }
|
||||
// break;
|
||||
// case 1:
|
||||
// switch(decode(simdata)){
|
||||
// case 0: break;
|
||||
// default: return 2;
|
||||
// }
|
||||
// break;
|
||||
// case 2:
|
||||
// switch(exec(simdata)){
|
||||
// case 0: break;
|
||||
// case 2: return 4;
|
||||
// default: return 1;
|
||||
// }
|
||||
// break;
|
||||
// }
|
||||
// if(state==2)
|
||||
// state=0;
|
||||
// else
|
||||
// state++;
|
||||
break;
|
||||
case CPU_STRUCTURE_SIMPLE_NON_PIPELINED:
|
||||
switch(state){
|
||||
case 0:
|
||||
switch(fetch(simdata)){
|
||||
case 0: break;
|
||||
default: return 3;
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
switch(decode(simdata)){
|
||||
case 0: break;
|
||||
default: return 2;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
switch(exec(simdata)){
|
||||
case 0: break;
|
||||
case 2: return 4;
|
||||
default: return 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if(state==2){
|
||||
if(simdata->decode_data->exec_done)
|
||||
state=0;
|
||||
}else
|
||||
state++;
|
||||
break;
|
||||
default:
|
||||
return 4;
|
||||
|
||||
}
|
||||
simdata->current_clock++;
|
||||
return 0;
|
||||
}
|
||||
|
25
main.c
25
main.c
@ -42,6 +42,8 @@ void help(char* progname){
|
||||
" braille\n"
|
||||
#endif
|
||||
" -o < file > Output simualtion data to specified json log file\n"
|
||||
" -S < cpu structure > Select the structure of the cpu. You can choose one\n"
|
||||
" of the following: simple, pipelined\n"
|
||||
, progname);
|
||||
}
|
||||
|
||||
@ -62,9 +64,13 @@ int main(int argc, char* argd[] ){
|
||||
char *assemble = NULL;
|
||||
enum FB_DRIVER_t fb_driver=FB_BRAILLE;
|
||||
int opt;
|
||||
|
||||
char *json_log_filename=NULL;
|
||||
FILE *JSON_LOG_FILE;
|
||||
while ((opt = getopt(argc, argd, "hi:a:r:o:")) != -1) {
|
||||
|
||||
char *structure="pipelined";
|
||||
|
||||
while ((opt = getopt(argc, argd, "hi:a:r:o:S:")) != -1) {
|
||||
switch (opt) {
|
||||
case 'h':
|
||||
help(argd[0]);
|
||||
@ -94,6 +100,9 @@ int main(int argc, char* argd[] ){
|
||||
case 'o':
|
||||
json_log_filename=optarg;
|
||||
break;
|
||||
case 'S':
|
||||
structure=optarg;
|
||||
break;
|
||||
default:
|
||||
help(argd[0]);
|
||||
return 1;
|
||||
@ -110,6 +119,7 @@ int main(int argc, char* argd[] ){
|
||||
help(argd[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (json_log_filename){
|
||||
JSON_LOG_FILE=fopen(json_log_filename,"w");
|
||||
if(JSON_LOG_FILE==NULL){
|
||||
@ -133,6 +143,19 @@ int main(int argc, char* argd[] ){
|
||||
return 1;
|
||||
}
|
||||
|
||||
if(strcmp("simple",structure)==0){
|
||||
simdata->cpu_structure=CPU_STRUCTURE_SIMPLE_NON_PIPELINED;
|
||||
}else if(strcmp("pipelined",structure)==0){
|
||||
simdata->cpu_structure=CPU_STRUCTURE_SIMPLE_PIPELINED;
|
||||
}else{
|
||||
printf("Invalid cpu structure \"%s\"\n",structure);
|
||||
fclose(rom);
|
||||
free_simdata(simdata);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
if ( assemble != NULL ){
|
||||
/* RUN ASSEMBLER */
|
||||
struct assembler_context_t *assembler_context=malloc_assembler_context();
|
||||
|
Loading…
Reference in New Issue
Block a user