/* -*- tab-width: 4 -*-
*
* Electric(tm) VLSI Design System
*
* File: GlobalRouteJob.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* Electric(tm) is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Electric(tm); see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, Mass 02111-1307, USA.
*/
package com.sun.electric.tool.routing.experimentalAStar2.concurrency;
import java.util.List;
import java.util.concurrent.Callable;
import com.sun.electric.tool.routing.experimentalAStar2.algorithm.AStarRegionNode;
import com.sun.electric.tool.routing.experimentalAStar2.datastructures.Point3D;
import com.sun.electric.tool.routing.experimentalAStar2.goal.RegionGoal;
import com.sun.electric.tool.routing.experimentalAStar2.machine.AStarRegionMachine;
import com.sun.electric.tool.routing.experimentalAStar2.memorymanager.AStarRegionNodeObjectPool;
public class GlobalRouteJob extends RouteJob implements Callable<GlobalRouteJob>
{
public RouteJob routeJob;
/*
* The region-local coordinates of the start/end points inside the from and to
* regions.
*/
private Point3D fromInsideRegion;
private Point3D toInsideRegion;
private AStarRegionMachine machine;
private RegionGoal goal;
public List<AStarRegionNode> resultPath;
public GlobalRouteJob()
{
this.goal = new RegionGoal();
this.goal.setMaximumRevolutions(RoutingMain.MAX_REVOLUTIONS);
this.machine = new AStarRegionMachine(new AStarRegionNodeObjectPool());
}
public void initialize(RouteJob routeJob, Point3D fromRegion, Point3D toRegion, Point3D fromInsideRegion, Point3D toInsideRegion)
{
this.routeJob = routeJob;
this.from = fromRegion;
this.to = toRegion;
this.fromInsideRegion = fromInsideRegion;
this.toInsideRegion = toInsideRegion;
}
public RouteJob getRouteJob()
{
return this.routeJob;
}
/*
* (non-Javadoc)
*
* @see java.util.concurrent.Callable#call()
*/
public GlobalRouteJob call() throws Exception
{
// Set entry point in start region and exit point in goal region
AStarRegionNode startRegion = this.routeJob.getBoundingBox().nodeAt(this.from.getX(), this.from.getY(), this.from.getZ());
AStarRegionNode goalRegion = this.routeJob.getBoundingBox().nodeAt(this.to.getX(), this.to.getY(), this.to.getZ());
startRegion.setAsStartRegion(true);
goalRegion.setAsGoalRegion(true);
startRegion.setEntryPoint(startRegion.routingMap.nodeAt(this.fromInsideRegion.getX(), this.fromInsideRegion.getY(),
this.fromInsideRegion.getZ()));
goalRegion.setExitPoint(goalRegion.routingMap.nodeAt(this.toInsideRegion.getX(), this.toInsideRegion.getY(),
this.toInsideRegion.getZ()));
// Set up the machine's search space (-> map is actually a bounding box)
this.machine.setUpSearchSpace(this.routeJob.getBoundingBox(), this.goal);
// Call findPath()
this.resultPath = this.machine.findPath(this.from.getX(), this.from.getY(), this.from.getZ(), this.to.getX(), this.to.getY(),
this.to.getZ());
startRegion.setAsStartRegion(false);
goalRegion.setAsGoalRegion(false);
return this;
}
}