/* -*- tab-width: 4 -*-
*
* Electric(tm) VLSI Design System
*
* File: PlacementForceDirectedStaged.java
* Written by Team 7: Felix Schmidt, Daniel Lechner
*
* This code has been developed at the Karlsruhe Institute of Technology (KIT), Germany,
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius@ipd.uka.de)
*
* Copyright (c) 2010 Sun Microsystems and Static Free Software
*
* 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.placement.forceDirected2;
import com.sun.electric.database.geometry.GenMath.MutableInteger;
import com.sun.electric.tool.placement.PlacementFrame;
import com.sun.electric.tool.placement.forceDirected2.forceDirected.staged.FinalizeWorker;
import com.sun.electric.tool.placement.forceDirected2.forceDirected.staged.PlacementDTO;
import com.sun.electric.tool.placement.forceDirected2.forceDirected.staged.StartUpStage;
import com.sun.electric.tool.placement.forceDirected2.forceDirected.staged.StartUpStageWorker;
import com.sun.electric.tool.placement.forceDirected2.forceDirected.util.CheckboardingField;
import com.sun.electric.tool.placement.forceDirected2.forceDirected.util.CheckboardingPattern;
import com.sun.electric.tool.placement.forceDirected2.metrics.AbstractMetric;
import com.sun.electric.tool.placement.forceDirected2.metrics.BBMetric;
import com.sun.electric.tool.placement.forceDirected2.utils.GlobalVars;
import com.sun.electric.tool.placement.forceDirected2.utils.PlacementProperties;
import com.sun.electric.tool.placement.forceDirected2.utils.concurrent.Stage;
import com.sun.electric.tool.placement.forceDirected2.utils.concurrent.StageWorker;
import com.sun.electric.tool.placement.forceDirected2.utils.output.DebugMessageHandler;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Parallel Placement
*
* Base class for placement algorithm This class starts the first stage of the
* pipeline and provides several settings of the placement
*/
public class PlacementForceDirectedStaged extends PlacementFrame {
private static final String ALGORITHM_NAME = "Force-Directed-2";
protected static Map<PlacementNode, Map<PlacementNode, MutableInteger>> connectivityMap;
private static volatile int globalCounter = 0;
private static CheckboardingPattern pattern;
private static int movementCounter = 0;
private static Map<PlacementNode, AdditionalNodeData> nodeData;
public static int getGlobalCounter() {
return PlacementForceDirectedStaged.globalCounter;
}
public static synchronized int getMovementCounter() {
return PlacementForceDirectedStaged.movementCounter;
}
public static Map<PlacementNode, AdditionalNodeData> getNodeData() {
return nodeData;
}
public static synchronized void incMovementCounter() {
PlacementForceDirectedStaged.movementCounter++;
}
public static void setCheckboardingPattern(CheckboardingPattern pattern) {
PlacementForceDirectedStaged.pattern = pattern;
}
public static synchronized void setMovementCounter(int value) {
PlacementForceDirectedStaged.movementCounter = value;
}
@Override
public String getAlgorithmName() {
return ALGORITHM_NAME;
}
public synchronized void incGlobalCounter() {
PlacementForceDirectedStaged.globalCounter++;
}
@Override
public void runPlacement(List<PlacementNode> nodesToPlace, List<PlacementNetwork> allNetworks, String cellName) {
nodeData = new HashMap<PlacementNode, AdditionalNodeData>();
globalCounter = 0;
movementCounter = 0;
for (PlacementNode node : nodesToPlace) {
AdditionalNodeData dataSet = new AdditionalNodeData(null);
nodeData.put(node, dataSet);
}
GlobalVars.numOfNodes = new Integer(nodesToPlace.size());
System.out.println("Algorithm: " + this.getAlgorithmName());
long start = System.currentTimeMillis();
int nThreads = PlacementProperties.getInstance().getNumOfThreads();
// set up stages
List<StageWorker> startUp = new ArrayList<StageWorker>();
startUp.add(new StartUpStageWorker(nodesToPlace, allNetworks));
StartUpStage startUpStage = new StartUpStage(startUp);
startUpStage.start();
try {
startUpStage.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
CheckboardingField[][] fields = pattern.getAll();
List<StageWorker> finalizeWorker = new ArrayList<StageWorker>();
for (int i = 0; i < nThreads; i++) {
finalizeWorker.add(new FinalizeWorker(fields[0].length));
}
Stage finalizeStage = new Stage(finalizeWorker);
finalizeStage.start();
for (int i = 0; i < fields[0].length; i++) {
PlacementDTO dto = new PlacementDTO(fields, i);
finalizeStage.getInput(null).add(dto);
}
try {
finalizeStage.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
long end = System.currentTimeMillis();
System.out.println("finished: " + (end - start) + " ms.");
System.out.println("round timhe: " + ((end - start) / GlobalVars.rounds.doubleValue()) + " ms.");
DebugMessageHandler.printOnStdOut();
AbstractMetric bmetric = new BBMetric(nodesToPlace, allNetworks);
System.out.println(bmetric.toString());
}
}