00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef TORC_ROUTER_UNROUTER_HPP
00020 #define TORC_ROUTER_UNROUTER_HPP
00021
00022 #include "torc/architecture/DDB.hpp"
00023 #include "torc/router/RouteTreeNode.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 Unrouter {
00037
00038
00039 typedef architecture::DDB DDB;
00040 typedef architecture::ArcUsage ArcUsage;
00041 typedef architecture::WireUsage WireUsage;
00042 typedef architecture::Tilewire Tilewire;
00043 typedef architecture::Arc Arc;
00044 typedef architecture::TilewireVector TilewireVector;
00045 typedef architecture::ArcVector ArcVector;
00046 protected:
00047
00048
00049 DDB& mDB;
00050
00051 ArcUsage& mArcUsage;
00052
00053 WireUsage& mWireUsage;
00054
00055 TilewireVector mSegmentBuf;
00056
00057 TilewireVector mSinksBuf;
00058
00059 TilewireVector mSourcesBuf;
00060
00061 std::set<Tilewire> mTracedWiresBuf;
00062
00063
00064 TilewireVector mWireQueue;
00065
00066 enum { eTraceToSource = 0, eTraceToBranch = 1, eTraceFullNet = 2 };
00067
00068 public:
00069
00070
00071 Unrouter(DDB& inDB) : mDB(inDB), mArcUsage(inDB.getArcUsage()),
00072 mWireUsage(inDB.getWireUsage()) {}
00073
00074 ~Unrouter() {}
00075
00076
00077 boost::int32_t unrouteToSinks(const Tilewire inTilewire) {
00078
00079 mWireQueue.clear();
00080 mWireQueue.push_back(inTilewire);
00081 Tilewire currentTilewire;
00082 boost::int32_t releasedArcs = 0;
00083
00084 while (mWireQueue.size() != 0) {
00085 currentTilewire = mWireQueue.back();
00086 mWireQueue.pop_back();
00087
00088 mSegmentBuf.clear();
00089 mDB.expandSegment(currentTilewire, mSegmentBuf);
00090 TilewireVector::iterator p;
00091 TilewireVector::iterator e = mSegmentBuf.end();
00092 for (p = mSegmentBuf.begin(); p < e; p++) {
00093 const Tilewire& segmentTilewire = *p;
00094 mSinksBuf.clear();
00095 mDB.expandTilewireSinks(segmentTilewire, mSinksBuf);
00096 TilewireVector::iterator q;
00097 TilewireVector::iterator f = mSinksBuf.end();
00098 for (q = mSinksBuf.begin(); q < f; q++) {
00099 const Tilewire& sinkTilewire = *q;
00100 if(mArcUsage.isUsed(segmentTilewire, sinkTilewire)) {
00101 mWireQueue.push_back(sinkTilewire);
00102 Arc arc(segmentTilewire, sinkTilewire);
00103 mDB.releaseArc(arc);
00104 releasedArcs++;
00105 }
00106 }
00107 }
00108 }
00109 return releasedArcs;
00110 }
00111
00112
00113
00114
00115
00116 RouteTreeNode* traceToSinks(Tilewire inTilewire) {
00117 mTracedWiresBuf.clear();
00118 RouteTreeNode* node = new RouteTreeNode(inTilewire, inTilewire, 0, 0);
00119 traceDownstream(node);
00120
00121 return node;
00122 }
00123
00124
00125
00126 RouteTreeNode* traceBranch(Tilewire inTilewire) {
00127 mTracedWiresBuf.clear();
00128 RouteTreeNode* node = new RouteTreeNode(inTilewire, inTilewire, 0, 0);
00129 traceUpstream(node, eTraceToBranch);
00130
00131 return node;
00132 }
00133
00134
00135
00136 RouteTreeNode* traceToSource(Tilewire inTilewire) {
00137 mTracedWiresBuf.clear();
00138 RouteTreeNode* node = new RouteTreeNode(inTilewire, inTilewire, 0, 0);
00139 traceUpstream(node, eTraceToSource);
00140
00141 return node;
00142 }
00143
00144
00145
00146 RouteTreeNode* traceFull(Tilewire inTilewire) {
00147 mTracedWiresBuf.clear();
00148 RouteTreeNode* node = new RouteTreeNode(inTilewire, inTilewire, 0, 0);
00149 traceUpstream(node, eTraceFullNet);
00150
00151 return node;
00152 }
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229 void findBranchSinks(Tilewire inTilewire, TilewireVector& outSinks) {
00230 std::cout << "findBranchSinks not yet implemented." << std::endl;
00231 throw;
00232 }
00233
00234 void findSinks(Tilewire inTilewire, TilewireVector& outSinks) {
00235 std::cout << "findSinks not yet implemented." << std::endl;
00236 throw;
00237 }*/
00238
00239 protected:
00240
00241 void traceDownstream(RouteTreeNode* inNode) {
00242 const Tilewire& nodeTilewire = inNode->getSinkTilewire();
00243 std::vector<RouteTreeNode*> activeSinks;
00244
00245 mSegmentBuf.clear();
00246 mDB.expandSegment(nodeTilewire, mSegmentBuf);
00247 TilewireVector::iterator p;
00248 TilewireVector::iterator e = mSegmentBuf.end();
00249 for (p = mSegmentBuf.begin(); p < e; p++) {
00250 const Tilewire& segmentTilewire = *p;
00251 mTracedWiresBuf.insert(segmentTilewire);
00252 mSinksBuf.clear();
00253 mDB.expandTilewireSinks(segmentTilewire, mSinksBuf);
00254 TilewireVector::iterator q;
00255 TilewireVector::iterator f = mSinksBuf.end();
00256 for (q = mSinksBuf.begin(); q < f; q++) {
00257 const Tilewire& sinkTilewire = *q;
00258 if(mTracedWiresBuf.count(sinkTilewire) == 1) continue;
00259 if(mArcUsage.isUsed(segmentTilewire, sinkTilewire)) {
00260 activeSinks.push_back(new RouteTreeNode(
00261 segmentTilewire, sinkTilewire, 0, inNode));
00262 }
00263 }
00264 }
00265 unsigned int activeSinksSize = activeSinks.size();
00266 if(activeSinksSize == 0) return;
00267
00268 inNode->addChildren(activeSinks);
00269 for(unsigned int i = 0; i < activeSinksSize; i++) {
00270 RouteTreeNode* childNode = inNode->getChild(i);
00271 traceDownstream(childNode);
00272 }
00273 }
00274
00275 void traceUpstream(RouteTreeNode* inNode, boost::int32_t inMode) {
00276
00277 const Tilewire& nodeSourceTilewire = inNode->getSourceTilewire();
00278 const Tilewire& nodeSinkTilewire = inNode->getSinkTilewire();
00279 Arc parentArc;
00280 bool foundParent = false;
00281 std::vector<RouteTreeNode*> activeSinks;
00282 mSegmentBuf.clear();
00283 mDB.expandSegment(nodeSourceTilewire, mSegmentBuf);
00284 TilewireVector::iterator p;
00285 TilewireVector::iterator e = mSegmentBuf.end();
00286 for (p = mSegmentBuf.begin(); p != e; p++) {
00287 const Tilewire& segmentTilewire = *p;
00288 mTracedWiresBuf.insert(segmentTilewire);
00289 mSourcesBuf.clear();
00290 mDB.expandTilewireSources(segmentTilewire, mSourcesBuf);
00291 TilewireVector::iterator q;
00292 TilewireVector::iterator f = mSourcesBuf.end();
00293 for (q = mSourcesBuf.begin(); q != f; q++) {
00294 const Tilewire& sourceTilewire = *q;
00295 if (mTracedWiresBuf.count(sourceTilewire) == 1) {
00296 std::cout << "ALREADY SEEN THIS TILEWIRE" << std::endl;
00297 continue;
00298 }
00299 if (mArcUsage.isUsed(sourceTilewire, segmentTilewire)) {
00300 if (foundParent) {
00301 std::cout << "TRACER ERROR: MULTIPLE PARENTS" << std::endl;
00302 throw;
00303 }
00304 parentArc = Arc(sourceTilewire, segmentTilewire);
00305 foundParent = true;
00306 }
00307 }
00308 }
00309
00310 if (inMode != eTraceToSource) {
00311 mSegmentBuf.clear();
00312 mDB.expandSegment(nodeSinkTilewire, mSegmentBuf);
00313 e = mSegmentBuf.end();
00314 for (p = mSegmentBuf.begin(); p < e; p++) {
00315 Tilewire segmentTilewire = *p;
00316 mTracedWiresBuf.insert(segmentTilewire);
00317 mSinksBuf.clear();
00318 mDB.expandTilewireSinks(segmentTilewire, mSinksBuf);
00319 TilewireVector::iterator q;
00320 TilewireVector::iterator f = mSinksBuf.end();
00321 for (q = mSinksBuf.begin(); q < f; q++) {
00322 Tilewire sinkTilewire = *q;
00323 if (mTracedWiresBuf.count(sinkTilewire) == 1) {
00324 std::cout << "ALREADY SEEN THIS TILEWIRE" << std::endl;
00325 continue;
00326 }
00327 if (mArcUsage.isUsed(segmentTilewire, sinkTilewire)) {
00328 activeSinks.push_back(new RouteTreeNode(
00329 segmentTilewire, sinkTilewire, 0, inNode));
00330 }
00331 }
00332 }
00333 unsigned int activeSinksSize = activeSinks.size();
00334 std::cout << "ACTIVE SINKS SIZE: " << activeSinksSize << std::endl;
00335 std::cout << inMode << " " << eTraceToBranch << std::endl;
00336 if (inMode == eTraceToBranch && activeSinksSize > 0) return;
00337 if (activeSinksSize > 1) {
00338 inNode->addChildren(activeSinks);
00339 activeSinksSize = inNode->getNumChildren();
00340 std::cout << activeSinksSize << std::endl;
00341 for (unsigned int i = 0; i < activeSinksSize; i++) {
00342 RouteTreeNode* newChildNode = inNode->getChild(i);
00343 traceDownstream(newChildNode);
00344 }
00345 }
00346 }
00347
00348 if (foundParent) {
00349
00350 inNode->makeParent(parentArc.getSourceTilewire(), parentArc.getSinkTilewire());
00351 RouteTreeNode* parentNode = (RouteTreeNode*)inNode->getParent();
00352 traceUpstream(parentNode, inMode);
00353 }
00354 }
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403 };
00404
00405
00406 }
00407 }
00408
00409 #endif // TORC_ROUTER_UNROUTER_HPP