00001
00049 #include "cuPortInt.h"
00050
00051 #ifndef lint
00052 static char rcsid[] UNUSED = "$Id: cuPortIter.c,v 1.13 2004/08/13 18:39:31 fabio Exp $";
00053 #endif
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067 typedef struct {
00068 DdManager *manager;
00069 DdGen *ddGen;
00070 array_t *cube;
00071 } cu_bdd_gen;
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00085
00086
00087
00088
00089
00092
00093
00094
00095
00105 bdd_gen_status
00106 bdd_gen_read_status(bdd_gen *gen)
00107 {
00108 if (Cudd_IsGenEmpty(((cu_bdd_gen *)gen)->ddGen)) {
00109 return bdd_EMPTY;
00110 }
00111 else {
00112 return bdd_NONEMPTY;
00113 }
00114
00115 }
00116
00117
00137 bdd_gen *
00138 bdd_first_disjoint_cube(bdd_t *fn, array_t **cube )
00139 {
00140 DdManager *manager;
00141 cu_bdd_gen *gen;
00142 int i;
00143 int *icube;
00144 CUDD_VALUE_TYPE value;
00145
00146
00147 assert(fn != 0);
00148
00149 manager = (DdManager *)fn->mgr;
00150
00151
00152 gen = ALLOC(cu_bdd_gen,1);
00153 if (gen == NULL) {
00154 return(NIL(bdd_gen));
00155 }
00156 gen->manager = manager;
00157
00158 gen->cube = array_alloc(bdd_literal, manager->size);
00159 if (gen->cube == NULL) {
00160 fail("Bdd Package: Out of memory in bdd_first_cube");
00161 }
00162
00163 gen->ddGen = Cudd_FirstCube(manager,(DdNode *)fn->node,&icube,&value);
00164 if (gen->ddGen == NULL) {
00165 fail("Cudd Package: Out of memory in bdd_first_cube");
00166 }
00167
00168 if (!Cudd_IsGenEmpty(gen->ddGen)) {
00169
00170 for (i = 0; i < manager->size; i++) {
00171 int myconst = icube[i];
00172 array_insert(bdd_literal, gen->cube, i, myconst);
00173 }
00174 *cube = gen->cube;
00175 }
00176
00177 return(gen);
00178
00179 }
00180
00181
00192 boolean
00193 bdd_next_disjoint_cube(bdd_gen *gen_, array_t **cube )
00194 {
00195 cu_bdd_gen *gen;
00196 int retval;
00197 int *icube;
00198 CUDD_VALUE_TYPE value;
00199 int i;
00200
00201 gen = (cu_bdd_gen *)gen_;
00202
00203 retval = Cudd_NextCube(gen->ddGen,&icube,&value);
00204 if (!Cudd_IsGenEmpty(gen->ddGen)) {
00205
00206 for (i = 0; i < gen->manager->size; i++) {
00207 int myconst = icube[i];
00208 array_insert(bdd_literal, gen->cube, i, myconst);
00209 }
00210 *cube = gen->cube;
00211 }
00212
00213 return(retval);
00214
00215 }
00216
00217
00238 bdd_gen *
00239 bdd_first_cube(bdd_t *fn, array_t **cube )
00240 {
00241 DdManager *manager;
00242 cu_bdd_gen *gen;
00243 int i;
00244 int *icube;
00245
00246
00247 assert(fn != 0);
00248
00249 manager = (DdManager *)fn->mgr;
00250
00251
00252 gen = ALLOC(cu_bdd_gen,1);
00253 if (gen == NULL) {
00254 return(NIL(bdd_gen));
00255 }
00256 gen->manager = manager;
00257
00258 gen->cube = array_alloc(bdd_literal, manager->size);
00259 if (gen->cube == NULL) {
00260 fail("Bdd Package: Out of memory in bdd_first_cube");
00261 }
00262
00263 gen->ddGen = Cudd_FirstPrime(manager,(DdNode *)fn->node,
00264 (DdNode *)fn->node,&icube);
00265 if (gen->ddGen == NULL) {
00266 fail("Cudd Package: Out of memory in bdd_first_cube");
00267 }
00268
00269 if (!Cudd_IsGenEmpty(gen->ddGen)) {
00270
00271 for (i = 0; i < manager->size; i++) {
00272 int myconst = icube[i];
00273 array_insert(bdd_literal, gen->cube, i, myconst);
00274 }
00275 *cube = gen->cube;
00276 }
00277
00278 return(gen);
00279
00280 }
00281
00282
00293 boolean
00294 bdd_next_cube(bdd_gen *gen_, array_t **cube )
00295 {
00296 cu_bdd_gen *gen;
00297 int retval;
00298 int *icube;
00299 int i;
00300
00301 gen = (cu_bdd_gen *)gen_;
00302
00303 retval = Cudd_NextPrime(gen->ddGen,&icube);
00304 if (!Cudd_IsGenEmpty(gen->ddGen)) {
00305
00306 for (i = 0; i < gen->manager->size; i++) {
00307 int myconst = icube[i];
00308 array_insert(bdd_literal, gen->cube, i, myconst);
00309 }
00310 *cube = gen->cube;
00311 }
00312
00313 return(retval);
00314
00315 }
00316
00317
00327 bdd_gen *
00328 bdd_first_node(bdd_t *fn, bdd_node **node )
00329 {
00330 bdd_manager *manager;
00331 cu_bdd_gen *gen;
00332
00333
00334 assert(fn != 0);
00335
00336 manager = fn->mgr;
00337
00338
00339 gen = ALLOC(cu_bdd_gen,1);
00340 if (gen == NULL) return(NULL);
00341 gen->manager = (DdManager *) manager;
00342 gen->cube = NULL;
00343
00344 gen->ddGen = Cudd_FirstNode((DdManager *)manager,(DdNode *)fn->node,
00345 (DdNode **)node);
00346 if (gen->ddGen == NULL) {
00347 fail("Cudd Package: Out of memory in bdd_first_node");
00348 }
00349
00350 return(gen);
00351
00352 }
00353
00354
00365 boolean
00366 bdd_next_node(bdd_gen *gen, bdd_node **node )
00367 {
00368 return(Cudd_NextNode(((cu_bdd_gen *)gen)->ddGen,(DdNode **)node));
00369
00370 }
00371
00372
00384 int
00385 bdd_gen_free(bdd_gen *gen_)
00386 {
00387 cu_bdd_gen *gen;
00388
00389 gen = (cu_bdd_gen *)gen_;
00390 if (gen->cube != NULL) array_free(gen->cube);
00391 Cudd_GenFree(gen->ddGen);
00392 FREE(gen);
00393 return(0);
00394
00395 }
00396
00397
00398
00399