?? scoreboarddlg.cpp
字號:
floatreg[2].fi="F2";floatreg[2].num=2;
floatreg[3].fi="F3";floatreg[3].num=3;
floatreg[4].fi="F4";floatreg[4].num=4;
floatreg[5].fi="F5";floatreg[5].num=5;
floatreg[6].fi="F6";floatreg[6].num=6;
floatreg[7].fi="F7";floatreg[7].num=7;
}
int CScoreboardDlg::get_fu_number(char *str)//str point to the instruction's op field
{
int num=-1;
for(int i=0;i<Num_instr_set;i++){
if( !strcmp(str,code[i]) )
break;
}
switch (i)
{
case 0: num=Int;
break;
case 1: num=Mult;
break;
case 2:
case 3: num=Addd;
break;
case 4: num=Divd;
break;
default: num=Null;
break;
}
return num;
}
//run
int CScoreboardDlg::get_next_instr(int stadge,int fu=Null)
{
for(int i=0;i<Num_Instruc;i++){
if( (instruction[i].stage==stadge)&&((fu==Null)||(get_fu_number(instruction[i].op)==fu)))
return i;
}
return -1;
}
int CScoreboardDlg::get_register_number(char * str)//str point to the register name
{
if(!strcmp(str,"\0"))
return Num_Floatreg;
for(int i=0;i<Num_Floatreg;i++){
if(!strcmp(str,floatreg[i].fi))
return i;
}
return -1;
}
bool CScoreboardDlg::available(char * dest)// Destination register
{
bool flag=true;
for (int i=0;i<Num_FU;i++){//for
// if( (statustable[i].fj)&&(statustable[i].fk) ){// if one
if(statustable[i].fj){
if( !strcmp(dest,statustable[i].fj) ){// if two
if( statustable[i].rj ){
flag=false;
break;
}
}// if two
}
if(statustable[i].fk){
if( !strcmp(dest,statustable[i].fk) ){//if three
if(statustable[i].rk){
flag=false;
break;
}
}//if three
}
// }// if one
}//for
return flag;
}
void CScoreboardDlg::issue(void)
{
int fuc_unit; //to indicate the fuction unit
int index_instr;
int index_reg;
int i=0;
CString str;
char *dis=new char[5];
//attain current instruction
if( ( index_instr=get_next_instr(BEG,Null)) !=-1) {//if one
fuc_unit=get_fu_number(instruction[index_instr].op);//atteach the fu and register number which will be used
index_reg=get_register_number(instruction[index_instr].dest);//determine wheather the fu is busy and the dest register is available
if( (statustable[fuc_unit].busy==false) && (resulttable[index_reg]==-1) ){
m_instatus.InsertItem(index_instr,::itoa(0,dis,10));
m_instatus.SetItemText(index_instr,0,::itoa(index_instr,dis,10));
m_instatus.SetItemText(index_instr,1,::itoa(clockcnt,dis,10));
statustable[fuc_unit].busy=true;
statustable[fuc_unit].op=instruction[index_instr].op;
statustable[fuc_unit].fi=instruction[index_instr].dest;
statustable[fuc_unit].fj=instruction[index_instr].sour1;
statustable[fuc_unit].fk=instruction[index_instr].sour2;
statustable[fuc_unit].qj=resulttable[ get_register_number( instruction[index_instr].sour1 ) ];
statustable[fuc_unit].qk=resulttable[ get_register_number( instruction[index_instr].sour2 ) ];
statustable[fuc_unit].rj=(resulttable[ get_register_number( instruction[index_instr].sour1 ) ]==-1);
statustable[fuc_unit].rk=(resulttable[ get_register_number( instruction[index_instr].sour2 ) ]==-1);
resulttable[index_reg]=fuc_unit;
instruction[index_instr].stage=IS;
instruction[index_instr].lasttime=clockcnt;
}
}
}
//bool read=false;
void CScoreboardDlg::readop(void)
{
int fuc_unit; //to indicate the fuction unit
int index_instr;
if( (index_instr=get_next_instr(IS,Null))!=-1 ){//there is still instruction to be processed
fuc_unit=get_fu_number(instruction[index_instr].op);
if( (instruction[index_instr].stage==IS)&&statustable[fuc_unit].rj&&
statustable[fuc_unit].rk ){
if(instruction[index_instr].lasttime!=clockcnt){
//m_list_ps.SetItemText(index_instr,clockcnt,"RO");
m_instatus.SetItemText(index_instr,2,::itoa(clockcnt,clock1,10));
statustable[fuc_unit].rj=false;
statustable[fuc_unit].rk=false;
statustable[fuc_unit].qj=-1;
statustable[fuc_unit].qk=-1;
instruction[index_instr].stage=RO;
instruction[index_instr].lasttime=clockcnt;
}
}
}
}
void CScoreboardDlg::execuse_int()
{
int fuc_unit; //to indicate the fuction unit
int index_instr;
if( ( (index_instr=get_next_instr(RO,Int))!=-1) &&
( (fuc_unit=get_fu_number(instruction[index_instr].op))==Int)){
if(instruction[index_instr].lasttime!=clockcnt){
//m_list_ps.SetItemText(index_instr,clockcnt,"EX_INT");
if((--instruction[index_instr].exe_time==0)){
m_instatus.SetItemText(index_instr,3,::itoa(clockcnt,clock1,10));
printf("instruction has be excused:\t%s,%s,%s,%s cost 1 clocktime\t\n\n",instruction[index_instr].op,instruction[index_instr].dest,instruction[index_instr].sour1,instruction[index_instr].sour2);
instruction[index_instr].stage=EX;
instruction[index_instr].lasttime=clockcnt;
}
}
}
}
void CScoreboardDlg::execuse_addd()
{
int fuc_unit; //to indicate the fuction unit
int index_instr;
if( ( (index_instr=get_next_instr(RO,Addd))!=-1) &&
( (fuc_unit=get_fu_number(instruction[index_instr].op))==Addd)){
if(instruction[index_instr].lasttime!=clockcnt){
//m_list_ps.SetItemText(index_instr,clockcnt,"EX_ADD");
if((--instruction[index_instr].exe_time==0)){
m_instatus.SetItemText(index_instr,3,::itoa(clockcnt,clock1,10));
instruction[index_instr].stage=EX;
instruction[index_instr].lasttime=clockcnt;
}
}
}
}
void CScoreboardDlg::execuse_mult()
{
int fuc_unit; //to indicate the fuction unit
int index_instr;
if( ( (index_instr=get_next_instr(RO,Mult))!=-1) &&
( (fuc_unit=get_fu_number(instruction[index_instr].op))==Mult)){
if(instruction[index_instr].lasttime!=clockcnt){
//m_list_ps.SetItemText(index_instr,clockcnt,"EX_MUL");
if((--instruction[index_instr].exe_time==0)){
m_instatus.SetItemText(index_instr,3,::itoa(clockcnt,clock1,10));
printf("instruction has be excused:\t%s,%s,%s,%s cost 10 clocktime\t\n\n",instruction[index_instr].op,instruction[index_instr].dest,instruction[index_instr].sour1,instruction[index_instr].sour2);
instruction[index_instr].stage=EX;
instruction[index_instr].lasttime=clockcnt;
}
}
}
}
void CScoreboardDlg::execuse_divd()
{
int fuc_unit; //to indicate the fuction unit
int index_instr;
if( ( (index_instr=get_next_instr(RO,Divd))!=-1) &&
( (fuc_unit=get_fu_number(instruction[index_instr].op))==Divd)){
if(instruction[index_instr].lasttime!=clockcnt){
//m_list_ps.SetItemText(index_instr,clockcnt,"EX_DIV");
if((--instruction[index_instr].exe_time==0)){
m_instatus.SetItemText(index_instr,3,::itoa(clockcnt,clock1,10));
printf("instruction has be excused:\t%s,%s,%s,%s cost 40 clocktime\t\n\n",instruction[index_instr].op,instruction[index_instr].dest,instruction[index_instr].sour1,instruction[index_instr].sour2);
instruction[index_instr].stage=EX;
instruction[index_instr].lasttime=clockcnt;
}
}
}
}
void CScoreboardDlg::writback(void)
{
//to indicate the current FU REGISTER INSTRUCTION
int fuc_unit;
int index_instr;
int index_reg;
if ( (index_instr=get_next_instr(EX,Null))!=-1 ){//if_one
fuc_unit=get_fu_number(instruction[index_instr].op);
index_reg=get_register_number(instruction[index_instr].dest);
if ( available(instruction[index_instr].dest) ){//if_two
if(instruction[index_instr].lasttime!=clockcnt){//if_three
resulttable[index_reg]=-1;
for(int i=0;i<Num_FU;i++){
if(statustable[i].qj==fuc_unit){
statustable[i].qj=-1;
statustable[i].rj=true;
}
if(statustable[i].qk==fuc_unit){
statustable[i].qk=-1;
statustable[i].rk=true;
}
}
//m_list_ps.SetItemText(index_instr,clockcnt,"WB");
m_instatus.SetItemText(index_instr,4,::itoa(clockcnt,clock1,10));
statustable[fuc_unit].busy=false;
statustable[fuc_unit].op=NULL;
statustable[fuc_unit].fi=NULL;
statustable[fuc_unit].fj=NULL;
statustable[fuc_unit].fk=NULL;
statustable[fuc_unit].qj=-1;
statustable[fuc_unit].qk=-1;
statustable[fuc_unit].rj=true;
statustable[fuc_unit].rk=true;
instruction[index_instr].stage=WB;
instruction[index_instr].lasttime=clockcnt;
}//if_three
}//if_tow
}//if_one
}
void CScoreboardDlg::updatelist()
{
CString str="\0";
char* dis=new char[5];
int fu;
for(int j=0;j<Num_FU;j++)
{
if(statustable[j].op!=NULL){
fu=get_fu_number(statustable[j].op);
m_function.SetItemText(fu,2,statustable[j].op);
if(statustable[j].busy)
str="Yes";
else
str="No";
m_function.SetItemText(fu,1,str);
m_function.SetItemText(fu,3,_T(statustable[j].fi));
m_function.SetItemText(fu,4,_T(statustable[j].fj));
m_function.SetItemText(fu,5,_T(statustable[j].fk));
switch(statustable[j].qj)
{
case -1:str=" ";
break;
case Int:str="Int";
break;
case Addd:str="Addd";
break;
case Mult:str="Mult";
break;
case Divd:str="Divd";
break;
}
m_function.SetItemText(fu,6,_T(str));
switch(statustable[j].qk)
{
case -1:str=" ";
break;
case Int:str="Int";
break;
case Addd:str="Addd";
break;
case Mult:str="Mult";
break;
case Divd:str="Divd";
break;
}
m_function.SetItemText(fu,7,_T(str));
if(statustable[j].rj)
str="Yes";
else
str="no";
m_function.SetItemText(fu,8,_T(str));
if(statustable[j].rk)
str="Yes";
else
str="no";
m_function.SetItemText(fu,9,_T(str));
}else{//for if
m_function.SetItemText(j,1,"no");
m_function.SetItemText(j,2," ");
m_function.SetItemText(j,3," ");
m_function.SetItemText(j,4," ");
m_function.SetItemText(j,5," ");
}//if
}//for
for(j=0;j<Num_Floatreg+1;j++){
str.Format("%d",resulttable[j]);
m_register.SetItemText(0,j,_T(str));
}
for(j=0;j<Num_Instruc;j++){
switch(instruction[j].stage){
case BEG: str="BEG";
break;
case IS: str="IS";
break;
case RO: str="RO";
break;
case EX: str="EX";
break;
case WB: str="WB";
break;
//case EXE: str="EXED";
//break;
}
//m_instruction.SetItemText(j,4,_T(str));
}
}
void CScoreboardDlg::runauto()
{
char *dis=new char[5];
CString str;
str.Format("%d",clockcnt);
//m_instatus.InsertColumn(clockcnt,str,LVCFMT_LEFT,50);
m_clock=++clockcnt;
issue();
readop();
execuse_int();
execuse_addd();
execuse_mult();
execuse_divd();
writback();
updatelist();
UpdateData(FALSE);
bool finished=testfinished();
if(finished==true){
KillTimer(1);
MessageBox("All instructions have been finished?。。?quot;,"Finished",MB_OK|MB_ICONWARNING);
}
//CScoreboardDlg::runauto();
else CScoreboardDlg::runauto();
/*for(int k=1000000;k>0;k--)
for(int j=1000000;j>0;j--)
{
{;}
}*/
}
void CScoreboardDlg::steprun()
{
char *dis=new char[5];
stepinto=true;
stepflag=true;
CString str;
if(stepflag){
str.Format("%d",clockcnt);
//m_list_ps.InsertColumn(clockcnt,str,LVCFMT_LEFT,50);
m_clock=clockcnt++;
issue();
readop();
execuse_int();
execuse_addd();
execuse_mult();
execuse_divd();
writback();
updatelist();
UpdateData(FALSE);
stepflag=false;
}
bool finished=testfinished();
if(finished==true){
KillTimer(1);
MessageBox("All instructions have been finished?。?!","Finished",MB_OK|MB_ICONWARNING);
}
// CScoreboardDlg::steprun();
}
void CScoreboardDlg::OnSetsystem()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
}
void CScoreboardDlg::OnButton2()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
}
void CScoreboardDlg::OnMenuitem32775()
{
// TODO: Add your command handler code here
m_instruction.DeleteAllItems();
m_instatus.DeleteAllItems();
clockcnt=0;
m_clock=0;UpdateData(FALSE);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -