/* -*- tab-width: 4 -*- * * Electric(tm) VLSI Design System * * File: ManhattanOrientation.java * * Copyright (c) 2011, 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.api.minarea; import java.awt.geom.AffineTransform; /** * Enumeration to specify Manhattan orientation. * There are 8 Manhattan orientations. * The names of the constants are standard EDIF orientations. */ public enum ManhattanOrientation { /** * This picture shows transformation of letter 'F' by * all 8 manhattan transformations. * * MY R0 * R90 MXR90 * MYR90 R270 * R180 MX * * XXXXX XXXXX * X X * X XX XX X * X X X X * X X X X * X X X X * XXXXX XXXXX * * XXXXX XXXXX * X X X X * X X X X * X X X X * X XX XX X * X X * XXXXX XXXXX */ R0 { public AffineTransform affineTransform() { return new AffineTransform(1, 0, 0, 1, 0, 0); } public void transformPoints(int[] coords, int offset, int count) { } public void transformRects(int[] coords, int offset, int count) { } }, R90 { public AffineTransform affineTransform() { return new AffineTransform(0, 1, -1, 0, 0, 0); } public void transformPoints(int[] coords, int offset, int count) { for (int i = 0; i < count; i++) { int x = coords[offset + i * 2 + 0]; int y = coords[offset + i * 2 + 1]; coords[offset + i * 2 + 0] = -y; coords[offset + i * 2 + 1] = x; } } public void transformRects(int[] coords, int offset, int count) { for (int i = 0; i < count; i++) { int lx = coords[offset + i * 4 + 0]; int ly = coords[offset + i * 4 + 1]; int hx = coords[offset + i * 4 + 2]; int hy = coords[offset + i * 4 + 3]; coords[offset + i * 4 + 0] = -hy; coords[offset + i * 4 + 1] = lx; coords[offset + i * 4 + 2] = -ly; coords[offset + i * 4 + 3] = hx; } } }, R180 { public AffineTransform affineTransform() { return new AffineTransform(-1, 0, 0, -1, 0, 0); } public void transformPoints(int[] coords, int offset, int count) { for (int i = 0; i < count; i++) { int x = coords[offset + i * 2 + 0]; int y = coords[offset + i * 2 + 1]; coords[offset + i * 2 + 0] = -x; coords[offset + i * 2 + 1] = -y; } } public void transformRects(int[] coords, int offset, int count) { for (int i = 0; i < count; i++) { int lx = coords[offset + i * 4 + 0]; int ly = coords[offset + i * 4 + 1]; int hx = coords[offset + i * 4 + 2]; int hy = coords[offset + i * 4 + 3]; coords[offset + i * 4 + 0] = -hx; coords[offset + i * 4 + 1] = -hy; coords[offset + i * 4 + 2] = -lx; coords[offset + i * 4 + 3] = -ly; } } }, R270 { public AffineTransform affineTransform() { return new AffineTransform(0, -1, 1, 0, 0, 0); } public void transformPoints(int[] coords, int offset, int count) { for (int i = 0; i < count; i++) { int x = coords[offset + i * 2 + 0]; int y = coords[offset + i * 2 + 1]; coords[offset + i * 2 + 0] = y; coords[offset + i * 2 + 1] = -x; } } public void transformRects(int[] coords, int offset, int count) { for (int i = 0; i < count; i++) { int lx = coords[offset + i * 4 + 0]; int ly = coords[offset + i * 4 + 1]; int hx = coords[offset + i * 4 + 2]; int hy = coords[offset + i * 4 + 3]; coords[offset + i * 4 + 0] = ly; coords[offset + i * 4 + 1] = -hx; coords[offset + i * 4 + 2] = hy; coords[offset + i * 4 + 3] = -lx; } } }, MY { public AffineTransform affineTransform() { return new AffineTransform(-1, 0, 0, 1, 0, 0); } public void transformPoints(int[] coords, int offset, int count) { for (int i = 0; i < count; i++) { int x = coords[offset + i * 2 + 0]; coords[offset + i * 2 + 0] = -x; } } public void transformRects(int[] coords, int offset, int count) { for (int i = 0; i < count; i++) { int lx = coords[offset + i * 4 + 0]; int hx = coords[offset + i * 4 + 2]; coords[offset + i * 4 + 0] = -hx; coords[offset + i * 4 + 2] = -lx; } } }, MYR90 { public AffineTransform affineTransform() { return new AffineTransform(0, -1, -1, 0, 0, 0); } public void transformPoints(int[] coords, int offset, int count) { for (int i = 0; i < count; i++) { int x = coords[offset + i * 2 + 0]; int y = coords[offset + i * 2 + 1]; coords[offset + i * 2 + 0] = -y; coords[offset + i * 2 + 1] = -x; } } public void transformRects(int[] coords, int offset, int count) { for (int i = 0; i < count; i++) { int lx = coords[offset + i * 4 + 0]; int ly = coords[offset + i * 4 + 1]; int hx = coords[offset + i * 4 + 2]; int hy = coords[offset + i * 4 + 3]; coords[offset + i * 4 + 0] = -hy; coords[offset + i * 4 + 1] = -hx; coords[offset + i * 4 + 2] = -ly; coords[offset + i * 4 + 3] = -lx; } } }, MX { public AffineTransform affineTransform() { return new AffineTransform(1, 0, 0, -1, 0, 0); } public void transformPoints(int[] coords, int offset, int count) { for (int i = 0; i < count; i++) { int y = coords[offset + i * 2 + 1]; coords[offset + i * 2 + 1] = -y; } } public void transformRects(int[] coords, int offset, int count) { for (int i = 0; i < count; i++) { int ly = coords[offset + i * 4 + 1]; int hy = coords[offset + i * 4 + 3]; coords[offset + i * 4 + 1] = -hy; coords[offset + i * 4 + 3] = -ly; } } }, MXR90 { public AffineTransform affineTransform() { return new AffineTransform(0, 1, 1, 0, 0, 0); } public void transformPoints(int[] coords, int offset, int count) { for (int i = 0; i < count; i++) { int x = coords[offset + i * 2 + 0]; int y = coords[offset + i * 2 + 1]; coords[offset + i * 2 + 0] = y; coords[offset + i * 2 + 1] = x; } } public void transformRects(int[] coords, int offset, int count) { for (int i = 0; i < count; i++) { int lx = coords[offset + i * 4 + 0]; int ly = coords[offset + i * 4 + 1]; int hx = coords[offset + i * 4 + 2]; int hy = coords[offset + i * 4 + 3]; coords[offset + i * 4 + 0] = ly; coords[offset + i * 4 + 1] = lx; coords[offset + i * 4 + 2] = hy; coords[offset + i * 4 + 3] = hx; } } }; public abstract AffineTransform affineTransform(); @Deprecated public abstract void transformPoints(int[] coords, int offset, int count); public abstract void transformRects(int[] coords, int offset, int count); public ManhattanOrientation concatenate(ManhattanOrientation other) { return concatenate[ordinal() * 8 + other.ordinal()]; } private static final ManhattanOrientation[] concatenate = { /*R0*/R0, R90, R180, R270, MY, MYR90, MX, MXR90, /*R90*/ R90, R180, R270, R0, MYR90, MX, MXR90, MY, /*R180*/ R180, R270, R0, R90, MX, MXR90, MY, MYR90, /*R270*/ R270, R0, R90, R180, MXR90, MY, MYR90, MX, /*MY*/ MY, MXR90, MX, MYR90, R0, R270, R180, R90, /*MYR90*/ MYR90, MY, MXR90, MX, R90, R0, R270, R180, /*MX*/ MX, MYR90, MY, MXR90, R180, R90, R0, R270, /*MXR90*/ MXR90, MX, MYR90, MY, R270, R180, R90, R0 }; }