Main Page | Class Hierarchy | Alphabetical List | Compound List | File List | Compound Members | File Members

bb_edge_profile.cpp

Go to the documentation of this file.
00001 /*
00002         Copyright (C) 1997 CFU Corporation
00003 
00004         File: bb_edge_profile.cpp
00005         Author: Chao-yinig Fu
00006         Date: Aug. 24 1998
00007 
00008         ^..^
00009         (00)
00010 
00011          $__$
00012         <~00~>
00013          (oo)
00014           ||
00015 
00016         ```````
00017         C ^|^ D
00018          \ O /
00019 */
00020 
00021 #include "bb_edge_profile.h"
00022 #include <stdio.h>
00023 #include "util.h"
00024 #include "cfg.h"
00025 #include "node_table.h"
00026 #include "edge_table.h"
00027 #include "predicate.h"
00028 #include <legoUtil.H>
00029 #include "lego_util.h"
00030 #include "instrument.h"
00031 
00032 //#define BEDEBUG
00033 #ifdef BEDEBUG
00034 #define BELEVEL 1
00035 #define BEdb(my_level,format,args...) emit_message2(BELEVEL,my_level,format,##args)
00036 #else
00037 #define BEdb(my_level,format,args...)
00038 #endif // BEDEBUG
00039 
00040 void BB_Edge_Profile::doit(legoModule *module_ptr,int option)
00041 {
00042         //
00043         // Step 1. Initialize the true predicate, so that we can use it later
00044         //         Initialize _my_instrument for using later
00045         //
00046         Predicate::init_true_predicate_oprd();
00047         _my_instrument.initialize_parameters();
00048 
00049 
00050         FILE *bb_table_fp=NULL;
00051         FILE *edge_table_fp=NULL;
00052         int bb_start_index;
00053         int edge_start_index;
00054 
00055         int proc_count=module_ptr->GetCount();
00056         for(int i=0;i<proc_count;i++)
00057         {
00058                 legoProc *proc_ptr;
00059                 legoRegion *region_ptr;
00060                 proc_ptr=(legoProc *)module_ptr->GetItem(i);
00061                 assert(proc_ptr->GetRegionType()==RT_PROC);
00062 
00063                 //
00064                 // Step 1. Initialize the operand for instrumentation
00065                 //
00066                 _my_instrument.initialize_temp_registers(proc_ptr);
00067 
00068                 //
00069                 // Step 2. Rename _main to _MaiN, because we will create
00070                 //      our own version of _main
00071                 //
00072                 if(strcmp(proc_ptr->GetProcName(),"_main")==0)
00073                 {
00074                         _my_instrument.rename_main(module_ptr,proc_ptr);
00075                 }
00076 
00077                 //
00078                 // Step 3. Build CFG
00079                 //
00080                 CFG *cfg=new CFG();
00081                 cfg->build(proc_ptr);
00082                 //cfg->print(stderr);
00083 
00084                 //
00085                 // Step 4. Build node_table
00086                 //
00087                 _bb_node_table=new Node_Table();
00088 
00089                 if(i==0)
00090                 {
00091                         //_bb_node_table->open_file_with_value("BBiD_PT");
00092                         _bb_node_table->open_file("BBiD_PT");
00093                         bb_table_fp=_bb_node_table->node_table_fp();
00094                 }
00095                 else
00096                 {
00097                         _bb_node_table->set_node_table_fp(bb_table_fp);
00098                         _bb_node_table->set_start_index(bb_start_index);
00099                 }
00100 
00101                 _bb_node_table->build_from_proc(proc_ptr);
00102                 //_bb_node_table->print_with_value2(_bb_node_table->node_table_fp());
00103                 _bb_node_table->print(_bb_node_table->node_table_fp());
00104                 //_bb_node_table->print_with_value2(stderr);
00105                 bb_start_index=_bb_node_table->start_index();
00106 
00107                 // 
00108                 // Step 5. Build edge_table
00109                 //
00110                 _edge_table=new Edge_Table();
00111 
00112                 if(i==0)
00113                 {
00114                         _edge_table->open_new_or_old_file("eDGe_PT");
00115                         edge_table_fp=_edge_table->table_fp();
00116                 }
00117                 else
00118                 {
00119                         _edge_table->set_table_fp(edge_table_fp);
00120                         _edge_table->set_start_index(edge_start_index);
00121                 }
00122 
00123                 _edge_table->build(cfg);
00124                 _edge_table->profile_all_edges();
00125                 _edge_table->print_to_file(_edge_table->table_fp());
00126                 //_edge_table->print_to_file(stderr);
00127                 edge_start_index=_edge_table->start_index();
00128                 assert(edge_start_index>=0);
00129 
00130                 //
00131                 // Step 6. Reset bbid_start & bbid_end
00132                 //
00133                 reset_bbid_start();
00134                 reset_bbid_end();
00135 
00136                 //
00137                 // Step 7. Instrument
00138                 //
00139                 instrument(proc_ptr);
00140 
00141                 //
00142                 // Step 8. check_max_op_id
00143                 //
00144                 check_max_op_id(proc_ptr);
00145 
00146                 //
00147                 // Step 9. Clear
00148                 //
00149                 delete cfg;
00150                 delete _edge_table;
00151                 delete _bb_node_table;
00152         }
00153 
00154         if(proc_count>0)
00155         {
00156                 fclose(bb_table_fp);
00157                 fclose(edge_table_fp);
00158 
00159                 open_main_file(bb_start_index,edge_start_index);
00160                 open_header_file();
00161                 close_main_file();
00162                 close_header_file();
00163         }
00164 }
00165 
00166 void BB_Edge_Profile::lego_write(legoModule *module_ptr,char *input_filename)
00167 {
00168         char *output_filename=new char[strlen(input_filename)+9];
00169         strcpy(output_filename,input_filename);
00170 
00171         int i=strlen(input_filename)-3;
00172 
00173         output_filename[i+0]='_';
00174         output_filename[i+1]='B';
00175         output_filename[i+2]='B';
00176         output_filename[i+3]='_';
00177         output_filename[i+4]='e';
00178         output_filename[i+5]='D';
00179         output_filename[i+6]='G';
00180         output_filename[i+7]='e';
00181         output_filename[i+8]='.';
00182         output_filename[i+9]='e';
00183         output_filename[i+10]='l';
00184         output_filename[i+11]='\0';
00185 
00186         LegoWrite(module_ptr,output_filename);
00187 }
00188 
00189 void BB_Edge_Profile::instrument(legoProc *proc_ptr)
00190 {
00191         recursive_instrument(proc_ptr,proc_ptr);
00192 }
00193 
00194 //
00195 // This function will recursively call until reach the basic block region
00196 // Inside the basic block, we will save int_p1, insert pbrr, insert call,
00197 // and restore int_p1.
00198 //
00199 void BB_Edge_Profile::recursive_instrument(legoProc *proc_ptr,legoRegion *region_ptr)
00200 {
00201         int sub_region_count;
00202         legoRegion *sub_region_ptr;
00203 
00204         regionTypes region_type=region_ptr->GetRegionType();
00205 
00206         switch(region_type)
00207         {
00208                 case RT_PROC:
00209                         //fprintf(stderr,"RT_PROC\n");
00210                 case RT_LOOP:
00211                         //fprintf(stderr,"RT_LOOP\n");
00212                 case RT_LOOPBODY:
00213                         //fprintf(stderr,"RT_LOOPBODY\n");
00214                 case RT_TRACE:
00215                         //fprintf(stderr,"RT_TRACE\n");
00216                 case RT_TREE:
00217                         //fprintf(stderr,"RT_TREE\n");
00218 
00219                         sub_region_count=region_ptr->GetCount();
00220                         for(int i=0;i<sub_region_count;i++)
00221                         {
00222                                 sub_region_ptr=(legoRegion *)region_ptr->GetItem
00223 (i);
00224                                 recursive_instrument(proc_ptr,sub_region_ptr);
00225                         }
00226                         break;
00227                 case RT_SB:
00228                 case RT_HB:
00229                 case RT_BB:
00230                         insert_probe(proc_ptr,region_ptr);
00231                         break;
00232 
00233                 default:
00234                         fprintf(stderr,"ERROR region_type\n");
00235                         assert(0);
00236                         break;
00237         }
00238 }
00239 
00240 void BB_Edge_Profile::insert_probe(legoProc *proc_ptr,legoRegion *region_ptr)
00241 {
00242 
00243         //
00244         // Step 1. Insert bbid start probe
00245         //
00246         int region_id=region_ptr->GetRegionId();
00247         int mapping=_bb_node_table->find(region_id);
00248         opList *entry_op_list=region_ptr->GetEntryOpsPtr();
00249         legoOp *from_op_ptr=entry_op_list->GetOpPtr();
00250         int s_time=from_op_ptr->GetSchedTime();
00251 
00252         from_op_ptr=_my_instrument.append_save_and_set_1_param_code(mapping,proc_ptr,region_ptr,Predicate::true_predicate_oprd(),from_op_ptr,s_time);
00253 
00254         from_op_ptr=_my_instrument.append_pbrr_code(BB_EDGE_PROFILE_START_PROBE_NAME,proc_ptr,region_ptr,Predicate::true_predicate_oprd(),from_op_ptr,s_time);
00255 
00256         from_op_ptr=_my_instrument.append_brl_code(proc_ptr,region_ptr,Predicate::true_predicate_oprd(),from_op_ptr,1,s_time);
00257 
00258         from_op_ptr=_my_instrument.append_restore_1_param_code(proc_ptr,region_ptr,Predicate::true_predicate_oprd(),from_op_ptr,s_time);
00259 
00260         //
00261         // Step 2. Instrument exit op
00262         //
00263         for(opList *exit_op_list=region_ptr->GetExitOpsPtr();exit_op_list!=NULL;exit_op_list=exit_op_list->GetNextListPtr())
00264         {
00265                 legoOp *exit_op=exit_op_list->GetOpPtr();
00266                 if(exit_op!=NULL)
00267                 {
00268                         BEdb(3,"exit_op %d %s",exit_op->GetOpId(),ParseMap(exit_op->GetOpcode()));
00269                         instrument_exit_op(proc_ptr,region_ptr,exit_op);
00270                         //getchar();
00271                 }
00272         }
00273 }
00274 
00275 
00276 //
00277 // If region_id doesn't have end probe, return 0
00278 // else return 1
00279 //
00280 int BB_Edge_Profile::bbid_end_has_probe(int region_id)
00281 {
00282         for(int i=0;i<_bbid_end_index;i++)
00283         {
00284                 if(_bbid_end[i]==region_id)
00285                         return 1;
00286         }
00287         return 0;
00288 }
00289 
00290 void BB_Edge_Profile::bbid_end_insert(int region_id)
00291 {
00292         _bbid_end[_bbid_end_index]=region_id;
00293         _bbid_end_index++;
00294         assert(_bbid_end_index<MAX_BB_ENTRY);
00295 }
00296 
00297 void BB_Edge_Profile::reset_bbid_start()
00298 {
00299         for(int i=0;i<MAX_BB_ENTRY;i++)
00300         {
00301                 _bbid_start[i]=0;
00302         }
00303 
00304         _bbid_start_index=0;
00305 }
00306 
00307 void BB_Edge_Profile::reset_bbid_end()
00308 {
00309         for(int i=0;i<MAX_BB_ENTRY;i++)
00310         {
00311                 _bbid_end[i]=0;
00312         }
00313 
00314         _bbid_end_index=0;
00315 }
00316 
00317 //
00318 // If region_id doesn't have start probe, return 0
00319 // else return 1
00320 //
00321 int BB_Edge_Profile::bbid_start_has_probe(int region_id)
00322 {
00323         for(int i=0;i<_bbid_start_index;i++)
00324         {
00325                 if(_bbid_start[i]==region_id)
00326                         return 1;
00327         }
00328         return 0;
00329 }
00330 
00331 void BB_Edge_Profile::bbid_start_insert(int region_id)
00332 {
00333         _bbid_start[_bbid_start_index]=region_id;
00334         _bbid_start_index++;
00335         assert(_bbid_start_index<MAX_BB_ENTRY);
00336 }
00337 
00338 
00339 //
00340 // Check the exit_op
00341 // and decide to insert probe or nto
00342 //
00343 void BB_Edge_Profile::instrument_exit_op(legoProc *proc_ptr,legoRegion *region_ptr,legoOp *exit_op)
00344 {
00345         int exit_opcode=exit_op->GetOpcode();
00346         int s_time=exit_op->GetSchedTime();
00347         BEdb(1,"proc %s region_id %d",proc_ptr->GetProcName(),region_ptr->GetRegionId());
00348         BEdb(1,"exit_op %d %s",exit_op->GetOpId(),ParseMap(exit_opcode));
00349 
00350         //
00351         // Step 0. check if exit_op's predicate is true predicate
00352         //
00353         if(exit_opcode!=DUMMY_BR)
00354         {
00355                 legoOprd *exit_op_pred=exit_op->GetPredOprdPtr();
00356                 assert(exit_op_pred!=NULL);
00357                 assert(exit_op_pred->GetNextOprdPtr()==NULL);
00358                 assert(exit_op_pred->GetOprdType()==OT_LITERAL_P && exit_op_pred->GetBooleanVal()==1);
00359         }
00360 
00361 
00362 
00363         opList *out_list=exit_op->GetOutListPtr();
00364         assert(out_list!=NULL);
00365 
00366         if(exit_opcode==DUMMY_BR || exit_opcode==BRU)
00367         {
00368                 //
00369                 // Case 1. One path only
00370                 //
00371                 // If there is only one destination, just insert 
00372                 // _MY_1_PRoBe before exit_op
00373                 // _MY_1_PRoBe has the parameter of the edge mapping id
00374                 //
00375                 if(out_list->GetNextListPtr()==NULL)
00376                 {
00377                         legoOp *to_op=out_list->GetOpPtr();
00378                         int to_opid=to_op->GetOpId();
00379                         BEdb(2,"to %d",to_opid);
00380 
00381                         edgeList *edge_list=find_edgeList_from_op_to_op(region_ptr,exit_op,to_op);
00382                         assert(edge_list!=NULL);
00383                         BEdb(3,"edge_id %d",edge_list->GetEdgeId());
00384 
00385                         Edge *e=_edge_table->find_edge(edge_list->GetEdgeId());
00386                         BEdb(2,"%d\t%d\t%d\t%d\n",e->counter_index(),e->profile(),e->edge_id(),e->weight());
00387 
00388                         int path_mapping=e->counter_index();
00389 
00390                         //
00391                         // FIX
00392                         //insert_1_probe(proc_ptr,region_ptr,Predicate::true_predicate_oprd(),path_mapping,exit_op,"_MY_1_PRoBe"); 
00393 
00394                         _my_instrument.prepend_save_and_set_1_param_code(path_mapping,proc_ptr,region_ptr,Predicate::true_predicate_oprd(),exit_op,s_time);
00395                         _my_instrument.prepend_pbrr_code(BB_EDGE_PROFILE_1_PROBE_NAME,proc_ptr,region_ptr,Predicate::true_predicate_oprd(),exit_op,s_time);
00396                         _my_instrument.prepend_brl_code(proc_ptr,region_ptr,Predicate::true_predicate_oprd(),exit_op,1,s_time);
00397                         _my_instrument.prepend_restore_1_param_code(proc_ptr,region_ptr,Predicate::true_predicate_oprd(),exit_op,s_time);
00398 
00399                 } 
00400                 //
00401                 // Case 2. Multiple Paths (switch statement)
00402                 //
00403                 // If there are more than one destination (switch statement),
00404                 // insert _MY_BBiD_eND_PRoBe
00405                 // _MY_BBiD_eND_PRoBe has the parameter of the (bbid mapping+100000)
00406                 //
00407                 else
00408                 {
00409                         int exit_opid=exit_op->GetOpId();
00410                         fprintf(stderr,"ERROR!!! proc %s region %d:\n",proc_ptr->GetProcName(),region_ptr->GetRegionId());
00411                         fprintf(stderr,"exit_op %d %s has more than one out edges (switch statement)\n",exit_opid,ParseMap(exit_opcode));
00412 
00413                         int exit_op_region_id=region_ptr->GetRegionId();
00414                         if(bbid_end_has_probe(exit_op_region_id)==0)
00415                         {
00416                                 fprintf(stderr,"bb %d doesn't have end probe. Insert it.\n",exit_op_region_id);
00417                                 //
00418                                 // Set the bit
00419                                 //
00420                                 bbid_end_insert(exit_op_region_id);
00421 
00422                                 //
00423                                 // insert probe before exit_op
00424                                 //
00425                                 int bbid_mapping=_bb_node_table->find(exit_op_region_id);
00426 
00427                                 fprintf(stderr,"bbid_mapping=%d\n",bbid_mapping);
00428                                 //
00429                                 // For end probe, mapping=bbid_mapping+100000
00430                                 //
00431                                 int end_mapping=bbid_mapping+100000;
00432 
00433                                 //
00434                                 // FIX
00435                                 //insert_1_probe(proc_ptr,region_ptr,Predicate::true_predicate_oprd(),end_mapping,exit_op,"_MY_BBiD_eND_PRoBe");
00436 
00437                                 _my_instrument.prepend_save_and_set_1_param_code(end_mapping,proc_ptr,region_ptr,Predicate::true_predicate_oprd(),exit_op,s_time);
00438                                 _my_instrument.prepend_pbrr_code(BB_EDGE_PROFILE_eND_PROBE_NAME,proc_ptr,region_ptr,Predicate::true_predicate_oprd(),exit_op,s_time);
00439                                 _my_instrument.prepend_brl_code(proc_ptr,region_ptr,Predicate::true_predicate_oprd(),exit_op,1,s_time);
00440                                 _my_instrument.prepend_restore_1_param_code(proc_ptr,region_ptr,Predicate::true_predicate_oprd(),exit_op,s_time);
00441 
00442                         }
00443                         else
00444                         {
00445                                 fprintf(stderr,"bb %d has end probe already.  Don't need to insert it.\n",exit_op_region_id);
00446                         }
00447 
00448 
00449                         /*
00450                         //
00451                         // Just for knowing where those targets are
00452                         //
00453                         opList *my_out_list=exit_op->GetOutListPtr();
00454                         for(;my_out_list!=NULL;my_out_list=my_out_list->GetNextListPtr())
00455                         {
00456                                 legoOp *my_to_op=my_out_list->GetOpPtr();
00457                                 int my_to_opid=my_to_op->GetOpId();
00458                                 legoRegion *my_region_ptr=find_lego_block_with_op_id(proc_ptr,my_to_opid);
00459                                 int my_region_id=my_region_ptr->GetRegionId();
00460 
00461                                 edgeList *my_edge_list=find_edgeList_from_op_to_op(region_ptr,exit_op,my_to_op);
00462                                 int my_edge_id=my_edge_list->GetEdgeId();
00463 
00464                                 Edge *my_e=_edge_table->find_edge(my_edge_id);
00465                                 int my_mapping=my_e->counter_index();
00466 
00467                                 fprintf(stderr,"goto CB_LAB %d OpId %d (edge %d, mapping %d)\n",my_region_id,my_to_opid,my_edge_id,my_mapping);
00468 
00469                         }
00470                         */
00471                 }
00472         }
00473         //
00474         // Case 3. Two Paths (Fall through and Taken paths)
00475         //
00476         else if(exit_opcode==BRCT)
00477         {
00478                 int to_opid1=-1,to_opid2=-1;
00479                 Edge *e1=NULL,*e2=NULL;
00480 
00481                 //
00482                 // Step 1. First Edge Processing
00483                 //
00484                 legoOp *to_op1=out_list->GetOpPtr();
00485                 to_opid1=to_op1->GetOpId();
00486                 BEdb(2,"1) to %d",to_opid1);
00487 
00488                 edgeList *edge_list1=find_edgeList_from_op_to_op(region_ptr,exit_op,to_op1);
00489 
00490                 if(edge_list1!=NULL)
00491                 {
00492                         BEdb(3,"1) edge_id %d",edge_list1->GetEdgeId());
00493 
00494                         e1=_edge_table->find_edge(edge_list1->GetEdgeId());
00495                         BEdb(2,"1) %d\t%d\t%d\t%d\n",e1->counter_index(),e1->profile(),e1->edge_id(),e1->weight());
00496                 }
00497 
00498 
00499                 //
00500                 // Step 2. Second Edge Processing
00501                 //
00502                 out_list=out_list->GetNextListPtr();
00503                 assert(out_list!=NULL);
00504                 assert(out_list->GetNextListPtr()==NULL);
00505 
00506                 legoOp *to_op2=out_list->GetOpPtr();
00507                 to_opid2=to_op2->GetOpId();
00508                 BEdb(2,"2) to %d",to_opid2);
00509 
00510                 edgeList *edge_list2=find_edgeList_from_op_to_op(region_ptr,exit_op,to_op2);
00511                 if(edge_list2!=NULL)
00512                 {
00513                         BEdb(3,"2) edge_id %d",edge_list2->GetEdgeId());
00514                         e2=_edge_table->find_edge(edge_list2->GetEdgeId());
00515                         BEdb(2,"2) %d\t%d\t%d\t%d\n",e2->counter_index(),e2->profile(),e2->edge_id(),e2->weight());
00516                 }
00517 
00518                 //
00519                 // Step 3. Get exit_op branch target register and 
00520                 //         predicate register
00521                 //
00522                 legoOprd *branch_target_oprd=exit_op->GetSrcOprdPtr();
00523                 legoOprd *predicate_oprd=branch_target_oprd->GetNextOprdPtr();
00524                 assert(predicate_oprd->GetNextOprdPtr()==NULL);
00525 
00526                 assert(branch_target_oprd->GetOprdType()==OT_REG);
00527                 assert(branch_target_oprd->GetOprdRegType()==RT_R);
00528                 assert(branch_target_oprd->GetOprdFileType()==FT_BTR);
00529                 assert(branch_target_oprd->GetOprdDataType()==DT_B);
00530                 BEdb(2,"r<%d:b btr>",branch_target_oprd->GetOprdRegNum());
00531         
00532                 assert(predicate_oprd->GetOprdType()==OT_REG);
00533                 assert(predicate_oprd->GetOprdDataType()==DT_P);
00534                 assert(predicate_oprd->GetOprdFileType()==FT_PR);
00535                 assert(predicate_oprd->GetOprdRegType()==RT_R);
00536                 BEdb(2,"r<%d:p pr>",predicate_oprd->GetOprdRegNum());
00537 
00538                 //
00539                 // Step 4. Find PBRR which defines branch_target_oprd
00540                 //
00541                 legoOp *pbrr_op;
00542 
00543                 for(pbrr_op=exit_op->GetPrevLink();pbrr_op!=NULL;pbrr_op=pbrr_op->GetPrevLink())
00544                 {
00545                         if(pbrr_op->GetOpcode()==PBRR)
00546                                 break;
00547                 }
00548 
00549                 assert(pbrr_op!=NULL);
00550                 legoOprd *dest_oprd=pbrr_op->GetDestOprdPtr();
00551                 assert(dest_oprd->GetOprdType()==OT_REG);
00552                 assert(dest_oprd->GetOprdRegType()==RT_R);
00553                 assert(dest_oprd->GetOprdFileType()==FT_BTR);
00554                 assert(dest_oprd->GetOprdDataType()==DT_B);
00555 
00556                 if(dest_oprd->GetOprdRegNum()!=branch_target_oprd->GetOprdRegNum())
00557                 {
00558                         assert(0);
00559                 }
00560 
00561                 if(edge_list1!=NULL && edge_list2!=NULL)
00562                 {
00563                         //
00564                         // Step 5. From source operand of PBRR to know block_id
00565                         //
00566                         legoOprd *pbrr_src_oprd=pbrr_op->GetSrcOprdPtr();
00567                         assert(pbrr_src_oprd->GetOprdType()==OT_LITERAL_CB);
00568                         int pbrr_block_id=pbrr_src_oprd->GetLiteralControlBlock();
00569                         BEdb(2,"pbrr_block_id=%d",pbrr_block_id);
00570 
00571                         //
00572                         // Step 6. Get the entry_ops id for pbrr_block_id
00573                         //
00574                         legoRegion *dest_region=find_lego_block_with_region_id(proc_ptr,pbrr_block_id);
00575                         opList *dest_entry_op_list=dest_region->GetEntryOpsPtr();
00576                         legoOp *dest_entry_op=dest_entry_op_list->GetOpPtr();
00577                         int dest_entry_op_id=dest_entry_op->GetOpId();
00578                         BEdb(2,"dest_entry_op_id=%d",dest_entry_op_id);
00579 
00580                         //
00581                         // Step 7. set true_path_mapping & false_path_mapping
00582                         //
00583                         int true_path_mapping=-1,false_path_mapping=-1;
00584                         if(to_opid1==dest_entry_op_id)
00585                         {
00586                                 true_path_mapping=e1->counter_index();
00587                                 false_path_mapping=e2->counter_index();
00588                         }
00589                         else if(to_opid2==dest_entry_op_id)
00590                         {
00591                                 true_path_mapping=e2->counter_index();
00592                                 false_path_mapping=e1->counter_index();
00593                         }
00594                         else
00595                         {
00596                                 assert(0);
00597                         }
00598 
00599                         //
00600                         // Step 8. call insert_probe
00601                         //
00602                         // FIX
00603                         _my_instrument.prepend_3_probes(proc_ptr,region_ptr,predicate_oprd,true_path_mapping,false_path_mapping,Predicate::true_predicate_oprd(),exit_op,s_time);
00604 
00605 
00606                 }
00607                 else
00608                 {
00609                         //
00610                         // inside hyperblock
00611                         //
00612                         BEdb(2,"Hyperblock");
00613                         int path_mapping;
00614 
00615                         if(e1!=NULL && e2==NULL)
00616                         {
00617                                 path_mapping=e1->counter_index();
00618                         }
00619                         else if(e2!=NULL && e1==NULL)
00620                         {
00621                                 path_mapping=e2->counter_index();
00622                         }
00623                         else
00624                         {
00625                                 assert(0);
00626                         }
00627 
00628                         //
00629                         // FIX
00630                         //insert_1_probe(proc_ptr,region_ptr,predicate_oprd,path_mapping,exit_op,"_MY_1_PRoBe");
00631 
00632                         _my_instrument.prepend_save_and_set_1_param_code(path_mapping,proc_ptr,region_ptr,predicate_oprd,exit_op,s_time);
00633                         _my_instrument.prepend_pbrr_code(BB_EDGE_PROFILE_1_PROBE_NAME,proc_ptr,region_ptr,predicate_oprd,exit_op,s_time);
00634                         _my_instrument.prepend_brl_code(proc_ptr,region_ptr,predicate_oprd,exit_op,1,s_time);
00635                         _my_instrument.prepend_restore_1_param_code(proc_ptr,region_ptr,predicate_oprd,exit_op,s_time);
00636 
00637 
00638                         //getchar();
00639                 }
00640         }
00641         else if(exit_opcode==RTS)
00642         {
00643                 // Do nothing!!!
00644         }
00645         else
00646         {
00647                 assert(0);
00648         }
00649 }
00650 
00651 /*
00652 //
00653 // Insert 3 probes
00654 // predicate_oprd is used as parameter 1
00655 // Ex:
00656 //
00657 void BB_Edge_Profile::insert_3_probes(legoProc *proc_ptr,legoRegion *region_ptr,legoOprd *predicate_oprd,int true_path_mapping,int false_path_mapping,legoOp* from_op_ptr)
00658 {
00659         BEdb(2,"true_path_maping=%d false_path_mapping=%d",true_path_mapping,false_path_mapping);
00660 
00661         legoOprd *my_true_predicate_oprd=Predicate::true_predicate_oprd();
00662 
00663         int max_op_id=(FindMaxOpId(proc_ptr))->GetOpId()+1;
00664 
00665         // Ex: Save int_p1 register
00666         // op 165 (MOVE [r<84:i gpr>] [m<int_p1>] r<38:p pr>)
00667         //
00668         legoOp *new_op_ptr=new legoOp(max_op_id++);
00669         new_op_ptr->SetOpcode(MOVE);
00670         new_op_ptr->SetSrcOprdPtr(_int_p1_oprd);
00671         new_op_ptr->SetDestOprdPtr(_save_p1_oprd);
00672         new_op_ptr->SetPredOprdPtr(my_true_predicate_oprd);
00673 
00674         //WriteOps(new_op_ptr,1,stderr,0);
00675         insert_new_op_before(region_ptr,proc_ptr,from_op_ptr,new_op_ptr);
00676 
00677         // Ex: Save int_p2 register
00678         // op 166 (MOVE [r<85:i gpr>] [m<int_p2>] r<38:p pr>)
00679         //
00680         new_op_ptr=new legoOp(max_op_id++);
00681         new_op_ptr->SetOpcode(MOVE);
00682         new_op_ptr->SetSrcOprdPtr(_int_p2_oprd);
00683         new_op_ptr->SetDestOprdPtr(_save_p2_oprd);
00684         new_op_ptr->SetPredOprdPtr(my_true_predicate_oprd);
00685 
00686         //WriteOps(new_op_ptr,1,stderr,0);
00687         insert_new_op_before(region_ptr,proc_ptr,from_op_ptr,new_op_ptr);
00688 
00689         // Ex: Save int_p3 register
00690         // op 167 (MOVE [r<86:i gpr>] [m<int_p3>] r<38:p pr>)
00691         //
00692         new_op_ptr=new legoOp(max_op_id++);
00693         new_op_ptr->SetOpcode(MOVE);
00694         new_op_ptr->SetSrcOprdPtr(_int_p3_oprd);
00695         new_op_ptr->SetDestOprdPtr(_save_p3_oprd);
00696         new_op_ptr->SetPredOprdPtr(my_true_predicate_oprd);
00697 
00698         //WriteOps(new_op_ptr,1,stderr,0);
00699         insert_new_op_before(region_ptr,proc_ptr,from_op_ptr,new_op_ptr);
00700 
00701         // Ex: Set int_p1 to predicate_oprd
00702         // op 168 (MOVE [m<int_p1>] [r<38:p pr>] p<t>)
00703         //
00704         new_op_ptr=new legoOp(max_op_id++);
00705         new_op_ptr->SetOpcode(MOVE);
00706 
00707         new_op_ptr->SetSrcOprdPtr(predicate_oprd);
00708         new_op_ptr->SetDestOprdPtr(_int_p1_oprd);
00709         new_op_ptr->SetPredOprdPtr(my_true_predicate_oprd);
00710 
00711         //WriteOps(new_op_ptr,1,stderr,0);
00712         insert_new_op_before(region_ptr,proc_ptr,from_op_ptr,new_op_ptr);
00713 
00714         // Ex: Set int_p2 to ture_path_mapping
00715         // op 169 (MOVE [m<int_p2>] [i<2>] p<t>)
00716         //
00717         new_op_ptr=new legoOp(max_op_id++);
00718         new_op_ptr->SetOpcode(MOVE);
00719 
00720         legoOprd *src_oprd=new legoOprd();
00721         src_oprd->SetOprdType(OT_LITERAL_I);
00722         src_oprd->SetLiteralInteger(true_path_mapping);
00723 
00724         new_op_ptr->SetSrcOprdPtr(src_oprd);
00725         new_op_ptr->SetDestOprdPtr(_int_p2_oprd);
00726         new_op_ptr->SetPredOprdPtr(my_true_predicate_oprd);
00727 
00728         //WriteOps(new_op_ptr,1,stderr,0);
00729         insert_new_op_before(region_ptr,proc_ptr,from_op_ptr,new_op_ptr);
00730 
00731         // Ex: Set int_p3 to false_path_mapping
00732         // op 170 (MOVE [m<int_p3>] [i<1>] p<t>)
00733         //
00734         new_op_ptr=new legoOp(max_op_id++);
00735         new_op_ptr->SetOpcode(MOVE);
00736 
00737         src_oprd=new legoOprd();
00738         src_oprd->SetOprdType(OT_LITERAL_I);
00739         src_oprd->SetLiteralInteger(false_path_mapping);
00740 
00741         new_op_ptr->SetSrcOprdPtr(src_oprd);
00742         new_op_ptr->SetDestOprdPtr(_int_p3_oprd);
00743         new_op_ptr->SetPredOprdPtr(my_true_predicate_oprd);
00744 
00745         //WriteOps(new_op_ptr,1,stderr,0);
00746         insert_new_op_before(region_ptr,proc_ptr,from_op_ptr,new_op_ptr);
00747 
00748         // Ex:
00749         // op 171 (PBRR [r<83:i gpr>] [l:g_abs<_MY_3_PRoBeS>] p<t>) 
00750         //
00751         new_op_ptr=new legoOp(max_op_id++);
00752         new_op_ptr->SetOpcode(PBRR);
00753 
00754         src_oprd=new legoOprd();
00755         src_oprd->SetOprdType(OT_LITERAL_L);
00756         src_oprd->SetLiteralLabel("_MY_3_PRoBeS");
00757         src_oprd->SetLiteralAddrStyle(AS_G_ABS);
00758 
00759         new_op_ptr->SetSrcOprdPtr(src_oprd);
00760         new_op_ptr->SetDestOprdPtr(_address_oprd);
00761         new_op_ptr->SetPredOprdPtr(my_true_predicate_oprd);
00762 
00763         //WriteOps(new_op_ptr,1,stderr,0);
00764         insert_new_op_before(region_ptr,proc_ptr,from_op_ptr,new_op_ptr);
00765 
00766         // Ex:
00767         // op 172 (BRL [m<ret_addr>] [r<83:i gpr>] p<t> attr(lc ^288) 
00768         //
00769         new_op_ptr=new legoOp(max_op_id++);
00770         new_op_ptr->SetOpcode(BRL);
00771 
00772         new_op_ptr->SetSrcOprdPtr(_address_oprd);
00773         new_op_ptr->SetDestOprdPtr(_ret_oprd);
00774         new_op_ptr->SetPredOprdPtr(my_true_predicate_oprd);
00775         new_op_ptr->SetOpAttrListPtr(_attr_3_list);
00776 
00777         //WriteOps(new_op_ptr,1,stderr,0);
00778         insert_new_op_before(region_ptr,proc_ptr,from_op_ptr,new_op_ptr);
00779 
00780         // Ex:
00781         // op 173 (MOVE [m<int_p1>] [r<84:i gpr>] p<t>)
00782         //
00783         new_op_ptr=new legoOp(max_op_id++);
00784         new_op_ptr->SetOpcode(MOVE);
00785 
00786         new_op_ptr->SetSrcOprdPtr(_save_p1_oprd);
00787         new_op_ptr->SetDestOprdPtr(_int_p1_oprd);
00788         new_op_ptr->SetPredOprdPtr(my_true_predicate_oprd);
00789 
00790         //WriteOps(new_op_ptr,1,stderr,0);
00791         insert_new_op_before(region_ptr,proc_ptr,from_op_ptr,new_op_ptr);
00792 
00793         // Ex:
00794         // op 174 (MOVE [m<int_p2>] [r<85:i gpr>] p<t>)
00795         //
00796         new_op_ptr=new legoOp(max_op_id++);
00797         new_op_ptr->SetOpcode(MOVE);
00798 
00799         new_op_ptr->SetSrcOprdPtr(_save_p2_oprd);
00800         new_op_ptr->SetDestOprdPtr(_int_p2_oprd);
00801         new_op_ptr->SetPredOprdPtr(my_true_predicate_oprd);
00802 
00803         //WriteOps(new_op_ptr,1,stderr,0);
00804         insert_new_op_before(region_ptr,proc_ptr,from_op_ptr,new_op_ptr);
00805 
00806         // Ex:
00807         // op 175 (MOVE [m<int_p3>] [r<86:i gpr>] p<t>)
00808         //
00809         new_op_ptr=new legoOp(max_op_id++);
00810         new_op_ptr->SetOpcode(MOVE);
00811 
00812         new_op_ptr->SetSrcOprdPtr(_save_p3_oprd);
00813         new_op_ptr->SetDestOprdPtr(_int_p3_oprd);
00814         new_op_ptr->SetPredOprdPtr(my_true_predicate_oprd);
00815 
00816         //WriteOps(new_op_ptr,1,stderr,0);
00817         insert_new_op_before(region_ptr,proc_ptr,from_op_ptr,new_op_ptr);
00818 
00819         //getchar();
00820 }
00821 */
00822 
00823 void BB_Edge_Profile::open_header_file()
00824 {
00825         _header_fp=fopen(BB_EDGE_HEADER_FILENAME,"r");
00826 
00827         if(_header_fp==NULL)
00828         {
00829                 _header_fp=fopen(BB_EDGE_HEADER_FILENAME,"w");
00830                 assert(_header_fp!=NULL);
00831 
00832                 fprintf(_header_fp," extern void MY_1_PRoBe (int);\n");
00833                 fprintf(_header_fp," extern void MY_3_PRoBeS (int,int,int);\n");
00834                 fprintf(_header_fp," extern void MY_BBiD_eND_PRoBe (int);\n");
00835                 fprintf(_header_fp," extern void MY_BBiD_STaRT_PRoBe (int);\n");
00836         }
00837 }
00838 
00839 void BB_Edge_Profile::close_header_file()
00840 {
00841         fclose(_header_fp);
00842 }
00843 
00844 void BB_Edge_Profile::open_main_file(int bb_max_entry,int edge_max_entry)
00845 {
00846         _main_fp=fopen(BB_EDGE_MAIN_FILENAME,"w");
00847 
00848         if(_main_fp==NULL)
00849         {
00850                 fprintf(stderr,"Error open file:%s\n",BB_EDGE_MAIN_FILENAME);
00851                 exit(0);
00852         }
00853 
00854         fprintf(_main_fp,"/*\n\tFile: %s\n",BB_EDGE_MAIN_FILENAME);
00855         fprintf(_main_fp,"\tAuthor: Chao-ying Fu\n");
00856         fprintf(_main_fp,"\tDate: Aug. 28, 1998\n*/\n\n");
00857         fprintf(_main_fp,"#define bbid_max_entry %u\n",bb_max_entry);
00858         fprintf(_main_fp,"#define edge_max_entry %u\n\n",edge_max_entry);
00859 
00860         fprintf(_main_fp,"#include <stdio.h>\n\n");
00861 
00862         fprintf(_main_fp,"extern unsigned char global_macro_op[1024];\n");
00863         fprintf(_main_fp,"extern void MaiN(int argc,char **argv);\n");
00864         fprintf(_main_fp,"void MY_iNiT();\n");
00865         fprintf(_main_fp,"void MY_eXiT();\n\n");
00866 
00867         fprintf(_main_fp,"int bbid_counter[bbid_max_entry];\n");
00868         fprintf(_main_fp,"int edge_counter[edge_max_entry];\n\n");
00869 
00870         fprintf(_main_fp,"char bbid_counter_filename[13]=\"BBiD_CouNTeR\";\n");
00871         fprintf(_main_fp,"char edge_counter_filename[13]=\"eDGe_CouNTeR\";\n");
00872         fprintf(_main_fp,"char pair_counter_filename[13]=\"PaiR_CouNTeR\";\n");
00873         fprintf(_main_fp,"FILE *bbid_counter_fp=NULL;\n");
00874         fprintf(_main_fp,"FILE *edge_counter_fp=NULL;\n");
00875         fprintf(_main_fp,"FILE *pair_counter_fp=NULL;\n");
00876         fprintf(_main_fp,"int bb1;        // for bb end probe\n");
00877         fprintf(_main_fp,"int bb2;        // for bb start probe\n");
00878         fprintf(_main_fp,"int number_of_pair;\n");
00879         fprintf(_main_fp,"#define MAX_EDGE_NUMBER 10000\n\n");
00880 
00881         fprintf(_main_fp,"struct Edge_Entry\n");
00882         fprintf(_main_fp,"{\n");
00883         fprintf(_main_fp,"        int bb1;\n");
00884         fprintf(_main_fp,"        int bb2;\n");
00885         fprintf(_main_fp,"        int counter;\n");
00886         fprintf(_main_fp,"        struct Edge_Entry *next;\n");
00887         fprintf(_main_fp,"} edge_entry[MAX_EDGE_NUMBER];\n\n");
00888 
00889         fprintf(_main_fp,"int main(int argc,char **argv)\n");
00890         fprintf(_main_fp,"{\n");
00891         fprintf(_main_fp,"        MY_iNiT();\n");
00892         fprintf(_main_fp,"        atexit(MY_eXiT);\n");
00893         fprintf(_main_fp,"        MaiN(argc,argv);\n");
00894         fprintf(_main_fp,"}\n\n");
00895 
00896         fprintf(_main_fp,"void MY_iNiT()\n");
00897         fprintf(_main_fp,"{\n");
00898         fprintf(_main_fp,"        int i;\n");
00899         fprintf(_main_fp,"        struct Edge_Entry *ee;\n");
00900         fprintf(_main_fp,"        for(i=0;i<bbid_max_entry;i++)\n");
00901         fprintf(_main_fp,"        {\n");
00902         fprintf(_main_fp,"                bbid_counter[i]=0;\n");
00903         fprintf(_main_fp,"        }\n");
00904         fprintf(_main_fp,"        for(i=0;i<edge_max_entry;i++)\n");
00905         fprintf(_main_fp,"        {\n");
00906         fprintf(_main_fp,"                edge_counter[i]=0;\n");
00907         fprintf(_main_fp,"        }\n");
00908         fprintf(_main_fp,"        bbid_counter_fp=fopen(bbid_counter_filename,\"w\");\n");
00909         fprintf(_main_fp,"        if(bbid_counter_fp==NULL)\n");
00910         fprintf(_main_fp,"        {\n");
00911         fprintf(_main_fp,"                fprintf(stderr,\"Error Open File:%%s\\n\",bbid_counter_filename);\n");
00912         fprintf(_main_fp,"                exit(0);\n");
00913         fprintf(_main_fp,"         }\n");
00914         fprintf(_main_fp,"        edge_counter_fp=fopen(edge_counter_filename,\"w\");\n");
00915         fprintf(_main_fp,"        if(edge_counter_fp==NULL)\n");
00916         fprintf(_main_fp,"        {\n");
00917         fprintf(_main_fp,"                fprintf(stderr,\"Error Open File:%%s\\n\",edge_counter_filename);\n");
00918         fprintf(_main_fp,"                exit(0);\n");
00919         fprintf(_main_fp,"        }\n");
00920         fprintf(_main_fp,"        pair_counter_fp=fopen(pair_counter_filename,\"w\");\n");
00921         fprintf(_main_fp,"        if(pair_counter_fp==NULL)\n");
00922         fprintf(_main_fp,"        {\n");
00923         fprintf(_main_fp,"                fprintf(stderr,\"Error Open File:%%s\\n\",pair_counter_filename);\n");
00924         fprintf(_main_fp,"                exit(0);\n");
00925         fprintf(_main_fp,"        }\n");
00926         fprintf(_main_fp,"        bb1=-1;\n");
00927         fprintf(_main_fp,"        bb2=-1;\n");
00928         fprintf(_main_fp,"        for(i=0;i<MAX_EDGE_NUMBER;i++)\n");
00929         fprintf(_main_fp,"        {\n");
00930         fprintf(_main_fp,"                ee=&edge_entry[i];\n");
00931         fprintf(_main_fp,"                ee->bb1=-1;\n");
00932         fprintf(_main_fp,"                ee->next=NULL;\n");
00933         fprintf(_main_fp,"        }\n");
00934         fprintf(_main_fp,"        number_of_pair=0;\n");
00935         fprintf(_main_fp,"}\n\n");
00936 
00937         fprintf(_main_fp,"void MY_eXiT()\n");
00938         fprintf(_main_fp,"{\n");
00939         fprintf(_main_fp,"        struct Edge_Entry *ee;\n");
00940         fprintf(_main_fp,"        int i;\n");
00941         fprintf(_main_fp,"        for(i=0;i<bbid_max_entry;i++)\n");
00942         fprintf(_main_fp,"        {\n");
00943         fprintf(_main_fp,"                fprintf(bbid_counter_fp,\"%%d %%d\\n\",i,bbid_counter[i]);\n");
00944         fprintf(_main_fp,"        }\n");
00945         fprintf(_main_fp,"        fclose(bbid_counter_fp);\n");
00946         fprintf(_main_fp,"        for(i=0;i<edge_max_entry;i++)\n");
00947         fprintf(_main_fp,"        {\n");
00948         fprintf(_main_fp,"                fprintf(edge_counter_fp,\"%%d %%d\\n\",i,edge_counter[i]);\n");
00949         fprintf(_main_fp,"        }\n");
00950         fprintf(_main_fp,"        fclose(edge_counter_fp);\n");
00951         fprintf(_main_fp,"        fprintf(pair_counter_fp,\"number_of_pair=%%d\\n\",number_of_pair);\n");
00952         fprintf(_main_fp,"        for(i=0;i<MAX_EDGE_NUMBER;i++)\n");
00953         fprintf(_main_fp,"        {\n");
00954         fprintf(_main_fp,"                ee=&edge_entry[i];\n");
00955         fprintf(_main_fp,"                if(ee->bb1!=-1)\n");
00956         fprintf(_main_fp,"                {\n");
00957         fprintf(_main_fp,"                        do\n");
00958         fprintf(_main_fp,"                        {\n");
00959         fprintf(_main_fp,"                                fprintf(pair_counter_fp,\"(%%d,%%d):%%d\\n\",ee->bb1,ee->bb2,ee->counter);\n");
00960         fprintf(_main_fp,"                                ee=ee->next;\n");
00961         fprintf(_main_fp,"                        }\n");
00962         fprintf(_main_fp,"                        while(ee!=NULL);\n");
00963         fprintf(_main_fp,"                }\n");
00964         fprintf(_main_fp,"        }\n");
00965         fprintf(_main_fp,"        fclose(pair_counter_fp);\n");
00966         fprintf(_main_fp,"}\n\n");
00967 
00968         fprintf(_main_fp,"void MY_1_PRoBe(int mapping)\n");
00969         fprintf(_main_fp,"{\n");
00970         fprintf(_main_fp,"        edge_counter[mapping]++;\n");
00971         fprintf(_main_fp,"}\n\n");
00972 
00973         fprintf(_main_fp,"void MY_3_PRoBeS(int predicate,int true_path_mapping,int false_path_mapping)\n");
00974         fprintf(_main_fp,"{\n");
00975         fprintf(_main_fp,"        if(predicate==1)\n");
00976         fprintf(_main_fp,"        {\n");
00977         fprintf(_main_fp,"                edge_counter[true_path_mapping]++;\n");
00978         fprintf(_main_fp,"        }\n");
00979         fprintf(_main_fp,"        else if(predicate==0)\n");
00980         fprintf(_main_fp,"        {\n");
00981         fprintf(_main_fp,"                edge_counter[false_path_mapping]++;\n");
00982         fprintf(_main_fp,"        }\n");
00983         fprintf(_main_fp,"        else\n");
00984         fprintf(_main_fp,"        {\n");
00985         fprintf(_main_fp,"                fprintf(stderr,\"ERROR! predicate %%d\\n\",predicate);\n");
00986         fprintf(_main_fp,"                exit(0);\n");
00987         fprintf(_main_fp,"        }\n");
00988         fprintf(_main_fp,"}\n\n");
00989 
00990         fprintf(_main_fp,"void MY_BBiD_eND_PRoBe(int mapping)\n");
00991         fprintf(_main_fp,"{\n");
00992         fprintf(_main_fp,"        bb1=mapping;\n");
00993         fprintf(_main_fp,"}\n\n");
00994 
00995         fprintf(_main_fp,"void MY_BBiD_STaRT_PRoBe(int mapping)\n");
00996         fprintf(_main_fp,"{\n");
00997         fprintf(_main_fp,"        struct Edge_Entry *ee,*last_ee;\n");
00998         fprintf(_main_fp,"        int index;\n");
00999         fprintf(_main_fp,"        bbid_counter[mapping]++;\n");
01000         fprintf(_main_fp,"        bb2=mapping;\n");
01001         fprintf(_main_fp,"        if(bb1>=100000)\n");
01002         fprintf(_main_fp,"        {\n");
01003         fprintf(_main_fp,"                bb1=bb1-100000;\n");
01004         fprintf(_main_fp,"                index=(bb1+bb2)%%MAX_EDGE_NUMBER;\n");
01005         fprintf(_main_fp,"                ee=&edge_entry[index];\n");
01006         fprintf(_main_fp,"                //\n");
01007         fprintf(_main_fp,"                // Search (bb1,bb2)\n");
01008         fprintf(_main_fp,"                //\n");
01009         fprintf(_main_fp,"                if(ee->bb1==-1)\n");
01010         fprintf(_main_fp,"                {\n");
01011         fprintf(_main_fp,"                        //\n");
01012         fprintf(_main_fp,"                        // not match, put it to this ee\n");
01013         fprintf(_main_fp,"                        //\n");
01014         fprintf(_main_fp,"                        ee->bb1=bb1;\n");
01015         fprintf(_main_fp,"                        ee->bb2=bb2;\n");
01016         fprintf(_main_fp,"                        ee->counter=1;\n");
01017         fprintf(_main_fp,"                        number_of_pair++;\n");
01018         fprintf(_main_fp,"                }\n");
01019         fprintf(_main_fp,"                else if(ee->bb1==bb1 && ee->bb2==bb2)\n");
01020         fprintf(_main_fp,"                {\n");
01021         fprintf(_main_fp,"                        // match, increment\n");
01022         fprintf(_main_fp,"                        ee->counter++;\n");
01023         fprintf(_main_fp,"                }\n");
01024         fprintf(_main_fp,"                else\n");
01025         fprintf(_main_fp,"                {\n");
01026         fprintf(_main_fp,"                        // search bucket\n");
01027         fprintf(_main_fp,"                        last_ee=ee;\n");
01028         fprintf(_main_fp,"                        ee=ee->next;\n");
01029         fprintf(_main_fp,"                        while(ee!=NULL)\n");
01030         fprintf(_main_fp,"                        {\n");
01031         fprintf(_main_fp,"                                if(ee->bb1==bb1 && ee->bb2==bb2)\n");
01032         fprintf(_main_fp,"                                        break;\n");
01033         fprintf(_main_fp,"                                last_ee=ee;\n");
01034         fprintf(_main_fp,"                                ee=ee->next;\n");
01035         fprintf(_main_fp,"                        }\n");
01036         fprintf(_main_fp,"                        if(ee!=NULL)\n");
01037         fprintf(_main_fp,"                        {\n");
01038         fprintf(_main_fp,"                                // match\n");
01039         fprintf(_main_fp,"                                ee->counter++;\n");
01040         fprintf(_main_fp,"                        }\n");
01041         fprintf(_main_fp,"                        else\n");
01042         fprintf(_main_fp,"                        {\n");
01043         fprintf(_main_fp,"                                // create new ee\n");
01044         fprintf(_main_fp,"                                ee=(struct Edge_Entry *)malloc(sizeof(struct Edge_Entry));\n");
01045         fprintf(_main_fp,"                                last_ee->next=ee;\n");
01046         fprintf(_main_fp,"                                ee->bb1=bb1;\n");
01047         fprintf(_main_fp,"                                ee->bb2=bb2;\n");
01048         fprintf(_main_fp,"                                ee->counter=1;\n");
01049         fprintf(_main_fp,"                                ee->next=NULL;\n");
01050         fprintf(_main_fp,"                                // increment number_of_pair\n");
01051         fprintf(_main_fp,"                                number_of_pair++;\n");
01052         fprintf(_main_fp,"                        }\n");
01053         fprintf(_main_fp,"                }\n");
01054         fprintf(_main_fp,"                // Reset bb1\n");
01055         fprintf(_main_fp,"                bb1=-1;\n");
01056         fprintf(_main_fp,"        }\n");
01057         fprintf(_main_fp,"}\n");
01058 }
01059 
01060 void BB_Edge_Profile::close_main_file()
01061 {
01062         fclose(_main_fp);
01063 }

Generated on Mon Jul 21 20:24:00 2003 for TINKER LEGO DOC by doxygen 1.3.2