Exemplo n.º 1
0
int bdd_noderesize(int doRehash)
{
   BddNode *newnodes;
   int oldsize = bddnodesize;
   int n;

   if (bddnodesize >= bddmaxnodesize  &&  bddmaxnodesize > 0)
      return -1;
   
   bddnodesize = bddnodesize << 1;

   if (bddnodesize > oldsize + bddmaxnodeincrease)
      bddnodesize = oldsize + bddmaxnodeincrease;

   if (bddnodesize > bddmaxnodesize  &&  bddmaxnodesize > 0)
      bddnodesize = bddmaxnodesize;

   bddnodesize = bdd_prime_lte(bddnodesize);
   
   if (resize_handler != NULL)
      resize_handler(oldsize, bddnodesize);

   newnodes = (BddNode*)realloc(bddnodes, sizeof(BddNode)*bddnodesize);
   if (newnodes == NULL)
      return bdd_error(BDD_MEMORY);
   bddnodes = newnodes;

   if (doRehash)
      for (n=0 ; n<oldsize ; n++)
	 bddnodes[n].hash = 0;
   
   for (n=oldsize ; n<bddnodesize ; n++)
   {
      bddnodes[n].refcou = 0;
      bddnodes[n].hash = 0;
      LEVEL(n) = 0;
      LOW(n) = -1;
      bddnodes[n].next = n+1;
   }
   bddnodes[bddnodesize-1].next = bddfreepos;
   bddfreepos = oldsize;
   bddfreenum += bddnodesize - oldsize;

   if (doRehash)
      bdd_gbc_rehash();

   bddresized = 1;
   
   return 0;
}
Exemplo n.º 2
0
static int bdd_noderesize2(int doRehash, int oldsize, int newsize)
{
   int n;
   newsize = bdd_prime_lte(newsize);
   
   if (oldsize > newsize) {
     return 0;
   }
   bddnodesize = newsize;
   
   if (resize_handler != NULL)
      resize_handler(oldsize, bddnodesize);

   if (bddnodesize > MAX_ALLOC_NODES) {
     alloced = (BddNode*)realloc(alloced, sizeof(BddNode)*bddnodesize);
     if (alloced == NULL)
       return bdd_error(BDD_MEMORY);
     bddnodes = alloced;
     MAX_ALLOC_NODES = bddnodesize;
   } else {
     bddnodes = alloced;
   }

   if (doRehash)
      for (n=0 ; n<oldsize ; n++)
	 SETHASH(n, 0);
   
   for (n=oldsize ; n<bddnodesize ; n++)
   {
      INIT_NODE(n);
   }
   SETNEXT(bddnodesize-1, bddfreepos);
   bddfreepos = oldsize;
   bddfreenum += bddnodesize - oldsize;

   if (doRehash)
      bdd_gbc_rehash();

   bddresized = 1;
   
   return 0;
}