mirror of https://github.com/YosysHQ/abc.git
Technology mapper.
This commit is contained in:
parent
e1a5556e8c
commit
79f3ecb15f
|
|
@ -2933,6 +2933,10 @@ SOURCE=.\src\misc\mem\mem.c
|
||||||
|
|
||||||
SOURCE=.\src\misc\mem\mem.h
|
SOURCE=.\src\misc\mem\mem.h
|
||||||
# End Source File
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\src\misc\mem\mem2.h
|
||||||
|
# End Source File
|
||||||
# End Group
|
# End Group
|
||||||
# Begin Group "tim"
|
# Begin Group "tim"
|
||||||
|
|
||||||
|
|
@ -3559,6 +3563,10 @@ SOURCE=.\src\aig\gia\giaSwitch.c
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\src\aig\gia\giaTest.c
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=.\src\aig\gia\giaTruth.c
|
SOURCE=.\src\aig\gia\giaTruth.c
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
|
||||||
|
|
@ -30356,7 +30356,8 @@ int Abc_CommandAbc9Test( Abc_Frame_t * pAbc, int argc, char ** argv )
|
||||||
// extern void Ga2_ManComputeTest( Gia_Man_t * p );
|
// extern void Ga2_ManComputeTest( Gia_Man_t * p );
|
||||||
// extern void Bmc_CexTest( Gia_Man_t * p, Abc_Cex_t * pCex, int fVerbose );
|
// extern void Bmc_CexTest( Gia_Man_t * p, Abc_Cex_t * pCex, int fVerbose );
|
||||||
// extern void Gia_IsoTest( Gia_Man_t * p, Abc_Cex_t * pCex, int fVerbose );
|
// extern void Gia_IsoTest( Gia_Man_t * p, Abc_Cex_t * pCex, int fVerbose );
|
||||||
extern void Unr_ManTest( Gia_Man_t * pGia );
|
// extern void Unr_ManTest( Gia_Man_t * pGia );
|
||||||
|
extern void Mig_ManTest( Gia_Man_t * pGia );
|
||||||
|
|
||||||
Extra_UtilGetoptReset();
|
Extra_UtilGetoptReset();
|
||||||
while ( ( c = Extra_UtilGetopt( argc, argv, "svh" ) ) != EOF )
|
while ( ( c = Extra_UtilGetopt( argc, argv, "svh" ) ) != EOF )
|
||||||
|
|
@ -30405,7 +30406,8 @@ int Abc_CommandAbc9Test( Abc_Frame_t * pAbc, int argc, char ** argv )
|
||||||
// Ga2_ManComputeTest( pAbc->pGia );
|
// Ga2_ManComputeTest( pAbc->pGia );
|
||||||
// Bmc_CexTest( pAbc->pGia, pAbc->pCex, fVerbose );
|
// Bmc_CexTest( pAbc->pGia, pAbc->pCex, fVerbose );
|
||||||
// Gia_IsoTest( pAbc->pGia, pAbc->pCex, 0 );
|
// Gia_IsoTest( pAbc->pGia, pAbc->pCex, 0 );
|
||||||
Unr_ManTest( pAbc->pGia );
|
// Unr_ManTest( pAbc->pGia );
|
||||||
|
Mig_ManTest( pAbc->pGia );
|
||||||
return 0;
|
return 0;
|
||||||
usage:
|
usage:
|
||||||
Abc_Print( -2, "usage: &test [-svh]\n" );
|
Abc_Print( -2, "usage: &test [-svh]\n" );
|
||||||
|
|
|
||||||
|
|
@ -1386,13 +1386,13 @@ int Dss_ManOperation( Dss_Man_t * p, int Type, int * pLits, int nLits, unsigned
|
||||||
pObj = Dss_ObjFindOrAdd( p, Type, p->vLeaves, pTruth );
|
pObj = Dss_ObjFindOrAdd( p, Type, p->vLeaves, pTruth );
|
||||||
return Abc_Var2Lit( pObj->Id, fCompl );
|
return Abc_Var2Lit( pObj->Id, fCompl );
|
||||||
}
|
}
|
||||||
Dss_Fun_t * Dss_ManOperationFun( Dss_Man_t * p, int * iDsd, int * nFans )
|
Dss_Fun_t * Dss_ManOperationFun( Dss_Man_t * p, int * iDsd, int nFansTot )
|
||||||
{
|
{
|
||||||
static char Buffer[100];
|
static char Buffer[100];
|
||||||
Dss_Fun_t * pFun = (Dss_Fun_t *)Buffer;
|
Dss_Fun_t * pFun = (Dss_Fun_t *)Buffer;
|
||||||
pFun->iDsd = Dss_ManOperation( p, DAU_DSD_AND, iDsd, 2, pFun->pFans, NULL );
|
pFun->iDsd = Dss_ManOperation( p, DAU_DSD_AND, iDsd, 2, pFun->pFans, NULL );
|
||||||
//printf( "%d %d -> %d ", iDsd[0], iDsd[1], pFun->iDsd );
|
//printf( "%d %d -> %d ", iDsd[0], iDsd[1], pFun->iDsd );
|
||||||
pFun->nFans = nFans[0] + nFans[1];
|
pFun->nFans = nFansTot;
|
||||||
assert( (int)pFun->nFans == Dss_VecLitSuppSize(p->vObjs, pFun->iDsd) );
|
assert( (int)pFun->nFans == Dss_VecLitSuppSize(p->vObjs, pFun->iDsd) );
|
||||||
return pFun;
|
return pFun;
|
||||||
}
|
}
|
||||||
|
|
@ -1430,7 +1430,7 @@ void Dss_EntPrint( Dss_Ent_t * p, Dss_Fun_t * pFun )
|
||||||
SeeAlso []
|
SeeAlso []
|
||||||
|
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
Dss_Fun_t * Dss_ManBooleanAnd( Dss_Man_t * p, Dss_Ent_t * pEnt, int * nFans, int Counter )
|
Dss_Fun_t * Dss_ManBooleanAnd( Dss_Man_t * p, Dss_Ent_t * pEnt, int Counter )
|
||||||
{
|
{
|
||||||
static char Buffer[100];
|
static char Buffer[100];
|
||||||
Dss_Fun_t * pFun = (Dss_Fun_t *)Buffer;
|
Dss_Fun_t * pFun = (Dss_Fun_t *)Buffer;
|
||||||
|
|
@ -1441,6 +1441,9 @@ Dss_Fun_t * Dss_ManBooleanAnd( Dss_Man_t * p, Dss_Ent_t * pEnt, int * nFans, int
|
||||||
int pPermLits[DAU_MAX_VAR];
|
int pPermLits[DAU_MAX_VAR];
|
||||||
int pPermDsd[DAU_MAX_VAR];
|
int pPermDsd[DAU_MAX_VAR];
|
||||||
int i, nNonDec, nSuppSize = 0;
|
int i, nNonDec, nSuppSize = 0;
|
||||||
|
int nFans[2];
|
||||||
|
nFans[0] = Dss_VecLitSuppSize( p->vObjs, pEnt->iDsd0 );
|
||||||
|
nFans[1] = Dss_VecLitSuppSize( p->vObjs, pEnt->iDsd1 );
|
||||||
// create first truth table
|
// create first truth table
|
||||||
for ( i = 0; i < nFans[0]; i++ )
|
for ( i = 0; i < nFans[0]; i++ )
|
||||||
{
|
{
|
||||||
|
|
@ -1578,9 +1581,9 @@ p->timeBeg += clock() - clk;
|
||||||
{
|
{
|
||||||
clk = clock();
|
clk = clock();
|
||||||
if ( uSharedMask == 0 )
|
if ( uSharedMask == 0 )
|
||||||
pFun = Dss_ManOperationFun( p, iDsd, nFans );
|
pFun = Dss_ManOperationFun( p, iDsd, nFans[0] + nFans[1] );
|
||||||
else
|
else
|
||||||
pFun = Dss_ManBooleanAnd( p, pEnt, nFans, 0 );
|
pFun = Dss_ManBooleanAnd( p, pEnt, 0 );
|
||||||
if ( pFun == NULL )
|
if ( pFun == NULL )
|
||||||
return -1;
|
return -1;
|
||||||
assert( (int)pFun->nFans == Dss_VecLitSuppSize(p->vObjs, pFun->iDsd) );
|
assert( (int)pFun->nFans == Dss_VecLitSuppSize(p->vObjs, pFun->iDsd) );
|
||||||
|
|
@ -1596,9 +1599,9 @@ clk = clock();
|
||||||
if ( *ppSpot == NULL )
|
if ( *ppSpot == NULL )
|
||||||
{
|
{
|
||||||
if ( uSharedMask == 0 )
|
if ( uSharedMask == 0 )
|
||||||
pFun = Dss_ManOperationFun( p, iDsd, nFans );
|
pFun = Dss_ManOperationFun( p, iDsd, nFans[0] + nFans[1] );
|
||||||
else
|
else
|
||||||
pFun = Dss_ManBooleanAnd( p, pEnt, nFans, 0 );
|
pFun = Dss_ManBooleanAnd( p, pEnt, 0 );
|
||||||
if ( pFun == NULL )
|
if ( pFun == NULL )
|
||||||
return -1;
|
return -1;
|
||||||
assert( (int)pFun->nFans == Dss_VecLitSuppSize(p->vObjs, pFun->iDsd) );
|
assert( (int)pFun->nFans == Dss_VecLitSuppSize(p->vObjs, pFun->iDsd) );
|
||||||
|
|
@ -1664,6 +1667,101 @@ if ( Counter == 43418 )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**Function*************************************************************
|
||||||
|
|
||||||
|
Synopsis []
|
||||||
|
|
||||||
|
Description []
|
||||||
|
|
||||||
|
SideEffects []
|
||||||
|
|
||||||
|
SeeAlso []
|
||||||
|
|
||||||
|
***********************************************************************/
|
||||||
|
Dss_Ent_t * Dss_ManSharedMapDerive( Dss_Man_t * p, int iDsd0, int iDsd1, Vec_Str_t * vShared )
|
||||||
|
{
|
||||||
|
static char Buffer[100];
|
||||||
|
Dss_Ent_t * pEnt = (Dss_Ent_t *)Buffer;
|
||||||
|
pEnt->iDsd0 = iDsd0;
|
||||||
|
pEnt->iDsd1 = iDsd1;
|
||||||
|
pEnt->nShared = Vec_StrSize(vShared)/2;
|
||||||
|
memcpy( pEnt->pShared, (unsigned char *)Vec_StrArray(vShared), sizeof(char) * Vec_StrSize(vShared) );
|
||||||
|
pEnt->nWords = Dss_EntWordNum( pEnt );
|
||||||
|
return pEnt;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Mpm_FuncCompute( Dss_Man_t * p, int iDsd0, int iDsd1, Vec_Str_t * vShared, int * pPerm, int * pnLeaves )
|
||||||
|
{
|
||||||
|
int fVerbose = 0;
|
||||||
|
int fCheck = 0;
|
||||||
|
Dss_Ent_t * pEnt, ** ppSpot;
|
||||||
|
Dss_Fun_t * pFun;
|
||||||
|
int iDsd[2] = { iDsd0, iDsd1 };
|
||||||
|
int i;
|
||||||
|
clock_t clk;
|
||||||
|
|
||||||
|
assert( iDsd0 <= iDsd1 );
|
||||||
|
if ( DAU_MAX_VAR < *pnLeaves )
|
||||||
|
{
|
||||||
|
printf( "Paramater DAU_MAX_VAR (%d) smaller than LUT size (%d).\n", DAU_MAX_VAR, *pnLeaves );
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if ( fVerbose )
|
||||||
|
{
|
||||||
|
Dss_ManPrintOne( stdout, p, iDsd0, NULL );
|
||||||
|
Dss_ManPrintOne( stdout, p, iDsd1, NULL );
|
||||||
|
}
|
||||||
|
|
||||||
|
clk = clock();
|
||||||
|
pEnt = Dss_ManSharedMapDerive( p, iDsd0, iDsd1, vShared );
|
||||||
|
ppSpot = Dss_ManCacheLookup( p, pEnt );
|
||||||
|
p->timeLook += clock() - clk;
|
||||||
|
|
||||||
|
clk = clock();
|
||||||
|
if ( *ppSpot == NULL )
|
||||||
|
{
|
||||||
|
if ( Vec_StrSize(vShared) == 0 )
|
||||||
|
pFun = Dss_ManOperationFun( p, iDsd, *pnLeaves );
|
||||||
|
else
|
||||||
|
pFun = Dss_ManBooleanAnd( p, pEnt, 0 );
|
||||||
|
if ( pFun == NULL )
|
||||||
|
return -1;
|
||||||
|
assert( (int)pFun->nFans == Dss_VecLitSuppSize(p->vObjs, pFun->iDsd) );
|
||||||
|
assert( (int)pFun->nFans <= *pnLeaves );
|
||||||
|
// create cache entry
|
||||||
|
*ppSpot = Dss_ManCacheCreate( p, pEnt, pFun );
|
||||||
|
}
|
||||||
|
pFun = (*ppSpot)->pFunc;
|
||||||
|
p->timeDec += clock() - clk;
|
||||||
|
|
||||||
|
*pnLeaves = (int)pFun->nFans;
|
||||||
|
for ( i = 0; i < (int)pFun->nFans; i++ )
|
||||||
|
pPerm[i] = (int)pFun->pFans[i];
|
||||||
|
|
||||||
|
if ( fVerbose )
|
||||||
|
{
|
||||||
|
Dss_ManPrintOne( stdout, p, pFun->iDsd, NULL );
|
||||||
|
printf( "\n" );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
if ( fCheck )
|
||||||
|
{
|
||||||
|
pTruthOne = Dss_ManComputeTruth( p, pFun->iDsd, p->nVars, pPermResInt );
|
||||||
|
if ( !Abc_TtEqual( pTruthOne, pTruth, Abc_TtWordNum(p->nVars) ) )
|
||||||
|
{
|
||||||
|
int s;
|
||||||
|
// Kit_DsdPrintFromTruth( pTruthOne, p->nVars ); printf( "\n" );
|
||||||
|
// Kit_DsdPrintFromTruth( pTruth, p->nVars ); printf( "\n" );
|
||||||
|
printf( "Verification failed.\n" );
|
||||||
|
s = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
return pFun->iDsd;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**Function*************************************************************
|
/**Function*************************************************************
|
||||||
|
|
||||||
Synopsis []
|
Synopsis []
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue