| 1 | == 組上げ記述 (セル記述) == |
| 2 | |
| 3 | 組上げ記述は、セル記述とも呼ばれ、セルを定義するものです。 |
| 4 | セルとは、セルタイプ記述により定義されたコンポーネントの型に基づいて生成されるコンポーネントのインスタンスです。 |
| 5 | |
| 6 | 【記述例】 |
| 7 | |
| 8 | {{{ |
| 9 | [generate(CellPlugin, "option")] // セルの指定子 |
| 10 | cell tCelltype SimpleCell { // cell キーワード, セルタイプ名、セル名 |
| 11 | cCall = SampleCell.eEntry; // 呼び口を受け口に結合 |
| 12 | cCallArray[] = Sample0.eEntry; // 呼び口配列を受け口に結合 |
| 13 | attribute = 1; // 属性の初期値 |
| 14 | }; |
| 15 | }}} |
| 16 | |
| 17 | ここで cell はキーワードであり、tCelltype はセルタイプ名です。'Cell' がセル名です。'{', '}' に囲まれた中に、呼び口の結合、または属性の初期化を記述します。 |
| 18 | |
| 19 | 慣習としてセル名は、大文字で始めます。セル名の単語区切りも大文字とします。 |
| 20 | |
| 21 | === 組上げ記述の指定子 === |
| 22 | |
| 23 | ==== allocator 指定子 ==== |
| 24 | |
| 25 | allocator 指定子は、セルの属するセルタイプの持つ受け口関数において、send, receive 指定子が指定されている場合に指定する必要があります。 |
| 26 | ただし、セルの属するセルタイプ、または複合セルタイプにおいて、リレーアロケータ、または内部アロケータが指定されている場合には、指定しません。 |
| 27 | |
| 28 | 【記述例】 |
| 29 | T.B.W |
| 30 | |
| 31 | ==== generate 指定子 ==== |
| 32 | |
| 33 | generate 指定子は、セルプラグインの適用を指示するものです。セルプラグインは、呼び口の結合、属性の初期化や、類似のセルの定義に用いられます。 |
| 34 | |
| 35 | ==== id 指定子 ==== |
| 36 | |
| 37 | id 指定子は、セルの id 番号を指定するものです。 |
| 38 | id 指定子は、id 番号を引数にとります 。 |
| 39 | id 番号は、正または負の整数です 。 |
| 40 | |
| 41 | 【補足説明】 id(0) や文字列などはエラー |
| 42 | |
| 43 | id 番号はセルタイプごとに 1 から(生成されるセルの個数)までの番号を指定できます。 |
| 44 | |
| 45 | 指定できる id 番号には、以下の制約があります。 |
| 46 | |
| 47 | * id 番号に範囲外となるものを指定できない |
| 48 | * id 番号が重複することはできない |
| 49 | |
| 50 | セルにid 指定子が指定されていない場合、出現順に 1 から順に id 番号が与えられます |
| 51 | ただし id 指定子で指定されている id 番号は避けられます。 |
| 52 | |
| 53 | TECS ジェネレータは id 番号順に、コードを生成します。 |
| 54 | セルの生成順序を TECS CDL の出現順序とは別に制御したい場合に用います。 |
| 55 | |
| 56 | 【補足説明】tecsgen のオプション -u を指定すると、全体の通し番号となるが、セルタイプごとには連続した値が与えられる。 |
| 57 | その場合でも id = 1 のセルがセルタイプにおいて最初のセルとなる。 |
| 58 | tecsgen のオプション -v を指定すると、最終的に与えられた id 番号が表示される 。 |
| 59 | |
| 60 | 【記述例】 |
| 61 | {{{ |
| 62 | [id(-1)] // 一番後ろの ID となる (5) |
| 63 | cell tCelltype Cell5{ |
| 64 | }; |
| 65 | |
| 66 | cell tCelltype Cell2{ // 未指定 id = 2 となる |
| 67 | }; |
| 68 | |
| 69 | cell tCelltype Cell3{ // 未指定 id = 3 となる(出現順) |
| 70 | }; |
| 71 | |
| 72 | [id(-2)] // 後ろから2番目の ID となる(4) |
| 73 | cell tCelltype Cell4{ |
| 74 | }; |
| 75 | |
| 76 | [id(1)] // 一番先頭の ID となる (1) |
| 77 | cell tCelltype Cell1{ |
| 78 | }; |
| 79 | }}} |
| 80 | |
| 81 | |
| 82 | ==== prototype 指定子 ==== |
| 83 | |
| 84 | プロタイプ指定子は、'{', '}' で囲まれた結合リストを伴うセル文が、プロトタイプ宣言であることを示します。 |
| 85 | |
| 86 | prototype 指定子を伴わないセルの定義が CDL ファイル内で表れた時に、実際にセルが定義されます。 |
| 87 | |
| 88 | === 結合 === |
| 89 | |
| 90 | 結合とは、セル記述において、呼び口に受け口を割付けることです。 |
| 91 | 呼び口のシグニチャと、受け口のシグニチャは一致しなくてはなりません。 |
| 92 | |
| 93 | 結合を記述しようとするセルの属するセルタイプに現れたすべての呼び口について、結合を記述します。 |
| 94 | ただし、セルタイプの呼び口定義において otpional が指定されている場合には、未結合のままとすることができます。 |
| 95 | |
| 96 | ==== 呼び口配列 ==== |
| 97 | |
| 98 | 呼び口配列の場合には、結合の左辺において '[', ']' または '[', ']' で囲んで添数を指定します。 |
| 99 | |
| 100 | 添数が指定される場合、添数は定数式で、評価の結果0から(配列サイズ−1)までの整数値になる必要があります。 |
| 101 | セルタイプの呼び口の定義で配列サイズが指定されている場合、 |
| 102 | 0から(配列サイズ−1)までのすべての添数について、結合を記述します。 |
| 103 | セルタイプの呼び口の定義で配列サイズが指定されていない場合、 |
| 104 | 0から指定された添数の最大値までのすべての配列要素が結合されなくてはなりません。 |
| 105 | |
| 106 | optional 指定されている呼び口の場合には、未結合の添数があってもよいです。 |
| 107 | 添数の出現順序は規定しないが、同じ添数が重複してはなりません。 |
| 108 | |
| 109 | 添数が指定されない場合、出現順に0から(出現個数−1)までが添数として与えられます。 |
| 110 | セルタイプの呼び口の定義で配列サイズが指定されている場合、 |
| 111 | 配列サイズ分の定義をしなくてはなりません。 |
| 112 | |
| 113 | 以下の例のように、一つの呼び口配列について、添数を指定する場合と、指定しない場合を混在することはできません。 |
| 114 | |
| 115 | 【不適切な記述例】 |
| 116 | {{{ |
| 117 | cCall[0] = Cell.eEnt; |
| 118 | cCall[] = Cell.eEnt; |
| 119 | }}} |
| 120 | |
| 121 | 【補足説明】配列の全体を結合するには、すべての添数について結合を記述する。添数なしの呼び口と受け口を指定して全体を結合する手段はない。 |
| 122 | |
| 123 | ==== 受け口配列 ==== |
| 124 | |
| 125 | 結合先の受け口が受け口配列の場合、'.' 演算子の右辺に現れる受け口名の後ろに '[', ']' で囲んだ添数を置きます。 |
| 126 | 添数は整数の定数式で、0から(受け口配列の大きさ−1)までの値です。 |
| 127 | 定数式には、定数定義文で定義された定数の識別子を含めることができます |
| 128 | |
| 129 | 添数を省略することができます。この場合、出現順に受け口配列の添数が与えられます。 |
| 130 | |
| 131 | ==== 逆結合 ==== |
| 132 | |
| 133 | 逆結合は、セルの受け口から、結合される呼び口を指定するものです。 |
| 134 | 以下の場合に限って用いることができます。 |
| 135 | |
| 136 | * 指定プロトタイプ宣言の場合 |
| 137 | * コールバック指定されたシグニチャに対応づいた受け口の場合 |
| 138 | |
| 139 | 指定プロトタイプ宣言の場合の例を示します。 |
| 140 | |
| 141 | 【記述例】 |
| 142 | {{{ |
| 143 | [prototype] // prototype 指定子 |
| 144 | cell tMain Main { |
| 145 | eBody <= Task.cBody; // 逆結合 (受け口に呼び口を結合させます) |
| 146 | }; |
| 147 | }}} |
| 148 | |
| 149 | コールバック指定されたシグニチャに対応づいた受け口においても、逆結合の書き方は同様です。 |
| 150 | |
| 151 | 【補足説明】セルの実装では、呼び口において受け口へたどる情報を持つ(受け口から呼び口へたどるための情報は持っていない)ことから、呼び元のセルから結合先を指定するのを一般的な記述方法としている。従って、逆結合の使用は最小限にとどめるべきであることから、上記の制限が設けられている。 |
| 152 | |
| 153 | === 結合の指定子 === |
| 154 | |
| 155 | ==== through 指定子 ==== |
| 156 | |
| 157 | スルー指定子は、呼び口にスループラグインの適用を指示します |
| 158 | プラグイン名で指定されたプラグインが ジェネレータにロードされ、ジェネレータがスルーセルを生成します。 |
| 159 | スルーセルと呼ばれるセルが、呼び口と受け口の間に挿入されます。 |
| 160 | |
| 161 | === 属性の初期化 === |
| 162 | |
| 163 | 結合により、セルの属するセルタイプで定義されている属性について、初期値を与えることができます。 |
| 164 | 結合により属性の初期値が与えられない場合、セルタイプにおいて属性に与えられた初期値により初期化されます。 |
| 165 | いずれにおいても属性の初期値が与えられない場合は、誤りです。 |
| 166 | |
| 167 | 初期化子に現れる定数式には、定数定義文で定義された定数の識別子を含めることができます。 |
| 168 | |
| 169 | 属性が整数型、浮動小数型、ブール型の場合、初期化子は定数式です。 |
| 170 | |
| 171 | 属性がポインタ型で size_is 指定された配列の場合、初期化子は集成型初期化子とします。 |
| 172 | 非配列の場合、初期化子はポインタ型にキャストされた定数式です。 |
| 173 | |
| 174 | 属性が構造体型の場合、初期化子は集成型初期化子です。 |
| 175 | |
| 176 | ==== 複合コンポーネントの内部セルの属性 ==== |
| 177 | |
| 178 | 結合が、複合セルタイプの内部セルの内側に現れた場合は、内部セルの属性を初期化するか、内部セルの属性を複合コンポーネントの属性に割付けるものになります。 |
| 179 | |
| 180 | 内部セルの属性を初期化する場合は、前節の属性の初期化の場合と同じです。 |
| 181 | |
| 182 | 内部セルの属性を複合コンポーネントの属性に割付ける場合、結合の割付記号 '=' の右辺の記号 '.' の左辺に 'composite' を置くことができます。 |
| 183 | この場合、記号 '.' の右辺の識別子は、複合セルタイプ属性文で定義される複合セルタイプが外部に公開する属性の名前です。 |
| 184 | 複合セルタイプの属性名が、内部セルの持つ属性、変数、呼び口、受け口のいずれの名前とも重複しない場合には、'compsote' '.' を前置きすることなく、割付け記号 '=' の右辺に複合セルタイプの属性名のみを置くことができます。 |
| 185 | |
| 186 | 【記述例】 |
| 187 | cell tCell2_active_single cell2 { |
| 188 | a = composite.a; |
| 189 | cCall = cell1.eEntry; |
| 190 | }; |
| 191 | |
| 192 | |
| 193 | 内部セルの属性を複合コンポーネントの属性に割付ける場合、両者の型が一致しなくてはならなりません。 |
| 194 | また、内部セルの属するセルタイプにおいて属性の初期値が指定されていたとしても、この初期値は参照されません。 |
| 195 | 複合セルタイプの属性または、複合セルタイプから生成されるセル(複合セルタイプに属するセル)のいずれか、少なくとも一方において、初期値が指定されなくてはなりません。 |
| 196 | 両方で指定された場合、セルで指定された初期値が優先されます。 |
| 197 | |
| 198 | === プロトタイプ宣言 === |
| 199 | |
| 200 | セルのプロトタイプ宣言は、セルが定義される前に参照可能とするために、セルの名前と属するセルタイプまたは複合セルタイプを宣言するものです。 |
| 201 | あるいは、セルを定義する前に、セルの一部または全部の属性、結合先、非結合先を指定する目的で用いることもできます。 |
| 202 | |
| 203 | プロトタイプ宣言には、純粋プロトタイプ宣言と指定プロトタイプ宣言の2通りがあります。 |
| 204 | |
| 205 | ==== 純粋プロトタイプ宣言 ==== |
| 206 | |
| 207 | 純粋プロトタイプ宣言は、セルを前方参照可能とする目的で用いられます。 |
| 208 | |
| 209 | TECS CDL ではセルの前方参照が可能であり、通常純粋プロトタイプ宣言を用いる必要はありませんが、意味解析後に生成され解釈されるポストコードで生成されるセルは、意味解析段階で参照できないため、プロトタイプ宣言が必要となります |
| 210 | |
| 211 | 【記述例】 |
| 212 | {{{ |
| 213 | cell tCelltype Cell; |
| 214 | }}} |
| 215 | |
| 216 | '{', '}' で囲まれた結合リストを伴わない。 |
| 217 | |
| 218 | ==== 指定プロトタイプ宣言 ==== |
| 219 | |
| 220 | 指定プロトタイプ宣言は、プロトタイプ宣言で、呼び口や属性の一部または全部のを予め定義しておく目的で用いられます。 |
| 221 | プロトタイプ宣言されたセルの定義が行われなければ、セルは生成されません 。 |
| 222 | |
| 223 | セルの定義では、プロトタイプ宣言された結合を変更することはできません(二重定義エラーとなる)。 |
| 224 | プロトタイプ指定子とジェネレート指定子を同時に指定できません。 |
| 225 | セルの定義が行われた後に、そのセルの指定プロトタイプ宣言を行うことはできません。 |
| 226 | |
| 227 | 【補足説明】 ジェネレート指定子は構文解釈時にプラグインを呼び出す。意味定義段階でプラグインを呼び出すと、セル生成が不適切になる可能性がある。 |
| 228 | |
| 229 | prototype を指定された cell は、何度でも同名で定義できます。 |
| 230 | |
| 231 | |
| 232 | 【記述例】 |
| 233 | {{{ |
| 234 | [prototype] // prootype 指定子 (一部の結合だけを指定する例) |
| 235 | cell tMotorA MotorA { |
| 236 | eHandler <= GPIO_16bit_0.cIRQ[3]; // 逆結合 |
| 237 | cGPIO = GPIO_16bit_0.eGPIO[3]; // GPIO_16bit No.0 の bit 3 を要求 |
| 238 | }; |
| 239 | }}} |
| 240 | |
| 241 | |
| 242 | |
| 243 | ------ |
| 244 | [TECS リファレンスマニュアル [wiki: トップページ]]・ |
| 245 | [TECS CDL リファレンスマニュアル [wiki:CDLref トップページ]・[wiki:CDLref_index 目次]] |
| 246 | |