From 3a1032c151360c99334c559d93b0068bf4b2a3f5 Mon Sep 17 00:00:00 2001 From: Alan Mishchenko Date: Mon, 18 Sep 2017 08:27:05 -0700 Subject: Maintenance and updates. --- src/map/if/if.h | 1 + src/map/mio/mio.h | 1 + src/map/mio/mioFunc.c | 5 +++ src/map/mio/mioUtils.c | 49 ++++++++++++++++++++++++++++ src/misc/util/utilTruth.h | 82 +++++++++++++++++++++++++++++++++++++++++++++++ src/opt/dau/dauCanon.c | 82 ----------------------------------------------- 6 files changed, 138 insertions(+), 82 deletions(-) (limited to 'src') diff --git a/src/map/if/if.h b/src/map/if/if.h index e822a0ad..0dd5e01c 100644 --- a/src/map/if/if.h +++ b/src/map/if/if.h @@ -267,6 +267,7 @@ struct If_Man_t_ Vec_Int_t * vCutData; // cut data storage int pArrTimeProfile[IF_MAX_FUNC_LUTSIZE]; Vec_Ptr_t * vVisited; + void * pUserMan; // timing manager Tim_Man_t * pManTim; diff --git a/src/map/mio/mio.h b/src/map/mio/mio.h index a957f33c..0704a8d5 100644 --- a/src/map/mio/mio.h +++ b/src/map/mio/mio.h @@ -198,6 +198,7 @@ extern Mio_Gate_t ** Mio_CollectRoots( Mio_Library_t * pLib, int nInputs, fl extern Mio_Cell_t * Mio_CollectRootsNew( Mio_Library_t * pLib, int nInputs, int * pnGates, int fVerbose ); extern Mio_Cell_t * Mio_CollectRootsNewDefault( int nInputs, int * pnGates, int fVerbose ); extern Mio_Cell2_t * Mio_CollectRootsNewDefault2( int nInputs, int * pnGates, int fVerbose ); +extern int Mio_CollectRootsNewDefault3( int nInputs, Vec_Ptr_t ** pvNames, Vec_Wrd_t ** pvTruths ); extern word Mio_DeriveTruthTable6( Mio_Gate_t * pGate ); extern void Mio_DeriveTruthTable( Mio_Gate_t * pGate, unsigned uTruthsIn[][2], int nSigns, int nInputs, unsigned uTruthRes[] ); extern void Mio_DeriveGateDelays( Mio_Gate_t * pGate, diff --git a/src/map/mio/mioFunc.c b/src/map/mio/mioFunc.c index 536f5496..c059668c 100644 --- a/src/map/mio/mioFunc.c +++ b/src/map/mio/mioFunc.c @@ -268,6 +268,11 @@ int Mio_GateParseFormula( Mio_Gate_t * pGate ) // derive truth table if ( nPins <= 6 ) pGate->uTruth = Exp_Truth6( nPins, pGate->vExpr, NULL ); + else if ( nPins <= 8 ) + { + pGate->pTruth = ABC_CALLOC( word, 4 ); + Exp_Truth8( nPins, pGate->vExpr, NULL, pGate->pTruth ); + } /* // verify diff --git a/src/map/mio/mioUtils.c b/src/map/mio/mioUtils.c index 428eb92b..22ce244a 100644 --- a/src/map/mio/mioUtils.c +++ b/src/map/mio/mioUtils.c @@ -779,6 +779,55 @@ Mio_Cell2_t * Mio_CollectRootsNewDefault2( int nInputs, int * pnGates, int fVerb return Mio_CollectRootsNew2( (Mio_Library_t *)Abc_FrameReadLibGen(), nInputs, pnGates, fVerbose ); } +/**Function************************************************************* + + Synopsis [Derives the truth table of the gate.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +int Mio_CollectRootsNewDefault3( int nInputs, Vec_Ptr_t ** pvNames, Vec_Wrd_t ** pvTruths ) +{ + Mio_Library_t * pLib = (Mio_Library_t *)Abc_FrameReadLibGen(); + int i, iGate = 0, nGates = pLib ? Mio_LibraryReadGateNum( pLib ) : 0; + Mio_Gate_t * pGate0, ** ppGates; word * pTruth; + if ( pLib == NULL ) + return 0; + ppGates = ABC_CALLOC( Mio_Gate_t *, nGates ); + Mio_LibraryForEachGate( pLib, pGate0 ) + ppGates[pGate0->Cell] = pGate0; + *pvNames = Vec_PtrAlloc( nGates ); + *pvTruths = Vec_WrdStart( nGates * 4 ); + for ( i = 0; i < nGates; i++ ) + { + pGate0 = ppGates[i]; + if ( pGate0->nInputs > nInputs || pGate0->pTwin ) // skip large and multi-output + continue; + Vec_PtrPush( *pvNames, pGate0->pName ); + pTruth = Vec_WrdEntryP( *pvTruths, iGate++*4 ); + if ( pGate0->nInputs <= 6 ) + pTruth[0] = pTruth[1] = pTruth[2] = pTruth[3] = pGate0->uTruth; + else if ( pGate0->nInputs == 7 ) + { + pTruth[0] = pTruth[2] = pGate0->pTruth[0]; + pTruth[1] = pTruth[3] = pGate0->pTruth[1]; + } + else if ( pGate0->nInputs == 8 ) + memcpy( pTruth, pGate0->pTruth, 4*sizeof(word) ); + } + assert( iGate == nGates ); + assert( Vec_WrdEntry(*pvTruths, 0) == 0 ); + assert( Vec_WrdEntry(*pvTruths, 4) == ~(word)0 ); + assert( Vec_WrdEntry(*pvTruths, 8) == s_Truths6[0] ); + assert( Vec_WrdEntry(*pvTruths, 12) == ~s_Truths6[0] ); + ABC_FREE( ppGates ); + return nGates; +} + /**Function************************************************************* Synopsis [Derives the truth table of the gate.] diff --git a/src/misc/util/utilTruth.h b/src/misc/util/utilTruth.h index 4736a291..1c03d4c7 100644 --- a/src/misc/util/utilTruth.h +++ b/src/misc/util/utilTruth.h @@ -417,6 +417,88 @@ static inline void Abc_TtConst1( word * pIn1, int nWords ) for ( w = 0; w < nWords; w++ ) pIn1[w] = ~(word)0; } + +/**Function************************************************************* + + Synopsis [Compares Cof0 and Cof1.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +static inline int Abc_TtCompare1VarCofs( word * pTruth, int nWords, int iVar ) +{ + if ( nWords == 1 ) + { + word Cof0 = pTruth[0] & s_Truths6Neg[iVar]; + word Cof1 = (pTruth[0] >> (1 << iVar)) & s_Truths6Neg[iVar]; + if ( Cof0 != Cof1 ) + return Cof0 < Cof1 ? -1 : 1; + return 0; + } + if ( iVar <= 5 ) + { + word Cof0, Cof1; + int w, shift = (1 << iVar); + for ( w = 0; w < nWords; w++ ) + { + Cof0 = pTruth[w] & s_Truths6Neg[iVar]; + Cof1 = (pTruth[w] >> shift) & s_Truths6Neg[iVar]; + if ( Cof0 != Cof1 ) + return Cof0 < Cof1 ? -1 : 1; + } + return 0; + } + // if ( iVar > 5 ) + { + word * pLimit = pTruth + nWords; + int i, iStep = Abc_TtWordNum(iVar); + assert( nWords >= 2 ); + for ( ; pTruth < pLimit; pTruth += 2*iStep ) + for ( i = 0; i < iStep; i++ ) + if ( pTruth[i] != pTruth[i + iStep] ) + return pTruth[i] < pTruth[i + iStep] ? -1 : 1; + return 0; + } +} +static inline int Abc_TtCompare1VarCofsRev( word * pTruth, int nWords, int iVar ) +{ + if ( nWords == 1 ) + { + word Cof0 = pTruth[0] & s_Truths6Neg[iVar]; + word Cof1 = (pTruth[0] >> (1 << iVar)) & s_Truths6Neg[iVar]; + if ( Cof0 != Cof1 ) + return Cof0 < Cof1 ? -1 : 1; + return 0; + } + if ( iVar <= 5 ) + { + word Cof0, Cof1; + int w, shift = (1 << iVar); + for ( w = nWords - 1; w >= 0; w-- ) + { + Cof0 = pTruth[w] & s_Truths6Neg[iVar]; + Cof1 = (pTruth[w] >> shift) & s_Truths6Neg[iVar]; + if ( Cof0 != Cof1 ) + return Cof0 < Cof1 ? -1 : 1; + } + return 0; + } + // if ( iVar > 5 ) + { + word * pLimit = pTruth + nWords; + int i, iStep = Abc_TtWordNum(iVar); + assert( nWords >= 2 ); + for ( pLimit -= 2*iStep; pLimit >= pTruth; pLimit -= 2*iStep ) + for ( i = iStep - 1; i >= 0; i-- ) + if ( pLimit[i] != pLimit[i + iStep] ) + return pLimit[i] < pLimit[i + iStep] ? -1 : 1; + return 0; + } +} /**Function************************************************************* diff --git a/src/opt/dau/dauCanon.c b/src/opt/dau/dauCanon.c index 011f972a..4bc0f9c5 100644 --- a/src/opt/dau/dauCanon.c +++ b/src/opt/dau/dauCanon.c @@ -40,88 +40,6 @@ static word s_CMasks6[5] = { //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Compares Cof0 and Cof1.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline int Abc_TtCompare1VarCofs( word * pTruth, int nWords, int iVar ) -{ - if ( nWords == 1 ) - { - word Cof0 = pTruth[0] & s_Truths6Neg[iVar]; - word Cof1 = (pTruth[0] >> (1 << iVar)) & s_Truths6Neg[iVar]; - if ( Cof0 != Cof1 ) - return Cof0 < Cof1 ? -1 : 1; - return 0; - } - if ( iVar <= 5 ) - { - word Cof0, Cof1; - int w, shift = (1 << iVar); - for ( w = 0; w < nWords; w++ ) - { - Cof0 = pTruth[w] & s_Truths6Neg[iVar]; - Cof1 = (pTruth[w] >> shift) & s_Truths6Neg[iVar]; - if ( Cof0 != Cof1 ) - return Cof0 < Cof1 ? -1 : 1; - } - return 0; - } - // if ( iVar > 5 ) - { - word * pLimit = pTruth + nWords; - int i, iStep = Abc_TtWordNum(iVar); - assert( nWords >= 2 ); - for ( ; pTruth < pLimit; pTruth += 2*iStep ) - for ( i = 0; i < iStep; i++ ) - if ( pTruth[i] != pTruth[i + iStep] ) - return pTruth[i] < pTruth[i + iStep] ? -1 : 1; - return 0; - } -} -static inline int Abc_TtCompare1VarCofsRev( word * pTruth, int nWords, int iVar ) -{ - if ( nWords == 1 ) - { - word Cof0 = pTruth[0] & s_Truths6Neg[iVar]; - word Cof1 = (pTruth[0] >> (1 << iVar)) & s_Truths6Neg[iVar]; - if ( Cof0 != Cof1 ) - return Cof0 < Cof1 ? -1 : 1; - return 0; - } - if ( iVar <= 5 ) - { - word Cof0, Cof1; - int w, shift = (1 << iVar); - for ( w = nWords - 1; w >= 0; w-- ) - { - Cof0 = pTruth[w] & s_Truths6Neg[iVar]; - Cof1 = (pTruth[w] >> shift) & s_Truths6Neg[iVar]; - if ( Cof0 != Cof1 ) - return Cof0 < Cof1 ? -1 : 1; - } - return 0; - } - // if ( iVar > 5 ) - { - word * pLimit = pTruth + nWords; - int i, iStep = Abc_TtWordNum(iVar); - assert( nWords >= 2 ); - for ( pLimit -= 2*iStep; pLimit >= pTruth; pLimit -= 2*iStep ) - for ( i = iStep - 1; i >= 0; i-- ) - if ( pLimit[i] != pLimit[i + iStep] ) - return pLimit[i] < pLimit[i + iStep] ? -1 : 1; - return 0; - } -} /**Function************************************************************* -- cgit v1.2.3