ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
giaUnate.c File Reference
#include "gia.h"
Include dependency graph for giaUnate.c:

Go to the source code of this file.

Functions

Vec_Wec_tGia_ManCheckUnateVec (Gia_Man_t *p, Vec_Int_t *vCiIds, Vec_Int_t *vCoIds)
 
int Gia_ManCheckUnate_rec (Gia_Man_t *p, int iObj)
 
int Gia_ManCheckUnate (Gia_Man_t *p, int iCiId, int iCoId)
 
void Gia_ManCheckUnateVecTest (Gia_Man_t *p, int fVerbose)
 
void Gia_ManCheckUnateTest (Gia_Man_t *p, int fComputeAll, int fVerbose)
 

Function Documentation

◆ Gia_ManCheckUnate()

int Gia_ManCheckUnate ( Gia_Man_t * p,
int iCiId,
int iCoId )

Definition at line 138 of file giaUnate.c.

139{
140 int Res;
141 int CiObjId = Gia_ObjId(p, Gia_ManCi(p, iCiId));
142 int CoObjId = Gia_ObjId(p, Gia_ManCo(p, iCoId));
143 Gia_Obj_t * pCoObj = Gia_ManCo(p, iCoId);
144 Gia_ManIncrementTravId( p ); // Co does not depend on Ci.
145 Gia_ManIncrementTravId( p ); // Co is pos-unate in Ci
146 Gia_ObjSetTravIdCurrentId( p, CiObjId );
147 Gia_ManIncrementTravId( p ); // Co is neg-unate in Ci
148 Gia_ManIncrementTravId( p ); // Co is not unate in Ci
149 Res = Gia_ManCheckUnate_rec( p, Gia_ObjFaninId0(pCoObj, CoObjId) );
150 return ((Res == 1 || Res == 2) && Gia_ObjFaninC0(pCoObj)) ? Res ^ 3 : Res;
151}
Cube * p
Definition exorList.c:222
int Gia_ManCheckUnate_rec(Gia_Man_t *p, int iObj)
Definition giaUnate.c:120
struct Gia_Obj_t_ Gia_Obj_t
Definition gia.h:76
void Gia_ManIncrementTravId(Gia_Man_t *p)
Definition giaUtil.c:190
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Gia_ManCheckUnate_rec()

int Gia_ManCheckUnate_rec ( Gia_Man_t * p,
int iObj )

Function*************************************************************

Synopsis [Checks unateness one function in one variable.]

Description [Returns 0 if Co is not unate in Ci. Returns 1 if Co is neg-unate in Ci. Returns 2 if Co is pos-unate in Ci. Returns 3 if Co does not depend on Ci.]

SideEffects []

SeeAlso []

Definition at line 120 of file giaUnate.c.

121{
122 Gia_Obj_t * pObj;
123 int Res0, Res1;
124 if ( p->nTravIds - p->pTravIds[iObj] <= 3 )
125 return p->nTravIds - p->pTravIds[iObj];
126 pObj = Gia_ManObj( p, iObj );
127 p->pTravIds[iObj] = p->nTravIds - 3;
128 if ( Gia_ObjIsCi(pObj) )
129 return 3;
130 Res0 = Gia_ManCheckUnate_rec( p, Gia_ObjFaninId0(pObj, iObj) );
131 Res1 = Gia_ManCheckUnate_rec( p, Gia_ObjFaninId1(pObj, iObj) );
132 Res0 = ((Res0 == 1 || Res0 == 2) && Gia_ObjFaninC0(pObj)) ? Res0 ^ 3 : Res0;
133 Res1 = ((Res1 == 1 || Res1 == 2) && Gia_ObjFaninC1(pObj)) ? Res1 ^ 3 : Res1;
134 p->pTravIds[iObj] = p->nTravIds - (Res0 & Res1);
135 assert( (Res0 & Res1) <= 3 );
136 return p->nTravIds - p->pTravIds[iObj];
137}
#define assert(ex)
Definition util_old.h:213
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Gia_ManCheckUnateTest()

void Gia_ManCheckUnateTest ( Gia_Man_t * p,
int fComputeAll,
int fVerbose )

Function*************************************************************

Synopsis [Testing procedure for one pair.]

Description []

SideEffects []

SeeAlso []

Definition at line 210 of file giaUnate.c.

211{
212 if ( fComputeAll )
213 Gia_ManCheckUnateVecTest( p, fVerbose );
214 else
215 {
216 abctime clk = Abc_Clock();
217 int i, o, nVars = Gia_ManCiNum(p);
218 int nUnate = 0, nNonUnate = 0;
219 char * pBuffer = ABC_CALLOC( char, nVars+1 );
220 if ( fVerbose )
221 {
222 printf( "Inputs : " );
223 for ( i = 0; i < nVars; i++ )
224 printf( "%d", i % 10 );
225 printf( "\n" );
226 }
227 for ( o = 0; o < Gia_ManCoNum(p); o++ )
228 {
229 for ( i = 0; i < nVars; i++ )
230 {
231 int Res = Gia_ManCheckUnate( p, i, o );
232 if ( Res == 3 ) pBuffer[i] = ' ';
233 else if ( Res == 2 ) pBuffer[i] = 'p', nUnate++;
234 else if ( Res == 1 ) pBuffer[i] = 'n', nUnate++;
235 else if ( Res == 0 ) pBuffer[i] = '.', nNonUnate++;
236 else assert( 0 );
237 }
238 if ( fVerbose )
239 printf( "Out%4d : %s\n", o, pBuffer );
240 }
241 ABC_FREE( pBuffer );
242 // print stats
243 printf( "Ins/Outs = %4d/%4d. Total supp = %5d. Total unate = %5d.\n",
244 Gia_ManCiNum(p), Gia_ManCoNum(p), nUnate+nNonUnate, nUnate );
245 ABC_PRT( "Total time", Abc_Clock() - clk );
246 }
247}
ABC_INT64_T abctime
Definition abc_global.h:332
#define ABC_PRT(a, t)
Definition abc_global.h:255
#define ABC_CALLOC(type, num)
Definition abc_global.h:265
#define ABC_FREE(obj)
Definition abc_global.h:267
void Gia_ManCheckUnateVecTest(Gia_Man_t *p, int fVerbose)
Definition giaUnate.c:164
int Gia_ManCheckUnate(Gia_Man_t *p, int iCiId, int iCoId)
Definition giaUnate.c:138
Here is the call graph for this function:

◆ Gia_ManCheckUnateVec()

Vec_Wec_t * Gia_ManCheckUnateVec ( Gia_Man_t * p,
Vec_Int_t * vCiIds,
Vec_Int_t * vCoIds )

Function*************************************************************

Synopsis [Compute unateness for all outputs in terms of inputs.]

Description []

SideEffects []

SeeAlso []

Definition at line 69 of file giaUnate.c.

70{
71 Vec_Int_t * vCiVec = vCiIds ? Vec_IntDup(vCiIds) : Vec_IntStartNatural(Gia_ManCiNum(p));
72 Vec_Int_t * vCoVec = vCoIds ? Vec_IntDup(vCoIds) : Vec_IntStartNatural(Gia_ManCoNum(p));
73 Vec_Wec_t * vUnatesCo = Vec_WecStart( Vec_IntSize(vCoVec) );
74 Vec_Wec_t * vUnates = Vec_WecStart( Gia_ManObjNum(p) );
75 Vec_Int_t * vUnate0, * vUnate1;
76 Gia_Obj_t * pObj; int i, CioId;
77 Vec_IntForEachEntry( vCiVec, CioId, i )
78 {
79 pObj = Gia_ManCi( p, CioId );
80 Vec_IntPush( Vec_WecEntry(vUnates, Gia_ObjId(p, pObj)), Abc_Var2Lit(CioId, 0) );
81 }
82 Gia_ManForEachAnd( p, pObj, i )
83 {
84 vUnate0 = Vec_WecEntry(vUnates, Gia_ObjFaninId0(pObj, i));
85 vUnate1 = Vec_WecEntry(vUnates, Gia_ObjFaninId1(pObj, i));
86 vUnate0 = Gia_ObjFaninC0(pObj) ? Vec_IntFlopBit(vUnate0) : vUnate0;
87 vUnate1 = Gia_ObjFaninC1(pObj) ? Vec_IntFlopBit(vUnate1) : vUnate1;
88 Vec_IntTwoMerge2( vUnate0, vUnate1, Vec_WecEntry(vUnates, i) );
89 vUnate0 = Gia_ObjFaninC0(pObj) ? Vec_IntFlopBit(vUnate0) : vUnate0;
90 vUnate1 = Gia_ObjFaninC1(pObj) ? Vec_IntFlopBit(vUnate1) : vUnate1;
91 }
92 Vec_IntForEachEntry( vCoVec, CioId, i )
93 {
94 pObj = Gia_ManCo( p, CioId );
95 vUnate0 = Vec_WecEntry(vUnates, Gia_ObjFaninId0p(p, pObj));
96 vUnate0 = Gia_ObjFaninC0(pObj) ? Vec_IntFlopBit(vUnate0) : vUnate0;
97 Vec_IntAppend( Vec_WecEntry(vUnatesCo, i), vUnate0 );
98 vUnate0 = Gia_ObjFaninC0(pObj) ? Vec_IntFlopBit(vUnate0) : vUnate0;
99 }
100 Vec_WecFree( vUnates );
101 Vec_IntFree( vCiVec );
102 Vec_IntFree( vCoVec );
103 return vUnatesCo;
104}
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Definition bblif.c:37
#define Gia_ManForEachAnd(p, pObj, i)
Definition gia.h:1214
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
Definition vecInt.h:54
typedefABC_NAMESPACE_HEADER_START struct Vec_Wec_t_ Vec_Wec_t
INCLUDES ///.
Definition vecWec.h:42
Here is the caller graph for this function:

◆ Gia_ManCheckUnateVecTest()

void Gia_ManCheckUnateVecTest ( Gia_Man_t * p,
int fVerbose )

Function*************************************************************

Synopsis [Testing procedure for all pairs.]

Description []

SideEffects []

SeeAlso []

Definition at line 164 of file giaUnate.c.

165{
166 abctime clk = Abc_Clock();
167 Vec_Wec_t * vUnates = Gia_ManCheckUnateVec( p, NULL, NULL );
168 int i, o, Var, nVars = Gia_ManCiNum(p);
169 int nUnate = 0, nNonUnate = 0;
170 char * pBuffer = ABC_CALLOC( char, nVars+1 );
171 if ( fVerbose )
172 {
173 printf( "Inputs : " );
174 for ( i = 0; i < nVars; i++ )
175 printf( "%d", i % 10 );
176 printf( "\n" );
177 }
178 for ( o = 0; o < Gia_ManCoNum(p); o++ )
179 {
180 Vec_Int_t * vUnate = Vec_WecEntry( vUnates, o );
181 memset( pBuffer, ' ', (size_t)nVars );
182 Vec_IntForEachEntry( vUnate, Var, i )
183 if ( i+1 < Vec_IntSize(vUnate) && Abc_Lit2Var(Var) == Abc_Lit2Var(Vec_IntEntry(vUnate, i+1)) ) // both lits are present
184 pBuffer[Abc_Lit2Var(Var)] = '.', i++, nNonUnate++; // does not depend on this var
185 else
186 pBuffer[Abc_Lit2Var(Var)] = Abc_LitIsCompl(Var) ? 'n' : 'p', nUnate++;
187 if ( fVerbose )
188 printf( "Out%4d : %s\n", o, pBuffer );
189 }
190 ABC_FREE( pBuffer );
191 // print stats
192 printf( "Ins/Outs = %4d/%4d. Total supp = %5d. Total unate = %5d.\n",
193 Gia_ManCiNum(p), Gia_ManCoNum(p), nUnate+nNonUnate, nUnate );
194 ABC_PRT( "Total time", Abc_Clock() - clk );
195 //Vec_WecPrint( vUnates, 0 );
196 Vec_WecFree( vUnates );
197}
int Var
Definition exorList.c:228
Vec_Wec_t * Gia_ManCheckUnateVec(Gia_Man_t *p, Vec_Int_t *vCiIds, Vec_Int_t *vCoIds)
Definition giaUnate.c:69
char * memset()
Here is the call graph for this function:
Here is the caller graph for this function: