static simpaig * build_rec (unsigned lit) { unsigned sign = lit & 1; unsigned idx = lit / 2; simpaig *res, *l, *r; aiger_and *and; if (!(res = lois[idx].aig)) { if (idx) { if ((and = aiger_is_and (model, 2 * idx))) { assert (and->lhs == 2 * idx); l = build_rec (and->rhs0); r = build_rec (and->rhs1); res = simpaig_and (mgr, l, r); } else res = simpaig_var (mgr, lois + idx, 0); } else res = simpaig_false (mgr); lois[idx].aig = res; } if (sign) res = simpaig_not (res); return res; }
void build_rec(int i,int t,int k,int s){ if(i< 1<<k){ c[i]=t; t++; if(t==k){ t=s; } build_rec(i*2,t,k,s); build_rec(i*2+1,t,k,s); } }
void build_stripes_cyc(int k){ int s; for(s=0;1<<s < k-s; s++); build_stripes(s); for(int j=1<<s;j < 1<<s+1;j++) build_rec(j,s+j-(1<<s),k,s); }
bool build_rec(int d, struct list *s, struct tree **t) //@ requires list(s, ?vs) &*& pointer(t, _); /*@ ensures list(s, ?rvs) &*& pointer(t, ?rt) &*& switch (build_rec1(d, vs)) { case fail: return result == false; case success(rvt, rvs0): return result == true &*& rvs == rvs0 &*& tree(rt, rvt); }; @*/ // decreases max_func(0, fold_left(0, max_func, vs) - d); // Not yet checked by VeriFast. { //@ build_rec1_eq(d, vs); struct tree *l; struct tree *r; if (list_is_empty(s)) return false; int h = list_head(s); if (h < d) return false; if (h == d) { list_pop(s); struct tree *leaf = create_leaf(); *t = leaf; return true; } if (!build_rec(d+1, s, &l)) return false; if (!build_rec(d+1, s, &r)) { tree_dispose(l); return false; } struct tree *node = create_node(l, r); *t = node; return true; }
bool build(struct list *s, struct tree **t) //@ requires list(s, ?vs) &*& pointer(t, _); /*@ ensures list(s, ?rvs) &*& pointer(t, ?rt) &*& switch (build0(vs)) { case build_fail: return result == false; case build_success(rvt): return result == true &*& tree(rt, rvt) &*& rvs == nil; }; @*/ { if (!build_rec(0, s, t)) return false; if (!list_is_empty(s)) { tree_dispose(*t); return false; } return true; }
static simpaig * build (void) { simpaig *aig, *res, *shifted, *tmp, *lhs, *rhs, *out; aiger_symbol *symbol; unsigned i, j; lois = malloc ((model->maxvar + 1) * sizeof lois[0]); for (i = 0; i <= model->maxvar; i++) { lois[i].idx = i; lois[i].aig = 0; } for (i = 0; i <= model->maxvar; i++) { aig = build_rec (i * 2); assert (aig == lois[i].aig); } for (i = 0; i <= model->maxvar; i++) symbol = aiger_is_latch (model, 2 * i); for (i = 0; i < model->num_latches; i++) { lhs = build_rec (model->latches[i].lit); rhs = simpaig_false (mgr); simpaig_assign (mgr, lhs, rhs); simpaig_dec (mgr, rhs); } for (i = 1; i <= k; i++) { for (j = 0; j < model->num_latches; j++) { tmp = build_rec (model->latches[j].lit); lhs = simpaig_shift (mgr, tmp, i); tmp = build_rec (model->latches[j].next); rhs = simpaig_shift (mgr, tmp, i - 1); simpaig_assign (mgr, lhs, rhs); simpaig_dec (mgr, rhs); simpaig_dec (mgr, lhs); } } out = build_rec (model->outputs[0].lit); res = simpaig_false (mgr); for (i = 0; i <= k; i++) { shifted = simpaig_shift (mgr, out, i); tmp = simpaig_or (mgr, res, shifted); simpaig_dec (mgr, shifted); simpaig_dec (mgr, res); res = tmp; } tmp = simpaig_substitute (mgr, res); simpaig_dec (mgr, res); res = tmp; return res; }