55 if ( Dec_GraphIsConst(pGraph) )
56 return Abc_LitNotCond( 1, Dec_GraphIsComplement(pGraph) );
58 if ( Dec_GraphIsVar(pGraph) )
59 return Abc_LitNotCond( Dec_GraphVar(pGraph)->iFunc, Dec_GraphIsComplement(pGraph) );
63 iAnd0 = Abc_LitNotCond( Dec_GraphNode(pGraph, pNode->
eEdge0.Node)->iFunc, pNode->
eEdge0.fCompl );
64 iAnd1 = Abc_LitNotCond( Dec_GraphNode(pGraph, pNode->
eEdge1.Node)->iFunc, pNode->
eEdge1.fCompl );
68 return Abc_LitNotCond( pNode->
iFunc, Dec_GraphIsComplement(pGraph) );
72 int i, iAnd, iSum, Value, nFanins;
84 assert( Vec_IntEntry(vLeaves, i) >= 0 );
87 else if ( Value ==
'0' )
89 else assert( Value ==
'-' );
96 iSum = Abc_LitNot(iSum);
106 assert( Vec_IntEntry(vLeaves, i) >= 0 );
107 pFFNode->
iFunc = Vec_IntEntry(vLeaves, i);
122 Dec_GraphFree( pFForm );
145 nWords = Abc_Truth6WordNum( nCutSize );
146 vTruths = Vec_WrdAlloc(
nWords * nLutNum );
151 vLeaves.nCap = vLeaves.nSize = Gia_ObjLutSize(
p, i );
152 vLeaves.pArray = Gia_ObjLutFanins(
p, i );
153 if( !Vec_IntCheckUniqueSmall(&vLeaves) )
155 Vec_IntUniqify(&vLeaves);
156 Vec_IntWriteEntry(
p->vMapping, Vec_IntEntry(
p->vMapping, i), vLeaves.nSize);
157 for ( k = 0; k < vLeaves.nSize; k++ )
158 Vec_IntWriteEntry(
p->vMapping, Vec_IntEntry(
p->vMapping, i) + 1 + k, vLeaves.pArray[k]);
160 assert( Vec_IntCheckUniqueSmall(&vLeaves) );
161 Vec_IntSelectSort( Vec_IntArray(&vLeaves), Vec_IntSize(&vLeaves) );
163 Vec_IntReverseOrder( &vLeaves );
166 for ( k = 0; k <
nWords; k++ )
167 Vec_WrdPush( vTruths, pTruth[k] );
171 assert( Vec_WrdCap(vTruths) == 16 || Vec_WrdSize(vTruths) == Vec_WrdCap(vTruths) );
192 pObj->
Value = Counter++;
194 Gia_ManObj(
p, i)->Value = Counter++;
202 int nItems, nCutSize,
nWords;
203 int i, c, v, Lit,
Cube, Counter = 0;
208 nWords = Abc_Truth6WordNum( nCutSize );
210 vCover = Vec_IntAlloc( 1 << 16 );
212 vCubes = Vec_WecAlloc( 1000 );
213 *pvCompl = Vec_StrStart( nItems );
217 int nVars = Gia_ObjLutSize(
p, i );
218 int * pVars = Gia_ObjLutFanins(
p, i );
219 word * pTruth = Vec_WrdEntryP( vTruths, Counter++ *
nWords );
220 Abc_TtFlipVar5( pTruth, nVars );
221 int Status =
Kit_TruthIsop( (
unsigned *)pTruth, nVars, vCover, 1 );
222 Abc_TtFlipVar5( pTruth, nVars );
223 if ( Vec_IntSize(vCover) == 0 || (Vec_IntSize(vCover) == 1 && Vec_IntEntry(vCover,0) == 0) )
225 Vec_StrWriteEntry( *pvCompl, pObj->
Value, (
char)(Vec_IntSize(vCover) == 0) );
226 vCube = Vec_WecPushLevel( vCubes );
227 Vec_IntPush( vCube, pObj->
Value );
230 Vec_StrWriteEntry( *pvCompl, pObj->
Value, (
char)Status );
233 vCube = Vec_WecPushLevel( vCubes );
234 Vec_IntPush( vCube, pObj->
Value );
235 for ( v = 0; v < nVars; v++ )
237 Lit = 3 & (
Cube >> (v << 1));
239 Vec_IntPush( vCube, Abc_Var2Lit(Gia_ManObj(
p, pVars[v])->Value, 1) );
241 Vec_IntPush( vCube, Abc_Var2Lit(Gia_ManObj(
p, pVars[v])->Value, 0) );
245 Vec_IntSelectSort( Vec_IntArray(vCube) + 1, Vec_IntSize(vCube) - 1 );
249 Vec_WrdFree( vTruths );
250 Vec_IntFree( vCover );
269 int iFirst = Vec_IntEntry( vFirst, iObj );
270 int nCubes = Vec_IntEntry( vCount, iObj );
271 assert( !Vec_IntEntry( vVisit, iObj ) );
272 Vec_IntWriteEntry( vVisit, iObj, 1 );
273 for ( c = 0; c < nCubes; c++ )
275 Vec_Int_t * vCube = Vec_WecEntry( vCubes, iFirst + c );
276 assert( Vec_IntEntry(vCube, 0) == iObj );
278 if ( !Vec_IntEntry( vVisit, Abc_Lit2Var(Lit) ) )
281 Vec_IntPush( vOrder, iObj );
285 Vec_Int_t * vOrder, * vFirst, * vCount, * vVisit, * vCube;
286 int i, iFanin, nNodeMax = -1;
289 nNodeMax = Abc_MaxInt( nNodeMax, Vec_IntEntry(vCube, 0) );
292 if ( nNodeMax == nStart )
298 vFirst = Vec_IntStart( nNodeMax );
299 vCount = Vec_IntStart( nNodeMax );
302 iFanin = Vec_IntEntry( vCube, 0 );
303 assert( iFanin >= nInputs );
304 if ( Vec_IntEntry(vCount, iFanin) == 0 )
305 Vec_IntWriteEntry( vFirst, iFanin, i );
306 Vec_IntAddToEntry( vCount, iFanin, 1 );
309 vOrder = Vec_IntStart( nInputs );
310 vVisit = Vec_IntStart( nNodeMax );
311 for ( i = 0; i < nInputs; i++ )
312 Vec_IntWriteEntry( vVisit, i, 1 );
313 for ( i = nInputs; i < nNodeMax; i++ )
314 if ( !Vec_IntEntry( vVisit, i ) )
316 assert( Vec_IntSize(vOrder) == nNodeMax );
317 Vec_IntFree( vVisit );
327 Vec_Int_t * vOrder, * vFirst, * vCount, * vFanins, * vCover;
329 int k, c, v, Lit,
Var, iItem;
332 vOrder =
Gia_ManFxTopoOrder( vCubes, Gia_ManCiNum(
p), Vec_StrSize(vCompls), &vFirst, &vCount );
333 if ( vOrder == NULL )
335 assert( Vec_IntSize(vOrder) > Vec_StrSize(vCompls) );
338 pNew->
pName = Abc_UtilStrsav(
p->pName );
339 pNew->
pSpec = Abc_UtilStrsav(
p->pSpec );
340 pNew->
vLevels = Vec_IntStart( 6*Gia_ManObjNum(
p)/5 + 100 );
343 vMap = Vec_IntStartFull( Vec_IntSize(vOrder) );
344 vCopies = Vec_IntAlloc( Vec_IntSize(vOrder) );
346 Vec_IntPush( vCopies, Gia_ManAppendCi(pNew) );
347 Vec_IntFillExtra( vCopies, Vec_IntSize(vOrder), -1 );
349 vSop = Vec_StrAlloc( 1000 );
350 vCover = Vec_IntAlloc( 1 << 16 );
351 vFanins = Vec_IntAlloc( 100 );
354 int iFirst = Vec_IntEntry( vFirst, iItem );
355 int nCubes = Vec_IntEntry( vCount, iItem );
357 Vec_IntClear( vFanins );
358 for ( c = 0; c < nCubes; c++ )
360 vCube = Vec_WecEntry( vCubes, iFirst + c );
362 if ( Vec_IntEntry(vMap, Abc_Lit2Var(Lit)) == -1 )
364 Vec_IntWriteEntry( vMap, Abc_Lit2Var(Lit), Vec_IntSize(vFanins) );
365 Vec_IntPush( vFanins, Abc_Lit2Var(Lit) );
368 if ( Vec_IntSize(vFanins) > 6 )
371 Vec_StrClear( vSop );
372 for ( c = 0; c < nCubes; c++ )
374 for ( v = 0; v < Vec_IntSize(vFanins); v++ )
375 Vec_StrPush( vSop,
'-' );
376 vCube = Vec_WecEntry( vCubes, iFirst + c );
379 Lit = Abc_Lit2LitV( Vec_IntArray(vMap), Lit );
380 assert( Lit >= 0 && Abc_Lit2Var(Lit) < Vec_IntSize(vFanins) );
381 Vec_StrWriteEntry( vSop, Vec_StrSize(vSop) - Vec_IntSize(vFanins) + Abc_Lit2Var(Lit), (
char)(Abc_LitIsCompl(Lit)?
'0' :
'1') );
383 Vec_StrPush( vSop,
' ' );
384 Vec_StrPush( vSop,
'1' );
385 Vec_StrPush( vSop,
'\n' );
387 Vec_StrPush( vSop,
'\0' );
391 Vec_IntWriteEntry( vMap,
Var, -1 );
392 Vec_IntWriteEntry( vFanins, v, Vec_IntEntry(vCopies,
Var) );
399 word uTruth = 0, uCube;
400 for ( c = 0; c < nCubes; c++ )
403 vCube = Vec_WecEntry( vCubes, iFirst + c );
406 Lit = Abc_Lit2LitV( Vec_IntArray(vMap), Lit );
407 assert( Lit >= 0 && Abc_Lit2Var(Lit) < Vec_IntSize(vFanins) );
408 uCube &= Abc_LitIsCompl(Lit) ? ~s_Truths6[Abc_Lit2Var(Lit)] : s_Truths6[Abc_Lit2Var(Lit)];
418 Vec_IntWriteEntry( vMap,
Var, -1 );
419 Vec_IntWriteEntry( vFanins, v, Vec_IntEntry(vCopies,
Var) );
425 Lit = Abc_LitNotCond( Lit, (iItem < Vec_StrSize(vCompls)) && (Vec_StrEntry(vCompls, iItem) > 0) );
427 assert( Vec_IntEntry(vCopies, iItem) == -1 );
428 Vec_IntWriteEntry( vCopies, iItem, Lit );
434 Lit = Gia_ObjFaninId0p(
p, pObj) ? Vec_IntEntry(vCopies, Gia_ObjFanin0(pObj)->Value) : 0;
435 Gia_ManAppendCo( pNew, Abc_LitNotCond( Lit, Gia_ObjFaninC0(pObj) ) );
439 Vec_IntFree( vOrder );
440 Vec_IntFree( vFirst );
441 Vec_IntFree( vCount );
442 Vec_IntFree( vFanins );
443 Vec_IntFree( vCopies );
446 Vec_IntFree( vCover );
467 extern int Fx_FastExtract(
Vec_Wec_t * vCubes,
int ObjIdMax,
int nNewNodesMax,
int LitCountMax,
int fCanonDivs,
int fVerbose,
int fVeryVerbose );
471 if ( Gia_ManAndNum(
p) == 0 )
478 assert( Gia_ManHasMapping(
p) );
483 Fx_FastExtract( vCubes, Vec_StrSize(vCompl), nNewNodesMax, LitCountMax, 0, fVerbose, fVeryVerbose );
489 Vec_WecFree( vCubes );
490 Vec_StrFree( vCompl );
int Fx_FastExtract(Vec_Wec_t *vCubes, int ObjIdMax, int nNewNodesMax, int LitCountMax, int fCanonDivs, int fVerbose, int fVeryVerbose)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
struct Vec_Str_t_ Vec_Str_t
int Dsm_ManTruthToGia(void *p, word *pTruth, Vec_Int_t *vLeaves, Vec_Int_t *vCover)
struct Dec_Node_t_ Dec_Node_t
#define Dec_GraphForEachLeaf(pGraph, pLeaf, i)
ITERATORS ///.
#define Dec_GraphForEachNode(pGraph, pAnd, i)
Dec_Graph_t * Dec_Factor(char *pSop)
FUNCTION DECLARATIONS ///.
struct Dec_Graph_t_ Dec_Graph_t
Gia_Man_t * Gia_ManFxInsert(Gia_Man_t *p, Vec_Wec_t *vCubes, Vec_Str_t *vCompls)
Gia_Man_t * Gia_ManPerformFx(Gia_Man_t *p, int nNewNodesMax, int LitCountMax, int fReverse, int fVerbose, int fVeryVerbose)
int Gia_ManSopToAig(Gia_Man_t *p, char *pSop, Vec_Int_t *vLeaves)
void Gia_ManFxTopoOrder_rec(Vec_Wec_t *vCubes, Vec_Int_t *vFirst, Vec_Int_t *vCount, Vec_Int_t *vVisit, Vec_Int_t *vOrder, int iObj)
int Gia_ManAssignNumbers(Gia_Man_t *p)
ABC_NAMESPACE_IMPL_START int Gia_ManGraphToAig(Gia_Man_t *p, Dec_Graph_t *pGraph)
DECLARATIONS ///.
Vec_Wec_t * Gia_ManFxRetrieve(Gia_Man_t *p, Vec_Str_t **pvCompl, int fReverse)
Vec_Int_t * Gia_ManFxTopoOrder(Vec_Wec_t *vCubes, int nInputs, int nStart, Vec_Int_t **pvFirst, Vec_Int_t **pvCount)
Vec_Wrd_t * Gia_ManComputeTruths(Gia_Man_t *p, int nCutSize, int nLutNum, int fReverse)
int Gia_ManFactorGraph(Gia_Man_t *p, Dec_Graph_t *pFForm, Vec_Int_t *vLeaves)
int Gia_ManFactorNode(Gia_Man_t *p, char *pSop, Vec_Int_t *vLeaves)
void Gia_ManStop(Gia_Man_t *p)
Gia_Man_t * Gia_ManDup(Gia_Man_t *p)
word * Gia_ObjComputeTruthTableCut(Gia_Man_t *p, Gia_Obj_t *pObj, Vec_Int_t *vLeaves)
void Gia_ManHashStart(Gia_Man_t *p)
void Gia_ManSetRegNum(Gia_Man_t *p, int nRegs)
#define Gia_ManForEachLut(p, i)
Gia_Man_t * Gia_ManStart(int nObjsMax)
FUNCTION DEFINITIONS ///.
int Gia_ManHashOr(Gia_Man_t *p, int iLit0, int iLit1)
struct Gia_Obj_t_ Gia_Obj_t
void Gia_ManFillValue(Gia_Man_t *p)
struct Gia_Man_t_ Gia_Man_t
Gia_Man_t * Gia_ManCleanup(Gia_Man_t *p)
void Gia_ObjComputeTruthTableStart(Gia_Man_t *p, int nVarsMax)
int Gia_ManLutSizeMax(Gia_Man_t *p)
void Gia_ManTransferTiming(Gia_Man_t *p, Gia_Man_t *pGia)
void Gia_ObjComputeTruthTableStop(Gia_Man_t *p)
int Gia_ManHashAnd(Gia_Man_t *p, int iLit0, int iLit1)
#define Gia_ManForEachCo(p, pObj, i)
#define Gia_ManForEachCi(p, pObj, i)
void Gia_ManHashStop(Gia_Man_t *p)
unsigned __int64 word
DECLARATIONS ///.
int Kit_TruthIsop(unsigned *puTruth, int nVars, Vec_Int_t *vMemory, int fTryBoth)
#define Kit_PlaForEachCube(pSop, nFanins, pCube)
int Kit_PlaGetVarNum(char *pSop)
int Kit_PlaGetCubeNum(char *pSop)
int Kit_PlaIsComplement(char *pSop)
int Kit_PlaIsConst0(char *pSop)
DECLARATIONS ///.
#define Kit_PlaCubeForEachVar(pCube, Value, i)
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
#define Vec_IntForEachEntryStart(vVec, Entry, i, Start)
#define Vec_WecForEachLevel(vGlob, vVec, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Wec_t_ Vec_Wec_t
INCLUDES ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Wrd_t_ Vec_Wrd_t
INCLUDES ///.