Intel HE Acceleration Library for FPGAs
Intel Homomorphic Encryption Acceleration Library for FPGAs, accelerating the modular arithmetic operations used in homomorphic encryption on Intel FPGAs.
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Classes | Enumerations | Functions | Variables
intel::hexl::fpga Namespace Reference

Classes

struct  moduli_info_t
 Struct moduli_info_t. More...
 
struct  KeySwitch_modulus_t
 Struct KeySwitch_moduli_t. More...
 
struct  KeySwitch_invn_t
 Struct KeySwitch_invn_t. More...
 
struct  __attribute__
 Struct DyadmultKeys1_t. More...
 
struct  Object
 Struct Object. More...
 
struct  Object_NTT
 Struct Object NTT Stores the Number Theoretic Transform parameters. More...
 
struct  Object_INTT
 Struct Object INTT Stores the Inverse Number Theoretic Transform parameters. More...
 
struct  Object_DyadicMultiply
 struct Object_DyadicMultiply Stores the parameters for the multiplication More...
 
struct  Object_KeySwitch
 struct Object_KeySwitch Stores the parameters for the keyswitch More...
 
class  Buffer
 Struct Buffer Structure containing information for the polynomial operations. More...
 
struct  FPGAObject
 Parent Struct FPGAObject stores the blob of objects to be transfered to the FPGA. More...
 
struct  FPGAObject_NTT
 Struct FPGAObject_NTT stores the NTT blob of objects to be transfered to the FPGA. More...
 
struct  FPGAObject_INTT
 Struct FPGAObject_INTT stores the INTT blob of objects to be transfered to the FPGA. More...
 
struct  FPGAObject_DyadicMultiply
 Struct FPGAObject_DyadicMultiply Stores the multiplication blob of objects to be transfered to the FPGA. More...
 
struct  FPGAObject_KeySwitch
 Struct FPGAObject_KeySwitch Stores the keyswitch blob of objects to be transfered to the FPGA. More...
 
struct  KeySwitchMemKeys
 
class  Device
 Class Device. More...
 
class  DevicePool
 Class DevicePool. More...
 
class  MultiplyFactor
 
class  StackTrace
 Class StackTrace Allows the investigation of the traces dump Dumps the traces. More...
 

Enumerations

enum  KeySwitch_Kernels { KEYSWITCH_LOAD, KEYSWITCH_STORE, KEYSWITCH_NUM_KERNELS }
 
enum  kernel_t {
  NONE, kernel_t::DYADIC_MULTIPLY, kernel_t::NTT, kernel_t::INTT,
  kernel_t::KEYSWITCH, kernel_t::DYADIC_MULTIPLY_KEYSWITCH
}
 
enum  DEV_TYPE { NONE = 0, NONE, EMU, FPGA }
 enum DEV_TYPE Lists the available device mode: emulation mode, FPGA More...
 

Functions

void set_worksize_DyadicMultiply (uint64_t ws)
 function set_worksize_DyadicMultiply More...
 
void DyadicMultiply (uint64_t *results, const uint64_t *operand1, const uint64_t *operand2, uint64_t n, const uint64_t *moduli, uint64_t n_moduli)
 function DyadicMultiply Implements the multiplication of two ciphertexts More...
 
bool DyadicMultiplyCompleted ()
 DyadicMultiplyCompleted Executed after the multiplication to wrap up the operation More...
 
void set_worksize_DyadicMultiply_int (uint64_t n)
 set_worksize_DyadicMultiply_int Sets the worksize for the multiplication More...
 
void DyadicMultiply_int (uint64_t *results, const uint64_t *operand1, const uint64_t *operand2, uint64_t n, const uint64_t *moduli, uint64_t n_moduli)
 DyadicMultiply_int Internal implementation of the DyadicMultiply function call More...
 
bool DyadicMultiplyCompleted_int ()
 DyadicMultiplyCompleted_int Internal implementation of the DyadicMultiplyCompleted function. Called after completion of the multiplication operation More...
 
void attach_fpga_pooling ()
 attach_fpga_pooling Attach a device to this thread More...
 
void detach_fpga_pooling ()
 detach_fpga_pooling Detach a device from this thread More...
 
void acquire_FPGA_resources ()
 acquire_FPGA_resources Called at the beginning of the workload to acquire the usage of an FPGA More...
 
void release_FPGA_resources ()
 release_FPGA_resources Called at the end of the workload to release the FPGA More...
 
void set_worksize_INTT (uint64_t ws)
 set_worksize_INTT Sets the work size of the INTT operation More...
 
void INTT (uint64_t *coeff_poly, const uint64_t *inv_root_of_unity_powers, const uint64_t *precon_inv_root_of_unity_powers, uint64_t coeff_modulus, uint64_t inv_n, uint64_t inv_n_w, uint64_t n)
 INTT Calls the Inverse Number Theoretic Transform More...
 
bool INTTCompleted ()
 INTTCompleted Called after the completion of the INTT operation More...
 
void set_worksize_INTT_int (uint64_t n)
 set_worksize_INTT_int Internal implementation. Sets the work size of the INTT operation More...
 
void INTT_int (uint64_t *coeff_poly, const uint64_t *inv_root_of_unity_powers, const uint64_t *precon_inv_root_of_unity_powers, uint64_t coeff_modulus, uint64_t inv_n, uint64_t inv_n_w, uint64_t n)
 INTT Calls the Inverse Number Theoretic Transform More...
 
bool INTTCompleted_int ()
 INTTCompleted_int Called after the completion of the INTT operation. Internal implementation. More...
 
void set_worksize_KeySwitch (uint64_t ws)
 Function set_worksize_KeySwitch Reserves software resources for the KeySwitch. More...
 
void KeySwitch (uint64_t *result, const uint64_t *t_target_iter_ptr, uint64_t n, uint64_t decomp_modulus_size, uint64_t key_modulus_size, uint64_t rns_modulus_size, uint64_t key_component_count, const uint64_t *moduli, const uint64_t **k_switch_keys, const uint64_t *modswitch_factors, const uint64_t *twiddle_factors=nullptr)
 Function KeySwitch Executes KeySwitch operation. More...
 
bool KeySwitchCompleted ()
 Function KeySwitchCompleted Executed after KeySwitch to sync up the outstanding KeySwitch tasks. More...
 
void set_worksize_KeySwitch_int (uint64_t ws)
 Function set_worksize_KeySwitch_int Reserves software resources for the KeySwitch. More...
 
void KeySwitch_int (uint64_t *result, const uint64_t *t_target_iter_ptr, uint64_t n, uint64_t decomp_modulus_size, uint64_t key_modulus_size, uint64_t rns_modulus_size, uint64_t key_component_count, const uint64_t *moduli, const uint64_t **k_switch_keys, const uint64_t *modswitch_factors, const uint64_t *twiddle_factors=nullptr)
 Function KeySwitch_int Executes KeySwitch operation. More...
 
bool KeySwitchCompleted_int ()
 Function KeySwitchCompleted_int Executed after KeySwitch to sync up the outstanding KeySwitch tasks. More...
 
void set_worksize_NTT (uint64_t ws)
 set_worksize_NTT Sets the work size for NTT More...
 
void NTT (uint64_t *coeff_poly, const uint64_t *root_of_unity_powers, const uint64_t *precon_root_of_unity_powers, uint64_t coeff_modulus, uint64_t n)
 NTT Calls the Number Theorectic Transform More...
 
bool NTTCompleted ()
 NTTCompleted Called after completion of the Number Theoretic Transform More...
 
void set_worksize_NTT_int (uint64_t n)
 set_worksize_NTT_int Sets the work size for NTT. Internal implementation. More...
 
void NTT_int (uint64_t *coeff_poly, const uint64_t *root_of_unity_powers, const uint64_t *precon_root_of_unity_powers, uint64_t coeff_modulus, uint64_t n)
 NTT_int Calls the Number Theorectic Transform. Internal implementation. More...
 
bool NTTCompleted_int ()
 NTTCompleted_int Called after completion of the Number Theoretic Transform. Internal implementation. More...
 
bool IsPowerOfTwo (uint64_t num)
 
uint64_t MSB (uint64_t modulus)
 
uint64_t Log2 (uint64_t x)
 
uint64_t MaximumValue (uint64_t bits)
 
uint128_t MultiplyUInt64 (uint64_t x, uint64_t y)
 
void MultiplyUInt64 (uint64_t x, uint64_t y, uint64_t *prod_hi, uint64_t *prod_lo)
 
template<int BitShift>
uint64_t MultiplyUInt64Hi (uint64_t x, uint64_t y)
 
uint64_t DivideUInt128UInt64Lo (uint64_t x1, uint64_t x0, uint64_t y)
 
template<int BitShift>
uint64_t MultiplyUIntModLazy (uint64_t x, uint64_t y_operand, uint64_t y_barrett_factor, uint64_t modulus)
 
template<int BitShift>
uint64_t MultiplyUIntModLazy (uint64_t x, uint64_t y, uint64_t modulus)
 
unsigned char AddUInt64 (uint64_t operand1, uint64_t operand2, uint64_t *result)
 
bool IsPrime (uint64_t n)
 
std::vector< uint64_t > GeneratePrimes (size_t num_primes, size_t bit_size, size_t ntt_size=1)
 
uint64_t BarrettReduce64 (uint64_t input, uint64_t modulus, uint64_t q_barr)
 
template<int InputModFactor>
uint64_t ReduceMod (uint64_t x, uint64_t modulus, const uint64_t *twice_modulus=nullptr, const uint64_t *four_times_modulus=nullptr)
 
uint64_t BarrettReduce128 (uint64_t input_hi, uint64_t input_lo, uint64_t modulus)
 
uint64_t ReverseBitsUInt (uint64_t x, uint64_t bits)
 
uint64_t InverseUIntMod (uint64_t a, uint64_t modulus)
 
uint64_t MultiplyUIntMod (uint64_t x, uint64_t y, uint64_t modulus)
 
uint64_t MultiplyMod (uint64_t x, uint64_t y, uint64_t y_precon, uint64_t modulus)
 
uint64_t AddUIntMod (uint64_t x, uint64_t y, uint64_t modulus)
 
uint64_t SubUIntMod (uint64_t x, uint64_t y, uint64_t modulus)
 
uint64_t PowMod (uint64_t base, uint64_t exp, uint64_t modulus)
 
bool IsPrimitiveRoot (uint64_t root, uint64_t degree, uint64_t modulus)
 
uint64_t GeneratePrimitiveRoot (uint64_t degree, uint64_t modulus)
 
uint64_t MinimalPrimitiveRoot (uint64_t degree, uint64_t modulus)
 
void ComputeRootOfUnityPowers (uint64_t m_q, uint64_t m_degree, uint64_t m_degree_bits, uint64_t m_w, uint64_t *inv_root_of_unity_powers, uint64_t *precon64_inv_root_of_unity_powers, uint64_t *root_of_unity_powers, uint64_t *precon64_root_of_unity_powers)
 

Variables

__extension__ typedef unsigned
__int128 
fpga_uint128_t
 
__extension__ typedef unsigned
__int128 
uint128_t
 

Enumeration Type Documentation

enum DEV_TYPE Lists the available device mode: emulation mode, FPGA

Enumerator
NONE 
NONE 
EMU 
FPGA 
Enumerator
NONE 
DYADIC_MULTIPLY 
NTT 
INTT 
KEYSWITCH 
DYADIC_MULTIPLY_KEYSWITCH 
Enumerator
KEYSWITCH_LOAD 
KEYSWITCH_STORE 
KEYSWITCH_NUM_KERNELS 

Function Documentation

void intel::hexl::fpga::acquire_FPGA_resources ( )

acquire_FPGA_resources Called at the beginning of the workload to acquire the usage of an FPGA

unsigned char intel::hexl::fpga::AddUInt64 ( uint64_t  operand1,
uint64_t  operand2,
uint64_t *  result 
)
inline
uint64_t intel::hexl::fpga::AddUIntMod ( uint64_t  x,
uint64_t  y,
uint64_t  modulus 
)
void intel::hexl::fpga::attach_fpga_pooling ( )

attach_fpga_pooling Attach a device to this thread

uint64_t intel::hexl::fpga::BarrettReduce128 ( uint64_t  input_hi,
uint64_t  input_lo,
uint64_t  modulus 
)
inline
uint64_t intel::hexl::fpga::BarrettReduce64 ( uint64_t  input,
uint64_t  modulus,
uint64_t  q_barr 
)
void intel::hexl::fpga::ComputeRootOfUnityPowers ( uint64_t  m_q,
uint64_t  m_degree,
uint64_t  m_degree_bits,
uint64_t  m_w,
uint64_t *  inv_root_of_unity_powers,
uint64_t *  precon64_inv_root_of_unity_powers,
uint64_t *  root_of_unity_powers,
uint64_t *  precon64_root_of_unity_powers 
)
void intel::hexl::fpga::detach_fpga_pooling ( )

detach_fpga_pooling Detach a device from this thread

uint64_t intel::hexl::fpga::DivideUInt128UInt64Lo ( uint64_t  x1,
uint64_t  x0,
uint64_t  y 
)
inline
void intel::hexl::fpga::DyadicMultiply ( uint64_t *  results,
const uint64_t *  operand1,
const uint64_t *  operand2,
uint64_t  n,
const uint64_t *  moduli,
uint64_t  n_moduli 
)

function DyadicMultiply Implements the multiplication of two ciphertexts

Parameters
[out]resultsstores the result of the multiplication
[in]operand1vector of polynomial coefficients
[in]operand2vector of polynomial coefficients
[in]npolynomial size
[in]modulivector of modulus
[in]n_modulinumber of modulus in the vector of modulus
void intel::hexl::fpga::DyadicMultiply_int ( uint64_t *  results,
const uint64_t *  operand1,
const uint64_t *  operand2,
uint64_t  n,
const uint64_t *  moduli,
uint64_t  n_moduli 
)

DyadicMultiply_int Internal implementation of the DyadicMultiply function call

Parameters
[out]resultsstores the output of the multiplication
[in]operand1vector of polynomial coefficients
[in]operand2vector of polynomial coefficients
[in]npolynomial size
[in]modulivector of coefficient modulus
[in]n_modulinumber of modulus in the vector of modulus
bool intel::hexl::fpga::DyadicMultiplyCompleted ( )

DyadicMultiplyCompleted Executed after the multiplication to wrap up the operation

bool intel::hexl::fpga::DyadicMultiplyCompleted_int ( )

DyadicMultiplyCompleted_int Internal implementation of the DyadicMultiplyCompleted function. Called after completion of the multiplication operation

std::vector<uint64_t> intel::hexl::fpga::GeneratePrimes ( size_t  num_primes,
size_t  bit_size,
size_t  ntt_size = 1 
)
uint64_t intel::hexl::fpga::GeneratePrimitiveRoot ( uint64_t  degree,
uint64_t  modulus 
)
void intel::hexl::fpga::INTT ( uint64_t *  coeff_poly,
const uint64_t *  inv_root_of_unity_powers,
const uint64_t *  precon_inv_root_of_unity_powers,
uint64_t  coeff_modulus,
uint64_t  inv_n,
uint64_t  inv_n_w,
uint64_t  n 
)

INTT Calls the Inverse Number Theoretic Transform

Parameters
[out]coef_polyvector of polynomial coefficients
[in]coef_polyvector of polynomial coefficients
[in]inv_root_of_unity_powersvector of twiddle factors
[in]precon_inv_root_of_unity_powersvector of twiddle factors for the constant
[in]coeff_moduluscoefficient modulus
[in]inv_nnormalization factor
[in]inv_n_wnormalization factor for the constant
[in]npolynomial size
void intel::hexl::fpga::INTT_int ( uint64_t *  coeff_poly,
const uint64_t *  inv_root_of_unity_powers,
const uint64_t *  precon_inv_root_of_unity_powers,
uint64_t  coeff_modulus,
uint64_t  inv_n,
uint64_t  inv_n_w,
uint64_t  n 
)

INTT Calls the Inverse Number Theoretic Transform

Parameters
[out]coef_polyvector of polynomial coefficients
[in]coef_polyvector of polynomial coefficients
[in]inv_root_of_unity_powersvector of twiddle factors
[in]precon_inv_root_of_unity_powersvector of twiddle factors for the constant
[in]coeff_moduluscoefficient modulus
[in]inv_nnormalization factor
[in]inv_n_wnormalization factor for the constant
[in]npolynomial size
bool intel::hexl::fpga::INTTCompleted ( )

INTTCompleted Called after the completion of the INTT operation

bool intel::hexl::fpga::INTTCompleted_int ( )

INTTCompleted_int Called after the completion of the INTT operation. Internal implementation.

uint64_t intel::hexl::fpga::InverseUIntMod ( uint64_t  a,
uint64_t  modulus 
)
bool intel::hexl::fpga::IsPowerOfTwo ( uint64_t  num)
inline
bool intel::hexl::fpga::IsPrime ( uint64_t  n)
bool intel::hexl::fpga::IsPrimitiveRoot ( uint64_t  root,
uint64_t  degree,
uint64_t  modulus 
)
void intel::hexl::fpga::KeySwitch ( uint64_t *  result,
const uint64_t *  t_target_iter_ptr,
uint64_t  n,
uint64_t  decomp_modulus_size,
uint64_t  key_modulus_size,
uint64_t  rns_modulus_size,
uint64_t  key_component_count,
const uint64_t *  moduli,
const uint64_t **  k_switch_keys,
const uint64_t *  modswitch_factors,
const uint64_t *  twiddle_factors = nullptr 
)

Function KeySwitch Executes KeySwitch operation.

Parameters
[out]resultsstores the keyswitch results
[in]t_target_iter_ptrstores the input ciphertext data
[in]nstores polynomial size
[in]decomp_modulus_sizestores modulus size
[in]key_modulus_sizestores key modulus size
[in]rns_modulus_sizestores the rns modulus size
[in]key_component_sizestores the key component size
[in]modulistores the moduli
[in]k_switch_keysstores the keys for keyswitch operation
[in]modswitch_factorsstores the factors for modular switch
[in]twiddle_factorsstores the twiddle factors
void intel::hexl::fpga::KeySwitch_int ( uint64_t *  result,
const uint64_t *  t_target_iter_ptr,
uint64_t  n,
uint64_t  decomp_modulus_size,
uint64_t  key_modulus_size,
uint64_t  rns_modulus_size,
uint64_t  key_component_count,
const uint64_t *  moduli,
const uint64_t **  k_switch_keys,
const uint64_t *  modswitch_factors,
const uint64_t *  twiddle_factors = nullptr 
)

Function KeySwitch_int Executes KeySwitch operation.

Parameters
[out]resultsstores the keyswitch results
[in]t_target_iter_ptrstores the input ciphertext data
[in]nstores polynomial size
[in]decomp_modulus_sizestores modulus size
[in]key_modulus_sizestores key modulus size
[in]rns_modulus_sizestores the rns modulus size
[in]key_component_sizestores the key component size
[in]modulistores the moduli
[in]k_switch_keysstores the keys for keyswitch operation
[in]modswitch_factorsstores the factors for modular switch
[in]twiddle_factorsstores the twiddle factors
bool intel::hexl::fpga::KeySwitchCompleted ( )

Function KeySwitchCompleted Executed after KeySwitch to sync up the outstanding KeySwitch tasks.

bool intel::hexl::fpga::KeySwitchCompleted_int ( )

Function KeySwitchCompleted_int Executed after KeySwitch to sync up the outstanding KeySwitch tasks.

uint64_t intel::hexl::fpga::Log2 ( uint64_t  x)
inline
uint64_t intel::hexl::fpga::MaximumValue ( uint64_t  bits)
inline
uint64_t intel::hexl::fpga::MinimalPrimitiveRoot ( uint64_t  degree,
uint64_t  modulus 
)
uint64_t intel::hexl::fpga::MSB ( uint64_t  modulus)
inline
uint64_t intel::hexl::fpga::MultiplyMod ( uint64_t  x,
uint64_t  y,
uint64_t  y_precon,
uint64_t  modulus 
)
uint128_t intel::hexl::fpga::MultiplyUInt64 ( uint64_t  x,
uint64_t  y 
)
inline
void intel::hexl::fpga::MultiplyUInt64 ( uint64_t  x,
uint64_t  y,
uint64_t *  prod_hi,
uint64_t *  prod_lo 
)
inline
template<int BitShift>
uint64_t intel::hexl::fpga::MultiplyUInt64Hi ( uint64_t  x,
uint64_t  y 
)
inline
uint64_t intel::hexl::fpga::MultiplyUIntMod ( uint64_t  x,
uint64_t  y,
uint64_t  modulus 
)
template<int BitShift>
uint64_t intel::hexl::fpga::MultiplyUIntModLazy ( uint64_t  x,
uint64_t  y_operand,
uint64_t  y_barrett_factor,
uint64_t  modulus 
)
inline
template<int BitShift>
uint64_t intel::hexl::fpga::MultiplyUIntModLazy ( uint64_t  x,
uint64_t  y,
uint64_t  modulus 
)
inline
void intel::hexl::fpga::NTT ( uint64_t *  coeff_poly,
const uint64_t *  root_of_unity_powers,
const uint64_t *  precon_root_of_unity_powers,
uint64_t  coeff_modulus,
uint64_t  n 
)

NTT Calls the Number Theorectic Transform

Parameters
[in]coeff_polyvector of polynomial coefficients
[out]coeff_polyvector of polynomial coefficients
[in]root_of_unity_powersvector of twiddle factors
[in]precon_root_of_unity_powervector of twiddle factors for the constant
[in]coeff_modulusstores the coefficient modulus
[in]nstores the polynomial size
void intel::hexl::fpga::NTT_int ( uint64_t *  coeff_poly,
const uint64_t *  root_of_unity_powers,
const uint64_t *  precon_root_of_unity_powers,
uint64_t  coeff_modulus,
uint64_t  n 
)

NTT_int Calls the Number Theorectic Transform. Internal implementation.

Parameters
[in]coeff_polyvector of polynomial coefficients
[out]coeff_polyvector of polynomial coefficients
[in]root_of_unity_powersvector of twiddle factors
[in]precon_root_of_unity_powervector of twiddle factors for the constant
[in]coeff_modulusstores the coefficient modulus
[in]nstores the polynomial size
bool intel::hexl::fpga::NTTCompleted ( )

NTTCompleted Called after completion of the Number Theoretic Transform

bool intel::hexl::fpga::NTTCompleted_int ( )

NTTCompleted_int Called after completion of the Number Theoretic Transform. Internal implementation.

uint64_t intel::hexl::fpga::PowMod ( uint64_t  base,
uint64_t  exp,
uint64_t  modulus 
)
template<int InputModFactor>
uint64_t intel::hexl::fpga::ReduceMod ( uint64_t  x,
uint64_t  modulus,
const uint64_t *  twice_modulus = nullptr,
const uint64_t *  four_times_modulus = nullptr 
)
void intel::hexl::fpga::release_FPGA_resources ( )

release_FPGA_resources Called at the end of the workload to release the FPGA

uint64_t intel::hexl::fpga::ReverseBitsUInt ( uint64_t  x,
uint64_t  bits 
)
void intel::hexl::fpga::set_worksize_DyadicMultiply ( uint64_t  ws)

function set_worksize_DyadicMultiply

Parameters
[in]wswork size
void intel::hexl::fpga::set_worksize_DyadicMultiply_int ( uint64_t  n)

set_worksize_DyadicMultiply_int Sets the worksize for the multiplication

Parameters
[in]nwork size
void intel::hexl::fpga::set_worksize_INTT ( uint64_t  ws)

set_worksize_INTT Sets the work size of the INTT operation

void intel::hexl::fpga::set_worksize_INTT_int ( uint64_t  n)

set_worksize_INTT_int Internal implementation. Sets the work size of the INTT operation

void intel::hexl::fpga::set_worksize_KeySwitch ( uint64_t  ws)

Function set_worksize_KeySwitch Reserves software resources for the KeySwitch.

Parameters
wsinteger storing the worksize
void intel::hexl::fpga::set_worksize_KeySwitch_int ( uint64_t  ws)

Function set_worksize_KeySwitch_int Reserves software resources for the KeySwitch.

Parameters
wsinteger storing the worksize
void intel::hexl::fpga::set_worksize_NTT ( uint64_t  ws)

set_worksize_NTT Sets the work size for NTT

Parameters
[in]wsstores the worksize of the NTT
void intel::hexl::fpga::set_worksize_NTT_int ( uint64_t  n)

set_worksize_NTT_int Sets the work size for NTT. Internal implementation.

Parameters
[in]wsstores the worksize of the NTT
uint64_t intel::hexl::fpga::SubUIntMod ( uint64_t  x,
uint64_t  y,
uint64_t  modulus 
)

Variable Documentation

__extension__ typedef unsigned __int128 intel::hexl::fpga::fpga_uint128_t
__extension__ typedef unsigned __int128 intel::hexl::fpga::uint128_t