26 using EltW =
typename Logic::EltW;
29 explicit Scan(
const Logic& l) : l_(l) {}
43 void add(
size_t n, EltW B[],
const BitW S[],
const EltW A[],
46 std::vector<BitW> S1(n);
47 for (
size_t i = 0; i < n; ++i) {
49 B[i] = L.mux(&S[i], &A[i], ds[i]);
51 scan_add(0, n, S1.data(), B);
55 void add(
size_t n, EltW B[],
const EltW ds[]) {
56 for (
size_t i = 0; i < n; ++i) {
65 void scan_add(
size_t i0,
size_t i1, BitW S[], EltW B[]) {
68 size_t im = i0 + (i1 - i0) / 2;
69 scan_add(i0, im, S, B);
70 scan_add(im, i1, S, B);
73 for (
size_t i = im; i < i1; ++i) {
76 auto ns = L.lnot(S[i]);
77 auto ns_bj = L.lmul(&ns, B[j]);
78 B[i] = L.add(&B[i], ns_bj);
79 S[i] = L.lor(&S[i], S[j]);
85 void scan_add(
size_t i0,
size_t i1, EltW B[]) {
88 size_t im = i0 + (i1 - i0) / 2;
93 for (
size_t i = im; i < i1; ++i) {
94 B[i] = L.add(&B[j], B[i]);