Polaris: DDGtester.cc Source File

DDGtester.cc

Go to the documentation of this file.
00001 #include <stream.h>
00002 #include "../DDgraph.h"
00003 #include "../Program.h"
00004 #include "../p-setjmp.h"
00005 #include "../utilities/switches_util.h"
00006 #include "../StringElem.h"
00007 #include "../String.h"
00008 
00009 struct DDI_list {
00010    int  id;
00011    DDiterator* iter;
00012    DDI_list* next;
00013 };
00014 
00015    
00016 class DDgraphTester {
00017 
00018    int      _cur_ddi_num;
00019    DDgraph& _ddgraph;
00020    StmtList&    _stmts;
00021    DDI_list*    _ddi_list;
00022 
00023  public:
00024 
00025     inline DDgraphTester(ProgramUnit& PU)
00026              : _ddgraph(PU.ddgraph()), _stmts(PU.stmts()) {
00027      _ddi_list = 0;
00028      _cur_ddi_num = 0;
00029     }
00030 
00031     inline ~DDgraphTester()     {
00032 
00033       while (_ddi_list) {
00034         DDI_list* temp = _ddi_list;
00035         _ddi_list = _ddi_list->next;
00036         delete temp->iter;
00037         delete temp;
00038       }
00039     }
00040 
00041 
00042     void    add(int num_of_dvfs);
00043 
00044     void    show_active_arcs();
00045 
00046     void    merge_DVF(int dditer_num);
00047 
00048     void    show_arcs();
00049 
00050     void    add_dditerator(int num_of_dditer);
00051 
00052     void    del_dditerator(int dditer_num);
00053 
00054     void    show_dditerator();
00055 
00056     void    del_current(int dditer_num);
00057 
00058     void    prev_current(int dditer_num);
00059 
00060     void    next_current(int dditer_num);
00061 
00062     void    grab_current(int dditer_num);
00063 
00064     void    show_program();
00065 
00066     void    reset(int dditer_num);
00067 
00068     void    set_to_last(int dditer_num);
00069 
00070 };
00071 
00072 
00073 void
00074 DDgraphTester::merge_DVF(int dditer_num) {
00075 
00076    DDI_list* trip = _ddi_list;
00077 
00078    if (!trip) {
00079     cout << "no DDiterator alive\n";
00080     return;
00081    }
00082 
00083    while (trip->id != dditer_num) {
00084       trip = trip->next;
00085       if (!trip) {
00086         cout << "Wrong number\n";
00087         return;
00088       }
00089    }
00090  
00091    merge_DVs(trip->iter->_active_arc->_working_dv_fields);
00092 }
00093 
00094 
00095 void
00096 DDgraphTester::reset(int dditer_num) {
00097 
00098    DDI_list* trip = _ddi_list;
00099 
00100    if (!trip) {
00101         cout << "no DDiterator alive\n";
00102         return;
00103    }
00104 
00105    while (trip->id != dditer_num) {
00106       trip = trip->next;
00107       if (!trip) {
00108         cout << "Wrong number\n";
00109         return;
00110       }
00111    }
00112 
00113    trip->iter->reset();
00114 }
00115 
00116 
00117 void
00118 DDgraphTester::set_to_last(int dditer_num) {
00119 
00120    DDI_list* trip = _ddi_list;
00121 
00122    if (!trip) {
00123         cout << "no DDiterator alive\n";
00124         return;
00125    }
00126 
00127    while (trip->id != dditer_num) {
00128       trip = trip->next;
00129       if (!trip) {
00130         cout << "Wrong number\n";
00131         return;
00132       }
00133    }
00134 
00135    trip->iter->set_to_last();
00136 }
00137 
00138 
00139 #define OCTA    8
00140 #define EndOfDV ';'
00141 
00142 void
00143 DDgraphTester:: add(int num_of_dvfs) {
00144 
00145    List<DVfield> dvf_list;
00146    Iterator<Statement> iter = _stmts.iterator();
00147    char from_stmt_tag[OCTA], to_stmt_tag[OCTA];
00148    int from_expr_num, to_expr_num;
00149    char dep_decided[OCTA], dep_type[OCTA], dv[OCTA][3];
00150 
00151    for (int i = 1; i <= num_of_dvfs; i++) {
00152 
00153       cout << i << ": " ;
00154       cin >> from_stmt_tag >> from_expr_num >> to_stmt_tag >> to_expr_num;
00155       cin >> dep_decided >> dep_type;
00156 
00157       for (int dv_len = 0; dv_len < OCTA; dv_len++) {
00158     cin >> dv[dv_len];
00159     if (dv[dv_len][0] == EndOfDV)
00160        break;
00161       }
00162       dv_len--;
00163 
00164       Statement *from_stmt = 0, *to_stmt = 0;
00165       Expression *from_expr, *to_expr;
00166       DEP_DECISION ddeci;
00167       DEP_TYPE dtype;
00168 
00169       for (iter.reset(); iter.valid(); iter++)
00170     if (!strcmp(iter.current().tag(), from_stmt_tag)) {
00171        from_stmt = &iter.current();
00172        break;
00173     }
00174       if (!from_stmt)
00175     continue;
00176 
00177       for (iter.reset(); iter.valid(); iter++)
00178     if (!strcmp(iter.current().tag(), to_stmt_tag)) {
00179        to_stmt = &iter.current();
00180        break;
00181     }
00182       if (!to_stmt)
00183     continue;
00184 
00185       if (from_expr_num >
00186            from_stmt->in_refs().entries() + from_stmt->out_refs().entries())
00187     continue;
00188       else if (from_expr_num > from_stmt->in_refs().entries())
00189     from_expr = &from_stmt->out_refs()._element
00190             (from_expr_num - from_stmt->in_refs().entries() - 1);
00191       else 
00192     from_expr = &from_stmt->in_refs()._element(from_expr_num - 1);
00193 
00194       if (to_expr_num >
00195         to_stmt->in_refs().entries() + to_stmt->out_refs().entries())
00196     continue;
00197       else if (to_expr_num > to_stmt->in_refs().entries())
00198     to_expr = &to_stmt->out_refs()._element
00199             (to_expr_num - to_stmt->in_refs().entries() - 1);
00200       else 
00201     to_expr = &to_stmt->in_refs()._element(to_expr_num - 1);
00202 
00203       switch (dep_decided[0]) {
00204     case 'a': ddeci = _ASSUMED; break;
00205     case 'p': ddeci = _PROVED;  break;
00206     default : continue; 
00207       }
00208 
00209       switch (dep_type[0]) {
00210     case 'f': dtype = _FLOW;    break;
00211     case 'a': dtype = _ANTI;    break;
00212     case 'i': dtype = _INPUT;   break;
00213     case 'o': dtype = _OUTPUT;  break;
00214     default : continue; 
00215       }
00216 
00217       DVfield * new_dvf = new DVfield(ddeci, dtype, *from_stmt, *from_expr,
00218                       *to_stmt, *to_expr);
00219 
00220       List<ElementDV> & dvs = new_dvf->_dv;
00221  
00222       for (; dv_len >= 0; dv_len--)
00223     if (!strcmp(dv[dv_len], "*"))
00224        dvs.ins_first(new ElementDV(_STAR));
00225     else if (!strcmp(dv[dv_len], "="))
00226        dvs.ins_first(new ElementDV(_EQ));
00227     else if (!strcmp(dv[dv_len], "<>"))
00228        dvs.ins_first(new ElementDV(_NEQ));
00229     else if (!strcmp(dv[dv_len], "<"))
00230        dvs.ins_first(new ElementDV(_LT));
00231     else if (!strcmp(dv[dv_len], ">"))
00232        dvs.ins_first(new ElementDV(_GT));
00233     else if (!strcmp(dv[dv_len], "<="))
00234        dvs.ins_first(new ElementDV(_LE));
00235     else if (!strcmp(dv[dv_len], ">="))
00236        dvs.ins_first(new ElementDV(_GE));
00237 
00238       dvf_list.ins_last(new_dvf);
00239    }    /// ...  End of for
00240 
00241    _ddgraph.add(dvf_list);
00242 }   /// ...  End of add()
00243 
00244 
00245 void
00246 DDgraphTester::show_active_arcs() {
00247 
00248    Iterator<ActiveArc> iter = _ddgraph._active_arcs;
00249 
00250    for (int num = 1; iter.valid(); iter++, num++) {
00251 
00252       /// ...  COMMON DATA
00253 
00254       cout << " [" << num << "] refs(" << iter.current()._references
00255        << ")this(" << iter.current()._this_arc << ")prev("
00256        << iter.current()._prev_arc << ")next(" << iter.current()._next_arc
00257        << ") src(" << iter.current()._source_stmt.tag();
00258 
00259       /// ...  Source Expression
00260 
00261       Iterator<Expression> seiter = iter.current()._source_stmt.in_refs();
00262 
00263       for (int i = 0; seiter.valid(); seiter++, i++)
00264     if (&iter.current()._source_expr == &seiter.current())
00265        break;
00266       if (seiter.valid())
00267     cout << "," << i + 1;
00268       else {
00269     Iterator<Expression> seiter = iter.current()._source_stmt.out_refs();
00270 
00271     for (; seiter.valid(); seiter++, i++)
00272        if (&iter.current()._source_expr == &seiter.current())
00273           break;
00274     if (seiter.valid())
00275        cout << "," << i + 1;
00276     else
00277        cout << ",WHAT?";
00278       }
00279 
00280       /// ...  Target Statement & Expression
00281 
00282       cout << ") tgt(" << iter.current()._target_stmt.tag();
00283 
00284       Iterator<Expression> teiter = iter.current()._target_stmt.in_refs();
00285 
00286       for (i = 0; teiter.valid(); teiter++, i++)
00287         if (&iter.current()._target_expr == &teiter.current()) 
00288            break;
00289       if (teiter.valid())
00290         cout << "," << i + 1;
00291       else {
00292         Iterator<Expression> teiter = iter.current()._target_stmt.out_refs();
00293 
00294         for (; teiter.valid(); teiter++, i++)
00295            if (&iter.current()._target_expr == &teiter.current())
00296               break;
00297         if (teiter.valid())
00298            cout << "," << i + 1;
00299         else
00300            cout << ",WHAT?";
00301       } 
00302 
00303       /// ...  DVfield LIST
00304 
00305       Iterator<DVfield> dviter = iter.current()._working_dv_fields;
00306 
00307       cout << ") **DVS**>> {"; 
00308       for (; dviter.valid(); dviter++) {
00309     cout << dviter.current()._references << " ref,";
00310     if (dviter.current()._valid)
00311        cout << "v,";
00312     else
00313        cout << "iv,";
00314 
00315     if (dviter.current()._dep_decided == _PROVED)
00316        cout << "pr,";
00317     else
00318        cout << "as,";
00319 
00320     if (&dviter.current()._from_expr == &iter.current()._source_expr &&
00321         &dviter.current()._to_expr == &iter.current()._target_expr)
00322        cout << "nm,";
00323     else if (&dviter.current()._from_expr == &iter.current()._target_expr &&
00324          &dviter.current()._to_expr == &iter.current()._source_expr)
00325        cout << "rv,";
00326     else
00327        cout << dviter.current()._from_stmt.tag() << ":" <<
00328            dviter.current()._to_stmt.tag() << ",";
00329 
00330     switch (dviter.current()._dep_type) {
00331       case _FLOW: cout << "f,"; break;
00332       case _ANTI: cout << "a,"; break;
00333       case _INPUT: cout << "i,";    break;
00334       case _OUTPUT: cout << "o,";   break;
00335       case _UNKNOWN: cout << "u,";
00336     }
00337 
00338     /// ...  EACH DV
00339 
00340     Iterator<ElementDV> edviter = dviter.current()._dv;
00341 
00342     for (; edviter.valid(); edviter++)
00343        switch (edviter.current().direction()) {
00344           case _STAR: cout << "*,"; break;
00345           case _EQ: cout << "=,";   break;
00346           case _NEQ: cout << "<>,"; break;
00347           case _GT: cout << ">,";   break;
00348           case _LT: cout << "<,";   break;
00349           case _GE: cout << ">=,";  break;
00350           case _LE: cout << "<=,";  break;
00351           default: cout << "NOWAY!,";
00352        }
00353     cout << "} {" ;
00354       }
00355       cout << "}\n";
00356    }    /// ...  End of for
00357 
00358 }   /// ...  End of show_active_arcs()
00359 
00360 
00361 void
00362 DDgraphTester::show_arcs() {
00363 
00364    Iterator<Statement> iter = _stmts.iterator();
00365 
00366    for (; iter.valid(); iter++) {
00367 
00368      /// ...  FOR IN_REFS()
00369 
00370      Iterator<Expression> iriter = iter.current().in_refs();
00371 
00372      for (int i = 1; iriter.valid(); iriter++, i++)
00373     if (Arc_type* arc = _ddgraph.arcs_ptr(iriter.current())) {
00374       // iriter has only ID or Array refrence expressions..
00375 
00376       // SOURCE statment & expression
00377 
00378            cout << "   " << iter.current().tag() << ',' << i << "->";
00379 
00380        do {
00381           /// ...  Iterate over all DVfields in this arc
00382 
00383           Statement* tgt_stmt = _ddgraph.target_stmt(arc);
00384           Expression* tgt_expr = _ddgraph.target_expr(arc);
00385           Iterator<Expression> eiter = tgt_stmt->in_refs();
00386 
00387           /// ...  TARGET statment & expression, and ACTIVE BIT
00388 
00389           cout << tgt_stmt->tag() << ',';
00390 
00391               for (int j = 1; eiter.valid(); eiter++, j++)
00392                 if (tgt_expr == &eiter.current())
00393                    break;
00394               if (eiter.valid())
00395                 cout << j;
00396               else {
00397                 Iterator<Expression> eiter = tgt_stmt->out_refs();
00398 
00399                 for (; eiter.valid(); eiter++, j++)
00400                    if (tgt_expr == &eiter.current())
00401                       break;
00402                 if (eiter.valid())
00403                    cout << j;
00404                 else
00405                    cout << "What?";
00406               }
00407 
00408           if (_ddgraph.is_active(arc))
00409         cout << ": Ac ";
00410           else
00411         cout << ": iA ";
00412 
00413           /// ...  EACH FIELD in DVfield head
00414 
00415           Arc_type* arc_data = _ddgraph.data_field(arc);
00416           int pos = 1;
00417 
00418           while (_ddgraph.is_new_dvfield(arc_data, pos)) {
00419         
00420         switch (_ddgraph.dep_decision(arc_data, pos)) {
00421            case _ASSUMED: cout << "| as,";  break;
00422            case _PROVED : cout << "| pr,";  break;
00423            default  : cout << "| Hey!,";
00424         }
00425 
00426             switch (_ddgraph.dep_direction(arc_data, pos)) {
00427                case _NORMAL: cout << "nm,";     break;
00428                case _REVERSE: cout << "rv,";    break;
00429            default  : cout << "Hey!,";
00430         }
00431 
00432             switch (_ddgraph.dep_type(arc_data, pos)) {
00433                case _FLOW: cout << "f,";        break;
00434                case _ANTI: cout << "a,";        break;
00435                case _INPUT: cout << "i,";       break;
00436                case _OUTPUT: cout << "o,";      break;
00437                case _UNKNOWN: cout << "u,";     break;
00438            default  : cout << "Hey!,";
00439         }
00440 
00441         /// ...  DIRECTIONS in DV
00442 
00443         DIREC_TYPE dir;
00444 
00445         while ((dir = _ddgraph.direction(arc_data, pos))
00446             != _DELIM)
00447            switch (dir) {
00448              case _GT: cout << "> ";    break;
00449              case _LT: cout << "< ";    break;
00450              case _LE: cout << "<= ";   break;
00451              case _GE: cout << ">= ";   break;
00452              case _EQ: cout << "= ";    break;
00453              case _NEQ: cout << "<> ";  break;
00454              case _STAR: cout << "* ";  break;
00455                default: cout << "Hey! ";
00456            }
00457           }
00458 
00459           if (arc = _ddgraph.next_arc(arc))
00460         cout << "\n         ";
00461           else {
00462         cout << endl;
00463         break;
00464           }
00465        } while (1);
00466 
00467     }   /// ...  End of if
00468 
00469      /// ...  FOR OUR_REFS()
00470 
00471      Iterator<Expression> oriter = iter.current().out_refs();
00472 
00473      for (; oriter.valid(); oriter++, i++)
00474     if (Arc_type* arc = _ddgraph.arcs_ptr(oriter.current())) {
00475       // oriter has only ID or Array refrence expressions..
00476 
00477       // SOURCE statment & expression
00478 
00479            cout << "   " << iter.current().tag() << ',' << i << "->";
00480 
00481        do {
00482           /// ...  Iterate over all DVfields in this arc
00483 
00484           Statement* tgt_stmt = _ddgraph.target_stmt(arc);
00485           Expression* tgt_expr = _ddgraph.target_expr(arc);
00486           Iterator<Expression> eiter = tgt_stmt->in_refs();
00487 
00488           /// ...  TARGET statment & expression, and ACTIVE BIT
00489 
00490           cout << tgt_stmt->tag() << ',';
00491 
00492               for (int j = 1; eiter.valid(); eiter++, j++)
00493                 if (tgt_expr == &eiter.current())
00494                    break;
00495               if (eiter.valid())
00496                 cout << j;
00497               else {
00498                 Iterator<Expression> eiter = tgt_stmt->out_refs();
00499 
00500                 for (; eiter.valid(); eiter++, j++)
00501                    if (tgt_expr == &eiter.current())
00502                       break;
00503                 if (eiter.valid())
00504                    cout << j;
00505                 else
00506                    cout << "What?";
00507               }
00508 
00509           if (_ddgraph.is_active(arc))
00510         cout << ": Ac ";
00511           else
00512         cout << ": iA ";
00513 
00514           /// ...  EACH FIELD in DVfield head
00515 
00516           Arc_type* arc_data = _ddgraph.data_field(arc);
00517           int pos = 1;
00518 
00519           while (_ddgraph.is_new_dvfield(arc_data, pos)) {
00520         
00521         switch (_ddgraph.dep_decision(arc_data, pos)) {
00522            case _ASSUMED: cout << "| as,";  break;
00523            case _PROVED : cout << "| pr,";  break;
00524            default  : cout << " Hey!,";
00525         }
00526 
00527             switch (_ddgraph.dep_direction(arc_data, pos)) {
00528                case _NORMAL: cout << "nm,";     break;
00529                case _REVERSE: cout << "rv,";    break;
00530            default  : cout << "Hey!,";
00531         }
00532 
00533             switch (_ddgraph.dep_type(arc_data, pos)) {
00534                case _FLOW: cout << "f,";        break;
00535                case _ANTI: cout << "a,";        break;
00536                case _INPUT: cout << "i,";       break;
00537                case _OUTPUT: cout << "o,";      break;
00538                case _UNKNOWN: cout << "u,";     break;
00539            default  : cout << "Hey!,";
00540         }
00541 
00542         /// ...  DIRECTIONS in DV
00543 
00544         DIREC_TYPE dir;
00545 
00546         while ((dir = _ddgraph.direction(arc_data, pos))
00547             != _DELIM)
00548            switch (dir) {
00549              case _GT: cout << "> ";    break;
00550              case _LT: cout << "< ";    break;
00551              case _LE: cout << "<= ";   break;
00552              case _GE: cout << ">= ";   break;
00553              case _EQ: cout << "= ";    break;
00554              case _NEQ: cout << "<> ";  break;
00555              case _STAR: cout << "* ";  break;
00556              default: cout << "Hey! ";
00557            }
00558           }
00559 
00560           if (arc = _ddgraph.next_arc(arc))
00561         cout << "\n         ";
00562           else {
00563         cout << endl;
00564         break;
00565           }
00566        } while (1);
00567     }   /// ...  End of if
00568   }
00569 }   /// ...  End of show_arcs()
00570 
00571 
00572 void
00573 DDgraphTester::add_dditerator(int num_of_dditer) {
00574 
00575    char buf[OCTA];
00576    Iterator<Statement> iter = _stmts.iterator();
00577 
00578    for (int i = 1; i <= num_of_dditer; i++) {
00579 
00580       cout << "Init. type for DDI From-part " << i << ": ";
00581       cin >> buf;
00582 
00583       if (buf[0] == 'l') {  /// ...  a Statement List - From
00584 
00585     RefList<Statement> * fstmts = new RefList<Statement>;
00586 
00587     cout << "Enumerate distinct Statement tags and"
00588          << " Type ';' as an end mark\n";
00589 
00590     while (1) {
00591        cin >> buf;
00592        if (buf[0] == ';')
00593           break;
00594 
00595        for (iter.reset(); iter.valid(); iter++)
00596           if (!strcmp(iter.current().tag(), buf)) {
00597         fstmts->ins_last(iter.current());
00598         break;
00599           }
00600     } 
00601 
00602     if (fstmts->entries() == 0) {
00603        delete fstmts;
00604        fstmts = 0;
00605        continue;
00606     }
00607 
00608     cout << "Init. type for DDI To-part " << i << ": ";
00609     cin >> buf;
00610 
00611     if (buf[0] == 'l') {      /// ...  a Statement List - To
00612 
00613        RefList<Statement> * tstmts = new RefList<Statement>;
00614 
00615        cout << "Enumerate distinct Statement tags and"
00616             << " Type ';' as an end mark\n";
00617 
00618        while (1) {
00619           cin >> buf;
00620           if (buf[0] == ';')
00621              break;
00622 
00623           for (iter.reset(); iter.valid(); iter++)
00624              if (!strcmp(iter.current().tag(), buf)) {
00625            tstmts->ins_last(iter.current());
00626            break;
00627              }
00628        } 
00629 
00630        if (tstmts->entries()) {
00631 
00632          /// ...  CASE1: From = stmt list, To = stmt list
00633 
00634           DDI_list* new_ddi = new DDI_list;
00635 
00636           new_ddi->id = ++_cur_ddi_num;
00637           new_ddi->iter = new DDiterator(fstmts, tstmts, _ddgraph);
00638           new_ddi->next = 0;
00639 
00640           if (_ddi_list) {
00641 
00642              DDI_list* temp = _ddi_list;
00643 
00644              while (temp->next)
00645                temp = temp->next;
00646              temp->next = new_ddi;
00647           }
00648           else
00649              _ddi_list = new_ddi;
00650 
00651         }
00652         else {
00653         delete fstmts;
00654             fstmts = 0;
00655         delete tstmts;
00656             tstmts = 0;
00657         }
00658     }
00659     else if (buf[0] == 'p') {   /// ...  a Pair of a Stmt & an Expr
00660 
00661        int num;
00662        Expression * expr = 0;
00663 
00664        cout << "Statement tag & Expression number? ";
00665        cin >> buf >> num;
00666 
00667        for (iter.reset(); iter.valid(); iter++)
00668           if (!strcmp(iter.current().tag(), buf)) {
00669         if (num <= iter.current().in_refs().entries()) {
00670 
00671            Iterator<Expression> eiter = iter.current().in_refs();
00672            while (--num > 0)
00673              eiter++;
00674            expr = &eiter.current();
00675         }
00676         else if (num <= iter.current().out_refs().entries()
00677                 + iter.current().in_refs().entries()) {
00678 
00679            Iterator<Expression> eiter = iter.current().out_refs();
00680            num -= iter.current().out_refs().entries();
00681            while (--num > 0)
00682              eiter++;
00683            expr = &eiter.current();
00684         }
00685         break;
00686           }
00687 
00688        if (expr) {  /// ...  Stmt tag & Expr num are found legal
00689           
00690          // CASE2: From = stmt list, To = stmt/expr pair
00691 
00692           DDI_list* new_ddi = new DDI_list;
00693 
00694           new_ddi->id = ++_cur_ddi_num;
00695           new_ddi->next = 0;
00696           new_ddi->iter = new DDiterator(fstmts, iter.current(),
00697                          *expr, _ddgraph);
00698           if (_ddi_list) {
00699 
00700              DDI_list* temp = _ddi_list;
00701 
00702              while (temp->next)
00703                temp = temp->next;
00704              temp->next = new_ddi;
00705           }
00706           else
00707              _ddi_list = new_ddi;
00708        }
00709        else
00710           delete fstmts;
00711           fstmts = 0;
00712     }
00713     else
00714        delete fstmts;
00715        fstmts = 0;
00716       }
00717       else if (buf[0] = 'p') {  /// ...  From-part == Pair
00718 
00719          int num;
00720          Expression * expr = 0;
00721 
00722          cout << "Statement tag & Expression number? ";
00723          cin >> buf >> num;
00724 
00725          for (iter.reset(); iter.valid(); iter++)
00726             if (!strcmp(iter.current().tag(), buf)) {
00727               if (num <= iter.current().in_refs().entries()) {
00728 
00729                  Iterator<Expression> eiter = iter.current().in_refs();
00730                  while (--num > 0)
00731                    eiter++;
00732                  expr = &eiter.current();
00733               }
00734               else if (num <= iter.current().out_refs().entries()
00735                               + iter.current().in_refs().entries()) {
00736 
00737                  Iterator<Expression> eiter = iter.current().out_refs();
00738                  num -= iter.current().in_refs().entries();
00739                  while (--num > 0)
00740                    eiter++;
00741                  expr = &eiter.current();
00742               }
00743               break;
00744             }
00745 
00746         if (!expr) /// ...  Stmt tag or Expr num is found illegal
00747        continue;
00748 
00749     Statement * stmt = &iter.current();
00750 
00751     cout << "Init. type for DDI To-part " << i << ": ";
00752     cin >> buf;
00753 
00754     if (buf[0] == 'l') {      /// ...  a Statement List - To
00755 
00756        RefList<Statement> * tstmts = new RefList<Statement>;
00757 
00758        cout << "Enumerate distinct Statement tags and"
00759             << " Type ';' as an end mark\n";
00760 
00761        while (1) {
00762           cin >> buf;
00763           if (buf[0] == ';')
00764              break;
00765 
00766           for (iter.reset(); iter.valid(); iter++)
00767              if (!strcmp(iter.current().tag(), buf)) {
00768            tstmts->ins_last(iter.current());
00769            break;
00770              }
00771        } 
00772 
00773        // CASE3: From = stmt/expr pair, To = stmt list
00774 
00775        if (tstmts->entries()) {
00776 
00777           DDI_list* new_ddi = new DDI_list;
00778 
00779           new_ddi->id = ++_cur_ddi_num;
00780           new_ddi->next = 0;
00781           new_ddi->iter = new DDiterator(*stmt, *expr, tstmts, _ddgraph);
00782 
00783           if (_ddi_list) {
00784 
00785              DDI_list* temp = _ddi_list;
00786 
00787              while (temp->next)
00788                temp = temp->next;
00789              temp->next = new_ddi;
00790           }
00791           else
00792              _ddi_list = new_ddi;
00793 
00794         }
00795         else
00796         delete tstmts;
00797         tstmts = 0;
00798     }
00799     else if (buf[0] == 'p') {   /// ...  a Pair of a Stmt & an Expr
00800 
00801        Expression * expr2 = 0;
00802 
00803        cout << "Statement tag & Expression number? ";
00804        cin >> buf >> num;
00805 
00806        for (iter.reset(); iter.valid(); iter++)
00807           if (!strcmp(iter.current().tag(), buf)) {
00808         if (num <= iter.current().in_refs().entries()) {
00809 
00810            Iterator<Expression> eiter = iter.current().in_refs();
00811            while (--num > 0)
00812              eiter++;
00813            expr2 = &eiter.current();
00814         }
00815         else if (num <= iter.current().out_refs().entries()
00816                 + iter.current().in_refs().entries()) {
00817 
00818            Iterator<Expression> eiter = iter.current().out_refs();
00819            num -= iter.current().in_refs().entries();
00820            while (--num > 0)
00821              eiter++;
00822            expr2 = &eiter.current();
00823         }
00824         break;
00825           }
00826 
00827        if (expr2) { /// ...  Stmt tag & Expr num are found legal
00828           
00829          // CASE4: From = stmt/expr pair, To = stmt/expr pair
00830 
00831           DDI_list* new_ddi = new DDI_list;
00832 
00833           new_ddi->id = ++_cur_ddi_num;
00834           new_ddi->next = 0;
00835           new_ddi->iter = new DDiterator(*stmt, *expr, iter.current(),
00836                          *expr2, _ddgraph);
00837           if (_ddi_list) {
00838 
00839              DDI_list* temp = _ddi_list;
00840 
00841              while (temp->next)
00842                temp = temp->next;
00843              temp->next = new_ddi;
00844           }
00845           else
00846              _ddi_list = new_ddi;
00847        }
00848     }
00849       }
00850    }
00851 }   /// ...  End of add_dditerator()
00852 
00853 
00854 void
00855 DDgraphTester::del_dditerator(int dditer_num) {
00856 
00857    DDI_list* pred = 0;
00858    DDI_list* trip = _ddi_list;
00859 
00860    while (trip && trip->id != dditer_num) {
00861       pred = trip;
00862       trip = trip->next;
00863    }
00864 
00865    if (trip) {
00866       if (pred)
00867     pred->next = trip->next;
00868       else
00869     _ddi_list = trip->next;
00870       delete trip->iter;
00871       delete trip;
00872       trip->iter = 0;
00873       trip = 0;
00874    }
00875    else
00876       cout << "Wrong number!\n";
00877 }
00878 
00879 
00880 void
00881 DDgraphTester::show_dditerator() {
00882 
00883    for (DDI_list* trip = _ddi_list; trip; trip = trip->next) {
00884 
00885       cout <<  "   " << trip->id << ": ";
00886       if (trip->iter->_init_from == _STMTS)
00887     cout << "init(sts,";
00888       else if (trip->iter->_init_from == _EXPR)
00889     cout << "init(exp,";
00890       else
00891     cout << "init(NonSense,";
00892 
00893       if (trip->iter->_init_to == _STMTS)
00894     cout << "sts) ";
00895       else if (trip->iter->_init_to == _EXPR)
00896     cout << "exp) ";
00897       else
00898     cout << "NonSense) ";
00899 
00900       Iterator<ActiveArc> iter = _ddgraph._active_arcs;
00901 
00902       for (int n = 1; iter.valid(); n++, iter++)
00903     if (&iter.current() == trip->iter->_active_arc)
00904        break;
00905 
00906       if (iter.end())
00907     cout << "Dangling\n";
00908       else {
00909     cout << "aarc(" << n << ") ";
00910 
00911     Iterator<DVfield> dviter = iter.current()._working_dv_fields;
00912 
00913     for (n = 1; dviter.valid(); n++, dviter++)
00914        if (&dviter.current() == trip->iter->_current_dvf)
00915           break;
00916 
00917     if (dviter.valid())
00918        cout << "curDV(" << n << ")\n";
00919     else
00920        cout << "Dangling\n";
00921       }
00922    }
00923 }   /// ...  End of show_ddviterator()
00924 
00925 
00926 void
00927 DDgraphTester::del_current(int dditer_num) {
00928 
00929    DDI_list* trip = _ddi_list;
00930 
00931    if (!trip) {
00932         cout << "no DDiterator alive\n";
00933         return;
00934    }
00935 
00936    while (trip->id != dditer_num) {
00937       trip = trip->next;
00938       if (!trip) {
00939         cout << "Wrong number\n";
00940         return;
00941       }
00942    }
00943 
00944    trip->iter->del();
00945    cout << "current dvfield deleted\n";
00946 }   /// ...  End of del_current()
00947 
00948 
00949 void
00950 DDgraphTester::prev_current(int dditer_num) {
00951 
00952    DDI_list* trip = _ddi_list;
00953 
00954    if (!trip) {
00955         cout << "no DDiterator alive\n";
00956         return;
00957    }
00958 
00959    while (trip->id != dditer_num) {
00960       trip = trip->next;
00961       if (!trip) {
00962         cout << "Wrong number\n";
00963         return;
00964       } 
00965    }
00966 
00967    --*trip->iter;
00968    cout << "current dvfield moved to the previous one\n";
00969 }   /// ...  End of prev()
00970 
00971 
00972 void
00973 DDgraphTester::next_current(int dditer_num) {
00974 
00975    DDI_list* trip = _ddi_list;
00976 
00977    if (!trip) {
00978         cout << "no DDiterator alive\n";
00979         return;
00980    }
00981 
00982    while (trip->id != dditer_num) {
00983       trip = trip->next;
00984       if (!trip) {
00985         cout << "Wrong number\n";
00986         return;
00987       } 
00988    }
00989 
00990    ++*trip->iter;
00991    cout << "current dvfield moved to the next one\n";
00992 }   /// ...  End of next_current()
00993 
00994 
00995 void
00996 DDgraphTester::grab_current(int dditer_num) {
00997 
00998    DDI_list* trip = _ddi_list;
00999 
01000    if (!trip) {
01001         cout << "no DDiterator alive\n";
01002         return;
01003    }
01004 
01005    while (trip->id != dditer_num) {
01006       trip = trip->next;
01007       if (!trip) {
01008     cout << "Wrong number\n";
01009     return;
01010       }
01011    }
01012 
01013    DVfield* temp = trip->iter->grab();
01014    cout << "current dvfield grabbed & deleted\n";
01015 }   /// ...  End of grab()
01016 
01017 
01018 void
01019 DDgraphTester::show_program() {
01020 
01021     Iterator<Statement> iter = _stmts;
01022     int indent = 0;
01023 
01024     if (!(iter.valid()))
01025         return;
01026 
01027     if (iter.current().stmt_class() == FLOW_ENTRY_STMT) {
01028         ++iter;
01029 
01030         if (!(iter.valid()))
01031             return;
01032 
01033         if (iter.current().stmt_class() == ENTRY_STMT) {
01034             /// ...  Avoid this ENTRY_STMT
01035             ++iter;
01036         }
01037     }
01038 
01039     for (; iter.valid(); ++iter) {
01040         for (Iterator<StringElem> pre_iter = iter.current().pre_directives();
01041                                   pre_iter.valid(); ++pre_iter)
01042             cout << (String) pre_iter.current() << endl;
01043 
01044     cout << iter.current().tag() << '\t';
01045         iter.current().write(cout, indent);
01046 
01047         for (Iterator<StringElem> post_iter = iter.current().post_directives();
01048                                   post_iter.valid(); ++post_iter)
01049             cout << (String) post_iter.current() << endl;
01050     }
01051 }
01052 
01053 
01054 /*******************************************************************/
01055 
01056 main(int argc, char *argv[]) {
01057 
01058   cout << "Now, Start!\n";
01059 
01060   P_ASSERT_HANDLER(0);
01061   int next_arg = parse_switches(argc, argv);
01062   
01063   p_assert(next_arg < argc, "Fortran input file not specified");
01064    
01065   Program p;
01066   p.read(argv[next_arg]);
01067 
01068   KeyIterator<String,ProgramUnit> iter_prog = p;
01069 
01070 ///
01071 /// For each subprogram, Do it!
01072 ///
01073 
01074 /*++++++++++++++++++++++++++++++*/
01075   for (; iter_prog.valid(); ++iter_prog) {
01076 /*++++++++++++++++++++++++++++++*/
01077 
01078    DDgraphTester ddg_tester(iter_prog.current_data());
01079 
01080    while (1) { 
01081 
01082       int num;
01083       char buf[OCTA];
01084       DDtests_Seq ddt_seq = _None;
01085 
01086       cout << "(s)how, (d)elete, (a)dd, (g)rab, (p)rev, (n)ext,\n"
01087        << "(f)irst, (l)ast, (m)erge, dd(t)ests (q)uit? ";
01088       cin >> buf;
01089       switch (buf[0]) {
01090 
01091     case 't':
01092        cout << "Select all the ddtests you want include where the options"
01093         << " are\n(g)cd-const -> (b)anerjee -> (o)mega[this sequence"
01094         << "  is fixed], and at the end type ';'\n";
01095        do {
01096           cin >> buf;
01097           switch (buf[0]) {
01098             case 'g':
01099            if (_None == ddt_seq)
01100             ddt_seq = _GCD_Only;
01101            else if (_Banerjee_Only == ddt_seq)
01102             ddt_seq = _GCD_Banerjee;
01103            else if (_Omega_Only == ddt_seq)
01104             ddt_seq = _GCD_Omega;
01105            else if (_Banerjee_Omega == ddt_seq)
01106             ddt_seq = _All;
01107            break;
01108             case 'b':
01109            if (_None == ddt_seq)
01110             ddt_seq = _Banerjee_Only;
01111            else if (_GCD_Only == ddt_seq)
01112             ddt_seq = _GCD_Banerjee;
01113            else if (_Omega_Only == ddt_seq)
01114             ddt_seq = _Banerjee_Omega;
01115            else if (_GCD_Omega == ddt_seq)
01116             ddt_seq = _All;
01117            break;
01118             case 'o':
01119            if (_None == ddt_seq)
01120             ddt_seq = _Omega_Only;
01121            else if (_Banerjee_Only == ddt_seq)
01122             ddt_seq = _Banerjee_Omega;
01123            else if (_GCD_Only == ddt_seq)
01124             ddt_seq = _GCD_Omega;
01125            else if (_GCD_Banerjee == ddt_seq)
01126             ddt_seq = _All;
01127           }
01128        } while (buf[0] != ';');
01129        cout << "Want to include input dependence(Y/n)? ";
01130        cin >> buf;
01131        if (buf[0] == 'y' || buf[0] == 'Y')
01132           ddtests_main(p, ddt_seq, 1);
01133        else 
01134           ddtests_main(p, ddt_seq, 0);
01135        break;
01136 
01137     case 's':
01138        cout << "(p)rogram, a(c)tive_arcs, a(r)cs, (d)diterators? ";
01139        cin >> buf;
01140        if (buf[0] == 'c')
01141           ddg_tester.show_active_arcs();
01142        else if (buf[0] == 'r')
01143           ddg_tester.show_arcs();
01144        else if (buf[0] == 'p')
01145           ddg_tester.show_program();
01146        else if (buf[0] == 'd')
01147           ddg_tester.show_dditerator();
01148        break;
01149 
01150     case 'a':
01151        cout << "d(v)fields, d(d)iterators? ";
01152        cin >> buf;
01153        if (buf[0] == 'v') {
01154           cout << "How many DVfields? ";
01155           cin >> num;
01156           cout << "Enter from_stmt tag, from_expr number, to_stmt tag, "
01157            << "to_expr number, dep_decision, dep_type and DVs\n";
01158           ddg_tester.add(num);
01159        }
01160        else if (buf[0] == 'd') {
01161           cout << "How many DDiterators? ";
01162           cin >> num;
01163           cout << "Initialization Type -> (l): stmt list,"
01164                << " (p): pair of a stmt & an expr\n";
01165           ddg_tester.add_dditerator(num);
01166        }
01167        break;
01168 
01169     case 'm':
01170        cout << "DDiterator number? ";
01171        cin >> num;
01172        ddg_tester.merge_DVF(num);
01173        break;
01174 
01175     case 'f':
01176        cout << "DDiterator number? ";
01177        cin >> num;
01178        ddg_tester.reset(num);
01179        break;
01180 
01181     case 'l':
01182        cout << "DDiterator number? ";
01183        cin >> num;
01184        ddg_tester.set_to_last(num);
01185        break;
01186 
01187     case 'd':
01188        cout << "What DDiterator number? ";
01189        cin >> num;
01190        cout << "(i)tself, its (c)urrent DVfield? ";
01191        cin >> buf;
01192        if (buf[0] == 'i')
01193           ddg_tester.del_dditerator(num);
01194        else if (buf[0] == 'c')
01195           ddg_tester.del_current(num);
01196        break;
01197 
01198     case 'g':
01199        cout << "What DDiterator number? ";
01200        cin >> num;
01201        ddg_tester.grab_current(num);
01202        break;
01203 
01204     case 'p':
01205        cout << "What DDiterator number? ";
01206        cin >> num;
01207        ddg_tester.prev_current(num);
01208        break;
01209 
01210     case 'n':
01211        cout << "What DDiterator number? ";
01212        cin >> num;
01213        ddg_tester.next_current(num);
01214        break;
01215 
01216     case 'q':
01217        exit(0);
01218       }
01219    }
01220 
01221 /*++++++++++++++++++++++++++++*/
01222   }
01223 /*++++++++++++++++++++++++++++*/
01224 
01225 }   /// ...  End of main()
 © 1995-2005 University of Illinois, Urbana-Champaign. All rights reserved.  Fri Mar 25 23:05:44 2005