Exemple #1
0
        public void SetPriority()
        {
            List<NodeDistanceBase> lst = nodeDistanceDict.Values.ToList();

            lst.Sort(NodeDistanceBase.CompareBaseByDist);
            int countNd = lst.Count;

            conflictManager.SetBestPriority(lst.First().name);

            int curPrior = Params.maxPriority;

            foreach (NodeDistanceBase disBase in lst)
            {
                Node processNode = nodeList.Find(element => element.name == disBase.name);

                /*List<int> priorites = nodeDistanceDict[processNode.name].GetPriorites(processNode.arcCollection.Count, curPrior);
                if (priorites.Count > 0)
                    curPrior = priorites.Last() - 1;
                else*/
                    //curPrior--;

                List<int> idxPass = new List<int>();
                for (int i = 0; i < processNode.arcCollection.Count; i++)
                {
                    int idx = nodeDistanceDict[disBase.name].GetNumber(i);
                    ContactSimple cnt = processNode.arcCollection[i];

                    if ( idxPass.FindIndex(el => el == idx) < 0 )
                    {
                        idxPass.Add(idx);
                        List<ContactSimple> startWave = FindStartPoint(new ContactSimple(
                            processNode.arcCollection[idx]), processNode.name);
                        SetContact(startWave, processNode.name, idx, curPrior, 0);
                        NodePointProcess proc = new NodePointProcess(GetPoint(startWave[0]), false);
                        int count = CompleteSpreadWaveProcess(startWave, proc);//SpreadWaveProcess
                        disBase.SetCountForNumber(i, count);
                    }
                }
                curPrior--;
            }
        }
Exemple #2
0
        public void SpreadAllWaves()
        {
            foreach (Node curNode in nodeList)
            {
                List<int> idxPass = new List<int>();
                for (int i = 0; i < curNode.arcCollection.Count; i++)
                {
                    int idx = nodeDistanceDict[curNode.name].GetNumber(i);
                    //Contact cnt = processNode.arcCollection[i];

                    if ( idxPass.FindIndex(el => el == idx) < 0 )
                    {
                        idxPass.Add(idx);
                        List<ContactSimple> startWave = FindStartContacts(new ContactSimple(
                            curNode.arcCollection[idx]), curNode.name);

                        SetContactNumber(startWave, 0);
                        NodePointProcess proc = new NodePointProcess(GetPoint(startWave[0]), false);
                        int count = CompleteSpreadWaveProcess(startWave, proc);
                        nodeDistanceDict[curNode.name].SetCountForNumber(idx, count);
                    }
                }
            }
        }
Exemple #3
0
        public List<ContactSimple> ReturnAllWaveProcess(List<ContactSimple> inStart, NodePointProcess pntProcess)
        {
            string currentName = layoutMap[inStart[0].x][inStart[0].y][inStart[0].layer].name;

            List<ContactSimple> nextPoints = new List<ContactSimple>();//inStart.GetArroundPoints(wide);
            nextPoints.AddRange(inStart);
            List<ContactSimple> arround = new List<ContactSimple>();
            List<ContactSimple> passedPoints = new List<ContactSimple>();
            if (diffusionException.FindIndex(el => el == currentName) >= 0)
            {
                List<ContactSimple> thisWave = SetOneWave(nextPoints, passedPoints, pntProcess, currentName);
                SetOneWave(thisWave, passedPoints, pntProcess, currentName);
                nextPoints.AddRange(thisWave);
                passedPoints.AddRange(thisWave);
            }
            passedPoints.AddRange(inStart);

            do
            {
                arround.Clear();
                foreach (ContactSimple cntOneLay in nextPoints)
                {
                    foreach (int layer in Params.allLayersRange[cntOneLay.layer])//GetOppositeLayers(cntOneLay.layer))
                    {
                        ContactSimple cnt = new ContactSimple(cntOneLay, layer);
                        if ( IsPointsConnected(cnt, cntOneLay.layer, layer, currentName) )//GetPoint(cnt).name == currentName)
                        {
                            foreach (ContactSimple cntNebor in cnt.GetArroundPoints(wide))
                            {
                                if ( (GetPoint(cntNebor).name == currentName) &&
                                (passedPoints.FindIndex(el => el == cntNebor) < 0) &&
                                (arround.FindIndex(el => el == cntNebor) < 0) )
                                {
                                    NodePoint pn1 = GetPoint(cntNebor);
                                    NodePoint pn2 = GetPoint(cntOneLay);
                                    if ( pn1.numberNode != pn2.numberNode)
                                        pn1 = GetPoint(cntNebor);

                                    arround.Add(cntNebor);
                                }
                                /*{
                                    if ((cntNebor.layer != cntOneLay.layer) && (cntNebor.layer == Layers.siliconTrace ||
                                                                            cntOneLay.layer == Layers.siliconTrace) &&
                                                                           (GetPoint(cntNebor, Layers.contactTrace).name == Material.diffusionName) )
                                        ;
                                    else
                                    {
                                        NodePoint pn1 = GetPoint(cntNebor);
                                        NodePoint pn2 = GetPoint(cntOneLay);
                                        if ( pn1.numberNode != pn2.numberNode)
                                            pn1 = GetPoint(cntNebor);
                                        if ( cntNebor.x == 31 && (cntNebor.y == 21 || cntNebor.y == 22) && cntNebor.layer == 1)
                                            pn1 = GetPoint(cntNebor);

                                        arround.Add(cntNebor);
                                    }
                                }*/
                            }
                            if (GetPoint(cnt).isSource)
                            {
                                NodePoint np2 = GetPoint(cnt);
                                if (cnt.x == 19 && cnt.y == 33 && cnt.layer == 1)
                                    np2 = GetPoint(cnt);

                                foreach (ContactSimple cntNebor in GetSourceContacts(cnt, currentName))
                                {
                                    NodePoint np1 = GetPoint(cntNebor);
                                    if (cnt.x == 19 && cnt.y == 33 && cnt.layer == 1)
                                        np1 = GetPoint(cntNebor);

                                    if ( GetPoint(cntNebor).isSource && (GetPoint(cntNebor).name == currentName) &&
                                    (passedPoints.FindIndex(el => el == cntNebor) < 0) &&
                                    (arround.FindIndex(el => el == cntNebor) < 0) )//&& FindSource(cnt) && FindSource(cntNebor) )
                                    {
                                        NodePoint pn1 = GetPoint(cntNebor);
                                        NodePoint pn2 = GetPoint(cntOneLay);
                                        if ( pn1.numberNode != pn2.numberNode)
                                            pn1 = GetPoint(cntNebor);

                                        arround.Add(cntNebor);
                                    }
                                }
                            }
                        }
                    }
                }
                nextPoints.Clear();
                nextPoints.AddRange(arround);
                passedPoints.AddRange(arround);

                pntProcess.IncrementNumber();

                bool continueMark  = false;
                do
                {
                    List<ContactSimple> wave = SetOneWave(arround, passedPoints, pntProcess, currentName);
                    nextPoints.AddRange(wave);
                    passedPoints.AddRange(wave);

                    arround = wave;
                    continueMark = false;
                    if (wave.Count > 0)
                        continueMark = true;
                } while (continueMark);
                //passedPoints.AddRange(nextPoints);

                    /*if (cntUnit.x == 14 && cntUnit.y == 5 && cntUnit.layer == Layers.siliconTrace)
                        b = true;*/
            } while (nextPoints.Count > 0);

            NodePoint np3 = GetPoint(inStart[0]);
            foreach(ContactSimple cnt in passedPoints)
            {
                if (cnt.x == 35 && cnt.y == 37 && cnt.layer == 1)
               			np3 = GetPoint(cnt);
            }

            return passedPoints;
        }
Exemple #4
0
        /*
        private void ClearVccGnd()
        {
            Node curNode = nodeList.Find(el => el .name == conflictManager.GetBestPriority());
            int curX = curNode.arcCollection[conflictManager.GetBlocadedNumber()].x;
            int curY = curNode.arcCollection[conflictManager.GetBlocadedNumber()].y;
            List<string> namesException = new List<string>();
            List<Contact> contactsException = new List<Contact>();

            foreach (Node nd in nodeList)
            {
                if (diffusionExeption.FindIndex(el => el == nd.name) >= 0)
                {
                    foreach (Contact cnt in nd.arcCollection)
                    {
                        if ( (Math.Abs(cnt.x -  curX) <= 2) && (cnt.y == curY) )
                        {
                            contactsException.Add(cnt);
                            namesException.Add(nd.name);
                        }
                    }
                }
            }

            for (int i = 0; i < contactsException.Count; i++)
            {
                List<Contact> sources = GetSourceContacts(contactsException[i], namesException[i]);
            }

        }*/
        //public void TrySet
        public void SetAllSamePriority()
        {
            foreach (NodeDistanceBase disBase in nodeDistanceDict.Values)
            {
                Node processNode = nodeList.Find(element => element.name == disBase.name);

                List<int> idxPass = new List<int>();
                for (int i = 0; i < processNode.arcCollection.Count; i++)
                {
                    int idx = nodeDistanceDict[disBase.name].GetNumber(i);
                    ContactSimple cnt = processNode.arcCollection[i];

                    if ( idxPass.FindIndex(el => el == idx) < 0 )
                    {
                        idxPass.Add(idx);
                        List<ContactSimple> startWave = FindStartContacts(new ContactSimple(
                            processNode.arcCollection[idx]), processNode.name);

                        SetContact(startWave, processNode.name, idx, 1, 0);
                        NodePointProcess proc = new NodePointProcess(GetPoint(startWave[0]), false);
                        int count = CompleteSpreadWaveProcess(startWave, proc);
                        disBase.SetCountForNumber(i, count);

                    }
                    CheckOnePoint();
                }
            }
        }
Exemple #5
0
        public int CompleteSpreadWaveProcessRem(List<ContactSimple> inStart, NodePointProcess pntProcess)
        {
            string currentName = layoutMap[inStart[0].x][inStart[0].y][inStart[0].layer].name;

            List<ContactSimple> nextPoints = new List<ContactSimple>(inStart);//inStart.GetArroundPoints(wide);
            //nextPoints.AddRange(inStart);
            List<ContactSimple> arround = new List<ContactSimple>();
            List<ContactSimple> passedPoints = new List<ContactSimple>(inStart);
            //if (diffusionException.FindIndex(el => el == currentName) >= 0)
            {
                List<ContactSimple> thisWave = SetOneWave(nextPoints, passedPoints, pntProcess, currentName);
                SetOneWave(thisWave, passedPoints, pntProcess, currentName);
                nextPoints.AddRange(thisWave);
                passedPoints.AddRange(thisWave);
            }
            //passedPoints.AddRange(inStart); 22 step!!!!!!!!!!! VCC

            do
            {
                /*bool continueMark  = false;
                do
                {
                    List<ContactSimple> wave = SetOneWave(nextPoints, passedPoints, pntProcess, currentName);
                    nextPoints.AddRange(wave);
                    passedPoints.AddRange(wave);

                    arround = wave;
                    continueMark = false;
                    if (wave.Count > 0)
                        continueMark = true;
                } while (continueMark);
                */

                foreach (ContactSimple cntOneLay in nextPoints)
                {
                        //if (GetPoint(cnt).name == currentName)
                        //{
                    foreach (ContactSimple cntNebor in cntOneLay.GetArroundPoints(wide))
                    {
                        if ( (GetPoint(cntNebor).name == currentName) &&
                            (passedPoints.FindIndex(el => el == cntNebor) < 0) &&
                            (arround.FindIndex(el => el == cntNebor) < 0) )
                        {
                            SetPoinProcess(cntNebor, cntNebor, pntProcess);
                            arround.Add(cntNebor);

                            //foreach (int layer in Params.GetOppositeLayers(cntNebor.layer))
                            foreach (ContactSimple cnt in GetPointsInLayers(cntNebor, currentName))
                            {
                                //ContactSimple cnt = new ContactSimple(cntNebor, layer);

                                if ( //IsPointsConnected(cnt, cntNebor.layer, layer, currentName) &&
                                (passedPoints.FindIndex(el => el == cnt) < 0) &&
                                (arround.FindIndex(el => el == cnt) < 0) )
                                {
                                    if (SetPoinProcess(cntNebor, cnt, pntProcess))
                                    {
                                        arround.Add(cnt);

                                        if (GetPoint(cnt).isSource)
                                        {
                                            foreach (ContactSimple sourceContact in GetSourceContacts(cnt, currentName))
                                            {
                                                if ( GetPoint(sourceContact).isSource && FindTrueSource(sourceContact) && (GetPoint(sourceContact).name == currentName) &&
                                                (passedPoints.FindIndex(el => el == sourceContact) < 0) &&
                                                (arround.FindIndex(el => el == sourceContact) < 0) )//&& FindSource(cnt) && FindSource(cntNebor) )
                                                {
                                                    SetPoinProcess(sourceContact, sourceContact, pntProcess);
                                                    arround.Add(sourceContact);
                                                }
                                            }
                                        }
                                    }
                                }
                            }

                            if (GetPoint(cntNebor).isSource)
                            {
                                foreach (ContactSimple sourceContact in GetSourceContacts(cntNebor, currentName))
                                {
                                    if ( GetPoint(sourceContact).isSource && FindTrueSource(sourceContact) && (GetPoint(sourceContact).name == currentName) &&
                                    (passedPoints.FindIndex(el => el == sourceContact) < 0) &&
                                    (arround.FindIndex(el => el == sourceContact) < 0) )//&& FindSource(cnt) && FindSource(cntNebor) )
                                    {
                                        SetPoinProcess(sourceContact, sourceContact, pntProcess);
                                        arround.Add(sourceContact);
                                    }
                                }
                            }
                        }
                    }

                }

                nextPoints.Clear();
                nextPoints.AddRange(arround);
                passedPoints.AddRange(arround);

                pntProcess.IncrementNumber();

                arround.Clear();

            } while (nextPoints.Count > 0);

            return passedPoints.Count;
        }
Exemple #6
0
 private void SetUntracedNumbers()
 {
     foreach (NodeDistanceBase disBase in nodeDistanceDict.Values)
     {
         if (!disBase.IsTraced())
         {
             Node curNode = nodeList.Find(el => el.name == disBase.name);
             foreach (int curNumber in disBase.GetNodeNumbers(curNode.arcCollection.Count()))
             {
                 List<ContactSimple> startPoint = FindStartPoint(curNode.arcCollection[curNumber], disBase.name);
                 SetContactNumber(startPoint, 0);
                 NodePointProcess proc = new NodePointProcess(GetPoint(startPoint[0]), false);
                 int count = CompleteSpreadWaveProcess(startPoint, proc);//SpreadWaveProcess
                 disBase.SetCountForNumber(curNumber, count);
             }
         }
     }
 }
Exemple #7
0
        private List<ContactSimple> SetOneWave(List<ContactSimple> inWave, List<ContactSimple> bandedConts, NodePointProcess pntProcess, string currentName)
        {
            List<ContactSimple> thisWave = new List<ContactSimple>();

            foreach (ContactSimple cntUnit in inWave)
            {
                //thisWave.Add(cntUnit);
                //passedPoints.Add(cntUnit);
                bool b;

                foreach (int opposLay in Params.GetOppositeLayers(cntUnit.layer))
                {
                    ContactSimple curCnt = new ContactSimple(cntUnit, opposLay);
                    if (bandedConts.FindIndex(el => el == curCnt) < 0)
                    {
                        if ((opposLay == Layers.siliconTrace || cntUnit.layer == Layers.siliconTrace))
                        {
                            if ((GetPoint(cntUnit, Layers.contactTrace).name != Material.diffusionName) &&
                                (GetPoint(cntUnit, opposLay).name == currentName))
                            {
                                //pntProcess.ProcessPoint(layoutMap[cntUnit.x][cntUnit.y][opposLay]);
                                //passedPoints.Add(new ContactSimple(cntUnit,opposLay));
                                if ( cntUnit.x == 31 && (cntUnit.y == 21 || cntUnit.y == 22))// && cntNebor.layer == 1)
                                    b = true;
                                        //pn1 = GetPoint(cntNebor);

                                thisWave.Add(new ContactSimple(cntUnit,opposLay));
                            }
                        }
                        else
                        {
                            if (GetPoint(cntUnit, opposLay).name == currentName)
                            {
                                //pntProcess.ProcessPoint(layoutMap[cntUnit.x][cntUnit.y][opposLay]);
                                //passedPoints.Add(new ContactSimple(cntUnit,opposLay));
                                if ( cntUnit.x == 31 && (cntUnit.y == 21 || cntUnit.y == 22))// && cntNebor.layer == 1)
                                    b = true;

                                thisWave.Add(new ContactSimple(cntUnit,opposLay));
                            }
                        }
                    }
                }
                pntProcess.ProcessPoint(layoutMap[cntUnit.x][cntUnit.y][cntUnit.layer]);
            }

            return thisWave;
        }
Exemple #8
0
 private bool SetPoinProcess(ContactSimple prevCnt, ContactSimple inCnt, NodePointProcess pntProcess)
 {
     if ( (prevCnt.layer != inCnt.layer) && ((prevCnt.layer == Layers.siliconTrace || inCnt.layer == Layers.siliconTrace)) )
     {
         if (GetPoint(inCnt, Layers.contactTrace).name != Material.diffusionName)
         {
             pntProcess.ProcessPoint(layoutMap[inCnt.x][inCnt.y][inCnt.layer]);
             return true;
         }
     }
     else
     {
         pntProcess.ProcessPoint(layoutMap[inCnt.x][inCnt.y][inCnt.layer]);
     }
     return false;
 }
Exemple #9
0
        private void ClearTracedPath(System.IO.StreamWriter file)
        {
            List<NodeDistanceBase> lst = nodeDistanceDict.Values.ToList();
            lst.Sort(NodeDistanceBase.CompareBaseByDist);

            foreach (NodeDistanceBase disBase in lst)
            {
                if (disBase.IsTraced())
                {
                    //bool b;
                    //if (disBase.name  == "INC")
                    //	b = true;
                    /*if (AddingSpace(disBase.name) == "61113")
                    {
                        b = false;
                        PrintMap(Layers.metal1Trace, file);
                        PrintMap(Layers.siliconTrace, file);
                        PrintMap(Layers.metal2Trace, file);
                    }*/
                    CheckOnePoint();

                    Node curNode = nodeList.Find(el => el.name == disBase.name);
                    List<ContactSimple> startPoint = FindStartPoint(curNode.arcCollection[0], disBase.name);
                    //GetPoint(startPoint).number = 0;
                    SetContactNumber(startPoint, 0);
                    NodePointProcess proc = new NodePointProcess(GetPoint(startPoint[0]), false);
                    CompleteSpreadWaveProcess(startPoint, proc);

                    CheckOnePoint();
                    SpreadUsed(curNode);

                    /*if (disBase.name  == "N6861401")//"N6859613")//"N6861401")
                    {
                        file.WriteLine("!!!-----------check numb N6861401-------------------");
                        PrintMap(Layers.metal1Trace, file);
                        PrintMap(Layers.siliconTrace, file);
                        PrintNumb(-2, file);
                        PrintUsed(-2, file);
                        file.WriteLine("!!!-----------end check numb N6861401-------------------");
                    }
                    //
                    if (disBase.name  == "INY")
                    {
                        file.WriteLine("!!!-----------check used INY-------------------");
                        PrintMap(Layers.metal1Trace, file);
                        PrintMap(Layers.siliconTrace, file);
                        PrintUsed(-2, file);
                        file.WriteLine("!!!-----------end used INY-------------------");
                    }*/
                    CheckOnePoint();

                    ReplaceUnused procRemove = new ReplaceUnused(GetPoint(startPoint[0]), false);
                    CompleteSpreadWaveProcessRem(startPoint, procRemove);

                    CheckOnePoint();
                }
            }

            //inFile.WriteLine("");
        }
        /*private void SetInitPoint()
         * {
         *  for (int i = 0; i < processNode.arcCollection.Count; i++)
         *  {
         *      trace.SetContact(Params.FromSimpleToCont(processNode.arcCollection[i].GetHigherPoint(0)), processNode.name, i, 0);
         *      trace.SetContact(Params.FromSimpleToCont(processNode.arcCollection[i].GetLowerPoint(0)), processNode.name, i, 0);
         *  }
         * }*/

        private void SetStartPriority(TraceGlobe trace)
        {
            List <NodeDistanceBase> lst = nodeDistanceDict.Values.ToList();

            lst.Sort(NodeDistanceBase.CompareBaseByDist);
            int countNd = lst.Count;

            //bestHighPrior = lst.First().name;
            trace.SetHighPriority(lst.First().name);

            int curPrior = Params.maxPriority;

            foreach (NodeDistanceBase disBase in lst)//Node curNode in nodeList)
            {
                processNode = trace.GetNodeByName(disBase.name);

                if (diffusionExcep.FindIndex(el => el == processNode.name) >= 0)
                {
                    SetStartVccGndConnections(curPrior);
                }
                else
                {
                    //List<int> markedPin = new List<int>();
                    for (int i = 0; i < processNode.arcCollection.Count; i++)
                    {
                        int           idx = nodeDistanceDict[processNode.name].GetNumber(i);
                        ContactSimple cnt = processNode.arcCollection[i];

                        //List<Contact> sours = trace.GetSourceContacts(processNode.arcCollection[i])

                        trace.SetPinSource(trace.GetSourceContacts(processNode.arcCollection[i], processNode.name));

                        bool notOpposite = true;
                        for (int j = i + 1; j < processNode.arcCollection.Count; j++)
                        {
                            if (processNode.arcCollection[i].x == processNode.arcCollection[j].x)
                            {
                                //trace.SetLine(new LineStruct(processNode.arcCollection[i].GetInDiffusionEdge(), processNode.arcCollection[j].GetInDiffusionEdge()),
                                //	          processNode.name, curPrior, idx, true);
                                trace.SetStartLine(processNode.arcCollection[i], processNode.arcCollection[j],
                                                   processNode.name, curPrior, idx);


                                trace.SetContact(processNode.arcCollection[i].GetInDiffusionEdge(), processNode.name, idx, curPrior, 0);

                                List <ContactSimple> startWave = new List <ContactSimple>();
                                startWave.Add(new ContactSimple(processNode.arcCollection[i].GetInDiffusionEdge()));
                                NodePointProcess proc = new NodePointProcess(0, curPrior, idx, false);
                                trace.CompleteSpreadWaveProcess(startWave, proc);                //SpreadWaveProcess

                                notOpposite = false;
                            }
                        }

                        if (notOpposite)        //markedPin.FindIndex(el => el == i) < 0)
                        {
                            trace.SetContact(processNode.arcCollection[i].GetInDiffusionEdge(), processNode.name, idx, curPrior, 0);

                            /*trace.SetPinContact(Params.FromSimpleToCont(processNode.arcCollection[i].GetHigherPoint(0)),
                             *                  processNode.name, idx, curPrior);
                             * trace.SetPinContact(Params.FromSimpleToCont(processNode.arcCollection[i].GetLowerPoint(0)),
                             *                  processNode.name, idx, curPrior);*/
                        }
                    }
                }
                curPrior--;
            }
        }
        /*private void SetInitPoint()
        {
            for (int i = 0; i < processNode.arcCollection.Count; i++)
            {
                trace.SetContact(Params.FromSimpleToCont(processNode.arcCollection[i].GetHigherPoint(0)), processNode.name, i, 0);
                trace.SetContact(Params.FromSimpleToCont(processNode.arcCollection[i].GetLowerPoint(0)), processNode.name, i, 0);
            }
        }*/
        private void SetStartPriority(TraceGlobe trace)
        {
            List<NodeDistanceBase> lst = nodeDistanceDict.Values.ToList();

            lst.Sort(NodeDistanceBase.CompareBaseByDist);
            int countNd = lst.Count;

            //bestHighPrior = lst.First().name;
            trace.SetHighPriority(lst.First().name);

            int curPrior = Params.maxPriority;

            foreach (NodeDistanceBase disBase in lst)//Node curNode in nodeList)
            {
                processNode = trace.GetNodeByName(disBase.name);

                if (diffusionExcep.FindIndex(el => el == processNode.name) >= 0)
                    SetStartVccGndConnections(curPrior);
                else
                {
                    //List<int> markedPin = new List<int>();
                    for (int i = 0; i < processNode.arcCollection.Count; i++)
                    {
                        int idx = nodeDistanceDict[processNode.name].GetNumber(i);
                        ContactSimple cnt = processNode.arcCollection[i];

                        //List<Contact> sours = trace.GetSourceContacts(processNode.arcCollection[i])

                        trace.SetPinSource(trace.GetSourceContacts(processNode.arcCollection[i], processNode.name));

                        bool notOpposite = true;
                        for (int j = i + 1; j < processNode.arcCollection.Count; j++)
                        {
                            if (processNode.arcCollection[i].x == processNode.arcCollection[j].x)
                            {
                                //trace.SetLine(new LineStruct(processNode.arcCollection[i].GetInDiffusionEdge(), processNode.arcCollection[j].GetInDiffusionEdge()),
                                //	          processNode.name, curPrior, idx, true);
                                trace.SetStartLine(processNode.arcCollection[i], processNode.arcCollection[j],
                                                   processNode.name, curPrior, idx);

                                trace.SetContact(processNode.arcCollection[i].GetInDiffusionEdge(), processNode.name, idx, curPrior, 0);

                                List<ContactSimple> startWave = new List<ContactSimple>();
                                startWave.Add( new ContactSimple(processNode.arcCollection[i].GetInDiffusionEdge()) );
                                NodePointProcess proc = new NodePointProcess(0, curPrior, idx, false);
                                trace.CompleteSpreadWaveProcess(startWave, proc);//SpreadWaveProcess

                                notOpposite = false;
                            }
                        }

                        if (notOpposite)//markedPin.FindIndex(el => el == i) < 0)
                        {
                            trace.SetContact(processNode.arcCollection[i].GetInDiffusionEdge(), processNode.name, idx, curPrior, 0);
                            /*trace.SetPinContact(Params.FromSimpleToCont(processNode.arcCollection[i].GetHigherPoint(0)),
                                                processNode.name, idx, curPrior);
                            trace.SetPinContact(Params.FromSimpleToCont(processNode.arcCollection[i].GetLowerPoint(0)),
                                                processNode.name, idx, curPrior);*/
                        }
                    }
                }
                curPrior--;
            }
        }
Exemple #12
0
        //private void
        /*private void FillUnused()
        {
            for (int x = 0; x < wide; x++)
            {
                for (int y = 0; y < Params.topEdge; y++)
                {
                    if ( !layoutMap[x][y][Layers.metal1Trace].isUsed )
                    {
                        SetContact(new ContactSimple(x,y,Layers.metal1Trace), Material.blankName, 0, 0, -1);
                        layoutMap[x][y][Layers.metal1Trace].isReplace = true;
                    }
                    if ( !layoutMap[x][y][Layers.siliconTrace].isUsed &&
                        (layoutMap[x][y][Layers.siliconTrace].name != Material.diffusionName) )
                    {
                        SetContact(new ContactSimple(x,y,Layers.siliconTrace), Material.blankName, 0, 0, -1);
                        layoutMap[x][y][Layers.metal1Trace].isReplace = true;
                    }
                }
            }
        }*/
        /*public void ClearForAlign_old()
        {
            foreach (Node nd in nodeList)
                SpreadUsed(nd);
            SetUsedForUntraced();

            foreach (Node nd in nodeList)
            {
                List<int> currentConnection = new List<int>();
                for (int i = 0; i < nd.arcCollection.Count; i++)
                {
                    if (currentConnection.FindIndex(el => el == i) < 0)
                    {
                        List<int> curList = nodeDistanceDict[nd.name].GetConnectedPoints(i);
                        //ContactSimple startPoint = new ContactSimple(nd.arcCollection[i]);
                        List<ContactSimple> startPoints = FindStartPoint(nd.arcCollection[i], nd.name);

                        SetContactNumber(startPoints, 0);
                        ReplaceUnused procRemove = new ReplaceUnused(GetPoint(startPoints[0]), false);
                        int count = SpreadWaveProcess(startPoints, procRemove);
                        nodeDistanceDict[nd.name].SetCountForNumber(i, count);

                        currentConnection.AddRange(curList);
                    }
                }
            }
            SetAllUnused();
        }*/
        public void ClearForAlign(System.IO.StreamWriter inFile)
        {
            foreach (Node nd in nodeList)
            {
                if (nodeDistanceDict[nd.name].IsTraced())
                {
                    List<int> currentConnection = new List<int>();
                    for (int i = 0; i < nd.arcCollection.Count; i++)
                    {
                        if (currentConnection.FindIndex(el => el == i) < 0)
                        {
                            List<int> curList = nodeDistanceDict[nd.name].GetConnectedPoints(i);
                            List<ContactSimple> startPoints = FindStartPoint(nd.arcCollection[i], nd.name);
                            SetContactNumber(startPoints, 0);
                            //ReplaceUnused procRemove = new ReplaceUnused(0, GetPoint(startPoint).priority, false);
                            NodePointProcess proc = new NodePointProcess(GetPoint(startPoints[0]), false);
                            int count = CompleteSpreadWaveProcess(startPoints, proc);
                            nodeDistanceDict[nd.name].SetCountForNumber(i, count);

                            currentConnection.AddRange(curList);
                        }
                    }
                }
            }

            CheckOnePoint();
            foreach (Node nd in nodeList)
            {
                if (nodeDistanceDict[nd.name].IsTraced())
                    SpreadUsed(nd);
            }
            CheckOnePoint();
            //SetUsedForUntraced();

            CheckOnePoint();

            foreach (Node nd in nodeList)
            {
                if (nodeDistanceDict[nd.name].IsTraced())
                {
                    List<int> currentConnection = new List<int>();
                    for (int i = 0; i < nd.arcCollection.Count; i++)
                    {
                        if (currentConnection.FindIndex(el => el == i) < 0)
                        {
                            List<int> curList = nodeDistanceDict[nd.name].GetConnectedPoints(i);
                            //ContactSimple startPoint = new ContactSimple(nd.arcCollection[i]);
                            List<ContactSimple> startPoints = FindStartPoint(nd.arcCollection[i], nd.name);

                            SetContactNumber(startPoints, 0);
                            ReplaceUnused procRemove = new ReplaceUnused(GetPoint(startPoints[0]), false);
                            int count = CompleteSpreadWaveProcessRem(startPoints, procRemove);
                            //if (CheckOnePoint())
                            //	CompleteSpreadWaveProcessRem(startPoints, procRemove);

                            nodeDistanceDict[nd.name].SetCountForNumber(i, count);

                            currentConnection.AddRange(curList);

                        }
                    }
                }
            }
            CheckOnePoint();
            SetAllUnused();
        }
Exemple #13
0
        private bool SearchNearest()
        {
            int allAcount = 2 * wide * Params.topEdge;
            //conflictManager = new ConflictPolitic();
            string highPrior = conflictManager.GetBestPriority();
            bool isNewRule = false;

            Node bestNode = nodeList.Find(el => (el.name == highPrior));//bestHighPrior));

            NodeDistance needTrace = nodeDistanceDict[highPrior].BestDist();

            int numberStart = nodeDistanceDict[highPrior].GetNumber(needTrace.names.x);
               // ContactSimple startOne = new ContactSimple(bestNode.arcCollection[numberStart]);

            List<ContactSimple> startWave = FindStartContacts(new ContactSimple(
                            bestNode.arcCollection[numberStart]), bestNode.name);
            SetContact(startWave, bestNode.name, numberStart, 1, 0);
            NodePointProcess proc = new NodePointProcess(GetPoint(startWave[0]), false);

            List<ContactSimple> startArray = ReturnAllWaveProcess(startWave, proc);

            //List<ContactSimple> startArray = NodeField(startOne, numberStart);
            List<ContactSimple> curArray = new List<ContactSimple>(startArray);
            List<ContactSimple> lastRing = new List<ContactSimple>(startArray);

            List<ContactSimple> findCnts = new List<ContactSimple>();

            //int numberToReach = nodeDistanceDict[highPrior].GetNumber(needTrace.names.y);

            do
            {
                do
                {
                    findCnts.Clear();

                    do
                    {
                        List<ContactSimple> nextRing = FindInNearRing(curArray, lastRing);
                        foreach (ContactSimple cnt in nextRing)
                        {
                            if (GetPoint(cnt).name == highPrior && GetPoint(cnt).numberNode != numberStart)//== numberToReach)
                            {
                                findCnts.Add(cnt);
                            }
                        }

                        {
                            curArray.AddRange(nextRing);
                            lastRing = nextRing;
                        }
                    }
                    while ((findCnts.Count <= 0) && (curArray.Count < allAcount) && (lastRing.Count > 0));

                    conflictManager.ResetConnection();

                    foreach (ContactSimple cnt in findCnts)
                    {
                        ContactSimple cntNear = FindNearestPoint(startArray, cnt);

                        ConflictParametr conflicts = FindIntersects(cntNear, cnt, highPrior);
                        //ConflictParametr conflicts = OptimizeIntersects(conflicts1);

                        if (conflicts.GetCountConfl() >= 0)
                        {
                            //bool isBlockade = false;
                            int numberToReach = GetPoint(cnt).numberNode;
                            conflictManager.AddConnection(GetPoint(cnt), GetPoint(cntNear), cnt.layer,
                                                          cntNear.GetDistance(cnt), conflicts, nodeDistanceDict[highPrior].countNode[numberToReach],
                                                          nodeDistanceDict[highPrior].countNode[numberStart]);
                        }
                    }

                    bool b;
                    if (conflictManager.GetCountConflicts() <= 0)
                        b = false;
                }
                while ((conflictManager.GetCountConflicts() <= 0) && (curArray.Count < allAcount) && (lastRing.Count > 0));

                isNewRule = conflictManager.DefineRule();

            }
            while ((!isNewRule)&& (curArray.Count < allAcount) && (lastRing.Count > 0));

            return isNewRule;
        }