abc/src/map/if/acd/kitty_static_tt.hpp

135 lines
3.0 KiB
C++

#ifndef _KITTY_STATIC_TT_H_
#define _KITTY_STATIC_TT_H_
#pragma once
#include <array>
#include <cstdint>
#include "kitty_constants.hpp"
ABC_NAMESPACE_CXX_HEADER_START
namespace kitty
{
template<uint32_t NumVars>
struct static_truth_table
{
/*! \cond PRIVATE */
enum
{
NumBlocks = ( NumVars <= 6 ) ? 1u : ( 1u << ( NumVars - 6 ) )
};
enum
{
NumBits = uint64_t( 1 ) << NumVars
};
/*! \endcond */
/*! Standard constructor.
The number of variables provided to the truth table must be known
at runtime. The number of blocks will be computed as a compile
time constant.
*/
static_truth_table()
{
_bits.fill( 0 );
}
/*! Constructs a new static truth table instance with the same number of variables. */
inline static_truth_table<NumVars> construct() const
{
return static_truth_table<NumVars>();
}
/*! Returns number of variables.
*/
inline auto num_vars() const noexcept { return NumVars; }
/*! Returns number of blocks.
*/
inline auto num_blocks() const noexcept { return NumBlocks; }
/*! Returns number of bits.
*/
inline auto num_bits() const noexcept { return NumBits; }
/*! \brief Begin iterator to bits.
*/
inline auto begin() noexcept { return _bits.begin(); }
/*! \brief End iterator to bits.
*/
inline auto end() noexcept { return _bits.end(); }
/*! \brief Begin iterator to bits.
*/
inline auto begin() const noexcept { return _bits.begin(); }
/*! \brief End iterator to bits.
*/
inline auto end() const noexcept { return _bits.end(); }
/*! \brief Reverse begin iterator to bits.
*/
inline auto rbegin() noexcept { return _bits.rbegin(); }
/*! \brief Reverse end iterator to bits.
*/
inline auto rend() noexcept { return _bits.rend(); }
/*! \brief Constant begin iterator to bits.
*/
inline auto cbegin() const noexcept { return _bits.cbegin(); }
/*! \brief Constant end iterator to bits.
*/
inline auto cend() const noexcept { return _bits.cend(); }
/*! \brief Constant reverse begin iterator to bits.
*/
inline auto crbegin() const noexcept { return _bits.crbegin(); }
/*! \brief Constant teverse end iterator to bits.
*/
inline auto crend() const noexcept { return _bits.crend(); }
/*! \brief Assign other truth table if number of variables match.
This replaces the current truth table with another truth table, if `other`
has the same number of variables. Otherwise, the truth table is not
changed.
\param other Other truth table
*/
template<class TT>
static_truth_table<NumVars>& operator=( const TT& other )
{
if ( other.num_bits() == num_bits() )
{
std::copy( other.begin(), other.end(), begin() );
}
return *this;
}
/*! Masks the number of valid truth table bits.
We know that we will have at least 7 variables in this data
structure.
*/
inline void mask_bits() noexcept {}
/*! \cond PRIVATE */
public: /* fields */
std::array<uint64_t, NumBlocks> _bits;
/*! \endcond */
};
} //namespace kitty
ABC_NAMESPACE_CXX_HEADER_END
#endif // _KITTY_STATIC_TT_H_