public void SetPriority() { List<NodeDistanceBase> lst = nodeDistanceDict.Values.ToList(); lst.Sort(NodeDistanceBase.CompareBaseByDist); int countNd = lst.Count; conflictManager.SetBestPriority(lst.First().name); int curPrior = Params.maxPriority; foreach (NodeDistanceBase disBase in lst) { Node processNode = nodeList.Find(element => element.name == disBase.name); /*List<int> priorites = nodeDistanceDict[processNode.name].GetPriorites(processNode.arcCollection.Count, curPrior); if (priorites.Count > 0) curPrior = priorites.Last() - 1; else*/ //curPrior--; List<int> idxPass = new List<int>(); for (int i = 0; i < processNode.arcCollection.Count; i++) { int idx = nodeDistanceDict[disBase.name].GetNumber(i); ContactSimple cnt = processNode.arcCollection[i]; if ( idxPass.FindIndex(el => el == idx) < 0 ) { idxPass.Add(idx); List<ContactSimple> startWave = FindStartPoint(new ContactSimple( processNode.arcCollection[idx]), processNode.name); SetContact(startWave, processNode.name, idx, curPrior, 0); NodePointProcess proc = new NodePointProcess(GetPoint(startWave[0]), false); int count = CompleteSpreadWaveProcess(startWave, proc);//SpreadWaveProcess disBase.SetCountForNumber(i, count); } } curPrior--; } }
public void SpreadAllWaves() { foreach (Node curNode in nodeList) { List<int> idxPass = new List<int>(); for (int i = 0; i < curNode.arcCollection.Count; i++) { int idx = nodeDistanceDict[curNode.name].GetNumber(i); //Contact cnt = processNode.arcCollection[i]; if ( idxPass.FindIndex(el => el == idx) < 0 ) { idxPass.Add(idx); List<ContactSimple> startWave = FindStartContacts(new ContactSimple( curNode.arcCollection[idx]), curNode.name); SetContactNumber(startWave, 0); NodePointProcess proc = new NodePointProcess(GetPoint(startWave[0]), false); int count = CompleteSpreadWaveProcess(startWave, proc); nodeDistanceDict[curNode.name].SetCountForNumber(idx, count); } } } }
public List<ContactSimple> ReturnAllWaveProcess(List<ContactSimple> inStart, NodePointProcess pntProcess) { string currentName = layoutMap[inStart[0].x][inStart[0].y][inStart[0].layer].name; List<ContactSimple> nextPoints = new List<ContactSimple>();//inStart.GetArroundPoints(wide); nextPoints.AddRange(inStart); List<ContactSimple> arround = new List<ContactSimple>(); List<ContactSimple> passedPoints = new List<ContactSimple>(); if (diffusionException.FindIndex(el => el == currentName) >= 0) { List<ContactSimple> thisWave = SetOneWave(nextPoints, passedPoints, pntProcess, currentName); SetOneWave(thisWave, passedPoints, pntProcess, currentName); nextPoints.AddRange(thisWave); passedPoints.AddRange(thisWave); } passedPoints.AddRange(inStart); do { arround.Clear(); foreach (ContactSimple cntOneLay in nextPoints) { foreach (int layer in Params.allLayersRange[cntOneLay.layer])//GetOppositeLayers(cntOneLay.layer)) { ContactSimple cnt = new ContactSimple(cntOneLay, layer); if ( IsPointsConnected(cnt, cntOneLay.layer, layer, currentName) )//GetPoint(cnt).name == currentName) { foreach (ContactSimple cntNebor in cnt.GetArroundPoints(wide)) { if ( (GetPoint(cntNebor).name == currentName) && (passedPoints.FindIndex(el => el == cntNebor) < 0) && (arround.FindIndex(el => el == cntNebor) < 0) ) { NodePoint pn1 = GetPoint(cntNebor); NodePoint pn2 = GetPoint(cntOneLay); if ( pn1.numberNode != pn2.numberNode) pn1 = GetPoint(cntNebor); arround.Add(cntNebor); } /*{ if ((cntNebor.layer != cntOneLay.layer) && (cntNebor.layer == Layers.siliconTrace || cntOneLay.layer == Layers.siliconTrace) && (GetPoint(cntNebor, Layers.contactTrace).name == Material.diffusionName) ) ; else { NodePoint pn1 = GetPoint(cntNebor); NodePoint pn2 = GetPoint(cntOneLay); if ( pn1.numberNode != pn2.numberNode) pn1 = GetPoint(cntNebor); if ( cntNebor.x == 31 && (cntNebor.y == 21 || cntNebor.y == 22) && cntNebor.layer == 1) pn1 = GetPoint(cntNebor); arround.Add(cntNebor); } }*/ } if (GetPoint(cnt).isSource) { NodePoint np2 = GetPoint(cnt); if (cnt.x == 19 && cnt.y == 33 && cnt.layer == 1) np2 = GetPoint(cnt); foreach (ContactSimple cntNebor in GetSourceContacts(cnt, currentName)) { NodePoint np1 = GetPoint(cntNebor); if (cnt.x == 19 && cnt.y == 33 && cnt.layer == 1) np1 = GetPoint(cntNebor); if ( GetPoint(cntNebor).isSource && (GetPoint(cntNebor).name == currentName) && (passedPoints.FindIndex(el => el == cntNebor) < 0) && (arround.FindIndex(el => el == cntNebor) < 0) )//&& FindSource(cnt) && FindSource(cntNebor) ) { NodePoint pn1 = GetPoint(cntNebor); NodePoint pn2 = GetPoint(cntOneLay); if ( pn1.numberNode != pn2.numberNode) pn1 = GetPoint(cntNebor); arround.Add(cntNebor); } } } } } } nextPoints.Clear(); nextPoints.AddRange(arround); passedPoints.AddRange(arround); pntProcess.IncrementNumber(); bool continueMark = false; do { List<ContactSimple> wave = SetOneWave(arround, passedPoints, pntProcess, currentName); nextPoints.AddRange(wave); passedPoints.AddRange(wave); arround = wave; continueMark = false; if (wave.Count > 0) continueMark = true; } while (continueMark); //passedPoints.AddRange(nextPoints); /*if (cntUnit.x == 14 && cntUnit.y == 5 && cntUnit.layer == Layers.siliconTrace) b = true;*/ } while (nextPoints.Count > 0); NodePoint np3 = GetPoint(inStart[0]); foreach(ContactSimple cnt in passedPoints) { if (cnt.x == 35 && cnt.y == 37 && cnt.layer == 1) np3 = GetPoint(cnt); } return passedPoints; }
/* private void ClearVccGnd() { Node curNode = nodeList.Find(el => el .name == conflictManager.GetBestPriority()); int curX = curNode.arcCollection[conflictManager.GetBlocadedNumber()].x; int curY = curNode.arcCollection[conflictManager.GetBlocadedNumber()].y; List<string> namesException = new List<string>(); List<Contact> contactsException = new List<Contact>(); foreach (Node nd in nodeList) { if (diffusionExeption.FindIndex(el => el == nd.name) >= 0) { foreach (Contact cnt in nd.arcCollection) { if ( (Math.Abs(cnt.x - curX) <= 2) && (cnt.y == curY) ) { contactsException.Add(cnt); namesException.Add(nd.name); } } } } for (int i = 0; i < contactsException.Count; i++) { List<Contact> sources = GetSourceContacts(contactsException[i], namesException[i]); } }*/ //public void TrySet public void SetAllSamePriority() { foreach (NodeDistanceBase disBase in nodeDistanceDict.Values) { Node processNode = nodeList.Find(element => element.name == disBase.name); List<int> idxPass = new List<int>(); for (int i = 0; i < processNode.arcCollection.Count; i++) { int idx = nodeDistanceDict[disBase.name].GetNumber(i); ContactSimple cnt = processNode.arcCollection[i]; if ( idxPass.FindIndex(el => el == idx) < 0 ) { idxPass.Add(idx); List<ContactSimple> startWave = FindStartContacts(new ContactSimple( processNode.arcCollection[idx]), processNode.name); SetContact(startWave, processNode.name, idx, 1, 0); NodePointProcess proc = new NodePointProcess(GetPoint(startWave[0]), false); int count = CompleteSpreadWaveProcess(startWave, proc); disBase.SetCountForNumber(i, count); } CheckOnePoint(); } } }
public int CompleteSpreadWaveProcessRem(List<ContactSimple> inStart, NodePointProcess pntProcess) { string currentName = layoutMap[inStart[0].x][inStart[0].y][inStart[0].layer].name; List<ContactSimple> nextPoints = new List<ContactSimple>(inStart);//inStart.GetArroundPoints(wide); //nextPoints.AddRange(inStart); List<ContactSimple> arround = new List<ContactSimple>(); List<ContactSimple> passedPoints = new List<ContactSimple>(inStart); //if (diffusionException.FindIndex(el => el == currentName) >= 0) { List<ContactSimple> thisWave = SetOneWave(nextPoints, passedPoints, pntProcess, currentName); SetOneWave(thisWave, passedPoints, pntProcess, currentName); nextPoints.AddRange(thisWave); passedPoints.AddRange(thisWave); } //passedPoints.AddRange(inStart); 22 step!!!!!!!!!!! VCC do { /*bool continueMark = false; do { List<ContactSimple> wave = SetOneWave(nextPoints, passedPoints, pntProcess, currentName); nextPoints.AddRange(wave); passedPoints.AddRange(wave); arround = wave; continueMark = false; if (wave.Count > 0) continueMark = true; } while (continueMark); */ foreach (ContactSimple cntOneLay in nextPoints) { //if (GetPoint(cnt).name == currentName) //{ foreach (ContactSimple cntNebor in cntOneLay.GetArroundPoints(wide)) { if ( (GetPoint(cntNebor).name == currentName) && (passedPoints.FindIndex(el => el == cntNebor) < 0) && (arround.FindIndex(el => el == cntNebor) < 0) ) { SetPoinProcess(cntNebor, cntNebor, pntProcess); arround.Add(cntNebor); //foreach (int layer in Params.GetOppositeLayers(cntNebor.layer)) foreach (ContactSimple cnt in GetPointsInLayers(cntNebor, currentName)) { //ContactSimple cnt = new ContactSimple(cntNebor, layer); if ( //IsPointsConnected(cnt, cntNebor.layer, layer, currentName) && (passedPoints.FindIndex(el => el == cnt) < 0) && (arround.FindIndex(el => el == cnt) < 0) ) { if (SetPoinProcess(cntNebor, cnt, pntProcess)) { arround.Add(cnt); if (GetPoint(cnt).isSource) { foreach (ContactSimple sourceContact in GetSourceContacts(cnt, currentName)) { if ( GetPoint(sourceContact).isSource && FindTrueSource(sourceContact) && (GetPoint(sourceContact).name == currentName) && (passedPoints.FindIndex(el => el == sourceContact) < 0) && (arround.FindIndex(el => el == sourceContact) < 0) )//&& FindSource(cnt) && FindSource(cntNebor) ) { SetPoinProcess(sourceContact, sourceContact, pntProcess); arround.Add(sourceContact); } } } } } } if (GetPoint(cntNebor).isSource) { foreach (ContactSimple sourceContact in GetSourceContacts(cntNebor, currentName)) { if ( GetPoint(sourceContact).isSource && FindTrueSource(sourceContact) && (GetPoint(sourceContact).name == currentName) && (passedPoints.FindIndex(el => el == sourceContact) < 0) && (arround.FindIndex(el => el == sourceContact) < 0) )//&& FindSource(cnt) && FindSource(cntNebor) ) { SetPoinProcess(sourceContact, sourceContact, pntProcess); arround.Add(sourceContact); } } } } } } nextPoints.Clear(); nextPoints.AddRange(arround); passedPoints.AddRange(arround); pntProcess.IncrementNumber(); arround.Clear(); } while (nextPoints.Count > 0); return passedPoints.Count; }
private void SetUntracedNumbers() { foreach (NodeDistanceBase disBase in nodeDistanceDict.Values) { if (!disBase.IsTraced()) { Node curNode = nodeList.Find(el => el.name == disBase.name); foreach (int curNumber in disBase.GetNodeNumbers(curNode.arcCollection.Count())) { List<ContactSimple> startPoint = FindStartPoint(curNode.arcCollection[curNumber], disBase.name); SetContactNumber(startPoint, 0); NodePointProcess proc = new NodePointProcess(GetPoint(startPoint[0]), false); int count = CompleteSpreadWaveProcess(startPoint, proc);//SpreadWaveProcess disBase.SetCountForNumber(curNumber, count); } } } }
private List<ContactSimple> SetOneWave(List<ContactSimple> inWave, List<ContactSimple> bandedConts, NodePointProcess pntProcess, string currentName) { List<ContactSimple> thisWave = new List<ContactSimple>(); foreach (ContactSimple cntUnit in inWave) { //thisWave.Add(cntUnit); //passedPoints.Add(cntUnit); bool b; foreach (int opposLay in Params.GetOppositeLayers(cntUnit.layer)) { ContactSimple curCnt = new ContactSimple(cntUnit, opposLay); if (bandedConts.FindIndex(el => el == curCnt) < 0) { if ((opposLay == Layers.siliconTrace || cntUnit.layer == Layers.siliconTrace)) { if ((GetPoint(cntUnit, Layers.contactTrace).name != Material.diffusionName) && (GetPoint(cntUnit, opposLay).name == currentName)) { //pntProcess.ProcessPoint(layoutMap[cntUnit.x][cntUnit.y][opposLay]); //passedPoints.Add(new ContactSimple(cntUnit,opposLay)); if ( cntUnit.x == 31 && (cntUnit.y == 21 || cntUnit.y == 22))// && cntNebor.layer == 1) b = true; //pn1 = GetPoint(cntNebor); thisWave.Add(new ContactSimple(cntUnit,opposLay)); } } else { if (GetPoint(cntUnit, opposLay).name == currentName) { //pntProcess.ProcessPoint(layoutMap[cntUnit.x][cntUnit.y][opposLay]); //passedPoints.Add(new ContactSimple(cntUnit,opposLay)); if ( cntUnit.x == 31 && (cntUnit.y == 21 || cntUnit.y == 22))// && cntNebor.layer == 1) b = true; thisWave.Add(new ContactSimple(cntUnit,opposLay)); } } } } pntProcess.ProcessPoint(layoutMap[cntUnit.x][cntUnit.y][cntUnit.layer]); } return thisWave; }
private bool SetPoinProcess(ContactSimple prevCnt, ContactSimple inCnt, NodePointProcess pntProcess) { if ( (prevCnt.layer != inCnt.layer) && ((prevCnt.layer == Layers.siliconTrace || inCnt.layer == Layers.siliconTrace)) ) { if (GetPoint(inCnt, Layers.contactTrace).name != Material.diffusionName) { pntProcess.ProcessPoint(layoutMap[inCnt.x][inCnt.y][inCnt.layer]); return true; } } else { pntProcess.ProcessPoint(layoutMap[inCnt.x][inCnt.y][inCnt.layer]); } return false; }
private void ClearTracedPath(System.IO.StreamWriter file) { List<NodeDistanceBase> lst = nodeDistanceDict.Values.ToList(); lst.Sort(NodeDistanceBase.CompareBaseByDist); foreach (NodeDistanceBase disBase in lst) { if (disBase.IsTraced()) { //bool b; //if (disBase.name == "INC") // b = true; /*if (AddingSpace(disBase.name) == "61113") { b = false; PrintMap(Layers.metal1Trace, file); PrintMap(Layers.siliconTrace, file); PrintMap(Layers.metal2Trace, file); }*/ CheckOnePoint(); Node curNode = nodeList.Find(el => el.name == disBase.name); List<ContactSimple> startPoint = FindStartPoint(curNode.arcCollection[0], disBase.name); //GetPoint(startPoint).number = 0; SetContactNumber(startPoint, 0); NodePointProcess proc = new NodePointProcess(GetPoint(startPoint[0]), false); CompleteSpreadWaveProcess(startPoint, proc); CheckOnePoint(); SpreadUsed(curNode); /*if (disBase.name == "N6861401")//"N6859613")//"N6861401") { file.WriteLine("!!!-----------check numb N6861401-------------------"); PrintMap(Layers.metal1Trace, file); PrintMap(Layers.siliconTrace, file); PrintNumb(-2, file); PrintUsed(-2, file); file.WriteLine("!!!-----------end check numb N6861401-------------------"); } // if (disBase.name == "INY") { file.WriteLine("!!!-----------check used INY-------------------"); PrintMap(Layers.metal1Trace, file); PrintMap(Layers.siliconTrace, file); PrintUsed(-2, file); file.WriteLine("!!!-----------end used INY-------------------"); }*/ CheckOnePoint(); ReplaceUnused procRemove = new ReplaceUnused(GetPoint(startPoint[0]), false); CompleteSpreadWaveProcessRem(startPoint, procRemove); CheckOnePoint(); } } //inFile.WriteLine(""); }
/*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--; } }
/*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--; } }
//private void /*private void FillUnused() { for (int x = 0; x < wide; x++) { for (int y = 0; y < Params.topEdge; y++) { if ( !layoutMap[x][y][Layers.metal1Trace].isUsed ) { SetContact(new ContactSimple(x,y,Layers.metal1Trace), Material.blankName, 0, 0, -1); layoutMap[x][y][Layers.metal1Trace].isReplace = true; } if ( !layoutMap[x][y][Layers.siliconTrace].isUsed && (layoutMap[x][y][Layers.siliconTrace].name != Material.diffusionName) ) { SetContact(new ContactSimple(x,y,Layers.siliconTrace), Material.blankName, 0, 0, -1); layoutMap[x][y][Layers.metal1Trace].isReplace = true; } } } }*/ /*public void ClearForAlign_old() { foreach (Node nd in nodeList) SpreadUsed(nd); SetUsedForUntraced(); foreach (Node nd in nodeList) { List<int> currentConnection = new List<int>(); for (int i = 0; i < nd.arcCollection.Count; i++) { if (currentConnection.FindIndex(el => el == i) < 0) { List<int> curList = nodeDistanceDict[nd.name].GetConnectedPoints(i); //ContactSimple startPoint = new ContactSimple(nd.arcCollection[i]); List<ContactSimple> startPoints = FindStartPoint(nd.arcCollection[i], nd.name); SetContactNumber(startPoints, 0); ReplaceUnused procRemove = new ReplaceUnused(GetPoint(startPoints[0]), false); int count = SpreadWaveProcess(startPoints, procRemove); nodeDistanceDict[nd.name].SetCountForNumber(i, count); currentConnection.AddRange(curList); } } } SetAllUnused(); }*/ public void ClearForAlign(System.IO.StreamWriter inFile) { foreach (Node nd in nodeList) { if (nodeDistanceDict[nd.name].IsTraced()) { List<int> currentConnection = new List<int>(); for (int i = 0; i < nd.arcCollection.Count; i++) { if (currentConnection.FindIndex(el => el == i) < 0) { List<int> curList = nodeDistanceDict[nd.name].GetConnectedPoints(i); List<ContactSimple> startPoints = FindStartPoint(nd.arcCollection[i], nd.name); SetContactNumber(startPoints, 0); //ReplaceUnused procRemove = new ReplaceUnused(0, GetPoint(startPoint).priority, false); NodePointProcess proc = new NodePointProcess(GetPoint(startPoints[0]), false); int count = CompleteSpreadWaveProcess(startPoints, proc); nodeDistanceDict[nd.name].SetCountForNumber(i, count); currentConnection.AddRange(curList); } } } } CheckOnePoint(); foreach (Node nd in nodeList) { if (nodeDistanceDict[nd.name].IsTraced()) SpreadUsed(nd); } CheckOnePoint(); //SetUsedForUntraced(); CheckOnePoint(); foreach (Node nd in nodeList) { if (nodeDistanceDict[nd.name].IsTraced()) { List<int> currentConnection = new List<int>(); for (int i = 0; i < nd.arcCollection.Count; i++) { if (currentConnection.FindIndex(el => el == i) < 0) { List<int> curList = nodeDistanceDict[nd.name].GetConnectedPoints(i); //ContactSimple startPoint = new ContactSimple(nd.arcCollection[i]); List<ContactSimple> startPoints = FindStartPoint(nd.arcCollection[i], nd.name); SetContactNumber(startPoints, 0); ReplaceUnused procRemove = new ReplaceUnused(GetPoint(startPoints[0]), false); int count = CompleteSpreadWaveProcessRem(startPoints, procRemove); //if (CheckOnePoint()) // CompleteSpreadWaveProcessRem(startPoints, procRemove); nodeDistanceDict[nd.name].SetCountForNumber(i, count); currentConnection.AddRange(curList); } } } } CheckOnePoint(); SetAllUnused(); }
private bool SearchNearest() { int allAcount = 2 * wide * Params.topEdge; //conflictManager = new ConflictPolitic(); string highPrior = conflictManager.GetBestPriority(); bool isNewRule = false; Node bestNode = nodeList.Find(el => (el.name == highPrior));//bestHighPrior)); NodeDistance needTrace = nodeDistanceDict[highPrior].BestDist(); int numberStart = nodeDistanceDict[highPrior].GetNumber(needTrace.names.x); // ContactSimple startOne = new ContactSimple(bestNode.arcCollection[numberStart]); List<ContactSimple> startWave = FindStartContacts(new ContactSimple( bestNode.arcCollection[numberStart]), bestNode.name); SetContact(startWave, bestNode.name, numberStart, 1, 0); NodePointProcess proc = new NodePointProcess(GetPoint(startWave[0]), false); List<ContactSimple> startArray = ReturnAllWaveProcess(startWave, proc); //List<ContactSimple> startArray = NodeField(startOne, numberStart); List<ContactSimple> curArray = new List<ContactSimple>(startArray); List<ContactSimple> lastRing = new List<ContactSimple>(startArray); List<ContactSimple> findCnts = new List<ContactSimple>(); //int numberToReach = nodeDistanceDict[highPrior].GetNumber(needTrace.names.y); do { do { findCnts.Clear(); do { List<ContactSimple> nextRing = FindInNearRing(curArray, lastRing); foreach (ContactSimple cnt in nextRing) { if (GetPoint(cnt).name == highPrior && GetPoint(cnt).numberNode != numberStart)//== numberToReach) { findCnts.Add(cnt); } } { curArray.AddRange(nextRing); lastRing = nextRing; } } while ((findCnts.Count <= 0) && (curArray.Count < allAcount) && (lastRing.Count > 0)); conflictManager.ResetConnection(); foreach (ContactSimple cnt in findCnts) { ContactSimple cntNear = FindNearestPoint(startArray, cnt); ConflictParametr conflicts = FindIntersects(cntNear, cnt, highPrior); //ConflictParametr conflicts = OptimizeIntersects(conflicts1); if (conflicts.GetCountConfl() >= 0) { //bool isBlockade = false; int numberToReach = GetPoint(cnt).numberNode; conflictManager.AddConnection(GetPoint(cnt), GetPoint(cntNear), cnt.layer, cntNear.GetDistance(cnt), conflicts, nodeDistanceDict[highPrior].countNode[numberToReach], nodeDistanceDict[highPrior].countNode[numberStart]); } } bool b; if (conflictManager.GetCountConflicts() <= 0) b = false; } while ((conflictManager.GetCountConflicts() <= 0) && (curArray.Count < allAcount) && (lastRing.Count > 0)); isNewRule = conflictManager.DefineRule(); } while ((!isNewRule)&& (curArray.Count < allAcount) && (lastRing.Count > 0)); return isNewRule; }