apycfixed_util.h

Functions

static inline void complex_multiplication_1_1_2(apy_limb_t *res, const apy_limb_t *src0, const apy_limb_t *src1)
template<typename RANDOM_ACCESS_ITERATOR_IN1, typename RANDOM_ACCESS_ITERATOR_IN2, typename RANDOM_ACCESS_ITERATOR_OUT, typename RANDOM_ACCESS_ITERATOR_INOUT>
static inline void complex_fixed_point_product(RANDOM_ACCESS_ITERATOR_IN1 src1, RANDOM_ACCESS_ITERATOR_IN2 src2, RANDOM_ACCESS_ITERATOR_OUT dst, std::size_t src1_limbs, std::size_t src2_limbs, std::size_t dst_limbs, RANDOM_ACCESS_ITERATOR_INOUT op1_abs, RANDOM_ACCESS_ITERATOR_INOUT op2_abs, RANDOM_ACCESS_ITERATOR_INOUT prod_imm)

Iterator-based multi-limb two’s complement complex-valued fixed-point multiplication. The scratch vector prod_imm must have space for at least 2 + 2 * src1_limbs + 2 * src2_limbs limbs. The scratch vectors op1_abs and op2_abs must have space for at least src1_limbs and src2_limbs limbs, respectively. No overlap between prod_imm and op[12]_abs allowed. No overlap between prod_imm and dst allowed.

template<typename RANDOM_ACCESS_ITERATOR_IN1, typename RANDOM_ACCESS_ITERATOR_IN2, typename RANDOM_ACCESS_ITERATOR_OUT, typename RANDOM_ACCESS_ITERATOR_INOUT>
static inline void complex_fixed_point_division(RANDOM_ACCESS_ITERATOR_IN1 src1, RANDOM_ACCESS_ITERATOR_IN2 src2, RANDOM_ACCESS_ITERATOR_OUT dst, std::size_t src1_limbs, std::size_t src2_limbs, std::size_t dst_limbs, std::size_t src2_bits, std::size_t div_limbs, RANDOM_ACCESS_ITERATOR_INOUT op1_abs, RANDOM_ACCESS_ITERATOR_INOUT op2_abs, RANDOM_ACCESS_ITERATOR_INOUT prod_imm, RANDOM_ACCESS_ITERATOR_INOUT den_imm, RANDOM_ACCESS_ITERATOR_INOUT num_imm, RANDOM_ACCESS_ITERATOR_INOUT qte_imm)

Iterator-based multi-limb two’s complement complex-valued fixed-point division. The scratch vector prod_imm must have space for at least 2 + 2 * src1_limbs + 2 * src2_limbs limbs. The scratch vectors op1_abs and op2_abs must have space for at least src1_limbs and src2_limbs limbs, respectively. No overlap between prod_imm and op[12]_abs allowed. No overlap between prod_imm and dst allowed.

struct ComplexFixedPointInnerProduct

Public Types

using It = APyBuffer<apy_limb_t>::vector_type::iterator
using CIt = APyBuffer<apy_limb_t>::vector_type::const_iterator

Public Functions

inline explicit ComplexFixedPointInnerProduct(const APyFixedSpec &src1_spec, const APyFixedSpec &src2_spec, const APyFixedSpec &dst_spec, const std::optional<APyFixedAccumulatorOption> acc_mode)
inline void operator()(CIt src1, CIt src2, It dst, std::size_t N, std::size_t M = 1, std::size_t DST_STEP = 1) const

Private Functions

inline void inner_product_one_limb_src_one_limb_dst(CIt src1, CIt src2, It dst, std::size_t N, std::size_t M, std::size_t DST_STEP) const
inline void inner_product_one_limb_src_two_limb_dst(CIt src1, CIt src2, It dst, std::size_t N, std::size_t M, std::size_t DST_STEP) const
template<bool is_acc_context = false>
inline void inner_product(CIt src1, CIt src2, It dst, std::size_t N, std::size_t M, std::size_t DST_STEP) const

Private Members

void (ComplexFixedPointInnerProduct::* f)(CIt src1, CIt src2, It dst, std::size_t N, std::size_t M, std::size_t DST_STEP) const
std::size_t src1_limbs
std::size_t src2_limbs
std::size_t dst_limbs
std::size_t product_limbs
std::optional<APyFixedAccumulatorOption> acc_mode
int product_bits
int product_int_bits
mutable ScratchVector<apy_limb_t, 8> op1_abs
mutable ScratchVector<apy_limb_t, 8> op2_abs
mutable ScratchVector<apy_limb_t, 16> product
mutable ScratchVector<apy_limb_t, 16> prod_imm