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