Exemple #1
0
        public List <int[]> plotOneTrace(GridPoint[] trace, String bidirection)
        {
            //因为点最多5个,变成线段也最多10个
            //GridPoint[] trace = new GridPoint[20];
            //判断是否是拐点并记录下来
            GridPoint[] line = new GridPoint[20];
            line = trace;
            //int n = 0;
            //int[][] lineTxt = new int[line.Length / 2][];
            List <int[]> lineLong = new List <int[]>();

            //for (int i = 0; i < line.Length / 2; i++)
            //{
            //    lineTxt[i] = new int[5];
            //}
            //line[0] = trace[0];
            //n++;
            //for (int m = 1; m < trace.Length; m++)
            //{
            //    if (!(trace[m] == null))
            //    {
            //        if (trace[m + 1] == null)
            //        {
            //            line[n] = trace[m];
            //            n++;
            //            break;
            //        }
            //        bool k0 = (trace[m - 1].getPosx() == trace[m].getPosx())
            //                && (trace[m + 1].getPosx() == trace[m].getPosx());
            //        bool k1 = (trace[m - 1].getPosy() == trace[m].getPosy())
            //                && (trace[m + 1].getPosy() == trace[m].getPosy());
            //        if (k0 || k1)
            //        {
            //            continue;
            //        }
            //        else
            //        {
            //            line[n] = trace[m];
            //            n++;
            //        }
            //    }
            //}
            //////////////////////////////对于第一条线段和最后一条线段需要标明有没有箭头,
            if (line[2] == null)
            {
                if (int.Parse(bidirection) == 1)
                {
                    int[] lineOne = new int[5];
                    lineOne[0] = line[0].getPosx();
                    lineOne[1] = line[0].getPosy();
                    lineOne[2] = line[0 + 1].getPosx();
                    lineOne[3] = line[0 + 1].getPosy();
                    lineOne[4] = 3; //双向
                    lineLong.Add(lineOne);
                }
                else
                {
                    int[] lineOne = new int[5];
                    lineOne[0] = line[0].getPosx();
                    lineOne[1] = line[0].getPosy();
                    lineOne[2] = line[0 + 1].getPosx();
                    lineOne[3] = line[0 + 1].getPosy();
                    lineOne[4] = GetDirectionInfo(lineOne[0], lineOne[1], lineOne[2], lineOne[3], 0);//终止点有箭头
                    lineLong.Add(lineOne);
                }
            }
            else
            {
                if (int.Parse(bidirection) == 1)
                {
                    int[] lineOne = new int[5];
                    lineOne[0] = line[0].getPosx();
                    lineOne[1] = line[0].getPosy();
                    lineOne[2] = line[0 + 1].getPosx();
                    lineOne[3] = line[0 + 1].getPosy();
                    lineOne[4] = GetDirectionInfo(lineOne[0], lineOne[1], lineOne[2], lineOne[3], 1);//起始点有箭头
                    lineLong.Add(lineOne);
                }
                else
                {
                    int[] lineOne = new int[5];
                    lineOne[0] = line[0].getPosx();
                    lineOne[1] = line[0].getPosy();
                    lineOne[2] = line[0 + 1].getPosx();
                    lineOne[3] = line[0 + 1].getPosy();
                    lineOne[4] = 0;
                    lineLong.Add(lineOne);
                }
                int index = 0;

                for (int i = 1; i < line.Length - 1; i++)
                {
                    if (!(line[i + 2] == null))
                    {
                        int[] lineOne = new int[5];
                        lineOne[0] = line[i].getPosx();
                        lineOne[1] = line[i].getPosy();
                        lineOne[2] = line[i + 1].getPosx();
                        lineOne[3] = line[i + 1].getPosy();
                        lineOne[4] = 0;
                        lineLong.Add(lineOne);
                    }
                    else
                    {
                        index = i;
                        break;
                    }
                }
                int[] lineOneIndex = new int[5];
                lineOneIndex[0] = line[index].getPosx();
                lineOneIndex[1] = line[index].getPosy();
                lineOneIndex[2] = line[index + 1].getPosx();
                lineOneIndex[3] = line[index + 1].getPosy();
                lineOneIndex[4] = GetDirectionInfo(lineOneIndex[0], lineOneIndex[1], lineOneIndex[2], lineOneIndex[3], 0);//终止点有箭头
                lineLong.Add(lineOneIndex);
            }
            return(lineLong);
        }
Exemple #2
0
        public void setRouteForModules(ModuleOne[] modules, List <RelationOperator.relation> relation, int[] rows, int[] columns, List <ModuleOne.LineInfo> allLine)
        {
            ModuleOne.gapy = ModuleOne.mody - ModuleOne.getHeight();
            ModuleOne.gapx = ModuleOne.modx - ModuleOne.getWidth();

            int[] step_column = new int[columns.Length]; //记录每个区域的划分间隔
            int[] step_row    = new int[rows.Length];
            int[] r           = new int[rows.Length];    //记录每个区域已被划分的线的数量
            int[] c           = new int[columns.Length];
            for (int m = 0; m < rows.Length; m++)
            {
                step_column[m] = ModuleOne.gapy / (rows[m] + 1);
                step_row[m]    = ModuleOne.gapx / (columns[m] + 1);
            }
            step_column[0] = ModuleOne.gapy / (2 * rows[0] + 1);                                   //最上面区域的划分间隔适当减小
            step_row[columns.Length - 1] = ModuleOne.gapx / (2 * columns[columns.Length - 1] + 1); //最右边区域的划分间隔减小
            GridPoint start  = null;
            GridPoint target = null;

            foreach (RelationOperator.relation relationOne in relation)
            {
                ModuleOne moduleSource = modules[ModuleOne.GetIndex(modules, relationOne.sourceName)];
                ModuleOne moduleTarget = modules[ModuleOne.GetIndex(modules, relationOne.targetName)];
                string    bidirection  = relationOne.bidirection;
                string    relationName = relationOne.relationName;
                string    comment      = relationOne.comment;
                int       show         = relationOne.show;
                int       com          = moduleSource.compareModuleAdd(moduleTarget);
                int       numMax       = 0; //记录上下或左右有直连关系时,模块的引脚数量的最大值
                //根据模块的位置关系分配引脚
                switch (com)
                {
                case 1:
                    numMax = Math.Max(moduleSource.getNumNorth(), moduleTarget.getNumSouth());
                    start  = moduleSource.northPin(GridPoint.myGrid, com, numMax);
                    target = moduleTarget.southPin(GridPoint.myGrid, com, numMax);
                    break;

                case 2:
                case 8:
                    start  = moduleSource.northPin(GridPoint.myGrid, com, numMax);
                    target = moduleTarget.southPin(GridPoint.myGrid, com, numMax);
                    break;

                case 3:
                    numMax = Math.Max(moduleSource.getNumEast(), moduleTarget.getNumWest());
                    start  = moduleSource.eastPin(GridPoint.myGrid, com, numMax);
                    target = moduleTarget.westPin(GridPoint.myGrid, com, numMax);
                    break;

                case 11:
                case 13:
                    start  = moduleSource.eastPin(GridPoint.myGrid, com, numMax);
                    target = moduleTarget.westPin(GridPoint.myGrid, com, numMax);
                    break;

                case 5:
                    numMax = Math.Max(moduleSource.getNumSouth(), moduleTarget.getNumNorth());
                    start  = moduleSource.southPin(GridPoint.myGrid, com, numMax);
                    target = moduleTarget.northPin(GridPoint.myGrid, com, numMax);
                    break;

                case 6:
                case 4:
                    start  = moduleSource.southPin(GridPoint.myGrid, com, numMax);
                    target = moduleTarget.northPin(GridPoint.myGrid, com, numMax);
                    break;

                case 7:
                    numMax = Math.Max(moduleSource.getNumWest(), moduleTarget.getNumEast());
                    start  = moduleSource.westPin(GridPoint.myGrid, com, numMax);
                    target = moduleTarget.eastPin(GridPoint.myGrid, com, numMax);
                    break;

                case 9:
                case 15:
                    start  = moduleSource.westPin(GridPoint.myGrid, com, numMax);
                    target = moduleTarget.eastPin(GridPoint.myGrid, com, numMax);
                    break;

                case 10:
                case 14:
                    start  = moduleSource.eastPin(GridPoint.myGrid, com, numMax);
                    target = moduleTarget.eastPin(GridPoint.myGrid, com, numMax);
                    break;

                case 12:
                case 16:
                    start  = moduleSource.northPin(GridPoint.myGrid, com, numMax);
                    target = moduleTarget.northPin(GridPoint.myGrid, com, numMax);
                    break;

                case 17:
                    start  = moduleSource.northPin(GridPoint.myGrid, com, numMax);
                    target = moduleTarget.eastPin(GridPoint.myGrid, com, numMax);
                    break;

                case 18:
                    start  = moduleSource.northPin(GridPoint.myGrid, com, numMax);
                    target = moduleTarget.westPin(GridPoint.myGrid, com, numMax);
                    break;

                case 19:
                    start  = moduleSource.southPin(GridPoint.myGrid, com, numMax);
                    target = moduleTarget.westPin(GridPoint.myGrid, com, numMax);
                    break;

                case 20:
                    start  = moduleSource.southPin(GridPoint.myGrid, com, numMax);
                    target = moduleTarget.eastPin(GridPoint.myGrid, com, numMax);
                    break;

                default:
                    Console.WriteLine("no left pin");
                    break;
                }
                List <int[]> lineOnePath = Route(start, target, com, rows, columns, r, c, step_row, step_column, moduleSource, moduleTarget, bidirection);
                saveLine(lineOnePath, allLine, relationName, comment, show);
            }
        }
Exemple #3
0
        public List <int[]> Route(GridPoint start, GridPoint target, int com, int[] rows, int[] columns, int[] r, int[] c, int[] step_row, int[] step_column, ModuleOne mi, ModuleOne mj, string bidirection)
        {//返回一条路径所对应的线段
            //if (start == null || target == null)
            //    return -1;
            GridPoint[] trace = new GridPoint[6];
            //记录一条路径的拐点,根据已有的布线算法,拐点最多3个,点有5个,最后的记录为null
            int          x       = 0; //根据模块的位置求出模块所属区域
            int          y       = 0;
            int          delta_x = 0;
            int          delta_y = 0;
            List <int[]> line    = new List <int[]>();

            if (start == target)
            {
                Console.WriteLine("start and target are the same!");
            }
            else
            {
                trace[0] = start;
                switch (com)
                {
                case 1:
                case 3:
                case 5:
                case 7:
                    trace[1] = target;
                    break;

                case 2:
                case 8:
                    y        = start.getPosy() / ModuleOne.mody;
                    trace[1] = start.northStepVertex(r[y], step_column[y]);
                    r[y]    += 1;
                    delta_x  = target.getPosx() - start.getPosx();
                    trace[2] = trace[1].horizontalStepVertex(delta_x);
                    trace[3] = target;
                    break;

                case 4:
                case 6:
                    y        = start.getPosy() / ModuleOne.mody + 1;
                    trace[1] = start.southStepVertex(r[y], step_column[y]);
                    r[y]    += 1;
                    delta_x  = target.getPosx() - start.getPosx();
                    trace[2] = trace[1].horizontalStepVertex(delta_x);
                    trace[3] = target;
                    break;

                case 9:
                case 15:
                    x        = start.getPosx() / ModuleOne.modx - 1;
                    trace[1] = trace[0].westStepVertex(c[x], step_row[x]);
                    c[x]    += 1;
                    delta_y  = target.getPosy() - start.getPosy();
                    trace[2] = trace[1].verticalStepVertex(delta_y);
                    trace[3] = target;
                    break;

                case 10:
                case 14:
                    x        = start.getPosx() / ModuleOne.modx;
                    trace[1] = start.eastStepVertex(c[x], step_row[x]);
                    c[x]    += 1;
                    delta_y  = target.getPosy() - start.getPosy();
                    trace[2] = trace[1].verticalStepVertex(delta_y);
                    trace[3] = target;
                    break;

                case 12:
                case 16:
                    y        = start.getPosy() / ModuleOne.mody;
                    trace[1] = start.northStepVertex(r[y], step_column[y]);
                    r[y]    += 1;
                    delta_x  = target.getPosx() - start.getPosx();
                    trace[2] = trace[1].horizontalStepVertex(delta_x);
                    trace[3] = target;
                    break;

                case 13:
                case 11:
                    x        = start.getPosx() / ModuleOne.modx;
                    trace[1] = trace[0].eastStepVertex(c[x], step_row[x]);
                    c[x]    += 1;
                    delta_y  = target.getPosy() - start.getPosy();
                    trace[2] = trace[1].verticalStepVertex(delta_y);
                    trace[3] = target;
                    break;

                case 17:
                    y        = start.getPosy() / ModuleOne.mody;
                    trace[1] = start.northStepVertex(r[y], step_column[y]);
                    r[y]    += 1;
                    trace[4] = target;
                    x        = target.getPosx() / ModuleOne.modx;
                    trace[3] = trace[4].eastStepVertex(c[x], step_row[x]);
                    c[x]    += 1;
                    delta_y  = trace[1].getPosy() - trace[3].getPosy();
                    trace[2] = trace[3].verticalStepVertex(delta_y);
                    break;

                case 18:
                    y        = start.getPosy() / ModuleOne.mody;
                    trace[1] = start.northStepVertex(r[y], step_column[y]);
                    r[y]    += 1;
                    trace[4] = target;
                    x        = target.getPosx() / ModuleOne.modx - 1;
                    trace[3] = trace[4].westStepVertex(c[x], step_row[x]);
                    c[x]    += 1;
                    delta_y  = trace[1].getPosy() - trace[3].getPosy();
                    trace[2] = trace[3].verticalStepVertex(delta_y);
                    break;

                case 19:
                    y        = start.getPosy() / ModuleOne.mody + 1;
                    trace[1] = start.southStepVertex(r[y], step_column[y]);
                    r[y]    += 1;
                    trace[4] = target;
                    x        = target.getPosx() / ModuleOne.modx - 1;
                    trace[3] = trace[4].westStepVertex(c[x], step_row[x]);
                    c[x]    += 1;
                    delta_y  = trace[1].getPosy() - trace[3].getPosy();
                    trace[2] = trace[3].verticalStepVertex(delta_y);
                    break;

                case 20:
                    y        = start.getPosy() / ModuleOne.mody + 1;
                    trace[1] = start.southStepVertex(r[y], step_column[y]);
                    r[y]    += 1;
                    trace[4] = target;
                    x        = target.getPosx() / ModuleOne.modx;
                    trace[3] = trace[4].eastStepVertex(c[x], step_row[x]);
                    c[x]    += 1;
                    delta_y  = trace[1].getPosy() - trace[3].getPosy();
                    trace[2] = trace[3].verticalStepVertex(delta_y);
                    break;

                default:
                    break;
                }
                //需要传入是否双向
                line = plotOneTrace(trace, bidirection);
            }
            return(line);
        }