//添加机箱之间的连接 private void AddContainerLinks() { for (int i = 0; i < System.LinksArray.Length; i++) { var ctn = ModelFactory <Models.Container> .CreateByName(System.CntNames[i]); var bp = ModelFactory <Models.BackPlane> .CreateByName(ctn.BackPlaneName); int slot1 = bp.VirtualSlotsNum - 2;//外接口的槽位号 var links = System.LinksArray[i]; foreach (SystemStruLink link in links) { //创建一天原生子链接 var subLink = new RawTopo.RawSubLink(link.FirstEndPostion, link.SecondEndPostion); //找到在_rawTopo里面端点1对应的urlId int urlId1 = _rawTopo.NodeArray.Where(rNode => rNode.FrameId == link.FirstEndId && rNode.Type == EndType.VPX && rNode.SlotId == slot1) .Select(rNode => rNode.UrlId).FirstOrDefault(); //找到在_rawTopo里面端点1对应的urlId var ctn2 = ModelFactory <Models.Container> .CreateByName(System.CntNames[i]); var bp2 = ModelFactory <Models.BackPlane> .CreateByName(ctn.BackPlaneName); int slot2 = bp2.VirtualSlotsNum - 2; int urlId2 = _rawTopo.NodeArray.Where(rNode => rNode.FrameId == link.SecondEndId && rNode.Type == EndType.VPX && rNode.SlotId == slot2) .Select(rNode => rNode.UrlId).FirstOrDefault(); _rawTopo.AddSubLink(link.LinkType, urlId1, urlId2, subLink); } } }
//添加一个背板的描述到_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); } } }
//添加一个板卡的描述到图里面 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); } }