designrulespanel.java

来自「The ElectricTM VLSI Design System is an 」· Java 代码 · 共 1,361 行 · 第 1/4 页

JAVA
1,361
字号
/* -*- tab-width: 4 -*- * * Electric(tm) VLSI Design System * * File: DesignRulesTab.java * * 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.user.dialogs;import com.sun.electric.database.text.TextUtils;import com.sun.electric.database.geometry.DBMath;import com.sun.electric.technology.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.Collections;import javax.swing.*;import javax.swing.event.DocumentEvent;import javax.swing.event.DocumentListener;/** * Class to handle the "Design Rules" tab of the Preferences frame. */public class DesignRulesPanel extends JPanel{    private Technology curTech;	private JList designRulesFromList, designRulesToList, designRulesNodeList;	private DefaultListModel designRulesToModel;	private DRCRules drRules;	private boolean designRulesUpdating = false;	private boolean [] designRulesValidLayers;	private List<DRCTemplate> wideSpacingRules;	private Foundry.Type foundry;	/** Creates new form DesignRulesTab */	public DesignRulesPanel()	{		initComponents();		// make all text fields select-all when entered	    EDialog.makeTextFieldSelectAllOnTab(drNodeWidth);	    EDialog.makeTextFieldSelectAllOnTab(drNodeHeight);	    EDialog.makeTextFieldSelectAllOnTab(drNodeRule);	    EDialog.makeTextFieldSelectAllOnTab(drLayerWidth);	    EDialog.makeTextFieldSelectAllOnTab(drLayerWidthRule);	    EDialog.makeTextFieldSelectAllOnTab(drLayerArea);	    EDialog.makeTextFieldSelectAllOnTab(drLayerAreaRule);	    EDialog.makeTextFieldSelectAllOnTab(drLayerEAreaRule);	    EDialog.makeTextFieldSelectAllOnTab(drLayerEnclosure);	    EDialog.makeTextFieldSelectAllOnTab(drNormalConnected);	    EDialog.makeTextFieldSelectAllOnTab(drNormalConnectedRule);	    EDialog.makeTextFieldSelectAllOnTab(drNormalUnconnected);	    EDialog.makeTextFieldSelectAllOnTab(drNormalUnconnectedRule);	    EDialog.makeTextFieldSelectAllOnTab(drNormalEdge);	    EDialog.makeTextFieldSelectAllOnTab(drNormalEdgeRule);	    EDialog.makeTextFieldSelectAllOnTab(drMultiUnconnected);	    EDialog.makeTextFieldSelectAllOnTab(drMultiUnconnectedRule);	    EDialog.makeTextFieldSelectAllOnTab(drLengths);	    EDialog.makeTextFieldSelectAllOnTab(drSpacings);	    EDialog.makeTextFieldSelectAllOnTab(drSpacingsRule);	    EDialog.makeTextFieldSelectAllOnTab(drWidths);	}	/**	 * Method called at the start of the frame.	 * Caches current values and displays them in the Design Rules tab.	 */	public void init(Technology tech, Foundry.Type foun, DRCRules drcR)	{        curTech = tech;        foundry = foun;        drRules = drcR;		if (drRules == null)		{			drShowOnlyLinesWithRules.setEnabled(false);			drNormalConnected.setEnabled(false);			drNormalConnectedRule.setEnabled(false);			drNormalUnconnected.setEnabled(false);			drNormalUnconnectedRule.setEnabled(false);			drNormalEdge.setEnabled(false);			drNormalEdgeRule.setEnabled(false);			drWidths.setEnabled(false);			drLengths.setEnabled(false);			drSpacings.setEnabled(false);			drMultiUnconnected.setEnabled(false);			drMultiUnconnectedRule.setEnabled(false);			return;		}		// figure out which layers are valid        int numLayers = curTech.getNumLayers();		designRulesValidLayers = new boolean[numLayers];		for(int i=0; i<numLayers; i++) designRulesValidLayers[i] = false;		for(Iterator<PrimitiveNode> it = curTech.getNodes(); it.hasNext(); )		{			PrimitiveNode np = it.next();			if (np.isNotUsed()) continue;			Technology.NodeLayer [] layers = np.getLayers();			for(Technology.NodeLayer nl : layers)			{				Layer layer = nl.getLayer();				designRulesValidLayers[layer.getIndex()] = true;			}		}		for(Iterator<ArcProto> it = curTech.getArcs(); it.hasNext(); )		{			ArcProto ap = it.next();			if (ap.isNotUsed()) continue;			for(Iterator<Layer> lIt = ap.getLayerIterator(); lIt.hasNext(); )			{				Layer layer = lIt.next();				designRulesValidLayers[layer.getIndex()] = true;			}		}		// build the "node" list		DefaultListModel designRulesNodeModel = new DefaultListModel();		designRulesNodeList = new JList(designRulesNodeModel);		designRulesNodeList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);		drNodeList.setViewportView(designRulesNodeList);		designRulesNodeList.clearSelection();		designRulesNodeList.addMouseListener(new MouseAdapter()		{			public void mouseClicked(MouseEvent evt) { designRulesGetSelectedNode(); }		});		for(Iterator<PrimitiveNode> it = curTech.getNodes(); it.hasNext(); )		{			PrimitiveNode np = it.next();			designRulesNodeModel.addElement(np.getName());		}		designRulesNodeList.setSelectedIndex(0);		// build the "from" layer list		DefaultListModel designRulesFromModel = new DefaultListModel();		designRulesFromList = new JList(designRulesFromModel);		designRulesFromList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);		drFromList.setViewportView(designRulesFromList);		designRulesFromList.clearSelection();		designRulesFromList.addMouseListener(new MouseAdapter()		{			public void mouseClicked(MouseEvent evt) { designRulesGetSelectedLayerLoadDRCToList(); }		});        for(int i=0; i<designRulesValidLayers.length; i++)		{			if (!designRulesValidLayers[i]) continue;            designRulesFromModel.addElement(curTech.getLayer(i).getName());		}		designRulesFromList.setSelectedIndex(0);		// build the "to" layer list		designRulesToModel = new DefaultListModel();		designRulesToList = new JList(designRulesToModel);		designRulesToList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);		drToList.setViewportView(designRulesToList);		designRulesToList.clearSelection();		designRulesToList.addMouseListener(new MouseAdapter()		{			public void mouseClicked(MouseEvent evt) { designRulesShowSelectedLayerRules(); }		});		// catch the "show only lines with valid rules" checkbox		drShowOnlyLinesWithRules.addMouseListener(new MouseAdapter()		{			public void mouseClicked(MouseEvent evt) { designRulesGetSelectedLayerLoadDRCToList(); }		});		// catch changes to the width rules popup		drSpacingsList.addActionListener(new ActionListener()		{			public void actionPerformed(ActionEvent evt) { widePopupChanged(false); }		});		// have changes to edit fields get detected immediately		designRulesUpdating = false;        DRCDocumentListener listener = new DRCDocumentListener(this, drNormalConnected, DRCDocType.SPACING);		drNormalConnected.getDocument().addDocumentListener(listener);		drNormalConnectedRule.getDocument().addDocumentListener(listener);        listener = new DRCDocumentListener(this, drNormalUnconnected, DRCDocType.SPACING);		drNormalUnconnected.getDocument().addDocumentListener(listener);		drNormalUnconnectedRule.getDocument().addDocumentListener(listener);        listener = new DRCDocumentListener(this, drNormalEdge, DRCDocType.SPACING);		drNormalEdge.getDocument().addDocumentListener(listener);		drNormalEdgeRule.getDocument().addDocumentListener(listener);        listener = new DRCDocumentListener(this, drLayerWidth, DRCDocType.MINIMUM);		drLayerWidth.getDocument().addDocumentListener(listener);		drLayerWidthRule.getDocument().addDocumentListener(listener);        listener = new DRCDocumentListener(this, drLayerArea, DRCDocType.MINIMUM);		drLayerArea.getDocument().addDocumentListener(listener);		drLayerAreaRule.getDocument().addDocumentListener(listener);        listener = new DRCDocumentListener(this, drLayerEnclosure, DRCDocType.MINIMUM);		drLayerEnclosure.getDocument().addDocumentListener(listener);		drLayerEAreaRule.getDocument().addDocumentListener(listener);        listener = new DRCDocumentListener(this, drSpacings, DRCDocType.SPACING);		drWidths.getDocument().addDocumentListener(listener);		drLengths.getDocument().addDocumentListener(listener);		drSpacingsRule.getDocument().addDocumentListener(listener);		drSpacings.getDocument().addDocumentListener(listener);        listener = new DRCDocumentListener(this, drMultiUnconnected, DRCDocType.SPACING);		drMultiUnconnected.getDocument().addDocumentListener(listener);		drMultiUnconnectedRule.getDocument().addDocumentListener(listener);        listener = new DRCDocumentListener(this, drNodeWidth, DRCDocType.NODE);		drNodeWidth.getDocument().addDocumentListener(listener);		drNodeHeight.getDocument().addDocumentListener(listener);		drNodeRule.getDocument().addDocumentListener(listener);		designRulesGetSelectedLayerLoadDRCToList();	}	/**	 * Class to handle special changes to design rules.	 */    private enum DRCDocType {NODE, MINIMUM, SPACING}	private static class DRCDocumentListener implements DocumentListener	{		private DesignRulesPanel frame;        private JTextField field;        private DRCDocType type;		DRCDocumentListener(DesignRulesPanel dialog, JTextField text, DRCDocType type)        {            this.frame = dialog;            this.field = text;            this.type = type;        }        private void update()        {            switch (type)            {                case NODE:                    frame.editChangedOnNodeRules(field);                    break;                case MINIMUM:                    frame.editChangedOnMinRules(field);                    break;                case SPACING:                    frame.designRulesEditChanged(field);                    break;            }        }		public void changedUpdate(DocumentEvent e) { update(); }		public void insertUpdate(DocumentEvent e) { update(); }		public void removeUpdate(DocumentEvent e) { update(); }	}    private int getLayerFromToIndex()    {        // get layer information		int layer1 = designRulesGetSelectedLayer(designRulesFromList);		if (layer1 < 0) return -1;		int layer2 = designRulesGetSelectedLayer(designRulesToList);		if (layer2 < 0) return -1;        return (drRules.getRuleIndex(layer1, layer2));    }    /**	 * Method called when the user changes any edit field handling node rules     * @param field     */	private void editChangedOnNodeRules(JTextField field)	{        assert(drNodeWidth == field || drNodeHeight == field || drNodeRule == field);		if (designRulesUpdating) return;        designRulesUpdating = true;		// pickup changes to node rules		int nodeIndex = designRulesNodeList.getSelectedIndex();		String widthText = drNodeWidth.getText().trim();		String heightText = drNodeHeight.getText().trim();		double width = -1, height = -1;		if (widthText.length() > 0 || heightText.length() > 0)		{			width = TextUtils.atof(widthText);			height = TextUtils.atof(heightText);		}        double[] vals = {width, height};        DRCTemplate tmp = new DRCTemplate(drNodeRule.getText(),                DRCTemplate.DRCMode.ALL.mode(), DRCTemplate.DRCRuleType.NODSIZ,                0, 0, null, null, vals, -1);        drRules.addRule(nodeIndex, tmp, DRCTemplate.DRCRuleType.NONE, false);        designRulesUpdating = false;    }    /**	 * Method called when the user changes any edit field.     * @param field     */	private void editChangedOnMinRules(JTextField field)	{		if (designRulesUpdating) return;        designRulesUpdating = true;		// get layer information		int layer1 = designRulesGetSelectedLayer(designRulesFromList);		if (layer1 < 0) return;		Layer layer = curTech.getLayer(layer1);        String minSizeText, minSizeRuleName;        double minSize;        // width related fields touched        if (field == drLayerWidth)        {            // pickup changes to layer minimum size rule

⌨️ 快捷键说明

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