Applistar

5. 2. 5 SC_CTOR の定義

TOP > 5 SystemC入門 > 5. 2 モジュール > 5. 2. 5 SC_CTOR の定義
  5. 2. 5 SC_CTOR の定義  

5. 2. 5 SC_CTOR の定義

コンストラクタを記述するには、通常は、前項のように SC_CTOR を使います。 しかしモジュールを、引数を使ってパラメータ化する場合など、 SC_CTOR を使わない方法も良く使われるので、それについて説明します。

まず SC_CTOR のソースをのぞいてみます。 それは、 systemc/kernel/sc_module.h にあります。

それによると マクロの定義の内容は変数 の値によるとなっています。 これは(今のところ) MicroSoft のコンパイラ(MSC) かどうかで切分けるのと等価になっています。

5. 2. 5. 1 MSC 以外の場合

#ifdef SC_USE_MEMBER_FUNC_PTR
#define SC_CTOR(user_module_name)                                             \
    typedef user_module_name SC_CURRENT_USER_MODULE;                          \
    user_module_name( sc_module_name )

// the SC_HAS_PROCESS macro call must be followed by a ;
#define SC_HAS_PROCESS(user_module_name)                                      \
    typedef user_module_name SC_CURRENT_USER_MODULE

5. 2. 5. 2 MSC の場合

#else
#define SC_CTOR(user_module_name)                                             \
    typedef user_module_name SC_CURRENT_USER_MODULE;                          \
    sc_vc6_process_helper_class<user_module_name> sc_vc6_process_helper;      \
    user_module_name( sc_module_name )

// the SC_HAS_PROCESS macro call must be followed by a ;
#define SC_HAS_PROCESS(user_module_name)                                      \
    typedef user_module_name SC_CURRENT_USER_MODULE;                          \
    sc_vc6_process_helper_class<user_module_name> sc_vc6_process_helper
#endif

5. 2. 5. 3 SC_CTOR と SC_HAS_PROCESS の違い

上で、MSC かどうかの違いを無視すると、 一つ目の方を見れば良いことになります。 その中では二つのマクロはそれぞれ次のように定義されています。

SC_CTOR
    typedef user_module_name SC_CURRENT_USER_MODULE;  \
    user_module_name( sc_module_name )
SC_HAS_PROCESS
    typedef user_module_name SC_CURRENT_USER_MODULE;

ですから、この SC_CTOR と SC_HAS_PROCESS の 二つの違いは、SC_CTOR の二行目にある

    user_module_name( sc_module_name )

の部分を自分で書く(SC_HAS_PROCESS)か、 任せる(SC_CTOR)かの違いです。

C++ のクラス定義では、

  • コンストラクタと呼ばれる初期化関数を定義する
  • その方法はクラス名と同じ名前の関数を定義する

ことになっています。 SC_CTOR(user_module_name) と書くのは、 この部分にに相当します。 そうして、これに続く、波形かっこで囲まれた部分

SC_CTOR(user_module_name)
{
...
}

の中が、SystemC のコンストラクタ(初期化部分)となります。 上の例では user_module_name がクラス名ですから、

SC_HAS_PROCESS(cpu);
cpu(sc_module_name ......)
{
...
}

のように cpu という名前の関数を定義すると、 それがコンストラクタになります。

5. 2. 5. 4 SC_CTOR と SC_HAS_PROCESS の共通点

この二つの違いを上で見ましたが、共通点は一行目の方で、

    typedef user_module_name SC_CURRENT_USER_MODULE;

のように user_module_name を として typedef しています。 この user_module_name の部分は、SC_CTOR や、SC_HAS_PROCESS の引数、つまりモジュール名が代入されています。 そこで、これは次の行と同じになります。

    typedef モジュール名  SC_CURRENT_USER_MODULE;

そこで、この後に SC_THREAD, SC_METHOD などの中で、 プロセスの種類を設定する時に、この SC_CURRENT_USER_MODULE を参照し、プロセスの名前とモジュール名とが結び付けられます。

  5. 2. 5 SC_CTOR の定義  
TOP > 5 SystemC入門 > 5. 2 モジュール > 5. 2. 5 SC_CTOR の定義