예제 #1
0
/**
 * Draw the enlarged schema. This methods can only
 * be called after the block have been placed
 */
void decorateSchema::collectTraits(collector& c)
{
    assert(placed());

    fSchema->collectTraits(c);

    // draw enlarge input wires
    for (unsigned int i=0; i<inputs(); i++) {
        point p = inputPoint(i);
        point q = fSchema->inputPoint(i);
        c.addTrait(trait(p,q));     // in->out direction
    }

    // draw enlarge output wires
    for (unsigned int i=0; i<outputs(); i++) {
        point p = fSchema->outputPoint(i);
        point q = outputPoint(i);
        c.addTrait(trait(p,q));     // in->out direction
    }
}
int main()
{
  boat b;
  b.go();

  random_device rd;
  minstd_rand R(rd());
  uniform_int_distribution<int> U(0,1);

#if 0
  for(int idx = 0; idx < max_passenger_count; ++idx)
  {
    int passenger_type_coin = U(R);
    programmer_type type = passenger_type_coin < 1 ? go_programmer : pthread_programmer;

    programmer *p = new programmer(idx, type, &b);
    p->go();

    this_thread::sleep_for(milliseconds(5));
  }
#endif

  for(int idx = 0; idx < THREAD_COUNT; ++idx)
  {
    programmer *p = new programmer(idx, go_programmer, &b);
    p->go();
  }

  metrics.wait_for_end();

  cout << "over" << endl;
  high_resolution_clock::duration avg_time(0);
  high_resolution_clock::duration max_time(0);
  uint64_t time_std = 0;

  size_t boarded_count = 0;

  for (int i = 0; i < max_passenger_count; ++i)
  {
    passenger_data &p = metrics.passengers[i];
    cout << "Passenger " << i << ":";
    if (p.boarded)
    {
      ++boarded_count;
      auto time = p.end_time - p.start_time;
      avg_time += time;
      if (time > max_time)
        max_time = time;

      duration<double, micro> print_time = time;
      cout << " Time = " << print_time.count();
    }
    else
    {
      cout << " not boarded";
    }
    cout << endl;
  }

  avg_time /= boarded_count;

  for (int i = 0; i < max_passenger_count; ++i)
  {
    passenger_data &p = metrics.passengers[i];
    if (p.boarded)
    {
      auto time = p.end_time - p.start_time;
      int64_t t = time.count();
      int64_t avg = avg_time.count();
      int64_t d = t - avg;
      time_std += d * d;
    }
  }

  time_std /= boarded_count;
  time_std = std::sqrt(time_std);

  high_resolution_clock::duration total_time =
      metrics.passengers[max_passenger_count-1].end_time -
      metrics.passengers[0].end_time;

  cout << "Total time = " << duration<double, milli>(total_time).count() << " ms " << endl;
  cout << "Average time = " << duration<double, micro>(avg_time).count() << " us "<< endl;
  cout << "Max time = " << duration<double, micro>(max_time).count() << " us " << endl;
  cout << "Time STD = " << duration<double, micro>( high_resolution_clock::duration(time_std) ).count() << " us " << endl;
}
void boat::work()
{
  queue<programmer*> m_go_queue;
  queue<programmer*> m_pthread_queue;

  vector<programmer*> boatload;
  boatload.reserve(4);


  while(true)
  {
    {
      programmer *p = await(m_arrived_programmer);
      if (p->type() == go_programmer)
        m_go_queue.push(p);
      else
        m_pthread_queue.push(p);
      //PRINT("Boat: programmer arrived: " << p->index() << "/" << p->type());
    }

    if (m_go_queue.size() >= 2 && m_pthread_queue.size() >= 2)
    {
      boatload.push_back(m_go_queue.front()); m_go_queue.pop();
      boatload.push_back(m_go_queue.front()); m_go_queue.pop();
      boatload.push_back(m_pthread_queue.front()); m_pthread_queue.pop();
      boatload.push_back(m_pthread_queue.front()); m_pthread_queue.pop();
    }
    else if (m_go_queue.size() >= 4)
    {
      for(int i = 0; i < 4; ++i)
      {
        boatload.push_back(m_go_queue.front()); m_go_queue.pop();
      }
    }
    else if (m_pthread_queue.size() >= 4)
    {
      for(int i = 0; i < 4; ++i)
      {
        boatload.push_back(m_pthread_queue.front()); m_pthread_queue.pop();
      }
    }
    else
    {
      continue;
    }

    for (int i = 0; i < boatload.size(); ++i)
    {
      programmer *p = boatload[i];
      //PRINT("Boat: assigning role to: " << p->index() << "/" << p->type());
      p->assign_role(i == boatload.size() - 1 ? captain : passenger);
    }

    for (int i = 0; i < boatload.size(); ++i)
      await(m_boarding_programmer);

    boatload.clear();

    int boat_count = ++metrics.boat_count;
    if (boat_count == max_boat_count)
      metrics.notify_end();
  }

}
예제 #4
0
void seqSchema::collectInternalWires(collector& c)
{
    assert (fSchema1->outputs() == fSchema2->inputs());

    const int 	N 	= fSchema1->outputs();
    double 		dx 	= 0;
    double		mx 	= 0;
    int			dir	=-1;

    if (orientation() == kLeftRight) {
        // draw left right cables
        for (int i=0; i<N; i++) {
            point src = fSchema1->outputPoint(i);
            point dst = fSchema2->inputPoint(i);

            int d = direction(src,dst);
            if (d != dir) {
                // compute attributes of new direction
                switch (d) {
                    case kUpDir 	: mx = 0; dx = dWire; break;
                    case kDownDir	: mx = fHorzGap; dx = -dWire; break;
                    default			: mx = 0; dx = 0; break;
                }
                dir = d;
            } else {
                // move in same direction
                mx = mx +dx;
            }
            if (src.y == dst.y) {
                // draw straight cable
                c.addTrait(trait(point(src.x, src.y), point(dst.x, dst.y)));
            } else {
                // draw zizag cable
                c.addTrait(trait(point(src.x, src.y), point(src.x+mx, src.y)));
                c.addTrait(trait(point(src.x+mx, src.y), point(src.x+mx, dst.y)));
                c.addTrait(trait(point(src.x+mx, dst.y), point(dst.x, dst.y)));
            }

        }
    } else {
        // draw right left cables
        for (int i=0; i<N; i++) {
            point src = fSchema1->outputPoint(i);
            point dst = fSchema2->inputPoint(i);

            int d = direction(src,dst);
            if (d != dir) {
                // compute attributes of new direction
                switch (d) {
                    case kUpDir 	: mx = -fHorzGap; dx = dWire; break;
                    case kDownDir	: mx = 0; dx = -dWire; break;
                    default			: mx = 0; dx = 0; break;
                }
                dir = d;
            } else {
                // move in same direction
                mx = mx +dx;
            }
            if (src.y == dst.y) {
                // draw straight cable
                c.addTrait(trait(point(src.x, src.y), point(dst.x, dst.y)));
            } else {
                // draw zizag cable
                c.addTrait(trait(point(src.x, src.y), point(src.x+mx, src.y)));
                c.addTrait(trait(point(src.x+mx, src.y), point(src.x+mx, dst.y)));
                c.addTrait(trait(point(src.x+mx, dst.y), point(dst.x, dst.y)));
            }

        }
    }
}