/* -*- tab-width: 4 -*-
 *
 * Electric(tm) VLSI Design System
 *
 * File: CustomMetric.java
 * Written by Team 5: Andreas Wagner, Thomas Hauck, Philippe Bartscherer
 * 
 * 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, 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 this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.sun.electric.tool.placement.forceDirected1.metrics;

import com.sun.electric.tool.placement.PlacementFrame.PlacementNetwork;
import com.sun.electric.tool.placement.PlacementFrame.PlacementNode;

import java.awt.geom.Rectangle2D;
import java.util.List;

/**
 * Placement Area Metric
 */

public class PAMetric extends CustomMetric {

	private Rectangle2D.Double area = new Rectangle2D.Double(); // chip area

	public PAMetric(List<PlacementNode> nodesToPlace,
			List<PlacementNetwork> allNetworks) {
		super(nodesToPlace, null);
	}

	public String getMetricName() {
		return "Placement-Area";
	}

	public double compute() {
		// precondition
		if (nodesToPlace.size() <= 1)
			return 0;
		// variables
		double x, y, w, h;
		double minX = Double.MAX_VALUE,  minY = Double.MAX_VALUE;
		double maxX = -Double.MAX_VALUE, maxY = -Double.MAX_VALUE;
		// dimension
		for (PlacementNode node : nodesToPlace) {
			x = node.getPlacementX();
			y = node.getPlacementY();
			w = node.getWidth() / 2;
			h = node.getHeight() / 2;
			minX = Math.min(x - w, minX);
			maxX = Math.max(x + w, maxX);
			minY = Math.min(y - h, minY);
			maxY = Math.max(y + h, maxY);
		}
		area.setRect(minX, minY, maxX - minX, maxY - minY);
		return getArea();
	}

	// --- interface -----------------------------------------------------------

	public double getX() {
		return area.getX();
	}

	public double getY() {
		return area.getY();
	}

	public double getWidth() {
		return area.getWidth();
	}

	public double getHeight() {
		return area.getHeight();
	}

	public double getArea() {
		return area.getWidth() * area.getHeight();
	}
}
