« SystemCの書籍 2006年11月 | Main | CygwinでSystemC »

2006.11.21

sc_trace

SystemCを使ったハードウェア設計を勉強中。

tb.hに誤植があるが、全然問題ないレベル。
そして、sc_traceではまる。

void sc_trace(sc_trace_file *tf, const rgb8_t o, const sc_string& n) {
sc_trace(tf, o.r, n + "_r");
sc_trace(tf, o.g, n + "_g");
sc_trace(tf, o.b, n + "_b");
}

この記述で下のエラー

cd /home/natu/study/dw_systemc/
make -k
g++ -g -I/usr/local/systemc/include/ -c main.cpp
In file included from main.cpp:2:
class.h:64: error: expected `,' or `...' before '&' token
class.h:64: error: ISO C++ forbids declaration of `sc_string' with no type
class.h: In function `void sc_trace(sc_core::sc_trace_file*, const rgb8_t&, int)':
class.h:65: error: `n' undeclared (first use this function)
class.h:65: error: (Each undeclared identifier is reported only once for each function it appears in.)
*** Error code 1 (continuing)
g++ -g -I/usr/local/systemc/include/ -c rgb2yuv.cpp

格闘すること数時間。
要するにsc_traceは、ファイルポインタ、オブジェクトのリファレンス、文字列(の
リファレンス)がわたってくれよさげ。をincludeして、こんな感じで回避。

void sc_trace(sc_trace_file *tf, const rgb8_t o, const std::string& n) {
sc_trace(tf, o.r, n + "_r");
sc_trace(tf, o.g, n + "_g");
sc_trace(tf, o.b, n + "_b");
}

sc_stringとstd::stringで相互変換してくれるのだろうか。(ソースを追った感じでは
sc_stringは、std::stringを継承しているわけではなく、1から書かれていた。)
そして、FreeBSDとCygwinで動きが違う。というかcygwinはassertで落ちる。orz

ちなみに環境はこんな感じ。
FreeBSD、gcc 3.4.4
SystemC 2.1.v1 --- Aug 30 2006 11:49:29

Cygwin gcc 3.4.4
SystemC 2.1_oct_12_04.beta --- Jul 28 2005 09:25:55

|

« SystemCの書籍 2006年11月 | Main | CygwinでSystemC »

Comments

2.1 の release note に以下のような記述があります。

sc_string と sc_pvector を廃止。
C++ 標準ライブラリの string と vector を使用。
以下の 2 つの define のどちらかを使えば、ユーザ定義できる。
SC_USE_STD_STRING - sc_string を std::string と定義
SC_USE_SC_STRING_OLD - sc_string を sc_string_old と定義

おっと飛行機に遅れそう。

Posted by: noboshemon | 2006.11.22 at 07:11 AM

noboshemonさん、情報ありがとうございます。

自分が作ったファイルだけ、-DSC_USE_SC_STRING_OLDでコンパイルして
やってみても上手く行きません。(エラーが増えます)

調べたところ、sc_string.hにこんな記述を見つけました。

#ifdef SC_USE_SC_STRING_OLD
typedef sc_dt::sc_string_old sc_string;
#endif
#ifdef SC_USE_STD_STRING
typedef ::std::string sc_string;
#endif

ソースのこのレベルで書かれているという事は、systemcのkernelを
作る段階でSC_USE_SC_STRING_OLDを定義していないと駄目そうですね。

勉強になりました。ありがとうございました。

Posted by: なつたん | 2006.11.24 at 08:42 AM

ううむ...2.1 以降のライブラリのソースコードには、
明示的に sc_string を使ったところは無さそうですがねえ...
なんでやろ...最早誰もテストしとらんのやろーなー。

Posted by: noboshemon | 2006.11.24 at 05:52 PM

noboshemonさん、こんにちは。

すいません。逆です。

-DSC_USE_SC_STRING_OLDではなく、-DSC_USE_STD_STRINGでコンパイルですね。
これでOKでした。

Posted by: なつたん | 2006.11.24 at 08:18 PM

状況がよくわかってませんけど、
どちらでも行けそうな実装の気がするんすけどねえ...
まあ、もうどうせ使わないんでええか...

Posted by: noboshemon | 2006.11.24 at 10:46 PM

Post a comment



(Not displayed with comment.)




TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/18154/12774247

Listed below are links to weblogs that reference sc_trace:

« SystemCの書籍 2006年11月 | Main | CygwinでSystemC »