// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0

#include "sw/device/lib/base/bitfield.h"

// `extern` declarations to give the inline functions in the
// corresponding header a link location.

extern uint32_t bitfield_field32_read(uint32_t bitfield,
                                      bitfield_field32_t field);
extern uint32_t bitfield_field32_write(uint32_t bitfield,
                                       bitfield_field32_t field,
                                       uint32_t value);

extern bitfield_field32_t bitfield_bit32_to_field32(
    bitfield_bit32_index_t bit_index);

extern bool bitfield_bit32_read(uint32_t bitfield,
                                bitfield_bit32_index_t bit_index);
extern uint32_t bitfield_bit32_write(uint32_t bitfield,
                                     bitfield_bit32_index_t bit_index,
                                     bool value);
extern uint32_t bitfield_bit32_copy(uint32_t dest,
                                    bitfield_bit32_index_t dest_bit,
                                    uint32_t src,
                                    bitfield_bit32_index_t src_bit);

extern int32_t bitfield_find_first_set32(int32_t bitfield);
extern int32_t bitfield_count_leading_zeroes32(uint32_t bitfield);
extern int32_t bitfield_count_trailing_zeroes32(uint32_t bitfield);
extern int32_t bitfield_popcount32(uint32_t bitfield);
extern int32_t bitfield_parity32(uint32_t bitfield);
extern uint32_t bitfield_byteswap32(uint32_t bitfield);
extern bool bitfield_is_power_of_two32(uint32_t bitfield);
