セグメントの呼び出し
何度も使う下請け的処理ではあっても,独立な制御による並列度の向上が期待できないものは,「ステージの中の閉じた枠組み」であるセグメントにより記述します.セグメントは,ソフトウェアのサブルーチンと同様のもので,
call セグメント名 (戻り状態名);
の形式で呼び出します.
ステージは,ステージの全状態を区別できるサイズの状態レジスタをもっていて,ステージが現在どの状態にあるかはこの値により示されています.一方,セグメントは状態レジスタと同じサイズの戻り状態レジスタをもっていて,セグメント呼び出しでは戻り状態の値がこの戻り状態レジスタへ設定され,セグメントからの復帰では戻り状態レジスタの内容がステージの状態レジスタへ設定されます.
このメカニズムにより,ステージの状態からセグメントを呼び出すだけでなく,セグメントの状態から他のセグメントを呼び出すことができます.また,戻り状態を指定しないセグメント呼び出しでは,セグメントの状態から他のセグメントを呼び出すときに,呼び出し元の戻り状態レジスタの内容を呼び出し先の戻り状態レジスタへ転送します.これにより復帰に必要なマシン・サイクルを削減できます (図3.3) .
<図3.3> セグメント呼び出しとリターン
セグメントの記述例
セグメントをSFLでどう記述するかを見てみましょう.図3.3 の左側の SFL記述は,
stage X {
state_name st1, st2 ;
segment_name seg1, seg2 ;
first_state st1 ;
state st1 par {
..... ; (1)
call seg1 ( st2 ) ;
}
state st2 {
..... ; (2)
}
segment seg1 {
state_name st1, st2, st3 ;
first_state st1 ;
state st1 par {
..... ; (3)
call seg2 ( st2 ) ;
}
state st2 par {
..... ; (4)
goto st3 ;
}
state st3 par {
..... ; (5)
return ;
}
}
segment seg2 {
state_name st1, st2 ;
first_state st1 ;
state st1 par {
..... ; (6)
goto st2 ;
}
state st2 par {
..... ; (7)
return ;
}
}
}
のようになり,(1),(3),(6),(7),(4),(5),(2) の順で動作が実行されます.
ステージの初期状態の定義 (first_stateの部分) では「パワー・オン・リセット直後の状態」を指定し,セグメントの初期状態の定義 (first_stateの部分) では「セグメントの入り口 (最初の状態)」を指定します.