Пример #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);
			}
		}
	}
}
Пример #2
0
static
void
rules(T_PTR_tree entry) {
  size_t i, j, k, nbr_rules;

  if (entry) {
	/* We allocate memory for the transitions */
	nbr_rules = tree_nbrsubtrees(entry);
	sys->limits.nbr_rules = nbr_rules;
	sys->transition = (transition_t *)xmalloc(nbr_rules*sizeof(transition_t));
	for (i = 0; i < nbr_rules; i++) {
		/* We allocate memory for each gd_cmd of each transition */
		sys->transition[i].cmd_for_place = (gd_command_t *)xmalloc(nbr_var*sizeof(gd_command_t));
		/* Default, guard = 0,\infty and delta = 0 */
		for (j = 0; j < nbr_var; j++) {
			ist_assign_values_to_interval(&sys->transition[i].cmd_for_place[j].guard, 0L,  INFINITY);
			sys->transition[i].cmd_for_place[j].delta = 0L;
			/* In the case of places merged the genuine system is the abstraction of itself */
			sys->transition[i].cmd_for_place[j].places_abstracted=1;
		}
		for (k = 0; k < MAXNBTRANS; ++k){
			/* We allocate memory for each transfert */
			sys->transition[i].transfers[k].origin = (integer16 *)xmalloc(nbr_var*sizeof(integer16));
			/* We initialize the origin vector */
			for (j = 0; j < nbr_var; j++) 
				sys->transition[i].transfers[k].origin[j] = 0;
		}
	}
	for (nbrcmd = 0 ; nbrcmd < nbr_rules ; nbrcmd++) {
		rule(tree_subtree(entry,nbrcmd));
	}
  }
}
Пример #3
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);
			}
		}
	}
}
Пример #4
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));
		}
	}
}
Пример #5
0
static
void
goalsor(T_PTR_tree entry) {
  size_t i;

  if (entry) {
    for (i = 0 ; i < tree_nbrsubtrees(entry) ; i++)
      goalsand(tree_subtree(entry,i));
  }
}
Пример #6
0
static
void
initor(T_PTR_tree entry) {
  size_t i;

  if (entry) {
    for (i = 0 ; i < tree_nbrsubtrees(entry) ; i++)
      initand(tree_subtree(entry,i));
  }
}
Пример #7
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);
	}
}
Пример #8
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) {