スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

sc_uintとsc_biguintの「~」演算

SystemC Advent Calendar2012 の 14日目の記事です。
前回が、bool型についてだったので sc_uint<1>だとどうなるのか?

  • サンプルコード
  •  1|#include <stdio.h>
     2|#include <systemc.h>
     3|
     4|int main (int argc, char* argv[]) {
     5|  bool bool_bit1 = 0;
     6|  int  bool_data = ~bool_bit1;
     7|  bool bool_bit1not = ~bool_bit1;
     8|
     9|  cout << " [bool] bit1 = "    << bool_bit1 << endl;
    10|  cout << " [bool] data = "    << bool_data << endl;
    11|  cout << " [bool] ~bit1 = "   << ~bool_bit1 << endl;
    12|  cout << " [bool] bit1not = " << bool_bit1not << endl;
    13|
    14|  cout << "" << endl;
    15|  sc_uint<1> uint_bit1 = 0;
    16|  int uint_data = ~uint_bit1;
    17|  sc_uint<1> uint_bit1not = ~uint_bit1;
    18|
    19|  cout << " [sc_uint<1>] bit1 = "    << uint_bit1 << endl;
    20|  cout << " [sc_uint<1>] data = "    << uint_data << endl;
    21|  cout << " [sc_uint<1>] ~bit1 = "   << ~uint_bit1 << endl;
    22|  cout << " [sc_uint<1>] bit1not = " << uint_bit1not << endl;
    23|
    24|  cout << "" << endl;
    25|  sc_biguint<1> buint_bit1 = 0;
    26|  sc_biguint<1> buint_data = (~buint_bit1);
    27|  sc_biguint<1> buint_bit1not = ~buint_bit1;
    28|
    29|  cout << " [sc_biguint<1>] bit1 = "    << buint_bit1 << endl;
    30|  cout << " [sc_biguint<1>] data = "    << buint_data.to_int64() << endl;
    31|  cout << " [sc_biguint<1>] ~bit1 = "   << ~buint_bit1 << endl;
    32|  cout << " [sc_biguint<1>] bit1not = " << buint_bit1not << endl;
    33|
    34|  return 0;
    35|}
  • 実行結果
  • $> ./main
     [bool] bit1 = 0
     [bool] data = -1
     [bool] ~bit1 = -1
     [bool] bit1not = 1
    
     [sc_uint<1>] bit1 = 0
     [sc_uint<1>] data = -1
     [sc_uint<1>] ~bit1 = 18446744073709551615
     [sc_uint<1>] bit1not = 1
    
     [sc_biguint<1>] bit1 = 0
     [sc_biguint<1>] data = 1
     [sc_biguint<1>] ~bit1 = 1
     [sc_biguint<1>] bit1not = 1
    

せっかくなので、boolも書いてます。
実行結果をみてもらうと boolと sc_uint<1>の結果が
おかしいことがわかると思います。
では、なぜ逆に sc_biguint<1>の結果は正しいのか?
っていうのが今回のメインです。


演算子「~」のオーバーロード関数の実装


sc_biguint は sc_dt::sc_unsignedクラスを継承しています。
その中で、

sc_unsigned operator~   (       const sc_unsigned &     u        )
として、定義があり、最終的には sc_bit.hまで辿り着きます。
そこで、実際に実行されているものが、

friend const sc_bit operator ~ ( const sc_bit& a )
    { return sc_bit( ! a.m_val ); }

になり、「」を使っているのがわかります。
ということで、sc_biguint<1>の結果だけ正しくなっているというわけです。

関連記事

コメントの投稿

非公開コメント

プロフィール

Kocha

Author:Kocha
なんでもチャレンジ!(^o^)/
E-mail
github:Kocha
イベントカレンダー

カレンダー
08 | 2017/09 | 10
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
カテゴリ
OVP (4)
最新記事
最新コメント
アーカイブ
リンク
Twitter
アクセス人数
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。