⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gds.java

📁 The ElectricTM VLSI Design System is an open-source Electronic Design Automation (EDA) system that c
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
/* -*- 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 + -