Exemple #1
0
        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)));
        }
Exemple #2
0
 private static bool СheckCout(Node node, IEnumerable<Wire> list)
 {
     return list.Where(t => node.NodeName == t.SrcName).Any(t => t.SrcPort == "cout");
 }