public override void BlockUsedResources()
 {
     foreach (TCLRoutingTreeNode node in RoutingTree.GetAllRoutingNodes().Where(n => !n.VirtualNode))
     {
         node.Tile.BlockPort(node.Port,Tile.BlockReason.OccupiedByMacro);
     }
 }
        public void SetPins()
        {
            foreach (TCLRoutingTreeNode node in RoutingTree.GetAllRoutingNodes().Where(n => !n.VirtualNode))
            {
                Tile t = node.Tile;
                foreach (Slice s in t.Slices)
                {
                    bool inport  = s.PortMapping.IsSliceInPort(node.Port);
                    bool outport = s.PortMapping.IsSliceOutPort(node.Port);
                    if ((inport || outport) && node.Port.Name.Contains('_'))
                    {
                        NetPin pin = null;
                        if (inport)
                        {
                            pin = new NetInpin();
                        }
                        else
                        {
                            pin = new NetOutpin();
                        }

                        pin.SlicePort    = node.Port.Name.Substring(node.Port.Name.LastIndexOf('_'));
                        pin.InstanceName = s.SliceName;

                        bool pinExistsAlready = NetPins.FirstOrDefault(np => np.InstanceName.Equals(pin.InstanceName) && np.SlicePort.Equals(pin.SlicePort)) != null;
                        if (!pinExistsAlready)
                        {
                            Add(pin);
                        }
                    }
                }
            }
        }
        public void UnflattenNet()
        {
            List <TCLRoutingTreeNode> nodeQueue = new List <TCLRoutingTreeNode>(RoutingTree.Root.Children);
            NetOutpin          outPin           = (NetOutpin)NetPins.First(np => np is NetOutpin);
            Tile               rootTile         = FPGA.FPGA.Instance.GetTile(outPin.TileName);
            TCLRoutingTreeNode newRoot          = nodeQueue.FirstOrDefault(n =>
                                                                           n.Tile.Location.Equals(rootTile.Location) &&
                                                                           rootTile.GetSliceByName(outPin.SliceName).PortMapping.IsSliceOutPort(outPin.SlicePort));

            nodeQueue.Remove(newRoot);

            NodeNet          = false;
            RoutingTree.Root = newRoot;
            // try to assign each node to parent
            while (nodeQueue.Count > 0)
            {
                foreach (TCLRoutingTreeNode node in RoutingTree.GetAllRoutingNodes())
                {
                    bool addedNodes = false;
                    // stay on tile
                    TCLRoutingTreeNode nodeOnThisTile = nodeQueue.Find(n =>
                                                                       n.Tile.Location.Equals(node.Tile.Location) &&
                                                                       n.Tile.SwitchMatrix.Contains(node.Port, n.Port));
                    if (nodeOnThisTile != null)
                    {
                        node.Children.Add(nodeOnThisTile);
                        nodeQueue.Remove(nodeOnThisTile);
                        addedNodes = true;
                        break;
                    }

                    // leave tile
                    foreach (Location loc in Navigator.GetDestinations(node.Tile, node.Port))
                    {
                        // look for next hop on loc.Tile
                        TCLRoutingTreeNode nodeOnOtherTile = nodeQueue.Find(n =>
                                                                            n.Tile.Location.Equals(loc.Tile.Location) &&
                                                                            n.Tile.SwitchMatrix.Contains(loc.Pip, n.Port));
                        if (nodeOnOtherTile != null)
                        {
                            node.Children.Add(nodeOnOtherTile);
                            nodeQueue.Remove(nodeOnOtherTile);
                            addedNodes = true;
                            break;
                        }
                    }
                    if (addedNodes)
                    {
                        break;
                    }
                }
            }
        }
        public void FlattenNet()
        {
            // we do not need to overwrite TCLRoutingTree (which is only s very flat class)
            TCLRoutingTreeNode newRoot = new TCLRoutingTreeNode(null, null);

            newRoot.VirtualNode = true;
            // we can ignore virtual nodes as the new root will be the virtual new node
            foreach (TCLRoutingTreeNode node in RoutingTree.GetAllRoutingNodes().Where(n => !n.VirtualNode))
            {
                newRoot.Children.Add(node);
                node.Parent = newRoot;
            }

            // clear children after iterating over GetAllRoutingNodes, otherwise this will change the result fromGetAllRoutingNodes
            foreach (TCLRoutingTreeNode node in newRoot.Children)
            {
                node.Children.Clear();
            }

            NodeNet          = true;
            RoutingTree.Root = newRoot;
        }
Exemple #5
0
 public StatServer()
 {
     listener    = new HttpListener();
     routingTree = new RoutingTree();
     InitializeRoutingTree();
 }
        public void RoutingTestMethod()
        {
            // arrange
            RoutingTree routingTree     = new RoutingTree();
            string      endpoint        = "123.4.5.6:7070";
            string      timestampString = "2017-01-22T15:11:12Z";
            DateTime    timestamp       = DateTime.Parse(timestampString).ToUniversalTime();
            string      name            = "player1";
            string      requestBody     = "someBody";

            int[,] countMatrix = new int[, ]
            {
                { -1, 0 },
                { 100, 50 },
                { 27, 27 }
            };
            routingTree.AddRule(
                "PUT/servers/?endpoint/info",
                param =>
            {
                Assert.AreEqual(endpoint, param["?endpoint"]);
                Assert.AreEqual(requestBody, param["requestBody"]);
                return(new ApiResponse());
            });

            routingTree.AddRule(
                "PUT/servers/?endpoint/matches/?timestamp",
                param =>
            {
                Assert.AreEqual(endpoint, param["?endpoint"]);
                Assert.AreEqual(timestamp, param["?timestamp"]);
                Assert.AreEqual(requestBody, param["requestBody"]);
                return(new ApiResponse());
            });

            routingTree.AddRule(
                "GET/servers/info",
                param =>
            {
                Assert.AreEqual(requestBody, param["requestBody"]);
                return(new ApiResponse());
            });

            routingTree.AddRule(
                "GET/servers/?endpoint/info",
                param =>
            {
                Assert.AreEqual(endpoint, param["?endpoint"]);
                Assert.AreEqual(requestBody, param["requestBody"]);
                return(new ApiResponse());
            });

            routingTree.AddRule(
                "GET/servers/?endpoint/stats",
                param =>
            {
                Assert.AreEqual(endpoint, param["?endpoint"]);
                Assert.AreEqual(requestBody, param["requestBody"]);
                return(new ApiResponse());
            });

            routingTree.AddRule(
                "GET/servers/?endpoint/matches/?timestamp",
                param =>
            {
                Assert.AreEqual(endpoint, param["?endpoint"]);
                Assert.AreEqual(timestamp, param["?timestamp"]);
                Assert.AreEqual(requestBody, param["requestBody"]);
                return(new ApiResponse());
            });

            routingTree.AddRule(
                "GET/players/?name/stats",
                param =>
            {
                Assert.AreEqual(name, param["?name"]);
                Assert.AreEqual(requestBody, param["requestBody"]);
                return(new ApiResponse());
            });

            routingTree.AddRule(
                "GET/reports/recent-matches/?count",
                param =>
            {
                Assert.AreEqual(countMatrix[0, 1], param["?count"]);
                Assert.AreEqual(requestBody, param["requestBody"]);
                return(new ApiResponse());
            });

            routingTree.AddRule(
                "GET/reports/best-players/?count",
                param =>
            {
                Assert.AreEqual(countMatrix[1, 1], param["?count"]);
                Assert.AreEqual(requestBody, param["requestBody"]);
                return(new ApiResponse());
            });

            routingTree.AddRule(
                "GET/reports/popular-servers/?count",
                param =>
            {
                Assert.AreEqual(countMatrix[2, 1], param["?count"]);
                Assert.AreEqual(requestBody, param["requestBody"]);
                return(new ApiResponse());
            });

            // act
            string[] urls = new string[]
            {
                "PUT/servers/" + endpoint + "/info",
                "PUT/servers/" + endpoint + "/matches/" + timestampString,
                "GET/servers/info",
                "GET/servers/" + endpoint + "/info",
                "GET/servers/" + endpoint + "/stats",
                "GET/servers/" + endpoint + "/matches/" + timestampString,
                "GET/players/" + name + "/stats",
                "GET/reports/recent-matches/" + countMatrix[0, 0],
                "GET/reports/best-players/" + countMatrix[1, 0],
                "GET/reports/popular-servers/" + countMatrix[2, 0]
            };

            // assert
            foreach (var url in urls)
            {
                Assert.AreEqual(HttpStatusCode.OK, routingTree.Route(url, requestBody).Status);
            }
        }