예제 #1
0
 private static int CalcWireLens(List<Wire> WlistTo, Mnet MainNetwork)
 {
     int k = 0;
     for (int i = 0; i < WlistTo.Count; i++)
     {
         int ka = FindNodeIndex(MainNetwork.nodes, WlistTo[i].SrcName);
         int kb = FindNodeIndex(MainNetwork.nodes, WlistTo[i].DistName);
         k += (kb - ka);
     }
     return k;
 }
예제 #2
0
        private static void ConnectSBNodes(Mnet MainNetwork, List<StarBoundNode> SBNodes, List<StarboundWire> SBWires)
        {
            for (int i = 0; i < MainNetwork.wires.Count; i++)
            {
                Wire W = MainNetwork.wires[i];
                StarBoundNode StartNode = FindSBNode(SBNodes, W.SrcName);
                StarBoundNode EndNode = FindSBNode(SBNodes, W.DistName);
                StarBoundPort StartPort = FindSBPort(StartNode, W.SrcPort);
                StarBoundPort EndPort = FindSBPort(EndNode, W.DistPort);

                StarboundWire SBW = new StarboundWire();
                SBW.startx = StartPort.xcoord;
                SBW.starty = StartPort.ycoord;
                SBW.endx = EndPort.xcoord;
                SBW.endy = EndPort.ycoord;
                SBWires.Add(SBW);
            }
        }
예제 #3
0
 private static void SortOptimize(Mnet MainNetwork)
 {
     for (int i = 0; i < MainNetwork.nodes.Count * OptimiseDeep; i++)
     {
         for (int j = 0; j < (MainNetwork.nodes.Count - 1); j++)
         {
             if (MainNetwork.nodes[j].NodeType != "INPort" && MainNetwork.nodes[j].NodeType != "OUTPort")
             {
                 List<Wire> Wlist1 = FindAllWiresTo(MainNetwork.wires, MainNetwork.nodes[j]);
                 //List<Wire> Wlist2 = FindAllWiresTo(MainNetwork.wires, MainNetwork.nodes[j+1]);
                 int ka = CalcWireLens(Wlist1, MainNetwork);
                 //int kb = CalcWireLens(Wlist2, MainNetwork);
                 if (ka < 0)
                 {
                     if (MainNetwork.nodes[j + 1].NodeType != "INPort" && MainNetwork.nodes[j + 1].NodeType != "OUTPort")
                     {
                         Node N = new Node();
                         N = MainNetwork.nodes[j];
                         MainNetwork.nodes[j] = MainNetwork.nodes[j + 1];
                         MainNetwork.nodes[j + 1] = N;
                     }
                 }
                 if (ka > 0)
                 {
                     if (MainNetwork.nodes[j - 1].NodeType != "INPort" && MainNetwork.nodes[j - 1].NodeType != "OUTPort")
                     {
                         Node N = new Node();
                         N = MainNetwork.nodes[j];
                         MainNetwork.nodes[j] = MainNetwork.nodes[j - 1];
                         MainNetwork.nodes[j - 1] = N;
                     }
                 }
             }
         }
     }
 }
예제 #4
0
 private static void RemoveDUPNodes(Mnet MainNetwork, List<Node> Nodes)
 {
     for (int i = 0; i < MainNetwork.nodes.Count; i++)
     {
         if (MainNetwork.nodes[i].NodeType.StartsWith("DUP"))
         {
             Nodes.Add(MainNetwork.nodes[i]);
         }
     }
     for (int i = 0; i < Nodes.Count; i++)
     {
         MainNetwork.RemoveNode(Nodes[i].NodeName);
     }
 }
예제 #5
0
 private static void RemoveDUOWires(Mnet MainNetwork, List<Node> Nodes)
 {
     for (int i = 0; i < Nodes.Count; i++)
     {
         for (int j = 0; i < Nodes.Count; i++)
         {
             MainNetwork.RemoveWireTo(Nodes[i].NodeName, "I" + j.ToString());
         }
     }
 }
예제 #6
0
        private static void ReducteDUP(Mnet MainNetwork)
        {
            List<Node> Nodes = new List<Node>();
            for (int i = 0; i < MainNetwork.nodes.Count; i++)
            {
                if (MainNetwork.nodes[i].NodeType.StartsWith("DUP"))
                {
                    Nodes.Add(MainNetwork.nodes[i]);
                }
            }
            // DupUnion

            List<string> Dnodes = new List<string>();
            List<string> Snodes = new List<string>();
            for (int i = 0; i < MainNetwork.wires.Count; i++)
            {
                if (MainNetwork.FindNode(MainNetwork.wires[i].DistName).NodeType.StartsWith("DUP"))
                {
                    if (MainNetwork.FindNode(MainNetwork.wires[i].SrcName).NodeType.StartsWith("DUP"))
                    {
                        while (MainNetwork.FindWireFrom(MainNetwork.wires[i].DistName)!=null)
                        {
                            Wire W = MainNetwork.FindWireFrom(MainNetwork.wires[i].DistName);
                            W.SrcName = MainNetwork.wires[i].SrcName;
                        }
                        Dnodes.Add(MainNetwork.wires[i].DistName);
                        Dnodes.Add(MainNetwork.wires[i].SrcName);
                    }
                }
            }

            //Replace Wire To
            for (int i = 0; i < MainNetwork.wires.Count; i++)
            {
                    if (MainNetwork.FindNode(MainNetwork.wires[i].SrcName).NodeType.StartsWith("DUP"))
                    {
                        string sname = MainNetwork.wires[i].SrcName;
                        while (MainNetwork.FindWireFrom(sname) != null)
                        {
                            Wire W = MainNetwork.FindWireFrom(sname);
                            Wire W2 = MainNetwork.FindWireTo(sname);
                            W.SrcName = W2.SrcName;
                            W.SrcPort = W2.SrcPort;
                        }
                    }
            }
        }
예제 #7
0
        private static void PlaceSBNodes(Mnet MainNetwork, List<StarBoundNode> SBNodes)
        {
            for (int i = 0; i < MainNetwork.nodes.Count; i++)
            {
                if (MainNetwork.nodes[i].NodeType == "INPort")
                {
                    PlaceSBNode(SBNodes, MainNetwork.nodes[i]);
                }
            }

            for (int i = 0; i < MainNetwork.nodes.Count; i++)
            {
                if (MainNetwork.nodes[i].NodeType != "INPort" && MainNetwork.nodes[i].NodeType != "OUTPort")
                {
                    PlaceSBNode(SBNodes, MainNetwork.nodes[i]);
                }
            }

            for (int i = 0; i < MainNetwork.nodes.Count; i++)
            {
                if (MainNetwork.nodes[i].NodeType == "OUTPort")
                {
                    PlaceSBNode(SBNodes, MainNetwork.nodes[i]);
                }
            }
        }
예제 #8
0
        static void Main(string[] args)
        {
            string file = "test2_D";
            if (args.Length > 0)
            {
                file = args[0];
                for (int i = 0; i < args.Length; i++)
                {
                    if (args[i].StartsWith("H="))
                        Height = Convert.ToInt32(args[i].Split('=')[1]);
                    if (args[i].StartsWith("ImMult="))
                        ImageMult = Convert.ToInt32(args[i].Split('=')[1]);
                    if (args[i].StartsWith("O="))
                        OptimiseDeep = Convert.ToInt32(args[i].Split('=')[1]);
                }
            }

            Console.WriteLine("Использование:");
            Console.WriteLine("");
            Console.WriteLine("StarboundExport [filename] {H=(4)Height,ImMult=(25)imagesize,O=(3)OptimizeDeep}");
            Console.WriteLine("Примеры:");
            Console.WriteLine("");
            Console.WriteLine("StarboundExport test2_D H=4 ImMult=30 O=3");
            Console.WriteLine("StarboundExport test2_D");
            Console.WriteLine("");

            Mnet MainNetwork = new Mnet();
            MainNetwork.ReadMnetFile(file + @".MNET");
            ReducteDUP(MainNetwork);
            List<Node> DupNodes = new List<Node>();
            RemoveDUPNodes(MainNetwork, DupNodes);
            RemoveDUOWires(MainNetwork, DupNodes);

            //Sorting Nodes;
            SortOptimize(MainNetwork);

            //place nods
            List<StarBoundNode> SBNodes = new List<StarBoundNode>();
            PlaceSBNodes(MainNetwork, SBNodes);
            //place wires
            List<StarboundWire> SBWires = new List<StarboundWire>();
            ConnectSBNodes(MainNetwork, SBNodes, SBWires);

            string ostr = GenExportFile(SBNodes, SBWires);
            System.IO.File.WriteAllText(file + ".SBBIN", ostr);
            //CalcLincLengch
            double len = CalcComplexity(SBWires);
            Console.WriteLine("complexity:" + len);

            //draw image
            Image IMmain = DrawImage(SBNodes, SBWires);
            //export image
            IMmain.Save(file + ".bmp");
        }