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