/* -*- tab-width: 4 -*-
*
* Electric(tm) VLSI Design System
*
* File: Tupel.java
* Written by: Andreas Uebelhoer, Alexander Bieles, Emre Selegin (Team 6)
*
* 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.experimentalLeeMoore1.LeeMoore;
import com.sun.electric.tool.routing.RoutingFrame.RoutePoint;
import com.sun.electric.tool.routing.experimentalLeeMoore1.yana;
import java.awt.geom.Point2D;
/**
* This object is a point in our routing array. It saves both the coordinates in the routing array as well as
* the coordinates in electric
*/
public class Tupel {
static int distanceBetweenWires = (yana.distanceBetweenWires==0)? 3: yana.distanceBetweenWires;
static int offsetX, offsetY;
private int xInsideElectric, yInsideElectric, layer, xInsideRoutingArray, yInsideRoutingArray;
/**
* Set offset, as tupel coordinates have to be positive where as electric coordinates are not
* @param x offset in x direction
* @param y offset in y direction
* @param spacing additional space around the cell to allow wires to leave it
*/
public static void setOffset(double x, double y, int spacing, boolean output) {
offsetX = (int) (x - spacing);
offsetY = (int) (y - spacing);
if(output) System.out.println("Using offset " + offsetX + "," + offsetY);
}
/**
*
* @param xInsideElectric xInsideElectric value
* @param yInsideElectric yInsideElectric value
* @param is_electric_coordinate true, if coordinates are taken from electric (-> offset needs to be added)
*/
public Tupel(int x, int y, int layer, boolean is_electric_coordinate) {
if (is_electric_coordinate) {
this.xInsideElectric = x;
this.yInsideElectric = y;
this.xInsideRoutingArray = (x - offsetX) / distanceBetweenWires;
this.yInsideRoutingArray = (y - offsetY) / distanceBetweenWires;
} else {
this.xInsideElectric = (x * distanceBetweenWires + distanceBetweenWires / 2) + offsetX;
this.yInsideElectric = (y * distanceBetweenWires + distanceBetweenWires / 2) + offsetY;
this.xInsideRoutingArray = x;
this.yInsideRoutingArray = y;
}
this.layer = layer;
}
/**
* Create tupel out of a Point2D
* @param p Point2D
* @param layer layer
*/
public Tupel(Point2D p, int layer) {
this.xInsideElectric = (int) p.getX();
this.yInsideElectric = (int) p.getY();
this.xInsideRoutingArray = (xInsideElectric - offsetX) / distanceBetweenWires;
this.yInsideRoutingArray = (yInsideElectric - offsetY) / distanceBetweenWires;
this.layer = layer;
}
/**
* returns xInsideElectric value as used in electric
* @return
*/
public int getX_InsideElectric() {
return xInsideElectric;
}
/**
* returns xInsideElectric value with offset
* @return
*/
public int getX_InsideRoutingArray() {
return xInsideRoutingArray;
}
/**
* returns yInsideElectric value as used in electric
* @return
*/
public int getY_InsideElectric() {
return yInsideElectric;
}
/**
* returns yInsideElectric value with offset
* @return
*/
public int getY_InsideRoutingArray() {
return yInsideRoutingArray;
}
/**
*
* @return layer of the tupel
*/
public int getLayer() {
return layer;
}
/**
* print tupel
*/
public void printTupel() {
System.out.print(this.toString());
}
public String toString() {
return "[" + xInsideElectric + "," + yInsideElectric + "@Metal-" + (layer + 1) + "(" + xInsideRoutingArray + "," + yInsideRoutingArray + "," + layer + ")]";
}
/**
* Determine whether this tupel is equal to another tupel
* @param t the other tupel
* @return
*/
public boolean isEqual(Tupel t) {
return (isEqualInElectric(t) || isEqualInRoutingArray(t));
}
/**
* Check whether the tupel has the same electric coordinates
* @param t tupel to compare with
* @return
*/
private boolean isEqualInElectric(Tupel t) {
return (xInsideElectric == t.getX_InsideElectric() && yInsideElectric == t.getY_InsideElectric() && layer == t.getLayer());
}
/**
* Check whether the tupel has the same routing array coordinates
* @param t tupel to compare with
* @return
*/
private boolean isEqualInRoutingArray(Tupel t) {
return (xInsideRoutingArray == t.getX_InsideRoutingArray() && yInsideRoutingArray == t.getY_InsideRoutingArray() && layer == t.getLayer());
}
/**
* Check whether the tupel has the same electric coordinates without checking the layer
* @param t tupel to compare with
* @return
*/
public boolean isEqualPositionInElectric(Tupel t) {
return (xInsideElectric == t.getX_InsideElectric() && yInsideElectric == t.getY_InsideElectric());
}
/**
* Check whether the route point has the same electric coordinates without checking the layer
* @param rp1 RoutePoint to compare with
* @return
*/
public boolean isEqualPosition(RoutePoint rp1) {
return (xInsideRoutingArray == convertElectricToRoutingArrayCoordinate_X(rp1.getLocation().getX())
&& yInsideRoutingArray == convertElectricToRoutingArrayCoordinate_Y(rp1.getLocation().getX()));
}
/**
* Check whether the tupel has the same routing array coordinates without checking the layer
* @param t tupel to compare with
* @return
*/
public boolean isEqualPosition(Tupel t) {
//rp1.getLocation().getY()
return (xInsideRoutingArray == t.xInsideRoutingArray && yInsideRoutingArray == t.yInsideRoutingArray);
}
/**
* convert x coordinate from electric to routing array
* @param x x coordinate
* @return
*/
public static int convertElectricToRoutingArrayCoordinate_X(double x) {
return (int) (x - offsetX) / distanceBetweenWires;
}
/**
* convert y coordinate from electric to routing array
* @param y y coordinate
* @return
*/
public static int convertElectricToRoutingArrayCoordinate_Y(double y) {
return (int) (y - offsetY) / distanceBetweenWires;
}
/**
* convert x coordinate from routing array to electric
* @param x x coordinate
* @return
*/
public static int convertRoutingArrayToElectricCoordinates_X(int x) {
return (x * distanceBetweenWires + distanceBetweenWires / 2) + offsetX;
}
/**
* convert y coordinate from routing array to electric
* @param y y coordinate
* @return
*/
public static int convertRoutingArrayToElectricCoordinates_Y(int y) {
return (y * distanceBetweenWires + distanceBetweenWires / 2) + offsetY;
}
/**
* Convert location to Point2D object
* @return Point2D with the electric coordinates of the tupel
*/
public Point2D getLocation(){
return new Point2D.Double(xInsideElectric, yInsideElectric);
}
}