abc プロジェクト
14.8.18. MakeUnrollData メンバ関数説明

メンバ関数名 MakeUnrollData
定義ファイル名TuneRegion.cpp
定義行 577
所属名 TTuneRegion
アクセス属性 public
宣言形式 void MakeUnrollData ( int sPos )
概要 UnRollの解析を行う。
Type,Name,Do LoopEnd 式,iusw の変数の作成が行われる。
戻り値
パラメタ説明 sPos 開始位置
機能説明
備考

呼出し元関数一覧表
名称 定義ファイル名 定義行
1 TTuneRegion::TTuneRegion TuneRegion.cpp 37

呼出し先関数一覧表
名称 定義ファイル名 定義行
1 TTuneRegion::ChackRefDoValF TuneRegion.cpp 894
2 TMainF::err main.cpp 271
3 TTuneRegion::GetNextKanmaPos TuneRegion.cpp 849
4 TTuneRegion::MakeArgValList TuneRegion.cpp 457
5 TTuneRegion::SaveAndResetValBits TuneRegion.cpp 996
6 TTuneRegion::SortArgValList TuneRegion.cpp 1085
7 AnsiCompareText

8 atoi

9 c_str

10 Clear

11 CompareText

12 IntToStr

参照外部変数一覧表
名称 定義ファイル名 定義行
1 MainF main.cpp 26

参照メンバ変数一覧表
名称 定義ファイル名 定義行
1 TTuneRegion::ArgValList TuneRegion.h 140
2 TTuneRegion::CaseCount TuneRegion.h 141
3 TTuneRegion::DoEndEPos TuneRegion.h 187
4 TTuneRegion::DoEndSPos TuneRegion.h 186
5 TTuneRegion::DoStartEPos TuneRegion.h 185
6 TTuneRegion::DoStartSPos TuneRegion.h 184
7 TTuneRegion::DoStepEPos TuneRegion.h 189
8 TTuneRegion::DoStepSPos TuneRegion.h 188
9 TTuneRegion::DoToken TuneRegion.h 182
10 TTuneRegion::DoValToken TuneRegion.h 183
11 TTuneRegion::FittingDegree TuneRegion.h 168
12 TTuneRegion::FittingType TuneRegion.h 166
13 TTuneRegion::FuncName TuneRegion.h 126
14 TTuneRegion::Name TuneRegion.h 125
15 TTuneRegion::Number TuneRegion.h 138
16 TTuneRegion::SampledList TuneRegion.h 169
17 TTuneRegion::TokenEndPos TuneRegion.h 123
18 TTuneRegion::TokenList TuneRegion.h 120
19 TTuneRegion::TokenStartPos TuneRegion.h 122
20 TTuneRegion::TuneGroup TuneRegion.h 128
21 TTuneRegion::variedCount TuneRegion.h 157
22 TTuneRegion::variedFromValue TuneRegion.h 159
23 TTuneRegion::variedToValue TuneRegion.h 160
24 TTuneRegion::variedValData TuneRegion.h 161
25 TTuneRegion::variedValName TuneRegion.h 158

参照先一覧表
名称 種別 定義ファイル名 定義行
1 TScript クラス pass3.h 151
2 TScValData クラス pass3.h 112
3 TToken クラス pass1.h 216
4 TValData クラス pass2.h 42

関数論理チャート

        |  +--------------------------------------------+ 
   577  +--+ void TTuneRegion::MakeUnrollData(int sPos) | 
   578     | {                                          | 
           +--+-----------------------------------------+ 
   579        +--- int i,j,k;
   580        +--- TToken *Token;
   581        +--- TScript *Script;
   582        +--- AnsiString s;
   583        +--- TScValData *ScValData;
   584        +--- AnsiString ScValName;
   585        +--- int Nest;
   586        |    
   587        +--- Token = (TToken *)TokenList->Items[sPos];
   588        |    
   589        +--- //
   590        |    // UnRollの対象変数名を所得  
   591        |    //                           
   592        +--- ScValData = NULL;
   593        +--- ScValName = "";
   594        |    
   595        +--- //
   596        |    // 名前、参照変数(Setが先の場合は、不要)、DO変数、DOの終わり値を求める 
   597        |    // とりあえず、一番外側のunrollのみ。複数は出力サンプルが必要。          
   598        |    //                                                                       
   599        |    // call ABCLib_SetParam()                                                
   600        |    // call ABCLib_InsetallXXX() の呼び出しを追加する。                      
   601        |    //                                                                       
   602        |    // この2つで、メイン側の呼び出しは終わり。                              
   603        |    //                                                                       
   604        +--- TValData *ValData;
   605        |    
   606        +--- // Name指定なし時の対策 Add 2004/08/26
   607        +--- Name = IntToStr(MainF->TuneRegionList->Count+1);
              |  +------------------------------+ 
   608        +--+ if(TuneGroup == tgInstall){  | 
              |  +--+---------------------------+ 
   609        |     +--- FuncName = "ABCLib_Install"+Name;
              |   +-+---+ 
   610        |   |  }  | 
              |   +-+---+ 
              |   +-+---------------------------------+ 
   610        |   |  else if(TuneGroup == tgStatic){  | 
              |   +-+---------------------------------+ 
   611        |     +--- FuncName = "ABCLib_Static"+Name;
              |   +-+---+ 
   612        |   |  }  | 
              |   +-+---+ 
              |   +-+---------------------------------+ 
   612        |   |  else if(TuneGroup == tgDynamic){ | 
              |   +-+---------------------------------+ 
   613        |     +--- FuncName = "ABCLib_Dynamic"+Name;
              |   +-+---+ 
   614        |   |  }  | 
              |   +-----+ 
   615        +--- Nest = 0;
   616        +--- ArgValList->Clear();
              |  +------------------------------------------+ 
   617        +--+ for(i = sPos ; i <= TokenEndPos ; i++){  | 
              |  +--+---------------------------------------+ 
   618        |     +--- Token = (TToken *)TokenList->Items[i];
              |     |  +----------------------------+ 
   619        |     +--+ if(Token->Script != NULL){ | 
              |     |  +--+-------------------------+ 
   620        |     |     +--- Script = (TScript *)Token->Script;
              |     |     |  +----------------------------------------------------------+ 
   621        |     |     +--+ if(Script->ScRegion == scr_start){      // region Start  | 
              |     |     |  +--+-------------------------------------------------------+ 
   622        |     |     |     +--- Nest++;     // TR ネスト部分の処理
              |     |     |     |  +----------------+ 
   623        |     |     |     +--+ if(Nest > 1){  | 
              |     |     |     |  +--+-------------+ 
   624        |     |     |     |     +--- MainF->err("Unroll内のRegionネストは、サポートしていません。");
              |     |     |     |   +-+---+ 
   625        |     |     |     |   |  }  | 
              |     |     |     |   +-----+ 
              |     |     |     |  +------------+ 
   626        |     |     |     +--+ continue;  | 
              |     |     |     |  +------------+ 
              |     |     |   +-+---+ 
   627        |     |     |   |  }  | 
              |     |     |   +-+---+ 
              |     |     |   +-+-----------------------------------------------+ 
   627        |     |     |   |  else if(Script->ScType == sct_name){   // name | 
              |     |     |   +-+-----------------------------------------------+ 
   628        |     |     |     +--- Name = Script->TokStrList->Strings[2];
              |     |     |     |  +------------------------------+ 
   629        |     |     |     +--+ if(TuneGroup == tgInstall){  | 
              |     |     |     |  +--+---------------------------+ 
   630        |     |     |     |     +--- FuncName = "ABCLib_Install"+Name;
              |     |     |     |   +-+---+ 
   631        |     |     |     |   |  }  | 
              |     |     |     |   +-+---+ 
              |     |     |     |   +-+---------------------------------+ 
   631        |     |     |     |   |  else if(TuneGroup == tgStatic){  | 
              |     |     |     |   +-+---------------------------------+ 
   632        |     |     |     |     +--- FuncName = "ABCLib_Static"+Name;
              |     |     |     |   +-+---+ 
   633        |     |     |     |   |  }  | 
              |     |     |     |   +-+---+ 
              |     |     |     |   +-+---------------------------------+ 
   633        |     |     |     |   |  else if(TuneGroup == tgDynamic){ | 
              |     |     |     |   +-+---------------------------------+ 
   634        |     |     |     |     +--- FuncName = "ABCLib_Dynamic"+Name;
              |     |     |     |   +-+---+ 
   635        |     |     |     |   |  }  | 
              |     |     |     |   +-----+ 
              |     |     |   +-+---+ 
   636        |     |     |   |  }  | 
              |     |     |   +-+---+ 
              |     |     |   +-+-------------------------------------------------+ 
   636        |     |     |   |  else if(Script->ScType == sct_Number){ // number | 
              |     |     |   +-+-------------------------------------------------+ 
   637        |     |     |     +--- Number = atoi(Script->TokStrList->Strings[2].c_str());
              |     |     |   +-+---+ 
   638        |     |     |   |  }  | 
              |     |     |   +-+---+ 
              |     |     |   +-+---------------------------------------+ 
   638        |     |     |   |  else if(Script->ScType == sct_varied){ | 
              |     |     |   +-+---------------------------------------+ 
   639        |     |     |     +--- //
   640        |     |     |     |    // varried処理を行う。 
   641        |     |     |     |    //                     
              |     |     |     |  +----------------------------------------+ 
   642        |     |     |     +--+ if(Script->ScValDataList->Count == 0){ | 
              |     |     |     |  +--+-------------------------------------+ 
   643        |     |     |     |     +--- MainF->err("varied の変数指定が見つかりません。");
              |     |     |     |     |  +----------+ 
   644        |     |     |     |     +--+ return;  | 
              |     |     |     |     |  +----------+ 
              |     |     |     |   +-+---+ 
   645        |     |     |     |   |  }  | 
              |     |     |     |   +-----+ 
              |     |     |     |  +------------------------------------------------------+ 
   646        |     |     |     +--+ for(k = 0 ; k < Script->ScValDataList->Count ; k++){ | 
              |     |     |     |  +--+---------------------------------------------------+ 
   647        |     |     |     |     +--- ScValData = (TScValData *)Script->ScValDataList->Items[k];
   648        |     |     |     |     +--- variedValName[variedCount] = ScValData->Str;
   649        |     |     |     |     +--- variedValData[variedCount] = ScValData;
   650        |     |     |     |     +--- DoToken[variedCount] = NULL;
              |     |     |     |     |  +------------------------------------------------------+ 
   651        |     |     |     |     +--+ for(j = 0 ; j < Script->TokStrList->Count-1 ; j++){  | 
              |     |     |     |     |  +--+---------------------------------------------------+ 
   652        |     |     |     |     |     +--- s = Script->TokStrList->Strings[j];
              |     |     |     |     |     |  +--------------------------------------+ 
   653        |     |     |     |     |     +--+ if(AnsiCompareText(s,"from") == 0){  | 
              |     |     |     |     |     |  +--+-----------------------------------+ 
   654        |     |     |     |     |     |     +--- s = Script->TokStrList->Strings[j+1];
   655        |     |     |     |     |     |     +--- variedFromValue[variedCount] = atoi(s.c_str());
              |     |     |     |     |     |   +-+---+ 
   656        |     |     |     |     |     |   |  }  | 
              |     |     |     |     |     |   +-+---+ 
              |     |     |     |     |     |   +-+---------------------------------------+ 
   656        |     |     |     |     |     |   |  else if(AnsiCompareText(s,"to") == 0){ | 
              |     |     |     |     |     |   +-+---------------------------------------+ 
   657        |     |     |     |     |     |     +--- s = Script->TokStrList->Strings[j+1];
   658        |     |     |     |     |     |     +--- variedToValue[variedCount] = atoi(s.c_str());
              |     |     |     |     |     |   +-+---+ 
   659        |     |     |     |     |     |   |  }  | 
              |     |     |     |     |     |   +-----+ 
              |     |     |     |     |   +-+---+ 
   660        |     |     |     |     |   |  }  | 
              |     |     |     |     |   +-----+ 
   661        |     |     |     |     +--- variedCount++;
              |     |     |     |   +-+---+ 
   662        |     |     |     |   |  }  | 
              |     |     |     |   +-----+ 
              |     |     |   +-+---+ 
   663        |     |     |   |  }  | 
              |     |     |   +-+---+ 
              |     |     |   +-+-----------------------------------------+ 
   663        |     |     |   |  else if(Script->ScType == sct_fitting){  | 
              |     |     |   +-+-----------------------------------------+ 
   664        |     |     |     +--- //
   665        |     |     |     |    // Fitting指定子の処理を行う。(TuneRegionへデータ複写のみ)  
   666        |     |     |     |    //                                                           
   667        |     |     |     +--- FittingType = Script->FittingType;
   668        |     |     |     +--- FittingDegree = Script->FittingDegree;
   669        |     |     |     +--- SampledList = Script->SampledList;
              |     |     |   +-+---+ 
   670        |     |     |   |  }  | 
              |     |     |   +-----+ 
              |     |   +-+---+ 
   671        |     |   |  }  | 
              |     |   +-+---+ 
              |     |   +-+---------------------------------+ 
   671        |     |   |  else if(Token->TokId == tid_DO){ | 
              |     |   +-+---------------------------------+ 
   672        |     |     +--- //
   673        |     |     |    // DOの終わりの式を求める。                                        
   674        |     |     |    // DOの終わりの式は カンマとカンマの間(関数がある可能性があるので 
   675        |     |     |    // ()のレベルチェックは行うこと!(関数作成)                      
   676        |     |     |    //                                                                 
   677        |     |     +--- TToken *Token1,*Token2;
   678        |     |     +--- int kk,DoSPos;
   679        |     |     |    
   680        |     |     +--- Token1 = Token; // DOのトークン
   681        |     |     +--- DoSPos = i + 1;
              |     |     |  +--------------------------------+ 
   682        |     |     +--+ for(kk = 0 ; kk < 100 ; kk++){ | 
              |     |     |  +--+-----------------------------+ 
   683        |     |     |     +--- Token = (TToken *)TokenList->Items[DoSPos++];
              |     |     |     |  +------------------------------+ 
   684        |     |     |     +--+ if(Token->TokId == tid_Set){ | 
              |     |     |     |  +--+---------------------------+ 
              |     |     |     |     |  +--------+ 
   685        |     |     |     |     +--+ break; | 
              |     |     |     |     |  +--------+ 
              |     |     |     |   +-+---+ 
   686        |     |     |     |   |  }  | 
              |     |     |     |   +-----+ 
              |     |     |   +-+---+ 
   687        |     |     |   |  }  | 
              |     |     |   +-----+ 
   688        |     |     +--- //
   689        |     |     |    // スクリプトの変数名と一致するかを調べる。  
   690        |     |     |    //                                           
   691        |     |     +--- Token2 = (TToken *)TokenList->Items[DoSPos-2];
              |     |     |  +----------------------------------------+ 
   692        |     |     +--+ for(kk = 0 ; kk < variedCount ; kk++){ | 
              |     |     |  +--+-------------------------------------+ 
              |     |     |     |  +------------------------------------------------------+ 
   693        |     |     |     +--+ if(CompareText(Token2->Str,variedValName[kk]) == 0){ | 
              |     |     |     |  +--+---------------------------------------------------+ 
   694        |     |     |     |     +--- DoToken[kk] = Token1;
   695        |     |     |     |     +--- DoValToken[kk] = Token2;
   696        |     |     |     |     +--- ValData = (TValData *)Token2->ValData;
   697        |     |     |     |     +--- ValData->DoValBits = (1 << kk); // 変数Bitsをセットする。
   698        |     |     |     |     +--- ValData->RefDoValBits = (1 << kk); // 変数Bitsをセットする。
   699        |     |     |     |     +--- DoStartSPos[kk] = DoSPos;
   700        |     |     |     |     +--- DoStartEPos[kk] = GetNextKanmaPos(i);
   701        |     |     |     |     +--- DoEndSPos[kk] = GetNextKanmaPos(i) + 1;
   702        |     |     |     |     +--- DoEndEPos[kk] = GetNextKanmaPos(DoEndSPos[kk]);
   703        |     |     |     |     |    
              |     |     |     |     |  +------------------------------------------------------------------------+ 
   704        |     |     |     |     +--+ if(((TToken *)TokenList->Items[DoEndEPos[kk]])->TokId == tid_Kannma){  | 
              |     |     |     |     |  +--+---------------------------------------------------------------------+ 
   705        |     |     |     |     |     +--- DoStepSPos[kk] = GetNextKanmaPos(DoEndEPos[kk]) + 1;
   706        |     |     |     |     |     +--- DoStepEPos[kk] = GetNextKanmaPos(DoStepSPos[kk]);
              |     |     |     |     |   +-+---+ 
   707        |     |     |     |     |   |  }  | 
              |     |     |     |     |   +-+---+ 
              |     |     |     |     |   +-+-------+ 
   707        |     |     |     |     |   |  else{  | 
              |     |     |     |     |   +-+-------+ 
   708        |     |     |     |     |     +--- DoStepSPos[kk] = -1;
   709        |     |     |     |     |     +--- DoStepEPos[kk] = -1;
              |     |     |     |     |   +-+---+ 
   710        |     |     |     |     |   |  }  | 
              |     |     |     |     |   +-----+ 
              |     |     |     |     |  +--------+ 
   711        |     |     |     |     +--+ break; | 
              |     |     |     |     |  +--------+ 
              |     |     |     |   +-+---+ 
   712        |     |     |     |   |  }  | 
              |     |     |     |   +-----+ 
              |     |     |   +-+---+ 
   713        |     |     |   |  }  | 
              |     |     |   +-----+ 
              |     |   +-+---+ 
   714        |     |   |  }  | 
              |     |   +-----+ 
              |   +-+---+ 
   715        |   |  }  | 
              |   +-----+ 
   716        +--- MakeArgValList();   // TRのサブルーチンに渡す引数リストを生成する。
   717        +--- //
   718        |    // 全アンロールのCase数を計算する。  
   719        |    //                                   
   720        +--- CaseCount = 1;
              |  +--------------------------------------+ 
   721        +--+ for(k = 0 ; k < variedCount ; k++){  | 
              |  +--+-----------------------------------+ 
   722        |     +--- CaseCount *= (variedToValue[k] - variedFromValue[k] + 1);
              |   +-+---+ 
   723        |   |  }  | 
              |   +-----+ 
   724        +--- //
              |  +--------------------------------------+ 
   725        +--+ for(k = 0 ; k < variedCount ; k++){  | 
              |  +--+-----------------------------------+ 
   726        |     +--- //
   727        |     |    // 修正 8/26: Doの終わり値を式でもOKな形に修正。 
   728        |     |    //                                                 
   729        |     +--- #if 1
              |     |  +--------------------------------------------------------+ 
   730        |     +--+ for(int k2 = DoEndSPos[k] ; k2 < DoEndEPos[k] ; k2++){ | 
              |     |  +--+-----------------------------------------------------+ 
   731        |     |     +--- Token = (TToken *)TokenList->Items[k2];
   732        |     |     +--- ValData = (TValData *)Token->ValData;
              |     |     |  +----------------------+ 
   733        |     |     +--+ if(ValData != NULL){ | 
              |     |     |  +--+-------------------+ 
   734        |     |     |     +--- ValData->DoEndValBits |= (1 << k);  // Doの終わり値を示す変数を確定
              |     |     |   +-+---+ 
   735        |     |     |   |  }  | 
              |     |     |   +-----+ 
              |     |   +-+---+ 
   736        |     |   |  }  | 
              |     |   +-----+ 
   737        |     +--- #else
              |     |  +--------------------------------------+ 
   738        |     +--+ if(DoEndSPos[k] != DoEndEPos[k]-1){  | 
              |     |  +--+-----------------------------------+ 
   739        |     |     +--- MainF->err("Unroll対象のDoの終わり値に式は使えません。");
              |     |     |  +----------+ 
   740        |     |     +--+ return;  | 
              |     |     |  +----------+ 
              |     |   +-+---+ 
   741        |     |   |  }  | 
              |     |   +-+---+ 
              |     |   +-+-------+ 
   741        |     |   |  else{  | 
              |     |   +-+-------+ 
   742        |     |     +--- Token = (TToken *)TokenList->Items[DoEndSPos[k]];
   743        |     |     +--- ValData = (TValData *)Token->ValData;
   744        |     |     +--- ValData->DoEndValBits |= (1 << k);  // Doの終わり値を示す変数を確定
              |     |   +-+---+ 
   745        |     |   |  }  | 
              |     |   +-----+ 
   746        |     +--- #endif
              |   +-+---+ 
   747        |   |  }  | 
              |   +-----+ 
   748        +--- //
   749        |    // ArgValListを定義順にSortする。      
   750        |    // ""も、必要なので、削除はしないこと  
   751        |    //                                     
   752        +--- SortArgValList();
   753        |    
   754        +--- //
   755        |    // 各変数がDo変数からの依存かどうかをチェックする。                  
   756        |    // Do依存の変数は、UnRollの数だけ、別変数に置き換えられる。          
   757        |    //                                                                   
   758        |    //  DO i = 1,100 で da = b(i); の場合は、 daは、Do変数依存           
   759        |    //  a(i) = b(i) の場合は、 aに(Do変数 i)があるために依存でない。     
   760        |    //  da = b(i) で daがDo変数依存の場合に dc = 2*da での dcは、Do依存  
   761        |    //  da = b(i) で da = da + c(i) は、 daは Do依存だが、元々Do依存     
   762        |    //                                                                   
   763        |    //                                                                   
   764        +--- ChackRefDoValF(TokenStartPos,TokenEndPos);
   765        +--- SaveAndResetValBits(TokenStartPos,TokenEndPos);  // DoVal関連の識別を、保存してリセット
   766        +--- // 使用時は、RestoreValBitsを行うこと。
            +-+---+ 
   767      |  }  | 
            +-----+