00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef TORC_ROUTER_ROUTNET_HPP
00020 #define TORC_ROUTER_ROUTNET_HPP
00021
00022 #include "torc/architecture/Tilewire.hpp"
00023 #include "torc/architecture/Arc.hpp"
00024 #include "torc/router/RouteNode.hpp"
00025 #include <string>
00026 #include <map>
00027 #include <boost/unordered_map.hpp>
00028 #include <boost/any.hpp>
00029
00030 namespace torc {
00031 namespace router {
00032
00033 enum ERoutePropertyType {
00034 eRouteTime = 0,
00035 eRoutePropertyTypeCount
00036 };
00037
00038
00039
00040 class RouteNet {
00041
00042
00043 typedef std::string string;
00044 typedef architecture::Tilewire Tilewire;
00045 typedef architecture::TilewireVector TilewireVector;
00046 typedef architecture::Arc Arc;
00047 typedef architecture::ArcVector ArcVector;
00048 public:
00049 typedef ArcVector::const_iterator ArcConstIterator;
00050 typedef ArcVector::iterator ArcIterator;
00051 typedef TilewireVector::const_iterator TilewireConstIterator;
00052 typedef TilewireVector::iterator TilewireIterator;
00053 typedef RouteNodePtrVector::const_iterator RouteNodePtrConstIterator;
00054 typedef RouteNodePtrVector::iterator RouteNodePtrIterator;
00055
00056 protected:
00057
00058
00059 string mName;
00060
00061 TilewireVector mSources;
00062
00063 TilewireVector mSinks;
00064
00065 ArcVector mArcs;
00066
00067 RouteNodePtrVector mRouteNodes;
00068
00069 public:
00070 boost::unordered_map<boost::uint32_t, boost::any> mProperties;
00071
00072 public:
00073
00074
00075 RouteNet(string& inName) : mName(inName) {}
00076
00077
00078 RouteNet(string& inName, const TilewireVector& inSources, const TilewireVector& inSinks) :
00079 mName(inName), mSources(inSources), mSinks(inSinks) {}
00080
00081
00082
00083 bool containsSource(Tilewire inTilewire) const {
00084 return std::find(sourcesBegin(), sourcesEnd(), inTilewire) != sourcesEnd();
00085 }
00086
00087
00088 bool containsSink(Tilewire inTilewire) const {
00089 return std::find(sinksBegin(), sinksEnd(), inTilewire) != sinksEnd();
00090 }
00091
00092
00093 bool containsArc(const Arc& inArc) const {
00094 return std::find(arcsBegin(), arcsEnd(), inArc) != arcsEnd();
00095 }
00096
00097
00098 void addSource(Tilewire inTilewire) {
00099 mSources.push_back(inTilewire);
00100 }
00101
00102
00103 void addSink(Tilewire inTilewire) {
00104 mSinks.push_back(inTilewire);
00105 }
00106
00107
00108
00109 bool removeSource(Tilewire inTilewire) {
00110 TilewireIterator e = sourcesEnd();
00111 TilewireIterator result = std::find(sourcesBegin(), e, inTilewire);
00112 if(result == e) return false;
00113 mSources.erase(result);
00114 return true;
00115 }
00116
00117
00118
00119 bool removeSink(Tilewire inTilewire) {
00120 TilewireIterator e = sinksEnd();
00121 TilewireIterator result = std::find(sinksBegin(), e, inTilewire);
00122 if(result == e) return false;
00123 mSinks.erase(result);
00124 return true;
00125 }
00126
00127
00128 void addArc(const Arc& inArc) {
00129 mArcs.push_back(inArc);
00130 }
00131
00132
00133 bool removeArc(const Arc& inArc) {
00134 ArcIterator e = arcsEnd();
00135 ArcIterator result = std::find(arcsBegin(), e, inArc);
00136
00137 if(result == e) return false;
00138
00139 mArcs.erase(result);
00140 return true;
00141 }
00142
00143
00144 void unroute(void) {
00145 mArcs.clear();
00146 }
00147
00148
00149 bool hasAnySources(void) const { return !mSources.empty(); }
00150
00151 bool hasOneSource(void) const { return mSources.size() == 1; }
00152
00153 bool hasMultipleSources(void) const { return mSources.size() > 1; }
00154
00155 size_t getSourceCount(void) const { return mSources.size(); }
00156
00157 bool hasAnySinks(void) const { return !mSinks.empty(); }
00158
00159 bool hasOneSink(void) const { return mSinks.size() == 1; }
00160
00161 bool hasMultipleSinks(void) const { return mSinks.size() > 1; }
00162
00163 size_t getSinkCount(void) const { return mSinks.size(); }
00164
00165 bool hasAnyArcs(void) const { return !mArcs.empty(); }
00166
00167 size_t getArcCount(void) const { return mArcs.size(); }
00168
00169 bool isRouted(void) const { return hasAnyArcs(); }
00170
00171 bool isUnrouted(void) const { return !hasAnyArcs(); }
00172
00173
00174 TilewireConstIterator sourcesBegin(void) const { return mSources.begin(); }
00175
00176 TilewireConstIterator sourcesEnd(void) const { return mSources.end(); }
00177
00178 TilewireIterator sourcesBegin(void) { return mSources.begin(); }
00179
00180 TilewireIterator sourcesEnd(void) { return mSources.end(); }
00181
00182 TilewireConstIterator sinksBegin(void) const { return mSinks.begin(); }
00183
00184 TilewireConstIterator sinksEnd(void) const { return mSinks.end(); }
00185
00186 TilewireIterator sinksBegin(void) { return mSinks.begin(); }
00187
00188 TilewireIterator sinksEnd(void) { return mSinks.end(); }
00189
00190 ArcConstIterator arcsBegin(void) const { return mArcs.begin(); }
00191
00192 ArcConstIterator arcsEnd(void) const { return mArcs.end(); }
00193
00194 ArcIterator arcsBegin(void) { return mArcs.begin(); }
00195
00196 ArcIterator arcsEnd(void) { return mArcs.end(); }
00197
00198
00199 const string& getName() const { return mName; }
00200
00201 RouteNodePtrVector& routeNodes() { return mRouteNodes; }
00202 };
00203
00204
00205 typedef std::vector<RouteNet> RouteNetVector;
00206
00207 }
00208 }
00209
00210 #endif // TORC_ROUTER_ROUTENET_HPP