예제 #1
0
        /*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--;
            }
        }
예제 #2
0
        private void SetStartVccGndConnections(int curPrior)
        {
            int middleLine = Layers.metal1Trace;

            if (Params.IsModelBusM2InMiddle())
            {
                middleLine = Layers.metal2Trace;
            }
            else if (Params.IsModelWithDif())
            {
                SetStartVccGndWithDiff(curPrior);
                return;
            }
            if (processNode.name == Params.GndName)
            {
                for (int i = 0; i < processNode.arcCollection.Count; i++)
                {
                    trace.SetPinSource(trace.GetSourceContacts(processNode.arcCollection[i], processNode.name));

                    ContactSimple transistorPoint = processNode.arcCollection[i].GetHigherPoint(2);
                    if (processNode.arcCollection[i].y > Params.GndPosition)
                    {
                        transistorPoint = processNode.arcCollection[i].GetLowerPoint(2);
                    }

                    if (!processNode.arcCollection[i].isInOut())
                    {
                        trace.SetLine(new LineStruct(transistorPoint,
                                                     new ContactSimple(processNode.arcCollection[i].x, Params.GndPosition, Layers.metal1Trace)),
                                      processNode.name, curPrior, 0, false);
                    }
                }

                trace.SetLine(new LineStruct(new PairInt(Params.leftEdge, Params.GndPosition),
                                             new ContactSimple(wide - 1, Params.GndPosition, middleLine)),
                              processNode.name, curPrior, 0, true);
            }
            if (processNode.name == Params.VccName)
            {
                for (int i = 0; i < processNode.arcCollection.Count; i++)
                {
                    trace.SetPinSource(trace.GetSourceContacts(processNode.arcCollection[i], processNode.name));

                    ContactSimple transistorPoint = processNode.arcCollection[i].GetHigherPoint(2);
                    if (processNode.arcCollection[i].y > Params.VccPosition)
                    {
                        transistorPoint = processNode.arcCollection[i].GetLowerPoint(2);
                    }

                    if (!processNode.arcCollection[i].isInOut())
                    {
                        trace.SetLine(new LineStruct(transistorPoint,
                                                     new ContactSimple(processNode.arcCollection[i].x, Params.VccPosition, Layers.metal1Trace)),
                                      processNode.name, curPrior, 0, false);
                    }
                }

                trace.SetLine(new LineStruct(new PairInt(Params.leftEdge, Params.VccPosition),
                                             new ContactSimple(wide - 1, Params.VccPosition, middleLine)),
                              processNode.name, curPrior, 0, true);
            }
        }
예제 #3
0
        /*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--;
            }
        }