diff --git a/src/aig/gia/giaIf.c b/src/aig/gia/giaIf.c index 682d7b171..179b9c630 100644 --- a/src/aig/gia/giaIf.c +++ b/src/aig/gia/giaIf.c @@ -2124,6 +2124,24 @@ void Gia_ManConfigPrint2( unsigned char * pConfigData, int nLeaves ) } } +static inline word Gia_ManFromIfPermuteTruth4( word Truth, int nLeaves, word z ) +{ + word TruthNew = 0; + int i, k, x; + assert( nLeaves >= 1 && nLeaves <= 4 ); + for ( i = 0; i < 16; i++ ) + { + x = 0; + for ( k = 0; k < nLeaves; k++ ) + { + int v = (int)((z >> (2 * k)) & 3); + x |= ((i >> k) & 1) << v; + } + TruthNew |= ((Truth >> x) & 1) << i; + } + return TruthNew; +} + /**Function************************************************************* Synopsis [Derive configurations.] @@ -2145,6 +2163,7 @@ void Gia_ManFromIfGetConfig2( Vec_Str_t * vConfigs2, If_Man_t * pIfMan, word * p { word z = If_CutPerformDeriveJ( pIfMan, (unsigned *)pTruth, nLeaves, nLeaves, NULL, 1, fDelay ); int fHavePerm = (z != 0) && ((z & ABC_CONST(0x4000000000000000)) != 0); + word Truth = pTruth[0]; // Cell type 0: Simple LUT4 CellId = 0; // Write CellId @@ -2158,7 +2177,8 @@ void Gia_ManFromIfGetConfig2( Vec_Str_t * vConfigs2, If_Man_t * pIfMan, word * p for ( ; i < 4; i++ ) Vec_StrPush( vConfigs2, 0 ); // Write truth table (16 bits for LUT4) - word Truth = pTruth[0]; + if ( fHavePerm ) + Truth = Gia_ManFromIfPermuteTruth4( Truth, nLeaves, z ); Vec_StrPush( vConfigs2, (char)((Truth >> 8) & 0xFF) ); Vec_StrPush( vConfigs2, (char)(Truth & 0xFF) ); assert( startPos + 7 == Vec_StrSize(vConfigs2) ); diff --git a/src/aig/gia/giaSpeedup.c b/src/aig/gia/giaSpeedup.c index e5caba8fc..003acedcd 100644 --- a/src/aig/gia/giaSpeedup.c +++ b/src/aig/gia/giaSpeedup.c @@ -57,7 +57,7 @@ static int Gia_ManConfig2GetBytePos( Gia_Man_t * p, int iObj ) } return -1; } -static int Gia_ManConfig2DerivePinDelays( Gia_Man_t * p, int iObj, If_LibCell_t * pCellLib, int * pPinDelay, int nLutSize ) +int Gia_ManConfig2DerivePinDelays( Gia_Man_t * p, int iObj, If_LibCell_t * pCellLib, int * pPinDelay, int nLutSize ) { int bytePos, i, nPins; unsigned char CellId; @@ -76,7 +76,7 @@ static int Gia_ManConfig2DerivePinDelays( Gia_Man_t * p, int iObj, If_LibCell_t { int v = (unsigned char)Vec_StrEntry( p->vConfigs2, bytePos + 1 + i ); if ( v >= 2 && v < 2 + nLutSize ) - pPinDelay[v - 2] = pCellLib->pCellPinDelays[CellId][i]; + pPinDelay[v - 2] = Abc_MaxInt( pPinDelay[v - 2], pCellLib->pCellPinDelays[CellId][i] ); } return 1; }