Ejemplo n.º 1
0
        public static TileKey GetDestination(Tile start, FPGATypes.Direction direction, int stepWidth)
        {
            TileKey targetKey;

            if (direction.Equals(FPGATypes.Direction.North))
            {
                targetKey = new TileKey(start.TileKey.X, start.TileKey.Y - stepWidth);
                return(targetKey);
                //return FPGA.FPGA.Instance.GetTile(targetKey);
            }
            else if (direction.Equals(FPGATypes.Direction.South))
            {
                targetKey = new TileKey(start.TileKey.X, start.TileKey.Y + stepWidth);
                return(targetKey);
                //return FPGA.FPGA.Instance.GetTile(targetKey);
            }
            else if (direction.Equals(FPGATypes.Direction.East))
            {
                targetKey = new TileKey(start.TileKey.X + stepWidth, start.TileKey.Y);
                return(targetKey);
                //return FPGA.FPGA.Instance.GetTile(targetKey);
            }
            else if (direction.Equals(FPGATypes.Direction.West))
            {
                targetKey = new TileKey(start.TileKey.X - stepWidth, start.TileKey.Y);
                return(targetKey);
                //return FPGA.FPGA.Instance.GetTile(targetKey);
            }
            else
            {
                throw new Exception("Unknown direction: " + direction);
            }
        }
        private Tile GetCorner(string identifier, FPGATypes.Direction dir)
        {
            Tile tile = null;

            if (FPGA.FPGA.Instance.Contains(identifier))
            {
                tile = FPGA.FPGA.Instance.GetTile(identifier);
            }
            else if (identifier.Contains("_"))
            {
                int    split  = identifier.IndexOf('_');
                string prefix = identifier.Substring(0, split + 1);
                string suffix = identifier.Substring(split, identifier.Length - split);
                tile = FPGA.FPGA.Instance.GetAllTiles().FirstOrDefault(t => t.Location.StartsWith(prefix) && t.Location.EndsWith(suffix));
                // if we can not resolve the identifer, triggger error handling in Do
                if (tile == null)
                {
                    return(null);
                }
            }
            else
            {
                return(null);
            }

            List <Tile> otherTiles = new List <Tile>();

            otherTiles.Add(tile);

            // there might be more left interconnects
            if (IdentifierManager.Instance.IsMatch(tile.Location, IdentifierManager.RegexTypes.CLB))
            {
                otherTiles.Add(FPGATypes.GetInterconnectTile(tile));
            }
            else if (IdentifierManager.Instance.IsMatch(tile.Location, IdentifierManager.RegexTypes.Interconnect))
            {
                foreach (Tile o in FPGATypes.GetCLTile(tile))
                {
                    otherTiles.Add(o);
                }
            }
            if (dir == FPGATypes.Direction.West)
            {
                int min = otherTiles.Min(t => t.TileKey.X);
                return(otherTiles.FirstOrDefault(t => t.TileKey.X == min));
            }
            else if (dir == FPGATypes.Direction.East)
            {
                int max = otherTiles.Max(t => t.TileKey.X);
                return(otherTiles.FirstOrDefault(t => t.TileKey.X == max));
            }
            else
            {
                throw new ArgumentException(GetType().Name + ".GetCorner only supports East and West");
            }
        }
Ejemplo n.º 3
0
        public static IEnumerable <Location> GetDestination(Tile where, Port exit)
        {
            //SE5BEG2
            //SL2BEG1
            //SL5BEG2

            String portName = exit.ToString();

            if (Regex.IsMatch(portName, "(E|N|S|W)(E|N|S|W|L|R)(2|5)BEG") && !Regex.IsMatch(portName, "_"))
            {
                int distance = int.Parse(portName.Substring(2, 1));
                //int index = int.Parse(portName.Substring(6, portName.Length - 6));

                //mid
                FPGATypes.Direction dir1 = FPGA.FPGATypes.GetDirectionFromString(portName.Substring(0, 1));

                int startX = where.LocationX;
                int startY = where.LocationY;

                int midX;
                int midY;

                //double lines
                if (dir1.Equals(FPGATypes.Direction.East) && distance == 2)
                {
                    midX = startX + 1;
                    midY = startY;
                }
                else if (dir1.Equals(FPGATypes.Direction.North) && distance == 2)
                {
                    midX = startX;
                    midY = startY + 1;
                }
                else if (dir1.Equals(FPGATypes.Direction.South) && distance == 2)
                {
                    midX = startX;
                    midY = startY - 1;
                }
                else if (dir1.Equals(FPGATypes.Direction.West) && distance == 2)
                {
                    midX = startX - 1;
                    midY = startY;
                }
                //pent lines
                else if (dir1.Equals(FPGATypes.Direction.East) && distance == 5)
                {
                    midX = startX + 3;
                    midY = startY;
                }
                else if (dir1.Equals(FPGATypes.Direction.North) && distance == 5)
                {
                    midX = startX;
                    midY = startY + 3;
                }
                else if (dir1.Equals(FPGATypes.Direction.South) && distance == 5)
                {
                    midX = startX;
                    midY = startY - 3;
                }
                else if (dir1.Equals(FPGATypes.Direction.West) && distance == 5)
                {
                    midX = startX - 3;
                    midY = startY;
                }
                else
                {
                    throw new ArgumentException("Can not handle port " + exit);
                }

                String locationFirstPart = Regex.Split(where.Location, "_")[0];
                String midTargetLocation = locationFirstPart + "_X" + midX.ToString() + "Y" + midY.ToString();

                if (FPGA.FPGA.Instance.Contains(midTargetLocation))
                {
                    Tile midTarget = FPGA.FPGA.Instance.GetTile(midTargetLocation);
                    Port midEnter  = new Port(Regex.Replace(portName, "BEG", "MID"));

                    //return mid
                    yield return(new Location(midTarget, midEnter));
                }

                int endX;
                int endY;

                FPGATypes.Direction dir2;
                String dir2String = portName.Substring(1, 1);
                if (Regex.IsMatch(dir2String, "(R|L)"))
                {
                    dir2 = dir1;
                }
                else
                {
                    dir2 = FPGA.FPGATypes.GetDirectionFromString(dir2String);
                }

                //double lines
                if (dir2.Equals(FPGATypes.Direction.East) && distance == 2)
                {
                    endX = midX + 1;
                    endY = midY;
                }
                else if (dir2.Equals(FPGATypes.Direction.North) && distance == 2)
                {
                    endX = midX;
                    endY = midY + 1;
                }
                else if (dir2.Equals(FPGATypes.Direction.South) && distance == 2)
                {
                    endX = midX;
                    endY = midY - 1;
                }
                else if (dir2.Equals(FPGATypes.Direction.West) && distance == 2)
                {
                    endX = midX - 1;
                    endY = midY;
                }
                //pent lines
                else if (dir2.Equals(FPGATypes.Direction.East) && distance == 5)
                {
                    endX = midX + 2;
                    endY = midY;
                }
                else if (dir2.Equals(FPGATypes.Direction.North) && distance == 5)
                {
                    endX = midX;
                    endY = midY + 2;
                }
                else if (dir2.Equals(FPGATypes.Direction.South) && distance == 5)
                {
                    endX = midX;
                    endY = midY - 2;
                }
                else if (dir2.Equals(FPGATypes.Direction.West) && distance == 5)
                {
                    endX = midX - 2;
                    endY = midY;
                }
                else
                {
                    throw new ArgumentException("Can not handle port " + exit);
                }

                String endTargetLocation = locationFirstPart + "_X" + endX.ToString() + "Y" + endY.ToString();

                if (FPGA.FPGA.Instance.Contains(endTargetLocation))
                {
                    Tile endTarget = FPGA.FPGA.Instance.GetTile(endTargetLocation);
                    Port endEnter  = new Port(Regex.Replace(portName, "BEG", "END"));

                    //return mid
                    yield return(new Location(endTarget, endEnter));
                }
            }
            else if (Regex.IsMatch(portName, "^L(V|H)(0|18)$"))
            {
                /*
                 * foreach (Tuple<String, String> nextWire in where.GetAllConnectedWires(portName))
                 * {
                 *  if (Regex.IsMatch(nextWire.Value, "^L(V|H)(0|6|12|18)"))
                 *  {
                 *      if (FPGA.FPGA.Instance.Contains(nextWire.Key))
                 *      {
                 *          Tile targetTile = FPGA.FPGA.Instance.GetTile(nextWire.Key);
                 *          Port targetPort = new Port(nextWire.Value);
                 *          yield return new Location(targetTile, targetPort);
                 *      }
                 *      else
                 *      {
                 *      }
                 *
                 *  }
                 * }
                 * */
            }
        }