-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsim.c
65 lines (63 loc) · 2.26 KB
/
sim.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include "sim.h"
int main(int argc, char** argv) {
/* Check input arguments */
if (argc != 7) {
print_usage();
return EXIT_FAILURE;
}
if ((check_files_permission("cfg", argv[1], CHECK_INPUT_FILE) == FAILURE) |
(check_files_permission("memin", argv[2], CHECK_INPUT_FILE) == FAILURE) |
(check_files_permission("memout", argv[3], CHECK_OUTPUT_FILE) == FAILURE) |
(check_files_permission("regout", argv[4], CHECK_OUTPUT_FILE) == FAILURE) |
(check_files_permission("traceinst",argv[5], CHECK_OUTPUT_FILE) == FAILURE) |
(check_files_permission("traceunit",argv[6], CHECK_OUTPUT_FILE) == FAILURE)) {
return EXIT_FAILURE;
}
configuration* config = (configuration*) malloc(sizeof(configuration));
if (!config) {
printf("[Fatal] Configuration malloc failed\n");
free(config);
return EXIT_FAILURE;
}
if (load_cfg(argv[1], config) == FAILURE) {
printf("[Fatal] Parsing configuration file failed\n");
free(config);
return EXIT_FAILURE;
}
unsigned int memory[MEMORY_SIZE] = {0};
if (load_memin(argv[2], memory) == FAILURE) {
printf("[Fatal] Parsing memin file failed\n");
free(config);
return EXIT_FAILURE;
}
unsigned int instructionNum = get_instructionNum(memory);
/* Start the program */
stScoreboardCPU scoreboardCPU;
if (scoreboard_init(&scoreboardCPU, config, memory, instructionNum) == FAILURE) {
return EXIT_FAILURE;
}
if (scoreboard_cycle(&scoreboardCPU, argv[6]) == FAILURE) {
printf("[Fatal] Scoreboard algorithm cycles failed\n");
scoreboard_destroy(&scoreboardCPU, config, MEMORY_SIZE);
return EXIT_FAILURE;
}
/* Save the output */
if (write_memout(argv[3], memory) == FAILURE) {
printf("[Fatal] Saving memout file failed\n");
scoreboard_destroy(&scoreboardCPU, config, MEMORY_SIZE);
return EXIT_FAILURE;
}
if (write_regout(argv[4], scoreboardCPU.Register) == FAILURE) {
printf("[Fatal] Saving memout file failed\n");
scoreboard_destroy(&scoreboardCPU, config, MEMORY_SIZE);
return EXIT_FAILURE;
}
if (write_traceinst(argv[5], &scoreboardCPU) == FAILURE) {
printf("[Fatal] Saving traceinst file failed\n");
scoreboard_destroy(&scoreboardCPU, config, MEMORY_SIZE);
return EXIT_FAILURE;
}
/* Cleanup and exit gracefully */
scoreboard_destroy(&scoreboardCPU, config, instructionNum);
return EXIT_SUCCESS;
}