ioWriteEqn.c 7.16 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    [ioWriteEqn.c]

  SystemName  [ABC: Logic synthesis and verification system.]

  PackageName [Command processing package.]

  Synopsis    [Procedures to write equation representation of the network.]

  Author      [Alan Mishchenko]
  
  Affiliation [UC Berkeley]

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

  Revision    [$Id: ioWriteEqn.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

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

static void Io_NtkWriteEqnOne( FILE * pFile, Abc_Ntk_t * pNtk );
Alan Mishchenko committed
28 29 30
static void Io_NtkWriteEqnCis( FILE * pFile, Abc_Ntk_t * pNtk );
static void Io_NtkWriteEqnCos( FILE * pFile, Abc_Ntk_t * pNtk );
static int Io_NtkWriteEqnCheck( Abc_Ntk_t * pNtk );
Alan Mishchenko committed
31 32

////////////////////////////////////////////////////////////////////////
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
////////////////////////////////////////////////////////////////////////

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

  Synopsis    [Writes the logic network in the equation format.]

  Description []
  
  SideEffects []

  SeeAlso     []

***********************************************************************/
void Io_WriteEqn( Abc_Ntk_t * pNtk, char * pFileName )
{
    FILE * pFile;

Alan Mishchenko committed
51
    assert( Abc_NtkIsAigNetlist(pNtk) );
Alan Mishchenko committed
52 53 54
    if ( Abc_NtkLatchNum(pNtk) > 0 )
        printf( "Warning: only combinational portion is being written.\n" );

Alan Mishchenko committed
55 56 57 58
    // check that the names are fine for the EQN format
    if ( !Io_NtkWriteEqnCheck(pNtk) )
        return;

Alan Mishchenko committed
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
    // start the output stream
    pFile = fopen( pFileName, "w" );
    if ( pFile == NULL )
    {
        fprintf( stdout, "Io_WriteEqn(): Cannot open the output file \"%s\".\n", pFileName );
        return;
    }
    fprintf( pFile, "# Equations for \"%s\" written by ABC on %s\n", pNtk->pName, Extra_TimeStamp() );

    // write the equations for the network
    Io_NtkWriteEqnOne( pFile, pNtk );
    fprintf( pFile, "\n" );
    fclose( pFile );
}

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

  Synopsis    [Write one network.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
void Io_NtkWriteEqnOne( FILE * pFile, Abc_Ntk_t * pNtk )
{
Alan Mishchenko committed
87
    Vec_Vec_t * vLevels;
Alan Mishchenko committed
88
    ProgressBar * pProgress;
Alan Mishchenko committed
89 90
    Abc_Obj_t * pNode, * pFanin;
    int i, k;
Alan Mishchenko committed
91 92 93

    // write the PIs
    fprintf( pFile, "INORDER =" );
Alan Mishchenko committed
94
    Io_NtkWriteEqnCis( pFile, pNtk );
Alan Mishchenko committed
95 96 97 98
    fprintf( pFile, ";\n" );

    // write the POs
    fprintf( pFile, "OUTORDER =" );
Alan Mishchenko committed
99
    Io_NtkWriteEqnCos( pFile, pNtk );
Alan Mishchenko committed
100 101 102
    fprintf( pFile, ";\n" );

    // write each internal node
Alan Mishchenko committed
103
    vLevels = Vec_VecAlloc( 10 );
Alan Mishchenko committed
104 105 106 107
    pProgress = Extra_ProgressBarStart( stdout, Abc_NtkObjNumMax(pNtk) );
    Abc_NtkForEachNode( pNtk, pNode, i )
    {
        Extra_ProgressBarUpdate( pProgress, i, NULL );
Alan Mishchenko committed
108 109 110 111 112 113 114
        fprintf( pFile, "%s = ", Abc_ObjName(Abc_ObjFanout0(pNode)) );
        // set the input names
        Abc_ObjForEachFanin( pNode, pFanin, k )
            Hop_IthVar(pNtk->pManFunc, k)->pData = Abc_ObjName(pFanin);
        // write the formula
        Hop_ObjPrintEqn( pFile, pNode->pData, vLevels, 0 );
        fprintf( pFile, ";\n" );
Alan Mishchenko committed
115 116
    }
    Extra_ProgressBarStop( pProgress );
Alan Mishchenko committed
117
    Vec_VecFree( vLevels );
Alan Mishchenko committed
118 119 120 121 122 123 124 125 126 127 128 129 130 131
}


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

  Synopsis    [Writes the primary input list.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
Alan Mishchenko committed
132
void Io_NtkWriteEqnCis( FILE * pFile, Abc_Ntk_t * pNtk )
Alan Mishchenko committed
133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
{
    Abc_Obj_t * pTerm, * pNet;
    int LineLength;
    int AddedLength;
    int NameCounter;
    int i;

    LineLength  = 9;
    NameCounter = 0;

    Abc_NtkForEachCi( pNtk, pTerm, i )
    {
        pNet = Abc_ObjFanout0(pTerm);
        // get the line length after this name is written
        AddedLength = strlen(Abc_ObjName(pNet)) + 1;
        if ( NameCounter && LineLength + AddedLength + 3 > IO_WRITE_LINE_LENGTH )
        { // write the line extender
            fprintf( pFile, " \n" );
            // reset the line length
            LineLength  = 0;
            NameCounter = 0;
        }
        fprintf( pFile, " %s", Abc_ObjName(pNet) );
        LineLength += AddedLength;
        NameCounter++;
    }
}

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

  Synopsis    [Writes the primary input list.]

  Description []
               
  SideEffects []

  SeeAlso     []

***********************************************************************/
Alan Mishchenko committed
172
void Io_NtkWriteEqnCos( FILE * pFile, Abc_Ntk_t * pNtk )
Alan Mishchenko committed
173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
{
    Abc_Obj_t * pTerm, * pNet;
    int LineLength;
    int AddedLength;
    int NameCounter;
    int i;

    LineLength  = 10;
    NameCounter = 0;

    Abc_NtkForEachCo( pNtk, pTerm, i )
    {
        pNet = Abc_ObjFanin0(pTerm);
        // get the line length after this name is written
        AddedLength = strlen(Abc_ObjName(pNet)) + 1;
        if ( NameCounter && LineLength + AddedLength + 3 > IO_WRITE_LINE_LENGTH )
        { // write the line extender
            fprintf( pFile, " \n" );
            // reset the line length
            LineLength  = 0;
            NameCounter = 0;
        }
        fprintf( pFile, " %s", Abc_ObjName(pNet) );
        LineLength += AddedLength;
        NameCounter++;
    }
}

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

Alan Mishchenko committed
203
  Synopsis    [Make sure the network does not have offending names.]
Alan Mishchenko committed
204 205

  Description []
Alan Mishchenko committed
206
  
Alan Mishchenko committed
207 208 209 210 211
  SideEffects []

  SeeAlso     []

***********************************************************************/
Alan Mishchenko committed
212
int Io_NtkWriteEqnCheck( Abc_Ntk_t * pNtk )
Alan Mishchenko committed
213
{
Alan Mishchenko committed
214 215 216 217
    Abc_Obj_t * pObj;
    char * pName;
    int i, k, Length;
    int RetValue = 1;
Alan Mishchenko committed
218

Alan Mishchenko committed
219 220
    // make sure the network does not have proper names, such as "0" or "1" or containing parantheses
    Abc_NtkForEachObj( pNtk, pObj, i )
Alan Mishchenko committed
221
    {
Alan Mishchenko committed
222 223 224 225 226
        pName = Nm_ManFindNameById(pNtk->pManName, i);
        if ( pName == NULL )
            continue;
        Length = strlen(pName);
        if ( pName[0] == '0' || pName[0] == '1' )
Alan Mishchenko committed
227
        {
Alan Mishchenko committed
228 229
            RetValue = 0;
            break;
Alan Mishchenko committed
230
        }
Alan Mishchenko committed
231 232 233 234 235
        for ( k = 0; k < Length; k++ )
            if ( pName[k] == '(' || pName[k] == ')' || pName[k] == '!' || pName[k] == '*' || pName[k] == '+' )
            {
                RetValue = 0;
                break;
Alan Mishchenko committed
236
            }
Alan Mishchenko committed
237 238
        if ( k < Length )
            break;
Alan Mishchenko committed
239
    }
Alan Mishchenko committed
240 241 242 243 244 245
    if ( RetValue == 0 )
    {
        printf( "The network cannot be written in the EQN format because object %d has name \"%s\".\n", i, pName );
        printf( "Consider renaming the objects using command \"short_names\" and trying again.\n" );
    }
    return RetValue;
Alan Mishchenko committed
246 247 248 249 250 251 252
}

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