次のセクションでは、その他のクラス メソッド、演算子、およびデータ メンバーについて説明します。
ビット レベル演算
ap_[u]int
型変数に格納されている値に基づいて一般的なビット レベル演算を実行するために、次のメソッドが提供されています。
長さ
int ap_(u)int::length ()
ap_[u]int
変数の合計ビット数を表す整数値を返します。
連結
ap_concat_ref ap_(u)int::concat (ap_(u)int low)
ap_concat_ref ap_(u)int::operator , (ap_(u)int high, ap_(u)int low)
2 つの ap_[u]int
変数を連結します。返された値の幅はオペランドの幅の和です。
high および low の引数にはそれぞれ結果値の高位ビットまたは下位ビットが出力されます。concat()
メソッドの場合は下位ビットが出力されます。
オーバーロードされたカンマ演算子を使用するときはかっこが必要です。カンマ演算子バージョンが代入の LHS に現れることもあります。
ap_[u]int
型に明示的に型変換します。ap_uint<10> Rslt;
ap_int<3> Val1 = -3;
ap_int<7> Val2 = 54;
Rslt = (Val2, Val1); // Yields: 0x1B5
Rslt = Val1.concat(Val2); // Yields: 0x2B6
(Val1, Val2) = 0xAB; // Yields: Val1 == 1, Val2 == 43
ビット選択
ap_bit_ref ap_(u)int::operator [] (int bit)
任意精度の整数値から 1 ビットを選択し、それを返します。
戻り値は、ap_[u]int
変数の対応するビットをセットまたはクリアできる参照値です。
ビット引数は int
値にする必要があります。選択するビットの指数を指定します。最下位ビットの指数は 0 です。最大指数はこの ap_[u]int
のビット幅から 1 を引いた値になります。
ap_bit_ref
はビットで指定されているこの ap_[u]int
インスタンスの 1 ビットへの参照を表しています。
範囲選択
ap_range_ref ap_(u)int::range (unsigned Hi, unsigned Lo)
ap_range_ref ap_(u)int::operator () (unsigned Hi, unsigned Lo)
引数で指定されるビットの範囲で表される値を返します。
引数 Hi
は範囲内の最上位ビット (MSB)、Lo
は最下位ビット (LSB) を指定します。
ソース変数の LSB は 0 の位置にあります。引数 Hi
の値が Lo
の値より小さい場合、ビットは逆順で返されます。
ap_uint<4> Rslt;
ap_uint<8> Val1 = 0x5f;
ap_uint<8> Val2 = 0xaa;
Rslt = Val1.range(3, 0); // Yields: 0xF
Val1(3,0) = Val2(3, 0); // Yields: 0x5A
Val1(3,0) = Val2(4, 1); // Yields: 0x55
Rslt = Val1.range(4, 7); // Yields: 0xA; bit-reversed!
ap_(u)int
オブジェクトではなく、演算子はありませんが、割り当てには使用できます。範囲選択が ap_(u)int
メソッドを使用する連鎖式になるようにするには、次のように明示的なコンストラクターを追加します。ap_uint<32> v = 0x8fff0000;
bool r = ap_uint<16>(v.range(23, 8)).xor_reduce();
and_reduce
bool ap_(u)int::and_reduce ()
- この
ap_(u)int
のすべてのビットにAND
演算を適用します。 - 結果の単一ビットを返します。
- この値を
-1
(すべて 1) と比較することと同じで、一致する場合はtrue
が返され、一致しない場合はfalse
が返されます。
or_reduce
bool ap_(u)int::or_reduce ()
- この
ap_(u)int
のすべてのビットにOR
演算を適用します。 - 結果の単一ビットを返します。
- この値を
0
(すべて 0) と比較することと同じで、一致する場合はfalse
が返され、一致しない場合はtrue
が返されます。
xor_reduce
bool ap_(u)int::xor_reduce ()
- この
ap_int
のすべてのビットにXOR
演算を適用します。 - 結果の単一ビットを返します。
- この値の
1
のビット数を数えて、偶数の場合はfalse
、奇数の場合はtrue
を返すことと同じです。
nand_reduce
bool ap_(u)int::nand_reduce ()
- この
ap_int
のすべてのビットにNAND
演算を適用します。 - 結果の単一ビットを返します。
- この値を
-1
(すべて 1) と比較することと同じで、一致する場合はfalse
が返され、一致しない場合はtrue
が返されます。
nor_reduce
bool ap_int::nor_reduce ()
- この
ap_int
のすべてのビットにNOR
演算を適用します。 - 結果の単一ビットを返します。
- この値を
0
(すべて 0) と比較することと同じで、一致する場合はtrue
が返され、一致しない場合はfalse
が返されます。
xnor_reduce
bool ap_(u)int::xnor_reduce ()
- この
ap_(u)int
のすべてのビットにXNOR
演算を適用します。 - 結果の単一ビットを返します。
- この値の
1
のビット数を数えて、偶数の場合はtrue
、奇数の場合はfalse
を返すことと同じです。
ビット リダクション メソッドの例
ap_uint<8> Val = 0xaa;
bool t = Val.and_reduce(); // Yields: false
t = Val.or_reduce(); // Yields: true
t = Val.xor_reduce(); // Yields: false
t = Val.nand_reduce(); // Yields: true
t = Val.nor_reduce(); // Yields: false
t = Val.xnor_reduce(); // Yields: true
ビットの逆転
void ap_(u)int::reverse ()
ap_[u]int
インスタンスの内容を逆転します。
- LSB は MSB になります。
- MSB は LSB になります。
逆転メソッドの例
ap_uint<8> Val = 0x12;
Val.reverse(); // Yields: 0x48
ビット値のテスト
bool ap_(u)int::test (unsigned i)
ap_(u)int
インスタンスの指定ビットが 1
であるかどうかをチェックします。
1 の場合は true、それ以外の場合は false を返します。
テスト メソッドの例
ap_uint<8> Val = 0x12;
bool t = Val.test(5); // Yields: true
ビット値の設定
void ap_(u)int::set (unsigned i, bool v)
void ap_(u)int::set_bit (unsigned i, bool v)
ap_(u)int
インスタンスの指定ビットを整数 V
の値に設定します。
ビットの設定 (1)
void ap_(u)int::set (unsigned i)
ap_(u)int
インスタンスの指定ビットを 1
に設定します。
ビットのクリア (0)
void ap_(u)int:: clear(unsigned i)
ap_(u)int
インスタンスの指定ビットを 0
に設定します。
ビットの反転
void ap_(u)int:: invert(unsigned i)
ap_(u)int
インスタンスの関数引数で指定したビットを反転します。指定したビットは、元の値が 0
の場合は 1
になり、0 の場合は 1 になります。
ビットの設定、クリア、反転メソッドの例:
ap_uint<8> Val = 0x12;
Val.set(0, 1); // Yields: 0x13
Val.set_bit(4, false); // Yields: 0x03
Val.set(7); // Yields: 0x83
Val.clear(1); // Yields: 0x81
Val.invert(4); // Yields: 0x91
右に回転
void ap_(u)int:: rrotate(unsigned n)
ap_(u)int
インスタンスを n 桁右に回転します。
左に回転
void ap_(u)int:: lrotate(unsigned n)
ap_(u)int
インスタンスを n 桁左に回転します。
ap_uint<8> Val = 0x12;
Val.rrotate(3); // Yields: 0x42
Val.lrotate(6); // Yields: 0x90
ビット単位 NOT (bitwise_not)
void ap_(u)int:: b_not()
-
ap_(u)int
インスタンスのすべてのビットの補数を求めます。
ap_uint<8> Val = 0x12;
Val.b_not(); // Yields: 0xED
ビット単位 NOT の例
符号のテスト
bool ap_int:: sign()
-
ap_(u)int
インスタンスが負の値であるかどうかをチェックします。 - 負の値の場合は
true
が返されます。 - 正の値の場合は
false
が返されます。
明示的な変換メソッド
C/C++ の (u)int 型
int ap_(u)int::to_int ()
unsigned ap_(u)int::to_uint ()
-
ap_[u]int
に含まれる値のネイティブ C/C++ (ほとんどのシステムで 32 ビット) 整数を返します。 - 値が
[unsigned] int
で表示されるよりも大きい場合は、切り捨てが実行されます。
C/C++ 64 ビット (u)int 型
long long ap_(u)int::to_int64 ()
unsigned long long ap_(u)int::to_uint64 ()
-
ap_[u]int
に含まれる値のネイティブ C/C++ の 64 ビットの整数を返します。 - 値が
[unsigned] int
で表示されるよりも大きい場合は、切り捨てが実行されます。
C/C++ の double 型
double ap_(u)int::to_double ()
-
ap_[u]int
に含まれるネイティブ C/C++ のdouble
の 64 ビット浮動小数点表記を返します。 -
ap_[u]int
が 53 ビット (double
の仮数のビット数) より大きい場合、結果のdouble
に正確な値が含まれないことがあります。
ap_[u]int
をほかのデータ型に変換するには、AMDでは C 形式のキャストを使用する代わりに、メンバー関数を明示的に呼び出すことをお勧めします。sizeof
標準 C++ sizeof()
関数は、ap_[u]int
やその他のクラスまたはオブジェクトのインスタンスと一緒には使用できません。ap_int<>
型はクラスで、sizeof
からはそのクラスまたはインスタンス オブジェクトで使用されたストレージが返されます。sizeof(ap_int<N>)
からは、常に使用されたバイト数が返されます。次に例を示します。
sizeof(ap_int<127>)=16
sizeof(ap_int<128>)=16
sizeof(ap_int<129>)=24
sizeof(ap_int<130>)=24
コンパイル時のデータ型属性へのアクセス
ap_[u]int<>
型には、変数のサイズをコンパイル時に決定できるようにするスタティック メンバーが含まれます。このデータ型に含まれる static const メンバーの width
により、自動的にデータ型の幅が割り当てられます。
static const int width = _AP_W;
既存の ap_[u]int<>
型を抽出するのに width
データ メンバーを使用すると、コンパイル時に別の ap_[u]int<>
型を作成できます。次の例に、変数 Res
のサイズを変数 Val1
と Val2
変数よりも 1 ビット大きく定義する方法を示します。
// Definition of basic data type
#define INPUT_DATA_WIDTH 8
typedef ap_int<INPUT_DATA_WIDTH> data_t;
// Definition of variables
data_t Val1, Val2;
// Res is automatically sized at compile-time to be 1-bit greater than data type
data_t
ap_int<data_t::width+1> Res = Val1 + Val2;
これにより、data_t
の INPUT_DATA_WIDTH の値がアップデートされた場合でも、Vitis HLS で加算によるビット増加が正しく認識されるようになります。