sc_uint<1>とsc_biguint<1>の「~」演算

前回が bool型についてだったので sc_uint<1>だとどうなるのか?
っということで試してみました。

  • サンプルコード
#include <stdio.h>
#include <systemc.h>

int main (int argc, char* argv[]) {
  bool bool_bit1 = 0;
  int bool_data = ~bool_bit1;
  bool bool_bit1not = ~bool_bit1;

  cout << " [bool] bit1 = "    << bool_bit1 << endl;
  cout << " [bool] data = "    << bool_data << endl;
  cout << " [bool] ~bit1 = "   << ~bool_bit1 << endl;
  cout << " [bool] bit1not = " << bool_bit1not << endl;

  cout << "" << endl;
  sc_uint<1> uint_bit1 = 0;
  int uint_data = ~uint_bit1;
  sc_uint<1> uint_bit1not = ~uint_bit1;

  cout << " [sc_uint<1>] bit1 = "    << uint_bit1 << endl;
  cout << " [sc_uint<1>] data = "    << uint_data << endl;
  cout << " [sc_uint<1>] ~bit1 = "   << ~uint_bit1 << endl;
  cout << " [sc_uint<1>] bit1not = " << uint_bit1not << endl;

  cout << "" << endl;
  sc_biguint<1> buint_bit1 = 0;
  sc_biguint<1> buint_data = (~buint_bit1);
  sc_biguint<1> buint_bit1not = ~buint_bit1;

  cout << " [sc_biguint<1>] bit1 = "    << buint_bit1 << endl;
  cout << " [sc_biguint<1>] data = "    << buint_data.to_int64() << endl;
  cout << " [sc_biguint<1>] ~bit1 = "   << ~buint_bit1 << endl;
  cout << " [sc_biguint<1>] bit1not = " << buint_bit1not << endl;

  return 0;
}
  • 実行結果
$> ./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>の結果だけ正しくなっているというわけです。