The class constructor and assignment operator overloads, allows initialization of
and assignment to ap_[u]int<>
variables using
standard C/C++ integer literals.
This method of assigning values to ap_[u]int<>
variables is subject
to the limitations of C++ and the system upon
which the software will run. This typically leads
to a 64-bit limit on integer literals (for
example, for those LL
or ULL
suffixes).
To allow assignment of values wider than 64-bits, the ap_[u]int<>
classes provide
constructors that allow initialization from a
string of arbitrary length (less than or equal to
the width of the variable).
By default, the string provided is interpreted as a hexadecimal value as long as it contains only valid hexadecimal digits (that is, 0-9 and a-f). To assign a value from such a string, an explicit C++ style cast of the string to the appropriate type must be made.
Following are examples of initialization and assignments, including for values greater than 64-bit, are:
ap_int<42> a_42b_var(-1424692392255LL); // long long decimal format
a_42b_var = 0x14BB648B13FLL; // hexadecimal format
a_42b_var = -1; // negative int literal sign-extended to full width
ap_uint<96> wide_var(“76543210fedcba9876543210”, 16); // Greater than 64-bit
wide_var = ap_int<96>(“0123456789abcdef01234567”, 16);
ap_uint<N> a ={0}
.The ap_[u]<>
constructor may be explicitly
instructed to interpret the string as representing the number in radix
2, 8, 10, or 16 formats. This is accomplished by adding the appropriate
radix value as a second parameter to the constructor call.
A compilation error occurs if the string literal contains any characters that are invalid as digits for the radix specified.
The following examples use different radix formats:
ap_int<6> a_6bit_var(“101010”, 2); // 42d in binary format
a_6bit_var = ap_int<6>(“40”, 8); // 32d in octal format
a_6bit_var = ap_int<6>(“55”, 10); // decimal format
a_6bit_var = ap_int<6>(“2A”, 16); // 42d in hexadecimal format
a_6bit_var = ap_int<6>(“42”, 2); // COMPILE-TIME ERROR! “42” is not binary
The radix of the number encoded in the string can also be inferred by
the constructor, when it is prefixed with a zero (0
)
followed by one of the following characters: “b
”,
“o
” or “x
”.
The prefixes “0b
”, “0o
”
and “0x
” correspond to binary, octal
and hexadecimal formats respectively.
The following examples use alternate initializer string formats:
ap_int<6> a_6bit_var(“0b101010”, 2); // 42d in binary format
a_6bit_var = ap_int<6>(“0o40”, 8); // 32d in octal format
a_6bit_var = ap_int<6>(“0x2A”, 16); // 42d in hexidecimal format
a_6bit_var = ap_int<6>(“0b42”, 2); // COMPILE-TIME ERROR! “42” is not binary
If the bit-width is greater than 53-bits, the ap_[u]int<>
value must be
initialized with a string, for example:
ap_uint<72 Val(“2460508560057040035.375”);