public Port() { super("Hello, World!"); mxGraph graph = new mxGraph() { // Ports are not used as terminals for edges, they are // only used to compute the graphical connection point public boolean isPort(Object cell) { mxGeometry geo = getCellGeometry(cell); return (geo != null) ? geo.isRelative() : false; } // Implements a tooltip that shows the actual // source and target of an edge public String getToolTipForCell(Object cell) { if (model.isEdge(cell)) { return convertValueToString(model.getTerminal(cell, true)) + " -> " + convertValueToString(model.getTerminal(cell, false)); } return super.getToolTipForCell(cell); } // Removes the folding icon and disables any folding public boolean isCellFoldable(Object cell, boolean collapse) { return false; } }; // Sets the default edge style Map<String, Object> style = graph.getStylesheet().getDefaultEdgeStyle(); style.put(mxConstants.STYLE_EDGE, mxEdgeStyle.ElbowConnector); Object parent = graph.getDefaultParent(); graph.getModel().beginUpdate(); try { mxCell v1 = (mxCell) graph.insertVertex(parent, null, "Hello", 20, 20, 100, 100, ""); v1.setConnectable(false); mxGeometry geo = graph.getModel().getGeometry(v1); // The size of the rectangle when the minus sign is clicked geo.setAlternateBounds(new mxRectangle(20, 20, 100, 50)); mxGeometry geo1 = new mxGeometry(0, 0.5, PORT_DIAMETER, PORT_DIAMETER); // Because the origin is at upper left corner, need to translate to // position the center of port correctly geo1.setOffset(new mxPoint(-PORT_RADIUS, -PORT_RADIUS)); geo1.setRelative(true); mxCell port1 = new mxCell(null, geo1, "shape=ellipse;perimter=ellipsePerimeter"); port1.setVertex(true); mxGeometry geo2 = new mxGeometry(1.0, 0.5, PORT_DIAMETER, PORT_DIAMETER); geo2.setOffset(new mxPoint(-PORT_RADIUS, -PORT_RADIUS)); geo2.setRelative(true); mxCell port2 = new mxCell(null, geo2, "shape=ellipse;perimter=ellipsePerimeter"); port2.setVertex(true); graph.addCell(port1, v1); graph.addCell(port2, v1); Object v2 = graph.insertVertex(parent, null, "World!", 240, 150, 80, 30); graph.insertEdge(parent, null, "Edge", port2, v2); } finally { graph.getModel().endUpdate(); } mxGraphComponent graphComponent = new mxGraphComponent(graph); getContentPane().add(graphComponent); graphComponent.setToolTips(true); }
@SuppressWarnings({"unchecked", "unchecked"}) // private mxGraphModel ExtractGraphFromSTD_INPUT() { private DirectedGraph<Object, ObjectEdge> ExtractGraphFromSTD_INPUT() { ActivityPort stdInput = getInput("STD_INPUT"); ActivityPort inputfile = getInput("INPUT_FILE_BASE"); /* @Todo: Reads directly from STD_INPUT. Should (be better) read from file (lots of .log .dot, .dat are generated by vivado workflow */ Collection<String> lines = UtilStr.SeparateComponents((String) stdInput.getValue(), "\n"); String startString = "<<BEGIN>><<" + (String) inputfile.getValue() + "_graph_minimized>>"; String stopString = "<<END>><<" + (String) inputfile.getValue() + "_graph_minimized>>"; boolean reading = false; // rebuild circuit graph DirectedGraph<Object, ObjectEdge> graph = new DefaultDirectedGraph<Object, ObjectEdge>(ObjectEdge.class); Map<String, Object> vertexMap = new HashMap<String, Object>(); // mxGraphModel circuitGraph = new mxGraphModel(); // circuitGraph.setCreateIds(false); // circuitGraph.beginUpdate(); // Object rootCell = circuitGraph.getRoot(); for (String line : lines) { if (reading) { if (line.equals(stopString)) { reading = false; break; } else { // rebuild graph Collection<String> wordsCollection = UtilStr.SeparateComponents(line, " "); String[] words = wordsCollection.toArray(new String[wordsCollection.size()]); int index = 1; int i; switch (words[0]) { case "Vertex": mxCell vertexCell = new mxCell(); vertexCell.setVertex(true); vertexCell.setId(words[1]); switch (words[2]) { case "cell": PLDConfigurableElement pldCell = new PLDConfigurableElement("Cell_0"); pldCell.setName(words[5]); pldCell.setInitialValue(words[4]); pldCell.setComponentType(ElectricalComponentType.INTRACHIP); pldCell.setDescription(words[3]); i = 6; while ((i < words.length) && !words[i].equals("=>")) { // String name, Direction direction, Long address, Integer bit, Boolean // mandatory // PhysicalPortPin pin = new PhysicalPortPin(words[i], Direction.UNKNOWN, 0L, // 0, true); CPSPort pin = new CPSPort( words[i], Direction.UNKNOWN, 0L, 0, true); // PhysicalPortPin(words[i], Direction.UNKNOWN, 0L, 0, true); if (pldCell.getInterfaceComponent().getChannels().size() == 0) { pldCell .getInterfaceComponent() .getChannels() .add(new ChannelPrimitive("default chanel")); } ChannelAbstract channel = pldCell.getInterfaceComponent().getChannels().iterator().next(); channel.getPorts().add(pin); vertexMap.put(words[i], pin); i++; } while (i < words.length - 1) { i++; words[i] = words[i].replaceAll("@", " "); int indexOfEqualSignal = words[i].indexOf("="); String property = words[i].substring(0, indexOfEqualSignal); String propValue = words[i].substring(indexOfEqualSignal + 1); // Boolean isConst, String name, String defaultValue, String type, Direction // direction DiscreteVariable attribute = new DiscreteVariable( false, property, propValue, "UNKNOWN", Direction.UNKNOWN); pldCell.getExtraAttributes().add(attribute); } // pldCell.getInterfaceElectrical().setElectricalFeature(new ElectricalFeature()); vertexCell.setValue(pldCell); vertexMap.put(words[1], pldCell); System.out.println("Vertex cell: " + pldCell); graph.addVertex(pldCell); break; case "port": // Vertex <NodoIdx> port <Direction> <Name> // EX: Vertex node18 port IN SA Long address = Long.parseLong(words[1].replace("node", "")); Direction dir = Direction.valueOf(words[3]); // String name, Direction direction, Long address, Integer bit, Boolean mandatory PhysicalPortPin pin = new PhysicalPortPin(words[4], dir, address, 0, true); i = 5; // to be ++ while (i < words.length - 1) { i++; words[i] = words[i].replaceAll("@", " "); int indexOfEqualSignal = words[i].indexOf("="); String property = words[i].substring(0, indexOfEqualSignal); String propValue = words[i].substring(indexOfEqualSignal + 1); // Boolean isConst, String name, String defaultValue, String type, Direction // direction DiscreteVariable attribute = new DiscreteVariable( false, property, propValue, "UNKNOWN", Direction.UNKNOWN); pin.getExtraAttributes().add(attribute); } vertexCell.setValue(pin); vertexMap.put(words[1], pin); // nodeX vertexMap.put(words[4], pin); // real name System.out.println("Vertex port: " + pin); graph.addVertex(pin); break; default: break; } // circuitGraph.add(rootCell, vertexCell, index++); break; case "Edge": // mxCell edgeCell = new mxCell(); // edgeCell.setEdge(true); // edgeCell.setId(circuitGraph.createId(edgeCell)); // mxCell source = (mxCell) circuitGraph.getCell(words[1]); // assert source != null; // edgeCell.setSource(source); // mxCell target = (mxCell) circuitGraph.getCell(words[2]); // assert target != null; // edgeCell.setTarget(target); String sourcePinOrPortStr = words[3]; PhysicalPortPin sourcePinPort, targetPinPort; if (sourcePinOrPortStr.indexOf(":") > -1) { // is a CELL:PIN (takes only the pin part) sourcePinOrPortStr = sourcePinOrPortStr.substring(sourcePinOrPortStr.indexOf(":") + 1); sourcePinPort = (PhysicalPortPin) vertexMap.get(sourcePinOrPortStr); assert sourcePinPort != null; sourcePinPort.setDirection( Direction.OUT); // it is an OUT PIN, so we can read from it } else { sourcePinPort = (PhysicalPortPin) vertexMap.get(sourcePinOrPortStr); assert sourcePinPort != null; sourcePinPort.setDirection( Direction.IN); // it is an IN PORT, so we can read from it } String targetPinOrPortStr = words[4]; if (targetPinOrPortStr.indexOf(":") > -1) { // is a CELL:PIN (takes only the pin part) targetPinOrPortStr = targetPinOrPortStr.substring(targetPinOrPortStr.indexOf(":") + 1); targetPinPort = (PhysicalPortPin) vertexMap.get(targetPinOrPortStr); assert targetPinPort != null; targetPinPort.setDirection(Direction.IN); // it is an IN PIN, so we can write to it } else { targetPinPort = (PhysicalPortPin) vertexMap.get(targetPinOrPortStr); assert targetPinPort != null; targetPinPort.setDirection( Direction.OUT); // it is an OUT PORT, so we can write to it } PhysicalCommunicationNet hardwareNet = new PhysicalCommunicationNet(sourcePinPort, targetPinPort); // edgeCell.setValue(hardwareNet); // i = 5; // to be ++ // while (i < words.length - 1) { // i++; // words[i] = words[i].replaceAll("@", " "); // int indexOfEqualSignal = words[i].indexOf("="); // String property = words[i].substring(0, // indexOfEqualSignal); // String propValue = // words[i].substring(indexOfEqualSignal + 1); // //Boolean isConst, String name, String defaultValue, // String type, Direction direction // DiscreteVariable attribute = new // DiscreteVariable(false, property, propValue, "UNKNOWN", Direction.UNKNOWN); // //pin.getExtraAttributes().add(attribute); // /** // * @TODO: where net properties are inserted into? * // */ // } // circuitGraph.add(rootCell, edgeCell, index++); Object vSource = vertexMap.get(words[1]); Object vTarget = vertexMap.get(words[2]); System.out.println( "Edge: " + vSource + " -> " + vTarget + " << " + sourcePinOrPortStr + " -> " + targetPinOrPortStr + " >>"); ObjectEdge edge = graph.addEdge(vSource, vTarget); edge.setUserObject(hardwareNet); break; default: Logger.getGlobal() .warning( "Error: Line not recognized when expecting to rebuild the circuit graph: " + line); break; } } } else if (line.equals(startString)) { reading = true; } } // circuitGraph.endUpdate(); // return circuitGraph; return graph; }