<div>#include<iostream></div> <div>#include<fstream></div> <div>#include<cstdlib></div> <div><br></div> <div><br></div> <div>using namespace std;</div> <div><br></div> <div>int lru[500][20];</div> <div><br></div> <div>//Function to change the tag order in the lru algo</div> <div>int bringtotop(int set, int assoc, int x)</div> <div>{</div> <div> int i,pos;</div> <div> for(i=0;i<assoc;i++)</div> <div> if(lru[set][i] == x)</div> <div> pos = i;</div> <div> for(i=pos;i<assoc-1;i++)</div> <div> lru[set][i] = lru[set][i+1];</div> <div> lru[set][assoc-1] = x;</div> <div><br></div> <div><br></div> <div>}</div> <div><br></div> <div>void plot(int total, int hit, int miss);</div> <div><br></div> <div>long int changebase(char hex[], int base);</div> <div><br></div> <div><br></div> <div>int convert(char);</div> <div><br></div> <div>int main()</div> <div>{</div> <div> int cache_size, asso, block_size,i,j, no_blocks, base,r,alg, x,pos;</div> <div> long int address;</div> <div> float hitrate;</div> <div> char hex[20], filename[20];</div> <div> int no_set;</div> <div> int check=0, hit=0, miss=0;</div> <div><br></div> <div><br></div> <div><br></div> <div> cout<<"Enter the cache_size : ";</div> <div> cin>>cache_size;</div> <div> cout<<"Enter the associativity : ";</div> <div> cin>>asso;</div> <div> cout<<"Enter the block size : ";</div> <div> cin>>block_size;</div> <div> cout<<"Enter trace filename : ";</div> <div> cin>>filename;</div> <div> cout<<"Enter the base of number in trace file : ";</div> <div> cin>>base;</div> <div> cout<<"1. FIFO 2.LRU 3. Random...Enter Your Choice : ";</div> <div> cin>>alg;</div> <div><br></div> <div> no_blocks = cache_size / block_size;</div> <div> no_set = cache_size / (asso * block_size);</div> <div><br></div> <div> int cache[no_set][asso];</div> <div><br></div> <div> for(i=0;i<no_set;i++)</div> <div> for(j=0;j<asso;j++)</div> <div> cache[i][j] = -10; // Eliminating all garbage values in in the cache...</div> <div><br></div> <div><br></div> <div> int fifo[no_set];</div> <div> for(i=0;i<no_set;i++)</div> <div> fifo[i] = 0;</div> <div><br></div> <div> for(i=0;i<no_set;i++)</div> <div> for(j=0;j<asso;j++)</div> <div> lru[i][j] = j;</div> <div><br></div> <div> ifstream infile;</div> <div> infile.open(filename,ios::in);</div> <div> if(!infile)</div> <div> {</div> <div> cout<<"Error! File not found...";</div> <div> exit(0);</div> <div><br></div> <div> }</div> <div> int set, tag, found;</div> <div> while(!infile.eof()) //Reading each address from trace file</div> <div> {</div> <div><br></div> <div> if(base!=10)</div> <div> {</div> <div> infile>>hex;</div> <div> address = changebase(hex, base);</div> <div> }</div> <div> else</div> <div> infile>>address;</div> <div><br></div> <div> set = (address / block_size) % no_set;</div> <div> tag = address / (block_size * no_set);</div> <div><br></div> <div><br></div> <div> check++;</div> <div> found = 0;</div> <div> for(i=0;i<asso;i++)</div> <div> if(cache[set][i] == tag)</div> <div> {</div> <div> found = 1;</div> <div> pos = i;</div> <div> }</div> <div><br></div> <div><br></div> <div> if(found)</div> <div> {</div> <div> hit++;</div> <div> if(alg == 2)</div> <div> {</div> <div> bringtotop(set,asso,pos);</div> <div> }</div> <div> }</div> <div><br></div> <div> else</div> <div> {</div> <div> if(alg==1)</div> <div> {</div> <div> i = fifo[set];</div> <div><br></div> <div> cache[set][i] = tag;</div> <div> fifo[set]++;</div> <div><br></div> <div> if(fifo[set] == asso)</div> <div> fifo[set] = 0;</div> <div><br></div> <div> }</div> <div> else if(alg==2)</div> <div> {</div> <div> i = lru[set][0];</div> <div> cache[set][i] = tag;</div> <div> bringtotop(set,asso,i);</div> <div><br></div> <div> }</div> <div> else</div> <div> {</div> <div> r = rand() % asso;</div> <div> cache[set][r] = tag;</div> <div><br></div> <div> }</div> <div><br></div> <div> }</div> <div><br></div> <div><br></div> <div><br></div> <div> }</div> <div> infile.close();</div> <div> system("clear");</div> <div> cout<<"No: of checks : "<<check;</div> <div> cout<<" No: of hits : "<<hit;</div> <div> cout<<" No of misses : "<<check-hit;</div> <div> hitrate = float(hit)/float(check);</div> <div> cout<<" Hit Rate : "<<hitrate;</div> <div> plot(check,hit, check-hit);</div> <div> return 0;</div> <div><br></div> <div>}</div> <div><br></div> <div><br></div> <div><br></div> <div><br></div> <div><br></div> <div><br></div> <div><br></div> <div>int convert(char c)</div> <div>{</div> <div> if(c == '1')</div> <div> return 1;</div> <div><br></div> <div> else if(c == '2')</div> <div> return 2;</div> <div><br></div> <div> else if(c == '3')</div> <div> return 3;</div> <div><br></div> <div> else if(c == '4')</div> <div> return 4;</div> <div><br></div> <div> else if(c =='5')</div> <div> return 5;</div> <div><br></div> <div> else if(c == '6')</div> <div> return 6;</div> <div><br></div> <div> else if(c == '7')</div> <div> return 7;</div> <div><br></div> <div> else if(c == '8')</div> <div> return 8;</div> <div><br></div> <div> else if(c == '9')</div> <div> return 9;</div> <div><br></div> <div> else if(c == '0')</div> <div> return 0;</div> <div><br></div> <div> else if( (c == 'a') || (c == 'A') )</div> <div> return 10;</div> <div><br></div> <div> else if( (c == 'b') || (c == 'B') )</div> <div> return 11;</div> <div><br></div> <div> else if( (c == 'c') || (c == 'C') )</div> <div> return 12;</div> <div><br></div> <div> else if( (c == 'd') || (c == 'D') )</div> <div> return 13;</div> <div><br></div> <div> else if( (c == 'e') || (c == 'E') )</div> <div> return 14;</div> <div><br></div> <div> else if( (c == 'f') || (c == 'F') )</div> <div> return 15;</div> <div><br></div> <div> else</div> <div> return 0;</div> <div><br></div> <div>}</div> <div><br></div> <div>//Function to change the base of a number system to decimal</div> <div>long int changebase(char hex[], int base)</div> <div>{</div> <div> int pow = 1,len,i,j;</div> <div> char temp;</div> <div> long int dec;</div> <div><br></div> <div> for(len=0;hex[len]!='\0';len++);</div> <div><br></div> <div> for(i=0,j=(len-1);i<j;i++,j--)</div> <div> {</div> <div> temp = hex[i];</div> <div> hex[i]=hex[j];</div> <div> hex[j]=temp;</div> <div> }</div> <div><br></div> <div><br></div> <div> pow = 1;</div> <div> dec = 0;</div> <div> for(i=0;i<len;i++)</div> <div> {</div> <div> if(convert(hex[i]== -1))</div> <div> {</div> <div> dec =0;</div> <div> break;</div> <div> }</div> <div> dec = dec + (pow * convert(hex[i]));</div> <div> pow*=base;</div> <div><br></div> <div> }</div> <div> return dec;</div> <div><br></div> <div>}</div> <div><br></div> <div><br></div> <div>//Function to plot a graph...</div> <div>void plot(int total, int hit, int miss)</div> <div>{</div> <div><br></div> <div> cout<<"\n\n ************Graph**********\n\n";</div> <div><br></div> <div> int hit_limit,miss_limit, i;</div> <div> hit_limit = (float (hit)/total)*30;</div> <div> miss_limit = (float(miss)/total)*30;</div> <div><br></div> <div><br></div> <div><br></div> <div> cout<<"\n\t^";</div> <div> cout<<"\n\t|\n";</div> <div> for(i=30;i>=0;i--)</div> <div> {</div> <div> cout<<"\t";</div> <div> cout<<"|";</div> <div> cout<<"\t\t";</div> <div><br></div> <div> //Total hit bar</div> <div> cout<<"|";</div> <div> if(i==30)</div> <div> cout<<"----";</div> <div> else</div> <div> cout<<" ";</div> <div> cout<<"|";</div> <div><br></div> <div> cout<<"\t\t";</div> <div> //Hit Bar...</div> <div> if(i<=hit_limit)</div> <div> cout<<"|";</div> <div> else</div> <div> cout<<" ";</div> <div><br></div> <div> if(i==hit_limit)</div> <div> cout<<"----";</div> <div> else</div> <div> cout<<" ";</div> <div><br></div> <div> if(i<=hit_limit)</div> <div> cout<<"|";</div> <div> else</div> <div> cout<<" ";</div> <div><br></div> <div><br></div> <div><br></div> <div> cout<<"\t\t";</div> <div> //Miss Bar...</div> <div> if(i<=miss_limit)</div> <div> cout<<"|";</div> <div> else</div> <div> cout<<" ";</div> <div><br></div> <div> if(i==miss_limit)</div> <div> cout<<"----";</div> <div> else</div> <div> cout<<" ";</div> <div><br></div> <div> if(i<=miss_limit)</div> <div> cout<<"|";</div> <div> else</div> <div> cout<<" ";</div> <div><br></div> <div> cout<<"\n";</div> <div><br></div> <div> }</div> <div> cout<<"\t------------------------------------------------------------------------------>";</div> <div> cout<<"\n\t\t\tTotal\t\t Hits\t\tMiss\n";</div> <div><br></div> <div><br></div> <div><br></div> <div>}</div> <div> <div style="text-align:left;"><img src="http://thimg.todayhumor.co.kr/upfile/201712/1512481114ccad2dcec8ff4b79aff4cf36d492994e__mn303064__w1440__h810__f108907__Ym201712.png" width="800" height="450" alt="KakaoTalk_20171205_223041749.png" class="chimg_photo" style="border:none;" filesize="108907"></div><br></div>