namespace internal

// enums

enum RAMType

// unions

template <typename MType>
union f_cast

template <>
union f_cast <ap_uint <64>>

template <>
union f_cast <double>

template <>
union f_cast <ap_uint <32>>

template <>
union f_cast <ap_uint <8>>

template <>
union f_cast <float>

// classes

template <typename MType>
class AdditionLatency

template <>
class AdditionLatency <float>

template <>
class AdditionLatency <double>

template <>
class ExpLatency <double>

template <>
class ExpLatency <float>

template <typename MType>
class ExpLatency

class MT19937

template <>
class MultiplyLatency <double>

template <typename MType>
class MultiplyLatency

template <>
class MultiplyLatency <float>

template <
    typename MType,
    int D,
    int K,
    int KAMax,
    int KBMax,
    MType(*)(MType op1, MType op2) funcA,
    void(*)(MType &reg, MType op) funcB,
    MType(*)(MType op) funcC,
    RAMType RAMBuff
    >
class ll

template <
    typename MType,
    int K
    >
class pickMaxProcess

template <
    typename MType,
    int K,
    int KMax,
    void(*)(MType &reg, MType op) B,
    int Latency,
    RAMType RAMSum
    >
class s_aggr

template <
    int N,
    int _Depth,
    typename MType,
    typename TagType,
    RAMType RAMScaleBuff,
    RAMType RAMScaleFactor
    >
class scalingProcess

template <
    typename MType,
    int D,
    int DMax,
    int K,
    int KMax,
    MType(*)(MType op1, MType op2) A,
    void(*)(MType &reg, MType op) B,
    MType(*)(MType op) C,
    int Latency,
    RAMType RAMWeight
    >
class sl

template <
    typename MType,
    int D,
    int DMax,
    int K,
    int KMax,
    MType(*)(MType op1, MType op2) A,
    void(*)(MType &reg, MType op) B,
    MType(*)(MType op) C,
    int Latency,
    RAMType RAMWeight,
    RAMType RAMIntercept
    >
class sl2

template <
    typename MType,
    int K,
    int KMax,
    void(*)(MType &reg, MType op) func,
    int Latency
    >
class sl3

template <
    int _WAxi,
    int _WData
    >
class splitTag

template <
    typename MType,
    int D,
    MType(*)(MType op1, MType op2) A,
    void(*)(MType &reg, MType op) B,
    MType(*)(MType op) C,
    int Latency
    >
class ss

template <
    int _WAxi,
    int _WData,
    int _BurstLen,
    typename MType
    >
class tableLoader

template <
    int _WAxi,
    int _WData,
    int _BurstLen,
    typename MType
    >
class tableRandomLoader

template <
    int _WAxi,
    int _WData,
    int _BurstLen,
    typename MType,
    typename TagType
    >
class tagTableLoader

template <
    int _WAxi,
    int _WData,
    int _BurstLen,
    typename MType,
    typename TagType
    >
class tagTableRandomLoader

template <
    int W,
    int N,
    int _BurstLen
    >
class tupleRandomLoader