00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef TORC_ROUTER_PATHFINDERNETROUTERHEURISTIC_HPP
00020 #define TORC_ROUTER_PATHFINDERNETROUTERHEURISTIC_HPP
00021
00022 #include "torc/architecture/DDB.hpp"
00023 #include "torc/router/RouteNode.hpp"
00024 #include "torc/router/NetRouterHeuristicBase.hpp"
00025 #include "torc/router/PathFinder.hpp"
00026 #include "torc/architecture/OutputStreamHelpers.hpp"
00027 #include "torc/architecture/XilinxDatabaseTypes.hpp"
00028 #include <set>
00029 #include <iostream>
00030 #include <algorithm>
00031 #include <queue>
00032 #include <stdlib.h>
00033 #include <boost/cstdint.hpp>
00034 #include <boost/timer.hpp>
00035 #include <boost/unordered_map.hpp>
00036 #include <boost/functional/hash.hpp>
00037 #include <boost/integer_traits.hpp>
00038
00039 namespace torc {
00040 namespace router {
00041
00042
00043
00044 class PathFinderNetRouterHeuristic : public NetRouterHeuristicBase {
00045
00046
00047 typedef architecture::DDB DDB;
00048 typedef architecture::Tiles Tiles;
00049 typedef architecture::ArcUsage ArcUsage;
00050 typedef architecture::WireUsage WireUsage;
00051 typedef architecture::Tilewire Tilewire;
00052 typedef architecture::TileInfo TileInfo;
00053 typedef architecture::Arc Arc;
00054 typedef architecture::TilewireVector TilewireVector;
00055 typedef architecture::ArcVector ArcVector;
00056 typedef architecture::xilinx::TileRow TileRow;
00057 typedef architecture::xilinx::TileCol TileCol;
00058
00059 typedef boost::unordered_map<Tilewire, TilewireData> PathFinderSharingMap;
00060
00061 protected:
00062
00063
00064 ArcUsage& mArcUsage;
00065
00066 const Tiles& mTiles;
00067
00068 Tilewire mTargetSink;
00069
00070 const TileInfo* mSinkTileInfo;
00071
00072 boost::int32_t mRow;
00073
00074 boost::int32_t mCol;
00075
00076
00077 TilewireVector mSegmentBuf;
00078
00079 ArcVector mArcsBuf;
00080
00081
00082 PathFinderSharingMap* mConflictMap;
00083
00084
00085 public:
00086
00087
00088 PathFinderNetRouterHeuristic(DDB& inDB) : NetRouterHeuristicBase(inDB),
00089 mArcUsage(inDB.getArcUsage()), mTiles(inDB.getTiles()) {}
00090
00091 ~PathFinderNetRouterHeuristic() {}
00092
00093 void processParameters() {
00094 boost::any map = getParameter(0);
00095 mConflictMap = boost::any_cast<PathFinderSharingMap*>(map);
00096 std::cout<< "SETUP CONFLICT MAP" << std::endl;
00097 }
00098
00099
00100 void setSink(const Tilewire& inSink) {
00101 mSinkTileInfo = &mTiles.getTileInfo(inSink.getTileIndex());
00102 mTargetSink = inSink;
00103 mRow = mSinkTileInfo->getRow();
00104 mCol = mSinkTileInfo->getCol();
00105 }
00106
00107 void nodeCost(RouteNode& inNode) {
00108 Tilewire sinkTilewire = inNode.getSinkTilewire();
00109 boost::int32_t bestDistance = boost::integer_traits<boost::int32_t>::max();
00110 boost::int32_t distance = boost::integer_traits<boost::int32_t>::max();
00111 boost::int32_t cost = 0;
00112 if (sinkTilewire == mTargetSink) {
00113 inNode.setCost(0);
00114 return;
00115 }
00116 mArcsBuf.clear();
00117 expandSegmentSinks(sinkTilewire, mArcsBuf);
00118 if (mArcsBuf.size() == 0) {
00119 inNode.setCost(bestDistance);
00120 return;
00121 }
00122 ArcVector::iterator p;
00123 ArcVector::iterator e = mArcsBuf.end();
00124 for (p = mArcsBuf.begin(); p != e; p++) {
00125 if (mArcUsage.isUsed(*p)) continue;
00126 if (sinkTilewire == mTargetSink) {
00127 inNode.setCost(0);
00128 return;
00129 }
00130 distance = distanceToSink(p->getSinkTilewire());
00131 if (distance < bestDistance) bestDistance = distance;
00132 }
00133 if (bestDistance == boost::integer_traits<boost::int32_t>::max()) {
00134 inNode.setCost(bestDistance);
00135 return;
00136 }
00137 cost += bestDistance;
00138
00139 if (inNode.getParent() == NULL)
00140 std::cout << "NULL PARENT" << std::endl;
00141 else
00142 cost += inNode.getParent()->getCost();
00143
00144 if (mConflictMap->find(sinkTilewire) != mConflictMap->end()) {
00145 cost = (cost + (*mConflictMap)[sinkTilewire].mHistorySharing)
00146 * (*mConflictMap)[sinkTilewire].mPresentSharing;
00147 }
00148
00149 inNode.setCost(cost);
00150 }
00151
00152 void nodeCostInitial(RouteNode& inNode) {
00153 Tilewire sinkTilewire = inNode.getSinkTilewire();
00154 boost::int32_t bestDistance = boost::integer_traits<boost::int32_t>::max();
00155 boost::int32_t distance = boost::integer_traits<boost::int32_t>::max();
00156 boost::int32_t cost = 0;
00157 if (sinkTilewire == mTargetSink) {
00158 inNode.setCost(0);
00159 return;
00160 }
00161 mArcsBuf.clear();
00162 expandSegmentSinks(sinkTilewire, mArcsBuf);
00163 if (mArcsBuf.size() == 0) {
00164 inNode.setCost(bestDistance);
00165 return;
00166 }
00167 ArcVector::iterator p;
00168 ArcVector::iterator e = mArcsBuf.end();
00169 for (p = mArcsBuf.begin(); p != e; p++) {
00170 if (mArcUsage.isUsed(*p)) continue;
00171 if (sinkTilewire == mTargetSink) {
00172 inNode.setCost(0);
00173 return;
00174 }
00175 distance = distanceToSink(p->getSinkTilewire());
00176 if (distance < bestDistance) bestDistance = distance;
00177 }
00178 if (bestDistance == boost::integer_traits<boost::int32_t>::max()) {
00179 inNode.setCost(bestDistance);
00180 return;
00181 }
00182 cost += bestDistance;
00183 inNode.setCost(cost);
00184 }
00185
00186 virtual void reorderSinks(const Tilewire& inSource, TilewireVector& inSinks) {
00187
00188 }
00189
00190 void expandSegmentSinks(const Tilewire& inTilewire, ArcVector& outArcs) {
00191 ArcVector tempArcs;
00192
00193
00194
00195
00196
00197
00198 mDB.expandSegmentSinks(inTilewire, tempArcs, DDB::eExpandDirectionNone,
00199 true, true, true, false);
00200
00201 unsigned int s = tempArcs.size();
00202 if (s == 0) return;
00203 unsigned int t = inTilewire.getTileIndex() % s;
00204 for (unsigned int i = t; i < s; i++) {
00205 outArcs.push_back(tempArcs[i]);
00206 }
00207 for (unsigned int i = 0; i < t; i++) {
00208 outArcs.push_back(tempArcs[i]);
00209 }
00210 }
00211
00212 protected:
00213 virtual boost::int32_t distanceToSink(const Tilewire& inTilewire) {
00214 const TileInfo* tileInfo = &mTiles.getTileInfo(inTilewire.getTileIndex());
00215 boost::int32_t distance = 0;
00216 boost::int32_t iRow = tileInfo->getRow();
00217 boost::int32_t iCol = tileInfo->getCol();
00218 distance += iRow < mRow ? mRow - iRow : iRow - mRow;
00219 distance += iCol < mCol ? mCol - iCol : iCol - mCol;
00220 return distance;
00221 }
00222
00223 virtual boost::int32_t clkDistanceToSink(const Tilewire& inTilewire) {
00224 return -100;
00225 }
00226 };
00227
00228
00229 }
00230 }
00231
00232 #endif // TORC_ROUTER_PATHFINDERNETROUTERHEURISTIC_HPP