private static void Optimise(string elementName) { Console.WriteLine("Оптимизация {0}", elementName); Console.WriteLine("До Оптимизации {0}", _mainNet.Nodes.Count(t => t.NodeType.Contains(elementName))); bool opNeed = true; while (opNeed) { //Оптимизация AND var allAnd = _mainNet.Nodes.Where(t => t.NodeType.Contains(elementName)).ToList(); //Поиск 2х связаных AND Wire andConnection = _mainNet.Wires.FirstOrDefault(t => allAnd.FirstOrDefault(al => al.NodeName == t.DistName) != null && allAnd.FirstOrDefault(al => al.NodeName == t.SrcName) != null && allAnd.FirstOrDefault(al => al.NodeName == t.SrcName).Marked == false); if (andConnection != null) { Node andBase = allAnd.First(al => al.NodeName == andConnection.DistName); Node andConnected = allAnd.First(al => al.NodeName == andConnection.SrcName); var connectedWires = _mainNet.Wires.Where(t => (t.DistName == andBase.NodeName || t.DistName == andConnected.NodeName) && t != andConnection).ToArray(); //Создание нового нода if (connectedWires.Count() < 5) { var newAnd = new Node { NodeName = "OPT" + elementName + _lineCount, NodeType = elementName + connectedWires.Count() }; _lineCount++; //Перенос соеденений List<Wire> connectionWireList = connectedWires.ToList(); for (int i = 0; i < connectionWireList.Count; i++) { connectionWireList[i].DistName = newAnd.NodeName; connectionWireList[i].DistPort = "I" + i; } //Перенос исходящего соеденения Wire outConn = _mainNet.Wires.FirstOrDefault(t => t.SrcName == andBase.NodeName); if (outConn != null) { outConn.SrcName = newAnd.NodeName; } else { Console.WriteLine("Warning {0} не имеет исходящих соеденений", andBase.NodeName); } //Удалене старых нодов _mainNet.Nodes.Remove(andBase); _mainNet.Nodes.Remove(andConnected); //Удаление лишнего соеденения _mainNet.Wires.Remove(andConnection); //Добовление нового нода _mainNet.Nodes.Add(newAnd); } else { andConnected.Marked = true; } } else { opNeed = false; } } Console.WriteLine("После Оптимизации {0}", _mainNet.Nodes.Count(t => t.NodeType.Contains(elementName))); }
private static bool СheckCout(Node node, IEnumerable<Wire> list) { return list.Where(t => node.NodeName == t.SrcName).Any(t => t.SrcPort == "cout"); }