日曜技術者のメモ

趣味でやった事のメモ書きです。

C++11とC++14とSystemC

C++11やC++14といった新しいC++でSystemCを使ったらどうなるか軽く試したメモ

C++11

C++11でSystemCがどうなるかについては↓の資料にまとめられています。

http://www.nascug.org/events/17th/black_cpp11_2_27_2012.pdf

一番気になったのはテンプレートについて。
C99だと>が二つ続く際は右シフトと認識しない様にスペースが必要。 でもC++11ではちゃんと判別してくれる様です。

実際にやってみた。

#include <systemc.h>

int sc_main(int argc, char *argv[]) {
    
    sc_signal<sc_uint<5> > c99;
    sc_signal<sc_uint<5>>  cpp11;  //こっちはC++11専用

}

C99環境だと

clang++ -O2 -Wall -I. -I/home/ginnyu-tei/lib/SystemC-2.3.0_Debug//include -c main.cpp
main.cpp:6:25: error: use of undeclared identifier 'cpp11'
        sc_signal<sc_uint<5>>  cpp11; 
                               ^
main.cpp:6:30: error: expected a type
        sc_signal<sc_uint<5>>  cpp11; 
                                    ^
2 errors generated.
make: *** [main.o] エラー 1

もちろんエラー
次は同じコードをC++11環境でやってみる。
C++11環境にするにはオプションに-std=c++11を追加する。
(gccのバージョンによっては-std=c++0x)

clang++ -O2 -Wall -std=c++11 -I. -I/home/ginnyu-tei/lib/SystemC-2.3.0_Debug//include -c main.cpp
clang++ -o run.x -L. -L/home/ginnyu-tei/lib/SystemC-2.3.0_Debug//lib-linux64 -lsystemc -lm  main.o 

問題なくビルド出来ました。

C++14

C++14では2進数表記が追加される様です。
ドラフト規格ですが、コンパイラが独自規格で実装している様なので試してみました。

#include <systemc.h>

int sc_main(int argc, char *argv[]) {

    sc_uint<5> hoge;
    sc_uint<32> piyo;

    hoge = 0b10000;
    piyo = 0b10101010010101010000000011111111;

    cout << std::hex << "hoge = " << hoge << endl;
    cout << std::hex << "piyo = " << piyo << endl;

    return 0;
}

実行結果

[ginnyu-tei@localhost SystemC_Test]$ ./run.x 

             SystemC 2.3.0-ASI --- Mar  9 2014 13:23:24
        Copyright (c) 1996-2012 by all Contributors,
        ALL RIGHTS RESERVED

hoge = 10
piyo = 0aa5500ff

C++14の新機能はまだまだあるけどそれは正式な規格になってから調べる