54 printf(
"%d ", Gia_ObjLevel(
p, pObj) );
90 if ( Gia_ManAndNum(
p) == 0 )
98 if ( fDelayMin &&
p->pManTime == NULL )
100 int Area0, Area1, Delay0, Delay1;
112 Area0 = (int)pPars->
Area;
113 Delay0 = (int)pPars->
Delay;
121 Area1 = (int)pPars->
Area;
122 Delay1 = (int)pPars->
Delay;
124 if ( Delay1 < Delay0 - 1 || (Delay1 == Delay0 + 1 && 100.0 * (Area1 - Area0) / Area1 < 3.0) )
132 Vec_IntFreeP( &
p->vMapping );
164 if ( Gia_ManAndNum(
p) == 0 )
201 if ( Gia_ManAndNum(
p) == 0 )
258 assert( Aig_ManCiNum(
p) == Gia_ManCiNum(pOrder) );
259 assert( Aig_ManCoNum(
p) == Gia_ManCoNum(pOrder) );
260 vPios = Vec_PtrAlloc( Aig_ManCiNum(
p) + Aig_ManCoNum(
p) );
263 if ( Gia_ObjIsCi(pObj) )
264 Vec_PtrPush( vPios, Aig_ManCi(
p, Gia_ObjCioId(pObj)) );
265 else if ( Gia_ObjIsCo(pObj) )
266 Vec_PtrPush( vPios, Aig_ManCo(
p, Gia_ObjCioId(pObj)) );
288 assert( Gia_ManBufNum(
p) > 0 );
289 assert( Gia_ManRegNum(
p) == 0 );
290 assert( !Gia_ManHasChoices(
p) );
292 pNew->
pName = Abc_UtilStrsav(
p->pName );
293 pNew->
pSpec = Abc_UtilStrsav(
p->pSpec );
295 Gia_ManConst0(
p)->Value = 0;
297 pObj->
Value = Gia_ManAppendCi( pNew );
298 vBufObjs = Vec_IntAlloc( Gia_ManBufNum(
p) );
299 for ( i = 0; i < Gia_ManBufNum(
p); i++ )
300 Vec_IntPush( vBufObjs, Gia_ManAppendCi(pNew) );
303 if ( Gia_ObjIsBuf(pObj) )
305 pObj->
Value = Vec_IntEntry( vBufObjs, k );
306 Vec_IntWriteEntry( vBufObjs, k++, Gia_ObjFanin0Copy(pObj) );
309 pObj->
Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
311 assert( k == Gia_ManBufNum(
p) );
312 for ( i = 0; i < Gia_ManBufNum(
p); i++ )
313 Gia_ManAppendCo( pNew, Vec_IntEntry(vBufObjs, i) );
314 Vec_IntFree( vBufObjs );
316 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
324 int nPiReal = Gia_ManCiNum(
p) - nBarBufs;
325 int nPoReal = Gia_ManCoNum(
p) - nBarBufs;
327 assert( Gia_ManBufNum(
p) == 0 );
328 assert( Gia_ManRegNum(
p) == 0 );
329 assert( Gia_ManHasChoices(
p) );
331 pNew->
pName = Abc_UtilStrsav(
p->pName );
332 pNew->
pSpec = Abc_UtilStrsav(
p->pSpec );
333 if ( Gia_ManHasChoices(
p) )
336 Gia_ManConst0(
p)->Value = 0;
337 for ( i = 0; i < nPiReal; i++ )
338 Gia_ManCi(
p, i)->Value = Gia_ManAppendCi( pNew );
341 for ( ; k < nBarBufs; k++ )
342 if ( ~Gia_ObjFanin0(Gia_ManCo(
p, k))->Value )
343 Gia_ManCi(
p, nPiReal + k)->Value = Gia_ManAppendBuf( pNew, Gia_ObjFanin0Copy(Gia_ManCo(
p, k)) );
346 pObj->
Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
347 if ( Gia_ObjSibl(
p, Gia_ObjId(
p, pObj)) )
348 pNew->
pSibls[Abc_Lit2Var(pObj->
Value)] = Abc_Lit2Var(Gia_ObjSiblObj(
p, Gia_ObjId(
p, pObj))->Value);
350 for ( ; k < nBarBufs; k++ )
351 if ( ~Gia_ObjFanin0Copy(Gia_ManCo(
p, k)) )
352 Gia_ManCi(
p, nPiReal + k)->Value = Gia_ManAppendBuf( pNew, Gia_ObjFanin0Copy(Gia_ManCo(
p, k)) );
354 for ( i = 0; i < nPoReal; i++ )
355 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(Gia_ManCo(
p, nBarBufs+i)) );
357 assert( Gia_ManBufNum(pNew) == nBarBufs );
358 assert( Gia_ManCiNum(pNew) == nPiReal );
359 assert( Gia_ManCoNum(pNew) == nPoReal );
379 Vec_Ptr_t * vPios, * vGias = Vec_PtrAlloc( 3 );
380 if ( pGia3 ) Vec_PtrPush( vGias, pGia3 );
381 if ( pGia2 ) Vec_PtrPush( vGias, pGia2 );
382 if ( pGia1 ) Vec_PtrPush( vGias, pGia1 );
384 Vec_PtrFree( vGias );
395 Vec_PtrFree( vPios );
405 Gia_Man_t * pGia1, * pGia2, * pGia3, * pNew, * pTemp;
406 int fVerbose = pParsDch->fVerbose;
417 if ( Gia_ManAndNum(pGia1) == 0 )
425 if ( Gia_ManHasMapping(pInit) )
432 if ( Gia_ManBufNum(pGia1) || 1 )
444 if ( pTemp != pGia2 )
447 if ( pParsDch->fLightSynth || Gia_ManBufNum(pGia2) )
451 assert( Gia_ManBufNum(pGia2) == 0 );
460 if ( Gia_ManBufNum(pInit) )
462 assert( Gia_ManBufNum(pInit) == Gia_ManBufNum(pGia1) );
465 assert( Gia_ManBufNum(pInit) == Gia_ManBufNum(pGia2) );
468 assert( Gia_ManBufNum(pInit) == Gia_ManBufNum(pGia3) );
476 if ( Gia_ManBufNum(pInit) )
501void Gia_ManPerformMap(
int nAnds,
int nLutSize,
int nCutNum,
int fMinAve,
int fUseMfs,
int fVerbose )
504 sprintf( Command,
"&unmap; &lf -K %d -C %d -k %s; &save", nLutSize, nCutNum, fMinAve?
"-t":
"" );
509 printf(
"MAPPING:\n" );
510 printf(
"Mapping with &lf -k:\n" );
513 sprintf( Command,
"&unmap; &lf -K %d -C %d %s; &save", nLutSize, nCutNum, fMinAve?
"-t":
"" );
517 printf(
"Mapping with &lf:\n" );
520 if ( (nLutSize == 4 && nAnds < 100000) || (nLutSize == 6 && nAnds < 2000) )
522 sprintf( Command,
"&unmap; &if -sz -S %d%d -K %d -C %d %s", nLutSize, nLutSize, 2*nLutSize-1, 2*nCutNum, fMinAve?
"-t":
"" );
528 printf(
"Mapping with &if -sz -S %d%d -K %d -C %d %s:\n", nLutSize, nLutSize, 2*nLutSize-1, 2*nCutNum, fMinAve?
"-t":
"" );
537 printf(
"Mapping final:\n" );
541void Gia_ManPerformRound(
int fIsMapped,
int nAnds,
int nLevels,
int nLutSize,
int nCutNum,
int fMinAve,
int fUseMfs,
int fVerbose )
549 sprintf( Command,
"&dsdb; &dch -C 500; &if -K %d -C %d %s; &save", nLutSize, nCutNum, fMinAve?
"-t":
"" );
553 printf(
"Mapping with &dch -C 500; &if -K %d -C %d %s:\n", nLutSize, nCutNum, fMinAve?
"-t":
"" );
563 sprintf( Command,
"&dsdb; &dch -C 500; &if -K %d -C %d %s; &save", nLutSize, nCutNum, fMinAve?
"-t":
"" );
567 printf(
"Mapping with &dch -C 500; &if -K %d -C %d %s:\n", nLutSize, nCutNum, fMinAve?
"-t":
"" );
588 sprintf( Command,
"&blut -a -K %d", nLutSize );
594void Gia_ManPerformFlow(
int fIsMapped,
int nAnds,
int nLevels,
int nLutSize,
int nCutNum,
int fMinAve,
int fUseMfs,
int fVerbose )
605 Gia_ManPerformRound( fIsMapped, nAnds, nLevels, nLutSize, nCutNum, fMinAve, fUseMfs, fVerbose );
611 Gia_ManPerformRound( fIsMapped, nAnds, nLevels, nLutSize, nCutNum, fMinAve, fUseMfs, fVerbose );
625void Gia_ManPerformFlow2(
int fIsMapped,
int nAnds,
int nLevels,
int nLutSize,
int nCutNum,
int fBalance,
int fMinAve,
int fUseMfs,
int fVerbose )
627 char Comm1[1000], Comm2[1000], Comm3[1000], Comm4[1000];
630 sprintf( Comm1,
"&synch2 -K 6 -C 500; &if -m%s -C %d; %s &save", fMinAve?
"t":
"", nCutNum, fUseMfs ?
"&put; mfs2 -W 4 -M 500 -C 7000; &get -m;":
"" );
631 sprintf( Comm2,
"&dch -C 500; &if -m%s -C %d; %s &save", fMinAve?
"t":
"", nCutNum+4, fUseMfs ?
"&put; mfs2 -W 4 -M 500 -C 7000; &get -m;":
"" );
632 sprintf( Comm3,
"&synch2 -K 6 -C 500; &lf -m%s -E 5 -C %d; %s &save", fMinAve?
"t":
"", nCutNum, fUseMfs ?
"&put; mfs2 -W 4 -M 500 -C 7000; &get -m;":
"" );
633 sprintf( Comm4,
"&dch -C 500; &lf -m%sk -E 5 -C %d; %s &save", fMinAve?
"t":
"", nCutNum+4, fUseMfs ?
"&put; mfs2 -W 4 -M 500 -C 7000; &get -m;":
"" );
637 sprintf( Comm1,
"&synch2 -K %d -C 500; &if -m%s -K %d -C %d; %s &save", nLutSize, fMinAve?
"t":
"", nLutSize, nCutNum, fUseMfs ?
"&put; mfs2 -W 4 -M 500 -C 7000; &get -m;":
"" );
638 sprintf( Comm2,
"&dch -C 500; &if -m%s -K %d -C %d; %s &save", fMinAve?
"t":
"", nLutSize, nCutNum+4, fUseMfs ?
"&put; mfs2 -W 4 -M 500 -C 7000; &get -m;":
"" );
639 sprintf( Comm3,
"&synch2 -K %d -C 500; &lf -m%s -E 5 -K %d -C %d; %s &save", nLutSize, fMinAve?
"t":
"", nLutSize, nCutNum, fUseMfs ?
"&put; mfs2 -W 4 -M 500 -C 7000; &get -m;":
"" );
640 sprintf( Comm4,
"&dch -C 500; &lf -m%sk -E 5 -K %d -C %d; %s &save", fMinAve?
"t":
"", nLutSize, nCutNum+4, fUseMfs ?
"&put; mfs2 -W 4 -M 500 -C 7000; &get -m;":
"" );
645 printf(
"Trying synthesis...\n" );
668 printf(
"Trying SOP balancing...\n" );
688 if ( nAnds > 100000 )
696 printf(
"Trying SOP balancing...\n" );
724 printf(
"Trying SOP balancing...\n" );
758void Gia_ManPerformFlow3(
int nLutSize,
int nCutNum,
int fBalance,
int fMinAve,
int fUseMfs,
int fUseLutLib,
int fVerbose )
760 char Comm1[200], Comm2[200], Comm3[200];
762 sprintf( Comm1,
"&st; &if -C %d; &save; &st; &syn2; &if -C %d; &save; &load", nCutNum, nCutNum );
764 sprintf( Comm1,
"&st; &if -C %d -K %d; &save; &st; &syn2; &if -C %d -K %d; &save; &load", nCutNum, nLutSize, nCutNum, nLutSize );
766 sprintf( Comm2,
"&st; &if -%s -K 6; &dch -f; &if -C %d; %s&save; &load",
Abc_NtkRecIsRunning3() ?
"y" :
"g", nCutNum, fUseMfs ?
"&mfs; ":
"" );
768 sprintf( Comm2,
"&st; &if -%s -K 6; &dch -f; &if -C %d -K %d; %s&save; &load",
Abc_NtkRecIsRunning3() ?
"y" :
"g", nCutNum, nLutSize, fUseMfs ?
"&mfs; ":
"" );
770 sprintf( Comm3,
"&st; &if -%s -K 6; &synch2; &if -C %d; %s&save; &load",
Abc_NtkRecIsRunning3() ?
"y" :
"g", nCutNum, fUseMfs ?
"&mfs; ":
"" );
772 sprintf( Comm3,
"&st; &if -%s -K 6; &synch2; &if -C %d -K %d; %s&save; &load",
Abc_NtkRecIsRunning3() ?
"y" :
"g", nCutNum, nLutSize, fUseMfs ?
"&mfs; ":
"" );
774 if ( fVerbose ) printf(
"Trying simple synthesis with %s...\n",
Abc_NtkRecIsRunning3() ?
"LMS" :
"SOP balancing" );
781 if ( fVerbose ) printf(
"Trying medium synthesis...\n" );
789 if ( fVerbose ) printf(
"Trying harder synthesis...\n" );
795 if ( fVerbose ) printf(
"Final result...\n" );
ABC_DLL int Abc_NtkRecIsRunning3()
#define ABC_INFINITY
MACRO DEFINITIONS ///.
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
ABC_DLL Abc_Frame_t * Abc_FrameGetGlobalFrame()
void Aig_ManStop(Aig_Man_t *p)
Aig_Man_t * Aig_ManDupDfsGuided(Aig_Man_t *p, Vec_Ptr_t *vPios)
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
ABC_DLL Gia_Man_t * Abc_FrameReadGia(Abc_Frame_t *p)
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
ABC_DLL int Cmd_CommandExecute(Abc_Frame_t *pAbc, const char *sCommand)
void * Dsm_ManDeriveGia(void *p, int fUseMuxes)
typedefABC_NAMESPACE_HEADER_START struct Dch_Pars_t_ Dch_Pars_t
INCLUDES ///.
Aig_Man_t * Dch_ComputeChoices(Aig_Man_t *pAig, Dch_Pars_t *pPars)
Gia_Man_t * Gia_ManFromAigChoices(Aig_Man_t *p)
Aig_Man_t * Gia_ManToAigSkip(Gia_Man_t *p, int nOutDelta)
Gia_Man_t * Gia_ManAigSynch2Choices(Gia_Man_t *pGia1, Gia_Man_t *pGia2, Gia_Man_t *pGia3, Dch_Pars_t *pPars)
void Gia_ManPerformFlow3(int nLutSize, int nCutNum, int fBalance, int fMinAve, int fUseMfs, int fUseLutLib, int fVerbose)
Vec_Ptr_t * Gia_ManOrderPios(Aig_Man_t *p, Gia_Man_t *pOrder)
void Gia_ManPerformFlow(int fIsMapped, int nAnds, int nLevels, int nLutSize, int nCutNum, int fMinAve, int fUseMfs, int fVerbose)
Gia_Man_t * Gia_ManAigSynch2(Gia_Man_t *pInit, void *pPars0, int nLutSize, int nRelaxRatio)
ABC_NAMESPACE_IMPL_START void Gia_ManAigPrintPiLevels(Gia_Man_t *p)
DECLARATIONS ///.
void Gia_ManPerformRound(int fIsMapped, int nAnds, int nLevels, int nLutSize, int nCutNum, int fMinAve, int fUseMfs, int fVerbose)
Gia_Man_t * Gia_ManDupFromBarBufs(Gia_Man_t *p)
Gia_Man_t * Gia_ManAigSyn3(Gia_Man_t *p, int fVerbose, int fVeryVerbose)
Gia_Man_t * Gia_ManAigSyn2(Gia_Man_t *pInit, int fOldAlgo, int fCoarsen, int fCutMin, int nRelaxRatio, int fDelayMin, int fVerbose, int fVeryVerbose)
Gia_Man_t * Gia_ManAigSyn4(Gia_Man_t *p, int fVerbose, int fVeryVerbose)
Gia_Man_t * Gia_ManDupToBarBufs(Gia_Man_t *p, int nBarBufs)
void Gia_ManPerformFlow2(int fIsMapped, int nAnds, int nLevels, int nLutSize, int nCutNum, int fBalance, int fMinAve, int fUseMfs, int fVerbose)
void Gia_ManPerformMap(int nAnds, int nLutSize, int nCutNum, int fMinAve, int fUseMfs, int fVerbose)
Gia_Man_t * Gia_ManLutBalance(Gia_Man_t *p, int nLutSize, int fUseMuxes, int fRecursive, int fOptArea, int fVerbose)
void Gia_ManStop(Gia_Man_t *p)
Gia_Man_t * Gia_ManDup(Gia_Man_t *p)
void Jf_ManSetDefaultPars(Jf_Par_t *pPars)
Gia_Man_t * Gia_ManPerformFx(Gia_Man_t *p, int nNewNodesMax, int LitCountMax, int fReverse, int fVerbose, int fVeryVerbose)
#define Gia_ManForEachAnd(p, pObj, i)
void Gia_ManSetRegNum(Gia_Man_t *p, int nRegs)
Gia_Man_t * Gia_ManAreaBalance(Gia_Man_t *p, int fSimpleAnd, int nNewNodesMax, int fVerbose, int fVeryVerbose)
int Gia_ManLevelWithBoxes(Gia_Man_t *p)
#define Gia_ManForEachPi(p, pObj, i)
Gia_Man_t * Gia_ManStart(int nObjsMax)
FUNCTION DEFINITIONS ///.
Gia_Man_t * Gia_ManChoiceMiter(Vec_Ptr_t *vGias)
struct Gia_Obj_t_ Gia_Obj_t
void Gia_ManFillValue(Gia_Man_t *p)
struct Gia_Man_t_ Gia_Man_t
Gia_Man_t * Lf_ManPerformMapping(Gia_Man_t *pGia, Jf_Par_t *pPars)
Gia_Man_t * Jf_ManPerformMapping(Gia_Man_t *pGia, Jf_Par_t *pPars)
Gia_Man_t * Gia_ManPerformDsdBalance(Gia_Man_t *p, int nLutSize, int nCutNum, int nRelaxRatio, int fVerbose)
void Gia_ManTransferTiming(Gia_Man_t *p, Gia_Man_t *pGia)
void Lf_ManSetDefaultPars(Jf_Par_t *pPars)
struct Jf_Par_t_ Jf_Par_t
#define Gia_ManForEachObj(p, pObj, i)
MACRO DEFINITIONS ///.
#define Gia_ManForEachCo(p, pObj, i)
#define Gia_ManForEachCi(p, pObj, i)
void Gia_ManPrintStats(Gia_Man_t *p, Gps_Par_t *pPars)
void Gia_ManTransferMapping(Gia_Man_t *p, Gia_Man_t *pGia)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.