📄 techeditwizarddata.java
字号:
{ if (i > 0) pw.print(", "); pw.print("\"" + via_overhang_inline[i].rule + "\""); } pw.println(");"); pw.println(); pw.println("###### ANTENNA RULES #####"); pw.println("$poly_antenna_ratio = " + TextUtils.formatDouble(poly_antenna_ratio) + ";"); pw.print("@metal_antenna_ratio = ("); for(int i=0; i<num_metal_layers; i++) { if (i > 0) pw.print(", "); pw.print(TextUtils.formatDouble(metal_antenna_ratio[i])); } pw.println(");"); pw.println(); pw.println("###### GDS-II LAYERS #####"); pw.println("$gds_diff_layer = " + gds_diff_layer + ";"); pw.println("$gds_poly_layer = " + gds_poly_layer + ";"); pw.println("$gds_nplus_layer = " + gds_nplus_layer + ";"); pw.println("$gds_pplus_layer = " + gds_pplus_layer + ";"); pw.println("$gds_nwell_layer = " + gds_nwell_layer + ";"); pw.println("$gds_contact_layer = " + gds_contact_layer + ";"); pw.print("@gds_metal_layer = ("); for(int i=0; i<num_metal_layers; i++) { if (i > 0) pw.print(", "); pw.print(gds_metal_layer[i]); } pw.println(");"); pw.print("@gds_via_layer = ("); for(int i=0; i<num_metal_layers-1; i++) { if (i > 0) pw.print(", "); pw.print(gds_via_layer[i]); } pw.println(");"); pw.println(); pw.println("## Device marking layer"); pw.println("$gds_marking_layer = " + gds_marking_layer + ";"); pw.println(); pw.println("# End of techfile"); } /************************************** WRITE XML FILE **************************************/ void writeXML() { String errorMessage = errorInData(); if (errorMessage != null) { Job.getUserInterface().showErrorMessage("ERROR: " + errorMessage, "Missing Technology Data"); return; } String fileName = OpenFile.chooseOutputFile(FileType.XML, "Technology XML File", "Technology.xml"); if (fileName == null) return; try { dumpXMLFile(fileName); } catch (IOException e) { System.out.println("Error writing XML file"); return; } } /** * Method to create the XML version of a PrimitiveNode representing a pin * @return */ private Xml.PrimitiveNode makeXmlPrimitivePin(List<Xml.PrimitiveNode> nodes, String name, double size, SizeOffset so, Xml.NodeLayer... list) { List<Xml.NodeLayer> nodesList = new ArrayList<Xml.NodeLayer>(list.length); List<Xml.PrimitivePort> nodePorts = new ArrayList<Xml.PrimitivePort>(); List<String> portNames = new ArrayList<String>(); for (Xml.NodeLayer lb : list) { if (lb == null) continue; // in case the pwell layer off nodesList.add(lb); } portNames.add(name); nodePorts.add(makeXmlPrimitivePort(name.toLowerCase(), 0, 180, 0, null, 0, 0, 0, 0, portNames)); return makeXmlPrimitive(nodes, name + "-Pin", PrimitiveNode.Function.PIN, size, size, 0, 0, so, nodesList, nodePorts, null, true); } /** * Method to creat the XML version of a PrimitiveNode representing a contact * @return */ private Xml.PrimitiveNode makeXmlPrimitiveCon(List<Xml.PrimitiveNode> nodes, String name, double size, SizeOffset so, List<String> portNames, Xml.NodeLayer... list) { List<Xml.NodeLayer> nodesList = new ArrayList<Xml.NodeLayer>(list.length); List<Xml.PrimitivePort> nodePorts = new ArrayList<Xml.PrimitivePort>(); for (Xml.NodeLayer lb : list) { if (lb == null) continue; // in case the pwell layer off nodesList.add(lb); } nodePorts.add(makeXmlPrimitivePort(name.toLowerCase(), 0, 180, 0, null, 0, 0, 0, 0, portNames)); return makeXmlPrimitive(nodes, name + "-Con", PrimitiveNode.Function.CONTACT, size, size, 0, 0, so, nodesList, nodePorts, null, false); } /** * Method to create the XML version of a PrimitiveNode * @return */ private Xml.PrimitiveNode makeXmlPrimitive(List<Xml.PrimitiveNode> nodes, String name, PrimitiveNode.Function function, double width, double height, double ppLeft, double ppBottom, SizeOffset so, List<Xml.NodeLayer> nodeLayers, List<Xml.PrimitivePort> nodePorts, PrimitiveNode.NodeSizeRule nodeSizeRule, boolean isArcsShrink) { Xml.PrimitiveNode n = new Xml.PrimitiveNode(); n.name = name; n.function = function; n.shrinkArcs = isArcsShrink;// n.square = isSquare();// n.canBeZeroSize = isCanBeZeroSize();// n.wipes = isWipeOn1or2();// n.lockable = isLockedPrim();// n.edgeSelect = isEdgeSelect();// n.skipSizeInPalette = isSkipSizeInPalette();// n.notUsed = isNotUsed();// n.lowVt = isNodeBitOn(PrimitiveNode.LOWVTBIT);// n.highVt = isNodeBitOn(PrimitiveNode.HIGHVTBIT);// n.nativeBit = isNodeBitOn(PrimitiveNode.NATIVEBIT);// n.od18 = isNodeBitOn(PrimitiveNode.OD18BIT);// n.od25 = isNodeBitOn(PrimitiveNode.OD25BIT);// n.od33 = isNodeBitOn(PrimitiveNode.OD33BIT);// PrimitiveNode.NodeSizeRule nodeSizeRule = getMinSizeRule();// EPoint minFullSize = nodeSizeRule != null ?// EPoint.fromLambda(0.5*nodeSizeRule.getWidth(), 0.5*nodeSizeRule.getHeight()) :// EPoint.fromLambda(0.5*getDefWidth(), 0.5*getDefHeight()); EPoint minFullSize = EPoint.fromLambda(0.5*width, 0.5*height); EPoint topLeft = EPoint.fromLambda(ppLeft, ppBottom + height); EPoint size = EPoint.fromLambda(width, height); double getDefWidth = width, getDefHeight = height; if (function == PrimitiveNode.Function.PIN && isArcsShrink) {// assert getNumPorts() == 1;// assert nodeSizeRule == null;// PrimitivePort pp = getPort(0);// assert pp.getLeft().getMultiplier() == -0.5 && pp.getRight().getMultiplier() == 0.5 && pp.getBottom().getMultiplier() == -0.5 && pp.getTop().getMultiplier() == 0.5;// assert pp.getLeft().getAdder() == -pp.getRight().getAdder() && pp.getBottom().getAdder() == -pp.getTop().getAdder(); minFullSize = EPoint.fromLambda(ppLeft, ppBottom); }// DRCTemplate nodeSize = xmlRules.getRule(pnp.getPrimNodeIndexInTech(), DRCTemplate.DRCRuleType.NODSIZ);// SizeOffset so = getProtoSizeOffset(); if (so != null && (so.getLowXOffset() == 0 && so.getHighXOffset() == 0 && so.getLowYOffset() == 0 && so.getHighYOffset() == 0)) so = null; n.sizeOffset = so;// if (!minFullSize.equals(EPoint.ORIGIN))// n.diskOffset = minFullSize;// if (so != null) {// EPoint p2 = EPoint.fromGrid(// minFullSize.getGridX() - ((so.getLowXGridOffset() + so.getHighXGridOffset()) >> 1),// minFullSize.getGridY() - ((so.getLowYGridOffset() + so.getHighYGridOffset()) >> 1));// n.diskOffset.put(Integer.valueOf(1), minFullSize);// n.diskOffset.put(Integer.valueOf(2), p2);// n.diskOffset.put(Integer.valueOf(2), minFullSize);// }// n.defaultWidth.addLambda(DBMath.round(getDefWidth)); // - 2*minFullSize.getLambdaX());// n.defaultHeight.addLambda(DBMath.round(getDefHeight)); // - 2*minFullSize.getLambdaY()); ERectangle baseRectangle = ERectangle.fromGrid(topLeft.getGridX(), topLeft.getGridY(), size.getGridX(), size.getGridY());/* n.nodeBase = baseRectangle;*/// List<Technology.NodeLayer> nodeLayers = Arrays.asList(getLayers());// List<Technology.NodeLayer> electricalNodeLayers = nodeLayers;// if (getElectricalLayers() != null)// electricalNodeLayers = Arrays.asList(getElectricalLayers()); boolean isSerp = false; //getSpecialType() == PrimitiveNode.SERPTRANS; if (nodeLayers != null) n.nodeLayers.addAll(nodeLayers);// int m = 0;// for (Technology.NodeLayer nld: electricalNodeLayers) {// int j = nodeLayers.indexOf(nld);// if (j < 0) {// n.nodeLayers.add(nld.makeXml(isSerp, minFullSize, false, true));// continue;// }// while (m < j)// n.nodeLayers.add(nodeLayers.get(m++).makeXml(isSerp, minFullSize, true, false));// n.nodeLayers.add(nodeLayers.get(m++).makeXml(isSerp, minFullSize, true, true));// }// while (m < nodeLayers.size())// n.nodeLayers.add(nodeLayers.get(m++).makeXml(isSerp, minFullSize, true, false));// for (Iterator<PrimitivePort> pit = getPrimitivePorts(); pit.hasNext(); ) {// PrimitivePort pp = pit.next();// n.ports.add(pp.makeXml(minFullSize));// } n.specialType = PrimitiveNode.NORMAL; // getSpecialType();// if (getSpecialValues() != null)// n.specialValues = getSpecialValues().clone(); if (nodeSizeRule != null) { n.nodeSizeRule = new Xml.NodeSizeRule(); n.nodeSizeRule.width = nodeSizeRule.getWidth(); n.nodeSizeRule.height = nodeSizeRule.getHeight(); n.nodeSizeRule.rule = nodeSizeRule.getRuleName(); }// n.spiceTemplate = "";//getSpiceTemplate(); // ports n.ports.addAll(nodePorts); nodes.add(n); return n; } /** * Method to create the XML version of a ArcProto * @param name * @param function * @return */ private Xml.ArcProto makeXmlArc(List<Xml.ArcProto> arcs, String name, com.sun.electric.technology.ArcProto.Function function, double ant, Xml.ArcLayer ... arcLayers) { Xml.ArcProto a = new Xml.ArcProto(); a.name = name; a.function = function; a.wipable = true;// a.curvable = false;// a.special = false;// a.notUsed = false;// a.skipSizeInPalette = false;// a.elibWidthOffset = getLambdaElibWidthOffset(); a.extended = true; a.fixedAngle = true; a.angleIncrement = 90; a.antennaRatio = DBMath.round(ant); for (Xml.ArcLayer al: arcLayers) { if (al == null) continue; // in case the pwell layer off a.arcLayers.add(al); } arcs.add(a); return a; } /** * Method to create the XML version of a Layer. * @return */ private Xml.Layer makeXmlLayer(List<Xml.Layer> layers, Map<Xml.Layer, WizardField> layer_width, String name, Layer.Function function, int extraf, EGraphics graph, char cifLetter, WizardField width, boolean pureLayerNode, boolean pureLayerPortArc) { Xml.Layer l = new Xml.Layer(); l.name = name; l.function = function; l.extraFunction = extraf; l.desc = graph; l.thick3D = 1; l.height3D = 1; l.mode3D = "NONE"; l.factor3D = 1; l.cif = "C" + cifLetter + cifLetter;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -