Improvements to representation of choices.

This commit is contained in:
Alan Mishchenko 2014-07-01 13:05:09 -07:00
parent 6bc381baa3
commit afcec52a49
15 changed files with 259 additions and 66 deletions

View File

@ -729,10 +729,154 @@ SOURCE=.\src\base\test\test.c
# Begin Group "abc2"
# PROP Default_Filter ""
# Begin Source File
SOURCE=.\src\base\abc2\abc2.c
# End Source File
# Begin Source File
SOURCE=.\src\base\abc2\abc2.h
# End Source File
# Begin Source File
SOURCE=.\src\base\abc2\abc2_.c
# End Source File
# Begin Source File
SOURCE=.\src\base\abc2\abc2Blifi.c
# End Source File
# Begin Source File
SOURCE=.\src\base\abc2\abc2Blifo.c
# End Source File
# Begin Source File
SOURCE=.\src\base\abc2\abc2Core.c
# End Source File
# Begin Source File
SOURCE=.\src\base\abc2\abc2Dup.c
# End Source File
# Begin Source File
SOURCE=.\src\base\abc2\abc2Equiv.c
# End Source File
# Begin Source File
SOURCE=.\src\base\abc2\abc2Extract.c
# End Source File
# Begin Source File
SOURCE=.\src\base\abc2\abc2Flatten.c
# End Source File
# Begin Source File
SOURCE=.\src\base\abc2\abc2Func.c
# End Source File
# Begin Source File
SOURCE=.\src\base\abc2\abc2Fx.c
# End Source File
# Begin Source File
SOURCE=.\src\base\abc2\abc2Gia.c
# End Source File
# Begin Source File
SOURCE=.\src\base\abc2\abc2Hash.c
# End Source File
# Begin Source File
SOURCE=.\src\base\abc2\abc2Insert.c
# End Source File
# Begin Source File
SOURCE=.\src\base\abc2\abc2Logic.c
# End Source File
# Begin Source File
SOURCE=.\src\base\abc2\abc2Map.c
# End Source File
# Begin Source File
SOURCE=.\src\base\abc2\abc2Merge.c
# End Source File
# Begin Source File
SOURCE=.\src\base\abc2\abc2Mfs.c
# End Source File
# Begin Source File
SOURCE=.\src\base\abc2\abc2Multi.c
# End Source File
# Begin Source File
SOURCE=.\src\base\abc2\abc2Ntk.c
# End Source File
# Begin Source File
SOURCE=.\src\base\abc2\abc2Part.c
# End Source File
# Begin Source File
SOURCE=.\src\base\abc2\abc2Print.c
# End Source File
# Begin Source File
SOURCE=.\src\base\abc2\abc2Rec.c
# End Source File
# Begin Source File
SOURCE=.\src\base\abc2\abc2Slack.c
# End Source File
# Begin Source File
SOURCE=.\src\base\abc2\abc2Strash.c
# End Source File
# Begin Source File
SOURCE=.\src\base\abc2\abc2Time.c
# End Source File
# Begin Source File
SOURCE=.\src\base\abc2\abc2Truth.c
# End Source File
# Begin Source File
SOURCE=.\src\base\abc2\abc2Util.c
# End Source File
# Begin Source File
SOURCE=.\src\base\abc2\abc2Veri.c
# End Source File
# Begin Source File
SOURCE=.\src\base\abc2\abc2Verify.c
# End Source File
# Begin Source File
SOURCE=.\src\base\abc2\abc2Vero.c
# End Source File
# End Group
# Begin Group "abc2d"
# PROP Default_Filter ""
# Begin Source File
SOURCE=.\src\base\abc2d\abc2d.c
# End Source File
# Begin Source File
SOURCE=.\src\base\abc2d\magic.c
# End Source File
# Begin Source File
SOURCE=.\src\base\abc2d\magic.h
# End Source File
# Begin Source File
SOURCE=.\src\base\abc2d\util.c
# End Source File
# End Group
# End Group
# Begin Group "bdd"

View File

@ -268,6 +268,7 @@ struct Jf_Par_t_
int fCnfObjIds;
int fAddOrCla;
int fPureAig;
int fDoAverage;
int fCutHashing;
int fCutSimple;
int fVerbose;
@ -279,6 +280,8 @@ struct Jf_Par_t_
word Area;
word Edge;
word Clause;
float * pTimesArr;
float * pTimesReq;
};
static inline unsigned Gia_ObjCutSign( unsigned ObjId ) { return (1 << (ObjId & 31)); }
@ -368,6 +371,7 @@ static inline int Gia_ManCandNum( Gia_Man_t * p ) { return Gia_ManC
static inline int Gia_ManConstrNum( Gia_Man_t * p ) { return p->nConstrs; }
static inline void Gia_ManFlipVerbose( Gia_Man_t * p ) { p->fVerbose ^= 1; }
static inline int Gia_ManHasChoices( Gia_Man_t * p ) { return p->pSibls != NULL; }
static inline int Gia_ManChoiceNum( Gia_Man_t * p ) { int c = 0; if (p->pSibls) { int i; for (i = 0; i < p->nObjs; i++) c += (int)(p->pSibls[i] > 0); } return c; }
static inline Gia_Obj_t * Gia_ManConst0( Gia_Man_t * p ) { return p->pObjs; }
static inline Gia_Obj_t * Gia_ManConst1( Gia_Man_t * p ) { return Gia_Not(Gia_ManConst0(p)); }
@ -1155,6 +1159,7 @@ extern int Gia_ManLutLevel( Gia_Man_t * p );
extern void Gia_ManSetRefsMapped( Gia_Man_t * p );
extern void Gia_ManSetIfParsDefault( void * pIfPars );
extern void Gia_ManMappingVerify( Gia_Man_t * p );
extern void Gia_ManTransferMapping( Gia_Man_t * pGia, Gia_Man_t * p );
extern Gia_Man_t * Gia_ManPerformMapping( Gia_Man_t * p, void * pIfPars, int fNormalized );
/*=== giaJf.c ===========================================================*/
extern void Jf_ManSetDefaultPars( Jf_Par_t * pPars );
@ -1167,6 +1172,7 @@ extern Gia_Man_t * Gia_ManIsoReduce2( Gia_Man_t * p, Vec_Ptr_t ** pvPosE
/*=== giaLf.c ===========================================================*/
extern void Lf_ManSetDefaultPars( Jf_Par_t * pPars );
extern Gia_Man_t * Lf_ManPerformMapping( Gia_Man_t * pGia, Jf_Par_t * pPars );
extern Gia_Man_t * Gia_ManPerformLfMapping( Gia_Man_t * p, Jf_Par_t * pPars, int fNormalized );
/*=== giaLogic.c ===========================================================*/
extern void Gia_ManTestDistance( Gia_Man_t * p );
extern void Gia_ManSolveProblem( Gia_Man_t * pGia, Emb_Par_t * pPars );
@ -1306,7 +1312,7 @@ extern void Gia_ManCleanValue( Gia_Man_t * p );
extern void Gia_ManCleanLevels( Gia_Man_t * p, int Size );
extern void Gia_ManCleanTruth( Gia_Man_t * p );
extern void Gia_ManFillValue( Gia_Man_t * p );
extern void Gia_ObjSetPhase( Gia_Obj_t * pObj );
extern void Gia_ObjSetPhase( Gia_Man_t * p, Gia_Obj_t * pObj );
extern void Gia_ManSetPhase( Gia_Man_t * p );
extern void Gia_ManSetPhasePattern( Gia_Man_t * p, Vec_Int_t * vCiValues );
extern void Gia_ManSetPhase1( Gia_Man_t * p );

View File

@ -656,7 +656,7 @@ Gia_Man_t * Gia_AigerReadFromMemory( char * pContents, int nFileSize, int fSkipS
else if ( *pCur == 'q' )
{
int i, nPairs, iRepr, iNode;
assert( pNew->pSibls == NULL );
assert( !Gia_ManHasChoices(pNew) );
pNew->pSibls = ABC_CALLOC( int, Gia_ManObjNum(pNew) );
pCur++;
pCurTemp = pCur + Gia_AigerReadInt(pCur) + 4; pCur += 4;
@ -1239,7 +1239,7 @@ void Gia_AigerWrite( Gia_Man_t * pInit, char * pFileName, int fWriteSymbols, int
fwrite( p->pPlacement, 1, 4*Gia_ManObjNum(p), pFile );
}
// write choices
if ( p->pSibls )
if ( Gia_ManHasChoices(p) )
{
int i, nPairs = 0;
fprintf( pFile, "q" );

View File

@ -525,7 +525,7 @@ Gia_Man_t * Gia_ManDup( Gia_Man_t * p )
pNew = Gia_ManStart( Gia_ManObjNum(p) );
pNew->pName = Abc_UtilStrsav( p->pName );
pNew->pSpec = Abc_UtilStrsav( p->pSpec );
if ( p->pSibls )
if ( Gia_ManHasChoices(p) )
pNew->pSibls = ABC_CALLOC( int, Gia_ManObjNum(p) );
Gia_ManConst0(p)->Value = 0;
Gia_ManForEachObj1( p, pObj, i )
@ -975,7 +975,7 @@ Gia_Man_t * Gia_ManDupMarked( Gia_Man_t * p )
if ( p->pReprs && p->pNexts )
{
Gia_Obj_t * pRepr;
pNew->pReprs = ABC_CALLOC( Gia_Rpr_t, Gia_ManObjNum(p) );
pNew->pReprs = ABC_CALLOC( Gia_Rpr_t, Gia_ManObjNum(pNew) );
for ( i = 0; i < Gia_ManObjNum(p); i++ )
Gia_ObjSetRepr( pNew, i, GIA_VOID );
Gia_ManForEachObj1( p, pObj, i )
@ -985,7 +985,6 @@ Gia_Man_t * Gia_ManDupMarked( Gia_Man_t * p )
pRepr = Gia_ObjReprObj( p, i );
if ( pRepr == NULL )
continue;
// assert( ~pRepr->Value );
if ( !~pRepr->Value )
continue;
if ( Abc_Lit2Var(pObj->Value) != Abc_Lit2Var(pRepr->Value) )
@ -993,6 +992,23 @@ Gia_Man_t * Gia_ManDupMarked( Gia_Man_t * p )
}
pNew->pNexts = Gia_ManDeriveNexts( pNew );
}
if ( Gia_ManHasChoices(p) )
{
Gia_Obj_t * pSibl;
pNew->pSibls = ABC_CALLOC( int, Gia_ManObjNum(pNew) );
Gia_ManForEachObj1( p, pObj, i )
{
if ( !~pObj->Value )
continue;
pSibl = Gia_ObjSiblObj( p, i );
if ( pSibl == NULL )
continue;
if ( !~pSibl->Value )
continue;
assert( Abc_Lit2Var(pObj->Value) > Abc_Lit2Var(pSibl->Value) );
pNew->pSibls[Abc_Lit2Var(pObj->Value)] = Abc_Lit2Var(pSibl->Value);
}
}
return pNew;
}

View File

@ -597,8 +597,8 @@ If_Man_t * Gia_ManToIf( Gia_Man_t * p, If_Par_t * pPars )
// create levels with choices
Gia_ManChoiceLevel( p );
// mark representative nodes
if ( p->pSibls )
Gia_ManMarkFanoutDrivers( p );
if ( Gia_ManHasChoices(p) )
Gia_ManMarkFanoutDrivers( p );
// start the mapping manager and set its parameters
pIfMan = If_ManStart( pPars );
pIfMan->pName = Abc_UtilStrsav( Gia_ManName(p) );
@ -640,8 +640,8 @@ If_Man_t * Gia_ManToIf( Gia_Man_t * p, If_Par_t * pPars )
}
// assert( If_ObjLevel(pIfObj) == Gia_ObjLevel(pNode) );
}
if ( p->pSibls )
Gia_ManCleanMark0( p );
if ( Gia_ManHasChoices(p) )
Gia_ManCleanMark0( p );
return pIfMan;
}

View File

@ -52,6 +52,10 @@ Gia_Man_t * Lf_ManPerformMapping( Gia_Man_t * pGia, Jf_Par_t * pPars )
{
return Jf_ManPerformMapping( pGia, pPars );
}
Gia_Man_t * Gia_ManPerformLfMapping( Gia_Man_t * p, Jf_Par_t * pPars, int fNormalized )
{
return Jf_ManPerformMapping( p, pPars );
}
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///

View File

@ -424,8 +424,8 @@ void Gia_ManPrintStats( Gia_Man_t * p, Gps_Par_t * pPars )
if ( pPars && pPars->fCut )
Abc_Print( 1, " cut = %d(%d)", Gia_ManCrossCut(p, 0), Gia_ManCrossCut(p, 1) );
Abc_Print( 1, " mem =%5.2f MB", Gia_ManMemory(p)/(1<<20) );
if ( Gia_ManHasDangling(p) )
Abc_Print( 1, " ch =%5d", Gia_ManEquivCountClasses(p) );
if ( Gia_ManHasChoices(p) )
Abc_Print( 1, " ch =%5d", Gia_ManChoiceNum(p) );
if ( pPars && pPars->fMuxXor )
printf( "\nXOR/MUX " ), Gia_ManPrintMuxStats( p );
if ( pPars && pPars->fSwitch )
@ -445,8 +445,6 @@ void Gia_ManPrintStats( Gia_Man_t * p, Gps_Par_t * pPars )
// Gia_ManSatExperiment( p );
if ( p->pReprs && p->pNexts )
Gia_ManEquivPrintClasses( p, 0, 0.0 );
if ( p->pSibls )
Gia_ManPrintChoiceStats( p );
if ( Gia_ManHasMapping(p) && (pPars == NULL || !pPars->fSkipMap) )
Gia_ManPrintMappingStats( p, pPars ? pPars->pDumpFile : NULL );
if ( pPars && pPars->fNpn && Gia_ManHasMapping(p) && Gia_ManLutSizeMax(p) <= 4 )

View File

@ -646,7 +646,7 @@ static inline void Mf_CutPrint( Mf_Man_t * p, Mf_Cut_t * pCut )
else
printf( "\n" );
}
static inline int Mf_ManPrepareCuts( Mf_Cut_t * pCuts, Mf_Man_t * p, int iObj )
static inline int Mf_ManPrepareCuts( Mf_Cut_t * pCuts, Mf_Man_t * p, int iObj, int fAddUnit )
{
if ( Mf_ManObj(p, iObj)->iCutSet )
{
@ -662,7 +662,7 @@ static inline int Mf_ManPrepareCuts( Mf_Cut_t * pCuts, Mf_Man_t * p, int iObj )
memcpy( pMfCut->pLeaves, pCut+1, sizeof(int) * Mf_CutSize(pCut) );
pMfCut++;
}
if ( pCuts->nLeaves > 1 )
if ( fAddUnit && pCuts->nLeaves > 1 )
return pList[0] + Mf_CutCreateUnit( pMfCut, iObj );
return pList[0];
}
@ -969,18 +969,35 @@ void Mf_ObjMergeOrder( Mf_Man_t * p, int iObj )
Mf_Obj_t * pBest = Mf_ManObj(p, iObj);
int nLutSize = p->pPars->nLutSize;
int nCutNum = p->pPars->nCutNum;
int nCuts0 = Mf_ManPrepareCuts(pCuts0, p, Gia_ObjFaninId0(pObj, iObj));
int nCuts1 = Mf_ManPrepareCuts(pCuts1, p, Gia_ObjFaninId1(pObj, iObj));
int nCuts0 = Mf_ManPrepareCuts(pCuts0, p, Gia_ObjFaninId0(pObj, iObj), 1);
int nCuts1 = Mf_ManPrepareCuts(pCuts1, p, Gia_ObjFaninId1(pObj, iObj), 1);
int fComp0 = Gia_ObjFaninC0(pObj);
int fComp1 = Gia_ObjFaninC1(pObj);
int iSibl = Gia_ObjSibl(p->pGia, iObj);
Mf_Cut_t * pCut0, * pCut1, * pCut0Lim = pCuts0 + nCuts0, * pCut1Lim = pCuts1 + nCuts1;
int i, nCutsR = 0;
for ( i = 0; i < nCutNum; i++ )
pCutsR[i] = pCuts + i;
if ( iSibl )
{
Mf_Cut_t pCuts2[MF_CUT_MAX];
Gia_Obj_t * pObjE = Gia_ObjSiblObj(p->pGia, iObj);
int fCompE = Gia_ObjPhase(pObj) ^ Gia_ObjPhase(pObjE);
int nCuts2 = Mf_ManPrepareCuts(pCuts2, p, iSibl, 0);
Mf_Cut_t * pCut2, * pCut2Lim = pCuts2 + nCuts2;
for ( pCut2 = pCuts2; pCut2 < pCut2Lim; pCut2++ )
{
*pCutsR[nCutsR] = *pCut2;
if ( pCutsR[nCutsR]->iFunc >= 0 )
pCutsR[nCutsR]->iFunc = Abc_LitNotCond( pCutsR[nCutsR]->iFunc, fCompE );
Mf_CutParams( p, pCutsR[nCutsR], pBest->nFlowRefs );
nCutsR = Mf_SetAddCut( pCutsR, nCutsR, nCutNum );
}
}
if ( Gia_ObjIsMuxId(p->pGia, iObj) )
{
Mf_Cut_t pCuts2[MF_CUT_MAX];
int nCuts2 = Mf_ManPrepareCuts(pCuts2, p, Gia_ObjFaninId2(p->pGia, iObj));
int nCuts2 = Mf_ManPrepareCuts(pCuts2, p, Gia_ObjFaninId2(p->pGia, iObj), 1);
int fComp2 = Gia_ObjFaninC2(p->pGia, pObj);
Mf_Cut_t * pCut2, * pCut2Lim = pCuts2 + nCuts2;
p->CutCount[0] += nCuts0 * nCuts1 * nCuts2;
@ -1309,6 +1326,8 @@ Mf_Man_t * Mf_ManAlloc( Gia_Man_t * pGia, Jf_Par_t * pPars )
assert( pPars->nLutSize > 1 && pPars->nLutSize <= MF_LEAF_MAX );
ABC_FREE( pGia->pRefs );
Vec_IntFreeP( &pGia->vMapping );
if ( Gia_ManHasChoices(pGia) )
Gia_ManSetPhase(pGia);
p = ABC_CALLOC( Mf_Man_t, 1 );
p->clkStart = Abc_Clock();
p->pGia = pGia;
@ -1557,6 +1576,8 @@ Gia_Man_t * Mf_ManPerformMapping( Gia_Man_t * pGia, Jf_Par_t * pPars )
Gia_Man_t * pNew, * pCls;
if ( pPars->fGenCnf )
pPars->fCutMin = 1;
if ( Gia_ManHasChoices(pGia) )
pPars->fCutMin = 1, pPars->fCoarsen = 0;
pCls = pPars->fCoarsen ? Gia_ManDupMuxes(pGia, pPars->nCoarseLimit) : pGia;
p = Mf_ManAlloc( pCls, pPars );
p->pGia0 = pGia;

View File

@ -96,7 +96,7 @@ void Gia_ManPrintMuxStats( Gia_Man_t * p )
Gia_Man_t * Gia_ManDupMuxes( Gia_Man_t * p, int Limit )
{
Gia_Man_t * pNew, * pTemp;
Gia_Obj_t * pObj, * pFan0, * pFan1, * pFanC;
Gia_Obj_t * pObj, * pFan0, * pFan1, * pFanC, * pSiblNew, * pObjNew;
int i;
assert( p->pMuxes == NULL );
assert( Limit >= 2 );
@ -107,27 +107,17 @@ Gia_Man_t * Gia_ManDupMuxes( Gia_Man_t * p, int Limit )
pNew->pName = Abc_UtilStrsav( p->pName );
pNew->pSpec = Abc_UtilStrsav( p->pSpec );
pNew->pMuxes = ABC_CALLOC( unsigned, pNew->nObjsAlloc );
// create constant
if ( Gia_ManHasChoices(p) )
pNew->pSibls = ABC_CALLOC( int, pNew->nObjsAlloc );
Gia_ManConst0(p)->Value = 0;
// create PIs
Gia_ManForEachCi( p, pObj, i )
pObj->Value = Gia_ManAppendCi( pNew );
// create internal nodes
Gia_ManHashStart( pNew );
Gia_ManForEachAnd( p, pObj, i )
Gia_ManForEachObj1( p, pObj, i )
{
/*
if ( !Gia_ObjIsMuxType(pObj) || Gia_ObjRefNum(p, Gia_ObjFanin0(pObj)) + Gia_ObjRefNum(p, Gia_ObjFanin1(pObj)) > Limit )
pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
else if ( Gia_ObjRecognizeExor(pObj, &pFan0, &pFan1) )
pObj->Value = Gia_ManHashXorReal( pNew, Gia_ObjLitCopy(p, Gia_ObjToLit(p, pFan0)), Gia_ObjLitCopy(p, Gia_ObjToLit(p, pFan1)) );
else
{
pFanC = Gia_ObjRecognizeMux( pObj, &pFan1, &pFan0 );
pObj->Value = Gia_ManHashMuxReal( pNew, Gia_ObjLitCopy(p, Gia_ObjToLit(p, pFanC)), Gia_ObjLitCopy(p, Gia_ObjToLit(p, pFan1)), Gia_ObjLitCopy(p, Gia_ObjToLit(p, pFan0)) );
}
*/
if ( !Gia_ObjIsMuxType(pObj) )
if ( Gia_ObjIsCi(pObj) )
pObj->Value = Gia_ManAppendCi( pNew );
else if ( Gia_ObjIsCo(pObj) )
pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
else if ( !Gia_ObjIsMuxType(pObj) || Gia_ObjSibl(p, Gia_ObjFaninId0(pObj, i)) || Gia_ObjSibl(p, Gia_ObjFaninId1(pObj, i)) )
pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
else if ( Gia_ObjRecognizeExor(pObj, &pFan0, &pFan1) )
pObj->Value = Gia_ManHashXorReal( pNew, Gia_ObjLitCopy(p, Gia_ObjToLit(p, pFan0)), Gia_ObjLitCopy(p, Gia_ObjToLit(p, pFan1)) );
@ -138,11 +128,14 @@ Gia_Man_t * Gia_ManDupMuxes( Gia_Man_t * p, int Limit )
pFanC = Gia_ObjRecognizeMux( pObj, &pFan1, &pFan0 );
pObj->Value = Gia_ManHashMuxReal( pNew, Gia_ObjLitCopy(p, Gia_ObjToLit(p, pFanC)), Gia_ObjLitCopy(p, Gia_ObjToLit(p, pFan1)), Gia_ObjLitCopy(p, Gia_ObjToLit(p, pFan0)) );
}
if ( !Gia_ObjSibl(p, i) )
continue;
pObjNew = Gia_ManObj( pNew, Abc_Lit2Var(pObj->Value) );
pSiblNew = Gia_ManObj( pNew, Abc_Lit2Var(Gia_ObjSiblObj(p, i)->Value) );
if ( Gia_ObjIsAnd(pObjNew) && Gia_ObjIsAnd(pSiblNew) && Gia_ObjId(pNew, pObjNew) > Gia_ObjId(pNew, pSiblNew) )
pNew->pSibls[Gia_ObjId(pNew, pObjNew)] = Gia_ObjId(pNew, pSiblNew);
}
Gia_ManHashStop( pNew );
// create ROs
Gia_ManForEachCo( p, pObj, i )
pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
// perform cleanup
pNew = Gia_ManCleanup( pTemp = pNew );
@ -171,16 +164,15 @@ Gia_Man_t * Gia_ManDupNoMuxes( Gia_Man_t * p )
pNew = Gia_ManStart( 5000 );
pNew->pName = Abc_UtilStrsav( p->pName );
pNew->pSpec = Abc_UtilStrsav( p->pSpec );
// create constant
Gia_ManConst0(p)->Value = 0;
// create PIs
Gia_ManForEachCi( p, pObj, i )
pObj->Value = Gia_ManAppendCi( pNew );
// create internal nodes
Gia_ManHashStart( pNew );
Gia_ManForEachAnd( p, pObj, i )
Gia_ManForEachObj1( p, pObj, i )
{
if ( Gia_ObjIsMuxId(p, i) )
if ( Gia_ObjIsCi(pObj) )
pObj->Value = Gia_ManAppendCi( pNew );
else if ( Gia_ObjIsCo(pObj) )
pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
else if ( Gia_ObjIsMuxId(p, i) )
pObj->Value = Gia_ManHashMux( pNew, Gia_ObjFanin2Copy(p, pObj), Gia_ObjFanin1Copy(pObj), Gia_ObjFanin0Copy(pObj) );
else if ( Gia_ObjIsXor(pObj) )
pObj->Value = Gia_ManHashXor( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
@ -188,9 +180,6 @@ Gia_Man_t * Gia_ManDupNoMuxes( Gia_Man_t * p )
pObj->Value = Gia_ManHashAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
}
Gia_ManHashStop( pNew );
// create ROs
Gia_ManForEachCo( p, pObj, i )
pObj->Value = Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
Gia_ManSetRegNum( pNew, Gia_ManRegNum(p) );
// perform cleanup
pNew = Gia_ManCleanup( pTemp = pNew );

View File

@ -53,6 +53,7 @@ int Gia_ManCombMarkUsed_rec( Gia_Man_t * p, Gia_Obj_t * pObj )
return 1 + Gia_ManCombMarkUsed_rec( p, Gia_ObjFanin0(pObj) )
+ Gia_ManCombMarkUsed_rec( p, Gia_ObjFanin1(pObj) )
+ (p->pNexts ? Gia_ManCombMarkUsed_rec( p, Gia_ObjNextObj(p, Gia_ObjId(p, pObj)) ) : 0)
+ (p->pSibls ? Gia_ManCombMarkUsed_rec( p, Gia_ObjSiblObj(p, Gia_ObjId(p, pObj)) ) : 0)
+ (p->pMuxes ? Gia_ManCombMarkUsed_rec( p, Gia_ObjFanin2(p, pObj) ) : 0);
}

View File

@ -208,7 +208,7 @@ Gia_Man_t * Gia_ManDupUnnormalize( Gia_Man_t * p )
pNew = Gia_ManStart( Gia_ManObjNum(p) );
pNew->pName = Abc_UtilStrsav( p->pName );
pNew->pSpec = Abc_UtilStrsav( p->pSpec );
if ( p->pSibls )
if ( Gia_ManHasChoices(p) )
pNew->pSibls = ABC_CALLOC( int, Gia_ManObjNum(p) );
Gia_ManForEachObjVec( vNodes, p, pObj, i )
{
@ -297,7 +297,7 @@ Gia_Man_t * Gia_ManDupCollapse( Gia_Man_t * p, Gia_Man_t * pBoxes, Vec_Int_t * v
pNew = Gia_ManStart( Gia_ManObjNum(p) );
pNew->pName = Abc_UtilStrsav( p->pName );
pNew->pSpec = Abc_UtilStrsav( p->pSpec );
if ( p->pSibls )
if ( Gia_ManHasChoices(p) )
pNew->pSibls = ABC_CALLOC( int, Gia_ManObjNum(p) );
Gia_ManHashAlloc( pNew );
// copy const and real PIs

View File

@ -343,12 +343,22 @@ void Gia_ManFillValue( Gia_Man_t * p )
SeeAlso []
***********************************************************************/
void Gia_ObjSetPhase( Gia_Obj_t * pObj )
void Gia_ObjSetPhase( Gia_Man_t * p, Gia_Obj_t * pObj )
{
assert( !Gia_ObjIsXor(pObj) );
if ( Gia_ObjIsAnd(pObj) )
pObj->fPhase = (Gia_ObjPhase(Gia_ObjFanin0(pObj)) ^ Gia_ObjFaninC0(pObj)) &
(Gia_ObjPhase(Gia_ObjFanin1(pObj)) ^ Gia_ObjFaninC1(pObj));
{
int fPhase0 = Gia_ObjPhase(Gia_ObjFanin0(pObj)) ^ Gia_ObjFaninC0(pObj);
int fPhase1 = Gia_ObjPhase(Gia_ObjFanin1(pObj)) ^ Gia_ObjFaninC1(pObj);
if ( Gia_ObjIsMux(p, pObj) )
{
int fPhase2 = Gia_ObjPhase(Gia_ObjFanin2(p, pObj)) ^ Gia_ObjFaninC2(p, pObj);
pObj->fPhase = (fPhase2 & fPhase1) | (!fPhase2 & fPhase0);
}
else if ( Gia_ObjIsXor(pObj) )
pObj->fPhase = fPhase0 ^ fPhase1;
else
pObj->fPhase = fPhase0 & fPhase1;
}
else if ( Gia_ObjIsCo(pObj) )
pObj->fPhase = (Gia_ObjPhase(Gia_ObjFanin0(pObj)) ^ Gia_ObjFaninC0(pObj));
else
@ -371,7 +381,7 @@ void Gia_ManSetPhase( Gia_Man_t * p )
Gia_Obj_t * pObj;
int i;
Gia_ManForEachObj( p, pObj, i )
Gia_ObjSetPhase( pObj );
Gia_ObjSetPhase( p, pObj );
}
void Gia_ManSetPhasePattern( Gia_Man_t * p, Vec_Int_t * vCiValues )
{
@ -382,7 +392,7 @@ void Gia_ManSetPhasePattern( Gia_Man_t * p, Vec_Int_t * vCiValues )
if ( Gia_ObjIsCi(pObj) )
pObj->fPhase = Vec_IntEntry( vCiValues, Gia_ObjCioId(pObj) );
else
Gia_ObjSetPhase( pObj );
Gia_ObjSetPhase( p, pObj );
}
/**Function*************************************************************
@ -404,7 +414,7 @@ void Gia_ManSetPhase1( Gia_Man_t * p )
pObj->fPhase = 1;
Gia_ManForEachObj( p, pObj, i )
if ( !Gia_ObjIsCi(pObj) )
Gia_ObjSetPhase( pObj );
Gia_ObjSetPhase( p, pObj );
}
/**Function*************************************************************

View File

@ -31112,7 +31112,7 @@ int Abc_CommandAbc9Lf( Abc_Frame_t * pAbc, int argc, char ** argv )
Gia_Man_t * pNew; int c;
Lf_ManSetDefaultPars( pPars );
Extra_UtilGetoptReset();
while ( ( c = Extra_UtilGetopt( argc, argv, "KCFARLDWaekmupgvwh" ) ) != EOF )
while ( ( c = Extra_UtilGetopt( argc, argv, "KCFARLDWaekmupgtvwh" ) ) != EOF )
{
switch ( c )
{
@ -31231,6 +31231,9 @@ int Abc_CommandAbc9Lf( Abc_Frame_t * pAbc, int argc, char ** argv )
case 'g':
pPars->fPureAig ^= 1;
break;
case 't':
pPars->fDoAverage ^= 1;
break;
case 'v':
pPars->fVerbose ^= 1;
break;
@ -31263,7 +31266,7 @@ usage:
sprintf(Buffer, "best possible" );
else
sprintf(Buffer, "%d", pPars->DelayTarget );
Abc_Print( -2, "usage: &lf [-KCFARLD num] [-akmupgvwh]\n" );
Abc_Print( -2, "usage: &lf [-KCFARLD num] [-kmupgtvwh]\n" );
Abc_Print( -2, "\t performs technology mapping of the network\n" );
Abc_Print( -2, "\t-K num : LUT size for the mapping (2 <= K <= %d) [default = %d]\n", pPars->nLutSizeMax, pPars->nLutSize );
Abc_Print( -2, "\t-C num : the max number of priority cuts (1 <= C <= %d) [default = %d]\n", pPars->nCutNumMax, pPars->nCutNum );
@ -31272,13 +31275,14 @@ usage:
Abc_Print( -2, "\t-R num : the delay relaxation ratio (num >= 0) [default = %d]\n", pPars->nRelaxRatio );
Abc_Print( -2, "\t-L num : the fanout limit for coarsening XOR/MUX (num >= 2) [default = %d]\n", pPars->nCoarseLimit );
Abc_Print( -2, "\t-D num : sets the delay constraint for the mapping [default = %s]\n", Buffer );
Abc_Print( -2, "\t-a : toggles area-oriented mapping [default = %s]\n", pPars->fAreaOnly? "yes": "no" );
// Abc_Print( -2, "\t-a : toggles area-oriented mapping [default = %s]\n", pPars->fAreaOnly? "yes": "no" );
Abc_Print( -2, "\t-e : toggles edge vs node minimization [default = %s]\n", pPars->fOptEdge? "yes": "no" );
Abc_Print( -2, "\t-k : toggles coarsening the subject graph [default = %s]\n", pPars->fCoarsen? "yes": "no" );
Abc_Print( -2, "\t-m : toggles cut minimization [default = %s]\n", pPars->fCutMin? "yes": "no" );
Abc_Print( -2, "\t-u : toggles using additional MUXes [default = %s]\n", pPars->fUseMux7? "yes": "no" );
Abc_Print( -2, "\t-p : toggles power-aware cut selection heuristics [default = %s]\n", pPars->fPower? "yes": "no" );
Abc_Print( -2, "\t-g : toggles generating AIG without mapping [default = %s]\n", pPars->fPureAig? "yes": "no" );
Abc_Print( -2, "\t-t : toggles optimizing average rather than maximum level [default = %s]\n", pPars->fDoAverage? "yes": "no" );
Abc_Print( -2, "\t-v : toggles verbose output [default = %s]\n", pPars->fVerbose? "yes": "no" );
Abc_Print( -2, "\t-w : toggles very verbose output [default = %s]\n", pPars->fVeryVerbose? "yes": "no" );
Abc_Print( -2, "\t-h : prints the command usage\n");

View File

@ -53,7 +53,7 @@ void Mig_ManCreateChoices( Mig_Man_t * pMig, Gia_Man_t * p )
Gia_ManMarkFanoutDrivers( p );
Gia_ManForEachObj( p, pObj, i )
{
Gia_ObjSetPhase( pObj );
Gia_ObjSetPhase( p, pObj );
assert( Abc_Lit2Var(pObj->Value) == i );
Mig_ObjSetPhase( Mig_ManObj(pMig, i), pObj->fPhase );
if ( Gia_ObjSibl(p, i) && pObj->fMark0 )
@ -104,7 +104,7 @@ Mig_Man_t * Mig_ManCreate( void * pGia )
else assert( 0 );
}
Mig_ManSetRegNum( pNew, Gia_ManRegNum(p) );
if ( p->pSibls )
if ( Gia_ManHasChoices(p) )
Mig_ManCreateChoices( pNew, p );
return pNew;
}

View File

@ -1288,7 +1288,7 @@ int Dar2_LibBuildBest_rec( Gia_Man_t * p, Dar_LibObj_t * pObj )
pNode = Gia_ManObj( p, Abc_Lit2Var(pData->iGunc) );
if ( Gia_ObjIsAnd( pNode ) )
Gia_ObjSetAndLevel( p, pNode );
Gia_ObjSetPhase( pNode );
Gia_ObjSetPhase( p, pNode );
return pData->iGunc;
}