In: Electrical Engineering
this is cahce memory related c program....and not working or running properly???????
| #include <iostream> | 
| #include <string> | 
| #include <vector> | 
| #include <iomanip> | 
| #include <cmath> | 
| #include <cstdlib> | 
| #include <ctime> | 
| using namespace std; | 
| int cash_type, block_size, cash_size,number_of_blocks=0;; | 
| int compulsry_misses=0, capcity_misses=0, conflict_misses=0; | 
| #define DRAM_SIZE (64*1024*1024) | 
| unsigned int m_w = 0xABABAB55; /* must not be zero, nor 0x464fffff */ | 
| unsigned int m_z = 0x05080902; /* must not be zero, nor 0x9068ffff */ | 
| unsigned int rand_() | 
| { | 
| m_z = 36969 * (m_z & 65535) + (m_z >> 16); | 
| m_w = 18000 * (m_w & 65535) + (m_w >> 16); | 
| return (m_z << 16) + m_w; /* 32-bit result */ | 
| } | 
| unsigned int memGen1() | 
| { | 
| static unsigned int addr=0; | 
| return (addr++)%(DRAM_SIZE); | 
| } | 
| unsigned int memGen2() | 
| { | 
| static unsigned int addr=0; | 
| return rand_()%(128*1024); | 
| } | 
| unsigned int memGen3() | 
| { | 
| return rand_()%(DRAM_SIZE); | 
| } | 
| unsigned int memGen4() | 
| { | 
| static unsigned int addr=0; | 
| return (addr++)%(1024); | 
| } | 
| unsigned int memGen5() | 
| { | 
| static unsigned int addr=0; | 
| return (addr++)%(1024*64); | 
| } | 
| unsigned int memGen6() | 
| { | 
| static unsigned int addr=0; | 
| return (addr+=256)%(DRAM_SIZE); | 
| } | 
| // Cache Simulator | 
| bool cacheSim(unsigned int addr, int cash[3][100000], int type, int &block_counter, int index_addr, int tag_addr) | 
| { | 
| int shift_offset=log2(block_size); | 
| bool detected=false; | 
| bool misses_flag=true; | 
| if (cash_type==0) // Direct Mapped ****************************************** | 
| { | 
| if (cash[0][index_addr]==tag_addr) | 
| { | 
| return true; | 
| } | 
| else | 
| { | 
| cash[0][index_addr]= tag_addr; | 
| for (int i=0; i < number_of_blocks; i++) | 
| { | 
| if (cash[1][i]!=1) | 
| { misses_flag=false; | 
| i=number_of_blocks;} | 
| } | 
| //calculating misses | 
| if (misses_flag) | 
| capcity_misses++; // capcity miss because the cash is full | 
| else | 
| { | 
| if(cash[1][index_addr]==1) | 
| conflict_misses++; | 
| else | 
| { | 
| compulsry_misses++; | 
| } | 
| } | 
| cash[1][index_addr]= 1; | 
| return 0; | 
| } | 
| } // end of directed mapped | 
| /////////////////////////////////////////////////////////////////// | 
| else if (cash_type==1) // set asscoiative ************************************* | 
| { | 
| index_addr=index_addr * type; | 
| for (int i=0; i < type ; i++) | 
| { | 
| if (cash[0][index_addr+i]==tag_addr) | 
| { | 
| // cout <<"0x hitttttttt" << setfill('0') << setw(8) << hex << tag_addr << endl; | 
| return 1; | 
| } | 
| } | 
| for (int j=0; j < type; j++) | 
| { | 
| if (cash[1][index_addr+j] == -1) | 
| { | 
| compulsry_misses++; | 
| cash[0][index_addr+j]=tag_addr; | 
| cash[1][index_addr+j]=1; | 
| return 0; | 
| } | 
| } | 
| srand(time(NULL)); | 
| int x=rand()%(type); | 
| cash[0][index_addr+x]=tag_addr; | 
| cash[1][index_addr+x]=1; | 
| capcity_misses++; | 
| return 0; | 
| }//end of set assciative | 
| else if (cash_type==2) // fully associative ************************************** | 
| { | 
| if (type==0) // LRU ///////// | 
| { | 
| if (block_counter < number_of_blocks) | 
| { | 
| for (int i=0; i < number_of_blocks; i++) | 
| { | 
| if (cash[0][i]==addr >> shift_offset) | 
| { | 
| detected=true; | 
| cash[1][i]=block_counter; | 
| block_counter--; | 
| return detected; //hit | 
| } | 
| } | 
| if (!detected) | 
| { | 
| compulsry_misses++; | 
| cash[0][block_counter]=addr>>shift_offset; | 
| cash[1][block_counter]=block_counter; | 
| return false; //miss | 
| } | 
| } | 
| else // block counter is more than block size | 
| { | 
| //check for existence | 
| for (int i=0; i < number_of_blocks; i++) | 
| { | 
| if (cash[0][i]==(addr >> shift_offset)) | 
| { | 
| detected=true; | 
| cash[1][i]=block_counter; | 
| //block_counter--; | 
| return detected; //hit | 
| } | 
| } | 
| if (!detected) | 
| { | 
| int compare=0; | 
| for (int i=1; i < number_of_blocks; i++) | 
| { | 
| if (cash[1][compare] > cash[1][i]) | 
| compare=i; | 
| } | 
| cash[0][compare]=addr >> shift_offset; | 
| cash[1][compare]=block_counter; | 
| capcity_misses++; | 
| return false; //miss | 
| } | 
| } | 
| } // end of LRU | 
| else if (type==1) // LFU /////////////// | 
| { | 
| if (block_counter < number_of_blocks) | 
| { | 
| for (int i=0; i < number_of_blocks; i++) | 
| { | 
| if (cash[0][i]==addr >> shift_offset) | 
| { | 
| detected=true; | 
| cash[1][i]=cash[1][i]+1; | 
| block_counter--; | 
| return detected; //hit | 
| } | 
| } | 
| if (!detected) | 
| { | 
| cash[0][block_counter]=addr>>shift_offset; | 
| cash[1][block_counter]=-1; | 
| compulsry_misses++; | 
| return false; //miss | 
| } | 
| } | 
| else // block counter is more than block size | 
| { | 
| //check for existence | 
| for (int i=0; i < number_of_blocks; i++) | 
| { | 
| if (cash[0][i]==(addr >> shift_offset)) | 
| { | 
| detected=true; | 
| cash[1][i]++; | 
| block_counter--; | 
| return detected; //hit | 
| } | 
| } | 
| if (!detected) | 
| { | 
| int compare2=0; | 
| for (int i=1; i < number_of_blocks; i++) | 
| { | 
| if (cash[1][compare2] >= cash[1][i]) | 
| compare2=i; | 
| } | 
| cash[0][compare2]=addr >> shift_offset; | 
| cash[1][compare2]=-1; | 
| capcity_misses++; | 
| return false; //miss | 
| } | 
| } | 
| } // end if LFU | 
| else if (type==2) | 
| { | 
| if (block_counter < number_of_blocks) | 
| { | 
| for (int i=0; i < number_of_blocks; i++) | 
| { | 
| if (cash[0][i]==addr >> shift_offset) | 
| { | 
| detected=true; | 
| block_counter--; | 
| return detected; //hit | 
| } | 
| } | 
| if (!detected) | 
| { | 
| cash[0][block_counter]=addr>>shift_offset; | 
| cash[1][block_counter]=block_counter; | 
| compulsry_misses++; | 
| return false; //miss | 
| } | 
| } | 
| else // block counter is more than block size | 
| { | 
| //check for existence | 
| for (int i=0; i < number_of_blocks; i++) | 
| { | 
| if (cash[0][i]==(addr >> shift_offset)) | 
| { | 
| detected=true; | 
| //block_counter--; | 
| return detected; //hit | 
| } | 
| } | 
| if (!detected) | 
| { | 
| int compare=0; | 
| for (int i=1; i < number_of_blocks; i++) | 
| { | 
| if (cash[1][compare] > cash[1][i]) | 
| compare=i; | 
| } | 
| cash[0][compare]=addr >> shift_offset; | 
| cash[1][compare]=block_counter; | 
| capcity_misses++; | 
| return false; //miss | 
| } | 
| } | 
| }// end of FIFO | 
| else if (type==3) | 
| { | 
| if (block_counter < number_of_blocks) | 
| { | 
| for (int i=0; i < number_of_blocks; i++) | 
| { | 
| if (cash[0][i]==addr >> shift_offset) | 
| { | 
| detected=true; | 
| block_counter--; | 
| return detected; //hit | 
| } | 
| } | 
| if (!detected) | 
| { | 
| cash[0][block_counter]=addr>>shift_offset; | 
| compulsry_misses++; | 
| return false; //miss | 
| } | 
| } | 
| else // block counter is more than block size | 
| { | 
| //check for existence | 
| for (int i=0; i < number_of_blocks; i++) | 
| { | 
| if (cash[0][i]==(addr >> shift_offset)) | 
| { | 
| detected=true; | 
| //block_counter--; | 
| return detected; //hit | 
| } | 
| } | 
| if (!detected) | 
| { | 
| srand(time(NULL)); | 
| cash[0][rand()%number_of_blocks]=addr >> shift_offset; | 
| capcity_misses++; | 
| return 0; //miss | 
| } | 
| } | 
| }//end of RANDOM | 
| } // end of Fully associative | 
| return true; | 
| } | 
| char *msg[2] = {"Miss","Hit"}; | 
| /////////////////////////////////////////////////////////////////// | 
| int main(int argc, const char * argv[]) { | 
| int looper=1000000, addr, flag, shift; | 
| cout << "Please, enter 0 for Direct mapped, 1 for set associative, 2 for fully associative: " << endl; | 
| cin >> cash_type; | 
| cout << "Please, enter the size of the block as a Power of 2 between 4 and 128 byte :" << endl; | 
| cin >> block_size; | 
| cout << "Please, enter cache size: 1KB – 64KB; in steps that are power of 2: " << endl; | 
| cin >> cash_size; | 
| int cash[3][100000]; | 
| int block_counter=0; | 
| int hit_counter=0; | 
| int index_addr=0, tag_addr=0; | 
| /////////////////////////////////////////////////////////////////// | 
| if ( cash_type==0) //Direct_mapped ************** | 
| { | 
| number_of_blocks= (cash_size*1024)/block_size; | 
| //////////////////// | 
| for (int i=0; i < 2; i++) // setting all the cash with -1 | 
| for (int j=0; j < number_of_blocks; j++) | 
| cash[i][j]=-1; | 
| ////////////////// | 
| for(int i=0; i <looper ;i++) | 
| { | 
| addr = memGen1(); | 
| shift= log2(block_size); | 
| index_addr= (addr >> shift)% number_of_blocks; | 
| shift= log2(number_of_blocks+block_size); | 
| tag_addr= addr >>shift; // shifted the amount the offset and the index sizes | 
| flag = cacheSim(addr, cash, 0,block_counter, index_addr, tag_addr); | 
| index_addr=0; | 
| tag_addr=0; | 
| cout <<"0x" << setfill('0') << setw(8) << hex << addr <<" ("<< msg[flag] <<")\n"; | 
| if (msg[flag]=="Hit") | 
| { | 
| hit_counter++; | 
| } | 
| } | 
| cout << "Hits " << hit_counter<<endl << "Compulsry: " << compulsry_misses <<endl<< "Capcity: " << capcity_misses <<endl<< "Conflict: " << conflict_misses << endl; | 
| } | 
| /////////////////////////////////////////////////////////////////// | 
| else if (cash_type==2) // Fully associative************** | 
| { | 
| int replacment_type; | 
| number_of_blocks= (cash_size*1024)/block_size; | 
| cout << "please, enter the type of replacment for the Fully Associative: LRU->0 , LFU->1, FIFO->2, RANDOM->3 :- " << endl; | 
| cin >> replacment_type; | 
| for (int i=0; i < 2; i++) // setting all the cash with -1 | 
| for (int j=0; j < number_of_blocks; j++) | 
| cash[i][j]=-10; | 
| for(int i=0; i <looper ;i++) | 
| { | 
| addr = memGen4(); | 
| flag = cacheSim(addr, cash, replacment_type, block_counter, index_addr, tag_addr); | 
| // cout <<"0x" << setfill('0') << setw(8) << hex << addr <<" ("<< msg[flag] <<")\n"; | 
| if (msg[flag]=="Hit") | 
| { | 
| hit_counter++; | 
| } | 
| block_counter++; | 
| } | 
| cout << "Hits " << hit_counter<<endl << "Compulsry: " << compulsry_misses <<endl<< "Capcity: " << capcity_misses <<endl<< "Conflict: " << conflict_misses << endl; | 
| } // end of fully associative main | 
| else if (cash_type==1) // set associative | 
| { | 
| int number_of_ways; | 
| cout << "please, enter the number of ways for the set associative cash: 2,4,8,16" << endl; | 
| cin >> number_of_ways; | 
| number_of_blocks= (cash_size*1024)/(block_size*number_of_ways); | 
| for (int i=0; i < 3; i++) // setting all the cash with -1 | 
| for (int j=0; j < 100000; j++) | 
| cash[i][j]=-1; | 
| for(int i=0; i <looper ;i++) | 
| { | 
| addr = memGen5(); | 
| shift= log2(block_size); | 
| index_addr= (addr >> shift)% (number_of_blocks); | 
| shift= log2(number_of_blocks+block_size); | 
| tag_addr= addr >>shift; | 
| flag = cacheSim(addr, cash, number_of_ways, block_counter, index_addr, tag_addr); | 
| // cout <<"0x" << setfill('0') << setw(8) << hex << addr <<" ("<< msg[flag] <<")\n"; | 
| index_addr=0; | 
| tag_addr=0; | 
| if (msg[flag]=="Hit") | 
| { | 
| hit_counter++; | 
| } | 
| block_counter++; | 
| } | 
| cout << "Hits " << hit_counter<<endl << "Compulsry: " << compulsry_misses <<endl<< "Capcity: " << capcity_misses <<endl<< "Conflict: " << conflict_misses << endl; | 
| } | 
| } | 
#include <iostream>
#include <string>
#include <vector>
#include <iomanip>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
int cash_type, block_size, cash_size,number_of_blocks=0;;
int compulsry_misses=0, capcity_misses=0, conflict_misses=0;
#define DRAM_SIZE (64*1024*1024)
unsigned int m_w = 0xABABAB55; /* must not be zero, nor 0x464fffff
*/
unsigned int m_z = 0x05080902; /* must not be zero, nor 0x9068ffff
*/
unsigned int rand_()
{
m_z = 36969 * (m_z & 65535) + (m_z >> 16);
m_w = 18000 * (m_w & 65535) + (m_w >> 16);
return (m_z << 16) + m_w; /* 32-bit result */
}
unsigned int memGen1()
{
static unsigned int addr=0;
return (addr++)%(DRAM_SIZE);
}
unsigned int memGen2()
{
static unsigned int addr=0;
return rand_()%(128*1024);
}
unsigned int memGen3()
{
return rand_()%(DRAM_SIZE);
}
unsigned int memGen4()
{
static unsigned int addr=0;
return (addr++)%(1024);
}
unsigned int memGen5()
{
static unsigned int addr=0;
return (addr++)%(1024*64);
}
unsigned int memGen6()
{
static unsigned int addr=0;
return (addr+=256)%(DRAM_SIZE);
}
// Cache Simulator
bool cacheSim(unsigned int addr, int cash[3][100000], int type, int
&block_counter, int index_addr, int tag_addr)
{
int shift_offset=log2(block_size);
bool detected=false;
bool misses_flag=true;
if (cash_type==0) // Direct Mapped
******************************************
{
if (cash[0][index_addr]==tag_addr)
{
return true;
}
else
{
cash[0][index_addr]= tag_addr;
for (int i=0; i < number_of_blocks; i++)
{
if (cash[1][i]!=1)
{ misses_flag=false;
i=number_of_blocks;}
}
//calculating misses
if (misses_flag)
capcity_misses++; // capcity miss because the cash is full
else
{
if(cash[1][index_addr]==1)
conflict_misses++;
else
{
compulsry_misses++;
}
}
cash[1][index_addr]= 1;
return 0;
}
} // end of directed mapped
///////////////////////////////////////////////////////////////////
else if (cash_type==1) // set asscoiative
*************************************
{
index_addr=index_addr * type;
for (int i=0; i < type ; i++)
{
if (cash[0][index_addr+i]==tag_addr)
{
// cout <<"0x hitttttttt" << setfill('0') <<
setw(8) << hex << tag_addr << endl;
return 1;
}
}
for (int j=0; j < type; j++)
{
if (cash[1][index_addr+j] == -1)
{
compulsry_misses++;
cash[0][index_addr+j]=tag_addr;
cash[1][index_addr+j]=1;
return 0;
}
}
srand(time(NULL));
int x=rand()%(type);
cash[0][index_addr+x]=tag_addr;
cash[1][index_addr+x]=1;
capcity_misses++;
return 0;
}//end of set assciative
else if (cash_type==2) // fully associative
**************************************
{
if (type==0) // LRU /////////
{
if (block_counter < number_of_blocks)
{
for (int i=0; i < number_of_blocks; i++)
{
if (cash[0][i]==addr >> shift_offset)
{
detected=true;
cash[1][i]=block_counter;
block_counter--;
return detected; //hit
}
}
if (!detected)
{
compulsry_misses++;
cash[0][block_counter]=addr>>shift_offset;
cash[1][block_counter]=block_counter;
return false; //miss
}
}
else // block counter is more than block size
{
//check for existence
for (int i=0; i < number_of_blocks; i++)
{
if (cash[0][i]==(addr >> shift_offset))
{
detected=true;
cash[1][i]=block_counter;
//block_counter--;
return detected; //hit
}
}
if (!detected)
{
int compare=0;
for (int i=1; i < number_of_blocks; i++)
{
if (cash[1][compare] > cash[1][i])
compare=i;
}
cash[0][compare]=addr >> shift_offset;
cash[1][compare]=block_counter;
capcity_misses++;
return false; //miss
}
}
} // end of LRU
else if (type==1) // LFU ///////////////
{
if (block_counter < number_of_blocks)
{
for (int i=0; i < number_of_blocks; i++)
{
if (cash[0][i]==addr >> shift_offset)
{
detected=true;
cash[1][i]=cash[1][i]+1;
block_counter--;
return detected; //hit
}
}
if (!detected)
{
cash[0][block_counter]=addr>>shift_offset;
cash[1][block_counter]=-1;
compulsry_misses++;
return false; //miss
}
}
else // block counter is more than block size
{
//check for existence
for (int i=0; i < number_of_blocks; i++)
{
if (cash[0][i]==(addr >> shift_offset))
{
detected=true;
cash[1][i]++;
block_counter--;
return detected; //hit
}
}
if (!detected)
{
int compare2=0;
for (int i=1; i < number_of_blocks; i++)
{
if (cash[1][compare2] >= cash[1][i])
compare2=i;
}
cash[0][compare2]=addr >> shift_offset;
cash[1][compare2]=-1;
capcity_misses++;
return false; //miss
}
}
} // end if LFU
else if (type==2)
{
if (block_counter < number_of_blocks)
{
for (int i=0; i < number_of_blocks; i++)
{
if (cash[0][i]==addr >> shift_offset)
{
detected=true;
block_counter--;
return detected; //hit
}
}
if (!detected)
{
cash[0][block_counter]=addr>>shift_offset;
cash[1][block_counter]=block_counter;
compulsry_misses++;
return false; //miss
}
}
else // block counter is more than block size
{
//check for existence
for (int i=0; i < number_of_blocks; i++)
{
if (cash[0][i]==(addr >> shift_offset))
{
detected=true;
//block_counter--;
return detected; //hit
}
}
if (!detected)
{
int compare=0;
for (int i=1; i < number_of_blocks; i++)
{
if (cash[1][compare] > cash[1][i])
compare=i;
}
cash[0][compare]=addr >> shift_offset;
cash[1][compare]=block_counter;
capcity_misses++;
return false; //miss
}
}
}// end of FIFO
else if (type==3)
{
if (block_counter < number_of_blocks)
{
for (int i=0; i < number_of_blocks; i++)
{
if (cash[0][i]==addr >> shift_offset)
{
detected=true;
block_counter--;
return detected; //hit
}
}
if (!detected)
{
cash[0][block_counter]=addr>>shift_offset;
compulsry_misses++;
return false; //miss
}
}
else // block counter is more than block size
{
//check for existence
for (int i=0; i < number_of_blocks; i++)
{
if (cash[0][i]==(addr >> shift_offset))
{
detected=true;
//block_counter--;
return detected; //hit
}
}
if (!detected)
{
srand(time(NULL));
cash[0][rand()%number_of_blocks]=addr >> shift_offset;
capcity_misses++;
return 0; //miss
}
}
}//end of RANDOM
} // end of Fully associative
return true;
}
char *msg[2] = {"Miss","Hit"};
///////////////////////////////////////////////////////////////////
int main(int argc, const char * argv[]) {
int looper=1000000, addr, flag, shift;
cout << "Please, enter 0 for Direct mapped, 1 for set
associative, 2 for fully associative: " << endl;
cin >> cash_type;
cout << "Please, enter the size of the block as a Power of 2
between 4 and 128 byte :" << endl;
cin >> block_size;
cout << "Please, enter cache size: 1KB – 64KB; in steps that
are power of 2: " << endl;
cin >> cash_size;
int cash[3][100000];
int block_counter=0;
int hit_counter=0;
int index_addr=0, tag_addr=0;
///////////////////////////////////////////////////////////////////
if ( cash_type==0) //Direct_mapped **************
{
number_of_blocks= (cash_size*1024)/block_size;
////////////////////
for (int i=0; i < 2; i++) // setting all the cash with -1
for (int j=0; j < number_of_blocks; j++)
cash[i][j]=-1;
//////////////////
for(int i=0; i <looper ;i++)
{
addr = memGen1();
shift= log2(block_size);
index_addr= (addr >> shift)% number_of_blocks;
shift= log2(number_of_blocks+block_size);
tag_addr= addr >>shift; // shifted the amount the offset and
the index sizes
flag = cacheSim(addr, cash, 0,block_counter, index_addr,
tag_addr);
index_addr=0;
tag_addr=0;
cout <<"0x" << setfill('0') << setw(8) <<
hex << addr <<" ("<< msg[flag]
<<")\n";
if (msg[flag]=="Hit")
{
hit_counter++;
}
}
cout << "Hits " << hit_counter<<endl <<
"Compulsry: " << compulsry_misses <<endl<<
"Capcity: " << capcity_misses <<endl<< "Conflict:
" << conflict_misses << endl;
}
///////////////////////////////////////////////////////////////////
else if (cash_type==2) // Fully associative**************
{
int replacment_type;
number_of_blocks= (cash_size*1024)/block_size;
cout << "please, enter the type of replacment for the Fully
Associative: LRU->0 , LFU->1, FIFO->2, RANDOM->3 :- "
<< endl;
cin >> replacment_type;
for (int i=0; i < 2; i++) // setting all the cash with -1
for (int j=0; j < number_of_blocks; j++)
cash[i][j]=-10;
for(int i=0; i <looper ;i++)
{
addr = memGen4();
flag = cacheSim(addr, cash, replacment_type, block_counter,
index_addr, tag_addr);
// cout <<"0x" << setfill('0') << setw(8)
<< hex << addr <<" ("<< msg[flag]
<<")\n";
if (msg[flag]=="Hit")
{
hit_counter++;
}
block_counter++;
}
cout << "Hits " << hit_counter<<endl <<
"Compulsry: " << compulsry_misses <<endl<<
"Capcity: " << capcity_misses <<endl<< "Conflict:
" << conflict_misses << endl;
} // end of fully associative main
else if (cash_type==1) // set associative
{
int number_of_ways;
cout << "please, enter the number of ways for the set
associative cash: 2,4,8,16" << endl;
cin >> number_of_ways;
number_of_blocks=
(cash_size*1024)/(block_size*number_of_ways);
for (int i=0; i < 3; i++) // setting all the cash with -1
for (int j=0; j < 100000; j++)
cash[i][j]=-1;
for(int i=0; i <looper ;i++)
{
addr = memGen5();
shift= log2(block_size);
index_addr= (addr >> shift)% (number_of_blocks);
shift= log2(number_of_blocks+block_size);
tag_addr= addr >>shift;
flag = cacheSim(addr, cash, number_of_ways, block_counter,
index_addr, tag_addr);
// cout <<"0x" << setfill('0') << setw(8)
<< hex << addr <<" ("<< msg[flag]
<<")\n";
index_addr=0;
tag_addr=0;
if (msg[flag]=="Hit")
{
hit_counter++;
}
block_counter++;
}
cout << "Hits " << hit_counter<<endl <<
"Compulsry: " << compulsry_misses <<endl<<
"Capcity: " << capcity_misses <<endl<< "Conflict:
" << conflict_misses << endl;
}
}