33class CounterAux<Logic_, false> {
36 using Field =
typename Logic::Field;
37 using EltW =
typename Logic::EltW;
49 explicit CounterAux(
const Logic& l) : l_(l) {}
51 const Logic& logic()
const {
return l_; }
55 EltW znz_indicator(
const CEltW& celt)
const {
return celt.e; }
57 CEltW mone()
const {
return CEltW{l_.konst(l_.mone())}; }
58 CEltW as_counter(uint64_t n)
const {
return CEltW{l_.konst(n)}; }
59 CEltW as_counter(
const CElt& x)
const {
return CEltW{l_.konst(x.e)}; }
61 CEltW as_counter(
const BitW& b)
const {
return CEltW{l_.eval(b)}; }
64 CEltW as_counter(
const typename Logic::template bitvec<N>& v)
const {
66 return CEltW{l_.as_scalar(v)};
69 CEltW add(
const CEltW* a,
const CEltW& b)
const {
70 return CEltW{l_.add(&a->e, b.e)};
74 CEltW ite0(
const BitW* a,
const CEltW& b)
const {
75 EltW ae = l_.eval(*a);
76 return CEltW{l_.mul(&ae, b.e)};
80 CEltW mux(
const BitW* a,
const CEltW* b,
const CEltW& c)
const {
81 return add(&c, ite0(a, sub(b, c)));
83 void assert0(
const CEltW& a)
const { l_.assert0(a.e); }
84 void assert_eq(
const CEltW* a,
const CEltW& b)
const {
85 l_.assert_eq(&a->e, b.e);
88 CEltW input()
const {
return CEltW{l_.eltw_input()}; }
95 CEltW sub(
const CEltW* a,
const CEltW& b)
const {
96 return CEltW{l_.sub(&a->e, b.e)};
102class CounterAux<Logic_, true> {
104 using Logic = Logic_;
105 using Field =
typename Logic::Field;
106 using EltW =
typename Logic::EltW;
114 explicit CounterAux(
const Logic& l) : l_(l) {}
116 const Logic& logic()
const {
return l_; }
120 EltW znz_indicator(
const CEltW& celt)
const {
121 return l_.sub(&celt.e, l_.konst(l_.one()));
124 CEltW mone()
const {
return CEltW{l_.konst(l_.f_.invg())}; }
125 CEltW as_counter(uint64_t n)
const {
126 return CEltW{l_.konst(l_.f_.as_counter(n).e)};
128 CEltW as_counter(
const CElt& x)
const {
return CEltW{l_.konst(x.e)}; }
130 CEltW as_counter(
const BitW& b)
const {
131 CEltW iftrue = CEltW{l_.konst(l_.f_.g())};
132 return ite0(&b, iftrue);
136 CEltW as_counter(
const typename Logic::template bitvec<N>& v)
const {
141 EltW p = L.mul(0, N, [&](
size_t i) {
142 auto g2i = L.konst(L.f_.counter_beta(i));
143 return L.mux(&v[i], &g2i, L.konst(L.one()));
149 CEltW add(
const CEltW* a,
const CEltW& b)
const {
150 return CEltW{l_.mul(&a->e, b.e)};
154 CEltW ite0(
const BitW* a,
const CEltW& b)
const {
155 return CEltW{l_.mux(a, &b.e, l_.konst(l_.one()))};
159 CEltW mux(
const BitW* a,
const CEltW* b,
const CEltW& c)
const {
160 return CEltW{l_.mux(a, &b->e, c.e)};
162 void assert0(
const CEltW& a)
const { l_.assert_eq(&a.e, l_.konst(l_.one())); }
163 void assert_eq(
const CEltW* a,
const CEltW& b)
const {
164 l_.assert_eq(&a->e, b.e);
167 CEltW input()
const {
return CEltW{l_.eltw_input()}; }