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; }
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; }
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; }
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; }