Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bdd/diff op #667

Merged
merged 10 commits into from
May 30, 2024
68 changes: 68 additions & 0 deletions src/adiar/bdd.h
Original file line number Diff line number Diff line change
Expand Up @@ -401,6 +401,21 @@ namespace adiar
operator&(__bdd&&, __bdd&&);
/// \endcond

//////////////////////////////////////////////////////////////////////////////////////////////////
/// \see bdd_and
//////////////////////////////////////////////////////////////////////////////////////////////////
__bdd
operator*(const bdd& lhs, const bdd& rhs);

/// \cond
__bdd
operator*(const bdd&, __bdd&&);
__bdd
operator*(__bdd&&, const bdd&);
__bdd
operator*(__bdd&&, __bdd&&);
/// \endcond

//////////////////////////////////////////////////////////////////////////////////////////////////
/// \brief Logical 'nand' operator.
///
Expand Down Expand Up @@ -448,6 +463,33 @@ namespace adiar
operator|(__bdd&&, __bdd&&);
/// \endcond

//////////////////////////////////////////////////////////////////////////////////////////////////
/// \see bdd_or
//////////////////////////////////////////////////////////////////////////////////////////////////
bdd
operator+(const bdd& f);

//////////////////////////////////////////////////////////////////////////////////////////////////
/// \see bdd_or
//////////////////////////////////////////////////////////////////////////////////////////////////
__bdd
operator+(__bdd&& f);

//////////////////////////////////////////////////////////////////////////////////////////////////
/// \see bdd_or
//////////////////////////////////////////////////////////////////////////////////////////////////
__bdd
operator+(const bdd& lhs, const bdd& rhs);

/// \cond
__bdd
operator+(const bdd&, __bdd&&);
__bdd
operator+(__bdd&&, const bdd&);
__bdd
operator+(__bdd&&, __bdd&&);
/// \endcond

//////////////////////////////////////////////////////////////////////////////////////////////////
/// \brief Logical 'nor' operator.
///
Expand Down Expand Up @@ -575,6 +617,32 @@ namespace adiar
__bdd
bdd_diff(const exec_policy& ep, const bdd& f, const bdd& g);

//////////////////////////////////////////////////////////////////////////////////////////////////
/// \see bdd_diff, bdd_not
//////////////////////////////////////////////////////////////////////////////////////////////////
bdd
operator-(const bdd& f);

/// \cond
__bdd
operator-(__bdd&& f);
/// \endcond

//////////////////////////////////////////////////////////////////////////////////////////////////
/// \see bdd_diff
//////////////////////////////////////////////////////////////////////////////////////////////////
__bdd
operator-(const bdd& lhs, const bdd& rhs);

/// \cond
__bdd
operator-(const bdd&, __bdd&&);
__bdd
operator-(__bdd&&, const bdd&);
__bdd
operator-(__bdd&&, __bdd&&);
/// \endcond

//////////////////////////////////////////////////////////////////////////////////////////////////
/// \brief Logical 'less than' operator.
///
Expand Down
172 changes: 141 additions & 31 deletions src/adiar/bdd/bdd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

namespace adiar
{
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
// '__bdd' Constructors
__bdd::__bdd() = default;

Expand All @@ -27,7 +27,7 @@ namespace adiar
: internal::__dd(dd)
{}

//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
// 'bdd' Constructors
bdd::bdd(bool t)
: bdd(bdd_terminal(t))
Expand All @@ -53,15 +53,9 @@ namespace adiar
: internal::dd(internal::reduce<bdd_policy>(std::move(f)))
{}

//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
// Operators
bdd
operator~(__bdd&& in)
{
return ~bdd(std::move(in));
}

#define __bdd_oper(out_t, op) \
#define __BDD_OPER(out_t, op) \
out_t operator op(__bdd&& lhs, __bdd&& rhs) \
{ \
return bdd(std::move(lhs)) op bdd(std::move(rhs)); \
Expand All @@ -77,10 +71,11 @@ namespace adiar
return bdd(std::move(lhs)) op rhs; \
}

__bdd_oper(__bdd, &) __bdd_oper(__bdd, |) __bdd_oper(__bdd, ^) __bdd_oper(bool, ==)
__bdd_oper(bool, !=)
//////////////////////////////////////////////////////////////////////////////
// Operators (Assignment)

bdd& bdd::operator=(const bdd & other)
bdd&
bdd::operator=(const bdd& other)
{
this->negate = other.negate;
this->file = other.file;
Expand All @@ -94,6 +89,54 @@ namespace adiar
return (*this = internal::reduce<bdd_policy>(std::move(other)));
}

//////////////////////////////////////////////////////////////////////////////
// Operators (Relational)

__BDD_OPER(bool, ==);

bool
operator==(const bdd& lhs, const bdd& rhs)
{
return bdd_equal(lhs, rhs);
}

__BDD_OPER(bool, !=);

bool
operator!=(const bdd& lhs, const bdd& rhs)
{
return bdd_unequal(lhs, rhs);
}

//////////////////////////////////////////////////////////////////////////////
// Operators (Bit)

bdd
operator~(const bdd& f)
{
return bdd_not(f);
}

bdd
operator~(bdd&& f)
{
return bdd_not(std::move(f));
}

bdd
operator~(__bdd&& in)
{
return ~bdd(std::move(in));
}

__BDD_OPER(__bdd, &);

__bdd
operator&(const bdd& lhs, const bdd& rhs)
{
return bdd_and(lhs, rhs);
}

bdd&
bdd::operator&=(const bdd& other)
{
Expand All @@ -108,6 +151,14 @@ namespace adiar
return (*this = std::move(temp));
}

__BDD_OPER(__bdd, |);

__bdd
operator|(const bdd& lhs, const bdd& rhs)
{
return bdd_or(lhs, rhs);
}

bdd&
bdd::operator|=(const bdd& other)
{
Expand All @@ -122,6 +173,14 @@ namespace adiar
return (*this = std::move(temp));
}

__BDD_OPER(__bdd, ^);

__bdd
operator^(const bdd& lhs, const bdd& rhs)
{
return bdd_xor(lhs, rhs);
}

bdd&
bdd::operator^=(const bdd& other)
{
Expand All @@ -136,49 +195,100 @@ namespace adiar
return (*this = std::move(temp));
}

bool
operator==(const bdd& lhs, const bdd& rhs)
//////////////////////////////////////////////////////////////////////////////
// Operators (Set/Arithmetic)

__BDD_OPER(__bdd, +);

bdd
operator+(const bdd& f)
{
return bdd_equal(lhs, rhs);
return f;
}

bool
operator!=(const bdd& lhs, const bdd& rhs)
__bdd
operator+(__bdd&& f)
{
return bdd_unequal(lhs, rhs);
return f;
}

bdd
operator~(const bdd& f)
__bdd
operator+(const bdd& lhs, const bdd& rhs)
{
return bdd_not(f);
return bdd_or(lhs, rhs);
}

bdd&
bdd::operator+=(const bdd& other)
{
return (*this = bdd_or(*this, other));
}

bdd&
bdd::operator+=(bdd&& other)
{
__bdd temp = bdd_or(*this, other);
other.deref();
return (*this = std::move(temp));
}

__BDD_OPER(__bdd, -);

bdd
operator~(bdd&& f)
operator-(const bdd& f)
{
return bdd_not(std::forward<bdd>(f));
return bdd_not(f);
}

__bdd
operator&(const bdd& lhs, const bdd& rhs)
operator-(__bdd&& f)
{
return bdd_and(lhs, rhs);
return bdd_not(std::move(f));
}

__bdd
operator|(const bdd& lhs, const bdd& rhs)
operator-(const bdd& lhs, const bdd& rhs)
{
return bdd_or(lhs, rhs);
return bdd_diff(lhs, rhs);
}

bdd&
bdd::operator-=(const bdd& other)
{
return (*this = bdd_diff(*this, other));
}

bdd&
bdd::operator-=(bdd&& other)
{
__bdd temp = bdd_diff(*this, other);
other.deref();
return (*this = std::move(temp));
}

__BDD_OPER(__bdd, *);

__bdd
operator^(const bdd& lhs, const bdd& rhs)
operator*(const bdd& lhs, const bdd& rhs)
{
return bdd_xor(lhs, rhs);
return bdd_and(lhs, rhs);
}

//////////////////////////////////////////////////////////////////////////////
bdd&
bdd::operator*=(const bdd& other)
{
return (*this = bdd_and(*this, other));
}

bdd&
bdd::operator*=(bdd&& other)
{
__bdd temp = bdd_and(*this, other);
other.deref();
return (*this = std::move(temp));
}

//////////////////////////////////////////////////////////////////////////////////////////////////
// Input variables
bdd::label_type
bdd_topvar(const bdd& f)
Expand Down
33 changes: 33 additions & 0 deletions src/adiar/bdd/bdd.h
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,39 @@ namespace adiar
bdd&
operator^=(bdd&& other);
/// \endcond

////////////////////////////////////////////////////////////////////////////////////////////////
/// \see bdd_or
////////////////////////////////////////////////////////////////////////////////////////////////
bdd&
operator+=(const bdd& other);

/// \cond
bdd&
operator+=(bdd&& other);
/// \endcond

////////////////////////////////////////////////////////////////////////////////////////////////
/// \see bdd_diff
////////////////////////////////////////////////////////////////////////////////////////////////
bdd&
operator-=(const bdd& other);

/// \cond
bdd&
operator-=(bdd&& other);
/// \endcond

////////////////////////////////////////////////////////////////////////////////////////////////
/// \see bdd_and
////////////////////////////////////////////////////////////////////////////////////////////////
bdd&
operator*=(const bdd& other);

/// \cond
bdd&
operator*=(bdd&& other);
/// \endcond
};
}

Expand Down
Loading
Loading