src/base/io/ioReadPla.c File Reference

#include "io.h"
Include dependency graph for ioReadPla.c:

Go to the source code of this file.

Functions

static Abc_Ntk_tIo_ReadPlaNetwork (Extra_FileReader_t *p)
Abc_Ntk_tIo_ReadPla (char *pFileName, int fCheck)

Function Documentation

Abc_Ntk_t* Io_ReadPla ( char *  pFileName,
int  fCheck 
)

FUNCTION DEFINITIONS ///Function*************************************************************

Synopsis [Reads the network from a PLA file.]

Description []

SideEffects []

SeeAlso []

Definition at line 44 of file ioReadPla.c.

00045 {
00046     Extra_FileReader_t * p;
00047     Abc_Ntk_t * pNtk;
00048 
00049     // start the file
00050     p = Extra_FileReaderAlloc( pFileName, "#", "\n\r", " \t|" );
00051     if ( p == NULL )
00052         return NULL;
00053 
00054     // read the network
00055     pNtk = Io_ReadPlaNetwork( p );
00056     Extra_FileReaderFree( p );
00057     if ( pNtk == NULL )
00058         return NULL;
00059 
00060     // make sure that everything is okay with the network structure
00061     if ( fCheck && !Abc_NtkCheckRead( pNtk ) )
00062     {
00063         printf( "Io_ReadPla: The network check has failed.\n" );
00064         Abc_NtkDelete( pNtk );
00065         return NULL;
00066     }
00067     return pNtk;
00068 }

Abc_Ntk_t * Io_ReadPlaNetwork ( Extra_FileReader_t p  )  [static]

CFile****************************************************************

FileName [ioReadPla.c]

SystemName [ABC: Logic synthesis and verification system.]

PackageName [Command processing package.]

Synopsis [Procedure to read network from file.]

Author [Alan Mishchenko]

Affiliation [UC Berkeley]

Date [Ver. 1.0. Started - June 20, 2005.]

Revision [

Id
ioReadPla.c,v 1.00 2005/06/20 00:00:00 alanmi Exp

] DECLARATIONS ///

Function*************************************************************

Synopsis []

Description []

SideEffects []

SeeAlso []

Definition at line 80 of file ioReadPla.c.

00081 {
00082     ProgressBar * pProgress;
00083     Vec_Ptr_t * vTokens;
00084     Abc_Ntk_t * pNtk;
00085     Abc_Obj_t * pTermPi, * pTermPo, * pNode;
00086     Vec_Str_t ** ppSops;
00087     char Buffer[100];
00088     int nInputs = -1, nOutputs = -1, nProducts = -1;
00089     char * pCubeIn, * pCubeOut;
00090     int i, k, iLine, nDigits, nCubes;
00091  
00092     // allocate the empty network
00093     pNtk = Abc_NtkStartRead( Extra_FileReaderGetFileName(p) );
00094 
00095     // go through the lines of the file
00096     nCubes = 0;
00097     pProgress = Extra_ProgressBarStart( stdout, Extra_FileReaderGetFileSize(p) );
00098     for ( iLine = 0; vTokens = Extra_FileReaderGetTokens(p); iLine++ )
00099     {
00100         Extra_ProgressBarUpdate( pProgress, Extra_FileReaderGetCurPosition(p), NULL );
00101 
00102         // if it is the end of file, quit the loop
00103         if ( strcmp( vTokens->pArray[0], ".e" ) == 0 )
00104             break;
00105 
00106         if ( vTokens->nSize == 1 )
00107         {
00108             printf( "%s (line %d): Wrong number of token.\n", 
00109                 Extra_FileReaderGetFileName(p), iLine+1 );
00110             Abc_NtkDelete( pNtk );
00111             return NULL;
00112         }
00113 
00114         if ( strcmp( vTokens->pArray[0], ".i" ) == 0 )
00115             nInputs = atoi(vTokens->pArray[1]);
00116         else if ( strcmp( vTokens->pArray[0], ".o" ) == 0 )
00117             nOutputs = atoi(vTokens->pArray[1]);
00118         else if ( strcmp( vTokens->pArray[0], ".p" ) == 0 )
00119             nProducts = atoi(vTokens->pArray[1]);
00120         else if ( strcmp( vTokens->pArray[0], ".ilb" ) == 0 )
00121         {
00122             if ( vTokens->nSize - 1 != nInputs )
00123                 printf( "Warning: Mismatch between the number of PIs on the .i line (%d) and the number of PIs on the .ilb line (%d).\n", nInputs, vTokens->nSize - 1 );
00124             for ( i = 1; i < vTokens->nSize; i++ )
00125                 Io_ReadCreatePi( pNtk, vTokens->pArray[i] );
00126         }
00127         else if ( strcmp( vTokens->pArray[0], ".ob" ) == 0 )
00128         {
00129             if ( vTokens->nSize - 1 != nOutputs )
00130                 printf( "Warning: Mismatch between the number of POs on the .o line (%d) and the number of POs on the .ob line (%d).\n", nOutputs, vTokens->nSize - 1 );
00131             for ( i = 1; i < vTokens->nSize; i++ )
00132                 Io_ReadCreatePo( pNtk, vTokens->pArray[i] );
00133         }
00134         else 
00135         {
00136             // check if the input/output names are given
00137             if ( Abc_NtkPiNum(pNtk) == 0 )
00138             {
00139                 if ( nInputs == -1 )
00140                 {
00141                     printf( "%s: The number of inputs is not specified.\n", Extra_FileReaderGetFileName(p) );
00142                     Abc_NtkDelete( pNtk );
00143                     return NULL;
00144                 }
00145                 nDigits = Extra_Base10Log( nInputs );
00146                 for ( i = 0; i < nInputs; i++ )
00147                 {
00148                     sprintf( Buffer, "x%0*d", nDigits, i );
00149                     Io_ReadCreatePi( pNtk, Buffer );
00150                 }
00151             }
00152             if ( Abc_NtkPoNum(pNtk) == 0 )
00153             {
00154                 if ( nOutputs == -1 )
00155                 {
00156                     printf( "%s: The number of outputs is not specified.\n", Extra_FileReaderGetFileName(p) );
00157                     Abc_NtkDelete( pNtk );
00158                     return NULL;
00159                 }
00160                 nDigits = Extra_Base10Log( nOutputs );
00161                 for ( i = 0; i < nOutputs; i++ )
00162                 {
00163                     sprintf( Buffer, "z%0*d", nDigits, i );
00164                     Io_ReadCreatePo( pNtk, Buffer );
00165                 }
00166             }
00167             if ( Abc_NtkNodeNum(pNtk) == 0 )
00168             { // first time here
00169                 // create the PO drivers and add them
00170                 // start the SOP covers
00171                 ppSops = ALLOC( Vec_Str_t *, nOutputs );
00172                 Abc_NtkForEachPo( pNtk, pTermPo, i )
00173                 {
00174                     ppSops[i] = Vec_StrAlloc( 100 );
00175                     // create the node
00176                     pNode = Abc_NtkCreateNode(pNtk);
00177                     // connect the node to the PO net
00178                     Abc_ObjAddFanin( Abc_ObjFanin0Ntk(pTermPo), pNode );
00179                     // connect the node to the PI nets
00180                     Abc_NtkForEachPi( pNtk, pTermPi, k )
00181                         Abc_ObjAddFanin( pNode, Abc_ObjFanout0Ntk(pTermPi) );
00182                 }
00183             }
00184             // read the cubes
00185             if ( vTokens->nSize != 2 )
00186             {
00187                 printf( "%s (line %d): Input and output cubes are not specified.\n", 
00188                     Extra_FileReaderGetFileName(p), iLine+1 );
00189                 Abc_NtkDelete( pNtk );
00190                 return NULL;
00191             }
00192             pCubeIn  = vTokens->pArray[0];
00193             pCubeOut = vTokens->pArray[1];
00194             if ( strlen(pCubeIn) != (unsigned)nInputs )
00195             {
00196                 printf( "%s (line %d): Input cube length (%d) differs from the number of inputs (%d).\n", 
00197                     Extra_FileReaderGetFileName(p), iLine+1, strlen(pCubeIn), nInputs );
00198                 Abc_NtkDelete( pNtk );
00199                 return NULL;
00200             }
00201             if ( strlen(pCubeOut) != (unsigned)nOutputs )
00202             {
00203                 printf( "%s (line %d): Output cube length (%d) differs from the number of outputs (%d).\n", 
00204                     Extra_FileReaderGetFileName(p), iLine+1, strlen(pCubeOut), nOutputs );
00205                 Abc_NtkDelete( pNtk );
00206                 return NULL;
00207             }
00208             for ( i = 0; i < nOutputs; i++ )
00209             {
00210                 if ( pCubeOut[i] == '1' )
00211                 {
00212                     Vec_StrAppend( ppSops[i], pCubeIn );
00213                     Vec_StrAppend( ppSops[i], " 1\n" );
00214                 }
00215             }
00216             nCubes++;
00217         }
00218     }
00219     Extra_ProgressBarStop( pProgress );
00220     if ( nProducts != -1 && nCubes != nProducts )
00221         printf( "Warning: Mismatch between the number of cubes (%d) and the number on .p line (%d).\n", 
00222             nCubes, nProducts );
00223 
00224     // add the SOP covers
00225     Abc_NtkForEachPo( pNtk, pTermPo, i )
00226     {
00227         pNode = Abc_ObjFanin0Ntk( Abc_ObjFanin0(pTermPo) );
00228         if ( ppSops[i]->nSize == 0 )
00229         {
00230             Abc_ObjRemoveFanins(pNode);
00231             pNode->pData = Abc_SopRegister( pNtk->pManFunc, " 0\n" );
00232             Vec_StrFree( ppSops[i] );
00233             continue;
00234         }
00235         Vec_StrPush( ppSops[i], 0 );
00236         pNode->pData = Abc_SopRegister( pNtk->pManFunc, ppSops[i]->pArray );
00237         Vec_StrFree( ppSops[i] );
00238     }
00239     free( ppSops );
00240     Abc_NtkFinalizeRead( pNtk );
00241     return pNtk;
00242 }


Generated on Tue Jan 5 12:18:46 2010 for abc70930 by  doxygen 1.6.1