ioWritePla.c 5.94 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    [ioWritePla.c]

  SystemName  [ABC: Logic synthesis and verification system.]

  PackageName [Command processing package.]

  Synopsis    [Procedures to write the network in BENCH format.]

  Author      [Alan Mishchenko]
  
  Affiliation [UC Berkeley]

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

  Revision    [$Id: ioWritePla.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 26 27 28 29

////////////////////////////////////////////////////////////////////////
///                        DECLARATIONS                              ///
////////////////////////////////////////////////////////////////////////

static int    Io_WritePlaOne( FILE * pFile, Abc_Ntk_t * pNtk );

////////////////////////////////////////////////////////////////////////
Alan Mishchenko committed
30
///                     FUNCTION DEFINITIONS                         ///
Alan Mishchenko committed
31 32 33 34
////////////////////////////////////////////////////////////////////////

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

Alan Mishchenko committed
35
  Synopsis    [Writes the network in PLA format.]
Alan Mishchenko committed
36 37 38 39 40 41 42 43 44 45 46 47 48

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
int Io_WritePla( Abc_Ntk_t * pNtk, char * pFileName )
{
    Abc_Ntk_t * pExdc;
    FILE * pFile;

Alan Mishchenko committed
49
    assert( Abc_NtkIsSopNetlist(pNtk) );
Alan Mishchenko committed
50
    assert( Abc_NtkLevel(pNtk) == 1 );
Alan Mishchenko committed
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71

    pFile = fopen( pFileName, "w" );
    if ( pFile == NULL )
    {
        fprintf( stdout, "Io_WritePla(): Cannot open the output file.\n" );
        return 0;
    }
    fprintf( pFile, "# Benchmark \"%s\" written by ABC on %s\n", pNtk->pName, Extra_TimeStamp() );
    // write the network
    Io_WritePlaOne( pFile, pNtk );
    // write EXDC network if it exists
    pExdc = Abc_NtkExdc( pNtk );
    if ( pExdc )
        printf( "Io_WritePla: EXDC is not written (warning).\n" );
    // finalize the file
    fclose( pFile );
    return 1;
}

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

Alan Mishchenko committed
72
  Synopsis    [Writes the network in PLA format.]
Alan Mishchenko committed
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
int Io_WritePlaOne( FILE * pFile, Abc_Ntk_t * pNtk )
{
    ProgressBar * pProgress;
    Abc_Obj_t * pNode, * pFanin, * pDriver;
    char * pCubeIn, * pCubeOut, * pCube;
    int i, k, nProducts, nInputs, nOutputs, nFanins;

    nProducts = 0;
Alan Mishchenko committed
89
    Abc_NtkForEachCo( pNtk, pNode, i )
Alan Mishchenko committed
90
    {
Alan Mishchenko committed
91
        pDriver = Abc_ObjFanin0Ntk( Abc_ObjFanin0(pNode) );
Alan Mishchenko committed
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
        if ( !Abc_ObjIsNode(pDriver) )
        {
            nProducts++;
            continue;
        }
        if ( Abc_NodeIsConst(pDriver) )
        {
            if ( Abc_NodeIsConst1(pDriver) )
                nProducts++;
            continue;
        }
        nProducts += Abc_SopGetCubeNum(pDriver->pData);
    }

    // collect the parameters
    nInputs  = Abc_NtkCiNum(pNtk);
    nOutputs = Abc_NtkCoNum(pNtk);
    pCubeIn  = ALLOC( char, nInputs + 1 );
    pCubeOut = ALLOC( char, nOutputs + 1 );
    memset( pCubeIn,  '-', nInputs );     pCubeIn[nInputs]   = 0;
    memset( pCubeOut, '0', nOutputs );    pCubeOut[nOutputs] = 0;

    // write the header
    fprintf( pFile, ".i %d\n", nInputs );
    fprintf( pFile, ".o %d\n", nOutputs );
    fprintf( pFile, ".ilb" );
    Abc_NtkForEachCi( pNtk, pNode, i )
Alan Mishchenko committed
119
        fprintf( pFile, " %s", Abc_ObjName(Abc_ObjFanout0(pNode)) );
Alan Mishchenko committed
120 121 122
    fprintf( pFile, "\n" );
    fprintf( pFile, ".ob" );
    Abc_NtkForEachCo( pNtk, pNode, i )
Alan Mishchenko committed
123
        fprintf( pFile, " %s", Abc_ObjName(Abc_ObjFanin0(pNode)) );
Alan Mishchenko committed
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
    fprintf( pFile, "\n" );
    fprintf( pFile, ".p %d\n", nProducts );

    // mark the CI nodes
    Abc_NtkForEachCi( pNtk, pNode, i )
        pNode->pCopy = (Abc_Obj_t *)i;

    // write the cubes
    pProgress = Extra_ProgressBarStart( stdout, nOutputs );
    Abc_NtkForEachCo( pNtk, pNode, i )
    {
        // prepare the output cube
        if ( i - 1 >= 0 )
            pCubeOut[i-1] = '0';
        pCubeOut[i] = '1';

        // consider special cases of nodes
Alan Mishchenko committed
141
        pDriver = Abc_ObjFanin0Ntk( Abc_ObjFanin0(pNode) );
Alan Mishchenko committed
142 143
        if ( !Abc_ObjIsNode(pDriver) )
        {
Alan Mishchenko committed
144
            assert( Abc_ObjIsCi(pDriver) );
Alan Mishchenko committed
145 146 147 148 149 150 151 152 153 154 155
            pCubeIn[(int)pDriver->pCopy] = '1' - Abc_ObjFaninC0(pNode);
            fprintf( pFile, "%s %s\n", pCubeIn, pCubeOut );
            pCubeIn[(int)pDriver->pCopy] = '-';
            continue;
        }
        if ( Abc_NodeIsConst(pDriver) )
        {
            if ( Abc_NodeIsConst1(pDriver) )
                fprintf( pFile, "%s %s\n", pCubeIn, pCubeOut );
            continue;
        }
Alan Mishchenko committed
156 157 158 159

        // make sure the cover is not complemented
        assert( !Abc_SopIsComplement( pDriver->pData ) );

Alan Mishchenko committed
160 161 162 163 164
        // write the cubes
        nFanins = Abc_ObjFaninNum(pDriver);
        Abc_SopForEachCube( pDriver->pData, nFanins, pCube )
        {
            Abc_ObjForEachFanin( pDriver, pFanin, k )
Alan Mishchenko committed
165 166 167
            {
                pFanin = Abc_ObjFanin0Ntk(pFanin);
                assert( (int)pFanin->pCopy < nInputs );
Alan Mishchenko committed
168
                pCubeIn[(int)pFanin->pCopy] = pCube[k];
Alan Mishchenko committed
169
            }
Alan Mishchenko committed
170 171 172 173
            fprintf( pFile, "%s %s\n", pCubeIn, pCubeOut );
        }
        // clean the cube for future writing
        Abc_ObjForEachFanin( pDriver, pFanin, k )
Alan Mishchenko committed
174 175 176
        {
            pFanin = Abc_ObjFanin0Ntk(pFanin);
            assert( Abc_ObjIsCi(pFanin) );
Alan Mishchenko committed
177
            pCubeIn[(int)pFanin->pCopy] = '-';
Alan Mishchenko committed
178
        }
Alan Mishchenko committed
179 180 181 182 183 184 185 186
        Extra_ProgressBarUpdate( pProgress, i, NULL );
    }
    Extra_ProgressBarStop( pProgress );
    fprintf( pFile, ".e\n" );

    // clean the CI nodes
    Abc_NtkForEachCi( pNtk, pNode, i )
        pNode->pCopy = NULL;
Alan Mishchenko committed
187 188
    free( pCubeIn );
    free( pCubeOut );
Alan Mishchenko committed
189 190 191 192 193 194 195 196 197
    return 1;
}


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