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.*/
}
Beispiel #2
0
Datei: sim.c Projekt: daizg/CS211
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;
}
Beispiel #3
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;
}