Beispiel #1
0
        public List<ContactSimple> GetSourceContacts(ContactSimple inCnt, string inName)
        {
            int coordY = Params.lineN;
            if (inCnt.y < Params.lineMiddle)//((inCnt.y - Params.lineP) <= 2)
                coordY = Params.lineP;

            //int layer = Layers.FromStrToNumber(inCnt.typePoint);
            List<ContactSimple> connectedCnt = new List<ContactSimple>();

            if (inCnt.isInOut())
            {
                connectedCnt.Add(new ContactSimple(inCnt));
                return connectedCnt;
            }

            if (Params.IsModelWithDif() && (inCnt.layer == Layers.metal1Trace))
            {
                if (diffusionException.FindIndex(el => el == inName) >= 0)
                {
                    connectedCnt.Add(new ContactSimple(inCnt.x, coordY, inCnt.layer));
                    connectedCnt.Add(new ContactSimple(inCnt.x, coordY, inCnt.layer));
                    return connectedCnt;
                }
                //if (coordY < Params.topEdge)
                connectedCnt.Add(new ContactSimple(inCnt.x, coordY + 2, inCnt.layer));
                //if (coordY >= Params.bottomEdge)
                connectedCnt.Add(new ContactSimple(inCnt.x, coordY - 2, inCnt.layer));
                return connectedCnt;
            }

            connectedCnt.Add(new ContactSimple(inCnt.x, coordY + 1, inCnt.layer));
            connectedCnt.Add(new ContactSimple(inCnt.x, coordY - 1, inCnt.layer));
            if (diffusionException.FindIndex(el => el == inName) >= 0)
            {
                //if (coordY < Params.topEdge)
                connectedCnt.Add(new ContactSimple(inCnt.x, coordY + 3, inCnt.layer));
                //if (coordY > Params.bottomEdge)
                connectedCnt.Add(new ContactSimple(inCnt.x, coordY - 3, inCnt.layer));
            }
            return connectedCnt;
        }
Beispiel #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;
        }