ioReadEdif.c 9.11 KB
Newer Older
Alan Mishchenko committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
/**CFile****************************************************************

  FileName    [ioReadEdif.c]

  SystemName  [ABC: Logic synthesis and verification system.]

  PackageName [Command processing package.]

  Synopsis    [Procedure to read ISCAS benchmarks in EDIF.]

  Author      [Alan Mishchenko]
  
  Affiliation [UC Berkeley]

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

  Revision    [$Id: ioReadEdif.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $]

***********************************************************************/

Alan Mishchenko committed
21
#include "ioAbc.h"
Alan Mishchenko committed
22

23 24 25
ABC_NAMESPACE_IMPL_START


Alan Mishchenko committed
26 27 28 29 30 31 32
////////////////////////////////////////////////////////////////////////
///                        DECLARATIONS                              ///
////////////////////////////////////////////////////////////////////////

static Abc_Ntk_t * Io_ReadEdifNetwork( Extra_FileReader_t * p );

////////////////////////////////////////////////////////////////////////
Alan Mishchenko committed
33
///                     FUNCTION DEFINITIONS                         ///
Alan Mishchenko committed
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
////////////////////////////////////////////////////////////////////////

/**Function*************************************************************

  Synopsis    [Reads the network from an EDIF file.]

  Description [Works only for the ISCAS benchmarks.]
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
Abc_Ntk_t * Io_ReadEdif( char * pFileName, int fCheck )
{
    Extra_FileReader_t * p;
    Abc_Ntk_t * pNtk;

Alan Mishchenko committed
52 53 54
    printf( "Currently this parser does not work!\n" );
    return NULL;

Alan Mishchenko committed
55
    // start the file
Alan Mishchenko committed
56
    p = Extra_FileReaderAlloc( pFileName, "#", "\n\r", " \t()" );
Alan Mishchenko committed
57 58 59 60 61 62 63 64 65 66
    if ( p == NULL )
        return NULL;

    // read the network
    pNtk = Io_ReadEdifNetwork( p );
    Extra_FileReaderFree( p );
    if ( pNtk == NULL )
        return NULL;

    // make sure that everything is okay with the network structure
Alan Mishchenko committed
67
    if ( fCheck && !Abc_NtkCheckRead( pNtk ) )
Alan Mishchenko committed
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
    {
        printf( "Io_ReadEdif: The network check has failed.\n" );
        Abc_NtkDelete( pNtk );
        return NULL;
    }
    return pNtk;
}
/**Function*************************************************************

  Synopsis    []

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
Abc_Ntk_t * Io_ReadEdifNetwork( Extra_FileReader_t * p )
{
    ProgressBar * pProgress;
    Vec_Ptr_t * vTokens;
    Abc_Ntk_t * pNtk;
    Abc_Obj_t * pNet, * pObj, * pFanout;
    char * pGateName, * pNetName;
    int fTokensReady, iLine, i;

    // read the first line
96 97
    vTokens = (Vec_Ptr_t *)Extra_FileReaderGetTokens(p);
    if ( strcmp( (char *)vTokens->pArray[0], "edif" ) != 0 )
Alan Mishchenko committed
98 99 100 101 102 103 104 105 106 107 108
    {
        printf( "%s: Wrong input file format.\n", Extra_FileReaderGetFileName(p) );
        return NULL;
    }
    
    // allocate the empty network
    pNtk = Abc_NtkStartRead( Extra_FileReaderGetFileName(p) );

    // go through the lines of the file
    fTokensReady = 0;
    pProgress = Extra_ProgressBarStart( stdout, Extra_FileReaderGetFileSize(p) );
109
    for ( iLine = 1; fTokensReady || (vTokens = (Vec_Ptr_t *)Extra_FileReaderGetTokens(p)); iLine++ )
Alan Mishchenko committed
110 111 112 113 114
    {
        Extra_ProgressBarUpdate( pProgress, Extra_FileReaderGetCurPosition(p), NULL );

        // get the type of the line
        fTokensReady = 0;
115
        if ( strcmp( (char *)vTokens->pArray[0], "instance" ) == 0 )
Alan Mishchenko committed
116
        { 
117
            pNetName = (char *)vTokens->pArray[1];
Alan Mishchenko committed
118
            pNet = Abc_NtkFindOrCreateNet( pNtk, pNetName );
119 120 121
            vTokens = (Vec_Ptr_t *)Extra_FileReaderGetTokens(p);
            vTokens = (Vec_Ptr_t *)Extra_FileReaderGetTokens(p);
            pGateName = (char *)vTokens->pArray[1];
Alan Mishchenko committed
122
            if ( strncmp( pGateName, "Flip", 4 ) == 0 )
Alan Mishchenko committed
123
            {
Alan Mishchenko committed
124
                pObj = Abc_NtkCreateLatch( pNtk );
Alan Mishchenko committed
125 126
                Abc_LatchSetInit0( pObj );
            }
Alan Mishchenko committed
127 128 129
            else
            {
                pObj = Abc_NtkCreateNode( pNtk );
Alan Mishchenko committed
130 131
//                pObj->pData = Abc_NtkRegisterName( pNtk, pGateName );
                pObj->pData = Extra_UtilStrsav( pGateName ); // memory leak!!!
Alan Mishchenko committed
132 133 134
            }
            Abc_ObjAddFanin( pNet, pObj );
        }
135
        else if ( strcmp( (char *)vTokens->pArray[0], "net" ) == 0 )
Alan Mishchenko committed
136
        {
137
            pNetName = (char *)vTokens->pArray[1];
Alan Mishchenko committed
138 139 140 141 142 143
            if ( strcmp( pNetName, "CK" ) == 0 || strcmp( pNetName, "RESET" ) == 0 )
                continue;
            if ( strcmp( pNetName + strlen(pNetName) - 4, "_out" ) == 0 )
                pNetName[strlen(pNetName) - 4] = 0;
            pNet = Abc_NtkFindNet( pNtk, pNetName );
            assert( pNet );
144 145 146 147
            vTokens = (Vec_Ptr_t *)Extra_FileReaderGetTokens(p);
            vTokens = (Vec_Ptr_t *)Extra_FileReaderGetTokens(p);
            vTokens = (Vec_Ptr_t *)Extra_FileReaderGetTokens(p);
            while ( strcmp( (char *)vTokens->pArray[0], "portRef" ) == 0 )
Alan Mishchenko committed
148
            {
149
                if ( strcmp( pNetName, (char *)vTokens->pArray[3] ) != 0 )
Alan Mishchenko committed
150
                {
151
                    pFanout = Abc_NtkFindNet( pNtk, (char *)vTokens->pArray[3] );
Alan Mishchenko committed
152 153
                    Abc_ObjAddFanin( Abc_ObjFanin0(pFanout), pNet );
                }
154
                vTokens = (Vec_Ptr_t *)Extra_FileReaderGetTokens(p);
Alan Mishchenko committed
155 156 157
            }
            fTokensReady = 1;
        }
158
        else if ( strcmp( (char *)vTokens->pArray[0], "library" ) == 0 )
Alan Mishchenko committed
159
        {
160 161 162 163 164 165
            vTokens = (Vec_Ptr_t *)Extra_FileReaderGetTokens(p);
            vTokens = (Vec_Ptr_t *)Extra_FileReaderGetTokens(p);
            vTokens = (Vec_Ptr_t *)Extra_FileReaderGetTokens(p);
            vTokens = (Vec_Ptr_t *)Extra_FileReaderGetTokens(p);
            vTokens = (Vec_Ptr_t *)Extra_FileReaderGetTokens(p);
            while ( strcmp( (char *)vTokens->pArray[0], "port" ) == 0 )
Alan Mishchenko committed
166
            {
167
                pNetName = (char *)vTokens->pArray[1];
Alan Mishchenko committed
168 169
                if ( strcmp( pNetName, "CK" ) == 0 || strcmp( pNetName, "RESET" ) == 0 )
                {
170
                    vTokens = (Vec_Ptr_t *)Extra_FileReaderGetTokens(p);
Alan Mishchenko committed
171 172 173 174
                    continue;
                }
                if ( strcmp( pNetName + strlen(pNetName) - 3, "_PO" ) == 0 )
                    pNetName[strlen(pNetName) - 3] = 0;
175 176 177 178
                if ( strcmp( (char *)vTokens->pArray[3], "INPUT" ) == 0 )
                    Io_ReadCreatePi( pNtk, (char *)vTokens->pArray[1] );
                else if ( strcmp( (char *)vTokens->pArray[3], "OUTPUT" ) == 0 )
                    Io_ReadCreatePo( pNtk, (char *)vTokens->pArray[1] );
Alan Mishchenko committed
179 180 181 182 183 184
                else
                {
                    printf( "%s (line %d): Wrong interface specification.\n", Extra_FileReaderGetFileName(p), iLine );
                    Abc_NtkDelete( pNtk );
                    return NULL;
                }
185
                vTokens = (Vec_Ptr_t *)Extra_FileReaderGetTokens(p);
Alan Mishchenko committed
186 187
            }
        }
188
        else if ( strcmp( (char *)vTokens->pArray[0], "design" ) == 0 )
Alan Mishchenko committed
189
        {
Alan Mishchenko committed
190
            ABC_FREE( pNtk->pName ); 
191
            pNtk->pName = (char *)Extra_UtilStrsav( (char *)vTokens->pArray[3] );
Alan Mishchenko committed
192 193 194 195 196 197 198 199
            break;
        }
    }
    Extra_ProgressBarStop( pProgress );

    // assign logic functions
    Abc_NtkForEachNode( pNtk, pObj, i )
    {
200
        if ( strncmp( (char *)pObj->pData, "And", 3 ) == 0 )
201
            Abc_ObjSetData( pObj, Abc_SopCreateAnd((Mem_Flex_t *)pNtk->pManFunc, Abc_ObjFaninNum(pObj), NULL) );
202
        else if ( strncmp( (char *)pObj->pData, "Or", 2 ) == 0 )
203
            Abc_ObjSetData( pObj, Abc_SopCreateOr((Mem_Flex_t *)pNtk->pManFunc, Abc_ObjFaninNum(pObj), NULL) );
204
        else if ( strncmp( (char *)pObj->pData, "Nand", 4 ) == 0 )
205
            Abc_ObjSetData( pObj, Abc_SopCreateNand((Mem_Flex_t *)pNtk->pManFunc, Abc_ObjFaninNum(pObj)) );
206
        else if ( strncmp( (char *)pObj->pData, "Nor", 3 ) == 0 )
207
            Abc_ObjSetData( pObj, Abc_SopCreateNor((Mem_Flex_t *)pNtk->pManFunc, Abc_ObjFaninNum(pObj)) );
208
        else if ( strncmp( (char *)pObj->pData, "Exor", 4 ) == 0 )
209
            Abc_ObjSetData( pObj, Abc_SopCreateXor((Mem_Flex_t *)pNtk->pManFunc, Abc_ObjFaninNum(pObj)) );
210
        else if ( strncmp( (char *)pObj->pData, "Exnor", 5 ) == 0 )
211
            Abc_ObjSetData( pObj, Abc_SopCreateNxor((Mem_Flex_t *)pNtk->pManFunc, Abc_ObjFaninNum(pObj)) );
212
        else if ( strncmp( (char *)pObj->pData, "Inv", 3 ) == 0 )
213
            Abc_ObjSetData( pObj, Abc_SopCreateInv((Mem_Flex_t *)pNtk->pManFunc) );
214
        else if ( strncmp( (char *)pObj->pData, "Buf", 3 ) == 0 )
215
            Abc_ObjSetData( pObj, Abc_SopCreateBuf((Mem_Flex_t *)pNtk->pManFunc) );
Alan Mishchenko committed
216 217
        else
        {
Alan Mishchenko committed
218
            printf( "%s: Unknown gate type \"%s\".\n", Extra_FileReaderGetFileName(p), (char*)pObj->pData );
Alan Mishchenko committed
219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238
            Abc_NtkDelete( pNtk );
            return NULL;
        }
    }
    // check if constants have been added
//    if ( pNet = Abc_NtkFindNet( pNtk, "VDD" ) )
//        Io_ReadCreateConst( pNtk, "VDD", 1 );
//    if ( pNet = Abc_NtkFindNet( pNtk, "GND" ) )
//        Io_ReadCreateConst( pNtk, "GND", 0 );

    Abc_NtkFinalizeRead( pNtk );
    return pNtk;
}

////////////////////////////////////////////////////////////////////////
///                       END OF FILE                                ///
////////////////////////////////////////////////////////////////////////



239 240
ABC_NAMESPACE_IMPL_END