//添加一个背板的描述到_rawTopo里面 private void AddBackPlane(BackPlane bp, int frameId, ref int curUrlId) { //添加节点(槽位,包含虚拟槽位) for (int i = 0; i < bp.VirtualSlotsNum; i++) { RawTopo.RawNode bpNode = new RawTopo.RawNode(EndType.VPX, null, curUrlId++); bpNode.FrameId = frameId; bpNode.SlotId = i; _rawTopo.SetNodeValue(bpNode.UrlId, bpNode); } //加入link foreach (var links in bp.LinksArray) { foreach (var link in links) { var subLink = new RawTopo.RawSubLink(link.FirstEndPostion, link.SecondEndPostion, link.LanesNum); int urlId1 = _rawTopo.NodeArray .Where(node => ((node != null) && (node.SlotId == link.FirstEndId) && (node.Type == EndType.VPX) && (node.FrameId == frameId))) .Select(node => node.UrlId) .FirstOrDefault(); int urlId2 = _rawTopo.NodeArray .Where(node => ((node != null) && (node.SlotId == link.SecondEndId) && (node.Type == EndType.VPX) && (node.FrameId == frameId))) .Select(node => node.UrlId) .FirstOrDefault(); _rawTopo.AddSubLink(link.LinkType, urlId1, urlId2, subLink); } } }
//转化RawNode到与之对应的StaticNode private StaticNode RNodeToSNode(RawTopo.RawNode rNode) { var staticNode = _topoNet.NodeArray.Where(sNode => rNode.Type == sNode.NodeType && rNode.FrameId == sNode.FrameId && rNode.SlotId == sNode.SlotId && rNode.EndId == sNode.EndId).FirstOrDefault(); return(staticNode); }
//添加一个板卡的描述到图里面 private void AddBoard(Board board, int frameId, int slotId, ref int curUrlId) { //创建一个字典用于保存GraphNode的endId与UrlId的映射关系 Dictionary <int, int> endId2UrlId = new Dictionary <int, int>(); //1.添加节点到_nodeList #region //添加ppc节点到顶点集合 foreach (var ppc in board.PPCList) { var node = new RawTopo.RawNode(EndType.PPC, ppc.Name, curUrlId++); node.FrameId = frameId; node.SlotId = slotId; node.GenerateEndId(board.PPCList.IndexOf(ppc)); endId2UrlId.Add(node.EndId, node.UrlId); _rawTopo.SetNodeValue(node.UrlId, node); } //添加fpga节点到顶点集合 foreach (var fpga in board.FPGAList) { var node = new RawTopo.RawNode(EndType.FPGA, fpga.Name, curUrlId++); node.FrameId = frameId; node.SlotId = slotId; node.GenerateEndId(board.FPGAList.IndexOf(fpga)); endId2UrlId.Add(node.EndId, node.UrlId); _rawTopo.SetNodeValue(node.UrlId, node); } //添加zynq节点到顶点集合 foreach (var zynq in board.ZYNQList) { var node = new RawTopo.RawNode(EndType.ZYNQ, zynq.Name, curUrlId++); node.FrameId = frameId; node.SlotId = slotId; node.GenerateEndId(board.ZYNQList.IndexOf(zynq)); endId2UrlId.Add(node.EndId, node.UrlId); _rawTopo.SetNodeValue(node.UrlId, node); } //添加sw节点到顶点集合 foreach (var sw in board.SwitchList) { //这里的交换机的名字用Type代替 var node = new RawTopo.RawNode(EndType.SW, sw.Type, curUrlId++); node.FrameId = frameId; node.SlotId = slotId; node.GenerateEndId(board.SwitchList.IndexOf(sw)); endId2UrlId.Add(node.EndId, node.UrlId); _rawTopo.SetNodeValue(node.UrlId, node); } //不用添加板卡上的vpx节点到顶点集合,因为该vpx一定对应了一个backPlane的slot #endregion //2.添加link到对应的matrix foreach (var link in board.LinkList) { //把每一条link都加入到matrix里面 var subLink = new RawTopo.RawSubLink(link.FirstEndPositionList[0], link.SecondEndPositionList[0]); //端1一般为板卡上的芯片不为vpx,端2才可能会包含vpx类型 int urlId1 = endId2UrlId[RawTopo.RawNode.CalculateEndId(link.FirstEndType, link.FirstEndId)]; int urlId2 = 0; if (link.SecondEndType == EndType.VPX) { //直接去找vpx插在相应槽位的urlId urlId2 = _rawTopo.NodeArray .Where(node => ((node != null) && (node.SlotId == slotId) && (node.Type == EndType.VPX) && (node.FrameId == frameId))) .Select(node => node.UrlId) .FirstOrDefault(); } else { urlId2 = endId2UrlId[RawTopo.RawNode.CalculateEndId(link.SecondEndType, link.SecondEndId)]; } _rawTopo.AddSubLink(link.LinkType, urlId1, urlId2, subLink); } }