Changes between Initial Version and Version 1 of CDLref_celltype


Ignore:
Timestamp:
Jan 16, 2016, 9:58:29 PM (8 years ago)
Author:
okuma-top
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • CDLref_celltype

    v1 v1  
     1== セルタイプ記述 ==
     2
     3セルタイプ記述は、コンポーネントの型を定義するものです。
     4セル(コンポーネントインスタンス)は、いずれかのセルタイプ(複合セルタイプを含む)に属します。
     5
     6【記述例】
     7
     8 {{{
     9   [singleton]                           // セルタイプの指定子
     10   celltype tCelltype {                  // celltype キーワードとセルタイプ名
     11     entry sSignature eEntry;            // entry キーワードと対応付けられたシグニチャと受け口名
     12     call  sSignature cCall;             // call キーワードと対応付けられたシグニチャと呼び口名
     13     attr {                              // 属性. '{', '};' で囲む
     14       int16_t len = 256;                // 初期値を指定した場合
     15       char  *bufName;                   // 初期値を指定しない場合
     16       int8_t   initialState = 0;
     17     };
     18     var {                               // 変数. '{', '};' で囲む
     19       [size_is( len )]                  // 変数の指定子
     20          int8_t *buf;
     21       int16_t  rdPoint;
     22       int16_t  wrPoint;
     23       int8_t   stateNo = initialState;  // 属性を参照して変数を初期化
     24     };
     25   };
     26 }}}
     27
     28ここで celltype はキーワードであり、tCelltype はセルタイプ名です。'{', '}' に囲まれた中に、受け口(entry), 呼び口(call), 属性(attr), 変数(var)を記述します。
     29
     30この他に、ファクトリ (factory, FACTORY), リクワイア (require) を記述します。
     31
     32慣習として、セルタイプ名は ’t' で、受け口名は 'e' で、呼び口名は 'c' で始めます。属性、変数の名前は、小文字で始め、単語区切りでは大文字とします。
     33
     34=== セルタイプ記述の指定子 ===
     35
     36==== active 指定子 ====
     37
     38active 指定子は、セルタイプがアクティブであることを表します。
     39すなわち、アクティブなセルタイプに属するセルは、受け口関数が呼び出されなくても動作することを表します。タスクやハンドラ、あるいはこれらを内部にもつセルタイプはアクティブです。
     40
     41==== generate 指定子 ====
     42
     43generate 指定子は、セルタイププラグインの適用を指示するものです。セルタイププラグインの一般的な使い方としては、ファクトリでは実現できない特別なコードを生成するのに用います。
     44
     45【記述例】
     46  {{{
     47    [generate(CelltypePluginName, "option..." )]
     48    celltype tCelltype {
     49        /* 省略 */
     50    };
     51  }}}
     52
     53ここで、それぞれのワードは、以下を意味します。
     54 * generate はキーワードである
     55 * CelltypePluginName はセルタイププラグイン名である
     56 * オプションは、プラグインごとに規定される。文字列リテラルを渡す
     57 
     58==== idx_is_id 指定子 ====
     59
     60idx_is_id 指定子は、セルの実行時識別として整数値を用いることを示します。
     61この指定がない場合、実行時識別としてポインタが用いられます。
     62実行時識別として整数値を用いることの利点は、指定値の有効性検査が行われることです。
     63
     64==== singleton 指定子 ====
     65
     66singleton 指定子は、セルタイプのセルがシステム中に一つだけ存在することを示します。
     67
     68あるシングルトンセルタイプのセルは、それぞれのノードやリンク単位に最大1つだけ存在することができます。
     69つまり、あるコンポーネント記述において、あるシングルセルトンタイプのセルが複数存在することができます。
     70
     71=== 呼び口 ===
     72
     73呼び口は、受け口関数を呼び出すための口です。シグニチャに対応付けます。
     74
     75=== 呼び口配列 ===
     76
     77呼び口から受け口への結合を分流することはできませんが、呼び口配列により、呼び口を複数のセルに結合することができます。
     78
     79添数を指定することも省略することもできます。
     80添数を省略した場合、任意個のセルを結合することができます。
     81
     82=== 呼び口の指定子 ===
     83
     84==== optional 指定子 ====
     85
     86受け口を、未結合とすることができることを示します。
     87
     88optional 指定されている場合、セルタイプコードにおいては、呼び口関数を呼び出す前に、呼び口が結合されているかどうか検査する必要があります。
     89
     90optional 指定されていなく、添数指定されていない呼び口配列の場合、少なくとも1つの結合をもつ必要があります。
     91
     92=== 受け口 ===
     93
     94受け口は、機能を提供するための口です。シグニチャに対応付けます。
     95
     96=== 受け口配列 ===
     97
     98受け口配列は、呼び元を区別するために用いられます。
     99呼び口から受け口への結合を合流することができますが、この場合、受け口において呼び元を区別するこができません。
     100
     101添数を指定することも省略することもできます。
     102添数を省略した場合、任意個のセルを結合することができます。
     103
     104=== 受け口の指定子 ===
     105
     106==== allocator 指定子 ====
     107
     108allocator 指定子は、リレーアロケータを指定するのに用いられます。
     109
     110【記述例】
     111{{{
     112celltype tRelayComponent {
     113        [allocator(                             // リレーアロケータの指定
     114                           snd.buf <= cSR.snd.buf,  // 前方参照可能
     115                           rcv.buf <= cSR.rcv.buf
     116                           )]
     117                entry  sSendRecv eS;            // リレーする元の受け口
     118        call   sSendRecv cSR;               // リレーする先の呼び口
     119
     120        attr {
     121                char_t  *name = C_EXP( "\"$id$\"" );
     122        };
     123};
     124}}}
     125
     126【補足説明】TECS ジェネレータの実装で、受け口配列のリレーアロケータは未サポート。
     127
     128T.B.W.
     129
     130==== inline 指定子 ====
     131
     132受け口関数が、インライン関数として実装されることを示します
     133
     134==== 固定結合 ====
     135
     136固定結合は、セルタイプの受け口において、呼び元のセルを指定するものです。
     137
     138【記述例】
     139
     140{{{
     141// (1) 逆require をセルタイプで指定する場合
     142celltype tCelltype {
     143        entry sInit eInit <= tInitializer.cInit;  // シングルトンセルタイプ
     144};
     145
     146// (2) 逆require をセルで指定する場合
     147celltype tCelltype2 {
     148        entry sInit eInit <= Initializer.cInit;
     149};
     150}}}
     151
     152【補足説明】初期化のための結合を、一々記述することなく、省略することを目的とした機能である。
     153
     154固定結合は、以下の条件を満たす必要があります。
     155
     156 * 固定結合先の呼び口は、添数なしの呼び口配列でなくてはならない
     157 * 固定結合先にセルタイプ (複合セルタイプを含む) を指定する場合、そのセルタイプは、シングルトンでなくてはならない
     158 * 固定結合先にセルを指定する場合、そのセルタイプはシングルトンでなくてもよい
     159 * 固定結合指定されている受け口は、非配列でなくてはならない
     160 * 複合セルタイプの内部セルが固定結合が指定されている受け口を持つ場合、複合セルタイプの外部のセルから直接結合される
     161
     162複合セルタイプの内部セルが固定結合が指定されている受け口を持つ場合、複合セルタイプの外部のセルから直接結合されるため、複合セルタイプにおいて、外部結合のための受け口を持つ必要はありません。
     163
     164固定結合の結合順序は、以下の通りです。
     165
     166 * CDL ファイルのセルの出現順(構文解釈が行われた順)に、固定結合の結合がなされる
     167 * 複合セルタイプの内部セルにおいて、固定結合がなされている場合、複合セルタイプのセルの出現順番で結合がなされる
     168 * 複合セルタイプの内部セルに複数の固定結合が指定されたセルがある場合、複合セルタイプ定義で内部セルが出現した順番で結合がなされる
     169 * スループラグインで挿入されるセルは、すべてのソースプログラムの構文解釈が終わった後に構文解釈されるため、固定結合の順序としては後ろの方に置かれる
     170
     171【補足説明】セルの id は、同じセルタイプに属するセルの間で順序付けするものである。固定結合では、複数のセルタイプが関わることを想定しており、CDL ファイルの出現順序で結合される。
     172
     173=== 属性 ===
     174
     175属性は、セルの持つ値を保持するものです。属性には、初期値を与えることができますが、実行時に書き換えることはできない、定数として扱われます。属性は ROM に置くことが想定されています。
     176
     177属性の初期値は、セルタイプの定義時だけでなく、セルを定義する際にも与えることもできます。
     178両方に初期値が与えられた場合には、セルにおける初期値が優先されます。
     179属性の初期値は、セルタイプかセルの少なくとも一方の定義において、与えられる必要があります。
     180
     181初期化子として C_EXP が用いられた場合、文字列リテラルは、名前置換が行われます。
     182この名前置換は、ファクトリににおける名前置換と同じ規則です。
     183
     184集成型初期化子を、配列または構造体を初期化するのに用いることができます。
     185配列には、size_is 指定されたポインタ型を含みます。
     186size_is 指定されていないポインタ型の属性に、集成型初期化子を用いることはできません。
     187
     188=== 属性の指定子 ===
     189
     190==== choice 指定子 ====
     191
     192choice 指定子は、属性が取りうる値を指定します。
     193
     194【記述例】
     195  {{{
     196   attr {
     197     [choice={"0", "1", "2"}]
     198        int8_t  initial_state = 0;
     199   };
     200  }}}
     201
     202TECS ジェネレータは、choice 指定子で指定された初期値以外が設定されたかどうかを検査しません。GUI エディタで選択肢を示すためのものです。
     203
     204==== omit 指定子 ====
     205
     206omit 指定子は、属性をセルの CB に出力をしないことを示します。
     207属性を、セルタイプコードで参照しない場合、すなわちファクトリまたはセルタイププラグインでのみ参照する場合に指定します。
     208
     209==== size_is 指定子 ====
     210
     211属性がポインタ型の場合に指定できます。
     212ポインタ型が配列を指していて、そのサイズが size_is の引数で示される大きさを持つことを示します。
     213
     214size_is は式を引数にとります。式は定数式、または属性を含む式です。この属性は、前方参照が許されます。
     215
     216=== 変数 ===
     217
     218変数は、内部変数とも呼ばれます。
     219
     220変数も、セルの持つ値を保持するものですが、属性とはいくつかの点で異なります。
     221
     222 * 実行時に書き換えることができる
     223 * セルの定義時に初期値を与えることはできない
     224 * 初期値を指定するのに属性を参照する式とすることができる
     225 * 初期値をまったく与えないままとすることができる
     226
     227内部変数は、セルの定義において直接的に初期値を与えることはできないが、属性を参照する式により間接的に初期値を与えることができます。
     228
     229属性が ROM に置かれることが想定されているのに対し、変数は RAM に置かれることが想定されます。
     230つまりセルタイプコード (プログラム)により値が変更されることが想定されます。
     231
     232変数には、セルの定義において直接的に初期値を与えることはできませんが、属性を参照することで間接的に初期値を与えることができます。
     233
     234変数を定数式により初期化することはできますが、修正型の初期化子や C_EXP 初期化子により初期化することはできません。
     235
     236=== 変数の指定子 ===
     237
     238==== 変数の size_is 指定子 ====
     239
     240変数がポインタ型の場合に指定できます。
     241ポインタ型が配列を指していて、そのサイズが size_is の引数で示される大きさを持つことを示します。
     242
     243 * size_is は整数型の値を返す式を引数にとる。式は定数式、または属性を含む式である
     244 * size_is 指定されたポインタ型の変数は、配列を指す定数として扱われ、書換えることはできない
     245 * ポインタの指す先の配列の要素は書き換えることができる
     246 * size_is の引数で指定された大きさの領域が確保される
     247    (初期値の指定の有無に関係なく、size_is の引数で指定された大きさの領域が確保される)
     248 * 初期値として '{', '}' で囲んだ定数式を要素とする初期化子リストを指定できる
     249   (初期化子リストの個数は size_is の引数で与えられる配列の大きさ以下の個数が指定できる)
     250
     251=== リクワイア ===
     252
     253リクワイアにより、セルタイプに属するすべてのセルを、特定のセルに結合できます。
     254
     255【記述例】
     256{{{
     257/* require でセル名を指定 */
     258[active]
     259celltype tRequire{
     260        require Kernel.eSc;             // セル : Kernel
     261};
     262
     263/* require でセルタイプ名を指定 */
     264[active]
     265celltype tRequire2{
     266        require tKernel.eSc;            // セルタイプ: tKernel (シングルトン)
     267};
     268
     269/* 呼び口名を持つ require */
     270celltype tNamedRequire{
     271        require cReqCall = Kernel.eSc; // 呼び口名 cReqCall
     272};
     273}}}
     274
     275ここで、セルタイプを指定する場合、そのセルタイプはシングルトンでなくてはなりません。また、受け口が、受け口配列であってはなりません。
     276セルを指定する場合、そのセルを前方参照できます。
     277
     278リクワイアは、リクワイア呼び口の生成と、リクワイア呼び口の結合先の受け口を指定するものです。
     279リクワイア呼び口は、通常の呼び口とはいくつかの点で異なります。
     280
     281 * 呼び口名を与えないでおくことができる
     282 * セルタイプにおいて、結合を定義する
     283 * 呼び先を指定するのに、セル名に代えてセルタイプ名で指定することもできる
     284
     285【補足説明】TECS ジェネレータの実装では、リクワイア呼び口名が与えられたリクワイア呼び口への結合を、セルでオーバーライドすることがことがでますが、TECS ジェネレータは警告を発します。
     286
     287リクワイア呼び口に名前、すなわちリクワイア呼び口名を与えることができます。
     288リクワイアは、一つのセルタイプにおいて複数記述することができますが、リクワイア呼び口名が与えられていない場合、それぞれの受け口のシグニチャに属する関数の名前が重複することはできません。
     289
     290リクワイアでセルタイプを指定する場合、シングルトンセルタイプのセルが複数存在する場合がありえます。
     291リンク単位が異なるリージョンごとにシングルトンセルタイプのセルが存在する場合です。
     292この場合、セルタイプ名を指定すると、同時に生成されるシングルトンセルタイプのセルを参照します。
     293同時に生成されるセルがない場合は、誤りとなります。
     294
     295=== ファクトリ ===
     296
     297ファクトリは、TOPPERS/ASP などのコンフィギュレーションファイルを作成するなどの目的で使用します。
     298ファクトリには、セルタイプのファクトリ、つまりセルタイプが指定されたことにより必要となる資源を生成する場合と、セルごとに必要となる資源を生成する場合があります。
     299
     300【記述例】
     301{{{
     302celltype tEventflag {
     303   entry   siNotificationHandler   eiNotificationHandler;
     304   attr {
     305       int                     id = C_EXP("FLGID_$id$");
     306       [omit] int              attribute = C_EXP("TA_NULL");
     307   };
     308   factory {             // セルごとに適用されるファクトリ
     309       write("tecsgen.cfg",
     310                 "CRE_FLG(FLGID_$id$, { %s, 0 });", // 名前置換
     311                 attribute);                        // 属性参照
     312   };
     313   FACTORY {             // セルタイプに適用されるファクトリ
     314       write("$ct$_factory.h", "#include \"kernel_cfg.h\"");
     315   };
     316};
     317}}}
     318
     319==== ファクトリ関数 write ====
     320
     321第一引数は、出力先のファイル名を指定する文字列です。
     322コンフィギュレーションファイルの場合、"tecsgen.cfg" を指定することを推奨します。
     323
     324第二引数は、第一引数で指定されたファイルに出力するフォーマット文字列を指定します。
     325この文字列は C の printf 文のフォーマット指定と同様に扱われます。
     326例えば、フォーマット文に %s が指定されている場合、第三引数以降の対応付けられる位置に文字列が指定されることを表します。
     327
     328第三引数以降は、オプショナルであり、フォーマット文字列によって引数の有無が決定されます。
     329第三引数以降に現れる識別子は、以下の順にサーチされます。
     330 * 属性
     331 * 定数
     332識別子は、その右辺値に置き換えられて、write 関数の引数として渡されます。
     333属性の場合、右辺値は、セルに定義されていればその値を、セルに定義されていなければセルタイプで定義されたデフォルトの値を、それも定義されていなければ0または空文字列となります。
     334
     335【補足説明】引数として式を与えることはできない。
     336
     337【参照実装における制限】write 以外ファクトリ関数は定義されていない。
     338
     339【参照実装における制限】参照実装において、フォーマットはコード生成段階において評価される。このため多少ファイル出力が行われる。
     340
     341【参照実装における制限】整数値を出力する場合でも、C_EXP が指定された場合に備えて、フォーマットでは %s を指定した方がよい。整数値は、暗黙的に文字列に変換されるため %d と指定したのと同じになる。一方 %d が指定されていると整数値以外はエラーとなる。
     342
     343==== 名前置換 ====
     344
     345write 関数の引数の文字列定数に含まれる $id$ などの文字列は置換が行われる。以下に置換の行われる文字列の一覧を示す。
     346
     347||= 置換文字列    =||=   置換内容                                     =||
     348|| $id$           || セルタイプ名とセル名を '_' で連結したものに置換      ||
     349|| $cell$         || セル名に置換                                     ||
     350|| $cell_global$  || セルのグローバル名に置換                          ||
     351|| $cb$           || セルの CB の C 言語名に置換                       ||
     352|| $cbp$          || セルの CB へのポインタ (CB が生成されない場合は NULL に置換)   ||
     353|| $cb_proto$     || セルの CB の C 言語名 (プロトタイプ宣言用) に置換    ||
     354|| $ct$           || セルタイプ名に置換                                ||
     355|| $ct_global$    || セルタイプのグローバル名に置換                      ||
     356|| $idx$          || セルの CB の IDX (idx_is_id の場合は整数、そうでない場合は CB へのポインタ)に置換      ||
     357|| $ID$           || セルの ID(idx_is_id の場合 IDX に一致)に置換       ||
     358|| $$             || $ に置換                                        ||
     359
     360最後の規則が優先され、例えば $$id$ は $id$ に、$$ct$ は $ct$ に置換される。
     361また、セルタイプファクトリ(FACTORY)の内側では $ct$, $$ の置換のみが行われる。
     362
     363
     364------
     365[TECS リファレンスマニュアル [wiki:  トップページ]]・
     366[TECS CDL リファレンスマニュアル [wiki:CDLref トップページ]・[wiki:CDLref_index 目次]]