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; }
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; }