public int type; //string type; /*public Segment(int inX, int inY, int inWidth, int inHeight) * { * X = inX; * Y = inY; * width = inWidth; * height = inHeight; * }*/ public LineStruct(PairInt firstPoint, ContactSimple secPoint) { first = new PairInt(firstPoint); type = secPoint.layer; if (firstPoint.y == secPoint.y) { X = firstPoint.x; if (firstPoint.x > secPoint.x) { X = secPoint.x; } Y = firstPoint.y; width = Math.Abs(firstPoint.x - secPoint.x); height = 0; } else { X = firstPoint.x; Y = firstPoint.y; if (firstPoint.y > secPoint.y) { Y = secPoint.y; } width = 0; height = Math.Abs(firstPoint.y - secPoint.y); } }
public ContactSimple OpositePoint(ContactSimple inCont) { ContactSimple oppositeCont = new ContactSimple(inCont); oppositeCont.layer = type; if (Height > 0) { if (inCont.y != Top) { oppositeCont.y = Top; } else { oppositeCont.y = Bottom; } } else { if (inCont.x != Left) { oppositeCont.x = Left; } else { oppositeCont.x = Right; } } return(oppositeCont); }
public int GetDistance(ContactSimple inCnt) { int dist = Math.Abs(inCnt.x - x); dist += Math.Abs(inCnt.y - y); return(dist); }
public ContactSimple GetVerticalPosition(int inY) { ContactSimple retCont = new ContactSimple(this); retCont.y = inY; return(retCont); }
public ContactSimple GetHorizontPosition(int inX) { ContactSimple retCont = new ContactSimple(this); retCont.x = inX; return(retCont); }
public ContactSimple GetHigherPoint(int shift) { ContactSimple higherCont = new ContactSimple(this); higherCont.y += (shift + 1); return(higherCont); }
public ContactSimple GetLowerPoint(int shift) { ContactSimple lowerCont = new ContactSimple(this); lowerCont.y -= (shift + 1); return(lowerCont); }
private string AddAlloying(ContactSimple inCnt) { CultureInfo culture = CultureInfo.CreateSpecificCulture("en-CA"); double coordX = ((double)inCnt.x) / 2.0; double coordY = ((double)inCnt.y) / 2.0; double moveY = coordY; string retStr = ""; /*if (inCnt.typePoint == Params.cnaType) * { * if ( Params.IsModelBusInEdge() ) * moveY += 0.5; * else * moveY -= 0.5; * retStr = " OR(NORTH) CENAPE(" + coordX.ToString("F2", culture) + "," + coordY.ToString("F2", culture) + * ", " + coordX.ToString("F2", culture) + "," + moveY.ToString("F2", culture) + ");"; * } * else * { * if ( Params.IsModelBusInEdge() ) * moveY -= 0.5; * else * moveY += 0.5; * * retStr = " OR(NORTH) CEPANE(" + coordX.ToString("F2", culture) + "," + coordY.ToString("F2", culture) + * ", " + coordX.ToString("F2", culture) + "," + moveY.ToString("F2", culture) + ");"; * }*/ return(retStr); }
public void AddContact(ContactSimple inNewCont) { if (arcCollection.FindIndex(element => element == inNewCont) < 0) { arcCollection.Add(inNewCont); } }
public NodePaths(string inName, ContactSimple inContact, int inNumberNode) { name = inName; startPoint = inContact; //new Contact(inContact) //currentEnds = new List<Contact>(); //currentEnds.Add(inContact.GetHigherPoint(0)); //currentEnds.Add(inContact.GetLowerPoint(0)); numberNode = inNumberNode; //seekNumbers = new List<int>(); }
// Compares by x positions public static int CompareByX(ContactSimple in1, ContactSimple in2) { if (in1.x > in2.x) { return(-1); } else if (in1.x == in2.x) { return(0); } return(1); }
public void AddNamedPins(List <ContactNamed> inCts) { foreach (ContactNamed cnt in inCts) { Node fndNode = nodeList.Find(nd => nd.name == cnt.namePoint); if (diffusionException.FindIndex(name => name == cnt.namePoint) < 0 && fndNode != null) { ContactSimple smpl = new ContactSimple(cnt); smpl.SetInOut(); fndNode.arcCollection.Add(smpl); } } }
private void InitGndVccConts() { int lay = Layers.metal1Trace; if (Params.IsModelBusM2InMiddle()) { lay = Layers.metal2Trace; } ContactSimple busStart = new ContactSimple(Params.leftEdge, Params.VccPosition, lay); ContactSimple busEnd = new ContactSimple(wide - 1, Params.VccPosition, lay); if (processNode.name == Params.GndName) { busStart.y = Params.GndPosition; busEnd.y = Params.GndPosition; } busEnd.SetInOut(); busStart.SetInOut(); processNode.arcCollection.Insert(0, busEnd); processNode.arcCollection.Insert(0, busStart); int idxLast = processNode.arcCollection.Count; NodeDistanceBase dictUnit = new NodeDistanceBase(idxLast, processNode.name); for (int i = 0; i < idxLast; i++) { for (int j = i + 1; j < idxLast; j++) { bool connected = true; bool fixedConnection = false; if (i == 0 && j == 1) { fixedConnection = true; } if (i != j) { dictUnit.AddDistance(i, j, LineStruct.Distance(processNode.arcCollection[i], processNode.arcCollection[j]), connected, fixedConnection); } } } if (idxLast > 1) { nodeDistanceDict.Add(processNode.name, dictUnit); } }
private void TraceVccGndBus() { int vccGndType = Layers.metal1Trace; // Params.met1Type; if (Params.IsModelBusM2InMiddle()) { vccGndType = Layers.metal2Trace; //Params.met2Type; } ContactSimple left = new ContactSimple(0, Params.GndPosition, vccGndType); ContactSimple right = new ContactSimple(wide - 1, Params.GndPosition, vccGndType); fixedConnections.Add(new LineStruct(left, right)); left = new ContactSimple(0, Params.VccPosition, vccGndType); right = new ContactSimple(wide - 1, Params.VccPosition, vccGndType); fixedConnections.Add(new LineStruct(left, right)); }
public ContactSimple GetNearContact(ContactSimple inCont) { ContactSimple retCnt = new ContactSimple(inCont.x, inCont.y, type); if (Top == Bottom) { if (Left > inCont.x) { retCnt.x = Left; } else if (Right < inCont.x) { retCnt.x = Right; } retCnt.y = Top; } if (Left == Right) { //if (levelY == inCont.levelY) //{ if (Bottom > inCont.y) { retCnt.y = Bottom; } else if (Top < inCont.y) { retCnt.y = Top; } retCnt.x = Left; /*} * else if (levelY == Params.levelN) * { * retCnt.position.y = Bottom; * } * else if (levelY == Params.levelP) * { * retCnt.position.y = Top; * }*/ } return(retCnt); }
public bool OverlapWithPoint(ContactSimple inCnt) { if (type == inCnt.layer) { if ((Width == 0) && (X == inCnt.x)) { if ((inCnt.y >= Bottom) && (inCnt.y <= Top)) { return(true); } return(false); } if ((Height == 0) && (Y == inCnt.y)) { if ((inCnt.x >= Right) && (inCnt.x <= Left)) { return(true); } return(false); } } return(false); }
static public List <VariantTrace> GetConnectionPoints(ContactSimple inCnt1, ContactSimple inCnt2, int wide) { List <VariantTrace> retList = new List <VariantTrace>(); if (inCnt1.x == inCnt2.x) { VariantTrace trace1 = new VariantTrace(); trace1.pnt.Add(new ContactSimple(inCnt1.x, ((inCnt1.y + inCnt2.y) / 2), inCnt1.layer)); retList.Add(trace1); //if (inCnt1.x - 1 >= 0) { VariantTrace trace2 = new VariantTrace(); trace2.pnt.Add(new ContactSimple(inCnt1.x - 1, inCnt1.y, inCnt1.layer)); trace2.pnt.Add(new ContactSimple(inCnt1.x - 1, ((inCnt1.y + inCnt2.y) / 2), inCnt1.layer)); trace2.pnt.Add(new ContactSimple(inCnt1.x - 1, inCnt2.y, inCnt1.layer)); retList.Add(trace2); } //if (inCnt1.x + 1 < wide) { VariantTrace trace3 = new VariantTrace(); trace3.pnt.Add(new ContactSimple(inCnt1.x + 1, inCnt1.y, inCnt1.layer)); trace3.pnt.Add(new ContactSimple(inCnt1.x + 1, ((inCnt1.y + inCnt2.y) / 2), inCnt1.layer)); trace3.pnt.Add(new ContactSimple(inCnt1.x + 1, inCnt2.y, inCnt1.layer)); retList.Add(trace3); } return(retList); } if (inCnt1.y == inCnt2.y) { VariantTrace trace1 = new VariantTrace(); trace1.pnt.Add(new ContactSimple(((inCnt1.x + inCnt2.x) / 2), inCnt1.y, inCnt1.layer)); retList.Add(trace1); //if (inCnt1.y - 1 >= 0) { VariantTrace trace2 = new VariantTrace(); trace2.pnt.Add(new ContactSimple(inCnt1.x, inCnt1.y - 1, inCnt1.layer)); trace2.pnt.Add(new ContactSimple(((inCnt1.x + inCnt2.x) / 2), inCnt1.y - 1, inCnt1.layer)); trace2.pnt.Add(new ContactSimple(inCnt2.x, inCnt1.y - 1, inCnt1.layer)); retList.Add(trace2); } //if (inCnt1.x + 1 < wide) { VariantTrace trace3 = new VariantTrace(); trace3.pnt.Add(new ContactSimple(inCnt1.x, inCnt1.y, inCnt1.layer)); trace3.pnt.Add(new ContactSimple(((inCnt1.x + inCnt2.x) / 2), inCnt1.y, inCnt1.layer)); trace3.pnt.Add(new ContactSimple(inCnt2.x, inCnt1.y, inCnt1.layer)); retList.Add(trace3); } return(retList); } if (Math.Abs(inCnt1.x - inCnt2.x) == 1) { if (Math.Abs(inCnt1.y - inCnt2.y) == 1) { VariantTrace trace1 = new VariantTrace(); trace1.pnt.Add(new ContactSimple(inCnt1.x, inCnt2.y, inCnt1.layer)); retList.Add(trace1); VariantTrace trace2 = new VariantTrace(); trace2.pnt.Add(new ContactSimple(inCnt2.x, inCnt1.y, inCnt1.layer)); retList.Add(trace2); } if (Math.Abs(inCnt1.y - inCnt2.y) == 2) { VariantTrace trace1 = new VariantTrace(); trace1.pnt.Add(new ContactSimple(inCnt1.x, inCnt2.y, inCnt1.layer)); trace1.pnt.Add(new ContactSimple(inCnt1.x, ((inCnt1.y + inCnt2.y) / 2), inCnt1.layer)); retList.Add(trace1); VariantTrace trace2 = new VariantTrace(); trace2.pnt.Add(new ContactSimple(inCnt2.x, inCnt1.y, inCnt1.layer)); trace2.pnt.Add(new ContactSimple(inCnt2.x, ((inCnt1.y + inCnt2.y) / 2), inCnt1.layer)); retList.Add(trace2); VariantTrace trace3 = new VariantTrace(); trace3.pnt.Add(new ContactSimple(inCnt1.x, ((inCnt1.y + inCnt2.y) / 2), inCnt1.layer)); trace3.pnt.Add(new ContactSimple(inCnt2.x, ((inCnt1.y + inCnt2.y) / 2), inCnt1.layer)); retList.Add(trace3); } } if (Math.Abs(inCnt1.x - inCnt2.x) == 2) { if (Math.Abs(inCnt1.y - inCnt2.y) == 1) { VariantTrace trace1 = new VariantTrace(); trace1.pnt.Add(new ContactSimple(inCnt1.x, inCnt2.y, inCnt1.layer)); trace1.pnt.Add(new ContactSimple(((inCnt1.x + inCnt2.x) / 2), inCnt2.y, inCnt1.layer)); retList.Add(trace1); VariantTrace trace2 = new VariantTrace(); trace2.pnt.Add(new ContactSimple(inCnt2.x, inCnt1.y, inCnt1.layer)); trace2.pnt.Add(new ContactSimple(((inCnt1.x + inCnt2.x) / 2), inCnt1.y, inCnt1.layer)); retList.Add(trace2); VariantTrace trace3 = new VariantTrace(); trace3.pnt.Add(new ContactSimple(((inCnt1.x + inCnt2.x) / 2), inCnt1.y, inCnt1.layer)); trace3.pnt.Add(new ContactSimple(((inCnt1.x + inCnt2.x) / 2), inCnt2.y, inCnt1.layer)); retList.Add(trace3); } if (Math.Abs(inCnt1.y - inCnt2.y) == 2) { VariantTrace trace1 = new VariantTrace(); trace1.pnt.Add(new ContactSimple(inCnt1.x, ((inCnt1.y + inCnt2.y) / 2), inCnt1.layer)); trace1.pnt.Add(new ContactSimple(((inCnt1.x + inCnt2.x) / 2), ((inCnt1.y + inCnt2.y) / 2), inCnt1.layer)); trace1.pnt.Add(new ContactSimple(inCnt2.x, ((inCnt1.y + inCnt2.y) / 2), inCnt1.layer)); retList.Add(trace1); VariantTrace trace2 = new VariantTrace(); trace1.pnt.Add(new ContactSimple(((inCnt1.x + inCnt2.x) / 2), inCnt1.y, inCnt1.layer)); trace1.pnt.Add(new ContactSimple(((inCnt1.x + inCnt2.x) / 2), ((inCnt1.y + inCnt2.y) / 2), inCnt1.layer)); trace1.pnt.Add(new ContactSimple(((inCnt1.x + inCnt2.x) / 2), inCnt2.y, inCnt1.layer)); retList.Add(trace2); VariantTrace trace3 = new VariantTrace(); trace3.pnt.Add(new ContactSimple(inCnt1.x, ((inCnt1.y + inCnt2.y) / 2), inCnt1.layer)); trace3.pnt.Add(new ContactSimple(inCnt1.x, inCnt2.y, inCnt1.layer)); trace3.pnt.Add(new ContactSimple(((inCnt1.x + inCnt2.x) / 2), inCnt2.y, inCnt1.layer)); retList.Add(trace3); VariantTrace trace4 = new VariantTrace(); trace4.pnt.Add(new ContactSimple(inCnt2.x, ((inCnt1.y + inCnt2.y) / 2), inCnt1.layer)); trace4.pnt.Add(new ContactSimple(inCnt2.x, inCnt1.y, inCnt1.layer)); trace4.pnt.Add(new ContactSimple(((inCnt1.x + inCnt2.x) / 2), inCnt1.y, inCnt1.layer)); retList.Add(trace4); VariantTrace trace5 = new VariantTrace(); trace5.pnt.Add(new ContactSimple(inCnt1.x, ((inCnt1.y + inCnt2.y) / 2), inCnt1.layer)); trace5.pnt.Add(new ContactSimple(((inCnt1.x + inCnt2.x) / 2), ((inCnt1.y + inCnt2.y) / 2), inCnt1.layer)); trace5.pnt.Add(new ContactSimple(((inCnt1.x + inCnt2.x) / 2), inCnt2.y, inCnt1.layer)); retList.Add(trace5); VariantTrace trace6 = new VariantTrace(); trace6.pnt.Add(new ContactSimple(inCnt2.x, ((inCnt1.y + inCnt2.y) / 2), inCnt1.layer)); trace6.pnt.Add(new ContactSimple(((inCnt1.x + inCnt2.x) / 2), ((inCnt1.y + inCnt2.y) / 2), inCnt1.layer)); trace6.pnt.Add(new ContactSimple(((inCnt1.x + inCnt2.x) / 2), inCnt1.y, inCnt1.layer)); retList.Add(trace6); } } return(retList); }
public ContactSimple(ContactSimple inCont) : base(inCont) { layer = inCont.layer; inOut = inCont.inOut; }
public ContactSimple(ContactSimple inCont, int inLayer) : base(inCont) { layer = inLayer; inOut = inCont.inOut; }
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); } }
/*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--; } }
public int DifferenceX(ContactSimple cntIn) { return(Math.Abs(x - cntIn.x)); }