package mars.tools; import java.awt.Color; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GraphicsConfiguration; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.MouseInfo; import java.awt.PointerInfo; import java.awt.RenderingHints; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.font.FontRenderContext; import java.awt.font.TextLayout; import java.awt.image.BufferedImage; import java.io.IOException; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.Vector; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.Timer; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import mars.Globals; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; class UnitAnimation extends JPanel implements ActionListener { /** * */ private static final long serialVersionUID = -2681757800180958534L; //config variables private int PERIOD = 8; // velocity of frames in ms private static final int PWIDTH = 1000; // size of this panel private static final int PHEIGHT = 574; private GraphicsConfiguration gc; private GraphicsDevice gd; // for reporting accl. memory usage private int accelMemory; private DecimalFormat df; private int counter; //verify then remove. private boolean justStarted; //flag to start movement private int indexX; //counter of screen position private int indexY; private boolean xIsMoving, yIsMoving; //flag for mouse movement. // private Vertex[][] inputGraph; private Vector> outputGraph; private ArrayList vertexList; private ArrayList vertexTraversed; //Screen Label variables private HashMap registerEquivalenceTable; private String instructionCode; private int countRegLabel; private int countALULabel; private int countPCLabel; private int register = 1; private int control = 2; private int aluControl = 3; private int alu = 4; private int datapatTypeUsed; private Boolean cursorInIM, cursorInALU, cursorInDataMem, cursorInReg; private Graphics2D g2d; private BufferedImage datapath; class Vertex { private int numIndex; private int init; private int end; private int current; private String name; public static final int movingUpside = 1; public static final int movingDownside = 2; public static final int movingLeft = 3; public static final int movingRight = 4; public int direction; public int oppositeAxis; private boolean isMovingXaxis; private Color color; private boolean first_interaction; private boolean active; private boolean isText; private ArrayList targetVertex; public Vertex(int index, int init, int end, String name, int oppositeAxis, boolean isMovingXaxis, String listOfColors, String listTargetVertex, boolean isText){ this.numIndex = index; this.init = init; this.current = this.init; this.end = end; this.name = name; this.oppositeAxis = oppositeAxis; this.isMovingXaxis = isMovingXaxis; this.first_interaction = true; this.active = false; this.isText = isText; this.color = new Color(0,153,0); if(isMovingXaxis == true){ if( init < end) direction = movingLeft; else direction = movingRight; } else{ if( init < end) direction = movingUpside; else direction = movingDownside; } String[] list = listTargetVertex.split("#"); targetVertex = new ArrayList(); for(int i = 0; i < list.length; i++){ targetVertex.add(Integer.parseInt(list[i])); // System.out.println("Adding " + i + " " + Integer.parseInt(list[i])+ " in target"); } String[] listColor = listOfColors.split("#"); this.color = new Color(Integer.parseInt(listColor[0]) , Integer.parseInt(listColor[1]), Integer.parseInt(listColor[2]) ); } public int getDirection(){ return direction; } public boolean isText(){ return this.isText; } public ArrayList getTargetVertex() { return targetVertex; } public int getNumIndex() { return numIndex; } public void setNumIndex(int numIndex) { this.numIndex = numIndex; } public int getInit() { return init; } public void setInit(int init) { this.init = init; } public int getEnd() { return end; } public void setEnd(int end) { this.end = end; } public int getCurrent() { return current; } public void setCurrent(int current) { this.current = current; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getOppositeAxis() { return oppositeAxis; } public void setOppositeAxis(int oppositeAxis) { this.oppositeAxis = oppositeAxis; } public boolean isMovingXaxis() { return isMovingXaxis; } public void setMovingXaxis(boolean isMovingXaxis) { this.isMovingXaxis = isMovingXaxis; } public Color getColor() { return color; } public void setColor(Color color) { this.color = color; } public boolean isFirst_interaction() { return first_interaction; } public void setFirst_interaction(boolean first_interaction) { this.first_interaction = first_interaction; } public boolean isActive() { return active; } public void setActive(boolean active) { this.active = active; } } public UnitAnimation(String instructionBinary, int datapathType) { datapatTypeUsed = datapathType; cursorInIM = false; cursorInALU = false; cursorInDataMem = false; df = new DecimalFormat("0.0"); // 1 dp GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); gd = ge.getDefaultScreenDevice(); gc = ge.getDefaultScreenDevice().getDefaultConfiguration(); accelMemory = gd.getAvailableAcceleratedMemory(); // in bytes setBackground(Color.white); setPreferredSize( new Dimension(PWIDTH, PHEIGHT) ); // load and initialise the images initImages(); vertexList = new ArrayList(); counter = 0; justStarted = true; instructionCode = instructionBinary; //declaration of labels definition. registerEquivalenceTable = new HashMap(); countRegLabel = 400; countALULabel = 380; countPCLabel = 380; loadHashMapValues(); } // end of ImagesTests() //set the binnary opcode value of the basic instructions of MIPS instruction set public void loadHashMapValues(){ if(datapatTypeUsed == register){ importXmlStringData("/registerDatapath.xml", registerEquivalenceTable, "register_equivalence", "bits", "mnemonic"); importXmlDatapathMap("/registerDatapath.xml", "datapath_map"); } else if(datapatTypeUsed == control){ importXmlStringData("/controlDatapath.xml", registerEquivalenceTable, "register_equivalence", "bits", "mnemonic"); importXmlDatapathMap("/controlDatapath.xml", "datapath_map"); } else if(datapatTypeUsed == aluControl){ importXmlStringData("/ALUcontrolDatapath.xml", registerEquivalenceTable, "register_equivalence", "bits", "mnemonic"); importXmlDatapathMapAluControl("/ALUcontrolDatapath.xml", "datapath_map"); } } //import the list of opcodes of mips set of instructions public void importXmlStringData(String xmlName, HashMap table, String elementTree, String tagId, String tagData){ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(false); DocumentBuilder docBuilder; try { //System.out.println(); docBuilder = dbf.newDocumentBuilder(); Document doc = docBuilder.parse(getClass().getResource(xmlName).toString()); Element root = doc.getDocumentElement(); Element equivalenceItem; NodeList bitsList, mnemonic; NodeList equivalenceList = root.getElementsByTagName(elementTree); for(int i = 0; i < equivalenceList.getLength(); i++){ equivalenceItem = (Element)equivalenceList.item(i); bitsList = equivalenceItem.getElementsByTagName(tagId); mnemonic = equivalenceItem.getElementsByTagName(tagData); for(int j= 0; j < bitsList.getLength(); j++){ table.put(bitsList.item(j).getTextContent(),mnemonic.item(j).getTextContent()); } } } catch (Exception e) { e.printStackTrace(); } } //import the parameters of the animation on datapath public void importXmlDatapathMap(String xmlName, String elementTree){ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(false); DocumentBuilder docBuilder; try { docBuilder = dbf.newDocumentBuilder(); Document doc = docBuilder.parse(getClass().getResource(xmlName).toString()); Element root = doc.getDocumentElement(); Element datapath_mapItem; NodeList index_vertex, name, init, end,color, other_axis, isMovingXaxis, targetVertex, sourceVertex, isText ; NodeList datapath_mapList = root.getElementsByTagName(elementTree); for(int i = 0; i < datapath_mapList.getLength(); i++){ //extract the vertex of the xml input and encapsulate into the vertex object datapath_mapItem = (Element)datapath_mapList.item(i); index_vertex = datapath_mapItem.getElementsByTagName("num_vertex"); name = datapath_mapItem.getElementsByTagName("name"); init = datapath_mapItem.getElementsByTagName("init"); end = datapath_mapItem.getElementsByTagName("end"); //definition of colors line if(instructionCode.substring(0,6).equals("000000")){//R-type instructions color = datapath_mapItem.getElementsByTagName("color_Rtype"); //System.out.println("rtype"); } else if(instructionCode.substring(0,6).matches("00001[0-1]")){ //J-type instructions color = datapath_mapItem.getElementsByTagName("color_Jtype"); //System.out.println("jtype"); } else if(instructionCode.substring(0,6).matches("100[0-1][0-1][0-1]")){ //LOAD type instructions color = datapath_mapItem.getElementsByTagName("color_LOADtype"); //System.out.println("load type"); } else if(instructionCode.substring(0,6).matches("101[0-1][0-1][0-1]")){ //LOAD type instructions color = datapath_mapItem.getElementsByTagName("color_STOREtype"); //System.out.println("store type"); } else if(instructionCode.substring(0,6).matches("0001[0-1][0-1]")){ //BRANCH type instructions color = datapath_mapItem.getElementsByTagName("color_BRANCHtype"); //System.out.println("branch type"); } else{ //BRANCH type instructions color = datapath_mapItem.getElementsByTagName("color_Itype"); //System.out.println("immediate type"); } other_axis = datapath_mapItem.getElementsByTagName("other_axis"); isMovingXaxis = datapath_mapItem.getElementsByTagName("isMovingXaxis"); targetVertex = datapath_mapItem.getElementsByTagName("target_vertex"); isText = datapath_mapItem.getElementsByTagName("is_text"); for(int j= 0; j < index_vertex.getLength(); j++){ Vertex vert = new Vertex(Integer.parseInt(index_vertex.item(j).getTextContent()), Integer.parseInt(init.item(j).getTextContent()), Integer.parseInt(end.item(j).getTextContent()), name.item(j).getTextContent(), Integer.parseInt(other_axis.item(j).getTextContent()), Boolean.parseBoolean(isMovingXaxis.item(j).getTextContent()), color.item(j).getTextContent(), targetVertex.item(j).getTextContent(), Boolean.parseBoolean(isText.item(j).getTextContent())); vertexList.add(vert); } } //loading matrix of control of vertex. outputGraph = new Vector>(); vertexTraversed = new ArrayList(); int size = vertexList.size(); Vertex vertex; ArrayList targetList; for(int i = 0; i < vertexList.size(); i++){ vertex = vertexList.get(i); targetList = vertex.getTargetVertex(); Vector vertexOfTargets = new Vector(); for(int k = 0; k < targetList.size(); k++){ vertexOfTargets.add(vertexList.get(targetList.get(k))); } outputGraph.add(vertexOfTargets); } for(int i=0; i< outputGraph.size(); i++){ Vector vert = outputGraph.get(i); } vertexList.get(0).setActive(true); vertexTraversed.add(vertexList.get(0)); } catch (Exception e) { e.printStackTrace(); } } public void importXmlDatapathMapAluControl(String xmlName, String elementTree){ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(false); DocumentBuilder docBuilder; try { docBuilder = dbf.newDocumentBuilder(); Document doc = docBuilder.parse(getClass().getResource(xmlName).toString()); Element root = doc.getDocumentElement(); Element datapath_mapItem; NodeList index_vertex, name, init, end,color, other_axis, isMovingXaxis, targetVertex, sourceVertex, isText ; NodeList datapath_mapList = root.getElementsByTagName(elementTree); for(int i = 0; i < datapath_mapList.getLength(); i++){ //extract the vertex of the xml input and encapsulate into the vertex object datapath_mapItem = (Element)datapath_mapList.item(i); index_vertex = datapath_mapItem.getElementsByTagName("num_vertex"); name = datapath_mapItem.getElementsByTagName("name"); init = datapath_mapItem.getElementsByTagName("init"); end = datapath_mapItem.getElementsByTagName("end"); //definition of colors line if(instructionCode.substring(0,6).equals("000000")){//R-type instructions if(instructionCode.substring(28,32).matches("0000")){ //BRANCH type instructions color = datapath_mapItem.getElementsByTagName("ALU_out010"); System.out.println("ALU_out010 type " + instructionCode.substring(28,32)); } else if(instructionCode.substring(28,32).matches("0010")){ //BRANCH type instructions color = datapath_mapItem.getElementsByTagName("ALU_out110"); System.out.println("ALU_out110 type " + instructionCode.substring(28,32)); } else if(instructionCode.substring(28,32).matches("0100")){ //BRANCH type instructions color = datapath_mapItem.getElementsByTagName("ALU_out000"); System.out.println("ALU_out000 type " + instructionCode.substring(28,32)); } else if(instructionCode.substring(28,32).matches("0101")){ //BRANCH type instructions color = datapath_mapItem.getElementsByTagName("ALU_out001"); System.out.println("ALU_out001 type " + instructionCode.substring(28,32)); } else{ //BRANCH type instructions color = datapath_mapItem.getElementsByTagName("ALU_out111"); System.out.println("ALU_out111 type " + instructionCode.substring(28,32)); } } else if(instructionCode.substring(0,6).matches("00001[0-1]")){ //J-type instructions color = datapath_mapItem.getElementsByTagName("color_Jtype"); System.out.println("jtype"); } else if(instructionCode.substring(0,6).matches("100[0-1][0-1][0-1]")){ //LOAD type instructions color = datapath_mapItem.getElementsByTagName("color_LOADtype"); System.out.println("load type"); } else if(instructionCode.substring(0,6).matches("101[0-1][0-1][0-1]")){ //LOAD type instructions color = datapath_mapItem.getElementsByTagName("color_STOREtype"); System.out.println("store type"); } else if(instructionCode.substring(0,6).matches("0001[0-1][0-1]")){ //BRANCH type instructions color = datapath_mapItem.getElementsByTagName("color_BRANCHtype"); System.out.println("branch type"); } else{ color = datapath_mapItem.getElementsByTagName("color_Itype"); System.out.println("immediate type"); } other_axis = datapath_mapItem.getElementsByTagName("other_axis"); isMovingXaxis = datapath_mapItem.getElementsByTagName("isMovingXaxis"); targetVertex = datapath_mapItem.getElementsByTagName("target_vertex"); isText = datapath_mapItem.getElementsByTagName("is_text"); for(int j= 0; j < index_vertex.getLength(); j++){ Vertex vert = new Vertex(Integer.parseInt(index_vertex.item(j).getTextContent()), Integer.parseInt(init.item(j).getTextContent()), Integer.parseInt(end.item(j).getTextContent()), name.item(j).getTextContent(), Integer.parseInt(other_axis.item(j).getTextContent()), Boolean.parseBoolean(isMovingXaxis.item(j).getTextContent()), color.item(j).getTextContent(), targetVertex.item(j).getTextContent(), Boolean.parseBoolean(isText.item(j).getTextContent())); vertexList.add(vert); } } //loading matrix of control of vertex. outputGraph = new Vector>(); vertexTraversed = new ArrayList(); int size = vertexList.size(); Vertex vertex; ArrayList targetList; for(int i = 0; i < vertexList.size(); i++){ vertex = vertexList.get(i); targetList = vertex.getTargetVertex(); Vector vertexOfTargets = new Vector(); for(int k = 0; k < targetList.size(); k++){ vertexOfTargets.add(vertexList.get(targetList.get(k))); } outputGraph.add(vertexOfTargets); } for(int i=0; i< outputGraph.size(); i++){ Vector vert = outputGraph.get(i); } vertexList.get(0).setActive(true); vertexTraversed.add(vertexList.get(0)); } catch (Exception e) { e.printStackTrace(); } } //set the initial state of the variables that controls the animation, and start the timer that triggers the animation. public void startAnimation(String codeInstruction){ instructionCode = codeInstruction; new Timer(PERIOD, this).start(); // start timer this.repaint(); } //initialize the image of datapath. private void initImages(){ try { BufferedImage im; if(datapatTypeUsed == register){ im = ImageIO.read( getClass().getResource(Globals.imagesPath+"register.png") ); } else if(datapatTypeUsed == control){ im = ImageIO.read( getClass().getResource(Globals.imagesPath+"control.png") ); } else if(datapatTypeUsed == aluControl){ im = ImageIO.read( getClass().getResource(Globals.imagesPath+"ALUcontrol.png") ); } else{ im = ImageIO.read( getClass().getResource(Globals.imagesPath+"alu.png") ); } int transparency = im.getColorModel().getTransparency(); datapath = gc.createCompatibleImage( im.getWidth(), im.getHeight(), transparency ); g2d = datapath.createGraphics(); g2d.drawImage(im,0,0,null); g2d.dispose(); } catch(IOException e) { System.out.println("Load Image error for " + getClass().getResource(Globals.imagesPath+"register.png") + ":\n" + e); } } public void updateDisplay(){ this.repaint(); } public void actionPerformed(ActionEvent e) // triggered by the timer: update, repaint { if (justStarted) justStarted = false; if(xIsMoving) indexX++; if(yIsMoving) indexY--; repaint(); } public void paintComponent(Graphics g) { super.paintComponent(g); g2d = (Graphics2D)g; // use antialiasing g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // smoother (and slower) image transformations (e.g. for resizing) g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g2d = (Graphics2D)g; drawImage(g2d, datapath, 0,0,null); executeAnimation(g); counter = (counter + 1)% 100; g2d.dispose(); } private void drawImage(Graphics2D g2d, BufferedImage im, int x, int y,Color c){ if (im == null) { g2d.setColor(c); g2d.fillOval(x, y, 20, 20); g2d.setColor(Color.black); g2d.drawString(" ", x, y); } else g2d.drawImage(im, x, y, this); } //draw lines. //method to draw the lines that run from left to right. public void printTrackLtoR(Vertex v){ int size; int[] track; size = v.getEnd() - v.getInit(); track = new int[size]; for(int i = 0; i < size; i++) track[i] = v.getInit()+i; if(v.isActive() == true){ v.setFirst_interaction(false); for(int i = 0; i < size; i++){ if(track[i] <= v.getCurrent()){ g2d.setColor(v.getColor()); g2d.fillRect(track[i], v.getOppositeAxis(), 3, 3); } } if (v.getCurrent() == track[size-1]) v.setActive(false); v.setCurrent(v.getCurrent()+1); } else if(v.isFirst_interaction() == false){ for(int i = 0; i < size ; i++){ g2d.setColor(v.getColor()); g2d.fillRect(track[i],v.getOppositeAxis(), 3, 3); } } } //method to draw the lines that run from right to left. //public boolean printTrackRtoL(int init, int end ,int currentIndex, Graphics2D g2d, Color color, int otherAxis, // boolean active, boolean firstInteraction){ public void printTrackRtoL(Vertex v){ int size; int[] track; size = v.getInit() - v.getEnd(); track = new int[size]; for(int i = 0; i < size; i++) track[i] = v.getInit()-i; if(v.isActive() == true){ v.setFirst_interaction(false); for(int i = 0; i < size; i++){ if(track[i] >= v.getCurrent()){ g2d.setColor(v.getColor()); g2d.fillRect(track[i], v.getOppositeAxis(), 3, 3); } } if (v.getCurrent() == track[size-1]) v.setActive(false); v.setCurrent(v.getCurrent()-1); } else if(v.isFirst_interaction() == false){ for(int i = 0; i < size ; i++){ g2d.setColor(v.getColor()); g2d.fillRect(track[i],v.getOppositeAxis(), 3, 3); } } } //method to draw the lines that run from down to top. // public boolean printTrackDtoU(int init, int end ,int currentIndex, Graphics2D g2d, Color color, int otherAxis, // boolean active, boolean firstInteraction){ public void printTrackDtoU(Vertex v){ int size; int[] track; if(v.getInit() > v.getEnd()){ size = v.getInit() - v.getEnd(); track = new int[size]; for(int i = 0; i < size; i++) track[i] = v.getInit()-i; } else{ size = v.getEnd() - v.getInit(); track = new int[size]; for(int i = 0; i < size; i++) track[i] = v.getInit()+i; } if(v.isActive() == true){ v.setFirst_interaction(false); for(int i = 0; i < size; i++){ if(track[i] >= v.getCurrent()){ g2d.setColor(v.getColor()); g2d.fillRect(v.getOppositeAxis(), track[i], 3, 3); } } if (v.getCurrent() == track[size-1]) v.setActive(false); v.setCurrent(v.getCurrent()-1); } else if(v.isFirst_interaction() == false){ for(int i = 0; i < size; i++){ g2d.setColor(v.getColor()); g2d.fillRect(v.getOppositeAxis(), track[i], 3, 3); } } } //method to draw the lines that run from top to down. // public boolean printTrackUtoD(int init, int end ,int currentIndex, Graphics2D g2d, Color color, int otherAxis, // boolean active, boolean firstInteraction){ public void printTrackUtoD(Vertex v){ int size; int[] track; size = v.getEnd() - v.getInit(); track = new int[size]; for(int i = 0; i < size; i++) track[i] = v.getInit()+i; if(v.isActive() == true){ v.setFirst_interaction(false); for(int i = 0; i < size; i++){ if(track[i] <= v.getCurrent()){ g2d.setColor(v.getColor()); g2d.fillRect(v.getOppositeAxis(), track[i], 3, 3); } } if (v.getCurrent() == track[size-1]) v.setActive(false); v.setCurrent(v.getCurrent()+1); } else if(v.isFirst_interaction() == false){ for(int i = 0; i < size; i++){ g2d.setColor(v.getColor()); g2d.fillRect(v.getOppositeAxis(), track[i], 3, 3); } } } //convert binnary value to integer. public String parseBinToInt(String code){ int value = 0; for(int i =code.length()-1; i >= 0; i--){ if("1".equals(code.substring(i,i+1))){ value = value + (int)Math.pow(2,code.length()-i-1); } } return Integer.toString(value); } //set and execute the information about the current position of each line of information in the animation, //verifies the previous status of the animation and increment the position of each line that interconnect the unit function. private void executeAnimation(Graphics g){ g2d = (Graphics2D)g; Vertex vert; for(int i = 0; i < vertexTraversed.size(); i++){ vert = vertexTraversed.get(i); if(vert.isMovingXaxis == true){ if(vert.getDirection() == vert.movingLeft){ printTrackLtoR(vert); if(vert.isActive() == false){ int j = vert.getTargetVertex().size(); Vertex tempVertex; for(int k = 0; k < j; k++){ tempVertex = outputGraph.get(vert.getNumIndex()).get(k); Boolean hasThisVertex = false; for(int m = 0 ; m < vertexTraversed.size(); m++){ if(tempVertex.getNumIndex() == vertexTraversed.get(m).getNumIndex()) hasThisVertex = true; } if(hasThisVertex == false){ outputGraph.get(vert.getNumIndex()).get(k).setActive(true); vertexTraversed.add( outputGraph.get(vert.getNumIndex()).get(k)); } } } } else{ printTrackRtoL(vert); if(vert.isActive() == false){ int j = vert.getTargetVertex().size(); Vertex tempVertex; for(int k = 0; k < j; k++){ tempVertex = outputGraph.get(vert.getNumIndex()).get(k); Boolean hasThisVertex = false; for(int m = 0 ; m < vertexTraversed.size(); m++){ if(tempVertex.getNumIndex() == vertexTraversed.get(m).getNumIndex()) hasThisVertex = true; } if(hasThisVertex == false){ outputGraph.get(vert.getNumIndex()).get(k).setActive(true); vertexTraversed.add( outputGraph.get(vert.getNumIndex()).get(k)); } } } } } //end of condition of X axis else{ if(vert.getDirection() == vert.movingDownside){ if(vert.isText == true) ; else printTrackDtoU(vert); if(vert.isActive() == false){ int j = vert.getTargetVertex().size(); Vertex tempVertex; for(int k = 0; k < j; k++){ tempVertex = outputGraph.get(vert.getNumIndex()).get(k); Boolean hasThisVertex = false; for(int m = 0 ; m < vertexTraversed.size(); m++){ if(tempVertex.getNumIndex() == vertexTraversed.get(m).getNumIndex()) hasThisVertex = true; } if(hasThisVertex == false){ outputGraph.get(vert.getNumIndex()).get(k).setActive(true); vertexTraversed.add( outputGraph.get(vert.getNumIndex()).get(k)); } } } } else{ printTrackUtoD(vert); if(vert.isActive() == false){ int j = vert.getTargetVertex().size(); Vertex tempVertex; for(int k = 0; k < j; k++){ tempVertex = outputGraph.get(vert.getNumIndex()).get(k); Boolean hasThisVertex = false; for(int m = 0 ; m < vertexTraversed.size(); m++){ if(tempVertex.getNumIndex() == vertexTraversed.get(m).getNumIndex()) hasThisVertex = true; } if(hasThisVertex == false){ outputGraph.get(vert.getNumIndex()).get(k).setActive(true); vertexTraversed.add( outputGraph.get(vert.getNumIndex()).get(k)); } } } } } } } }