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 + -
显示快捷键?