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

📄 portinst.java

📁 The ElectricTM VLSI Design System is an open-source Electronic Design Automation (EDA) system that c
💻 JAVA
字号:
/* -*- tab-width: 4 -*- * * Electric(tm) VLSI Design System * * File: PortInst.java * * Copyright (c) 2003 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.database.topology;import com.sun.electric.database.ImmutablePortInst;import com.sun.electric.database.geometry.Poly;import com.sun.electric.database.geometry.EPoint;import com.sun.electric.database.hierarchy.EDatabase;import com.sun.electric.database.hierarchy.Export;import com.sun.electric.database.prototype.PortProto;import com.sun.electric.database.text.Name;import com.sun.electric.database.variable.EditWindow0;import com.sun.electric.database.variable.ElectricObject;import com.sun.electric.database.variable.Variable;import java.awt.geom.Rectangle2D;import java.io.InvalidObjectException;import java.io.NotSerializableException;import java.io.ObjectStreamException;import java.util.ArrayList;import java.util.HashSet;import java.util.Iterator;import java.util.List;import java.util.Set;/** * The PortInst class represents an instance of a Port.  It is the * combination of a NodeInst and a PortProto. * <P> * This class is thread-safe. */public class PortInst extends ElectricObject{	// ------------------------ private data ------------------------	private final NodeInst nodeInst;	private final PortProto portProto;	// -------------------protected or private methods ---------------	private PortInst(PortProto portProto, NodeInst nodeInst) {        this.portProto = portProto;        this.nodeInst = nodeInst;    }    private Object writeReplace() throws NotSerializableException {        if (!isLinked())            throw new NotSerializableException(this + " not linked");        return this;    }        private Object readResolve() throws ObjectStreamException {        if (nodeInst.getProto() != portProto.getParent()) throw new InvalidObjectException("PortInst");        PortInst pi = nodeInst.findPortInstFromProto(portProto);        if (pi == null) throw new InvalidObjectException("PortInst");        return pi;    }        /**     * Returns persistent data of this ElectricObject with Variables.     * @return persistent data of this ElectricObject.     */    @Override    public ImmutablePortInst getD() { return nodeInst.getD().getPortInst(portProto.getId()); }        /**     * Method to add a Variable on this PortInst.     * It may add repaired copy of this Variable in some cases.     * @param var Variable to add.     */    public void addVar(Variable var) { nodeInst.addVar(portProto.getId(), var); }	/**	 * Method to delete a Variable from this PortInst.	 * @param key the key of the Variable to delete.	 */	public void delVar(Variable.Key key) { nodeInst.delVar(portProto.getId(), key); }	/**	 * Method to delete all Variables of this PortInst.	 */    public void delVars() {        nodeInst.delVars(portProto.getId());		assert getNumVariables() == 0;    }    	// ------------------------ public methods -------------------------	/**	 * Method to create a PortInst object.	 * @param portProto the PortProto on the prototype of the NodeInst.	 * @param nodeInst the NodeInst that owns the port.	 * @return the newly created PortInst.	 */	public static PortInst newInstance(PortProto portProto, NodeInst nodeInst)	{		PortInst pi = new PortInst(portProto, nodeInst);		return pi;	}	/**	 * Method to return the NodeInst that this PortInst resides on.	 * @return the NodeInst that this PortInst resides on.	 */	public NodeInst getNodeInst() { return nodeInst; }	/**	 * Method to return the PortProto that this PortInst is an instance of.	 * @return the PortProto that this PortInst is an instance of.	 */	public PortProto getPortProto() { return portProto; }	/**	 * Method to get the index of this PortInst in NodeInst ports.	 * @return index of this PortInst in NodeInst ports.	 */	public final int getPortIndex() { return portProto.getPortIndex(); }	/**	 * Returns true of there are Connections on this PortInst.	 * @return true if there are Connections on this PortInst.	 */	public boolean hasConnections() { return nodeInst.hasConnections(portProto.getId().getChronIndex()); }    	/**	 * Get iterator of all Connections	 * that connect to this PortInst	 * @return an iterator over associated Connections	 */	public Iterator<Connection> getConnections() { return nodeInst.getConnections(portProto.getId().getChronIndex()); }	/**	 * Get iterator of all Exports	 * that connect to this PortInst	 * @return an iterator over associated Exports	 */	public Iterator<Export> getExports() {		List<Export> exports = new ArrayList<Export>();		// get exports on NodeInst		for (Iterator<Export> it = nodeInst.getExports(); it.hasNext(); ) {			Export e = it.next();			if (e.getOriginalPort() == this)				exports.add(e);		}		return exports.iterator();	}	/**	 ** Method to return the equivalent PortProto of this PortInst's PortProto.	 * This is typically used to find the PortProto in the schematic view.	 * @return the equivalent PortProto of this PortInst's PortProto, or null if not found.	 */    public PortProto getProtoEquivalent()     {		return portProto instanceof Export ? ((Export)portProto).getEquivalent() : portProto;    }    	/**	 * Method to return the bounds of this PortInst.	 * The bounds are determined by getting the Poly and bounding it.	 * @return the bounds of this PortInst.	 */	public Rectangle2D getBounds()	{		return getPoly().getBounds2D();	}    public EPoint getCenter()    {        return getPoly().getCenter();    }	/**	 * Method to return the Poly that describes this PortInst.	 * @return the Poly that describes this PortInst.	 */	public Poly getPoly()	{		return nodeInst.getShapeOfPort(portProto);	}	/**	 * Method to add all displayable Variables on this PortInsts to an array of Poly objects.	 * @param rect a rectangle describing the bounds of the NodeInst on which the PortInsts reside.	 * @param polys an array of Poly objects that will be filled with the displayable Variables.	 * @param start the starting index in the array of Poly objects to fill with displayable Variables.	 * @param wnd window in which the Variables will be displayed.	 * @param multipleStrings true to break multiline text into multiple Polys.	 * @return the number of Polys that were added.	 */	public int addDisplayableVariables(Rectangle2D rect, Poly [] polys, int start, EditWindow0 wnd, boolean multipleStrings)	{		if (super.numDisplayableVariables(multipleStrings) == 0) return 0;		Poly portPoly = getPoly();		int justAdded = super.addDisplayableVariables(portPoly.getBounds2D(), polys, start, wnd, multipleStrings);		for(int i=0; i<justAdded; i++)			polys[start+i].setPort(getPortProto());		return justAdded;	}	/**	 * Method to describe this NodeInst as a string.     * @param withQuotes to wrap description between quotes	 * @return a description of this NodeInst as a string.	 */	public String describe(boolean withQuotes)	{        String info = nodeInst.describe(false) + "." + portProto.getName();        return (withQuotes) ? "'"+info+"'" : info;	}	/**	 * Returns a printable version of this PortInst.	 * @return a printable version of this PortInst.	 */	public String toString()	{		return "port " + describe(true);	}	/**	 * This function is to compare PortInst elements. Initiative CrossLibCopy 	 * @param obj Object to compare to	 * @param buffer To store comparison messages in case of failure	 * @return True if objects represent same PortInst	 */    public boolean compare(Object obj, StringBuffer buffer)	{		if (this == obj) return (true);        // Better if compare classes? but it will crash with obj=null        if (obj == null || getClass() != obj.getClass())            return (false);        PortInst no = (PortInst)obj;        Set<Connection> noCheckAgain = new HashSet<Connection>();		for (Iterator<Connection> it = getConnections(); it.hasNext(); )		{			Connection c = it.next();			boolean found = false;			for (Iterator<Connection> noIt = no.getConnections(); noIt.hasNext(); )			{				Connection noC = noIt.next();				if (noCheckAgain.contains(noC)) continue;				if (c.getLocation().equals(noC.getLocation()))				{					found = true;                    noCheckAgain.add(noC);                    break;				}			}            // No correspoding NodeInst found            if (!found)            {	            if (buffer != null)	                buffer.append("No corresponding port " + this + " found in " + no + " at the location " + c.getLocation() + " \n");	            return (false);            }		}        		// @TODO GVG Check this		// Just compare connections?? or just poly for now?		Poly poly = getPoly();		Poly noPoly = no.getPoly();		boolean check = poly.compare(noPoly, buffer);		if (!check && buffer != null)			buffer.append("No same ports detected in " + portProto.getName() + " and " + no.getPortProto().getName() + "\n");        return (check);    }    /**     * Overrides ElectricObject.isLinked().  This is because a PortInst is a derived     * database object, and is never explicitly linked or unlinked.  It represents a NodeInst     * and PortProto pair. So, this method really returns it's nodeinst's isLinked()     * value.     * @return true if the object is linked into the database, false if not.     */	public boolean isLinked()	{		try		{			return nodeInst != null && nodeInst.isLinked() && nodeInst.getPortInst(getPortIndex()) == this;		} catch (IndexOutOfBoundsException e)		{			return false;		}	}	/**	 * Returns database to which this PortInst belongs.	 * Some objects are not in database, for example Geometrics in PaletteFrame.     * Method returns null for non-database objects.     * @return database to which this PortInst belongs.	 */	public EDatabase getDatabase() { return nodeInst.getDatabase(); }    public Poly computeTextPoly(EditWindow0 wnd, Variable var, Name name)    {        Poly poly = null;        if (var != null)        {            Rectangle2D bounds = getPoly().getBounds2D();            Poly [] polys = getPolyList(var, bounds.getCenterX(), bounds.getCenterY(), wnd, false);            if (polys.length > 0)            {                poly = polys[0];                poly.transform(getNodeInst().rotateOut());            }        }        if (poly != null)            poly.setExactTextBounds(wnd, this);        return poly;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -