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