summaryrefslogtreecommitdiffstats
path: root/src/misc/util/utilTruth.h
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2014-10-08 10:41:20 -0700
committerAlan Mishchenko <alanmi@berkeley.edu>2014-10-08 10:41:20 -0700
commite4d58876714197bc3597846bf3224c0cdf8b1c66 (patch)
treee8105c4f4ce5609a5944210754166f1afb7d5c74 /src/misc/util/utilTruth.h
parentbd0373daf5e5c5206b8272cf92eac7ce88af731e (diff)
downloadabc-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.h95
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 []