VIS
|
00001 00017 #include "mvfaigInt.h" 00018 00021 /*---------------------------------------------------------------------------*/ 00022 /* Static function prototypes */ 00023 /*---------------------------------------------------------------------------*/ 00024 00025 00029 /*---------------------------------------------------------------------------*/ 00030 /* Definition of exported functions */ 00031 /*---------------------------------------------------------------------------*/ 00032 00042 void 00043 MvfAig_Init(void) 00044 { 00045 } 00046 00047 00057 void 00058 MvfAig_End(void) 00059 { 00060 } 00061 00062 00075 MvfAig_Function_t * 00076 MvfAig_FunctionAlloc( 00077 int n) 00078 { 00079 int i; 00080 array_t *bAndInvArray = array_alloc(bAigEdge_t, n); 00081 00082 for (i = 0; i < n; i++) { 00083 array_insert(bAigEdge_t, bAndInvArray, i, bAig_Zero); 00084 } 00085 return ((MvfAig_Function_t *) bAndInvArray); 00086 } 00087 00100 void 00101 MvfAig_FunctionFree( 00102 MvfAig_Function_t *function) 00103 { 00104 array_free((array_t *) function); 00105 } 00106 00119 MvfAig_Function_t * 00120 MvfAig_FunctionDuplicate( 00121 MvfAig_Function_t *function) 00122 { 00123 return ((MvfAig_Function_t *) array_dup((array_t *) function)); 00124 } 00125 00126 00139 void 00140 MvfAig_FunctionArrayFree( 00141 array_t *functionArray) 00142 { 00143 int i; 00144 00145 if (functionArray != NIL(array_t)) { 00146 for (i = 0; i < array_n(functionArray); i++) { 00147 MvfAig_Function_t *function = array_fetch(MvfAig_Function_t*, functionArray, i); 00148 MvfAig_FunctionFree(function); 00149 } 00150 array_free(functionArray); 00151 } 00152 } 00153 00154 00168 int 00169 MvfAig_FunctionReadNumComponents( 00170 MvfAig_Function_t *function) 00171 { 00172 return (array_n((array_t *) function)); 00173 } 00174 00175 00188 mAigEdge_t 00189 MvfAig_FunctionReadComponent( 00190 MvfAig_Function_t *function, 00191 int i) 00192 { 00193 bAigEdge_t component = array_fetch(bAigEdge_t, (array_t *) function, i); 00194 return (component); 00195 } 00196 00197 00213 MvfAig_Function_t * 00214 MvfAig_FunctionCreateFromVariable( 00215 mAig_Manager_t *manager, 00216 mAigEdge_t mVarId) 00217 { 00218 int i; 00219 array_t *mVarList = mAigReadMulVarList(manager); 00220 mAigMvar_t mVar; 00221 array_t *result; 00222 00223 assert( (mVarId >= 0) && (mVarId <= array_n(mVarList))); 00224 mVar = array_fetch(mAigMvar_t, mVarList, mVarId); 00225 result = array_alloc(bAigEdge_t, mVar.values); /* array of all possible values of this variable */ 00226 for(i = 0; i < mVar.values; i++) { 00227 bAigEdge_t literal; 00228 00229 literal = mAig_EquC(manager, mVarId, i); /* AndInv graph = 1 if the variable = i*/ 00230 array_insert(bAigEdge_t, result, i, literal); 00231 { 00232 /* 00233 The name of the node in AIG is node name = node value. 00234 */ 00235 /* 00236 char *valueStr = util_inttostr(i); 00237 char *name = util_strcat3(mVar.name,"=", valueStr); 00238 char *tmpName; 00239 int index; 00240 00241 bAig_NodeSetName(manager, literal, name); 00242 FREE(valueStr); 00243 */ 00244 } 00245 } 00246 return ((MvfAig_Function_t *) result); 00247 } 00248 00249 00262 void 00263 MvfAig_FunctionAddMintermsToComponent( 00264 mAig_Manager_t *manager, 00265 MvfAig_Function_t *function, 00266 int i, 00267 mAigEdge_t g) 00268 { 00269 mAigEdge_t oldComponent; 00270 mAigEdge_t newComponent; 00271 array_t *mAigArray = (array_t *) function; 00272 00273 assert((i >= 0) && (i < array_n(mAigArray))); 00274 00275 oldComponent = array_fetch(mAigEdge_t , mAigArray, i); 00276 newComponent = mAig_Or(manager, oldComponent, g); 00277 array_insert(mAigEdge_t , mAigArray, i, newComponent); 00278 } 00279 00293 mAigEdge_t 00294 MvfAig_FunctionsComputeEquivalentSet( 00295 mAig_Manager_t *manager, 00296 MvfAig_Function_t *function1, 00297 MvfAig_Function_t *function2) 00298 { 00299 int i; 00300 array_t *mAigArray1 = (array_t *) function1; 00301 array_t *mAigArray2 = (array_t *) function2; 00302 int numComponents = array_n(mAigArray1); 00303 mAigEdge_t product = mAig_One; 00304 00305 assert(numComponents == array_n(mAigArray1)); 00306 assert(numComponents == array_n(mAigArray2)); 00307 00308 for (i = 0; i < numComponents; i++) { 00309 mAigEdge_t mAig1 = array_fetch(mAigEdge_t, mAigArray1, i); 00310 mAigEdge_t mAig2 = array_fetch(mAigEdge_t, mAigArray2, i); 00311 mAigEdge_t xnor = mAig_Eq(manager, mAig1, mAig2); 00312 mAigEdge_t temp = product; 00313 00314 product = mAig_And(manager, temp, xnor); 00315 } 00316 00317 return product; 00318 } 00319 00334 mAigEdge_t 00335 MvfAig_FunctionComputeDomain( 00336 mAig_Manager_t *manager, 00337 MvfAig_Function_t *function) 00338 { 00339 int i; 00340 array_t *mAigArray = (array_t *) function; 00341 int numComponents = array_n(mAigArray); 00342 mAigEdge_t sum = mAig_Zero; 00343 00344 for (i = 0; i < numComponents; i++) { 00345 mAigEdge_t ithComponent = array_fetch(mAigEdge_t , mAigArray, i); 00346 mAigEdge_t temp = sum; 00347 00348 sum = mAig_Or(manager, temp, ithComponent); 00349 } 00350 return sum; 00351 } 00352 00353 /*---------------------------------------------------------------------------*/ 00354 /* Definition of internal functions */ 00355 /*---------------------------------------------------------------------------*/ 00356 00357 00358 /*---------------------------------------------------------------------------*/ 00359 /* Definition of static functions */ 00360 /*---------------------------------------------------------------------------*/ 00361 00362 00363 00364 00365 00366 00367 00368 00369