Esempio n. 1
0
NODE * str2tree(const char ** pstr)
{
	/* examples:
	 *   ()
	 *   (2), (2+)
	 *   (2(1)(3)), (2+(1)(3)), (2(1+)(3+))
	 *   (2(1+)()), (2()(3+))
	 */
	int k;
	const char * p = *pstr;
	NODE * x = 0;

	assert(*p == '(');
	p++;
	assert(isdigit(*p) || *p == ')');
	if (isdigit(*p)) {
		k = 0;
		while (isdigit(*p))
			k = k * 10 + (*p++ - '0');
		if (*p == '+') {
			x = alloc_node(k, R);
			p++;
		} else {
			assert(*p == '(' || *p == ')');
			x = alloc_node(k, B);
		}

		if (*p == '(') {
			x->L = str2tree(&p);
			if (x->L != nil)
				x->L->P = x;

			x->R = str2tree(&p);
			if (x->R !=nil)
				x->R->P = x;
		}
	} else {
		x = nil;
	}
	assert(*p == ')');
	p++;

	printf("processed ");
	for (const char * q = *pstr; q < p; q++)
		printf("%s%c%s",  GREEN, *q, NOCOLOR);
	printf("\n");
	*pstr = p;

	return x;
}
Esempio n. 2
0
ACCExpr *cleanupBool(ACCExpr *expr)
{
    if (!expr)
        return expr;
    inBool++; // can be invoked recursively!
    walkReplaceBuiltin(expr);
    inBool--;
    int varIndex = 0;
    VarMap varMap;
    DdManager * mgr = Cudd_Init(MAX_NAME_COUNT,0,CUDD_UNIQUE_SLOTS,CUDD_CACHE_SLOTS,0);
    varIndex = 0;
    varMap.clear();
    DdNode *bdd = tree2BDD(mgr, expr, varMap);
    char const *inames[MAX_NAME_COUNT];
    for (auto item: varMap)
        inames[item.second->index] = strdup(item.first.c_str());
    char * fform = Cudd_FactoredFormString(mgr, bdd, inames);
    Cudd_RecursiveDeref(mgr, bdd);
    int err = Cudd_CheckZeroRef(mgr);
    if (trace_bool)
        printf("%s: expr '%s' val = %s\n", __FUNCTION__, tree2str(expr).c_str(), fform);
    assert(err == 0 && "Reference counting");
    ACCExpr *ret = str2tree(fform);
    free(fform);
    Cudd_Quit(mgr);
    return ret;
}
Esempio n. 3
0
NODE * init_rbtree(const char * tstr)
{
	nil = alloc_node(-1, B); /* the sentinel */
	nil->P = nil;
	nil->L = nil;
	nil->R = nil;

	NODE * head= alloc_node(INT_MAX, B);
	head->P = nil;
	head->L = str2tree(&tstr);
	head->R = nil;

	assert(*tstr == '\0');

	return head;
}