int main(int argc, char *argv[]) { int i; int digitCount = 0; int inputLength; if(argc != 4) /*If no/too few input arguments are given, OR there's more than 3 arguments passed to the program:*/ { fprintf(stderr,"Error: Invalid number of arguments passed.\n"); /*Standard error is printed and help function is run.*/ help(); } else { if(strcmp(argv[1],"-b") != 0 && strcmp(argv[1],"-d") != 0 && strcmp(argv[1],"-h") != 0 && strcmp(argv[1],"-o") != 0 && strcmp(argv[3],"-b") != 0 && strcmp(argv[3],"-d") != 0 && strcmp(argv[3],"-h") != 0 && strcmp(argv[3],"-o") != 0) /*Checks that both the input and output arguments are valid ones.*/ { fprintf(stderr,"Error: Invalid input or output type argument given.\n"); help(); } else { if(strcmp(argv[1],"-b") == 0) /*If the input value is -b for binary:*/ { inputLength = strlen(argv[2]); for(i = 0; i != inputLength; i++) /*Checks the valid input of 1s and 0s are given.*/ { if (argv[2][i] != '0' && argv[2][i] != '1' && argv[2][i] != '.') { fprintf(stderr,"Error: Binary values can only consist of 1\'s or 0\'s.\n"); help(); } if(argv[2][i] != '.') /*Counts the number of digits to ensure the input length is not more than 8 (excluding the decimal point)*/ digitCount++; } if(digitCount > 8) { fprintf(stderr,"Error: Maximum number of digits exceeded.\n"); help(); } if(strcmp(argv[3],"-b") == 0) /*If user wants to go from binary to binary, it prints the input string.*/ printf("%s\n",argv[2]); if(strcmp(argv[3],"-d") == 0) printf("%G\n",binToDec(argv[2])); /*If the user wants to go from binary to decimal, it executes the correct function and prints type double with the proper number of decimal places.*/ if(strcmp(argv[3],"-h") == 0) printf("%s\n",binToHex(argv[2])); if(strcmp(argv[3],"-o") == 0) printf("%s\n",binToOct(argv[2])); } if(strcmp(argv[1],"-d") == 0) /*If the input type is decimal, does the same checks as if the input type was binary but instead checks that each digit is a valid base 10 number.*/ { inputLength = strlen(argv[2]); for(i = 0; i != inputLength; i++) { if (argv[2][i] != '0' && argv[2][i] != '1' && argv[2][i] != '2' && argv[2][i] != '3' && argv[2][i] != '4' && argv[2][i] != '5' && argv[2][i] != '6' && argv[2][i] != '7' && argv[2][i] != '8' && argv[2][i] != '9' && argv[2][i] != '.') { fprintf(stderr,"Error: Decimal values can only consist of 0-9.\n"); help(); } if(argv[2][i] != '.') digitCount++; } if(digitCount > 8) { fprintf(stderr,"Error: Maximum number of digits exceeded.\n"); help(); } else { if(strcmp(argv[3],"-b") == 0) printf("%s\n",dectoBin(argv[2])); if(strcmp(argv[3],"-d") == 0) printf("%s\n",argv[2]); if(strcmp(argv[3],"-h") == 0) printf("%s\n",binToHex(dectoBin(argv[2]))); if(strcmp(argv[3],"-o") == 0) printf("%s\n",binToOct(dectoBin(argv[2]))); } } if(strcmp(argv[1],"-h") == 0) /*See above comments. Performs the same checks but for hex values.*/ { inputLength = strlen(argv[2]); for(i = 0; i != inputLength; i++) { if (argv[2][i] != '0' && argv[2][i] != '1' && argv[2][i] != '2' && argv[2][i] != '3' && argv[2][i] != '4' && argv[2][i] != '5' && argv[2][i] != '6' && argv[2][i] != '7' && argv[2][i] != '8' && argv[2][i] != '9' && argv[2][i] != 'a' && argv[2][i] != 'A' && argv[2][i] != 'b' && argv[2][i] != 'B' && argv[2][i] != 'c' && argv[2][i] != 'C' && argv[2][i] != 'd' && argv[2][i] != 'D' && argv[2][i] != 'e' && argv[2][i] != 'E' && argv[2][i] != 'f' && argv[2][i] != 'F' && argv[2][i] != '.') { fprintf(stderr,"Error: Hex values can only consist of 0-9 & A-F.\n"); help(); } if(argv[2][i] != '.') digitCount++; } if(digitCount > 4) { fprintf(stderr,"Error: Maximum number of digits exceeded.\n"); help(); } else { if(strcmp(argv[3],"-b") == 0) printf("%s\n",hextoBin(argv[2])); if(strcmp(argv[3],"-d") == 0) printf("%G\n",binToDec(hextoBin(argv[2]))); if(strcmp(argv[3],"-h") == 0) printf("%s\n",argv[2]); if(strcmp(argv[3],"-o") == 0) printf("%s\n",binToOct(hextoBin(argv[2]))); } } if(strcmp(argv[1],"-o") == 0) /*See above comments. Does the same checks but for octal numbers.*/ { inputLength = strlen(argv[2]); for(i = 0; i != inputLength; i++) { if (argv[2][i] != '0' && argv[2][i] != '1' && argv[2][i] != '2' && argv[2][i] != '3' && argv[2][i] != '4' && argv[2][i] != '5' && argv[2][i] != '6' && argv[2][i] != '7' && argv[2][i] != '.') { fprintf(stderr,"Error: Octal values can only consist of 0-7.\n"); help(); } if(argv[2][i] != '.') digitCount++; } if(digitCount > 8) { fprintf(stderr,"Error: Maximum number of digits exceeded.\n"); help(); } else { if(strcmp(argv[3],"-b") == 0) printf("%s\n",octtoBin(argv[2])); if(strcmp(argv[3],"-d") == 0) printf("%G\n",binToDec(octtoBin(argv[2]))); if(strcmp(argv[3],"-h") == 0) printf("%s\n",binToHex(octtoBin(argv[2]))); if(strcmp(argv[3],"-o") == 0) printf("%s\n",argv[2]); } } } } return 0; /*In order to meet C standards, the main function must return an int. 0 indicates successful program execution.*/ }
int main(int argc, char** argv) { unsigned int cacheHit, cacheMiss, memoryRead, memoryWrite, memoryAddress, index, tagVal; int current; char policy; char readOrWrite; unsigned short cacheSize; char *buffer; int count = 0; cacheHit = 0; cacheMiss = 0; memoryRead = 0; memoryWrite = 0; cacheSize = 4096; line cache[4096]; FILE *fp; for (current = 0; current < cacheSize; current++) { cache[current].vb = '0'; cache[current].db = '0'; } if (argc <= 1 || argc > 3) { printf("Error: Input is Not Allowed\n"); return 1; } if (strcmp("-h", argv[1]) == 0) { printf("Usage: sim <write policy> <trace file>\n"); return 0; } //check write policy if ((strcmp("wt", argv[1]) != 0) && (strcmp("wb", argv[1]) != 0)) { printf("Error: Write Policy is Not Allowed\n"); return 1; } //set policy write through / back if (strcmp("wt", argv[1]) == 0) policy = 't'; else policy = 'b'; //trace file fp = fopen(argv[2], "r"); if (fp == NULL) { printf("Trace file not found. Please run again.\n"); return 1; } index = 0; tagVal = 0; buffer = malloc(1024); memoryAddress = 0; //Iterate over each line while(buffer[0] != '#' && fgets(buffer, 1024, fp) != NULL){ readOrWrite = strstr(buffer, "W") == NULL ? 'r' : 'w'; memoryAddress = hextoBin(buffer) / 4; index = memoryAddress % cacheSize; tagVal = memoryAddress / cacheSize; //write through if (policy == 't'){ count++; if (cache[index].vb == '0'){ cacheMiss++; memoryRead++; cache[index].tag = tagVal; cache[index].vb = '1'; }else{ if (tagVal == cache[index].tag) cacheHit++; else{ cacheMiss++; memoryRead++; cache[index].tag = tagVal; } } if (readOrWrite == 'w'){ memoryWrite++; count--; } }else{ if (cache[index].vb == '0'){ cacheMiss++; memoryRead++; cache[index].tag = tagVal; cache[index].vb = '1'; }else{ if (cache[index].tag == tagVal) cacheHit++; else{ if (cache[index].db == '1') memoryWrite++; cache[index].tag = tagVal; cache[index].db = '0'; cacheMiss++; memoryRead++; } } if (readOrWrite == 'w') cache[index].db = '1'; } } printf("%s%u\n", "Cache Hits: ", cacheHit); printf("%s%u\n", "Cache Misses: ", cacheMiss); printf("%s%u\n", "Memory Reads: ", memoryRead); printf("%s%u\n", "Memory Writes: ", memoryWrite); fclose(fp); free(buffer); return 0; }
int main(int argc, char *argv[]) { FILE *fp,*opfp,*omc,*mc,*testf; int test,n,c,ln,i,m,m1,m2,b,flag=0,len,last,digit=0,var,id=0,f,flen=0; long int madd=0; char ch,*nem[4],*str,*token,*s=" ",state,*str1,*s1="\t",*token1,*temp,*token2,c1;//*labels[10] str = (char *)malloc(sizeof(char)*50); str1 = (char *)malloc(sizeof(char)*50); token1 = (char *)malloc(sizeof(char)*50); token2 = (char *)malloc(sizeof(char)*50); register_init(); instr_init(); opfp = fopen("stable.txt","r"); if(opfp == NULL) { perror("Error while opening the file.\n"); exit(EXIT_FAILURE); } //printf("file name %s\n", argv[1]); fp = fopen(argv[1],"r"); // opens file testf = fopen(argv[1],"r"); omc = fopen("mcode.txt","w"); mc= fopen("onlymcode.txt","w"); if(fp == NULL) { perror("Error while opening the file.\n"); exit(EXIT_FAILURE); } label lbl[10]; for(m1=0;m1<10;m1++) { lbl[m1].labels = (char *)malloc(sizeof(char)*10); } for(m1=0;m1<10;m1++) { lbl[m1].mad = (char *)malloc(sizeof(char)*10); } while( fgets(str1,50,opfp)!=NULL) { token=strtok(str1,s1); while(token!=NULL) { strcpy(lbl[lb].labels,token); token=strtok(NULL,s1); strcpy(lbl[lb].mad,token); token=strtok(NULL,s1); }++lb; } /*for(m1=0;m1<lb;m1++) { printf("Labels :: %s \t address :: %s\n",lbl[m1].labels,lbl[m1].mad); } */ for (c1 = getc(testf); c1 != EOF; c1 = getc(testf)){ if (c1 == '\n') // Increment count if this character is newline flen++; } fclose(testf); while( fgets(str,50,fp)!=NULL) //line reading { state='X'; if(flen==l){ strcat(str,"\0"); } if((str!="")&&((flen!=l))) str[strlen(str)-1]='\0'; if(l>0) { //printf( "\n%00000007ld\t%s",madd,str ); fprintf(omc,"\n%00000007ld\t%s",madd,str ); madd+=32; state='X'; token = strtok(str,s); // instruction name len=strlen(token); last=token[len-1]; if(last==58) { token = strtok(NULL,s); } while( token != NULL ) { for(b=1;b<=4;b++) // MOV { if(strcmp(token,(ins[b].nemo))==0) { state='M'; id=b; break; } } for(b=5;b<=8;b++) // direct address { if(strcmp(token,(ins[b].nemo))==0) { state='I'; //printf("\nMCODE : %s ",ins[b].mcode); fprintf(omc,"\nMCODE : %s ",ins[b].mcode); fprintf(mc,"\n%s",ins[b].mcode); break; } } for(b=9;b<=10;b++) // ADD { if(strcmp(token,(ins[b].nemo))==0) { state='A'; id=b; break; } } for(b=11;b<=13;b++) // MUL { if(strcmp(token,(ins[b].nemo))==0) { state='A'; id=b; break; } } for(b=14;b<=15;b++) // AND { if(strcmp(token,(ins[b].nemo))==0) { state='A'; id=b; break; } } for(b=16;b<=18;b++) // OR { if(strcmp(token,(ins[b].nemo))==0) { state='O'; break; } } for(b=19;b<=20;b++) // NOT { if(strcmp(token,(ins[b].nemo))==0) { state='N'; id=b; break; } } for(b=21;b<=26;b++) // type INS r1 { if(strcmp(token,(ins[b].nemo))==0) { //printf("\nMCODE : %s ",ins[b].mcode); fprintf(omc,"\nMCODE : %s ",ins[b].mcode); fprintf(mc,"\n%s",ins[b].mcode); state='R'; break; } } if(strcmp(token,(ins[27].nemo))==0) // compare CMP { id=28; state='M'; } for(b=28;b<=36;b++) // branching instruction JMP { if(strcmp(token,(ins[b].nemo))==0) { state='B'; //printf("\nMCODE : %s ",ins[b].mcode); fprintf(omc,"\nMCODE : %s ",ins[b].mcode); fprintf(mc,"\n%s",ins[b].mcode); break; } } for(b=37;b<=40;b++) // machine control instruction { if(strcmp(token,(ins[b].nemo))==0) { state='C'; //printf("\nMCODE : %s ",ins[b].mcode); fprintf(omc,"\nMCODE : %s\n",ins[b].mcode); fprintf(mc,"\n%s",ins[b].mcode); } } switch(state) { case 'M': token = strtok(NULL,s); // 1st token------- if(token!=NULL){ if(token[0]==91) { token++; token[strlen(token)-1]='\0'; f=4; } for(m=0;m<64;m++) { if((strcmp(token,regs[m].regi)==0)) { strcpy(token1,regs[m].address); strcpy(token2,regs[m].address); strcat(token1," "); token = strtok(NULL,s); // 2nd token------- if(token!=NULL){ if(token[0]==91) { token++; token[strlen(token)-1]='\0'; for(m1=0;m1<64;m1++) { if((strcmp(token,regs[m1].regi)==0)) { strcat(token1,regs[m1].address); strcat(token2,regs[m1].address); //printf("\nMCODE : %s %s",ins[3].mcode,token1); fprintf(omc,"\nMCODE : %s %s\n",ins[3].mcode,token1); fprintf(mc,"\n%s%s",ins[3].mcode,token2); break; } } token="xx"; } for(m1=0;m1<64;m1++) { if((strcmp(token,regs[m1].regi)==0)) { if(f!=4) { strcat(token1,regs[m1].address); strcat(token2,regs[m1].address); //printf("\nMCODE : %s %s",ins[id].mcode,token1); fprintf(omc,"\nMCODE : %s %s\n",ins[id].mcode,token1); fprintf(mc,"\n%s%s",ins[id].mcode,token2); state='F'; } if(f==4) { strcat(token1,regs[m1].address); strcat(token2,regs[m1].address); //printf("\nMCODE : %s %s",ins[4].mcode,token1); fprintf(omc,"\nMCODE : %s %s\n",ins[4].mcode,token1); fprintf(mc,"\n%s%s",ins[4].mcode,token2); f=0; state='F'; } break; } else { if(token[0]==35) { for(var=0;var<lb;var++) { if(strcmp(lbl[var].labels,token)==0) { lbl[var].mad[strlen(lbl[var].mad)-1]='\0'; strcat(token1,appendLeft(toBin(atoi(lbl[var].mad)))); strcat(token2,appendLeft(toBin(atoi(lbl[var].mad)))); //printf("\nMCODE : %s %s",ins[++id].mcode,token1); fprintf(omc,"\nMCODE : %s %s\n",ins[id].mcode,token1); fprintf(mc,"\n%s%s",ins[id].mcode,token2); token++; break; } } } } } token = strtok(NULL,s); if(token!=NULL){state='X';break;} }break; } } } break; case 'I': token = strtok(NULL,s); // 1st token------- if(token!=NULL){ for(m=0;m<64;m++) { if((strcmp(token,regs[m].regi)==0)) { //printf("%s ",regs[m].address); fprintf(omc,"%s ",regs[m].address); fprintf(mc,"%s",regs[m].address); break; } } } token = strtok(NULL,s); // 2nd token------- //printf("%s",hextoBin(token)); fprintf(omc,"%s\n",hextoBin(token)); fprintf(mc,"%s",hextoBin(token)); break; case 'A': token = strtok(NULL,s);//1st token for(m=0;m<64;m++) { if((strcmp(token,regs[m].regi)==0)) { strcpy(token1,regs[m].address); strcpy(token2,regs[m].address); strcat(token1," "); token = strtok(NULL,s);//2nd token if(token[0]==91) { token++; token[strlen(token)-1]='\0'; id++; f=6; } for(m1=0;m1<64;m1++) { if((strcmp(token,regs[m1].regi)==0)) { strcat(token1,regs[m1].address); strcat(token2,regs[m1].address); if(f==6){ //printf("\nMCODE : %s %s",ins[id].mcode,token1); fprintf(omc,"\nMCODE : %s %s\n",ins[id].mcode,token1); fprintf(mc,"\n%s%s",ins[id].mcode,token2); f=0; break; } token = strtok(NULL,s);//3rd token for(m2=0;m2<64;m2++) { if((strcmp(token,regs[m2].regi)==0)) { strcat(token1," "); strcat(token1,regs[m2].address); strcat(token2,regs[m2].address); //printf("\nMCODE : %s %s",ins[id].mcode,token1); fprintf(omc,"\nMCODE : %s %s\n",ins[id].mcode,token1); fprintf(mc,"\n%s%s",ins[id].mcode,token2); break; } } break; } } break; } } break; case 'O': token = strtok(NULL,s);//1st token for(m=0;m<64;m++) { if((strcmp(token,regs[m].regi)==0)) { strcpy(token1,regs[m].address); strcpy(token2,regs[m].address); strcat(token1," "); token = strtok(NULL,s);//2nd token if(token[0]==91) { token++; token[strlen(token)-1]='\0'; id++; id++; f=6; } if(checkHex(token)==1) { id++; //printf("\nMCODE : %s %s %s",ins[id].mcode,token1,hextoBin(token)); fprintf(omc,"\nMCODE : %s %s %s\n",ins[id].mcode,token1,hextoBin(token)); fprintf(mc,"\n%s%s%s",ins[id].mcode,token2,hextoBin(token)); break; } for(m1=0;m1<64;m1++) { if((strcmp(token,regs[m1].regi)==0)) { strcat(token1,regs[m1].address); strcat(token2,regs[m1].address); strcat(token1," "); if(f==6){ //printf("\nMCODE : %s %s",ins[id].mcode,token1); fprintf(omc,"\nMCODE : %s %s\n",ins[id].mcode,token1); fprintf(mc,"\n%s%s",ins[id].mcode,token2); f=0; break; } token = strtok(NULL,s);//3rd token for(m2=0;m2<64;m2++) { if((strcmp(token,regs[m2].regi)==0)) { //puts(token); strcat(token1,regs[m2].address);//puts(token1); strcat(token2,regs[m2].address); //printf("\nMCODE : %s %s",ins[id].mcode,token1); fprintf(omc,"\nMCODE : %s %s\n",ins[id].mcode,token1); fprintf(mc,"\n%s%s",ins[id].mcode,token2); break; } } break; } } break; } } break; case 'N': token = strtok(NULL,s); // 1st token------- if(token!=NULL){ if(token[0]==91) { token++; token[strlen(token)-1]='\0'; id++; } for(m=0;m<64;m++) { if((strcmp(token,regs[m].regi)==0)) { //printf("\nMCODE : %s %s",ins[id].mcode,regs[m].address); fprintf(omc,"\nMCODE : %s %s\n",ins[id].mcode,regs[m].address); fprintf(mc,"\n%s%s",ins[id].mcode,regs[m].address); break; } } } break; case 'R': token = strtok(NULL,s); // 1st token------- if(token!=NULL){ for(m=0;m<64;m++) { if((strcmp(token,regs[m].regi)==0)) { //printf("%s",regs[m].address); fprintf(omc,"%s\n",regs[m].address); fprintf(mc,"%s",regs[m].address); break; } } } break; case 'B': token = strtok(NULL,s); // 1st token------- if(token!=NULL){ for(m1=0;m1<lb;m1++) { if(strcmp(lbl[m1].labels,token)==0) { lbl[m1].mad[strlen(lbl[m1].mad)-1]='\0'; //printf("%s",appendLeft(toBin(atoi(lbl[m1].mad)))); fprintf(omc,"%s\n",appendLeft(toBin(atoi(lbl[m1].mad)))); fprintf(mc,"%s",appendLeft(toBin(atoi(lbl[m1].mad)))); break; } if(m1==lb-1) { printf("\nError in code!!No lebel found in jump instruction at line %d !! Exit from program !!",l+1); exit(0); } } if(lb==0) { printf("\nError in code!!No lebel found in jump instruction at line %d !! Exit from program !!",l+1); exit(0); } } break; default: state='X'; } token = strtok(NULL,s); break; } } l++; } printf("compilation successful :D "); fclose(fp); fclose(opfp); fclose(mc); append(); return 0; }