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); } } } }
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)); } } }
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); } } } }
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)); } } }
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)); } }
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)); } }
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); } }
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) {