00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef TORC_PHYSICAL_NET_HPP
00020 #define TORC_PHYSICAL_NET_HPP
00021
00022 #include "torc/physical/Named.hpp"
00023 #include "torc/physical/Progeny.hpp"
00024 #include "torc/physical/Progenitor.hpp"
00025 #include "torc/physical/ConfigMap.hpp"
00026 #include "torc/physical/InstancePin.hpp"
00027 #include "torc/physical/Pip.hpp"
00028 #include "torc/physical/Routethrough.hpp"
00029 #include "torc/common/Annotated.hpp"
00030 #include <string>
00031
00032 namespace torc {
00033 namespace physical {
00034
00035
00036
00037
00038
00039
00040
00041 class Net : public Named, public Progeny<class Circuit>, public ConfigMap,
00042 public common::Annotated, protected Progenitor<Net> {
00043
00044
00045 friend class Factory;
00046 protected:
00047
00048
00049 typedef std::string string;
00050
00051
00052 ENetType mNetType;
00053
00054 InstancePinSharedPtrVector mSources;
00055
00056 InstancePinSharedPtrVector mSinks;
00057
00058 PipVector mPips;
00059
00060
00061
00062
00063 Net(const string& inName, ENetType inNetType) : Named(inName), ConfigMap(),
00064 mNetType(inNetType) {}
00065 public:
00066
00067
00068 typedef InstancePinSharedPtrVector::const_iterator InstancePinSharedPtrConstIterator;
00069
00070 typedef InstancePinSharedPtrVector::iterator InstancePinSharedPtrIterator;
00071
00072 typedef PipVector::const_iterator PipConstIterator;
00073
00074 typedef PipVector::iterator PipIterator;
00075
00076
00077
00078 bool containsSource(InstancePinSharedPtr& inInstancePinPtr) const {
00079 return std::find(sourcesBegin(), sourcesEnd(), inInstancePinPtr) != sourcesEnd();
00080 }
00081
00082
00083 bool containsSink(InstancePinSharedPtr& inInstancePinPtr) const {
00084 return std::find(sinksBegin(), sinksEnd(), inInstancePinPtr) != sinksEnd();
00085 }
00086
00087
00088 bool containsPip(const Pip& inPip) const {
00089 return std::find(pipsBegin(), pipsEnd(), inPip) != pipsEnd();
00090 }
00091
00092
00093 void addSource(InstancePinSharedPtr& inInstancePinPtr) {
00094
00095 mSources.push_back(inInstancePinPtr);
00096 inInstancePinPtr->setParentWeakPtr(mSelfWeakPtr);
00097 inInstancePinPtr->addToInstance();
00098
00099
00100 }
00101
00102
00103 void addSink(InstancePinSharedPtr& inInstancePinPtr) {
00104
00105 mSinks.push_back(inInstancePinPtr);
00106 inInstancePinPtr->setParentWeakPtr(mSelfWeakPtr);
00107 inInstancePinPtr->addToInstance();
00108
00109
00110 }
00111
00112
00113
00114 bool removeSource(InstancePinSharedPtr& inInstancePinPtr) {
00115
00116 InstancePinSharedPtrIterator e = sourcesEnd();
00117 InstancePinSharedPtrIterator result = std::find(sourcesBegin(), e, inInstancePinPtr);
00118 if(result == e) return false;
00119 inInstancePinPtr->removeFromInstance();
00120 mSources.erase(result);
00121
00122 return true;
00123 }
00124
00125
00126
00127 bool removeSink(InstancePinSharedPtr& inInstancePinPtr) {
00128
00129 InstancePinSharedPtrIterator e = sinksEnd();
00130 InstancePinSharedPtrIterator result = std::find(sinksBegin(), e, inInstancePinPtr);
00131 if(result == e) return false;
00132 inInstancePinPtr->removeFromInstance();
00133 mSinks.erase(result);
00134
00135 return true;
00136 }
00137
00138
00139 void addPip(const Pip& inPip) {
00140
00141 mPips.push_back(inPip);
00142 const_cast<Pip&>(inPip).setParentWeakPtr(mSelfWeakPtr);
00143
00144 }
00145
00146
00147 bool removePip(const Pip& inPip) {
00148
00149
00150 PipIterator e = pipsEnd();
00151 PipIterator result = std::find(pipsBegin(), e, inPip);
00152
00153 if(result == e) return false;
00154
00155 mPips.erase(result);
00156
00157 return true;
00158 }
00159
00160
00161 void unroute(void) {
00162 mPips.clear();
00163 }
00164
00165
00166 bool hasAnySources(void) const { return !mSources.empty(); }
00167
00168 bool hasOneSource(void) const { return mSources.size() == 1; }
00169
00170 bool hasMultipleSources(void) const { return mSources.size() > 1; }
00171
00172 size_t getSourceCount(void) const { return mSources.size(); }
00173
00174 bool hasAnySinks(void) const { return !mSinks.empty(); }
00175
00176 bool hasOneSink(void) const { return mSinks.size() == 1; }
00177
00178 bool hasMultipleSinks(void) const { return mSinks.size() > 1; }
00179
00180 size_t getSinkCount(void) const { return mSinks.size(); }
00181
00182 bool hasAnyPips(void) const { return !mPips.empty(); }
00183
00184 size_t getPipCount(void) const { return mPips.size(); }
00185
00186 bool isRouted(void) const { return hasAnyPips(); }
00187
00188 bool isUnrouted(void) const { return !hasAnyPips(); }
00189
00190
00191 InstancePinSharedPtrConstIterator sourcesBegin(void) const { return mSources.begin(); }
00192
00193 InstancePinSharedPtrConstIterator sourcesEnd(void) const { return mSources.end(); }
00194
00195 InstancePinSharedPtrIterator sourcesBegin(void) { return mSources.begin(); }
00196
00197 InstancePinSharedPtrIterator sourcesEnd(void) { return mSources.end(); }
00198
00199 InstancePinSharedPtrConstIterator sinksBegin(void) const { return mSinks.begin(); }
00200
00201 InstancePinSharedPtrConstIterator sinksEnd(void) const { return mSinks.end(); }
00202
00203 InstancePinSharedPtrIterator sinksBegin(void) { return mSinks.begin(); }
00204
00205 InstancePinSharedPtrIterator sinksEnd(void) { return mSinks.end(); }
00206
00207 PipConstIterator pipsBegin(void) const { return mPips.begin(); }
00208
00209 PipConstIterator pipsEnd(void) const { return mPips.end(); }
00210
00211 PipIterator pipsBegin(void) { return mPips.begin(); }
00212
00213 PipIterator pipsEnd(void) { return mPips.end(); }
00214
00215
00216 ENetType getNetType(void) const { return mNetType; }
00217
00218 void setNetType(ENetType inNetType) { mNetType = inNetType; }
00219
00220
00221
00222
00223
00224 bool operator ==(const Net& rhs) const { return mName == rhs.mName; }
00225 };
00226
00227
00228 typedef boost::shared_ptr<Net> NetSharedPtr;
00229
00230
00231 typedef boost::weak_ptr<Net> NetWeakPtr;
00232
00233
00234 typedef std::vector<NetSharedPtr> NetSharedPtrVector;
00235
00236 }
00237 }
00238
00239 #endif // TORC_PHYSICAL_NET_HPP