Esempio n. 1
0
        private static void Main(string[] args)
        {
            //string file = args.Length == 0 ? "test" : args[0];
            string file = args.Length == 0 ? "lut_00FE" : args[0];

            _mainNet = new Mnet();
            _mainNet.ReadMnetFile(file + @".MNET");

            var portsRep = new List<Cpoint>();
            List<Node> luts = _mainNet.GetLuts();
            var lutsMnet = new List<Mnet>();
            var bl = new Blib();
            bl.Load("MNETLib.BinLib");
            //"MNETLib.BinLib"

            foreach (Node node in luts)
            {
                var lnet = new Mnet();
                node.HaveCout = СheckCout(node, _mainNet.Wires);

                lnet.ReadMnetFileBl(@"lut_" + node.GetLutKey() + ".MNET", bl);
                if (!node.HaveCout)
                {
                    lutsMnet.Add(lnet);
                }
                else
                {
                    var lnetC = new Mnet();
                    lnetC.ReadMnetFileBl(@"lutc_" + node.GetLutKey().Substring(2, 2) + ".MNET", bl);
                    Mnet combined = MnetComb(lnet, lnetC);
                    lutsMnet.Add(combined);
                }
            }
            RenameLutNodes(lutsMnet);
            RemoveLutFromMainNet(_mainNet, luts);
            ReplacePortsByCpoints(portsRep, lutsMnet, luts);

            RpeplaceWireToCpoints(portsRep);
            CombineAllWiresAndNodes(lutsMnet);
            //remove unused Wire
            _mainNet.Wires.Remove(_mainNet.Wires.FirstOrDefault(t => t.DistPort == "dataa"));
            _mainNet.Wires.Remove(_mainNet.Wires.FirstOrDefault(t => t.DistPort == "datab"));
            _mainNet.Wires.Remove(_mainNet.Wires.FirstOrDefault(t => t.DistPort == "datac"));
            _mainNet.Wires.Remove(_mainNet.Wires.FirstOrDefault(t => t.DistPort == "datad"));
            string exportStr = _mainNet.GetSting();
            File.WriteAllText(file + @"_D.MNET", exportStr);
        }
Esempio n. 2
0
        static void Main(string[] args)
        {
            //string file = args.Length == 0 ? "lut_0100_D" : args[0];
            string file = args.Length == 0 ? "DIV_3_D" : args[0];
            //string file = args.Length == 0 ? "ADD_21_D" : args[0];
            _mainNet = new Mnet();
            _mainNet.ReadMnetFile(file + @".MNET");

            var dupList = _mainNet.Nodes.Where(t => t.NodeType.Contains("DUP")).ToList();

            //Обьеденение DUP
            List<Node> list = dupList;
            var dupdupWires = _mainNet.Wires.Where(t => list.FirstOrDefault(a => a.NodeName == t.SrcName) != null &&
                                                           list.FirstOrDefault(a => a.NodeName == t.DistName) != null);
            while (dupdupWires.Any())
            {
                var wire = dupdupWires.First();
                var firstDup = dupList.First(a => a.NodeName == wire.SrcName);
                var secondDup = dupList.First(a => a.NodeName == wire.DistName);
                var fromSecondWires = _mainNet.Wires.Where(t => t.SrcName == secondDup.NodeName).ToList();
                foreach (var w in fromSecondWires)
                {
                    w.SrcName = firstDup.NodeName;
                }
                _mainNet.Wires.Remove(wire);
                _mainNet.Nodes.Remove(secondDup);
            }
            dupList = _mainNet.Nodes.Where(t => t.NodeType.Contains("DUP")).ToList();
            //Обновление Типов и имен выходных портов
            foreach (var node in dupList)
            {
                var wlist = _mainNet.Wires.Where(t => t.SrcName == node.NodeName).ToList();
                for (int i = 0; i < wlist.Count; i++)
                {
                    wlist[i].SrcPort = "O" + i;
                }
                node.NodeType = "DUP" + wlist.Count;
            }

            Console.WriteLine("Всего Соеденений " + _mainNet.Wires.Count);
            Console.WriteLine();
            Optimise("AND");
            Console.WriteLine();
            Optimise("OR");
            Console.WriteLine();
            //NAND оптимизация

            TransNot();

            //string ElementName = "AND";

            Console.WriteLine("Оптимизация NOT");
            Console.WriteLine("До Оптимизации " + _mainNet.Nodes.Count(t => t.NodeType.Contains("NOT")));
            List<Node> allAnd = _mainNet.Nodes.Where(t => t.NodeType.Contains("AND")).ToList();
            var allNot = _mainNet.Nodes.Where(t => t.NodeType == "NOT");
            var allNotWire = new List<Wire>();
            foreach (Node node in allNot)
            {
                allNotWire.AddRange(_mainNet.Wires.Where(t => t.SrcName == node.NodeName));
            }
            foreach (Node node in allAnd)
            {
                var wireNotToAnd = allNotWire.Where(t => t.DistName == node.NodeName).ToList();
                var allWiresToAnd = _mainNet.Wires.Where(t => t.DistName == node.NodeName).ToList();
                var allWiresToNot = new List<Wire>();
                var allNotTodel = new List<Node>();
                var bits = new int[allWiresToAnd.Count];
                //Заполнение битов
                /*
                for (int i = 0; i < allWiresToAnd.Count; i++)
                {
                    if (wireNotToAnd.Contains(allWiresToAnd[i]))
                    {
                        bits[i] = 1;
                    }
                }
                 */
                foreach(Wire wire in wireNotToAnd)
                {
                    allNotTodel.Add(_mainNet.Nodes.FirstOrDefault(t => t.NodeName == wire.SrcName));
                    allWiresToNot.Add(_mainNet.Wires.FirstOrDefault(t => t.DistName == wire.SrcName));
                }

                //Перенос соеденений
                for (int i = 0; i < allWiresToAnd.Count; i++)
                {
                    //if (bits[i] == 1)
                    //{
                    Wire twire = _mainNet.Wires.FirstOrDefault(t => t.DistName == allWiresToAnd[i].SrcName);
                    if (twire != null)
                    {
                        if (_mainNet.Nodes.First(t => t.NodeName == twire.DistName).NodeType == "NOT")
                        {
                            allWiresToAnd[i].SrcName = twire.SrcName;
                            allWiresToAnd[i].SrcPort = twire.SrcPort;
                            bits[i] = 1;
                        }
                    }
                    //}
                    allWiresToAnd[i].DistPort = "I" + i;
                }

                //Получения числа
                int val = 0;
                for (int i = 0; i < allWiresToAnd.Count; i++)
                {
                    val = val | bits[i];
                    val = val << 1;
                }
                val = val >> 1;

                //val = RevertVal(val, allWiresToAnd.Count);

                //Преобразование and
                node.NodeType = "NANDT" + bits.Length + "_" + val.ToString("X2");

                //Удаление ненужных соеденений и нодов
                foreach (var t in allWiresToNot) _mainNet.Wires.Remove(t);
                foreach (var t in allNotTodel) _mainNet.Nodes.Remove(t);

            }

            Console.WriteLine("После Оптимизации " + _mainNet.Nodes.Count(t => t.NodeType.Contains("NOT")));

            //Удаление нодов без исходящих соеденений
            var optneed = true;
            while (optneed)
            {
                optneed = false;
                var nodetodell = new List<Node>();
                var wiretodell = new List<Wire>();
                foreach (var node in _mainNet.Nodes)
                {
                    //Удаление нодов без исходящих соеденений
                    if (!node.NodeType.Contains("Port"))
                    {
                        var outWires = _mainNet.Wires.Where(t => t.SrcName == node.NodeName).ToList();
                        if (outWires.Count < 1)
                        {
                            optneed = true;
                            nodetodell.Add(node);
                            wiretodell.AddRange(_mainNet.Wires.Where(t => t.DistName == node.NodeName).ToList());
                        }
                    }
                    //Удаление нодов без вхожящих соеденений
                    /*
                    if (!node.NodeType.Contains("Port") && !node.NodeType.Contains("GND") && !node.NodeType.Contains("VCC"))
                    {
                        var outWires = _mainNet.Wires.Where(t => t.DistName == node.NodeName).ToList();
                        if (outWires.Count < 1)
                        {
                            optneed = true;
                            nodetodell.Add(node);
                            wiretodell.AddRange(_mainNet.Wires.Where(t => t.SrcName == node.NodeName).ToList());
                        }
                    }
                     */
                }
                foreach(var node in nodetodell) _mainNet.Nodes.Remove(node);
                foreach(var wire in wiretodell) _mainNet.Wires.Remove(wire);
            }

            Console.WriteLine("Соеденений после оптимизации " + _mainNet.Wires.Count);
            System.IO.File.WriteAllText(file + @"_O.MNET" ,_mainNet.GetSting());
        }
Esempio n. 3
0
        private static Mnet MnetComb(Mnet lnet, Mnet lnetC)
        {
            NodeShiftRename(lnetC);
            int dupC = 0;
            //Удаление Одинаковых Портов
            var nodeToRemove = new List<Node>();
            foreach (Node node in lnet.Nodes)
            {
                nodeToRemove.AddRange(lnetC.Nodes.Where(t => node.NodeName == t.NodeName));
            }
            foreach (Node node in nodeToRemove)
            {
                lnetC.RemoveNode(node.NodeName);
            }

            //Поиск Дублирующих Линий

            var wireToRemove = new List<Wire>();

            for (int i = 0; i < lnet.Wires.Count; i++)
            {
                for (int j = 0; j < lnetC.Wires.Count; j++)
                {
                    if (lnet.Wires[i].SrcName == lnetC.Wires[j].SrcName)
                    {
                        if (lnet.Wires[i].SrcPort == lnetC.Wires[j].SrcPort)
                        {
                            //Создание Dup
                            lnet.Nodes.Add(new Node {NodeName = "DUPC" + dupC, NodeType = "DUP2"});
                            lnet.Wires.Add(new Wire
                            {
                                SrcName = "DUPC" + dupC,
                                SrcPort = "O0",
                                DistName = lnet.Wires[i].DistName,
                                DistPort = lnet.Wires[i].DistPort
                            });
                            lnet.Wires.Add(new Wire
                            {
                                SrcName = "DUPC" + dupC,
                                SrcPort = "O1",
                                DistName = lnetC.Wires[j].DistName,
                                DistPort = lnetC.Wires[j].DistPort
                            });
                            lnet.Wires[i].DistName = "DUPC" + dupC;
                            lnet.Wires[i].DistPort = "I0";
                            wireToRemove.Add(lnetC.Wires[j]);
                            dupC++;
                        }
                    }
                }
            }
            //Удаление Дублирующих линий
            foreach (Wire wire in wireToRemove)
            {
                lnetC.RemoveWireFrom(wire.SrcName, wire.SrcPort);
            }
            //Слияние
            for (int i = 0; i < lnetC.Wires.Count; i++)
            {
                lnet.Wires.Add(lnetC.Wires[i]);
            }

            for (int i = 0; i < lnetC.Nodes.Count; i++)
            {
                lnet.Nodes.Add(lnetC.Nodes[i]);
            }

            return lnet;
        }
Esempio n. 4
0
 private static void RemoveLutFromMainNet(Mnet mainNet, IEnumerable<Node> luts)
 {
     foreach (Node node in luts)
     {
         mainNet.RemoveNode(node.NodeName);
     }
 }
Esempio n. 5
0
        private static void NodeShiftRename(Mnet lnetC)
        {
            foreach (Wire wire in lnetC.Wires)
            {
                if (lnetC.FindNode(wire.DistName).NodeType != "INPort" &&
                    lnetC.FindNode(wire.DistName).NodeType != "OUTPort")
                {
                    wire.DistName = "CC" + wire.DistName;
                }
                if (lnetC.FindNode(wire.SrcName).NodeType != "INPort" &&
                    lnetC.FindNode(wire.SrcName).NodeType != "OUTPort")
                {
                    wire.SrcName = "CC" + wire.SrcName;
                }
            }

            foreach (Node node in lnetC.Nodes)
            {
                if (node.NodeType != "INPort" && node.NodeType != "OUTPort")
                {
                    node.NodeName = "CC" + node.NodeName;
                }
            }
        }