Beispiel #1
0
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;
}
Beispiel #2
0
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;
			}
		}
	}
}
Beispiel #3
0
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;
      }
    }
  }
}
Beispiel #4
0
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;
}
Beispiel #5
0
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);
        }
    }
  }
}
Beispiel #6
0
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;
}