poulpy/spqlios/lib/test/testlib/ntt120_layouts.cpp
spqlios/lib/test/testlib/ntt120_layouts.cppRaw
1#include "ntt120_layouts.h"
2
3mod_q120x2::mod_q120x2() {}
4mod_q120x2::mod_q120x2(const mod_q120& a, const mod_q120& b) {
5 value[0] = a;
6 value[1] = b;
7}
8mod_q120x2::mod_q120x2(q120x2b* addr) {
9 uint64_t* p = (uint64_t*)addr;
10 value[0] = mod_q120::from_q120b(p);
11 value[1] = mod_q120::from_q120b(p + 4);
12}
13
14ntt120_vec_znx_dft_layout::ntt120_vec_znx_dft_layout(uint64_t n, uint64_t size)
15 : nn(n), //
16 size(size), //
17 data((VEC_ZNX_DFT*)alloc64(n * size * 4 * sizeof(uint64_t))) {}
18
19mod_q120x2 ntt120_vec_znx_dft_layout::get_copy_zext(uint64_t idx, uint64_t blk) {
20 return mod_q120x2(get_blk(idx, blk));
21}
22q120x2b* ntt120_vec_znx_dft_layout::get_blk(uint64_t idx, uint64_t blk) {
23 REQUIRE_DRAMATICALLY(idx < size, "idx overflow");
24 REQUIRE_DRAMATICALLY(blk < nn / 2, "blk overflow");
25 uint64_t* d = (uint64_t*)data;
26 return (q120x2b*)(d + 4 * nn * idx + 8 * blk);
27}
28ntt120_vec_znx_dft_layout::~ntt120_vec_znx_dft_layout() { spqlios_free(data); }
29q120_nttvec ntt120_vec_znx_dft_layout::get_copy_zext(uint64_t idx) {
30 int64_t* d = (int64_t*)data;
31 if (idx < size) {
32 return q120_nttvec(nn, (q120b*)(d + idx * nn * 4));
33 } else {
34 return q120_nttvec::zero(nn);
35 }
36}
37void ntt120_vec_znx_dft_layout::set(uint64_t idx, const q120_nttvec& value) {
38 REQUIRE_DRAMATICALLY(idx < size, "index overflow: " << idx << " / " << size);
39 q120b* dest_addr = (q120b*)((int64_t*)data + idx * nn * 4);
40 value.save_as(dest_addr);
41}
42void ntt120_vec_znx_dft_layout::fill_random() {
43 for (uint64_t i = 0; i < size; ++i) {
44 set(i, q120_nttvec::random(nn));
45 }
46}
47thash ntt120_vec_znx_dft_layout::content_hash() const { return test_hash(data, nn * size * 4 * sizeof(int64_t)); }
48ntt120_vec_znx_big_layout::ntt120_vec_znx_big_layout(uint64_t n, uint64_t size)
49 : nn(n), //
50 size(size),
51 data((VEC_ZNX_BIG*)alloc64(n * size * sizeof(__int128_t))) {}
52
53znx_i128 ntt120_vec_znx_big_layout::get_copy(uint64_t index) const { return znx_i128(nn, get_addr(index)); }
54znx_i128 ntt120_vec_znx_big_layout::get_copy_zext(uint64_t index) const {
55 if (index < size) {
56 return znx_i128(nn, get_addr(index));
57 } else {
58 return znx_i128::zero(nn);
59 }
60}
61__int128* ntt120_vec_znx_big_layout::get_addr(uint64_t index) const {
62 REQUIRE_DRAMATICALLY(index < size, "index overflow: " << index << " / " << size);
63 return (__int128_t*)data + index * nn;
64}
65void ntt120_vec_znx_big_layout::set(uint64_t index, const znx_i128& value) { value.save_as(get_addr(index)); }
66ntt120_vec_znx_big_layout::~ntt120_vec_znx_big_layout() { spqlios_free(data); }