Namespace math
This namespace is used to provide support functions for math operations.
Functions
template<pint Worig, Wnew> function sign_extend (int<Worig> x) : int<Wnew>;
This function takes an integer x
of width Worig
, and sign extends its most significant bit to return a result that has width Wnew
. It assumes that Wnew
is at least Worig.
template<pint Worig, Wnew> function zero_extend (int<Worig> x) : int<Wnew>;
This function takes an integer x
of width Worig
, and zero extends it to return a result that has width Wnew
. It assumes that Wnew
is at least Worig.
Namespace math::fxp
Functions
The math::fxp
namespace contains simple definitions for fixed-point arithmetic functions. Functions take two parameters A
and B
, and integers use the standard Q-format where the representation Q(A,B) corresponds to A digits for the integer part and B digits for the fractional part. The representation uses 2's complement for negative
numbers, so addition and subtraction are the same for signed and unsigned arithmetic.
template<pint A,B> function add (int<A+B> x, y) : int<A+B>;
This returns the sum of two Q(A,B) numbers x
and y
.
template<pint A,B> function sub (int<A+B> x, y) : int<A+B>;
This returns the difference of two Q(A,B) numbers x
and y
.
template<pint A,B> function multu (int<A+B> x, y) : int<A+B>;
This returns the unsigned product of two Q(A,B) numbers x
and y
.
template<pint A,B> function divu (int<A+B> x, y) : int<A+B>;
This returns the unsigned division result x/y
of two Q(A,B) numbers x
and y
.
template<pint A,B> function mults (int<A+B> x, y) : int<A+B>;
This returns the signed product of two Q(A,B) numbers x
and y
.
template<pint A,B> function divs (int<A+B> x, y) : int<A+B>;
This returns the signed division result x/y
of two Q(A,B) numbers x
and y
.
template<pint A,B> function uminus (int<A+B> x) : int<A+B>;
This returns the negated value of a signed Q(A,B) number x
.
template<pint A,B> function positive (int<A+B> x) : bool;
This is true if the fixed point number is positive (greater than zero), and false otherwise.
template<pint A,B> function negative (int<A+B> x) : bool;
This is true if the fixed point number is negative, and false otherwise
template<pint A,B> function le(int<A+B> x, y) : bool;
This tests if the value in x
is less than or equal to y
.
function conv_to_fxp(pint A, B; preal v) : pint;
This can be used to convert a real constant value into its fixed point representation. Note that since pint
values are 64-bit wide (max), this only works when A+B
is at most 64.