示例#1
0
ref_t shadow_new_variable(shadow_mgr mgr) {
    ref_t r = REF_INVALID;
    DdNode *n = NULL;
    if (mgr->do_cudd) {
	n = Cudd_bddNewVar(mgr->bdd_manager);
	reference_dd(mgr, n);
    }
    if (mgr->do_local) {
	r = ref_new_variable(mgr->ref_mgr);
    }
    if (mgr->do_dist) {
	ref_t rdist = dist_var(mgr->ref_mgr);
	if (mgr->do_local) {
	    if (!check_refs(mgr, r, rdist))
		return REF_INVALID;
	} else
	    r = rdist;
    }
    if (!mgr->do_cudd)
	n = ref2dd(mgr, r);
    if (!do_ref(mgr)) 
	r = dd2ref(n, IS_BDD);
    add_ref(mgr, r, n);
    mgr->nvars++;
    return r;
}
示例#2
0
文件: DdWire.cpp 项目: HosukChoi/ECO
DdWire::DdWire(DdManager * pDdManager, char * pName, int index, int type){
	__type = type;
	if(type == 1)
		__pDdNode = Cudd_bddNewVar(pDdManager);
	else
		__pDdNode = NULL;
	
	__pName = pName;
	__index = index;
	__pNext = NULL;
	__pOutputListNext = NULL;
	__pInputListNext = NULL;
}
示例#3
0
DdWire * BddBuilder::__addDdWireB(BddBuilder * pA, Wire * pWire){
	DdWire * pNewDdWire;
	if(pWire->get_type() != 1)
		pNewDdWire = new DdWire(__pddManager, pWire->get_name(), pWire->get_index(), pWire->get_type());
	else{
		pNewDdWire = new DdWire(__pddManager, pWire->get_name(), pWire->get_index(), 0);
		for(int i=0 ; i<pA->__inputWireCnt ; ++i){
			if(!strcmp(pA->__ppInputNodesNames[i], pWire->get_name())){
				pNewDdWire->setDdNode(pA->__pddInputNodes[i]);
				break;
			}
		}
		if(pNewDdWire->getDdNode() == NULL){
			pNewDdWire->setDdNode(Cudd_bddNewVar(__pddManager));
		}
	}

	if(!__pddWireHead)
		__pddWireHead = __pddWireTail = pNewDdWire;
	else{
		__pddWireTail->setNext(pNewDdWire);
		__pddWireTail = pNewDdWire;
	}

	if(pWire->get_type() == 2){
		if(!__pddOutputWireHead)
			__pddOutputWireHead = __pddOutputWireTail = pNewDdWire;
		else{
			__pddOutputWireTail->setOutputListNext(pNewDdWire);
			__pddOutputWireTail = pNewDdWire;
		}
		++__outputWireCnt;
	}
	else if(pWire->get_type() == 1){
		if(!__pddInputWireHead)
			__pddInputWireHead = __pddInputWireTail = pNewDdWire;
		else{
			__pddInputWireTail->setInputListNext(pNewDdWire);
			__pddInputWireTail = pNewDdWire;
		}
		++__inputWireCnt;
	}

	return pNewDdWire;
}
示例#4
0
void
I_BDD_new_mutex_domain (DdManager *dd, DdNode *node[], unsigned int size)
{
  unsigned int shbuf, vars, ctr;
  DdNode **ddVar, *one, *newnode, *oldnode, *bitnode;
  int i,j, extra;

  /* base cases */

  if (size == 0)
    {
      return;
    }

  one = Cudd_ReadOne(dd);

  if (size == 1)
    {
      node[0] = one;
      Cudd_Ref (node[0]);
      return;
    }

  for(shbuf = size - 1, vars = 0; shbuf != 0; shbuf >>= 1, vars++);

  extra = (1 << vars) - size;

  ddVar = malloc(vars * sizeof(DdNode *));

  for (j = 0; j < vars; j++)
    {
      ddVar[j] = bitnode = Cudd_bddNewVar (dd);
      Cudd_Ref (bitnode);
    }

  ctr = 0;

  for (i = 0; i < size; i++, ctr++)
    {
      newnode = one;
      Cudd_Ref (newnode);

#ifdef I_BDD_MUTEX_DEBUG
      printf("i%d:", i);
#endif

      for (j = (extra > 0); j < vars; j++)
	{
	  bitnode = (ctr & (1 << j)) ? ddVar[j] : Cudd_Not(ddVar[j]);

	  newnode = Cudd_bddAnd (dd, bitnode, oldnode = newnode);
	  Cudd_Ref (newnode);
	  Cudd_RecursiveDeref (dd, oldnode);

#ifdef I_BDD_MUTEX_DEBUG
	  if (ctr & (1 << j))
	    printf("+ v%d ", j);
	  else
	    printf("+ !v%d ", j);
#endif
	}

#ifdef I_BDD_MUTEX_DEBUG
      printf ("\n");
#endif

      node[i] = newnode;

      if (extra > 0)
	{
	  extra--;
	  ctr++;
	}
    }

#ifdef I_BDD_MUTEX_TEST
  {
    DdNode *test, *old_test;
    int i;
    test = Cudd_ReadLogicZero(dd);
    Cudd_Ref (test);
    for (i = 0; i < size; i++)
      {
	if (Cudd_bddIte (dd, test, node[i], zero) != zero)
	  I_punt("I_BDD_new_mutex_complex: not mutex!");

	test = Cudd_bddIte(dd, node[i], one, old_test = test);
	Cudd_Ref (test);
	Cudd_RecursiveDeref (dd, old_test);
      }
    if (test != one)
      I_punt("I_BDD_new_mutex_complex: not exhaustive!");

    Cudd_RecursiveDeref (dd, test);
    }
#endif

  for (j = 0; j < vars; j++)
    Cudd_RecursiveDeref (dd, ddVar[j]);

  free (ddVar);
  return;
}