Exemple #1
0
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;
}
Exemple #2
0
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;
}
Exemple #3
0
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();
}
Exemple #4
0
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);
    }
}
Exemple #5
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);
    }
}
Exemple #6
0
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;
    }
}
Exemple #7
0
//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;
}
Exemple #8
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;
}
Exemple #9
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;
}
Exemple #10
0
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;
            }
        }
    }
}
Exemple #11
0
//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;
}
Exemple #12
0
//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)));
}
Exemple #13
0
//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;
	}
}
Exemple #14
0
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);
    }
}