Module Support Library

Fixed-width saturating counter

template<typename val_type, val_type MAXVAL, val_type MINVAL>
class base_fwcounter

A fixed-width saturating counter. All arithmetic operations on this value are clamped between the maximum and minimum values.

Template Parameters:
  • val_type – The underlying representation of the value.

  • MAXVAL – The maximum to saturate at.

  • MINVAL – The minimum to saturate at.

Public Functions

base_fwcounter<val_type, MAXVAL, MINVAL> &operator++()

Increment the value, saturating at the maximum value.

base_fwcounter<val_type, MAXVAL, MINVAL> &operator--()

Decrement the value, saturating at the minimum value.

base_fwcounter<val_type, MAXVAL, MINVAL> &operator+=(base_fwcounter<val_type, MAXVAL, MINVAL>)

Add the other operand to the wrapped value, saturating at the minimum and maximum.

base_fwcounter<val_type, MAXVAL, MINVAL> &operator-=(base_fwcounter<val_type, MAXVAL, MINVAL>)

Subtract the other operand from the wrapped value, saturating at the minimum and maximum.

base_fwcounter<val_type, MAXVAL, MINVAL> &operator*=(base_fwcounter<val_type, MAXVAL, MINVAL>)

Multiply the wrapped value by the other operand, saturating at the minimum and maximum.

base_fwcounter<val_type, MAXVAL, MINVAL> &operator/=(base_fwcounter<val_type, MAXVAL, MINVAL>)

Divide the wrapped value by the other operand, saturating at the minimum and maximum.

inline bool is_max() const

Detect whether the counter is saturated at its maximum.

inline bool is_min() const

Detect whether the counter is saturated at its minimum.

inline val_type value() const

Unpack the wrapped value.

template<std::size_t WIDTH>
using champsim::msl::fwcounter = base_fwcounter<signed long long int, (1 << WIDTH) - 1, 0>
template<std::size_t WIDTH>
using champsim::msl::sfwcounter = base_fwcounter<signed long long int, (1 << (WIDTH - 1)) - 1, -(1 << (WIDTH - 1))>

Functions for bit operations

template<typename T>
constexpr auto champsim::msl::lg2(T n)

Compute the base-2 logarithm of an integer.

template<typename T>
constexpr T champsim::msl::next_pow2(T n)

Compute the smallest power of 2 not less than the given integer.

template<typename T>
constexpr bool champsim::msl::is_power_of_2(T n)

A backport of std::has_single_bit().

constexpr long long champsim::msl::ipow(long long base, unsigned exp)

Compute an integer power. This function may overflow very easily. Use only for small bases or very small exponents.

constexpr uint64_t champsim::msl::bitmask(champsim::data::bits begin, champsim::data::bits end)

Produce a mask that can be used in a bitwise-and operation to select particular bits of a number.

0xffff & bitmask(8_b,4_b) == 0xf0;

If end is not specified, it is defaulted to 0, that is, the least-significant bit.

Note

This should not be used as a mask generator for address types. Use champsim::address_slice instead.

Parameters:
  • begin – The most-significant bit of the mask, not inclusive.

  • end – The least-significant bit of the mask, inclusive.

constexpr uint64_t champsim::msl::bitmask(champsim::data::bits begin)

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

constexpr uint64_t champsim::msl::bitmask(std::size_t begin, std::size_t end = 0)

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

Deprecated:

Users should prefer the overload with champsim::data::bits parameters.

template<typename T>
constexpr auto champsim::msl::splice_bits(T upper, T lower, champsim::data::bits bits_upper, champsim::data::bits bits_lower)

Join two values, selecting some bits from one value and some bits from another.

splice_bits(0xaaaa, 0xbbbb, 8_b, 4_b) == 0xaaba;

If end is not specified, it is defaulted to 0, that is, the least-significant bit.

Note

This is an implementation detail of champsim::splice(), which should be preferred for address types. This function is provided for general use.

Parameters:
  • upper – The operand from which to take the not-selected bits.

  • lower – The operand from which to take the selected bits.

  • bits_upper – The most-significant bit of the mask, not inclusive.

  • bits_lower – The least-significant bit of the mask, inclusive.

template<typename T>
constexpr auto champsim::msl::splice_bits(T upper, T lower, champsim::data::bits bits)

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

template<typename T>
constexpr auto champsim::msl::splice_bits(T upper, T lower, std::size_t bits_upper, std::size_t bits_lower)

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

Deprecated:

Users should prefer the overload with champsim::data::bits parameters.

template<typename T>
constexpr auto champsim::msl::splice_bits(T upper, T lower, std::size_t bits)

This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.

Deprecated:

Users should prefer the overload with champsim::data::bits parameters.