VIS

src/mvfaig/mvfaigUtil.c

Go to the documentation of this file.
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