00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef TORC_ROUTER_TRACE_HPP
00020 #define TORC_ROUTER_TRACE_HPP
00021
00022 #include "torc/architecture/DDB.hpp"
00023 #include "torc/router/TraceNode.hpp"
00024 #include <set>
00025 #include <iostream>
00026
00027 #include "torc/architecture/OutputStreamHelpers.hpp"
00028 #include "torc/common/TestHelpers.hpp"
00029
00030 namespace torc {
00031 namespace router {
00032
00033
00034
00035
00036 class Trace {
00037
00038
00039 typedef architecture::DDB DDB;
00040 typedef architecture::ArcUsage ArcUsage;
00041 typedef architecture::Tilewire Tilewire;
00042 typedef architecture::Arc Arc;
00043 typedef architecture::TilewireVector TilewireVector;
00044 typedef architecture::ArcVector ArcVector;
00045 protected:
00046
00047
00048 DDB& mDB;
00049
00050 ArcUsage& mArcUsage;
00051
00052
00053 TraceNode* mInitialNode;
00054
00055 TraceNodePtrVector mSinks;
00056
00057 TraceNodePtrVector mSources;
00058
00059 TraceNodePtrVector mBranchPoints;
00060
00061
00062 TraceNodePtrVector mAllNodes;
00063
00064 std::map<Tilewire, TraceNode*> mTilewireToTraceNode;
00065
00066 std::map<TraceNode*, std::map<TraceNode*, Arc> > mTraceNodesToArc;
00067
00068 ArcVector mArcVector;
00069
00070 public:
00071
00072 enum ETraceMode { eTraceFullNet = 0, eTraceToSinks, eTraceToBranch,
00073 eTraceToSources, eTraceSinglePath };
00074
00075 public:
00076
00077
00078 Trace(DDB& inDB, Tilewire inTilewire, ETraceMode inTraceMode = eTraceFullNet)
00079 : mDB(inDB), mArcUsage(inDB.getArcUsage()) {
00080 mInitialNode = createNode(inTilewire);
00081 switch (inTraceMode) {
00082 case eTraceFullNet:
00083 case eTraceToSinks:
00084 case eTraceToBranch:
00085 case eTraceToSources:
00086 case eTraceSinglePath:
00087 break;
00088 default:
00089 std::cout << "Invalid Trace mode setting." << std::endl;
00090 return;
00091 }
00092 traceWorker(mInitialNode, inTraceMode);
00093 }
00094
00095 ~Trace() {
00096 std::cout << "Destroying Trace!" << std::endl;
00097 TraceNodePtrVector::iterator p;
00098 TraceNodePtrVector::iterator e = mAllNodes.end();
00099 for (p = mAllNodes.begin(); p != e; p++) {
00100 delete *p;
00101 }
00102 mAllNodes.clear();
00103 mSinks.clear();
00104 mSources.clear();
00105 mBranchPoints.clear();
00106
00107 }
00108
00109 TraceNodePtrVector& getSinks() {
00110 return mSinks;
00111 }
00112
00113 TraceNodePtrVector& getSources() {
00114 return mSources;
00115 }
00116
00117 TraceNodePtrVector& getBranchPoints() {
00118 return mBranchPoints;
00119 }
00120
00121 ArcVector& getArcs() {
00122 mArcVector.clear();
00123 std::map<TraceNode*, std::map<TraceNode*, Arc> >::iterator outer_p;
00124 std::map<TraceNode*, std::map<TraceNode*, Arc> >::iterator outer_end;
00125 std::map<TraceNode*, Arc>::iterator inner_p;
00126 std::map<TraceNode*, Arc>::iterator inner_end;
00127 outer_end = mTraceNodesToArc.end();
00128 for (outer_p = mTraceNodesToArc.begin(); outer_p != outer_end; outer_p++) {
00129 std::map<TraceNode*, Arc> innermap = outer_p->second;
00130 inner_end = innermap.end();
00131 for (inner_p = innermap.begin(); inner_p != inner_end; inner_p++) {
00132 mArcVector.push_back(inner_p->second);
00133
00134 }
00135 }
00136
00137 return mArcVector;
00138 }
00139 protected:
00140
00141 void traceWorker(TraceNode* inNode, ETraceMode inMode) {
00142 TraceNodePtrVector activeArcs;
00143
00144
00145
00146 ArcVector outArcs;
00147 ArcVector inArcs;
00148 TraceNodePtrVector activeSinks;
00149 TraceNodePtrVector activeSources;
00150 Tilewire nodeTilewire = inNode->getTilewire();
00151
00152 unsigned int childCount = 0;
00153 unsigned int parentCount = 0;
00154 mDB.expandSegmentSinks(nodeTilewire, outArcs);
00155 for (unsigned int i = 0 ; i < outArcs.size(); i++) {
00156 if (mArcUsage.isUsed(outArcs[i]))
00157 childCount++;
00158 }
00159 mDB.expandSegmentSources(nodeTilewire, inArcs);
00160 for (unsigned int i = 0; i < inArcs.size(); i++) {
00161 if (mArcUsage.isUsed(inArcs[i]))
00162 parentCount++;
00163 }
00164 bool isBranch;
00165 if (childCount == 0) {
00166 mSinks.push_back(inNode);
00167 std::cout << "FOUND A SINK NODE: " << nodeTilewire << std::endl;
00168 }
00169 if (parentCount == 0) {
00170 mSources.push_back(inNode);
00171 std::cout << "FOUND A SOURCE NODE: " << nodeTilewire << std::endl;
00172 }
00173 if (childCount > 1 || parentCount > 1) {
00174 mBranchPoints.push_back(inNode);
00175 std::cout << "FOUND A BRANCH NODE: " << nodeTilewire
00176 << " children: " << childCount << " parents: " << parentCount << std::endl;
00177 isBranch = true;
00178 } else {
00179 isBranch = false;
00180 }
00181 if (childCount == 1 && parentCount == 1) {
00182
00183 }
00184
00185
00186 bool traceSinks = inMode != eTraceToSources;
00187 bool traceSources = inMode != eTraceToSinks;
00188 if (inMode == eTraceToBranch || inMode == eTraceSinglePath) {
00189 traceSinks = !isBranch;
00190 }
00191 if (inMode == eTraceToBranch || inMode == eTraceSinglePath) {
00192 traceSources = !isBranch;
00193 }
00194
00195
00196 if (traceSinks) {
00197 for (unsigned int i = 0; i < outArcs.size(); i++) {
00198 const Tilewire& sinkTilewire = outArcs[i].getSinkTilewire();
00199
00200 if (mArcUsage.isUsed(outArcs[i])) {
00201
00202
00203 TraceNode* arcNode = getNode(sinkTilewire);
00204 if (arcNode == 0) {
00205
00206 arcNode = createNode(sinkTilewire);
00207
00208 activeSinks.push_back(arcNode);
00209 }
00210 if (findArc(inNode, arcNode) == Arc()) {
00211
00212 inNode->addChild(arcNode);
00213 arcNode->addParent(inNode);
00214 } else {
00215
00216 continue;
00217 }
00218
00219 mTraceNodesToArc[inNode][arcNode] = outArcs[i];
00220 }
00221 }
00222 }
00223 if (traceSources) {
00224 for (unsigned int i = 0; i < inArcs.size(); i++) {
00225 const Tilewire& sourceTilewire = inArcs[i].getSourceTilewire();
00226
00227 if (mArcUsage.isUsed(inArcs[i])) {
00228
00229
00230 TraceNode* arcNode = getNode(sourceTilewire);
00231 if (arcNode == 0) {
00232
00233 arcNode = createNode(sourceTilewire);
00234
00235 activeSources.push_back(arcNode);
00236 }
00237 if (findArc(arcNode, inNode) == Arc()) {
00238
00239 arcNode->addChild(inNode);
00240 inNode->addParent(arcNode);
00241 } else {
00242
00243 continue;
00244 }
00245
00246 mTraceNodesToArc[arcNode][inNode] = inArcs[i];
00247 }
00248 }
00249 }
00250
00251
00252 if (traceSinks) {
00253 for (unsigned int i = 0; i < activeSinks.size(); i++) {
00254 if (inMode == eTraceToBranch)
00255 traceWorker(activeSinks[i], eTraceToSinks);
00256 else
00257 traceWorker(activeSinks[i], inMode);
00258 }
00259 }
00260 if (traceSources) {
00261 for (unsigned int i = 0; i < activeSources.size(); i++) {
00262 traceWorker(activeSources[i], inMode);
00263 }
00264 }
00265 }
00266
00267
00268
00269
00270 void normalizeDepth(TraceNode* inNode) {
00271 TraceNode::TraceNodePtrVector parents;
00272 TraceNode::TraceNodePtrList wavefront;
00273 TraceNode* node;
00274 std::set<Tilewire> nodesVisited;
00275
00276
00277
00278
00279 for (unsigned int i = 0; i < parents.size(); i++) {
00280 parents[i]->setDepth(0);
00281 std::cout << "PARENT " << parents[i]->getTilewire() << std::endl;
00282 nodesVisited.insert(parents[i]->getTilewire());
00283 for (unsigned int j = 0; j < parents[i]->getNumChildren(); j++) {
00284 wavefront.push_back(parents[i]->getChild(j));
00285 }
00286 }
00287 while (wavefront.size() != 0) {
00288 node = wavefront.front();
00289 wavefront.pop_front();
00290
00291 Tilewire tw = node->getTilewire();
00292 if (nodesVisited.find(tw) == nodesVisited.end()) {
00293 nodesVisited.insert(node->getTilewire());
00294 } else {
00295 std::cout << "Already visited " << tw << std::endl;
00296 }
00297
00298 if (node->getNumParents() == 0) {
00299 std::cout << "SOURCE NODE" << std::endl;
00300 node->setDepth(0);
00301 } else {
00302 for (unsigned int i = 0; i < node->getNumParents(); i++) {
00303 std::cout << "PARENT DEPTH " << node->getParent(i)->getDepth() << std::endl;
00304 if (node->getParent(i)->getDepth() + 1 > node->getDepth()) {
00305 node->setDepth(node->getParent(i)->getDepth() + 1);
00306 }
00307 }
00308 }
00309 if (node->getNumChildren() == 0) {
00310 std::cout << "SINK NODE" << std::endl;
00311 }
00312 for (unsigned int i = 0; i < node->getNumChildren(); i++) {
00313 wavefront.push_back(node->getChild(i));
00314 }
00315 }
00316
00317 }
00318
00319 TraceNode* createNode(Tilewire inTilewire) {
00320 std::map<Tilewire, TraceNode*>::iterator it;
00321 it = mTilewireToTraceNode.find(inTilewire);
00322 if (it != mTilewireToTraceNode.end()) {
00323 return 0;
00324 }
00325 TilewireVector segmentTilewires;
00326 mDB.expandSegment(inTilewire, segmentTilewires);
00327 TraceNode* newNode = new TraceNode(inTilewire);
00328 mAllNodes.push_back(newNode);
00329 for (unsigned int i = 0; i < segmentTilewires.size(); i++) {
00330 mTilewireToTraceNode.insert(
00331 std::pair<Tilewire, TraceNode*>(segmentTilewires[i], newNode));
00332 }
00333 return newNode;
00334 }
00335
00336 TraceNode* getNode(Tilewire inTilewire) {
00337 std::map<Tilewire, TraceNode*>::iterator it;
00338 it = mTilewireToTraceNode.find(inTilewire);
00339 if (it == mTilewireToTraceNode.end()) {
00340 return 0;
00341 } else {
00342 return it->second;
00343 }
00344 }
00345
00346 Arc findArc(TraceNode* source, TraceNode* sink) {
00347
00348 std::map<TraceNode*, std::map<TraceNode*, Arc> >::iterator outer_p;
00349 std::map<TraceNode*, std::map<TraceNode*, Arc> >::iterator outer_end;
00350 std::map<TraceNode*, Arc>::iterator inner_p;
00351 std::map<TraceNode*, Arc>::iterator inner_end;
00352 outer_end = mTraceNodesToArc.end();
00353 outer_p = mTraceNodesToArc.find(source);
00354 if (outer_p != outer_end) {
00355 std::map<TraceNode*, Arc> innermap = outer_p->second;
00356 inner_end = innermap.end();
00357 inner_p = innermap.find(sink);
00358 if (inner_p != inner_end) {
00359 return inner_p->second;
00360 }
00361 }
00362 return Arc();
00363 }
00364 };
00365 }
00366 }
00367
00368 #endif // TORC_ROUTER_TRACE_HPP