?? gds.java
字號:
/* -*- tab-width: 4 -*- * * Electric(tm) VLSI Design System * * File: GDS.java * Input/output tool: GDS input * Original C code written by Glen M. Lawson, S-MOS Systems, Inc. * Translated into Java by Steven M. Rubin, Sun Microsystems. * * Copyright (c) 2004 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.io.input;import com.sun.electric.database.ImmutableNodeInst;import com.sun.electric.database.geometry.DBMath;import com.sun.electric.database.geometry.EPoint;import com.sun.electric.database.geometry.ERectangle;import com.sun.electric.database.geometry.GenMath;import com.sun.electric.database.geometry.Orientation;import com.sun.electric.database.geometry.Poly;import com.sun.electric.database.geometry.PolyBase;import com.sun.electric.database.geometry.PolyMerge;import com.sun.electric.database.hierarchy.Cell;import com.sun.electric.database.hierarchy.Export;import com.sun.electric.database.hierarchy.Library;import com.sun.electric.database.hierarchy.View;import com.sun.electric.database.prototype.NodeProto;import com.sun.electric.database.prototype.PortProto;import com.sun.electric.database.text.Name;import com.sun.electric.database.text.TextUtils;import com.sun.electric.database.topology.Geometric;import com.sun.electric.database.topology.NodeInst;import com.sun.electric.database.variable.ElectricObject;import com.sun.electric.database.variable.MutableTextDescriptor;import com.sun.electric.database.variable.TextDescriptor;import com.sun.electric.technology.ArcProto;import com.sun.electric.technology.Layer;import com.sun.electric.technology.PrimitiveNode;import com.sun.electric.technology.SizeOffset;import com.sun.electric.technology.Technology;import com.sun.electric.technology.Technology.NodeLayer;import com.sun.electric.technology.technologies.Generic;import com.sun.electric.tool.Job;import com.sun.electric.tool.io.GDSLayers;import com.sun.electric.tool.io.IOTool;import com.sun.electric.tool.ncc.basic.NccCellAnnotations;import java.awt.Point;import java.awt.geom.Point2D;import java.awt.geom.Rectangle2D;import java.io.IOException;import java.util.ArrayList;import java.util.Collections;import java.util.HashMap;import java.util.HashSet;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Set;/** * This class reads files in GDS files. * <BR> * Notes: * <UL> * <LI>Case sensitive.</LI> * <LI>NODEs, TEXTNODEs, BOXs - don't have an example.</LI> * <LI>PATHTYPE 1 - rounded ends on paths, not supported.</LI> * <LI>Path dogears - no cleanup yet, simpler to map paths into arcs.</LI> * <LI>Absolute angle - ???</LI> * <LI>SUBLAYERS or XXXTYPE fields are not supported.</LI> * <LI>PROPERTIES are not supported.</LI> * <LI>REFLIBS are not supported.</LI> * <LI>PATH-ARC mapping - should be done, problem is that any layer can be a path, only connection layers in Electric are arcs. * Someone could make a GDS mapping technology for this purpose, defaults could be taken from this technology.</LI> * <LI>Misc. fields mapped to variables - should be done.</LI> * <LI>AREFs - could build into a separate NODEPROTO, and instance, thus preserving the original intent and space.</LI> * <LI>MAG - no scaling is possible, must create a separate object for each value, don't scale. (TEXT does scale.)</LI> * </UL> */public class GDS extends Input{ private static final boolean SHOWPROGRESS = false; /* true for debugging */ private static final boolean IGNOREIMMENSECELLS = false; /* true for debugging */ private static final boolean TALLYCONTENTS = false; /* true for debugging */ // data declarations private static final int MAXPOINTS = 4096; private static final int MINFONTWIDTH = 130; private static final int MINFONTHEIGHT = 190; private static class ShapeType {} private static final ShapeType SHAPEPOLY = new ShapeType(); private static final ShapeType SHAPERECTANGLE = new ShapeType(); private static final ShapeType SHAPEOBLIQUE = new ShapeType(); private static final ShapeType SHAPELINE = new ShapeType(); private static final ShapeType SHAPECLOSED = new ShapeType(); private static class DatatypeSymbol {} private static final DatatypeSymbol TYPEERR = new DatatypeSymbol(); private static final DatatypeSymbol TYPENONE = new DatatypeSymbol(); private static final DatatypeSymbol TYPEFLAGS = new DatatypeSymbol(); private static final DatatypeSymbol TYPESHORT = new DatatypeSymbol(); private static final DatatypeSymbol TYPELONG = new DatatypeSymbol(); private static final DatatypeSymbol TYPEFLOAT = new DatatypeSymbol(); private static final DatatypeSymbol TYPEDOUBLE = new DatatypeSymbol(); private static final DatatypeSymbol TYPESTRING = new DatatypeSymbol(); private final static double twoTo32 = makePower(2, 32); private final static double twoToNeg56 = 1.0 / makePower (2, 56); private int countBox, countText, countNode, countPath, countShape, countSRef, countARef, countATotal; private Library theLibrary; private CellBuilder theCell; private NodeProto theNodeProto; private PrimitiveNode layerNodeProto; private PrimitiveNode pinNodeProto; private boolean layerUsed; private boolean layerIsPin; private Technology curTech; private int recordCount; private GSymbol theToken; private DatatypeSymbol valuetype; private int tokenFlags; private int tokenValue16; private int tokenValue32; private double tokenValueDouble; private String tokenString; private Point2D [] theVertices; private double theScale; private Map<Integer,Layer> layerNames; private Set<Integer> pinLayers; private PolyMerge merge; private boolean mergeThisCell; private double inputScale; private static boolean arraySimplificationUseful; private static class GSymbol { private int value; private static List<GSymbol> symbols = new ArrayList<GSymbol>(); private GSymbol(int value) { this.value = value; symbols.add(this); } private static GSymbol findSymbol(int value) { for(GSymbol gs : symbols) { if (gs.value == value) return gs; } return null; } } private static final GSymbol GDS_HEADER = new GSymbol(0); private static final GSymbol GDS_BGNLIB = new GSymbol(1); private static final GSymbol GDS_LIBNAME = new GSymbol(2); private static final GSymbol GDS_UNITS = new GSymbol(3); private static final GSymbol GDS_ENDLIB = new GSymbol(4); private static final GSymbol GDS_BGNSTR = new GSymbol(5); private static final GSymbol GDS_STRNAME = new GSymbol(6); private static final GSymbol GDS_ENDSTR = new GSymbol(7); private static final GSymbol GDS_BOUNDARY = new GSymbol(8); private static final GSymbol GDS_PATH = new GSymbol(9); private static final GSymbol GDS_SREF = new GSymbol(10); private static final GSymbol GDS_AREF = new GSymbol(11); private static final GSymbol GDS_TEXTSYM = new GSymbol(12); private static final GSymbol GDS_LAYER = new GSymbol(13); private static final GSymbol GDS_DATATYPSYM = new GSymbol(14); private static final GSymbol GDS_WIDTH = new GSymbol(15); private static final GSymbol GDS_XY = new GSymbol(16); private static final GSymbol GDS_ENDEL = new GSymbol(17); private static final GSymbol GDS_SNAME = new GSymbol(18); private static final GSymbol GDS_COLROW = new GSymbol(19); private static final GSymbol GDS_TEXTNODE = new GSymbol(20); private static final GSymbol GDS_NODE = new GSymbol(21); private static final GSymbol GDS_TEXTTYPE = new GSymbol(22); private static final GSymbol GDS_PRESENTATION = new GSymbol(23);// private static final GSymbol GDS_SPACING = new GSymbol(24); private static final GSymbol GDS_STRING = new GSymbol(25); private static final GSymbol GDS_STRANS = new GSymbol(26); private static final GSymbol GDS_MAG = new GSymbol(27); private static final GSymbol GDS_ANGLE = new GSymbol(28);// private static final GSymbol GDS_UINTEGER = new GSymbol(29);// private static final GSymbol GDS_USTRING = new GSymbol(30); private static final GSymbol GDS_REFLIBS = new GSymbol(31); private static final GSymbol GDS_FONTS = new GSymbol(32); private static final GSymbol GDS_PATHTYPE = new GSymbol(33); private static final GSymbol GDS_GENERATIONS = new GSymbol(34); private static final GSymbol GDS_ATTRTABLE = new GSymbol(35);// private static final GSymbol GDS_STYPTABLE = new GSymbol(36);// private static final GSymbol GDS_STRTYPE = new GSymbol(37); private static final GSymbol GDS_ELFLAGS = new GSymbol(38);// private static final GSymbol GDS_ELKEY = new GSymbol(39);// private static final GSymbol GDS_LINKTYPE = new GSymbol(40);// private static final GSymbol GDS_LINKKEYS = new GSymbol(41); private static final GSymbol GDS_NODETYPE = new GSymbol(42); private static final GSymbol GDS_PROPATTR = new GSymbol(43); private static final GSymbol GDS_PROPVALUE = new GSymbol(44); private static final GSymbol GDS_BOX = new GSymbol(45); private static final GSymbol GDS_BOXTYPE = new GSymbol(46); private static final GSymbol GDS_PLEX = new GSymbol(47); private static final GSymbol GDS_BGNEXTN = new GSymbol(48); private static final GSymbol GDS_ENDEXTN = new GSymbol(49);// private static final GSymbol GDS_TAPENUM = new GSymbol(50);// private static final GSymbol GDS_TAPECODE = new GSymbol(51);// private static final GSymbol GDS_STRCLASS = new GSymbol(52);// private static final GSymbol GDS_NUMTYPES = new GSymbol(53); private static final GSymbol GDS_IDENT = new GSymbol(54); private static final GSymbol GDS_REALNUM = new GSymbol(55); private static final GSymbol GDS_SHORT_NUMBER = new GSymbol(56); private static final GSymbol GDS_NUMBER = new GSymbol(57); private static final GSymbol GDS_FLAGSYM = new GSymbol(58); private static final GSymbol GDS_FORMAT = new GSymbol(59); private static final GSymbol GDS_MASK = new GSymbol(60); private static final GSymbol GDS_ENDMASKS = new GSymbol(61); private static GSymbol [] optionSet = {GDS_ATTRTABLE, GDS_REFLIBS, GDS_FONTS, GDS_GENERATIONS}; private static GSymbol [] shapeSet = {GDS_AREF, GDS_SREF, GDS_BOUNDARY, GDS_PATH, GDS_NODE, GDS_TEXTSYM, GDS_BOX}; private static GSymbol [] goodOpSet = {GDS_HEADER, GDS_BGNLIB, GDS_LIBNAME, GDS_UNITS, GDS_ENDLIB, GDS_BGNSTR, GDS_STRNAME, GDS_ENDSTR, GDS_BOUNDARY, GDS_PATH, GDS_SREF, GDS_AREF, GDS_TEXTSYM, GDS_LAYER, GDS_DATATYPSYM, GDS_WIDTH, GDS_XY, GDS_ENDEL, GDS_SNAME, GDS_COLROW, GDS_TEXTNODE, GDS_NODE, GDS_TEXTTYPE, GDS_PRESENTATION, GDS_STRING, GDS_STRANS, GDS_MAG, GDS_ANGLE, GDS_REFLIBS, GDS_FONTS, GDS_PATHTYPE, GDS_GENERATIONS, GDS_ATTRTABLE, GDS_NODETYPE, GDS_PROPATTR, GDS_PROPVALUE, GDS_BOX, GDS_BOXTYPE, GDS_FORMAT, GDS_MASK, GDS_ENDMASKS}; private static GSymbol [] maskSet = {GDS_DATATYPSYM, GDS_TEXTTYPE, GDS_BOXTYPE, GDS_NODETYPE}; private static GSymbol [] unsupportedSet = {GDS_ELFLAGS, GDS_PLEX}; private static class CellBuilder { private static Map<Cell,CellBuilder> allBuilders; private static Set<Cell> cellsTooComplex; Cell cell; List<MakeInstance> insts = new ArrayList<MakeInstance>(); List<MakeInstanceArray> instArrays = new ArrayList<MakeInstanceArray>(); private CellBuilder(Cell cell) { this.cell = cell; allBuilders.put(cell, this); } private void makeInstance(NodeProto proto, Point2D loc, Orientation orient, double wid, double hei, EPoint[] points) { MakeInstance mi = new MakeInstance(proto, loc, orient, wid, hei, points, null, null); insts.add(mi); } private void makeInstanceArray(NodeProto proto, int nCols, int nRows, Orientation orient, Point2D startLoc, Point2D rowOffset, Point2D colOffset) { MakeInstanceArray mia = new MakeInstanceArray(proto, nCols, nRows, orient, new Point2D.Double(startLoc.getX(), startLoc.getY()), rowOffset, colOffset); instArrays.add(mia); } private void makeExport(NodeProto proto, Point2D loc, Orientation orient, double wid, double hei, String exportName) { MakeInstance mi = new MakeInstance(proto, loc, orient, wid, hei, null, exportName, null); insts.add(mi); } private void makeText(NodeProto proto, Point2D loc, String text, TextDescriptor textDescriptor) { MakeInstance mi = new MakeInstance(proto, loc, Orientation.IDENT, 0, 0, null, null, Name.findName(text)); insts.add(mi); } private static void init() { allBuilders = new HashMap<Cell,CellBuilder>(); cellsTooComplex = new HashSet<Cell>(); } private static void term() { allBuilders = null; if (cellsTooComplex.size() > 0) { System.out.print("THESE CELLS WERE TOO COMPLEX AND NOT FULLY READ:"); for(Cell cell : cellsTooComplex) System.out.print(" " + cell.describe(false)); System.out.println(); } } private void makeInstances(Set<Cell> builtCells) { if (builtCells.contains(cell)) return; builtCells.add(cell); boolean countOff = false; if (SHOWPROGRESS || IGNOREIMMENSECELLS) { int size = insts.size(); int arraySize = instArrays.size(); System.out.println("Building cell " + this.cell.describe(false) + " with " + size + " single instances and " + arraySize + " arrayed instances"); if (size+arraySize >= 100000) { countOff = true; // ignore internal contents when cell is very large (for testing only) if (IGNOREIMMENSECELLS) { cellsTooComplex.add(cell); MakeInstance ll = null, ul = null, lr = null, ur = null; for(MakeInstance mi : insts) { if (ll == null) ll = ul = lr = ur = mi; if (mi.loc.getX() <= ll.loc.getX() && mi.loc.getY() <= ll.loc.getY()) ll = mi; if (mi.loc.getX() <= ul.loc.getX() && mi.loc.getY() >= ul.loc.getY()) ul = mi; if (mi.loc.getX() >= lr.loc.getX() && mi.loc.getY() <= lr.loc.getY()) lr = mi; if (mi.loc.getX() >= ur.loc.getX() && mi.loc.getY() >= ur.loc.getY()) ur = mi; } insts.clear(); instArrays.clear(); insts.add(ll); if (!insts.contains(ul)) insts.add(ul); if (!insts.contains(lr)) insts.add(lr); if (!insts.contains(ur)) insts.add(ur); } } } nameInstances(countOff); Collections.sort(insts); int count = 0; int renamed = 0; Map<String,String> exportUnify = new HashMap<String,String>(); for(MakeInstance mi : insts) { if (countOff && ((++count % 1000) == 0)) System.out.println(" Made " + count + " instances"); if (mi.proto instanceof Cell) { Cell subCell = (Cell)mi.proto; CellBuilder cellBuilder = allBuilders.get(subCell); if (cellBuilder != null) cellBuilder.makeInstances(builtCells); } // make the instance if (mi.instantiate(this.cell, exportUnify)) renamed++; } Map<NodeProto,List<EPoint>> massiveMerge = new HashMap<NodeProto,List<EPoint>>(); for(MakeInstanceArray mia : instArrays) { if (countOff && ((++count % 1000) == 0)) System.out.println(" Made " + count + " instances"); if (mia.proto instanceof Cell) { Cell subCell = (Cell)mia.proto; CellBuilder cellBuilder = allBuilders.get(subCell); if (cellBuilder != null) cellBuilder.makeInstances(builtCells); } // make the instance array mia.instantiate(this, this.cell, massiveMerge); } List<NodeProto> mergeNodeSet = new ArrayList<NodeProto>(); for(NodeProto np : massiveMerge.keySet()) mergeNodeSet.add(np); for(NodeProto np : mergeNodeSet) { // place a pure-layer node that embodies all arrays for the whole cell List<EPoint> points = massiveMerge.get(np); buildComplexNode(points, np, this.cell); } if (renamed > 0) { System.out.println(" Warning: Cell " + this.cell.describe(false) + " had " + renamed + " exports with duplicate names that were renamed and unified"); Map<String,String> unifyStrings = new HashMap<String,String>(); Set<String> finalNames = exportUnify.keySet(); for(String finalName : finalNames) { String singleName = exportUnify.get(finalName); String us = unifyStrings.get(singleName); if (us == null) us = singleName; us += " " + finalName; unifyStrings.put(singleName, us); } List<String> annotations = new ArrayList<String>(); for(String us : unifyStrings.keySet()) annotations.add("exportsConnectedByParent " + unifyStrings.get(us));
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -