abc プロジェクト
14.8.18. MakeUnrollData メンバ関数説明 |
メンバ関数名 | MakeUnrollData |
定義ファイル名 | TuneRegion.cpp |
定義行 | 577 |
所属名 | TTuneRegion |
アクセス属性 | public |
宣言形式 | void MakeUnrollData ( int sPos ) |
概要 | UnRollの解析を行う。 Type,Name,Do LoopEnd 式,iusw の変数の作成が行われる。 |
戻り値 | |
パラメタ説明 | sPos 開始位置 |
機能説明 | |
備考 | |
呼出し元関数一覧表
呼出し先関数一覧表
参照外部変数一覧表
参照メンバ変数一覧表
参照先一覧表
関数論理チャート
| +--------------------------------------------+
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 | } |
+-----+