summaryrefslogtreecommitdiffstats
path: root/src/opt/fxu/fxuSingle.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/opt/fxu/fxuSingle.c')
-rw-r--r--src/opt/fxu/fxuSingle.c166
1 files changed, 166 insertions, 0 deletions
diff --git a/src/opt/fxu/fxuSingle.c b/src/opt/fxu/fxuSingle.c
new file mode 100644
index 00000000..5af5c341
--- /dev/null
+++ b/src/opt/fxu/fxuSingle.c
@@ -0,0 +1,166 @@
+/**CFile****************************************************************
+
+ FileName [fxuSingle.c]
+
+ PackageName [MVSIS 2.0: Multi-valued logic synthesis system.]
+
+ Synopsis [Procedures to compute the set of single-cube divisors.]
+
+ Author [MVSIS Group]
+
+ Affiliation [UC Berkeley]
+
+ Date [Ver. 1.0. Started - February 1, 2003.]
+
+ Revision [$Id: fxuSingle.c,v 1.0 2003/02/01 00:00:00 alanmi Exp $]
+
+***********************************************************************/
+
+#include "fxuInt.h"
+
+////////////////////////////////////////////////////////////////////////
+/// DECLARATIONS ///
+////////////////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////////////////
+/// FUNCTION DEFITIONS ///
+////////////////////////////////////////////////////////////////////////
+
+/**Function*************************************************************
+
+ Synopsis [Computes and adds all single-cube divisors to storage.]
+
+ Description [This procedure should be called once when the matrix is
+ already contructed before the process of logic extraction begins..]
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Fxu_MatrixComputeSingles( Fxu_Matrix * p )
+{
+ Fxu_Var * pVar;
+ // iterate through the columns in the matrix
+ Fxu_MatrixForEachVariable( p, pVar )
+ Fxu_MatrixComputeSinglesOne( p, pVar );
+}
+
+/**Function*************************************************************
+
+ Synopsis [Adds the single-cube divisors associated with a new column.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+void Fxu_MatrixComputeSinglesOne( Fxu_Matrix * p, Fxu_Var * pVar )
+{
+// int * pValue2Node = p->pValue2Node;
+ Fxu_Lit * pLitV, * pLitH;
+ Fxu_Var * pVar2;
+ int Coin;
+// int CounterAll;
+// int CounterTest;
+ int WeightCur;
+
+ // start collecting the affected vars
+ Fxu_MatrixRingVarsStart( p );
+ // go through all the literals of this variable
+ for ( pLitV = pVar->lLits.pHead; pLitV; pLitV = pLitV->pVNext )
+ // for this literal, go through all the horizontal literals
+ for ( pLitH = pLitV->pHPrev; pLitH; pLitH = pLitH->pHPrev )
+ {
+ // get another variable
+ pVar2 = pLitH->pVar;
+// CounterAll++;
+ // skip the var if it is already used
+ if ( pVar2->pOrder )
+ continue;
+ // skip the var if it belongs to the same node
+// if ( pValue2Node[pVar->iVar] == pValue2Node[pVar2->iVar] )
+// continue;
+ // collect the var
+ Fxu_MatrixRingVarsAdd( p, pVar2 );
+ }
+ // stop collecting the selected vars
+ Fxu_MatrixRingVarsStop( p );
+
+ // iterate through the selected vars
+ Fxu_MatrixForEachVarInRing( p, pVar2 )
+ {
+// CounterTest++;
+ // count the coincidence
+ Coin = Fxu_SingleCountCoincidence( p, pVar2, pVar );
+ assert( Coin > 0 );
+ // get the new weight
+ WeightCur = Coin - 2;
+ if ( WeightCur >= 0 )
+ Fxu_MatrixAddSingle( p, pVar2, pVar, WeightCur );
+ }
+
+ // unmark the vars
+ Fxu_MatrixRingVarsUnmark( p );
+}
+
+/**Function*************************************************************
+
+ Synopsis [Computes the coincidence count of two columns.]
+
+ Description []
+
+ SideEffects []
+
+ SeeAlso []
+
+***********************************************************************/
+int Fxu_SingleCountCoincidence( Fxu_Matrix * p, Fxu_Var * pVar1, Fxu_Var * pVar2 )
+{
+ Fxu_Lit * pLit1, * pLit2;
+ int Result;
+
+ // compute the coincidence count
+ Result = 0;
+ pLit1 = pVar1->lLits.pHead;
+ pLit2 = pVar2->lLits.pHead;
+ while ( 1 )
+ {
+ if ( pLit1 && pLit2 )
+ {
+ if ( pLit1->pCube->pVar->iVar == pLit2->pCube->pVar->iVar )
+ { // the variables are the same
+ if ( pLit1->iCube == pLit2->iCube )
+ { // the literals are the same
+ pLit1 = pLit1->pVNext;
+ pLit2 = pLit2->pVNext;
+ // add this literal to the coincidence
+ Result++;
+ }
+ else if ( pLit1->iCube < pLit2->iCube )
+ pLit1 = pLit1->pVNext;
+ else
+ pLit2 = pLit2->pVNext;
+ }
+ else if ( pLit1->pCube->pVar->iVar < pLit2->pCube->pVar->iVar )
+ pLit1 = pLit1->pVNext;
+ else
+ pLit2 = pLit2->pVNext;
+ }
+ else if ( pLit1 && !pLit2 )
+ pLit1 = pLit1->pVNext;
+ else if ( !pLit1 && pLit2 )
+ pLit2 = pLit2->pVNext;
+ else
+ break;
+ }
+ return Result;
+}
+
+////////////////////////////////////////////////////////////////////////
+/// END OF FILE ///
+////////////////////////////////////////////////////////////////////////
+
+