コード例 #1
0
ファイル: aigbmc.c プロジェクト: jldodds/ELE580-PS2
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;
}
コード例 #2
0
ファイル: tree_colors_reachability.cpp プロジェクト: qbolec/c
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);
  }
}
コード例 #3
0
ファイル: tree_colors_reachability.cpp プロジェクト: qbolec/c
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);
}
コード例 #4
0
ファイル: treerec.c プロジェクト: amintimany/verifast
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;
}
コード例 #5
0
ファイル: treerec.c プロジェクト: amintimany/verifast
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;
}
コード例 #6
0
ファイル: aigbmc.c プロジェクト: jldodds/ELE580-PS2
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;
}