/**CFile**************************************************************** FileName [giaAigerExt.c] SystemName [ABC: Logic synthesis and verification system.] PackageName [Scalable AIG package.] Synopsis [Custom AIGER extensions.] Author [Alan Mishchenko] Affiliation [UC Berkeley] Date [Ver. 1.0. Started - June 20, 2005.] Revision [$Id: giaAigerExt.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] ***********************************************************************/ #include "gia.h" ABC_NAMESPACE_IMPL_START //////////////////////////////////////////////////////////////////////// /// DECLARATIONS /// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// /**Function************************************************************* Synopsis [Read/write equivalence classes information.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Gia_Rpr_t * Gia_AigerReadEquivClasses( unsigned char ** ppPos, int nSize ) { Gia_Rpr_t * pReprs; unsigned char * pStop; int i, Item, fProved, iRepr, iNode; pStop = *ppPos; pStop += Gia_AigerReadInt( *ppPos ); *ppPos += 4; pReprs = ABC_CALLOC( Gia_Rpr_t, nSize ); for ( i = 0; i < nSize; i++ ) pReprs[i].iRepr = GIA_VOID; iRepr = iNode = 0; while ( *ppPos < pStop ) { Item = Gia_AigerReadUnsigned( ppPos ); if ( Item & 1 ) { iRepr += (Item >> 1); iNode = iRepr; continue; } Item >>= 1; fProved = (Item & 1); Item >>= 1; iNode += Item; pReprs[iNode].fProved = fProved; pReprs[iNode].iRepr = iRepr; assert( iRepr < iNode ); } return pReprs; } unsigned char * Gia_WriteEquivClassesInt( Gia_Man_t * p, int * pEquivSize ) { unsigned char * pBuffer; int iRepr, iNode, iPrevRepr, iPrevNode, iLit, nItems, iPos; assert( p->pReprs && p->pNexts ); // count the number of entries to be written nItems = 0; for ( iRepr = 1; iRepr < Gia_ManObjNum(p); iRepr++ ) { nItems += Gia_ObjIsConst( p, iRepr ); if ( !Gia_ObjIsHead(p, iRepr) ) continue; Gia_ClassForEachObj( p, iRepr, iNode ) nItems++; } pBuffer = ABC_ALLOC( unsigned char, sizeof(int) * (nItems + 10) ); // write constant class iPos = Gia_AigerWriteUnsignedBuffer( pBuffer, 4, Abc_Var2Lit(0, 1) ); iPrevNode = 0; for ( iNode = 1; iNode < Gia_ManObjNum(p); iNode++ ) if ( Gia_ObjIsConst(p, iNode) ) { iLit = Abc_Var2Lit( iNode - iPrevNode, Gia_ObjProved(p, iNode) ); iPrevNode = iNode; iPos = Gia_AigerWriteUnsignedBuffer( pBuffer, iPos, Abc_Var2Lit(iLit, 0) ); } // write non-constant classes iPrevRepr = 0; Gia_ManForEachClass( p, iRepr ) { iPos = Gia_AigerWriteUnsignedBuffer( pBuffer, iPos, Abc_Var2Lit(iRepr - iPrevRepr, 1) ); iPrevRepr = iPrevNode = iRepr; Gia_ClassForEachObj1( p, iRepr, iNode ) { iLit = Abc_Var2Lit( iNode - iPrevNode, Gia_ObjProved(p, iNode) ); iPrevNode = iNode; iPos = Gia_AigerWriteUnsignedBuffer( pBuffer, iPos, Abc_Var2Lit(iLit, 0) ); } } Gia_AigerWriteInt( pBuffer, iPos ); *pEquivSize = iPos; return pBuffer; } Vec_Str_t * Gia_WriteEquivClasses( Gia_Man_t * p ) { int nEquivSize; unsigned char * pBuffer = Gia_WriteEquivClassesInt( p, &nEquivSize ); return Vec_StrAllocArray( (char *)pBuffer, nEquivSize ); } /**Function************************************************************* Synopsis [Read/write mapping information.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ static inline unsigned Gia_AigerReadDiffValue( unsigned char ** ppPos, int iPrev ) { int Item = Gia_AigerReadUnsigned( ppPos ); if ( Item & 1 ) return iPrev + (Item >> 1); return iPrev - (Item >> 1); } int * Gia_AigerReadMapping( unsigned char ** ppPos, int nSize ) { int * pMapping; unsigned char * pStop; int k, j, nFanins, nAlloc, iNode = 0, iOffset = nSize; pStop = *ppPos; pStop += Gia_AigerReadInt( *ppPos ); *ppPos += 4; nAlloc = nSize + pStop - *ppPos; pMapping = ABC_CALLOC( int, nAlloc ); while ( *ppPos < pStop ) { k = iOffset; pMapping[k++] = nFanins = Gia_AigerReadUnsigned( ppPos ); for ( j = 0; j <= nFanins; j++ ) pMapping[k++] = iNode = Gia_AigerReadDiffValue( ppPos, iNode ); pMapping[iNode] = iOffset; iOffset = k; } assert( iOffset <= nAlloc ); return pMapping; } static inline int Gia_AigerWriteDiffValue( unsigned char * pPos, int iPos, int iPrev, int iThis ) { if ( iPrev < iThis ) return Gia_AigerWriteUnsignedBuffer( pPos, iPos, Abc_Var2Lit(iThis - iPrev, 1) ); return Gia_AigerWriteUnsignedBuffer( pPos, iPos, Abc_Var2Lit(iPrev - iThis, 0) ); } unsigned char * Gia_AigerWriteMappingInt( Gia_Man_t * p, int * pMapSize ) { unsigned char * pBuffer; int i, k, iPrev, iFan, nItems, iPos = 4; assert( Gia_ManHasMapping(p) ); // count the number of entries to be written nItems = 0; Gia_ManForEachLut( p, i ) nItems += 2 + Gia_ObjLutSize( p, i ); pBuffer = ABC_ALLOC( unsigned char, sizeof(int) * (nItems + 1) ); // write non-constant classes iPrev = 0; Gia_ManForEachLut( p, i ) { //printf( "\nSize = %d ", Gia_ObjLutSize(p, i) ); iPos = Gia_AigerWriteUnsignedBuffer( pBuffer, iPos, Gia_ObjLutSize(p, i) ); Gia_LutForEachFanin( p, i, iFan, k ) { //printf( "Fan = %d ", iFan ); iPos = Gia_AigerWriteDiffValue( pBuffer, iPos, iPrev, iFan ); iPrev = iFan; } iPos = Gia_AigerWriteDiffValue( pBuffer, iPos, iPrev, i ); iPrev = i; //printf( "Node = %d ", i ); } //printf( "\n" ); Gia_AigerWriteInt( pBuffer, iPos ); *pMapSize = iPos; return pBuffer; } Vec_Str_t * Gia_AigerWriteMapping( Gia_Man_t * p ) { int nMapSize; unsigned char * pBuffer = Gia_AigerWriteMappingInt( p, &nMapSize ); return Vec_StrAllocArray( (char *)pBuffer, nMapSize ); } /**Function************************************************************* Synopsis [Read/write mapping information.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ int * Gia_AigerReadMappingSimple( unsigned char ** ppPos, int nSize ) { int * pMapping = ABC_ALLOC( int, nSize/4 ); memcpy( pMapping, *ppPos, nSize ); assert( nSize % 4 == 0 ); return pMapping; } Vec_Str_t * Gia_AigerWriteMappingSimple( Gia_Man_t * p ) { unsigned char * pBuffer = ABC_ALLOC( unsigned char, 4*Vec_IntSize(p->vMapping) ); memcpy( pBuffer, Vec_IntArray(p->vMapping), 4*Vec_IntSize(p->vMapping) ); assert( Vec_IntSize(p->vMapping) >= Gia_ManObjNum(p) ); return Vec_StrAllocArray( (char *)pBuffer, 4*Vec_IntSize(p->vMapping) ); } /**Function************************************************************* Synopsis [Read/write mapping information.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Vec_Int_t * Gia_AigerReadMappingDoc( unsigned char ** ppPos, int nObjs ) { int * pMapping, nLuts, LutSize, iRoot, nFanins, i, k, nOffset; nLuts = Gia_AigerReadInt( *ppPos ); *ppPos += 4; LutSize = Gia_AigerReadInt( *ppPos ); *ppPos += 4; pMapping = ABC_CALLOC( int, nObjs + (LutSize + 2) * nLuts ); nOffset = nObjs; for ( i = 0; i < nLuts; i++ ) { iRoot = Gia_AigerReadInt( *ppPos ); *ppPos += 4; nFanins = Gia_AigerReadInt( *ppPos ); *ppPos += 4; pMapping[iRoot] = nOffset; // write one pMapping[ nOffset++ ] = nFanins; for ( k = 0; k < nFanins; k++ ) { pMapping[ nOffset++ ] = Gia_AigerReadInt( *ppPos ); *ppPos += 4; } pMapping[ nOffset++ ] = iRoot; } return Vec_IntAllocArray( pMapping, nOffset ); } Vec_Str_t * Gia_AigerWriteMappingDoc( Gia_Man_t * p ) { unsigned char * pBuffer; int i, k, iFan, nLuts = 0, LutSize = 0, nSize = 2, nSize2 = 0; Gia_ManForEachLut( p, i ) { nLuts++; nSize += Gia_ObjLutSize(p, i) + 2; LutSize = Abc_MaxInt( LutSize, Gia_ObjLutSize(p, i) ); } pBuffer = ABC_ALLOC( unsigned char, 4 * nSize ); Gia_AigerWriteInt( pBuffer + 4 * nSize2++, nLuts ); Gia_AigerWriteInt( pBuffer + 4 * nSize2++, LutSize ); Gia_ManForEachLut( p, i ) { Gia_AigerWriteInt( pBuffer + 4 * nSize2++, i ); Gia_AigerWriteInt( pBuffer + 4 * nSize2++, Gia_ObjLutSize(p, i) ); Gia_LutForEachFanin( p, i, iFan, k ) Gia_AigerWriteInt( pBuffer + 4 * nSize2++, iFan ); } assert( nSize2 == nSize ); return Vec_StrAllocArray( (char *)pBuffer, 4*nSize ); } /**Function************************************************************* Synopsis [Read/write packing information.] Description [] SideEffects [] SeeAlso [] ***********************************************************************/ Vec_Int_t * Gia_AigerReadPacking( unsigned char ** ppPos, int nSize ) { Vec_Int_t * vPacking = Vec_IntAlloc( nSize/4 ); int i; assert( nSize % 4 == 0 ); for ( i = 0; i < nSize/4; i++, *ppPos += 4 ) Vec_IntPush( vPacking, Gia_AigerReadInt( *ppPos ) ); return vPacking; } Vec_Str_t * Gia_WritePacking( Vec_Int_t * vPacking ) { unsigned char * pBuffer = ABC_ALLOC( unsigned char, 4*Vec_IntSize(vPacking) ); int i, Entry, nSize = 0; Vec_IntForEachEntry( vPacking, Entry, i ) Gia_AigerWriteInt( pBuffer + 4 * nSize++, Entry ); return Vec_StrAllocArray( (char *)pBuffer, 4*Vec_IntSize(vPacking) ); } //////////////////////////////////////////////////////////////////////// /// END OF FILE /// //////////////////////////////////////////////////////////////////////// ABC_NAMESPACE_IMPL_END