/** * 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(); } }
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))); } } } }