From e5c60e2b929f45b0af56ca13556c5a99727af0ec Mon Sep 17 00:00:00 2001 From: Alan Mishchenko Date: Sat, 23 Feb 2013 12:49:43 -0800 Subject: K-hot STG encoding. --- src/aig/gia/giaStg.c | 179 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 178 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/aig/gia/giaStg.c b/src/aig/gia/giaStg.c index 40c40139..af2b8446 100644 --- a/src/aig/gia/giaStg.c +++ b/src/aig/gia/giaStg.c @@ -63,6 +63,182 @@ int Gia_ManCreateOrGate( Gia_Man_t * p, Vec_Int_t * vLits ) return Vec_IntEntry(vLits, 0); } +/**Function************************************************************* + + Synopsis [] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +Vec_Vec_t * Gia_ManAssignCodes( int kHot, int nStates, int * pnBits ) +{ + Vec_Vec_t * vCodes; + int s, i1, i2, i3, i4, nBits; + assert( nStates > 0 ); + vCodes = Vec_VecStart( nStates ); + *pnBits = -1; + if ( kHot == 1 ) + { + for ( i1 = 0; i1 < nStates; i1++ ) + Vec_VecPushInt( vCodes, i1, i1 ); + *pnBits = nStates; + return vCodes; + } + if ( kHot == 2 ) + { + for ( nBits = kHot; nBits < ABC_INFINITY; nBits++ ) + if ( nBits * (nBits-1) / 2 >= nStates ) + break; + *pnBits = nBits; + s = 0; + for ( i1 = 0; i1 < nBits; i1++ ) + for ( i2 = i1 + 1; i2 < nBits; i2++ ) + { + Vec_VecPushInt( vCodes, s, i1 ); + Vec_VecPushInt( vCodes, s, i2 ); + if ( ++s == nStates ) + return vCodes; + } + } + if ( kHot == 3 ) + { + for ( nBits = kHot; nBits < ABC_INFINITY; nBits++ ) + if ( nBits * (nBits-1) * (nBits-2) / 6 >= nStates ) + break; + *pnBits = nBits; + s = 0; + for ( i1 = 0; i1 < nBits; i1++ ) + for ( i2 = i1 + 1; i2 < nBits; i2++ ) + for ( i3 = i2 + 1; i3 < nBits; i3++ ) + { + Vec_VecPushInt( vCodes, s, i1 ); + Vec_VecPushInt( vCodes, s, i2 ); + Vec_VecPushInt( vCodes, s, i3 ); + if ( ++s == nStates ) + return vCodes; + } + } + if ( kHot == 4 ) + { + for ( nBits = kHot; nBits < ABC_INFINITY; nBits++ ) + if ( nBits * (nBits-1) * (nBits-2) * (nBits-3) / 24 >= nStates ) + break; + *pnBits = nBits; + s = 0; + for ( i1 = 0; i1 < nBits; i1++ ) + for ( i2 = i1 + 1; i2 < nBits; i2++ ) + for ( i3 = i2 + 1; i3 < nBits; i3++ ) + for ( i4 = i3 + 1; i4 < nBits; i4++ ) + { + Vec_VecPushInt( vCodes, s, i1 ); + Vec_VecPushInt( vCodes, s, i2 ); + Vec_VecPushInt( vCodes, s, i3 ); + Vec_VecPushInt( vCodes, s, i4 ); + if ( ++s == nStates ) + return vCodes; + } + } + assert( 0 ); + return NULL; +} + +/**Function************************************************************* + + Synopsis [] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +Gia_Man_t * Gia_ManStgKHot( Vec_Int_t * vLines, int nIns, int nOuts, int nStates, int kHot ) +{ + Gia_Man_t * p; + Vec_Int_t * vInMints, * vCurs, * vVec; + Vec_Vec_t * vLitsNext, * vLitsOuts, * vCodes; + int i, b, k, nBits, LitC, Lit; + assert( Vec_IntSize(vLines) % 4 == 0 ); + vCodes = Gia_ManAssignCodes( kHot, nStates, &nBits ); + + // start manager + p = Gia_ManStart( 10000 ); + p->pName = Abc_UtilStrsav( "stg" ); + for ( i = 0; i < nIns + nBits; i++ ) + Gia_ManAppendCi(p); + + // create input minterms + Gia_ManHashAlloc( p ); + vInMints = Vec_IntAlloc( 1 << nIns ); + for ( i = 0; i < (1 << nIns); i++ ) + { + for ( Lit = 1, b = 0; b < nIns; b++ ) + Lit = Gia_ManHashAnd( p, Lit, Abc_Var2Lit( b+1, !((i >> b) & 1) ) ); + Vec_IntPush( vInMints, Lit ); + } + + // create current states + vCurs = Vec_IntAlloc( nStates ); + assert( Vec_VecSize(vCodes) == nStates ); + Vec_VecForEachLevelInt( vCodes, vVec, i ) + { + Lit = 1; + Vec_IntForEachEntry( vVec, b, k ) + Lit = Gia_ManHashAnd( p, Lit, Abc_Var2Lit(b+1+nIns,!i) ); + Vec_IntPush( vCurs, Lit ); + } + + // go through the lines + vLitsNext = Vec_VecStart( nBits ); + vLitsOuts = Vec_VecStart( nOuts ); + for ( i = 0; i < Vec_IntSize(vLines); ) + { + int iMint = Vec_IntEntry(vLines, i++); + int iCur = Vec_IntEntry(vLines, i++) - 1; + int iNext = Vec_IntEntry(vLines, i++) - 1; + int iOut = Vec_IntEntry(vLines, i++); + assert( iMint >= 0 && iMint < (1<= 0 && iCur < nStates ); + assert( iNext >= 0 && iNext < nStates ); + assert( iOut >= 0 && iOut < (1<> b) & 1 ) + Vec_VecPushInt( vLitsOuts, b, LitC ); + } + Vec_IntFree( vInMints ); + Vec_IntFree( vCurs ); + Vec_VecFree( vCodes ); + + // create POs + Vec_VecForEachLevelInt( vLitsOuts, vVec, i ) + Gia_ManAppendCo( p, Gia_ManCreateOrGate(p, vVec) ); + Vec_VecFree( vLitsOuts ); + + // create next states + Vec_VecForEachLevelInt( vLitsNext, vVec, i ) + Gia_ManAppendCo( p, Abc_LitNotCond( Gia_ManCreateOrGate(p, vVec), !(i