[14] | 1 | /**CFile*********************************************************************** |
---|
| 2 | |
---|
| 3 | FileName [mvfaigUtil.c] |
---|
| 4 | |
---|
| 5 | PackageName [mvfaig] |
---|
| 6 | |
---|
| 7 | Synopsis [Routines to create, manipulate and free multi-valued functions.] |
---|
| 8 | |
---|
| 9 | SeeAlso [mvfAig.h] |
---|
| 10 | |
---|
| 11 | Author [Mohammad Awedh] |
---|
| 12 | |
---|
| 13 | Copyright [.] |
---|
| 14 | |
---|
| 15 | ******************************************************************************/ |
---|
| 16 | |
---|
| 17 | #include "mvfaigInt.h" |
---|
| 18 | |
---|
| 19 | /**AutomaticStart*************************************************************/ |
---|
| 20 | |
---|
| 21 | /*---------------------------------------------------------------------------*/ |
---|
| 22 | /* Static function prototypes */ |
---|
| 23 | /*---------------------------------------------------------------------------*/ |
---|
| 24 | |
---|
| 25 | |
---|
| 26 | /**AutomaticEnd***************************************************************/ |
---|
| 27 | |
---|
| 28 | |
---|
| 29 | /*---------------------------------------------------------------------------*/ |
---|
| 30 | /* Definition of exported functions */ |
---|
| 31 | /*---------------------------------------------------------------------------*/ |
---|
| 32 | |
---|
| 33 | /**Function******************************************************************** |
---|
| 34 | |
---|
| 35 | Synopsis [Initializes the mvfAig package.] |
---|
| 36 | |
---|
| 37 | SideEffects [] |
---|
| 38 | |
---|
| 39 | SeeAlso [MvfAig_End] |
---|
| 40 | |
---|
| 41 | ******************************************************************************/ |
---|
| 42 | void |
---|
| 43 | MvfAig_Init(void) |
---|
| 44 | { |
---|
| 45 | } |
---|
| 46 | |
---|
| 47 | |
---|
| 48 | /**Function******************************************************************** |
---|
| 49 | |
---|
| 50 | Synopsis [Ends the mvfAig package.] |
---|
| 51 | |
---|
| 52 | SideEffects [] |
---|
| 53 | |
---|
| 54 | SeeAlso [MvfAig_Init] |
---|
| 55 | |
---|
| 56 | ******************************************************************************/ |
---|
| 57 | void |
---|
| 58 | MvfAig_End(void) |
---|
| 59 | { |
---|
| 60 | } |
---|
| 61 | |
---|
| 62 | |
---|
| 63 | /**Function******************************************************************** |
---|
| 64 | |
---|
| 65 | Synopsis [Allocates a multi-valued function of n components.] |
---|
| 66 | |
---|
| 67 | Description [Allocates a multi-valued function of n components. Each |
---|
| 68 | component is initialized to the zero bAig.] |
---|
| 69 | |
---|
| 70 | SideEffects [] |
---|
| 71 | |
---|
| 72 | SeeAlso [] |
---|
| 73 | |
---|
| 74 | ******************************************************************************/ |
---|
| 75 | MvfAig_Function_t * |
---|
| 76 | MvfAig_FunctionAlloc( |
---|
| 77 | int n) |
---|
| 78 | { |
---|
| 79 | int i; |
---|
| 80 | array_t *bAndInvArray = array_alloc(bAigEdge_t, n); |
---|
| 81 | |
---|
| 82 | for (i = 0; i < n; i++) { |
---|
| 83 | array_insert(bAigEdge_t, bAndInvArray, i, bAig_Zero); |
---|
| 84 | } |
---|
| 85 | return ((MvfAig_Function_t *) bAndInvArray); |
---|
| 86 | } |
---|
| 87 | |
---|
| 88 | /**Function******************************************************************** |
---|
| 89 | |
---|
| 90 | Synopsis [Frees a multi-valued output function.] |
---|
| 91 | |
---|
| 92 | Description [Frees a multi-valued output function. Does nothing if |
---|
| 93 | function is NULL.] |
---|
| 94 | |
---|
| 95 | SideEffects [] |
---|
| 96 | |
---|
| 97 | SeeAlso [MvfAig_FunctionAlloc] |
---|
| 98 | |
---|
| 99 | ******************************************************************************/ |
---|
| 100 | void |
---|
| 101 | MvfAig_FunctionFree( |
---|
| 102 | MvfAig_Function_t *function) |
---|
| 103 | { |
---|
| 104 | array_free((array_t *) function); |
---|
| 105 | } |
---|
| 106 | |
---|
| 107 | /**Function******************************************************************** |
---|
| 108 | |
---|
| 109 | Synopsis [Duplicates a multi-valued output function.] |
---|
| 110 | |
---|
| 111 | Description [Returns a new multi-valued output function, whose constituent |
---|
| 112 | MAIGs have been duplicated. Assumes that function is not NULL.] |
---|
| 113 | |
---|
| 114 | SideEffects [] |
---|
| 115 | |
---|
| 116 | SeeAlso [Mvf_FunctionFree] |
---|
| 117 | |
---|
| 118 | ******************************************************************************/ |
---|
| 119 | MvfAig_Function_t * |
---|
| 120 | MvfAig_FunctionDuplicate( |
---|
| 121 | MvfAig_Function_t *function) |
---|
| 122 | { |
---|
| 123 | return ((MvfAig_Function_t *) array_dup((array_t *) function)); |
---|
| 124 | } |
---|
| 125 | |
---|
| 126 | |
---|
| 127 | /**Function******************************************************************** |
---|
| 128 | |
---|
| 129 | Synopsis [Frees an array of multi-valued output functions.] |
---|
| 130 | |
---|
| 131 | Description [Frees an array of multi-valued output functions. Does nothing |
---|
| 132 | if functionArray is NULL.] |
---|
| 133 | |
---|
| 134 | SideEffects [] |
---|
| 135 | |
---|
| 136 | SeeAlso [Mvf_FunctionFree] |
---|
| 137 | |
---|
| 138 | ******************************************************************************/ |
---|
| 139 | void |
---|
| 140 | MvfAig_FunctionArrayFree( |
---|
| 141 | array_t *functionArray) |
---|
| 142 | { |
---|
| 143 | int i; |
---|
| 144 | |
---|
| 145 | if (functionArray != NIL(array_t)) { |
---|
| 146 | for (i = 0; i < array_n(functionArray); i++) { |
---|
| 147 | MvfAig_Function_t *function = array_fetch(MvfAig_Function_t*, functionArray, i); |
---|
| 148 | MvfAig_FunctionFree(function); |
---|
| 149 | } |
---|
| 150 | array_free(functionArray); |
---|
| 151 | } |
---|
| 152 | } |
---|
| 153 | |
---|
| 154 | |
---|
| 155 | /**Function******************************************************************** |
---|
| 156 | |
---|
| 157 | Synopsis [Returns the number of components of a multi-valued function.] |
---|
| 158 | |
---|
| 159 | Description [Returns the number of components of a multi-valued function. |
---|
| 160 | This is the same number as the value of the parameter passed to |
---|
| 161 | Mvf_FunctionAlloc.] |
---|
| 162 | |
---|
| 163 | SideEffects [] |
---|
| 164 | |
---|
| 165 | SeeAlso [Mvf_FunctionAlloc] |
---|
| 166 | |
---|
| 167 | ******************************************************************************/ |
---|
| 168 | int |
---|
| 169 | MvfAig_FunctionReadNumComponents( |
---|
| 170 | MvfAig_Function_t *function) |
---|
| 171 | { |
---|
| 172 | return (array_n((array_t *) function)); |
---|
| 173 | } |
---|
| 174 | |
---|
| 175 | |
---|
| 176 | /**Function******************************************************************** |
---|
| 177 | |
---|
| 178 | Synopsis [Returns the ith component of a multi-valued function.] |
---|
| 179 | |
---|
| 180 | Description [Returns the mAndInv giving the minterms for which a |
---|
| 181 | multi-valued function evaluates to its ith value. ] |
---|
| 182 | |
---|
| 183 | SideEffects [] |
---|
| 184 | |
---|
| 185 | SeeAlso [] |
---|
| 186 | |
---|
| 187 | ******************************************************************************/ |
---|
| 188 | mAigEdge_t |
---|
| 189 | MvfAig_FunctionReadComponent( |
---|
| 190 | MvfAig_Function_t *function, |
---|
| 191 | int i) |
---|
| 192 | { |
---|
| 193 | bAigEdge_t component = array_fetch(bAigEdge_t, (array_t *) function, i); |
---|
| 194 | return (component); |
---|
| 195 | } |
---|
| 196 | |
---|
| 197 | |
---|
| 198 | /**Function******************************************************************** |
---|
| 199 | |
---|
| 200 | Synopsis [Creates the multi-output function for a variable.] |
---|
| 201 | |
---|
| 202 | Description [Given a variable, creates a function with as many components as |
---|
| 203 | values of the variable. The ith component of the function is true exactly |
---|
| 204 | when the variable is equal to the ith value (i.e. fi(x) = (x==i), where x is |
---|
| 205 | the variable specified by mddId). For the case where x is binary valued, |
---|
| 206 | the result is \[!x, x\]. Assumes that mddId is non-negative.] |
---|
| 207 | |
---|
| 208 | SideEffects [] |
---|
| 209 | |
---|
| 210 | SeeAlso [Mvf_FunctionAlloc] |
---|
| 211 | |
---|
| 212 | ******************************************************************************/ |
---|
| 213 | MvfAig_Function_t * |
---|
| 214 | MvfAig_FunctionCreateFromVariable( |
---|
| 215 | mAig_Manager_t *manager, |
---|
| 216 | mAigEdge_t mVarId) |
---|
| 217 | { |
---|
| 218 | int i; |
---|
| 219 | array_t *mVarList = mAigReadMulVarList(manager); |
---|
| 220 | mAigMvar_t mVar; |
---|
| 221 | array_t *result; |
---|
| 222 | |
---|
| 223 | assert( (mVarId >= 0) && (mVarId <= array_n(mVarList))); |
---|
| 224 | mVar = array_fetch(mAigMvar_t, mVarList, mVarId); |
---|
| 225 | result = array_alloc(bAigEdge_t, mVar.values); /* array of all possible values of this variable */ |
---|
| 226 | for(i = 0; i < mVar.values; i++) { |
---|
| 227 | bAigEdge_t literal; |
---|
| 228 | |
---|
| 229 | literal = mAig_EquC(manager, mVarId, i); /* AndInv graph = 1 if the variable = i*/ |
---|
| 230 | array_insert(bAigEdge_t, result, i, literal); |
---|
| 231 | { |
---|
| 232 | /* |
---|
| 233 | The name of the node in AIG is node name = node value. |
---|
| 234 | */ |
---|
| 235 | /* |
---|
| 236 | char *valueStr = util_inttostr(i); |
---|
| 237 | char *name = util_strcat3(mVar.name,"=", valueStr); |
---|
| 238 | char *tmpName; |
---|
| 239 | int index; |
---|
| 240 | |
---|
| 241 | bAig_NodeSetName(manager, literal, name); |
---|
| 242 | FREE(valueStr); |
---|
| 243 | */ |
---|
| 244 | } |
---|
| 245 | } |
---|
| 246 | return ((MvfAig_Function_t *) result); |
---|
| 247 | } |
---|
| 248 | |
---|
| 249 | |
---|
| 250 | /**Function******************************************************************** |
---|
| 251 | |
---|
| 252 | Synopsis [Adds a set of minterms to the ith component of a function.] |
---|
| 253 | |
---|
| 254 | Description [Adds a set of minterms, represented by the onset of an mAig g, |
---|
| 255 | to the onset of the ith component of a function. The mAig g is not freed.] |
---|
| 256 | |
---|
| 257 | SideEffects [] |
---|
| 258 | |
---|
| 259 | SeeAlso [Mvf_FunctionAlloc] |
---|
| 260 | |
---|
| 261 | ******************************************************************************/ |
---|
| 262 | void |
---|
| 263 | MvfAig_FunctionAddMintermsToComponent( |
---|
| 264 | mAig_Manager_t *manager, |
---|
| 265 | MvfAig_Function_t *function, |
---|
| 266 | int i, |
---|
| 267 | mAigEdge_t g) |
---|
| 268 | { |
---|
| 269 | mAigEdge_t oldComponent; |
---|
| 270 | mAigEdge_t newComponent; |
---|
| 271 | array_t *mAigArray = (array_t *) function; |
---|
| 272 | |
---|
| 273 | assert((i >= 0) && (i < array_n(mAigArray))); |
---|
| 274 | |
---|
| 275 | oldComponent = array_fetch(mAigEdge_t , mAigArray, i); |
---|
| 276 | newComponent = mAig_Or(manager, oldComponent, g); |
---|
| 277 | array_insert(mAigEdge_t , mAigArray, i, newComponent); |
---|
| 278 | } |
---|
| 279 | |
---|
| 280 | /**Function******************************************************************** |
---|
| 281 | |
---|
| 282 | Synopsis [Returns the set of minterms on which two functions agree.] |
---|
| 283 | |
---|
| 284 | Description [Returns the set of minterms on which two functions agree. For |
---|
| 285 | f = \[f1, f2, ..., fn\] and g = \[g1, g2, ..., gn\], the returned set is: |
---|
| 286 | AND(i = 1, ..., n) (fi XNOR gi). For the special case where f and g are |
---|
| 287 | binary valued, this function computes (f XNOR g). It is an error if the two |
---|
| 288 | functions have a different number of components.] |
---|
| 289 | |
---|
| 290 | SideEffects [] |
---|
| 291 | |
---|
| 292 | ******************************************************************************/ |
---|
| 293 | mAigEdge_t |
---|
| 294 | MvfAig_FunctionsComputeEquivalentSet( |
---|
| 295 | mAig_Manager_t *manager, |
---|
| 296 | MvfAig_Function_t *function1, |
---|
| 297 | MvfAig_Function_t *function2) |
---|
| 298 | { |
---|
| 299 | int i; |
---|
| 300 | array_t *mAigArray1 = (array_t *) function1; |
---|
| 301 | array_t *mAigArray2 = (array_t *) function2; |
---|
| 302 | int numComponents = array_n(mAigArray1); |
---|
| 303 | mAigEdge_t product = mAig_One; |
---|
| 304 | |
---|
| 305 | assert(numComponents == array_n(mAigArray1)); |
---|
| 306 | assert(numComponents == array_n(mAigArray2)); |
---|
| 307 | |
---|
| 308 | for (i = 0; i < numComponents; i++) { |
---|
| 309 | mAigEdge_t mAig1 = array_fetch(mAigEdge_t, mAigArray1, i); |
---|
| 310 | mAigEdge_t mAig2 = array_fetch(mAigEdge_t, mAigArray2, i); |
---|
| 311 | mAigEdge_t xnor = mAig_Eq(manager, mAig1, mAig2); |
---|
| 312 | mAigEdge_t temp = product; |
---|
| 313 | |
---|
| 314 | product = mAig_And(manager, temp, xnor); |
---|
| 315 | } |
---|
| 316 | |
---|
| 317 | return product; |
---|
| 318 | } |
---|
| 319 | |
---|
| 320 | /**Function******************************************************************** |
---|
| 321 | |
---|
| 322 | Synopsis [Computes the domain of a multi-valued function.] |
---|
| 323 | |
---|
| 324 | Description [Returns an mAig representing the set of minterms which turn on |
---|
| 325 | some component of a function. In other words, returns the union of the |
---|
| 326 | onsets of the components. The domain is the tautology if and only if the |
---|
| 327 | function is completely specified.] |
---|
| 328 | |
---|
| 329 | SideEffects [] |
---|
| 330 | |
---|
| 331 | SeeAlso [Mvf_FunctionTestIsCompletelySpecified] |
---|
| 332 | |
---|
| 333 | ******************************************************************************/ |
---|
| 334 | mAigEdge_t |
---|
| 335 | MvfAig_FunctionComputeDomain( |
---|
| 336 | mAig_Manager_t *manager, |
---|
| 337 | MvfAig_Function_t *function) |
---|
| 338 | { |
---|
| 339 | int i; |
---|
| 340 | array_t *mAigArray = (array_t *) function; |
---|
| 341 | int numComponents = array_n(mAigArray); |
---|
| 342 | mAigEdge_t sum = mAig_Zero; |
---|
| 343 | |
---|
| 344 | for (i = 0; i < numComponents; i++) { |
---|
| 345 | mAigEdge_t ithComponent = array_fetch(mAigEdge_t , mAigArray, i); |
---|
| 346 | mAigEdge_t temp = sum; |
---|
| 347 | |
---|
| 348 | sum = mAig_Or(manager, temp, ithComponent); |
---|
| 349 | } |
---|
| 350 | return sum; |
---|
| 351 | } |
---|
| 352 | |
---|
| 353 | /*---------------------------------------------------------------------------*/ |
---|
| 354 | /* Definition of internal functions */ |
---|
| 355 | /*---------------------------------------------------------------------------*/ |
---|
| 356 | |
---|
| 357 | |
---|
| 358 | /*---------------------------------------------------------------------------*/ |
---|
| 359 | /* Definition of static functions */ |
---|
| 360 | /*---------------------------------------------------------------------------*/ |
---|
| 361 | |
---|
| 362 | |
---|
| 363 | |
---|
| 364 | |
---|
| 365 | |
---|
| 366 | |
---|
| 367 | |
---|
| 368 | |
---|
| 369 | |
---|