セルタイプコードの例
それでは、簡単な例を見てみましょう。以下のようなTECS CDLがあるとします。これはアップダウンカウンタで、カウンタがレベルに達すると警告を発します。
signature sUpDownCounter { /* アップダウンカウンタシグニチャ */
void countUp();
void countDown();
void readCount( [out]int32_t *count );
};
signature sAlert { /* 警告シグニチャ */
void alert();
};
celltype tAlertCounter { /* アップダウンカウンタセルタイプ */
entry sUpDownCounter eCounter; /* カウンタの受け口 */
call sAlert cAlert; /* 警告の呼び口 */
attribute {
int32_t initial_count; /* カウンタ初期値 */
int32_t alert_count; /* 警告を発するカウント値 */
};
var {
int32_t count = initial_count;
};
};
#include "tAlertCounter_tecsgen.h" /* TECSジェネレータ生成のヘッダファイル */
void eCounter_countUp() /* 受け口 eCounter の countUp 関数 */
{
CELLCB *p_cellcb; /* CELLCB へのポインタ */
if( VALID_IDX( idx ) ){ /* idx は正当値か */
p_cellcb = GET_CELLCB(idx); /* idx_is_id でない場合 p_cellcb = idx */
}else{
return E_ID;
}
/* ここから設計者の記述コード */
VAR_count++;
if( VAR_count == ATTR_alert_count )
cAlert_alert();
/* ここまで設計者の記述コード */
}
void eCounter_countDown() /* 受け口 eCounter の countDown 関数 */
{
CELLCB *p_cellcb;
if( VALID_IDX( idx ) ){
p_cellcb = GET_CELLCB(idx);
}else{
return E_ID;
}
/* ここから設計者の記述コード */
VAR_count--;
/* ここまで設計者の記述コード */
}
tAlertCounterのセルタイプコードとして、受け口eCounterの受け口関数eCounter_countUp, eCounter_countDownとeCounter_readCountを記述します。eCounter_countUp関数では内部変数countの値が警告レベルalert_countに達すると、呼び口cAlertを通して警告を伝えます。上記の例ではeCounter_readCount 受け口関数は省略しています。
ただし、内部変数countには'VAR_'を、属性alert_countには'ATTR_'を前置します。このように'ATTR_'や'VAR_'を前置して書くのは若干不便のように思えるかもしれませんが、ROMに配置される属性とRAMに配置される内部変数を意識することなくアクセスすることができます。もし、このようなマクロを用いなければ、少なくとも一方のアクセスでは、これらをつなぐポインタをかませなくてはなりません。
また、属性や内部変数の一方しかない場合には、最適化によりROM領域が省略されたりRAM領域が省略されたりします。このような場合、セルを指すポインタがROM領域を指すかRAM領域を指すかは、ジェネレータが自動に判断してコード生成します。
さらに、ジェネレータのオプションにより、すべてをRAM 配置するようにすることもできますが、セルタイプコードを書換える必要がありません。ハードウェア資源に合わせてコードを生成することができます。
