[14] | 1 | /**CFile*********************************************************************** |
---|
| 2 | |
---|
| 3 | FileName [restrFaninout.c] |
---|
| 4 | |
---|
| 5 | PackageName [restr] |
---|
| 6 | |
---|
| 7 | Synopsis [Routines in this file implement the Fanin and Fanin-Fanout oriented |
---|
| 8 | restructuring heuristics.] |
---|
| 9 | |
---|
| 10 | Description [Routines in the file implement the Fanin oriented and |
---|
| 11 | Fanin-Fanout oriented restructuring heuristics. |
---|
| 12 | |
---|
| 13 | Please refer to "A symbolic algorithm for low power sequential synthesis," |
---|
| 14 | ISLPED 97, for more details.] |
---|
| 15 | |
---|
| 16 | SeeAlso [restrHammingD.c restrCProj.c] |
---|
| 17 | |
---|
| 18 | Author [Balakrishna Kumthekar <kumtheka@colorado.edu>] |
---|
| 19 | |
---|
| 20 | Copyright [This file was created at the University of Colorado at |
---|
| 21 | Boulder. The University of Colorado at Boulder makes no warranty |
---|
| 22 | about the suitability of this software for any purpose. It is |
---|
| 23 | presented on an AS IS basis.] |
---|
| 24 | |
---|
| 25 | ******************************************************************************/ |
---|
| 26 | |
---|
| 27 | #include "restrInt.h" |
---|
| 28 | |
---|
| 29 | /*---------------------------------------------------------------------------*/ |
---|
| 30 | /* Constant declarations */ |
---|
| 31 | /*---------------------------------------------------------------------------*/ |
---|
| 32 | |
---|
| 33 | |
---|
| 34 | /*---------------------------------------------------------------------------*/ |
---|
| 35 | /* Type declarations */ |
---|
| 36 | /*---------------------------------------------------------------------------*/ |
---|
| 37 | |
---|
| 38 | |
---|
| 39 | /*---------------------------------------------------------------------------*/ |
---|
| 40 | /* Structure declarations */ |
---|
| 41 | /*---------------------------------------------------------------------------*/ |
---|
| 42 | |
---|
| 43 | /*---------------------------------------------------------------------------*/ |
---|
| 44 | /* Variable declarations */ |
---|
| 45 | /*---------------------------------------------------------------------------*/ |
---|
| 46 | |
---|
| 47 | |
---|
| 48 | /*---------------------------------------------------------------------------*/ |
---|
| 49 | /* Macro declarations */ |
---|
| 50 | /*---------------------------------------------------------------------------*/ |
---|
| 51 | |
---|
| 52 | |
---|
| 53 | /**AutomaticStart*************************************************************/ |
---|
| 54 | |
---|
| 55 | /*---------------------------------------------------------------------------*/ |
---|
| 56 | /* Static function prototypes */ |
---|
| 57 | /*---------------------------------------------------------------------------*/ |
---|
| 58 | |
---|
| 59 | |
---|
| 60 | /**AutomaticEnd***************************************************************/ |
---|
| 61 | |
---|
| 62 | |
---|
| 63 | /*---------------------------------------------------------------------------*/ |
---|
| 64 | /* Definition of exported functions */ |
---|
| 65 | /*---------------------------------------------------------------------------*/ |
---|
| 66 | |
---|
| 67 | /*---------------------------------------------------------------------------*/ |
---|
| 68 | /* Definition of internal functions */ |
---|
| 69 | /*---------------------------------------------------------------------------*/ |
---|
| 70 | |
---|
| 71 | /**Function******************************************************************** |
---|
| 72 | |
---|
| 73 | Synopsis [This routine implements the Fanin oriented and Fanin-Fanout |
---|
| 74 | oriented restructuring heuristics. Returns the BDD of the restructured STG.] |
---|
| 75 | |
---|
| 76 | Description [This routine implements the Fanin oriented and Fanin-Fanout |
---|
| 77 | oriented restructuring heuristics. Returns the BDD of the restructured STG. |
---|
| 78 | |
---|
| 79 | <tt>equivRel</tt> is the state equivalence relation of the |
---|
| 80 | fsm. <tt>oldTR</tt> if the state transition relation. <tt>addPTR</tt> is the |
---|
| 81 | 0-1 ADD of the augmented transition relation. <tt>possessedProbMatrix</tt> is |
---|
| 82 | the weighted graph representing the augmented transition relation. The edge |
---|
| 83 | weights are the prob. of transition of that edge. <tt>stateProbs</tt> is an |
---|
| 84 | ADD representing the steady state probabilities of the fsm. <tt>piVars</tt> |
---|
| 85 | are the BDD variables for primary inputs. <tt>heuristic</tt> takes on two |
---|
| 86 | values: RestrFanin_c and RestrFaninFanout_c. |
---|
| 87 | |
---|
| 88 | Please refer to "A Symbolic Algorithm for Low-Power Sequential |
---|
| 89 | Synthesis", ISLPED 97 for more details.] |
---|
| 90 | |
---|
| 91 | SideEffects [<tt>addPtr</tt> and <tt>possessedProbMatrix</tt> are |
---|
| 92 | dereferenced in this routine. <tt>outBdds</tt> and <tt>newInit</tt> are |
---|
| 93 | changed to reflect the restructured STG.] |
---|
| 94 | |
---|
| 95 | SeeAlso [RestrMinimizeFsmByCProj RestrSelectLeastHammingDStates] |
---|
| 96 | ******************************************************************************/ |
---|
| 97 | bdd_node * |
---|
| 98 | RestrMinimizeFsmByFaninFanout( |
---|
| 99 | bdd_manager *ddManager, |
---|
| 100 | bdd_node *equivRel, |
---|
| 101 | bdd_node *oldTR, |
---|
| 102 | bdd_node **addPTR, |
---|
| 103 | bdd_node **possessedProbMatrix, |
---|
| 104 | bdd_node *initBdd, |
---|
| 105 | bdd_node *reachable, |
---|
| 106 | bdd_node *stateProbs, |
---|
| 107 | bdd_node **piVars, |
---|
| 108 | bdd_node **xVars, |
---|
| 109 | bdd_node **yVars, |
---|
| 110 | bdd_node **uVars, |
---|
| 111 | bdd_node **vVars, |
---|
| 112 | int nVars, |
---|
| 113 | int nPi, |
---|
| 114 | RestructureHeuristic heuristic, |
---|
| 115 | array_t **outBdds, |
---|
| 116 | bdd_node **newInit) |
---|
| 117 | { |
---|
| 118 | bdd_node *temp1, *temp2, *temp3; |
---|
| 119 | bdd_node *xCube, *yCube; |
---|
| 120 | bdd_node *Rxy,*Rxv; |
---|
| 121 | bdd_node *RxvgtRxy, *RxveqRxy; /* These are BDDs */ |
---|
| 122 | bdd_node **xAddVars,**yAddVars,**vAddVars; |
---|
| 123 | bdd_node *priority, *result, *matrix; |
---|
| 124 | bdd_node *newEquivRel; |
---|
| 125 | bdd_node *oneInitState; |
---|
| 126 | bdd_node *hammingWeight; |
---|
| 127 | bdd_node *lhs, *rhs; |
---|
| 128 | bdd_node *bddCProj; |
---|
| 129 | bdd_node *bddCProjvy, *addCProjvy; |
---|
| 130 | bdd_node *newCProjvy, *newCProjux; |
---|
| 131 | bdd_node *zeroProbs, *zeroProbFactor; |
---|
| 132 | bdd_node *weight; |
---|
| 133 | |
---|
| 134 | array_t *newOutBdds; |
---|
| 135 | int i, index; |
---|
| 136 | |
---|
| 137 | /* Collect the ADD variables for futre use */ |
---|
| 138 | xAddVars = ALLOC(bdd_node *,nVars); |
---|
| 139 | yAddVars = ALLOC(bdd_node *,nVars); |
---|
| 140 | vAddVars = ALLOC(bdd_node *,nVars); |
---|
| 141 | |
---|
| 142 | for(i = 0; i < nVars; i++) { |
---|
| 143 | index = bdd_node_read_index(yVars[i]); |
---|
| 144 | bdd_ref(yAddVars[i] = bdd_add_ith_var(ddManager,index)); |
---|
| 145 | index = bdd_node_read_index(vVars[i]); |
---|
| 146 | bdd_ref(vAddVars[i] = bdd_add_ith_var(ddManager,index)); |
---|
| 147 | index = bdd_node_read_index(xVars[i]); |
---|
| 148 | bdd_ref(xAddVars[i] = bdd_add_ith_var(ddManager,index)); |
---|
| 149 | } |
---|
| 150 | |
---|
| 151 | /* Restrict the equivalence relation only to the reachable states */ |
---|
| 152 | /* temp1 = R(v) */ |
---|
| 153 | bdd_ref(temp1 = bdd_bdd_swap_variables(ddManager,reachable,xVars, |
---|
| 154 | vVars,nVars)); |
---|
| 155 | /* temp2 = R(y) */ |
---|
| 156 | bdd_ref(temp2 = bdd_bdd_swap_variables(ddManager,reachable,xVars, |
---|
| 157 | yVars,nVars)); |
---|
| 158 | /* temp3 = R(v) * R(y) */ |
---|
| 159 | bdd_ref(temp3 = bdd_bdd_and(ddManager,temp1,temp2)); |
---|
| 160 | bdd_recursive_deref(ddManager,temp1); |
---|
| 161 | bdd_recursive_deref(ddManager,temp2); |
---|
| 162 | /* newEquivRel(v,y) = E(v,y) * R(v) * R(y) */ |
---|
| 163 | bdd_ref(newEquivRel = bdd_bdd_and(ddManager,equivRel,temp3)); |
---|
| 164 | bdd_recursive_deref(ddManager,temp3); |
---|
| 165 | |
---|
| 166 | /* Select one state from the set of initial states */ |
---|
| 167 | oneInitState = bdd_bdd_pick_one_minterm(ddManager,initBdd,xVars,nVars); |
---|
| 168 | bdd_ref(oneInitState); |
---|
| 169 | |
---|
| 170 | /* Initially an arbitrary choice of a 'nominal representative' for each |
---|
| 171 | equivalence class is made--using compatible projection--with the initial |
---|
| 172 | state as the reference vertex. bddCProj is as the name indicates, in terms |
---|
| 173 | of y and x. bddCProj refers to $\Psi(x,y)$ in the ISLPED 97 reference. */ |
---|
| 174 | |
---|
| 175 | bdd_ref(temp1 = bdd_bdd_swap_variables(ddManager,oneInitState,xVars, |
---|
| 176 | vVars,nVars)); |
---|
| 177 | bdd_recursive_deref(ddManager,oneInitState); |
---|
| 178 | bdd_ref(bddCProjvy = bdd_bdd_cprojection(ddManager, newEquivRel, temp1)); |
---|
| 179 | bdd_recursive_deref(ddManager,newEquivRel); |
---|
| 180 | bdd_recursive_deref(ddManager,temp1); |
---|
| 181 | bdd_ref(bddCProj = bdd_bdd_swap_variables(ddManager,bddCProjvy,vVars, |
---|
| 182 | xVars,nVars)); |
---|
| 183 | bdd_ref(addCProjvy = bdd_bdd_to_add(ddManager,bddCProjvy)); |
---|
| 184 | bdd_recursive_deref(ddManager,bddCProjvy); |
---|
| 185 | |
---|
| 186 | /* Let's compute the weight matrix */ |
---|
| 187 | /* hammingWeight equal (nVars - HD(x,y)) */ |
---|
| 188 | bdd_ref(temp1 = bdd_add_const(ddManager,(double)nVars)); |
---|
| 189 | bdd_ref(temp2 = bdd_add_hamming(ddManager,xVars,yVars,nVars)); |
---|
| 190 | bdd_ref(hammingWeight = bdd_add_apply(ddManager,bdd_add_minus, |
---|
| 191 | temp1,temp2)); |
---|
| 192 | bdd_recursive_deref(ddManager,temp1); |
---|
| 193 | bdd_recursive_deref(ddManager,temp2); |
---|
| 194 | |
---|
| 195 | /* temp1 = possessedProbMatrix * (nVars - HD(x,y)) */ |
---|
| 196 | bdd_ref(temp1 = bdd_add_apply(ddManager,bdd_add_times,hammingWeight, |
---|
| 197 | *possessedProbMatrix)); |
---|
| 198 | bdd_recursive_deref(ddManager,*possessedProbMatrix); |
---|
| 199 | |
---|
| 200 | /* matrix = possessedProbMatrix * (nVars - HD(x,y)) * stateProbs */ |
---|
| 201 | bdd_ref(matrix = bdd_add_apply(ddManager,bdd_add_times,temp1, |
---|
| 202 | stateProbs)); |
---|
| 203 | bdd_recursive_deref(ddManager,temp1); |
---|
| 204 | |
---|
| 205 | /* Compute the contribution of the edges that have a state with zero |
---|
| 206 | * probability as its source node. The contribution is measured in terms |
---|
| 207 | * of the hamming distance between the end points of the edge. |
---|
| 208 | * The total weight on any edge is the sum of "matrix" as computed |
---|
| 209 | * above and "zeroProbFactor" as computed below. |
---|
| 210 | */ |
---|
| 211 | bdd_ref(temp1 = bdd_add_bdd_strict_threshold(ddManager,stateProbs,0.0)); |
---|
| 212 | bdd_ref(temp2 = bdd_not_bdd_node(temp1)); |
---|
| 213 | bdd_recursive_deref(ddManager,temp1); |
---|
| 214 | /* zeroProbs evaluates to 1 for those states which have zero steady state |
---|
| 215 | * probability. zeroProbs is a 0-1 ADD. |
---|
| 216 | */ |
---|
| 217 | bdd_ref(zeroProbs = bdd_bdd_to_add(ddManager,temp2)); |
---|
| 218 | bdd_recursive_deref(ddManager,temp2); |
---|
| 219 | |
---|
| 220 | /* temp1 = (1 - HD(x,y)/nVars) */ |
---|
| 221 | bdd_ref(temp2 = bdd_add_const(ddManager,(double)nVars)); |
---|
| 222 | bdd_ref(temp1 = bdd_add_apply(ddManager,bdd_add_divide,hammingWeight, |
---|
| 223 | temp2)); |
---|
| 224 | bdd_recursive_deref(ddManager,temp2); |
---|
| 225 | bdd_recursive_deref(ddManager,hammingWeight); |
---|
| 226 | |
---|
| 227 | /* temp2 = (1 - HD(x,y)/nVars) * zeroProbs(x) */ |
---|
| 228 | bdd_ref(temp2 = bdd_add_apply(ddManager,bdd_add_times,temp1,zeroProbs)); |
---|
| 229 | bdd_recursive_deref(ddManager,temp1); |
---|
| 230 | bdd_recursive_deref(ddManager,zeroProbs); |
---|
| 231 | |
---|
| 232 | /* zeroProbFactor = (1 - HD(x,y)/nVars) * zeroProbs(x) * addPTR */ |
---|
| 233 | bdd_ref(zeroProbFactor = bdd_add_apply(ddManager,bdd_add_times, |
---|
| 234 | *addPTR,temp2)); |
---|
| 235 | bdd_recursive_deref(ddManager,*addPTR); |
---|
| 236 | bdd_recursive_deref(ddManager,temp2); |
---|
| 237 | |
---|
| 238 | /* Total edge weight = matrix + zeroProbFactor */ |
---|
| 239 | bdd_ref(weight = bdd_add_apply(ddManager,bdd_add_plus,matrix, |
---|
| 240 | zeroProbFactor)); |
---|
| 241 | bdd_recursive_deref(ddManager,matrix); |
---|
| 242 | bdd_recursive_deref(ddManager,zeroProbFactor); |
---|
| 243 | |
---|
| 244 | /* lhs = Abs(x) (weight(x,y)*CProj(v,y)) */ |
---|
| 245 | bdd_ref(temp1 = bdd_add_apply(ddManager,bdd_add_times,weight, |
---|
| 246 | addCProjvy)); |
---|
| 247 | bdd_ref(temp3 = bdd_add_compute_cube(ddManager,xAddVars,NIL(int),nVars)); |
---|
| 248 | bdd_ref(lhs = bdd_add_exist_abstract(ddManager,temp1,temp3)); |
---|
| 249 | bdd_recursive_deref(ddManager,temp1); |
---|
| 250 | bdd_recursive_deref(ddManager,temp3); |
---|
| 251 | |
---|
| 252 | /* Now lhs is a function of x and y */ |
---|
| 253 | bdd_ref(temp1 = bdd_add_swap_variables(ddManager,lhs,vAddVars,xAddVars, |
---|
| 254 | nVars)); |
---|
| 255 | bdd_recursive_deref(ddManager,lhs); |
---|
| 256 | lhs = temp1; |
---|
| 257 | |
---|
| 258 | if (heuristic == RestrFaninFanout_c) { |
---|
| 259 | /* let's compute the rhs */ |
---|
| 260 | bdd_ref(temp1 = bdd_add_swap_variables(ddManager,addCProjvy,yAddVars, |
---|
| 261 | xAddVars, nVars)); |
---|
| 262 | bdd_recursive_deref(ddManager,addCProjvy); |
---|
| 263 | bdd_ref(rhs = bdd_add_apply(ddManager,bdd_add_times,weight,temp1)); |
---|
| 264 | bdd_recursive_deref(ddManager,temp1); |
---|
| 265 | bdd_recursive_deref(ddManager,weight); |
---|
| 266 | temp1 = rhs; |
---|
| 267 | bdd_ref(temp3 = bdd_add_compute_cube(ddManager,yAddVars,NIL(int),nVars)); |
---|
| 268 | bdd_ref(rhs = bdd_add_exist_abstract(ddManager,temp1,temp3)); |
---|
| 269 | bdd_recursive_deref(ddManager,temp1); |
---|
| 270 | bdd_recursive_deref(ddManager,temp3); |
---|
| 271 | |
---|
| 272 | /* rhs is now a function of x and y */ |
---|
| 273 | bdd_ref(temp1 = bdd_add_swap_variables(ddManager,rhs,xAddVars, |
---|
| 274 | yAddVars,nVars)); |
---|
| 275 | bdd_recursive_deref(ddManager,rhs); |
---|
| 276 | bdd_ref(rhs = bdd_add_swap_variables(ddManager,temp1,vAddVars, |
---|
| 277 | xAddVars,nVars)); |
---|
| 278 | bdd_recursive_deref(ddManager,temp1); |
---|
| 279 | |
---|
| 280 | /* take the average of lhs and rhs */ |
---|
| 281 | bdd_ref(temp1 = bdd_add_apply(ddManager,bdd_add_plus,lhs,rhs)); |
---|
| 282 | bdd_recursive_deref(ddManager,lhs); |
---|
| 283 | bdd_recursive_deref(ddManager,rhs); |
---|
| 284 | bdd_ref(temp2 = bdd_add_const(ddManager,(double)2.0)); |
---|
| 285 | bdd_ref(Rxy = bdd_add_apply(ddManager,bdd_add_divide,temp1,temp2)); |
---|
| 286 | bdd_recursive_deref(ddManager,temp1); |
---|
| 287 | bdd_recursive_deref(ddManager,temp2); |
---|
| 288 | } |
---|
| 289 | else { |
---|
| 290 | bdd_recursive_deref(ddManager,weight); |
---|
| 291 | bdd_recursive_deref(ddManager,addCProjvy); |
---|
| 292 | Rxy = lhs; |
---|
| 293 | } |
---|
| 294 | |
---|
| 295 | /* Rxv = Rxy(x,v) */ |
---|
| 296 | bdd_ref(Rxv = bdd_add_swap_variables(ddManager,Rxy,yAddVars,vAddVars, |
---|
| 297 | nVars)); |
---|
| 298 | /* RxvgtRxy(x,v,y) = Rxv(x,v) > Rxy(x,y) */ |
---|
| 299 | bdd_ref(temp1 = bdd_add_apply(ddManager,RestrAddMaximum,Rxv,Rxy)); |
---|
| 300 | bdd_ref(RxvgtRxy = bdd_add_bdd_threshold(ddManager,temp1,(double) 1.0)); |
---|
| 301 | bdd_recursive_deref(ddManager,temp1); |
---|
| 302 | |
---|
| 303 | /* RxveqRxy(x,v,y) = Rxz(x,v) == Rxy(x,y) */ |
---|
| 304 | bdd_ref(temp1 = bdd_add_apply(ddManager,RestrAddEqual,Rxv,Rxy)); |
---|
| 305 | bdd_ref(RxveqRxy = bdd_add_bdd_threshold(ddManager,temp1,(double) 1.0)); |
---|
| 306 | bdd_recursive_deref(ddManager,temp1); |
---|
| 307 | bdd_recursive_deref(ddManager,Rxv); |
---|
| 308 | bdd_recursive_deref(ddManager,Rxy); |
---|
| 309 | |
---|
| 310 | /* temp1 is the tie-break function. (RxveqRxy . temp1 = temp2)*/ |
---|
| 311 | bdd_ref(temp1 = bdd_dxygtdxz(ddManager,nVars,xVars,yVars,vVars)); |
---|
| 312 | bdd_ref(temp2 = bdd_bdd_and(ddManager,RxveqRxy,temp1)); |
---|
| 313 | bdd_recursive_deref(ddManager,temp1); |
---|
| 314 | bdd_recursive_deref(ddManager,RxveqRxy); |
---|
| 315 | |
---|
| 316 | bdd_ref(priority = bdd_bdd_or(ddManager,temp2,RxvgtRxy)); |
---|
| 317 | bdd_recursive_deref(ddManager,RxvgtRxy); |
---|
| 318 | bdd_recursive_deref(ddManager,temp2); |
---|
| 319 | |
---|
| 320 | /* temp1 represents the pair (oldrepresentative,newprepresentative) in terms |
---|
| 321 | of x and y respectively */ |
---|
| 322 | bdd_ref(temp1 = bdd_priority_select(ddManager,bddCProj,xVars, |
---|
| 323 | yVars,vVars,priority,nVars,NULL)); |
---|
| 324 | bdd_recursive_deref(ddManager,priority); |
---|
| 325 | |
---|
| 326 | bdd_ref(xCube = bdd_bdd_compute_cube(ddManager,xVars,NIL(int),nVars)); |
---|
| 327 | bdd_ref(yCube = bdd_bdd_compute_cube(ddManager,yVars,NIL(int),nVars)); |
---|
| 328 | |
---|
| 329 | /* newCProjvy is in terms of v,y */ |
---|
| 330 | /* v represents the new representative of equivalent states */ |
---|
| 331 | |
---|
| 332 | bdd_ref(temp2 = bdd_bdd_swap_variables(ddManager,temp1,yVars,vVars, |
---|
| 333 | nVars)); |
---|
| 334 | bdd_recursive_deref(ddManager,temp1); |
---|
| 335 | bdd_ref(newCProjvy = bdd_bdd_and_abstract(ddManager,bddCProj,temp2, |
---|
| 336 | xCube)); |
---|
| 337 | bdd_recursive_deref(ddManager,bddCProj); |
---|
| 338 | bdd_recursive_deref(ddManager,temp2); |
---|
| 339 | |
---|
| 340 | bdd_ref(temp1 = bdd_bdd_swap_variables(ddManager,newCProjvy,yVars, |
---|
| 341 | xVars,nVars)); |
---|
| 342 | bdd_ref(newCProjux = bdd_bdd_swap_variables(ddManager,temp1,vVars, |
---|
| 343 | uVars,nVars)); |
---|
| 344 | bdd_recursive_deref(ddManager,temp1); |
---|
| 345 | |
---|
| 346 | /* Change the output functions accordingly */ |
---|
| 347 | newOutBdds = array_alloc(bdd_node *,0); |
---|
| 348 | arrayForEachItem(bdd_node *,*outBdds,i,temp3) { |
---|
| 349 | bdd_ref(temp1 = bdd_bdd_and_abstract(ddManager,temp3,newCProjux, |
---|
| 350 | xCube)); |
---|
| 351 | bdd_ref(temp2 = bdd_bdd_swap_variables(ddManager,temp1,uVars,xVars, |
---|
| 352 | nVars)); |
---|
| 353 | bdd_recursive_deref(ddManager,temp1); |
---|
| 354 | bdd_recursive_deref(ddManager,temp3); |
---|
| 355 | array_insert_last(bdd_node *,newOutBdds,temp2); |
---|
| 356 | } |
---|
| 357 | array_free(*outBdds); |
---|
| 358 | *outBdds = newOutBdds; |
---|
| 359 | |
---|
| 360 | /* Change the initBdd accordingly */ |
---|
| 361 | bdd_ref(temp1 = bdd_bdd_and_abstract(ddManager,initBdd,newCProjux,xCube)); |
---|
| 362 | bdd_ref(*newInit = bdd_bdd_swap_variables(ddManager,temp1,uVars,xVars, |
---|
| 363 | nVars)); |
---|
| 364 | bdd_recursive_deref(ddManager,temp1); |
---|
| 365 | |
---|
| 366 | /* Compute the new transition relation w.r.t the new CProjection function. |
---|
| 367 | * result = newCProjux * oldTR(x,y) * newCProjvy |
---|
| 368 | */ |
---|
| 369 | bdd_ref(temp1 = bdd_bdd_and(ddManager,xCube,yCube)); |
---|
| 370 | bdd_recursive_deref(ddManager,xCube); |
---|
| 371 | bdd_recursive_deref(ddManager,yCube); |
---|
| 372 | bdd_ref(temp2 = bdd_bdd_and(ddManager,newCProjux,oldTR)); |
---|
| 373 | bdd_recursive_deref(ddManager,newCProjux); |
---|
| 374 | bdd_ref(temp3 = bdd_bdd_and(ddManager,temp2,newCProjvy)); |
---|
| 375 | bdd_recursive_deref(ddManager,newCProjvy); |
---|
| 376 | bdd_recursive_deref(ddManager,temp2); |
---|
| 377 | bdd_ref(result = bdd_bdd_exist_abstract(ddManager,temp3,temp1)); |
---|
| 378 | bdd_recursive_deref(ddManager,temp1); |
---|
| 379 | bdd_recursive_deref(ddManager,temp3); |
---|
| 380 | |
---|
| 381 | bdd_ref(temp1 = bdd_bdd_swap_variables(ddManager,result,uVars,xVars, |
---|
| 382 | nVars)); |
---|
| 383 | bdd_ref(temp2 = bdd_bdd_swap_variables(ddManager,temp1,vVars,yVars, |
---|
| 384 | nVars)); |
---|
| 385 | bdd_recursive_deref(ddManager,temp1); |
---|
| 386 | bdd_recursive_deref(ddManager,result); |
---|
| 387 | result = temp2; |
---|
| 388 | |
---|
| 389 | /* Clean up */ |
---|
| 390 | for(i = 0; i < nVars; i++) { |
---|
| 391 | bdd_recursive_deref(ddManager,yAddVars[i]); |
---|
| 392 | bdd_recursive_deref(ddManager,vAddVars[i]); |
---|
| 393 | bdd_recursive_deref(ddManager,xAddVars[i]); |
---|
| 394 | } |
---|
| 395 | FREE(yAddVars); |
---|
| 396 | FREE(vAddVars); |
---|
| 397 | FREE(xAddVars); |
---|
| 398 | |
---|
| 399 | /* Return the restructred STG */ |
---|
| 400 | return result; |
---|
| 401 | } |
---|
| 402 | |
---|
| 403 | |
---|
| 404 | /*---------------------------------------------------------------------------*/ |
---|
| 405 | /* Definition of static functions */ |
---|
| 406 | /*---------------------------------------------------------------------------*/ |
---|