diff options
author | Alan Mishchenko <alanmi@berkeley.edu> | 2014-10-08 10:41:20 -0700 |
---|---|---|
committer | Alan Mishchenko <alanmi@berkeley.edu> | 2014-10-08 10:41:20 -0700 |
commit | e4d58876714197bc3597846bf3224c0cdf8b1c66 (patch) | |
tree | e8105c4f4ce5609a5944210754166f1afb7d5c74 /src/misc/util/utilTruth.h | |
parent | bd0373daf5e5c5206b8272cf92eac7ce88af731e (diff) | |
download | abc-e4d58876714197bc3597846bf3224c0cdf8b1c66.tar.gz abc-e4d58876714197bc3597846bf3224c0cdf8b1c66.tar.bz2 abc-e4d58876714197bc3597846bf3224c0cdf8b1c66.zip |
Detection of threshold functions.
Diffstat (limited to 'src/misc/util/utilTruth.h')
-rw-r--r-- | src/misc/util/utilTruth.h | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/src/misc/util/utilTruth.h b/src/misc/util/utilTruth.h index 1416034d..0b52b3f4 100644 --- a/src/misc/util/utilTruth.h +++ b/src/misc/util/utilTruth.h @@ -1597,6 +1597,101 @@ static inline void Abc_TtReverseBits( word * pTruth, int nVars ) /**Function************************************************************* + Synopsis [Checks unateness of a function.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +static inline int Abc_Tt6PosVar( word t, int iVar ) +{ + return ((t >> (1<<iVar)) & t & s_Truths6Neg[iVar]) == (t & s_Truths6Neg[iVar]); +} +static inline int Abc_Tt6NegVar( word t, int iVar ) +{ + return ((t << (1<<iVar)) & t & s_Truths6[iVar]) == (t & s_Truths6[iVar]); +} +static inline int Abc_TtPosVar( word * t, int nVars, int iVar ) +{ + assert( iVar < nVars ); + if ( nVars <= 6 ) + return Abc_Tt6PosVar( t[0], iVar ); + if ( iVar < 6 ) + { + int i, Shift = (1 << iVar); + int nWords = Abc_TtWordNum( nVars ); + for ( i = 0; i < nWords; i++ ) + if ( ((t[i] >> Shift) & t[i] & s_Truths6Neg[iVar]) != (t[i] & s_Truths6Neg[iVar]) ) + return 0; + return 1; + } + else + { + int i, Step = (1 << (iVar - 6)); + word * tLimit = t + Abc_TtWordNum( nVars ); + for ( ; t < tLimit; t += 2*Step ) + for ( i = 0; i < Step; i++ ) + if ( t[i] != (t[i] & t[Step+i]) ) + return 0; + return 1; + } +} +static inline int Abc_TtNegVar( word * t, int nVars, int iVar ) +{ + assert( iVar < nVars ); + if ( nVars <= 6 ) + return Abc_Tt6NegVar( t[0], iVar ); + if ( iVar < 6 ) + { + int i, Shift = (1 << iVar); + int nWords = Abc_TtWordNum( nVars ); + for ( i = 0; i < nWords; i++ ) + if ( ((t[i] << Shift) & t[i] & s_Truths6[iVar]) != (t[i] & s_Truths6[iVar]) ) + return 0; + return 1; + } + else + { + int i, Step = (1 << (iVar - 6)); + word * tLimit = t + Abc_TtWordNum( nVars ); + for ( ; t < tLimit; t += 2*Step ) + for ( i = 0; i < Step; i++ ) + if ( (t[i] & t[Step+i]) != t[Step+i] ) + return 0; + return 1; + } +} +static inline int Abc_TtIsUnate( word * t, int nVars ) +{ + int i; + for ( i = 0; i < nVars; i++ ) + if ( !Abc_TtNegVar(t, nVars, i) && !Abc_TtPosVar(t, nVars, i) ) + return 0; + return 1; +} +static inline int Abc_TtIsPosUnate( word * t, int nVars ) +{ + int i; + for ( i = 0; i < nVars; i++ ) + if ( !Abc_TtPosVar(t, nVars, i) ) + return 0; + return 1; +} +static inline void Abc_TtMakePosUnate( word * t, int nVars ) +{ + int i, nWords = Abc_TtWordNum(nVars); + for ( i = 0; i < nVars; i++ ) + if ( Abc_TtNegVar(t, nVars, i) ) + Abc_TtFlip( t, nWords, i ); + else assert( Abc_TtPosVar(t, nVars, i) ); +} + + +/**Function************************************************************* + Synopsis [Computes ISOP for 6 variables or less.] Description [] |