ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
ioReadEqn.c
Go to the documentation of this file.
1
20
21#include "ioAbc.h"
22
24
25
29
30static Abc_Ntk_t * Io_ReadEqnNetwork( Extra_FileReader_t * p );
31static void Io_ReadEqnStrCompact( char * pStr );
32static int Io_ReadEqnStrFind( Vec_Ptr_t * vTokens, char * pName );
33static void Io_ReadEqnStrCutAt( char * pStr, char * pStop, int fUniqueOnly, Vec_Ptr_t * vTokens );
34
38
50Abc_Ntk_t * Io_ReadEqn( char * pFileName, int fCheck )
51{
53 Abc_Ntk_t * pNtk;
54
55 // start the file
56 p = Extra_FileReaderAlloc( pFileName, "#", ";", "=" );
57 if ( p == NULL )
58 return NULL;
59
60 // read the network
61 pNtk = Io_ReadEqnNetwork( p );
63 if ( pNtk == NULL )
64 return NULL;
65
66 // make sure that everything is okay with the network structure
67 if ( fCheck && !Abc_NtkCheckRead( pNtk ) )
68 {
69 printf( "Io_ReadEqn: The network check has failed.\n" );
70 Abc_NtkDelete( pNtk );
71 return NULL;
72 }
73 return pNtk;
74}
75
87Abc_Ntk_t * Io_ReadEqnNetwork( Extra_FileReader_t * p )
88{
89 ProgressBar * pProgress;
90 Vec_Ptr_t * vTokens;
91 Vec_Ptr_t * vVars;
92 Abc_Ntk_t * pNtk;
93 Abc_Obj_t * pNode;
94 char * pNodeName, * pFormula, * pFormulaCopy, * pVarName;
95 int iLine, i;
96
97 // allocate the empty network
99 // set the specs
102
103 // go through the lines of the file
104 vVars = Vec_PtrAlloc( 100 );
106 for ( iLine = 0; (vTokens = (Vec_Ptr_t *)Extra_FileReaderGetTokens(p)); iLine++ )
107 {
108 Extra_ProgressBarUpdate( pProgress, Extra_FileReaderGetCurPosition(p), NULL );
109
110 // check if the first token contains anything
111 Io_ReadEqnStrCompact( (char *)vTokens->pArray[0] );
112 if ( strlen((char *)vTokens->pArray[0]) == 0 )
113 break;
114
115 // if the number of tokens is different from two, error
116 if ( vTokens->nSize != 2 )
117 {
118 printf( "%s: Wrong input file format.\n", Extra_FileReaderGetFileName(p) );
119 Abc_NtkDelete( pNtk );
120 return NULL;
121 }
122
123 // get the type of the line
124 if ( strncmp( (char *)vTokens->pArray[0], "INORDER", 7 ) == 0 )
125 {
126 Io_ReadEqnStrCutAt( (char *)vTokens->pArray[1], " \n\r\t", 0, vVars );
127 Vec_PtrForEachEntry( char *, vVars, pVarName, i )
128 Io_ReadCreatePi( pNtk, pVarName );
129 }
130 else if ( strncmp( (char *)vTokens->pArray[0], "OUTORDER", 8 ) == 0 )
131 {
132 Io_ReadEqnStrCutAt( (char *)vTokens->pArray[1], " \n\r\t", 0, vVars );
133 Vec_PtrForEachEntry( char *, vVars, pVarName, i )
134 Io_ReadCreatePo( pNtk, pVarName );
135 }
136 else
137 {
138 extern Hop_Obj_t * Parse_FormulaParserEqn( FILE * pOutput, char * pFormInit, Vec_Ptr_t * vVarNames, Hop_Man_t * pMan );
139
140 // get hold of the node name and its formula
141 pNodeName = (char *)vTokens->pArray[0];
142 pFormula = (char *)vTokens->pArray[1];
143 // compact the formula
144 Io_ReadEqnStrCompact( pFormula );
145
146 // consider the case of the constant node
147 if ( pFormula[1] == 0 && (pFormula[0] == '0' || pFormula[0] == '1') )
148 {
149 pFormulaCopy = NULL;
150 Vec_PtrClear( vVars );
151 }
152 else
153 {
154 // make a copy of formula for names
155 pFormulaCopy = Extra_UtilStrsav( pFormula );
156 // find the names of the fanins of this node
157 Io_ReadEqnStrCutAt( pFormulaCopy, "!*+()", 1, vVars );
158 }
159 // create the node
160 pNode = Io_ReadCreateNode( pNtk, pNodeName, (char **)Vec_PtrArray(vVars), Vec_PtrSize(vVars) );
161 // derive the function
162 pNode->pData = Parse_FormulaParserEqn( stdout, pFormula, vVars, (Hop_Man_t *)pNtk->pManFunc );
163 // remove the cubes
164 ABC_FREE( pFormulaCopy );
165 }
166 }
167 Extra_ProgressBarStop( pProgress );
168 Vec_PtrFree( vVars );
169 Abc_NtkFinalizeRead( pNtk );
170 return pNtk;
171}
172
173
174
186void Io_ReadEqnStrCompact( char * pStr )
187{
188 char * pCur, * pNew;
189 for ( pNew = pCur = pStr; *pCur; pCur++ )
190 if ( !(*pCur == ' ' || *pCur == '\n' || *pCur == '\r' || *pCur == '\t') )
191 *pNew++ = *pCur;
192 *pNew = 0;
193}
194
206int Io_ReadEqnStrFind( Vec_Ptr_t * vTokens, char * pName )
207{
208 char * pToken;
209 int i;
210 Vec_PtrForEachEntry( char *, vTokens, pToken, i )
211 if ( strcmp( pToken, pName ) == 0 )
212 return i;
213 return -1;
214}
215
227void Io_ReadEqnStrCutAt( char * pStr, char * pStop, int fUniqueOnly, Vec_Ptr_t * vTokens )
228{
229 char * pToken;
230 Vec_PtrClear( vTokens );
231 for ( pToken = strtok( pStr, pStop ); pToken; pToken = strtok( NULL, pStop ) )
232 if ( !fUniqueOnly || Io_ReadEqnStrFind( vTokens, pToken ) == -1 )
233 Vec_PtrPush( vTokens, pToken );
234}
235
236
240
241
242
244
struct Abc_Obj_t_ Abc_Obj_t
Definition abc.h:116
ABC_DLL Abc_Ntk_t * Abc_NtkAlloc(Abc_NtkType_t Type, Abc_NtkFunc_t Func, int fUseMemMan)
DECLARATIONS ///.
Definition abcNtk.c:53
ABC_DLL int Abc_NtkCheckRead(Abc_Ntk_t *pNtk)
Definition abcCheck.c:80
struct Abc_Ntk_t_ Abc_Ntk_t
Definition abc.h:115
ABC_DLL void Abc_NtkFinalizeRead(Abc_Ntk_t *pNtk)
Definition abcNtk.c:413
@ ABC_NTK_NETLIST
Definition abc.h:56
ABC_DLL void Abc_NtkDelete(Abc_Ntk_t *pNtk)
Definition abcNtk.c:1421
@ ABC_FUNC_AIG
Definition abc.h:67
#define ABC_FREE(obj)
Definition abc_global.h:267
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
ABC_NAMESPACE_IMPL_START typedef char ProgressBar
Definition bbrNtbdd.c:27
Cube * p
Definition exorList.c:222
void Extra_ProgressBarStop(ProgressBar *p)
char * Extra_FileReaderGetFileName(Extra_FileReader_t *p)
void * Extra_FileReaderGetTokens(Extra_FileReader_t *p)
Extra_FileReader_t * Extra_FileReaderAlloc(char *pFileName, char *pCharsComment, char *pCharsStop, char *pCharsClean)
FUNCTION DEFINITIONS ///.
char * Extra_UtilStrsav(const char *s)
struct Extra_FileReader_t_ Extra_FileReader_t
Definition extra.h:135
int Extra_FileReaderGetCurPosition(Extra_FileReader_t *p)
char * Extra_FileNameGeneric(char *FileName)
ProgressBar * Extra_ProgressBarStart(FILE *pFile, int nItemsTotal)
FUNCTION DEFINITIONS ///.
int Extra_FileReaderGetFileSize(Extra_FileReader_t *p)
void Extra_FileReaderFree(Extra_FileReader_t *p)
typedefABC_NAMESPACE_HEADER_START struct Hop_Man_t_ Hop_Man_t
INCLUDES ///.
Definition hop.h:49
struct Hop_Obj_t_ Hop_Obj_t
Definition hop.h:50
Abc_Obj_t * Io_ReadCreatePo(Abc_Ntk_t *pNtk, char *pName)
Definition ioUtil.c:644
Abc_Obj_t * Io_ReadCreatePi(Abc_Ntk_t *pNtk, char *pName)
Definition ioUtil.c:619
Abc_Obj_t * Io_ReadCreateNode(Abc_Ntk_t *pNtk, char *pNameOut, char *pNamesIn[], int nInputs)
Definition ioUtil.c:734
Abc_Ntk_t * Io_ReadEqn(char *pFileName, int fCheck)
FUNCTION DEFINITIONS ///.
Definition ioReadEqn.c:50
Hop_Obj_t * Parse_FormulaParserEqn(FILE *pOutput, char *pFormInit, Vec_Ptr_t *vVarNames, Hop_Man_t *pMan)
FUNCTION DEFINITIONS ///.
Definition parseEqn.c:71
char * pName
Definition abc.h:158
void * pManFunc
Definition abc.h:191
char * pSpec
Definition abc.h:159
void * pData
Definition abc.h:145
int strncmp()
int strlen()
int strcmp()
char * strtok()
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
Definition vecPtr.h:42
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.
Definition vecPtr.h:55