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