示例#1
0
 public void SetStartLine(ContactSimple cnt1, ContactSimple cnt2, string inName, int inPriority, int inIdx)
 {
     if (cnt1.layer == Layers.siliconTrace)
         SetLine(new LineStruct(cnt1.GetInDiffusionEdge(), cnt2.GetInDiffusionEdge()),
                 inName, inPriority, inIdx, true);
     else
     {
         if (Params.IsModelBusM1InMiddle())
         {
             if (cnt1.y > cnt2.y)
             {
                 SetLine(new LineStruct(cnt1.GetInDiffusionEdge(), cnt1.GetLowerPoint(2)),
                     inName, inPriority, inIdx, true);
                 SetLine(new LineStruct(cnt1.GetLowerPoint(2), cnt2.GetHigherPoint(2), Layers.metal2Trace),
                     inName, inPriority, inIdx, true);
                 SetLine(new LineStruct(cnt2.GetHigherPoint(2), cnt1.GetInDiffusionEdge()),
                     inName, inPriority, inIdx, true);
             }
             else
             {
                 SetLine(new LineStruct(cnt2.GetInDiffusionEdge(), cnt2.GetLowerPoint(2)),
                     inName, inPriority, inIdx, true);
                 SetLine(new LineStruct(cnt2.GetLowerPoint(2), cnt1.GetHigherPoint(2), Layers.metal2Trace),
                     inName, inPriority, inIdx, true);
                 SetLine(new LineStruct(cnt1.GetHigherPoint(2), cnt1.GetInDiffusionEdge()),
                     inName, inPriority, inIdx, true);
             }
         }
         else
         {
             SetLine(new LineStruct(cnt1.GetInDiffusionEdge(), cnt2.GetInDiffusionEdge()),
                 inName, inPriority, inIdx, true);
         }
     }
 }
示例#2
0
        public NodeTraces RecoveryFixedPath(ContactSimple startPoint, string curName)
        {
            NodeTraces trace = new NodeTraces();

            //List<ContactSimple> endPts = GetSourceContacts(endPoint, curName);
            ContactSimple sPoint = new ContactSimple(startPoint);
            /*foreach (ContactSimple cnt in GetSourceContacts(startPoint, curName))
                if (GetPoint(cnt).isFixed)
                    sPoint = cnt;*/
            List<ContactSimple> passedPts = new List<ContactSimple>();

            if (!startPoint.isInOut())
            {
                sPoint = startPoint.GetInDiffusionEdge();//.GetHigherPoint(0);
                //if (startPoint.y > Params.lineMiddle)
                  //  sPoint = startPoint.GetLowerPoint(0);
            }

            NodePoint ndPoint = GetPoint(sPoint);
            passedPts.Add(sPoint);
            LineStruct ln = new LineStruct(startPoint, startPoint);
            do
            {
                foreach (int  lay in Params.allLayersRange[sPoint.layer])//pin-pong + wrong layer!!!!!!
                {
                    ln = GetFixedLine(passedPts, lay, curName);
                    if (ln.Length() > 0)// && (passedPts.FindIndex(el => el == ln.OpositePoint(sPoint)) < 0))
                    {
                        trace.lines.Add(ln);
                        break;
                    }
                }
                sPoint = ln.OpositePoint(sPoint);
                passedPts.Add(sPoint);
                ndPoint = GetPoint(sPoint);
            } while(!ndPoint.isSource && ndPoint.number > 0);//GetPoint(sPoint).isSource

            return trace;
        }