Ejemplo n.º 1
0
static
void
goalsand(T_PTR_tree entry) {
	T_PTR_tbsymbol_info infoid, infonb_left, infonb_right;
	char *info;

	if (entry) {
		if (tree_nbrsubtrees(entry)){
			info = (char *) tree_getinfo(entry);
			infoid = tbsymbol_getinfo(tree_getinfo(tree_subtree(entry, 0)));
			infonb_left = tbsymbol_getinfo(tree_getinfo(tree_subtree(entry, 1)));
			if (strcmp(info,"=") == 0){
				ist_assign_values_to_interval(tokensgoals[nbrgoalscmd * nbr_var + infoid->info.id.addr],
						(integer32) infonb_left->info.nb.value, (integer32) infonb_left->info.nb.value);
			} else if (strcmp(info,">=") == 0){
				ist_assign_values_to_interval(tokensgoals[nbrgoalscmd * nbr_var + infoid->info.id.addr],
						(integer32) infonb_left->info.nb.value,INFINITY);
			} else if (strcmp(info,"in") == 0){
				infonb_right = tbsymbol_getinfo(tree_getinfo(tree_subtree(entry, 2)));
				ist_assign_values_to_interval(tokensgoals[nbrgoalscmd * nbr_var + infoid->info.id.addr],
						(integer32) infonb_left->info.nb.value,(integer32) infonb_right->info.nb.value);
			}
		}
	}
}
Ejemplo n.º 2
0
static
void
guard(T_PTR_tree entry) {
	T_PTR_tbsymbol_info infoid, infonb_left, infonb_right;
	char *info;

	if (entry) {
		/* If entry = TRUE, we haven't any subtrees and nothing to do OK */
		if (tree_nbrsubtrees(entry)){
			info = (char *) tree_getinfo(entry);
			infoid = tbsymbol_getinfo(tree_getinfo(tree_subtree(entry, 0)));
			infonb_left = tbsymbol_getinfo(tree_getinfo(tree_subtree(entry, 1)));
			if (strcmp(info,"=") == 0){
				ist_assign_values_to_interval(
						&sys->transition[nbrcmd].cmd_for_place[infoid->info.id.addr].guard,
						(integer32) infonb_left->info.nb.value, (integer32) infonb_left->info.nb.value);
			} else if (strcmp(info,">=") == 0){
				ist_assign_values_to_interval(
						&sys->transition[nbrcmd].cmd_for_place[infoid->info.id.addr].guard,
						(integer32) infonb_left->info.nb.value,INFINITY);
			} else if (strcmp(info,"in") == 0){
				infonb_right = tbsymbol_getinfo(tree_getinfo(tree_subtree(entry, 2)));
				ist_assign_values_to_interval(
						&sys->transition[nbrcmd].cmd_for_place[infoid->info.id.addr].guard,
						(integer32) infonb_left->info.nb.value,(integer32) infonb_right->info.nb.value);
			}
		}
	}
}
Ejemplo n.º 3
0
static
boolean
callback_tree_before(T_PTR_tree entry) {
  char* info;

  info = (char*) tree_getinfo(entry);
  if (strcmp(info,"rules") == 0) {
  	PRINTF("Entering rules section\n");
    tree_brk_branch(entry);
    /* nbr_rules will be filled at this point */
    rulescode_produce(entry, _system);
  } else if (strcmp(info,"init") == 0) {
  	PRINTF("Entering init section\n");
    tree_brk_branch(entry);
    /* system is a OUT parameter */
    initcode_produce(tree_subtree(entry,0), _init);
  } else if (strcmp(info,"target") == 0) {
  	PRINTF("Entering target section\n");
    tree_brk_branch(entry);
    /* system is a OUT parameter */
    goalscode_produce(tree_subtree(entry,0), _unsafe);
  } else if (strcmp(info,"invariants") == 0) {
  	PRINTF("Entering invariants section\n");
    tree_brk_branch(entry);
    /* system and init are IN/OUT parameters */
    invariantscode_produce(tree_subtree(entry,0), _system, _init);
  }

  return true;
}
Ejemplo n.º 4
0
static
void
cmd(T_PTR_tree entry) {
  T_PTR_tbsymbol_info infoid;
  T_PTR_tree rhs;

  if (entry) {
    infoid = tbsymbol_getinfo(tree_getinfo(tree_subtree(entry, 0))); 
    rhs = tree_subtree(entry, 1);
	/* We assume that cmd is not a transfer */
	istransfer = false;
	/* We assume the user does not know how to write specification */
	messy_spec = true;
	/* For instance X' = c s.t. c > 0 is a messy_spec
	 * we must check for it. If we meet a var in RHS or RHS = 0
	 * then messy_spec = false. 
	 */
    cmdrhs(rhs, infoid);
	if (messy_spec == true)
		err_quit("\nCannot assign non null value to a variable in transition %2d\n",(nbrcmd+1));
	if (istransfer == true) {
		/* We are ready for a new transfer, pay attention to the ++ */
		sys->transition[nbrcmd].transfers[nbrtransfers].target =
			infoid->info.id.addr;
		sys->transition[nbrcmd].nbr_transfers = ++nbrtransfers;
		istransfer = false;

	}

  }
}
Ejemplo n.º 5
0
static
void
cmdrhs(T_PTR_tree entry, T_PTR_tbsymbol_info infoid) {
  T_PTR_tree lhs, rhs;
  T_PTR_tbsymbol_info entry_info;
  char* entry_info_char;

  if (entry) {
	  if (tree_nbrsubtrees(entry)) {

		  entry_info_char = (char*) tree_getinfo(entry);

		  lhs = tree_subtree(entry, 0);
		  rhs = tree_subtree(entry, 1);

		  if (strcmp(entry_info_char,"+") == 0) {
			  cmdrhs(lhs, infoid);
			  cmdrhs(rhs, infoid);
		  } else if (strcmp(entry_info_char,"-") == 0) {
			  cmdrhs(lhs, infoid);
			  cmdrhs(rhs, infoid);
			  /* By Grammar's definition, to the right we have a natural number 
			  */
			  sys->transition[nbrcmd].cmd_for_place[infoid->info.id.addr].delta
				  = -
				  sys->transition[nbrcmd].cmd_for_place[infoid->info.id.addr].delta;
		  } 
	  } else { /* Leaf */
		  entry_info = (T_PTR_tbsymbol_info)
			  tbsymbol_getinfo(tree_getinfo(entry));

		  if (entry_info->tag == tbsymbol_INFO_ID) {
			  /* At least one variable occurs in the cmd RHS */
			  messy_spec = false;
			  if (entry_info != infoid) {
				  /* It is a transfer */
				  istransfer = true;
				  if (nbrtransfers >= MAXNBTRANS) {
					  err_quit("Too many transfers for a single transition, increase the\
							  MAXNBTRANS constant.\n");
				  }
				  sys->transition[nbrcmd].transfers[nbrtransfers].origin[entry_info->info.id.addr] = 1;
			  }
		  } else if (entry_info->tag == tbsymbol_INFO_NB) {
Ejemplo n.º 6
0
static
void
rule(T_PTR_tree entry) {
  char* info;

  if (entry) {
    info = (char*) tree_getinfo(entry);
    if (strcmp(info,"guardedcmd") == 0) {
      guardedcmd(tree_subtree(entry,0));
      guardedcmd(tree_subtree(entry,1));
    }
  }
}
Ejemplo n.º 7
0
static
void 
guardedcmd(T_PTR_tree entry) {
	size_t i;
	char* info;
	if (entry) {
		info = (char*) tree_getinfo(entry);
		if (strcmp(info,"guard") == 0) {
			for (i = 0 ; i < tree_nbrsubtrees(entry) ; i++)
				guard(tree_subtree(entry, i));
		} else if (strcmp(info,"statement") == 0) {
			/* It's a new transition, possibly with transfers */
			nbrtransfers = 0;
			for (i = 0 ; i < tree_nbrsubtrees(entry) ; i++)
				cmd(tree_subtree(entry, i));
		}
	}
}
Ejemplo n.º 8
0
static
void
init(T_PTR_tree entry, ISTSharingTree *initial) {
  size_t i;
  char* info;

  if (entry) {
    info = (char*) tree_getinfo(entry);
    if (strcmp(info,"and") == 0) {
      nbrinitcmd = 0;

      tokensinit = (ISTInterval **)xmalloc(nbr_var*sizeof(ISTInterval *));
      for (i = 0 ; i < nbr_var; i++)
		  tokensinit[i] = ist_build_interval(0,INFINITY);

      initor(entry);
      nbrinitcmd = 1;
	  ist_add(initial,tokensinit, nbr_var);
    }
  }
}
Ejemplo n.º 9
0
static
void
goals(T_PTR_tree entry, ISTSharingTree *unsafe) {
	size_t i;
	char* info;

	if (entry) {
		info = (char*) tree_getinfo(entry);
		if (strcmp(info,"or") == 0) {
			tokensgoals = (ISTInterval**)xmalloc(nbr_var*tree_nbrsubtrees(entry)*sizeof(ISTInterval *));
			for (i = 0 ; i < nbr_var * tree_nbrsubtrees(entry) ; i++)
				tokensgoals[i] = ist_build_interval(0,INFINITY);

			for (nbrgoalscmd = 0 ; nbrgoalscmd < tree_nbrsubtrees(entry) ; nbrgoalscmd++)
				goalsor(tree_subtree(entry,nbrgoalscmd));

		} else if (strcmp(info,"and") == 0) {
			nbrgoalscmd = 0;

			tokensgoals = (ISTInterval **)xmalloc(nbr_var * sizeof(ISTInterval *));
			for (i = 0 ; i < nbr_var; i++)
				tokensgoals[i] = ist_build_interval(0,INFINITY);

			goalsor(entry);

			nbrgoalscmd = 1;
		}
		for (i = 0; i < nbrgoalscmd; ++i) {
			if (ist_add(unsafe, &tokensgoals[i * nbr_var], nbr_var) == false)
				err_msg("codegengoals.c: redundant unsafe cones\n");
		}
		for (i=0;i<nbr_var*nbrgoalscmd;++i)
			xfree(tokensgoals[i]);
		xfree(tokensgoals);
	}
}