public void ReadMnetFile(string FileName) { nodes = new List<Node>(); wires = new List<Wire>(); string[] tstr = System.IO.File.ReadAllLines(FileName); for (int i = 0; i < tstr.Length; i++) { if (tstr[i].Split(':')[0] == "NODE") { Node N = new Node(); N.ReadFromString(tstr[i]); nodes.Add(N); } if (tstr[i].Split(':')[0] == "WIRE") { Wire W = new Wire(); W.ReadFromString(tstr[i]); wires.Add(W); } } }
private static void PlaceOptimal(Mnet MainNetwork, RouteUtils.Node[] mcNodes, out int PlaceLayer, out int BaseSize) { //Расчитать baseSize PlaceLayer = 60; int xStep = mcNodes.Select(t => t.SizeX).Max() + dolled; int yStep = mcNodes.Select(t => t.SizeY).Max() + dolled; BaseSize = (new int[] { Convert.ToInt32(Math.Sqrt(mcNodes.Length)) * xStep, Convert.ToInt32(Math.Sqrt(mcNodes.Length)) * yStep}).Max() + 60; //Разместить порты var ports = MainNetwork.nodes.Where(t => t.NodeType.Contains("Port")); int lastxcoord = 1; foreach (var port in ports) { port.placed = true; port.x = lastxcoord; port.y = 1; port.z = PlaceLayer; lastxcoord += mcNodes.FirstOrDefault(t => t.NodeName == port.NodeName).SizeX + dolled; } //Расчитать матрицу связоности int[,] connectionMatrix = new int[MainNetwork.nodes.Count, MainNetwork.nodes.Count]; for (int i = 0; i < MainNetwork.nodes.Count; i++) { for (int j = 0; j < MainNetwork.nodes.Count; j++) { connectionMatrix[i, j] = MainNetwork.wires.Where(t => t.SrcName == MainNetwork.nodes[i].NodeName && t.DistName == MainNetwork.nodes[j].NodeName || t.SrcName == MainNetwork.nodes[j].NodeName && t.DistName == MainNetwork.nodes[i].NodeName).Count(); } } //Разместить ноды в ячейки var unPlaced = MainNetwork.nodes.Where(t => !t.placed); while (unPlaced.Count() > 0) { //Поиск нода максимально связанного с установленными int[] localConnectionMatrix = new int[MainNetwork.nodes.Count]; for (int i = 0; i < MainNetwork.nodes.Count; i++) { localConnectionMatrix[i] += MainNetwork.wires.Where(t => !MainNetwork.nodes[i].placed && (t.SrcName == MainNetwork.nodes[i].NodeName && MainNetwork.nodes.FirstOrDefault(n=>n.NodeName == t.DistName).placed)).Count(); localConnectionMatrix[i] += MainNetwork.wires.Where(t => !MainNetwork.nodes[i].placed && (t.DistName == MainNetwork.nodes[i].NodeName && MainNetwork.nodes.FirstOrDefault(n => n.NodeName == t.SrcName).placed)).Count(); } int maxConections = localConnectionMatrix.Max(); Node nodeToPlace = new Node(); for (int i = 0; i < MainNetwork.nodes.Count; i++) { if (localConnectionMatrix[i] == maxConections) { nodeToPlace = MainNetwork.nodes[i]; } } if (maxConections == 0) { nodeToPlace = unPlaced.FirstOrDefault(); } //Поиск места для установки int[,] placeMatrix = new int[BaseSize,BaseSize]; var connectionsa = MainNetwork.wires.Where(k => k.SrcName == nodeToPlace.NodeName).Select(s => MainNetwork.nodes.FirstOrDefault(q => s.DistName == q.NodeName)).Where(l => l.placed); var connectionsb = MainNetwork.wires.Where(k => k.DistName == nodeToPlace.NodeName).Select(s => MainNetwork.nodes.FirstOrDefault(q => s.SrcName == q.NodeName)).Where(l => l.placed); var connections = connectionsa.Union(connectionsb); var mcNode = mcNodes.FirstOrDefault(k => k.NodeName == nodeToPlace.NodeName); int sizex = mcNode.SizeX + dolled; int sizey = mcNode.SizeY + dolled; var placedNodes = MainNetwork.nodes.Where(t=>t.placed); int step = 5; char[,] mask = new char[BaseSize, BaseSize]; foreach (var node in placedNodes) { DrawAtMask(mask, node.x, node.y, node.mcNode.SizeX, node.mcNode.SizeY); } for (int i = 0; i < BaseSize; i+=step) { for (int j = 0; j < BaseSize; j+=step) { //bool collision = placedNodes.Where(t => CheckCollision(t, t.mcNode, i, j, mcNode)).Count() > 0; if (BaseSize > i + sizex + 1 && BaseSize > j + sizey + 1) if(!CheckMaskCollision(mask, nodeToPlace,i,j)) { foreach (Node n in connections) { placeMatrix[i, j] += (n.x - i) * (n.x - i) + (n.y - j) * (n.y - j); } } } } //Установка int pcondMin = 90000000; int xplace = 0; int yplace = 0; for (int i = 1; i < BaseSize; i++) { for (int j = 1; j < BaseSize; j++) { if (placeMatrix[i, j] < pcondMin && placeMatrix[i, j]>0) { xplace = i; yplace = j; pcondMin = placeMatrix[i, j]; } } } nodeToPlace.x = xplace; nodeToPlace.y = yplace; nodeToPlace.z = PlaceLayer; nodeToPlace.placed = true; Console.ForegroundColor = ConsoleColor.DarkYellow; Console.WriteLine("{0} - Осталось:{1}", nodeToPlace.NodeName, unPlaced.Count()); Console.ForegroundColor = ConsoleColor.White; } //foreach(Node node in ) BaseSize += PlaceLayer; //Debug Draw Image System.Drawing.Image im = new System.Drawing.Bitmap(BaseSize, BaseSize); System.Drawing.Graphics Gr = System.Drawing.Graphics.FromImage(im); Gr.Clear(System.Drawing.Color.Black); foreach(var node in MainNetwork.nodes) { Gr.DrawRectangle(System.Drawing.Pens.Green, node.x, node.y, node.mcNode.SizeX, node.mcNode.SizeY); } im.Save("1.png"); //Увеличить плотность //throw new NotImplementedException(); }
private static List<Wire> FindAllWiresTo(List<Wire> Wlist, Node node) { List<Wire> WO = new List<Wire>(); for (int i = 0; i < Wlist.Count; i++) { if (Wlist[i].DistName == node.NodeName) WO.Add(Wlist[i]); if (Wlist[i].SrcName == node.NodeName) WO.Add(Wlist[i]); } return WO; }
private static bool CheckMaskCollision(char[,] mask, Node node,int x,int y) { for (int i = 0; i < node.mcNode.SizeX; i++) { for (int j = 0; j < node.mcNode.SizeY; j++) { if (mask[x + i, y + j] == 'X') return true; } } return false; }
private static bool CheckCollision(Node t, RouteUtils.Node node1, int i, int j, RouteUtils.Node node2) { bool result = false; result = result || CheckCollisionBoxAndPoint(t.x, t.y, node1.SizeX + dolled, node1.SizeY + dolled, i, j); result = result || CheckCollisionBoxAndPoint(t.x, t.y, node1.SizeX + dolled, node1.SizeY + dolled, i + node2.SizeX, j); result = result || CheckCollisionBoxAndPoint(t.x, t.y, node1.SizeX + dolled, node1.SizeY + dolled, i, j + node2.SizeY); result = result || CheckCollisionBoxAndPoint(t.x, t.y, node1.SizeX + dolled, node1.SizeY + dolled, i + node2.SizeX, j + node2.SizeY); result = result || CheckCollisionBoxAndPoint(i, j, node2.SizeX + dolled, node2.SizeY + dolled, t.x, t.y); result = result || CheckCollisionBoxAndPoint(i, j, node2.SizeX + dolled, node2.SizeY + dolled, t.x + node1.SizeX, t.y); result = result || CheckCollisionBoxAndPoint(i, j, node2.SizeX + dolled, node2.SizeY + dolled, t.x, t.y + node1.SizeY); result = result || CheckCollisionBoxAndPoint(i, j, node2.SizeX + dolled, node2.SizeY + dolled, t.x + node1.SizeX, t.y + node1.SizeY); return result; }
private static int CalcTypeWeight(Node node) { if (node.NodeType.StartsWith("DUP")) return 1; switch (node.NodeType) { case "TRIG_D": return 5; case "AND": return 3; case "NOT": return 2; case "OR": return 4; default: return 0; } }
private static void SortOptimize(Mnet MainNetwork) { for (int i = 0; i < MainNetwork.nodes.Count * OptimiseDeep; i++) { for (int j = 2; 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 = 0; if (TypeSort) { int wa = CalcTypeWeight(MainNetwork.nodes[j]); int wb = CalcTypeWeight(MainNetwork.nodes[j-1]); if (wa > wb) { ka = 1; } else { ka = 0; } } else { 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; } } } } } }