mirror of https://github.com/YosysHQ/abc.git
135 lines
3.0 KiB
C++
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_
|