designrulespanel.java
来自「The ElectricTM VLSI Design System is an 」· Java 代码 · 共 1,361 行 · 第 1/4 页
JAVA
1,361 行
minSizeText = drLayerWidth.getText().trim(); minSize = TextUtils.atof(minSizeText); minSizeRuleName = drLayerWidthRule.getText().trim(); if (minSizeText.length() > 0 && minSizeRuleName.length() > 0) drRules.setMinValue(layer, minSizeRuleName, minSize, DRCTemplate.DRCRuleType.MINWID); } else if (field == drLayerArea) { // pickup changes to layer min area rule minSizeText = drLayerArea.getText().trim(); minSize = TextUtils.atof(minSizeText); minSizeRuleName = drLayerAreaRule.getText().trim(); if (minSizeText.length() > 0) drRules.setMinValue(layer, minSizeRuleName, minSize, DRCTemplate.DRCRuleType.MINAREA); } else if (field == drLayerEnclosure) { // pickup changes to layer min enclose area rule minSizeText = drLayerEnclosure.getText().trim(); minSize = TextUtils.atof(minSizeText); minSizeRuleName = drLayerEAreaRule.getText().trim(); if (minSizeText.length() > 0) drRules.setMinValue(layer, minSizeRuleName, minSize, DRCTemplate.DRCRuleType.MINENCLOSEDAREA); } else System.out.println("Invalid field in editChangedOnMinRules"); designRulesUpdating = false; } /** * Method called when the user changes any edit field. * @param field */ private void designRulesEditChanged(JTextField field) { if (designRulesUpdating) return; designRulesUpdating = true; // get layer information int layer1 = designRulesGetSelectedLayer(designRulesFromList); if (layer1 < 0) return; int dindex = getLayerFromToIndex(); if (dindex == -1) return; List<DRCTemplate> list = new ArrayList<DRCTemplate>(); double value; if (field == drNormalConnected) { // get new normal spacing values value = TextUtils.atof(drNormalConnected.getText()); list.add(new DRCTemplate(drNormalConnectedRule.getText(), foundry.getMode(), DRCTemplate.DRCRuleType.CONSPA, 0, 0, null, null, new double[]{value}, -1)); drRules.setSpacingRules(dindex, list, DRCTemplate.DRCRuleType.SPACING, false); } else if (field == drNormalUnconnected) { value = TextUtils.atof(drNormalUnconnected.getText()); list.add(new DRCTemplate(drNormalUnconnectedRule.getText(), foundry.getMode(), DRCTemplate.DRCRuleType.UCONSPA, 0, 0, null, null, new double[]{value}, -1)); drRules.setSpacingRules(dindex, list, DRCTemplate.DRCRuleType.SPACING, false); } else if (field == drMultiUnconnected) { value = TextUtils.atof(drMultiUnconnected.getText()); list.add(new DRCTemplate(drMultiUnconnectedRule.getText(), foundry.getMode(), DRCTemplate.DRCRuleType.UCONSPA2D, 0, 0, null, null, new double[]{value}, 1)); drRules.setSpacingRules(dindex, list, DRCTemplate.DRCRuleType.UCONSPA2D, false); } else if (field == drNormalEdge) { // get new edge values value = TextUtils.atof(drNormalEdge.getText()); list.add(new DRCTemplate(drNormalEdgeRule.getText(), foundry.getMode(), DRCTemplate.DRCRuleType.CONSPA, 0, 0, null, null, new double[]{value}, -1)); drRules.setSpacingRules(dindex, list, DRCTemplate.DRCRuleType.SPACINGE, false); } else if (field == drSpacings) { // get new wide spacing values int curWid = drSpacingsList.getSelectedIndex();// int curWid = drSpacingsList.getItemCount() - 1; if (curWid >= 0 && curWid < wideSpacingRules.size()) { DRCTemplate wr = wideSpacingRules.get(curWid); double maxW = TextUtils.atof(drWidths.getText().trim()); double minL = TextUtils.atof(drLengths.getText().trim()); double minV = TextUtils.atof(drSpacings.getText().trim()); String newName = drSpacingsRule.getText().trim(); boolean diffW = (DBMath.isGreaterThan(maxW, 0) && !DBMath.areEquals(wr.maxWidth, maxW)); boolean diffL = (DBMath.isGreaterThan(minL, 0) && !DBMath.areEquals(wr.minLength, minL)); boolean diffV = (DBMath.isGreaterThan(minV, 0) && !DBMath.areEquals(wr.getValue(0), minV)); boolean diffN = !wr.ruleName.equals(newName); if (diffW || diffL || diffV || diffN) // they have to be > 0 { if (diffW) wr.maxWidth = maxW; if (diffL) wr.minLength = minL; if (diffV) wr.setValue(0, minV); if (diffN) wr.ruleName = newName; drRules.setSpacingRules(dindex, wideSpacingRules, DRCTemplate.DRCRuleType.SPACING, true); } } } designRulesUpdating = false; } /** * Method to handle selection of a different node in the top scroll list. */ private void designRulesGetSelectedNode() { designRulesUpdating = true; int nodeIndex = designRulesNodeList.getSelectedIndex(); DRCTemplate nr = drRules.getRule(nodeIndex, DRCTemplate.DRCRuleType.NODSIZ); drNodeWidth.setText(""); drNodeHeight.setText(""); drNodeRule.setText(""); if (nr != null) { drNodeWidth.setText(TextUtils.formatDouble(nr.getValue(0))); drNodeHeight.setText(TextUtils.formatDouble(nr.getValue(1))); drNodeRule.setText(nr.ruleName); } designRulesUpdating = false; } /** * Method called when the wide rules popup changes. */ private void widePopupChanged(boolean delete) { int index = drSpacingsList.getSelectedIndex(); if (index < 0 || index >= wideSpacingRules.size()) return; designRulesUpdating = true; DRCTemplate tmp = wideSpacingRules.get(index); drWidths.setText(""); drLengths.setText(""); drSpacingsRule.setText(""); drSpacings.setText(""); // Delete the wde rule if (delete) { drRules.deleteRule(index, tmp); wideSpacingRules.remove(tmp); drSpacingsList.removeItemAt(index); if (wideSpacingRules.size() != 0) drSpacingsList.setSelectedIndex(0); } else { if (tmp.maxWidth != 0) drWidths.setText(Double.toString(tmp.maxWidth)); if (tmp.minLength != 0) drLengths.setText(Double.toString(tmp.minLength)); drSpacings.setText(Double.toString(tmp.getValue(0))); drSpacingsRule.setText(tmp.ruleName); } designRulesUpdating = false; } /** * Method called when the user clicks on the "from layer" list or the "show only lines with rules" checkbox. */ private void designRulesGetSelectedLayerLoadDRCToList() { designRulesUpdating = true; // show layer information boolean onlyvalid = drShowOnlyLinesWithRules.isSelected(); int j = designRulesGetSelectedLayer(designRulesFromList); if (j >= 0) { designRulesToModel.clear(); int count = 0; for(int i=0; i<designRulesValidLayers.length; i++) { if (!designRulesValidLayers[i]) continue; int dindex = drRules.getRuleIndex(j, i); String line = drMakeToListLine(dindex, i, onlyvalid); if (line.length() == 0) continue; designRulesToModel.addElement(line); count++; } if (count > 0) designRulesToList.setSelectedIndex(0); } // show minimum layer size Layer layer = curTech.getLayer(j); DRCTemplate lr = drRules.getMinValue(layer, DRCTemplate.DRCRuleType.MINWID); if (lr != null) { drLayerWidth.setText(TextUtils.formatDouble(lr.getValue(0))); drLayerWidthRule.setText(lr.ruleName); } else { drLayerWidth.setText(""); drLayerWidthRule.setText(""); } // Show min area lr = drRules.getMinValue(layer, DRCTemplate.DRCRuleType.MINAREA); if (lr != null) { drLayerArea.setText(TextUtils.formatDouble(lr.getValue(0))); drLayerAreaRule.setText(lr.ruleName); } else { drLayerArea.setText(""); drLayerAreaRule.setText(""); } // Show min enclosure area lr = drRules.getMinValue(layer, DRCTemplate.DRCRuleType.MINENCLOSEDAREA); if (lr != null) { drLayerEnclosure.setText(TextUtils.formatDouble(lr.getValue(0))); drLayerEAreaRule.setText(lr.ruleName); } else { drLayerEnclosure.setText(""); drLayerEAreaRule.setText(""); } designRulesUpdating = false; designRulesShowSelectedLayerRules(); } /** * Method called when the user clicks in the "to layer" list. */ private void designRulesShowSelectedLayerRules() { if (designRulesUpdating) return; // show layer information designRulesUpdating = true; drNormalConnected.setText(""); drNormalConnectedRule.setText(""); drNormalUnconnected.setText(""); drNormalUnconnectedRule.setText(""); drMultiUnconnected.setText(""); drMultiUnconnectedRule.setText(""); drNormalEdge.setText(""); drNormalEdgeRule.setText(""); int dindex = getLayerFromToIndex(); if (dindex != -1) {// double wideLimit = 0; List<DRCTemplate> spacingRules = drRules.getSpacingRules(dindex, DRCTemplate.DRCRuleType.SPACING, false); for (DRCTemplate tmp : spacingRules) { if (tmp.ruleType == DRCTemplate.DRCRuleType.CONSPA) { drNormalConnected.setText(Double.toString(tmp.getValue(0))); drNormalConnectedRule.setText(tmp.ruleName); } else if (tmp.ruleType == DRCTemplate.DRCRuleType.UCONSPA) { drNormalUnconnected.setText(Double.toString(tmp.getValue(0))); drNormalUnconnectedRule.setText(tmp.ruleName); }// if (tmp.maxWidth > 0) wideLimit = tmp.maxWidth; } spacingRules = drRules.getSpacingRules(dindex, DRCTemplate.DRCRuleType.SPACING, true); Collections.sort(spacingRules, DRCTemplate.templateSort); wideSpacingRules = new ArrayList<DRCTemplate>(); drSpacingsList.removeAllItems(); // Not iterator otherwise the order is lost for (DRCTemplate tmp : spacingRules) { if (tmp.ruleType != DRCTemplate.DRCRuleType.UCONSPA) continue; wideSpacingRules.add(tmp); drSpacingsList.addItem("Rule " + wideSpacingRules.size()); } // To stop the update of blank information designRulesUpdating = true; drWidths.setText(""); drLengths.setText(""); drSpacingsRule.setText(""); drSpacings.setText(""); designRulesUpdating = false; if (wideSpacingRules.size() != 0) drSpacingsList.setSelectedIndex(0); spacingRules = drRules.getSpacingRules(dindex, DRCTemplate.DRCRuleType.UCONSPA2D, false); assert(spacingRules.size() <= 1); if (spacingRules.size() == 1) { DRCTemplate cutTmp = spacingRules.get(0); drMultiUnconnected.setText(Double.toString(cutTmp.getValue(0))); drMultiUnconnectedRule.setText(cutTmp.ruleName); } spacingRules = drRules.getSpacingRules(dindex, DRCTemplate.DRCRuleType.SPACINGE, false); for (DRCTemplate tmp : spacingRules) { // Any is fine drNormalEdge.setText(Double.toString(tmp.getValue(0))); drNormalEdgeRule.setText(tmp.ruleName); } drAddRule.setEnabled(drRules.doesAllowMultipleWideRules(dindex)); } designRulesUpdating = false; } private int designRulesGetSelectedLayer(JList theList) { int lineNo = theList.getSelectedIndex(); if (lineNo < 0) return -1; String lName = (String)theList.getSelectedValue(); int termPos = lName.indexOf(" ("); if (termPos >= 0) lName = lName.substring(0, termPos); for(int layer=0; layer<designRulesValidLayers.length; layer++) if (lName.equals(curTech.getLayer(layer).getName())) return layer; return -1; } private String drMakeToListLine(int dindex, int lindex, boolean onlyValid) { boolean gotRule = false; List<DRCTemplate> spacingRules = drRules.getSpacingRules(dindex, DRCTemplate.DRCRuleType.SPACING, false); for (DRCTemplate tmp : spacingRules) { if (tmp.getValue(0) > 0) gotRule = true; } spacingRules = drRules.getSpacingRules(dindex, DRCTemplate.DRCRuleType.SPACING, true); for (DRCTemplate tmp : spacingRules) { if (tmp.getValue(0) > 0) gotRule = true; } spacingRules = drRules.getSpacingRules(dindex, DRCTemplate.DRCRuleType.UCONSPA2D, false); assert(spacingRules.size() <= 1);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?