summaryrefslogtreecommitdiffstats
path: root/src/aig/gia/giaSimBase.c
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2020-03-21 14:02:54 -0700
committerAlan Mishchenko <alanmi@berkeley.edu>2020-03-21 14:02:54 -0700
commitfb6e4ee290ac874f3d2f77de051733c92974abfd (patch)
tree660c2f893953bbffff471f123106d7a8771ab72b /src/aig/gia/giaSimBase.c
parent6a6ffed8c545cd76d479da6a8a1d1e5aa35b1037 (diff)
downloadabc-fb6e4ee290ac874f3d2f77de051733c92974abfd.tar.gz
abc-fb6e4ee290ac874f3d2f77de051733c92974abfd.tar.bz2
abc-fb6e4ee290ac874f3d2f77de051733c92974abfd.zip
Various changes.
Diffstat (limited to 'src/aig/gia/giaSimBase.c')
-rw-r--r--src/aig/gia/giaSimBase.c120
1 files changed, 97 insertions, 23 deletions
diff --git a/src/aig/gia/giaSimBase.c b/src/aig/gia/giaSimBase.c
index 825c01ca..64bacc28 100644
--- a/src/aig/gia/giaSimBase.c
+++ b/src/aig/gia/giaSimBase.c
@@ -54,6 +54,7 @@ struct Gia_SimAbsMan_t_
int nWords; // word count
Vec_Wrd_t * vSims; // candidate simulation info
Vec_Int_t * vResub; // the result
+ int fVerbose; // verbose
// intermediate result
Vec_Int_t * vValues; // function values in each pattern
Vec_Int_t * vPatPairs; // used minterms
@@ -181,8 +182,8 @@ Vec_Wrd_t * Gia_ManSimCombine( int nInputs, Vec_Wrd_t * vBase, Vec_Wrd_t * vAddO
assert( nWordsUse <= nWordsAddOn );
for ( i = 0; i < nInputs; i++ )
{
- word * pSimsB = Vec_WrdEntryP( vBase, i * nWordsBase );
- word * pSimsA = Vec_WrdEntryP( vAddOn, i * nWordsAddOn );
+ word * pSimsB = nWordsBase ? Vec_WrdEntryP( vBase, i * nWordsBase ) : NULL;
+ word * pSimsA = nWordsAddOn ? Vec_WrdEntryP( vAddOn, i * nWordsAddOn ) : NULL;
for ( w = 0; w < nWordsBase; w++ )
Vec_WrdPush( vSimsIn, pSimsB[w] );
for ( w = 0; w < nWordsUse; w++ )
@@ -769,14 +770,20 @@ int Gia_ManSimRelCompare( Gia_Man_t * p, int nWords, Vec_Wrd_t * vSims, int nWor
}
void Gia_ManSimRelCollectOutputs( Gia_Man_t * p, int nWords, Vec_Wrd_t * vSims, int nWordsOut, Vec_Wrd_t * vSimsOut, Vec_Wrd_t * vRel )
{
- int i, m, nMints = nWords / nWordsOut;
+ int i, m, nMints = nWords / nWordsOut, Count = 0;
assert( Vec_WrdSize(vSims) == nWords * Gia_ManObjNum(p) );
assert( Vec_WrdSize(vSimsOut) == nWordsOut * Gia_ManCoNum(p) );
assert( Vec_WrdSize(vRel) == nWordsOut * nMints );
for ( i = 0; i < 64 * nWordsOut; i++ )
+ {
+ int CountMints = 0;
for ( m = 0; m < nMints; m++ )
if ( Gia_ManSimRelCompare(p, nWords, vSims, nWordsOut, vSimsOut, i, m) )
- Abc_TtSetBit( Vec_WrdArray(vRel), i*nMints+m );
+ Abc_TtSetBit( Vec_WrdArray(vRel), i*nMints+m ), CountMints++;
+ Count += CountMints == 0;
+ }
+ if ( Count )
+ printf( "The relation is not well-defined for %d (out of %d) patterns.\n", Count, 64 * nWordsOut );
}
Vec_Wrd_t * Gia_ManSimRel( Gia_Man_t * p, Vec_Int_t * vObjs, Vec_Wrd_t * vVals )
{
@@ -819,38 +826,86 @@ Vec_Wrd_t * Gia_ManSimRel( Gia_Man_t * p, Vec_Int_t * vObjs, Vec_Wrd_t * vVals )
SeeAlso []
***********************************************************************/
+void Gia_ManSimRelCheckFuncs( Gia_Man_t * p, Vec_Wrd_t * vRel, int nOuts, Vec_Wrd_t * vFuncs )
+{
+ int i, k, m, Values[32], nErrors = 0, nMints = 1 << nOuts, nWords = Vec_WrdSize(vRel) / nMints;
+ assert( Vec_WrdSize(vFuncs) == 2 * nOuts * nWords );
+ assert( nOuts <= 32 );
+ for ( i = 0; i < 64 * nWords; i++ )
+ {
+ for ( k = 0; k < nOuts; k++ )
+ {
+ int Value0 = Abc_TtGetBit( Vec_WrdEntryP(vFuncs, (2*k+0)*nWords), i );
+ int Value1 = Abc_TtGetBit( Vec_WrdEntryP(vFuncs, (2*k+1)*nWords), i );
+ if ( Value0 && !Value1 )
+ Values[k] = 1;
+ else if ( !Value0 && Value1 )
+ Values[k] = 2;
+ else if ( !Value0 && !Value1 )
+ Values[k] = 3;
+ else assert( 0 );
+ }
+ for ( m = 0; m < nMints; m++ )
+ {
+ for ( k = 0; k < nOuts; k++ )
+ if ( ((Values[k] >> ((m >> k) & 1)) & 1) == 0 )
+ break;
+ if ( k < nOuts )
+ continue;
+ if ( Abc_TtGetBit( Vec_WrdArray(vRel), i*nMints+m ) )
+ continue;
+ if ( nErrors++ == 0 )
+ printf( "For pattern %d, minterm %d produced by function is not in the relation.\n", i, m );
+ }
+ }
+ if ( nErrors )
+ printf( "Total number of similar errors = %d.\n", nErrors );
+ else
+ printf( "The function agrees with the relation.\n" );
+}
Vec_Wrd_t * Gia_ManSimRelDeriveFuncs( Gia_Man_t * p, Vec_Wrd_t * vRel, int nOuts )
{
- int i, k, m, nMints = 1 << nOuts, nWords = Vec_WrdSize(vRel) / nMints;
- Vec_Wrd_t * vFuncs = Vec_WrdStart( nOuts * nWords );
+ int i, k, m, Count = 0, nMints = 1 << nOuts, nWords = Vec_WrdSize(vRel) / nMints;
+ Vec_Wrd_t * vFuncs = Vec_WrdStart( 2 * nOuts * nWords );
assert( Vec_WrdSize(vRel) % nMints == 0 );
for ( i = 0; i < 64 * nWords; i++ )
{
for ( m = 0; m < nMints; m++ )
if ( Abc_TtGetBit( Vec_WrdArray(vRel), i*nMints+m ) )
break;
- assert( m < nMints );
+ Count += m == nMints;
for ( k = 0; k < nOuts; k++ )
if ( (m >> k) & 1 )
- Abc_TtSetBit( Vec_WrdEntryP(vFuncs, k*nWords), i );
+ Abc_TtSetBit( Vec_WrdEntryP(vFuncs, (2*k+1)*nWords), i );
+ else
+ Abc_TtSetBit( Vec_WrdEntryP(vFuncs, (2*k+0)*nWords), i );
}
+ if ( Count )
+ printf( "The relation is not well-defined for %d (out of %d) patterns.\n", Count, 64 * nWords );
+ else
+ printf( "The relation was successfully determized without don't-cares for %d patterns.\n", 64 * nWords );
+ Gia_ManSimRelCheckFuncs( p, vRel, nOuts, vFuncs );
return vFuncs;
}
Vec_Wrd_t * Gia_ManSimRelDeriveFuncs2( Gia_Man_t * p, Vec_Wrd_t * vRel, int nOuts )
{
- int i, k, m, nMints = 1 << nOuts, nWords = Vec_WrdSize(vRel) / nMints;
+ int i, k, m, nDCs[32] = {0}, Count = 0, nMints = 1 << nOuts, nWords = Vec_WrdSize(vRel) / nMints;
Vec_Wrd_t * vFuncs = Vec_WrdStart( 2 * nOuts * nWords );
assert( Vec_WrdSize(vRel) % nMints == 0 );
+ assert( nOuts <= 32 );
for ( i = 0; i < 64 * nWords; i++ )
{
for ( m = 0; m < nMints; m++ )
if ( Abc_TtGetBit( Vec_WrdArray(vRel), i*nMints+m ) )
break;
- assert( m < nMints );
+ Count += m == nMints;
for ( k = 0; k < nOuts; k++ )
{
if ( Abc_TtGetBit( Vec_WrdArray(vRel), i*nMints+(m^(1<<k)) ) )
+ {
+ nDCs[k]++;
continue;
+ }
if ( (m >> k) & 1 )
Abc_TtSetBit( Vec_WrdEntryP(vFuncs, (2*k+1)*nWords), i );
else
@@ -873,6 +928,17 @@ Vec_Wrd_t * Gia_ManSimRelDeriveFuncs2( Gia_Man_t * p, Vec_Wrd_t * vRel, int nOut
printf( "\n" );
}
}
+ if ( Count )
+ printf( "The relation is not well-defined for %d (out of %d) patterns.\n", Count, 64 * nWords );
+ else
+ {
+ printf( "The relation was successfully determized with don't-cares for %d patterns.\n", 64 * nWords );
+ printf( "Don't-cares in each output:" );
+ for ( k = 0; k < nOuts; k++ )
+ printf( " %d = %d", k, nDCs[k] );
+ printf( "\n" );
+ }
+ Gia_ManSimRelCheckFuncs( p, vRel, nOuts, vFuncs );
return vFuncs;
}
@@ -986,7 +1052,7 @@ Vec_Int_t * Gia_Sim5CollectValues( word * pOffSet, word * pOnSet, int nWords )
//printf( "Offset = %d. Onset = %d. Dcset = %d.\n", Count[0], Count[1], 64*nWords - Count[0] - Count[1] );
return vBits;
}
-Gia_SimAbsMan_t * Gia_SimAbsAlloc( Gia_Man_t * pGia, word * pOffSet, word * pOnSet, Vec_Wrd_t * vSims, int nWords, Vec_Int_t * vResub )
+Gia_SimAbsMan_t * Gia_SimAbsAlloc( Gia_Man_t * pGia, word * pOffSet, word * pOnSet, Vec_Wrd_t * vSims, int nWords, Vec_Int_t * vResub, int fVerbose )
{
Gia_SimAbsMan_t * p = ABC_CALLOC( Gia_SimAbsMan_t, 1 );
p->pGia = pGia;
@@ -996,6 +1062,7 @@ Gia_SimAbsMan_t * Gia_SimAbsAlloc( Gia_Man_t * pGia, word * pOffSet, word * pOnS
p->nWords = nWords;
p->vSims = vSims;
p->vResub = vResub;
+ p->fVerbose = fVerbose;
p->vValues = Gia_Sim5CollectValues( pOffSet, pOnSet, nWords );
p->vPatPairs = Vec_IntAlloc( 100 );
p->vCoverTable = Vec_WrdAlloc( 10000 );
@@ -1158,13 +1225,16 @@ void Gia_SimAbsSolve( Gia_SimAbsMan_t * p )
pSimTable = Vec_WrdEntryP( p->vCoverTable, p->nWordsTable * iArgMax );
Abc_TtSharp( p->pTableTemp, p->pTableTemp, pSimTable, p->nWordsTable );
}
- printf( "Solution %2d for covering problem [%5d x %5d]: ", Vec_IntSize(p->vResub), Vec_IntSize(p->vPatPairs)/2, p->nCands );
- Vec_IntForEachEntry( p->vResub, iPat, i )
- printf( "%6d ", iPat );
- for ( ; i < 12; i++ )
- printf( " " );
- printf( " " );
- Abc_PrintTime( 1, "Time", Abc_Clock() - clk );
+ if ( p->fVerbose )
+ {
+ printf( "Solution %2d for covering problem [%5d x %5d]: ", Vec_IntSize(p->vResub), Vec_IntSize(p->vPatPairs)/2, p->nCands );
+ Vec_IntForEachEntry( p->vResub, iPat, i )
+ printf( "%6d ", iPat );
+ for ( ; i < 12; i++ )
+ printf( " " );
+ printf( " " );
+ Abc_PrintTime( 1, "Time", Abc_Clock() - clk );
+ }
}
int Gia_SimAbsRefine( Gia_SimAbsMan_t * p )
{
@@ -1196,7 +1266,10 @@ int Gia_SimAbsRefine( Gia_SimAbsMan_t * p )
//printf( "iPat1 = %d iPat2 = %d Mint = %d\n", Value ? iPat : i, Value ? i : iPat, iMint );
Count++;
if ( Count == 64 )
+ {
+ ABC_FREE( pFanins );
return 1;
+ }
}
//printf( "Refinement added %d minterm pairs.\n", Count );
ABC_FREE( pFanins );
@@ -1216,7 +1289,8 @@ void Gia_SimAbsInit( Gia_SimAbsMan_t * p )
Vec_Int_t * vValue0 = Gia_SimAbsFind( p->vValues, 0 );
Vec_Int_t * vValue1 = Gia_SimAbsFind( p->vValues, 1 );
Vec_IntClear( p->vPatPairs );
- printf( "There are %d offset and %d onset minterms (%d pairs).\n", Vec_IntSize(vValue0), Vec_IntSize(vValue1), Vec_IntSize(vValue0)*Vec_IntSize(vValue1) );
+ printf( "There are %d offset and %d onset minterms (%d pairs) and %d divisors.\n",
+ Vec_IntSize(vValue0), Vec_IntSize(vValue1), Vec_IntSize(vValue0)*Vec_IntSize(vValue1), p->nCands );
Abc_Random( 1 );
assert( Vec_IntSize(vValue0) > 0 );
assert( Vec_IntSize(vValue1) > 0 );
@@ -1239,10 +1313,11 @@ void Gia_SimAbsInit( Gia_SimAbsMan_t * p )
SeeAlso []
***********************************************************************/
-Vec_Int_t * Gia_SimAbsPerformOne( Gia_Man_t * pGia, word * pOffSet, word * pOnSet, Vec_Wrd_t * vSimsCands, int nWords )
+Vec_Int_t * Gia_SimAbsPerformOne( Gia_Man_t * pGia, word * pOffSet, word * pOnSet, Vec_Wrd_t * vSimsCands, int nWords, int fVerbose )
{
+ abctime clk = Abc_Clock();
Vec_Int_t * vResub = Vec_IntAlloc( 10 );
- Gia_SimAbsMan_t * p = Gia_SimAbsAlloc( pGia, pOffSet, pOnSet, vSimsCands, nWords, vResub );
+ Gia_SimAbsMan_t * p = Gia_SimAbsAlloc( pGia, pOffSet, pOnSet, vSimsCands, nWords, vResub, fVerbose );
Gia_SimAbsInit( p );
while ( 1 )
{
@@ -1251,11 +1326,10 @@ Vec_Int_t * Gia_SimAbsPerformOne( Gia_Man_t * pGia, word * pOffSet, word * pOnSe
break;
}
Gia_SimAbsFree( p );
+ Abc_PrintTime( 1, "Resubstitution time", Abc_Clock() - clk );
return vResub;
}
-
-
////////////////////////////////////////////////////////////////////////
/// END OF FILE ///
////////////////////////////////////////////////////////////////////////