public virtual bool IsConnectedIDiagram(IDiagram iDiagram) { bool flag = false; if (GetOutputTerminals()[iDiagram.getDiagramIndex()].GetConnections().Count != 0) { flag = true; } return(flag); }
public virtual void Sorting(LinkedList <INode> zeroindegreelist, List <INode> sortedlist, IDiagram iDiagram) { while (zeroindegreelist.Count > 0) { //Get and remove the current node in the zeroindegreelist INode currentnode = zeroindegreelist.First(); zeroindegreelist.RemoveFirst(); //Put the output border nodes of IForLoop in the zeroindegreelist if (currentnode.GetINodeType() == "IForLoop") { IForLoop forloop = (IForLoop)currentnode; foreach (INode n in forloop.GetOutputBorderNodes()) { zeroindegreelist.AddLast(n); } } //Put the ITunnel of ICaseStructure in the zeroindegreelist else if (currentnode.GetINodeType() == "ICaseStructure") { ICaseStructure casestructure = (ICaseStructure)currentnode; foreach (INode n in casestructure.GetITunnels()) { zeroindegreelist.AddLast(n); } } sortedlist.Add(currentnode); //These nodes should be processed inside the loop if ((currentnode.GetINodeType() == "ILeftShiftRegister" || currentnode.GetINodeType() == "ILoopMax" || currentnode.GetINodeType() == "ICaseSelector" || currentnode.GetINodeType() == "ITunnel") && !((IBorderNode)currentnode).IsBorderNodeInside(iDiagram)) { bool isInputITunnel = true; if (currentnode.GetINodeType() == "ITunnel") { ITunnel t = (ITunnel)currentnode; if (!t.GetIsInput()) { isInputITunnel = false; } } if (isInputITunnel) { continue; } } //These nodes should be processed outside the loop if ((currentnode.GetINodeType() == "ITunnel" || currentnode.GetINodeType() == "IRightShiftRegister") && ((IBorderNode)currentnode).IsBorderNodeInside(iDiagram)) { bool isOutputITunnel = true; if (currentnode.GetINodeType() == "ITunnel") { ITunnel t = (ITunnel)currentnode; if (t.GetIsInput()) { isOutputITunnel = false; } } if (isOutputITunnel) { continue; } } List <INode> backINodes = currentnode.GetOutputINodes(); if (currentnode.GetINodeType() == "ICaseSelector") { List <INode> tempnode = new List <INode>(); ITerminal t = currentnode.GetOutputTerminals()[iDiagram.getDiagramIndex()]; for (int i = 0; i < t.GetConnections().Count; i++) { tempnode.Add(INode.GetIdToINode()[t.GetConnections()[i].GetNodeId()]); } backINodes = tempnode; } if (currentnode.GetINodeType() == "IFeedbackInputNode") { IFeedbackInputNode fi = (IFeedbackInputNode)currentnode; backINodes.Add(INode.GetIdToINode()[fi.GetOutputNode().GetNodeId()]); } foreach (INode n in backINodes) { n.DecreaseIndegree(); if (n.GetIndegree() == 0) { zeroindegreelist.AddLast(n); if ((n.GetINodeType() == "ILeftShiftRegister" || n.GetINodeType() == "ILoopMax" || n.GetINodeType() == "ICaseSelector" || n.GetINodeType() == "ITunnel") && !((IBorderNode)n).IsBorderNodeInside(iDiagram)) { bool isInputITunnel = true; if (n.GetINodeType() == "ITunnel") { ITunnel t = (ITunnel)n; if (!t.GetIsInput()) { isInputITunnel = false; } } Console.WriteLine("ParentNode: " + n.GetParentINode().GetName() + " Indegree: " + n.GetParentINode().GetIndegree()); if (isInputITunnel && n.GetParentINode().GetIndegree() == 0) { zeroindegreelist.AddLast(n.GetParentINode()); } } } if (n.GetINodeType() == "ITunnel") { ITunnel t = (ITunnel)n; if (t.IsOutputCaseITunnel()) { t.IncreaseIndegree(); } } } } Console.WriteLine("\n------------------------------------"); Console.WriteLine("Topological Sorting:"); foreach (INode i in sortedlist) { Console.WriteLine(i.GetName()); } }