struct frame_info * block_innermost_frame (const struct block *block) { struct frame_info *frame; CORE_ADDR start; CORE_ADDR end; if (block == NULL) return NULL; start = BLOCK_START (block); end = BLOCK_END (block); frame = get_selected_frame_if_set (); if (frame == NULL) frame = get_current_frame (); while (frame != NULL) { struct block *frame_block = get_frame_block (frame, NULL); if (frame_block != NULL && contained_in (frame_block, block)) return frame; frame = get_prev_frame (frame); } return NULL; }
static void build_domain_forest(PP_data *pp_data, Linkage sublinkage) { size_t d, d1, link; DTreeLeaf * dtl; if (pp_data->N_domains > 0) { pp_data->domain_array[pp_data->N_domains-1].parent = NULL; for (d=0; d < pp_data->N_domains-1; d++) { for (d1 = d+1; d1 < pp_data->N_domains; d1++) { if (contained_in(&pp_data->domain_array[d], &pp_data->domain_array[d1], sublinkage)) { pp_data->domain_array[d].parent = &pp_data->domain_array[d1]; break; } } if (d1 == pp_data->N_domains) { /* we know this domain is a root of a new tree */ pp_data->domain_array[d].parent = NULL; } } } /* The parent links of domain nodes have been established. * Now do the leaves. */ for (d = 0; d < pp_data->N_domains; d++) { pp_data->domain_array[d].child = NULL; } for (link=0; link < sublinkage->num_links; link++) { assert (sublinkage->link_array[link].lw != SIZE_MAX); for (d=0; d<pp_data->N_domains; d++) { if (link_in_domain(link, &pp_data->domain_array[d])) { dtl = (DTreeLeaf *) malloc(sizeof(DTreeLeaf)); dtl->link = link; dtl->parent = &pp_data->domain_array[d]; dtl->next = pp_data->domain_array[d].child; pp_data->domain_array[d].child = dtl; break; } } } }
static void build_domain_forest(Postprocessor *pp, Sublinkage *sublinkage) { int d, d1, link; DTreeLeaf * dtl; if (pp->pp_data.N_domains > 0) pp->pp_data.domain_array[pp->pp_data.N_domains-1].parent = NULL; for (d=0; d < pp->pp_data.N_domains-1; d++) { for (d1 = d+1; d1 < pp->pp_data.N_domains; d1++) { if (contained_in(&pp->pp_data.domain_array[d],&pp->pp_data.domain_array[d1],sublinkage)) { pp->pp_data.domain_array[d].parent = &pp->pp_data.domain_array[d1]; break; } } if (d1 == pp->pp_data.N_domains) { /* we know this domain is a root of a new tree */ pp->pp_data.domain_array[d].parent = NULL; /* It's now ok for this to happen. It used to do: printf("I can't find a parent domain for this domain\n"); print_domain(d); exit(1); */ } } /* the parent links of domain nodes have been established. now do the leaves */ for (d=0; d < pp->pp_data.N_domains; d++) { pp->pp_data.domain_array[d].child = NULL; } for (link=0; link < sublinkage->num_links; link++) { if (sublinkage->link[link]->l == -1) continue; /* probably not necessary */ for (d=0; d<pp->pp_data.N_domains; d++) { if (link_in_domain(link, &pp->pp_data.domain_array[d])) { dtl = (DTreeLeaf *) xalloc(sizeof(DTreeLeaf)); dtl->link = link; dtl->parent = &pp->pp_data.domain_array[d]; dtl->next = pp->pp_data.domain_array[d].child; pp->pp_data.domain_array[d].child = dtl; break; } } } }
struct frame_info * block_innermost_frame (const struct block *block) { struct frame_info *frame; if (block == NULL) return NULL; frame = get_selected_frame_if_set (); if (frame == NULL) frame = get_current_frame (); while (frame != NULL) { const struct block *frame_block = get_frame_block (frame, NULL); if (frame_block != NULL && contained_in (frame_block, block)) return frame; frame = get_prev_frame (frame); } return NULL; }
void Model::forward_a_step() { int K = 0; for( auto itm = passing_map.rbegin(); itm != passing_map.rend(); itm ++) { auto ing = itm->second; for (auto il = ing->begin(); il != ing->end(); il++) { if ( ! (*il)->valid) continue; // Location *l = com->get_a_location((*il)->label); if ( K % 500 == 0) cout << " K = " << K << ", " << l->name << endl; K ++; for ( vector <EDGE>::const_iterator it = l->outgoing.begin(); it != l->outgoing.end(); it++) { if ( ! (*il)->valid) break; Location *tmp = com->get_a_location(it->dest); if( ci) { if ( (l->signature & (unsigned)pow(2,N-1)) == 0 && (tmp->signature & (unsigned)pow(2, N-1)) != 0) { if ( constrain_release1(l)) { continue; } if ( count(l->signature, N) != cpus) continue; if ( constrain_release2(*il)) { continue; } } else if ( (l->signature & (unsigned)pow(2,N-1)) != 0 && (tmp->signature & (unsigned)pow(2,N-1))==0 && !tmp->is_bad) continue; } if (bp) { // now, let's consider the busy period while tk is waiting if ( (l->signature & (unsigned)pow(2,N-1)) != 0 && count(tmp->signature,N) > count(l->signature,N) && count(l->signature,N)>cpus) { int ti = 0; for (int h = 1; h < N; h++) if ( (l->signature & (unsigned)pow(2,h-1)) == 0 && (tmp->signature & (unsigned)pow(2, h-1)) != 0) { ti = h; break; } //cout << "before judgement " << (*il)->label << "-" << tmp->name << endl; if ( forward_release(*il, ti)) { //cout << (*il)->label << "-" << tmp->name << endl; continue; } } } NNC_Polyhedron poly = (*il)->cvx; guard_cvx(*it, poly); if( poly.is_empty()) continue; update_cvx(*it, poly); invar_cvx(tmp, poly); if( poly.is_empty()) continue; poly.time_elapse_assign(tmp->time_elapse); invar_cvx(tmp, poly); if( poly.is_empty()) continue; if( type==FAST_REACH && tmp->is_bad) { pair_sc sc(it->dest,poly, known_param_list, tmp->signature); //sc.pre = passing[k].state; //next.push_back(sc); cout << "The target is reached. Fast saving ...\n"; //fast_save(); throw 0; } auto sc = make_shared<pair_sc>(it->dest, poly, known_param_list, tmp->signature); if ( (l->signature & (unsigned)pow(2,N-1)) == 0 && (tmp->signature & (unsigned)pow(2, N-1)) != 0) sc->tk_new = true; if (contained_in(passing_map, sc, op, true)) continue; if (contained_in(next_map, sc, true, false)) continue; if (contained_in(passed_map, sc, op, false)) continue; (*il)->add_a_child(sc); insert_into(next_map, sc); sc->prior = (*il); } } } }
Location *com_2_locs(const Location *l1, const Location *l2, const Automaton *aton1, const Automaton *aton2) { string ln = l1->name + l2->name; Location *l = new Location(); l->name = ln; l->is_bad = ( l1->is_bad || l2->is_bad); if (l->is_bad) return l; for ( vector<EXPR>::const_iterator it = l1->invar.begin(); it != l1->invar.end(); ++it) l->invar.push_back(*it); for ( vector<pair_ss>::const_iterator it = l1->rate.assign_atoms.begin(); it != l1->rate.assign_atoms.end(); ++it) l->rate.assign_atoms.push_back(*it); for ( vector<EXPR>::const_iterator it = l2->invar.begin(); it != l2->invar.end(); ++it) l->invar.push_back(*it); for ( vector<pair_ss>::const_iterator it = l2->rate.assign_atoms.begin(); it != l2->rate.assign_atoms.end(); ++it) l->rate.assign_atoms.push_back(*it); for ( vector<EDGE>::const_iterator it = l1->outgoing.begin(); it != l1->outgoing.end(); it++) { EDGE e1 = *it; string slab1 = e1.sync; string next1 = e1.dest; if ( !contained_in(slab1, aton2->synclabs)) { EDGE e = e1; e.dest = next1 + l2->name; l->outgoing.push_back(e); } if ( contained_in(slab1, aton2->synclabs)) { for ( vector<EDGE>::const_iterator it2 = l2->outgoing.begin(); it2 != l2->outgoing.end(); it2++) { EDGE e; EDGE e2 = *it2; string slab2 = e2.sync; string next2 = e2.dest; if( slab1 == slab2) { for ( vector<EXPR>::const_iterator iit = e1.guard.begin(); iit != e1.guard.end(); ++iit) e.guard.push_back(*iit); //for( vector<pair_ss>::const_iterator iit = e1.ass.assign_atoms.begin(); // iit != e1.ass.assign_atoms.end(); ++iit) // e.ass.assign_atoms.push_back(*iit); for ( vector<UPDATE>::const_iterator iit = e1.updates.begin(); iit != e1.updates.end(); ++iit) e.updates.push_back(*iit); for ( vector<EXPR>::const_iterator iit = e2.guard.begin(); iit != e2.guard.end(); ++iit) e.guard.push_back(*iit); //for ( vector<pair_ss>::const_iterator iit = e2.ass.assign_atoms.begin(); // iit != e2.ass.assign_atoms.end(); ++iit) // e.ass.assign_atoms.push_back(*iit); for ( vector<UPDATE>::const_iterator iit = e2.updates.begin(); iit != e2.updates.end(); ++iit) e.updates.push_back(*iit); e.sync = slab1; e.dest = next1 + next2; l->outgoing.push_back(e); } } } } for ( vector<EDGE>::const_iterator it = l2->outgoing.begin(); it != l2->outgoing.end(); it++) { EDGE e2 = *it; string slab2 = e2.sync; string next2 = e2.dest; if ( !contained_in(slab2, aton1->synclabs)) { EDGE e = e2; e.dest = l1->name + next2; l->outgoing.push_back(e); } } return l; }