mirror of https://github.com/YosysHQ/abc.git
122 lines
3.2 KiB
C++
122 lines
3.2 KiB
C++
#ifndef _KITTY_OPERATORS_TT_H_
|
|
#define _KITTY_OPERATORS_TT_H_
|
|
#pragma once
|
|
|
|
#include <algorithm>
|
|
#include <cassert>
|
|
#include <functional>
|
|
#include <iterator>
|
|
#include <optional>
|
|
|
|
#include "kitty_constants.hpp"
|
|
#include "kitty_dynamic_tt.hpp"
|
|
#include "kitty_static_tt.hpp"
|
|
#include "kitty_operations.hpp"
|
|
|
|
namespace kitty
|
|
{
|
|
|
|
/*! \brief Operator for unary_not */
|
|
inline dynamic_truth_table operator~( const dynamic_truth_table& tt )
|
|
{
|
|
return unary_not( tt );
|
|
}
|
|
|
|
/*! \brief Operator for unary_not */
|
|
template<uint32_t NumVars>
|
|
inline static_truth_table<NumVars> operator~( const static_truth_table<NumVars>& tt )
|
|
{
|
|
return unary_not( tt );
|
|
}
|
|
|
|
/*! \brief Operator for binary_and */
|
|
inline dynamic_truth_table operator&( const dynamic_truth_table& first, const dynamic_truth_table& second )
|
|
{
|
|
return binary_and( first, second );
|
|
}
|
|
|
|
/*! \brief Operator for binary_and */
|
|
template<uint32_t NumVars>
|
|
inline static_truth_table<NumVars> operator&( const static_truth_table<NumVars>& first, const static_truth_table<NumVars>& second )
|
|
{
|
|
return binary_and( first, second );
|
|
}
|
|
|
|
/*! \brief Operator for binary_and and assign */
|
|
inline void operator&=( dynamic_truth_table& first, const dynamic_truth_table& second )
|
|
{
|
|
first = binary_and( first, second );
|
|
}
|
|
|
|
/*! \brief Operator for binary_and and assign */
|
|
template<uint32_t NumVars>
|
|
inline void operator&=( static_truth_table<NumVars>& first, const static_truth_table<NumVars>& second )
|
|
{
|
|
first = binary_and( first, second );
|
|
}
|
|
|
|
/*! \brief Operator for binary_or */
|
|
inline dynamic_truth_table operator|( const dynamic_truth_table& first, const dynamic_truth_table& second )
|
|
{
|
|
return binary_or( first, second );
|
|
}
|
|
|
|
/*! \brief Operator for binary_or */
|
|
template<uint32_t NumVars>
|
|
inline static_truth_table<NumVars> operator|( const static_truth_table<NumVars>& first, const static_truth_table<NumVars>& second )
|
|
{
|
|
return binary_or( first, second );
|
|
}
|
|
|
|
/*! \brief Operator for binary_or and assign */
|
|
inline void operator|=( dynamic_truth_table& first, const dynamic_truth_table& second )
|
|
{
|
|
first = binary_or( first, second );
|
|
}
|
|
|
|
/*! \brief Operator for binary_or and assign */
|
|
template<uint32_t NumVars>
|
|
inline void operator|=( static_truth_table<NumVars>& first, const static_truth_table<NumVars>& second )
|
|
{
|
|
// first = binary_or( first, second );
|
|
/* runtime improved version */
|
|
if constexpr ( NumVars <= 6 )
|
|
{
|
|
first._bits |= second._bits;
|
|
first.mask_bits();
|
|
}
|
|
else if constexpr ( NumVars == 7 )
|
|
{
|
|
first._bits[0] |= second._bits[0];
|
|
first._bits[1] |= second._bits[1];
|
|
}
|
|
else if constexpr ( NumVars == 8 )
|
|
{
|
|
first._bits[0] |= second._bits[0];
|
|
first._bits[1] |= second._bits[1];
|
|
first._bits[2] |= second._bits[2];
|
|
first._bits[3] |= second._bits[3];
|
|
}
|
|
else if constexpr ( NumVars == 9 )
|
|
{
|
|
first._bits[0] |= second._bits[0];
|
|
first._bits[1] |= second._bits[1];
|
|
first._bits[2] |= second._bits[2];
|
|
first._bits[3] |= second._bits[3];
|
|
first._bits[4] |= second._bits[4];
|
|
first._bits[5] |= second._bits[5];
|
|
first._bits[6] |= second._bits[6];
|
|
first._bits[7] |= second._bits[7];
|
|
}
|
|
else
|
|
{
|
|
for ( uint32_t i = 0; i < first.num_blocks(); ++i )
|
|
{
|
|
first._bits[i] |= second._bits[i];
|
|
}
|
|
}
|
|
}
|
|
|
|
} // namespace kitty
|
|
|
|
#endif // _KITTY_OPERATORS_TT_H_
|