ND EC
i亘⊃(三⊃
io窪1)◎
NodeList EdgeList
NE
シ∋
EdgeLi5tNedeList
図3. 44 エディタ部のデータ構造
◆ プログラムの構成方法
ここでは,プログラムを構成する方法の全般的な説 明と,実際に使用した方法について説明する.A−BITS プログラムは階層型のネットワーク構造をしているた め,Nodeの端子をどのような手順でEdgeと結合する かが重要になる.実際にはアプリケーションはNode を関数へのポインタと端子ポインタのリストを持っク ラス(ExNode),Edgeをキュー(ExEdge)として実装して おり,結合とはExNodeがExEdgeのポインタを端子ポ インタリストに取り込んで参照できる状態をいう.結 合が完了したExNodeは,端子ポインタのリストオフセ
ExNodeとExEdgeはエディタの内部データを参照しながら作成する.この参照方法はいくつか考えら
れ,具体的には,
1)縦型検索でたどりながら作成 2)横型検索でたどりながら作成 3)最下層から部品ごとに結合
がある.1)は,アクティブUnitを根としてプログラムを縦型に展開(最下層に到達するまで下に向か って検索を続ける)する方法である.2)はアクティブUnitを根としてプログラムを横型に展開する(そ の層を全て検索しおわったら,下の層へ降りてまたその層を全て検索していく)方法である.3)は1)
の一種であり,1)の過程で最下層まで展開して既に結合を終えた部分を部品とし,次にそのUnitが出 てきたときは部品としてそれのコピーを作って結合してしまう方法である.動的に探索しなければなら ない葉の数が減少するので最も効率が良いが,コンパイラ方式でしか利用できない.アプリケーション では,2)の方法で結合を行っている.その理由としては,上位の層のExEdgeへのポインタを下層に伝 播させていくだけで良いので簡単だからである.
図3.46,図3.47,図3.48は簡単なプログラム例で,端子の一覧は下の表に示されている.これを 実行するとコンソールが開いて「01」と表示される.この結果が出る過程として,まず「Test」内にあ る「2bit」の内部から1と0という値がこの順序で送出される.それがrNotPB」に入ると内部でビッ ト反転してから1ビット値を表示するからである.「2bit」のプログラムは図3.47で,「1bit:0」が
「1bit:1」の「Thru」端子に接続され,「1bit:1」の「Out」端子が自己参照Nodeの「Out」端子に接続 されている.自己参照Nodeの「Thru」端子から「1bit:0」の「Thru」端子へも接続があるが,プログ ラム中ではここにはデータが流れない.
Unit識別子 入力端子識別子リスト 出力端子識別子リスト Test
Qbit motPB
Input shru hn
Output nut
● θ
Teit
NotPE
t ●
LT t・it
1
r rτ h
りrhT r↓眈0
1f川ヒー
〔lut→Out
1
図3.47 Unit 2bit
■ 冑
1
N・)tF B
ln→〔lp
1b iセ:N心t
Result→ln
1bit:F rlrtt■1†
図3.48 Unit NotPB
rNotPB」のプログラムは図3.48で,「1bit:Not」のrIn」端子に自己参照Nodeの「OP」端子が接続さ れている.それから「1bit:Not」の「Result」端子が「1bit:PrintBit」のrIn」端子に接続されてい
る.次に,このプログラムを使用して2)のプログラム構成アルゴリズムを説明することにする.
プログラムを実行しようとするとまず,根としてExNodeを1っ作成 する.図3.49はExNodeの内部構造であるが,それは内部に入力端子 ポインタリスト(左)と出力端子ポインタリスト(右),関数へのポイ ンタ変数(func),そしてExNodeのポインタを格納できるリスト(破 線)を持つ.最終的にプログラムが構成された状態では木構造を形成 することになる.関数へのポインタ変数は,黒箱Unitを参照している Nodeだった場合に機能を表現する関数へのポインタを代入して,実行 時にこれを呼び出すために必要である.
ExNode
目自
(IIIIIiEIコ
⊂⊃・…t・・
口1nstince
EnNodeList
[⊥ロエエコ
図3.49ExNodeの内部構造
プログラムの構成は,エディタ部の情報をExNodeの構造体に書き写すようにして行われる.これは,
最終的にExNodeの木構造がエディタの部のアクティブUnitからそのまま展開した形と同じになるから である.プログラムの構成アルゴリズムは次の通りである.
︶1
︶2
︶3
︶︶
415 ︶︶︶︶
万078Qゾ10)
11)
12)
Unitの一時リストulistにアクティブUnitへのポインタを登録し, ExNodeを新規作成して ExNodeの一時リストnlistに登録する.
もし,ulistが空なら終了.そうでなければulistの先頭からUnitへのポインタを取り出して 一時変数tunitへ代入し, nlistの先頭からExNodeへのポインタを取り出して一時変数tnode に代入する.Nodeインデクス指定変数i←0とする.
tunit内部のNodeの個数≠iならば, ExNodeを新規作成してtnode内のExNodeリストのi番 目に登録する.そうでなければ7に行く.
もしt皿it内のi番目のNodeが自己参照Nodeならばi←i+1として6に行く.
もしtunit内のi番目のNodeが黒箱Unitを参照していたら,その識別子を調べてExNodeに適 切な関数ポインタを設定し,ExNodeをタスクリストに登録する.
i←i+1として2に戻る.
j←0とする.
もしj=(tunit内のEdgeの個数)ならば2にもどる.
もしtunit内のj番目のEdgeが,出力端子(位置PO)と入力端子(位置PI)の両方とも通常Node の端子ならば,新規にExEdge(E)を作成して出力側ExNodeの入力端子ポインタリストの位置PO と入力側ExNodeの出力端子ポインタリストの位置PIにEのポインタを代入する. EをExEdge
リストに登録する.
もし,tunit内のj番目のEdgeが,出力端子か入力端子のどちらか一方が自己参照Nodeの端 子ならば,自己参照Node側のExNodeの端子のポインタリストの指定位置のポインタを,もう 一方のExNodeのポインタリストの指定位置に代入する.
もし,tunit内のj番目のEdge(E)が,両方とも自己参照Nodeの端子ならば,ただデータを通 過させるだけのExNode(N)を作成して, Nをtnode内のリストとタスクリストに登録する. N
には両方のExNodeの指定した位置のポインタをそのまま繋ぐ.
j←j+1として8に戻る.
11)でデータ通過のみのExNodeを作成しているのは,上位からEdgeを伝播させたときに両方とも自 己参照NodeのEdgeの場合は,2つのExEdgeポインタを受け取るためにそのままでは接続できないから である.上記のアルゴリズムによって構成されたプログラム例の内部状態は図3.50に示してある.