void Pathfinder::showResult(){ int finalCost=0,wlCost=0,pins=0; rt_dir UP=RT_UP; for(map<int,t_nets>::iterator nets_it=netlist.begin(); nets_it!=netlist.end();++nets_it){ for(list<int>::iterator nodes_it=nets_it->second.netTree.begin(); nodes_it!=nets_it->second.netTree.end();++nodes_it){ if(areConnected(*nodes_it, RT_EAST)){ ++wlCost; finalCost+=costs[getPosZ(*nodes_it)*3]; //cout << *nodes_it << " -> " << (*nodes_it)+1 << endl; } if(areConnected(*nodes_it, RT_NORTH)){ ++wlCost; finalCost+=costs[getPosZ(*nodes_it)*3+1]; //cout << *nodes_it << " -> " << (*nodes_it)+sizeX << endl; } if(areConnected(*nodes_it, RT_UP)){ if(areConnected(getDir(*nodes_it, UP), RT_UP)) ++pins; else pins+=2; ++wlCost; finalCost+=costs[getPosZ(*nodes_it)*3+2]; //cout << *nodes_it << " -> " << (*nodes_it)+sizeXY << endl; } // cout << "(" << getPosX(*nodes_it) << " " <<getPosY(*nodes_it)<< " " <<getPosZ(*nodes_it)<< ") --("<< graph[*nodes_it].net << " " << nets_it->second.finalNet <<")--> (" << graph[*nodes_it].rightIter << " " <<graph[*nodes_it].upIter<< " " <<graph[*nodes_it].upLayerIter << ") " << endl; } } cout << "-> Cost =" << finalCost << endl; cout << "-> Wirelength =" << wlCost << endl; cout << "-> # Pins =" << pins << endl; }
bool Pathfinder::areConnected(int node1, rt_dir dir){ switch(dir){ case RT_WEST: return getPosX(node1)>0 && getNet(node1-1)==getNet(node1) && getNet(node1) && getNet(node1)!=blockageNet; case RT_SOUTH: return getPosY(node1)>0 && getNet(node1-sizeX)==getNet(node1) && getNet(node1) && getNet(node1)!=blockageNet; case RT_DOWN: return getPosZ(node1)>0 && getNet(node1-sizeXY)==getNet(node1) && getNet(node1) && getNet(node1)!=blockageNet; case RT_EAST: return getPosX(node1)+1<sizeX && getNet(node1+1)==getNet(node1) && getNet(node1) && getNet(node1)!=blockageNet; case RT_NORTH: return getPosY(node1)+1<sizeY && getNet(node1+sizeX)==getNet(node1) && getNet(node1) && getNet(node1)!=blockageNet; case RT_UP: return getPosZ(node1)+1<sizeZ && getNet(node1+sizeXY)==getNet(node1) && getNet(node1) && getNet(node1)!=blockageNet; } return false; }
void particle3D::draw() { int vecSize; double x, y, z; glColor3f(1.0,1.0, 1.0); //궤적 배열에 현재 공 위치 추가 x = getPosX(); y = getPosY(); z = getPosZ(); trace.push_back(Vec3(x, y, z)); int traceNum = 30; vecSize = trace.size(); //궤적 for (int i = vecSize- traceNum > 0 ? vecSize - traceNum : 0 ; i < vecSize-1; i++) { glLineWidth(2.0); glBegin(GL_LINES); glVertex3f(trace[i].x,trace[i].y,trace[i].z); glVertex3f(trace[i+1].x, trace[i+1].y, trace[i+1].z); glEnd(); } //x,y,z에 골프공 렌더링 glPushMatrix(); glTranslatef(x,y,z); glutSolidSphere(radius,100,100); glPopMatrix(); }
void Explosion::clearExplosion(GameMap &map, int pow) { int xpos = getPosX(); int zpos = getPosZ(); int i; // right if (map.getCoordType(zpos, xpos) == 7) map.setTypeAtPos(xpos, zpos, 0); for (i = 1; i < pow; ++i) if (map.getCoordType(zpos, xpos + i) == 7) map.setTypeAtPos(xpos + i, zpos, 0); // left for (i = -1; i > -pow; --i) { if (map.getCoordType(zpos, xpos + i) == 7) map.setTypeAtPos(xpos + i, zpos, 0); } // up for (i = 1; i < pow; ++i) { if (map.getCoordType(zpos + i, xpos) == 7) map.setTypeAtPos(xpos, zpos + i, 0); } // down for (i = -1; i > -pow; --i) { if (map.getCoordType(zpos + i, xpos) == 7) map.setTypeAtPos(xpos, zpos + i, 0); } }
void Explosion::impact(GameMap &map, int pow) { int xpos = getPosX(); int zpos = getPosZ(); int i; // right map.setTypeAtPos(xpos, zpos, 7); for (i = 1; i < pow; ++i) { if (map.getCoordType(zpos, xpos + i) == 1) break; else if (map.getCoordType(zpos, xpos + i) == 4) { map.setRandomBonusAtPos(xpos + i, zpos); break; } map.setTypeAtPos(xpos +i, zpos, 7); } // up for (i = -1; i > -pow; --i) { if (map.getCoordType(zpos, xpos + i) == 1) break; else if (map.getCoordType(zpos, xpos + i) == 4) { map.setRandomBonusAtPos(xpos + i, zpos); break; } map.setTypeAtPos(xpos + i, zpos, 7); } // up for (i = 1; i < pow; ++i) { if (map.getCoordType(zpos + i, xpos) == 1) break; else if (map.getCoordType(zpos + i, xpos) == 4) { map.setRandomBonusAtPos(xpos, zpos + i); break; } map.setTypeAtPos(xpos, zpos + i, 7); } // down for (i = -1; i > -pow; --i) { if (map.getCoordType(zpos + i, xpos) == 1) break; else if (map.getCoordType(zpos + i, xpos) == 4) { map.setRandomBonusAtPos(xpos, zpos + i); break; } map.setTypeAtPos(xpos, zpos + i, 7); } }
void Explosion::toRenew(GameMap &map, int pow) { int xpos = getPosX(); int zpos = getPosZ(); int i; // right if (map.getCoordType(zpos, xpos) == 7 || map.getCoordType(zpos, xpos) == 0) map.setTypeAtPos(xpos, zpos, 7); for (i = 1; i < pow; ++i) if (map.getCoordType(zpos, xpos + i) == 7 || map.getCoordType(zpos, xpos + i) == 0) map.setTypeAtPos(xpos + i, zpos, 7); else break; //left for (i = -1; i > -pow; --i) { if (map.getCoordType(zpos, xpos + i) == 7 || map.getCoordType(zpos, xpos + i) == 0) map.setTypeAtPos(xpos + i, zpos, 7); else break; } // up for (i = 1; i < pow; ++i) { if (map.getCoordType(zpos + i, xpos) == 7 || map.getCoordType(zpos + i, xpos) == 0) map.setTypeAtPos(xpos, zpos + i, 7); else break; } // down for (i = -1; i > -pow; --i) { if (map.getCoordType(zpos + i, xpos) == 7 || map.getCoordType(zpos + i, xpos) == 0) map.setTypeAtPos(xpos, zpos + i, 7); else break; } }
//Put the closest to center node in the vector front int Pathfinder::getCenter(vector<int>& Nodes){ int x=0,y=0,z=0; int centerNode,temp,closestPos; vector<int>::iterator target_it; for(target_it=Nodes.begin(); target_it!=Nodes.end(); ++target_it){ x+=getPosX(*target_it); y+=getPosY(*target_it); z+=getPosZ(*target_it); } centerNode=getPos(round(x/Nodes.size()),round(y/Nodes.size()), round(z/Nodes.size())); //cout << "CenterNode: " << centerNode << endl; closestPos=getClosestNodePos(centerNode,Nodes); temp=Nodes[0]; Nodes[0]=Nodes[closestPos]; Nodes[closestPos]=temp; return 0; }
inline int Pathfinder::calcCost(int node2, rt_dir dir){ int tmp = (actualAttempt ? graph[node2].history*(graph[node2].nrNets+1) : 0); switch (dir){ case RT_WEST: return costs[getPosZ(node2)*3] + tmp; break; case RT_SOUTH: return costs[getPosZ(node2)*3+1] + tmp; break; case RT_DOWN: return costs[(getPosZ(node2)+1)*3+2] + tmp; break; case RT_EAST: return costs[getPosZ(node2)*3] + tmp; break; case RT_NORTH: return costs[getPosZ(node2)*3+1] + tmp; break; case RT_UP: return costs[(getPosZ(node2)-1)*3+2] + tmp; break; } return 0; }
bool ObjectIndexIterator::findNextOccurrence(unsigned int value, unsigned char component) { if(component==1) { if(patY!=0) { unsigned int posZ=0, posY=0; while(x!=value) { posZ = getPosZ(posIndex); posY = adjZ.findListIndex(posZ); x = adjY.findListIndex(posY)+1; posIndex++; } z = adjZ.get(posZ); y = adjY.get(posY); } else { } } else if(component==2) { // Binary search the predicate within the object list. } return true; }
void ObjectIndexIterator::calculateRange() { minIndex=adjIndex.find(patZ-1); maxIndex=adjIndex.last(patZ-1); //maxIndex=adjIndex.findNext(minIndex)-1; if(patY!=0) { //cout << endl << endl << "binsearch " << patY << endl; while (minIndex <= maxIndex) { //cout << "binSearch range: " << minIndex << ", " << maxIndex << endl; long long mid = (minIndex + maxIndex) >> 1; unsigned int predicate=getY(mid); if (patY > predicate) { minIndex = mid + 1; } else if (patY < predicate) { maxIndex = mid - 1; } else { #if 0 cout << "Middle found at " << mid << " => " << predicate << " Y=" << getY(mid) << endl; cout << "At maxIndex: " << maxIndex << " => Y=" << getY(maxIndex) << endl; cout << "At minIndex: " << minIndex << " => Y=" << getY(minIndex) << endl; // Do Sequential search unsigned int left = mid; while(left>minIndex && predicate==patY) { left--; predicate = getY(left); cout << "Check left: " << minIndex << "/" << left << "=>" << predicate << " Z=" << adjZ.get(getPosZ(left))<< endl; } minIndex= predicate==patY ? left : left+1; unsigned int right = mid; predicate = patY; while(right<maxIndex && predicate==patY) { right++; predicate = getY(right); cout << "Check right: " << right << "/" << maxIndex << "=>" << predicate << " Z=" << adjZ.get(getPosZ(right)) << endl; } maxIndex = predicate==patY ? right : right-1; #else // Binary Search to find left boundary long long left=minIndex; long long right=mid; long long pos=0; while(left<=right) { pos = (left+right) >> 1; predicate = getY(pos); if(predicate!=patY) { left = pos+1; } else { right = pos-1; } } minIndex = predicate==patY ? pos : pos+1; // Binary Search to find right boundary left = mid; right= maxIndex; while(left<=right) { pos = (left+right) >> 1; predicate = getY(pos); if(predicate!=patY) { right = pos-1; } else { left = pos+1; } } maxIndex = predicate==patY ? pos : pos-1; #endif // cout << "Left bound" << endl; // for(unsigned int i=minIndex-2; i<=minIndex+2; i++) { // if(i>=0) { // cout << "Found: " << i << "=>" << getY(i) << " " << ((i>= minIndex && i<=maxIndex) ? '*': ' ') << " Z=" << adjZ.get(getPosZ(i))<< endl; // } // } // cout << "Right bound" << endl; // for(unsigned int i=maxIndex-2; i<=maxIndex+2; i++) { // if(i>=0) { // cout << "Found: " << i << "=>" << getY(i) << " " << ((i>= minIndex && i<=maxIndex) ? '*': ' ') << " Z=" << adjZ.get(getPosZ(i))<< endl; // } // } break; } } } }
//Astar Search bool Pathfinder::aStar(map<int,t_nets>::iterator& net, list<int>& targetNodes){ static t_tmp actualNode; int node; ++trace_id; //Initialize priority queue PQ with the sourceNodes priority_queue<t_tmp> pq; actualNode.costAccumulated=0; actualNode.father=-1; for(list<int>::iterator nodes_it = net->second.netTree.begin(); nodes_it != net->second.netTree.end(); ++nodes_it){ actualNode.aStarCost=getClosestNodeDistance(*nodes_it, targetNodes); // actualNode.costAccumulated=calcDistance(*nodes_it, net->second.nodes.front() )/arbFactor ; actualNode.node=*nodes_it; pq.push(actualNode); graph[*nodes_it].setFather(trace_id, -1); } // int center=getCenter(net->second.nodes); //Loop until new sink is found while(!(pq.empty() || targetNodes.empty())){ //Remove lowest cost node from PQ actualNode=pq.top(); pq.pop(); if(actualNode.father!=-1){ if(graph[actualNode.node].isVisited(trace_id)) continue; graph[actualNode.node].setFather(trace_id, actualNode.father); if(getNet(actualNode.node) == net->first) break; } // cout << ++visited << ": visitando (" << getPosX(actualNode.node) << " " <<getPosY(actualNode.node)<< " " <<getPosZ(actualNode.node)<< ") " << actualNode.costAccumulated << "+" << actualNode.aStarCost-actualNode.costAccumulated << "=" << actualNode.aStarCost << " vindo de (" << getPosX(actualNode.father) << " " <<getPosY(actualNode.father)<< " " <<getPosZ(actualNode.father)<< ")"<<endl; //Test the neighbours and add to queue the valids if(getPosX(actualNode.node)+1 < sizeX) pqAddto(actualNode,pq, net->first,targetNodes,RT_EAST); if(getPosY(actualNode.node)+1 < sizeY) pqAddto(actualNode,pq, net->first,targetNodes,RT_NORTH); if(getPosX(actualNode.node)) pqAddto(actualNode,pq, net->first,targetNodes,RT_WEST); if(getPosY(actualNode.node)) pqAddto(actualNode,pq, net->first,targetNodes,RT_SOUTH); if(getPosZ(actualNode.node)) pqAddto(actualNode,pq, net->first,targetNodes,RT_DOWN); if(getPosZ(actualNode.node)+1 < sizeZ) pqAddto(actualNode,pq, net->first,targetNodes,RT_UP); } // cout << ++visited << ": visitando (" << getPosX(actualNode.node) << " " <<getPosY(actualNode.node)<< " " <<getPosZ(actualNode.node)<< ") " << actualNode.costAccumulated << "+" << actualNode.aStarCost-actualNode.costAccumulated << "=" << actualNode.aStarCost << " vindo de (" << getPosX(actualNode.father) << " " <<getPosY(actualNode.father)<< " " <<getPosZ(actualNode.father)<< ")"<<endl; //Trace the path back to the source node if(getNet(actualNode.node)==net->first && actualNode.father!=-1){ node = actualNode.node; targetNodes.remove(node); while (graph[node].getFather(trace_id)!=-1) { //Put these new nodes in the Routing Tree net->second.netTree.push_back(node); net->second.routeResult.push_back(node); if(!isSource(node)){ if(graph[node].nrNets){ bool &tmp=netlist[graph[node].net].conflict; if(!tmp){ tmp=true; ++conflicts; } net->second.conflict=true; } graph[node].net=net->first; ++graph[node].nrNets; } node = graph[node].getFather(trace_id); } net->second.routeResult.push_back(node); net->second.routeResult.push_back(-1); return true; } return false; }
//Calculate manhattan distance between nodes inline int Pathfinder::calcDistance(int node1, int node2){ // return 0; return 5*(abs(getPosX(node1)-getPosX(node2))+abs(getPosY(node1)-getPosY(node2))+abs(getPosZ(node1)-getPosZ(node2))); }
//Write to a designated file the routing result void Pathfinder::pathTree(int net, ofstream& froute){ int antPos,pos,desloc; rt_dir dir; int r=0; if(netlist[net].routeResult.size()>0){ froute << "Net " << net << "\t"; froute << "( " << getPosX(netlist[net].routeResult[(r)]) << " " << getPosY(netlist[net].routeResult[(r)]) << " " << getPosZ(netlist[net].routeResult[(r)]) << " ) "; desloc=1; r=1; while(r<(netlist[net].routeResult.size()-1)){ if(netlist[net].routeResult[r]==-1){ froute << " ( " << getPosX(netlist[net].routeResult[(r+1)]) << " " << getPosY(netlist[net].routeResult[(r+1)]) << " " << getPosZ(netlist[net].routeResult[(r+1)]) << " ) "; r+=2; desloc=1; } else { antPos=netlist[net].routeResult[r-1]; pos=netlist[net].routeResult[r]; dir=dirFromPos(antPos,pos); if(netlist[net].routeResult[r+1]==-1 || !(getDir(pos,dir)==netlist[net].routeResult[r+1])){ switch (dir){ case RT_WEST: froute << "[ " << desloc << " WEST ] "; break; case RT_EAST: froute << "[ " << desloc << " EAST ] "; break; case RT_SOUTH: froute << "[ " << desloc << " SOUTH ] "; break; case RT_NORTH: froute << "[ " << desloc << " NORTH ] "; break; case RT_DOWN: froute << "[ " << desloc << " DOWN ] "; break; case RT_UP: froute << "[ " << desloc << " UP ] "; break; } desloc=1; } else desloc++; r++; } } froute << endl; } }
void Entity::paint(QPainter *painter, QPaintEvent *event, Scene *scene) { float ratio = scene->getRatio(); int x = getPosX() * ratio; int y = scene->convertWorldCoordToWindow(getPosY()); int z = getPosZ(); int w = getWidth() * ratio; int h = getHeight() * ratio; if (tex == 0) tex = TexturesManager::getInstance()->getNone(); if (!((x - scene->getSlide() < 0 || x - scene->getSlide() > event->rect().width()) && (x + w - scene->getSlide() < 0 || x + w - scene->getSlide() > event->rect().width()))) { painter->beginNativePainting(); { float _x = getTexX(); float _y = getTexY(); float coords[12] = { x, y, z, x + w, y, z, x + w, y + h, z, x , y + h, z, }; float t_coords[8] = { 0.0, 0.0, _x, 0.0, _x, _y, 0.0, _y }; glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glColor3f(1.0, 1.0, 1.0); if (tex != 0) { glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, tex->id); glColor4f(1.0, 1.0, 1.0, 1.0); } glTexCoordPointer(2, GL_FLOAT, 0, t_coords); glVertexPointer(3, GL_FLOAT, 0, coords); glDrawArrays(GL_QUADS, 0, 4); glDisable(GL_TEXTURE_2D); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); } painter->endNativePainting(); if (!selected && drawRect) painter->drawRect(x, y, w, h); } }