00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef TORC_ARCHITECTURE_DDB_HPP
00020 #define TORC_ARCHITECTURE_DDB_HPP
00021
00022 #include "torc/architecture/Versions.hpp"
00023 #include "torc/architecture/Segments.hpp"
00024 #include "torc/architecture/Sites.hpp"
00025 #include "torc/architecture/Tiles.hpp"
00026 #include "torc/architecture/Arc.hpp"
00027 #include "torc/architecture/ArcUsage.hpp"
00028 #include "torc/architecture/WireUsage.hpp"
00029 #include "torc/architecture/ExtendedWireInfo.hpp"
00030 #include "torc/architecture/DDBStreamHelper.hpp"
00031 #include "torc/common/DeviceDesignator.hpp"
00032 #include <string>
00033 #include <map>
00034
00035 namespace torc {
00036 namespace architecture {
00037
00038
00039 class DDB {
00040 protected:
00041
00042 typedef std::string string;
00043 typedef std::vector<string> StringVector;
00044 typedef xilinx::SiteIndex SiteIndex;
00045 typedef xilinx::WireIndex WireIndex;
00046 typedef xilinx::TileIndex TileIndex;
00047 typedef xilinx::TileOffset TileOffset;
00048 typedef xilinx::TileTypeIndex TileTypeIndex;
00049
00050
00051 string mDeviceName;
00052
00053 string mFamilyName;
00054
00055 Versions mDeviceVersion;
00056
00057 Versions mFamilyVersion;
00058
00059 StringVector mSpeedGrades;
00060
00061 Segments mSegments;
00062
00063 Sites mSites;
00064
00065 Tiles mTiles;
00066
00067 ArcUsage mArcUsage;
00068
00069 WireUsage mWireUsage;
00070
00071
00072 size_t readFamilyName(class DigestStream& inStream);
00073
00074 size_t readSpeedGrades(class DigestStream& inStream);
00075
00076 void initialize(const string& inDeviceName, const string& inPackageName);
00077 public:
00078
00079
00080
00081
00082
00083
00084
00085 enum EExpandDirection {
00086 eExpandDirectionNone = 0, eExpandDirectionSinkward = 1, eExpandDirectionSourceward = 2,
00087 eExpandDirectionBidirectional = eExpandDirectionSinkward | eExpandDirectionSourceward
00088 };
00089
00090
00091
00092
00093
00094
00095 DDB(const string& inDeviceName, const string& inPackageName = "") : mArcUsage(mTiles),
00096 mWireUsage(mTiles) { initialize(inDeviceName, inPackageName); }
00097
00098 DDB(const torc::common::DeviceDesignator& inDeviceDesignator) : mArcUsage(mTiles),
00099 mWireUsage(mTiles) {
00100 initialize(inDeviceDesignator.getDeviceName(), inDeviceDesignator.getDevicePackage());
00101 }
00102
00103
00104
00105 const string& getDeviceName(void) const { return mDeviceName; }
00106
00107 const string& getFamilyName(void) const { return mFamilyName; }
00108
00109 const StringVector& getSpeedGrades(void) const { return mSpeedGrades; }
00110
00111 const Segments& getSegments(void) const { return mSegments; }
00112
00113 const Sites& getSites(void) const { return mSites; }
00114
00115 const Tiles& getTiles(void) const { return mTiles; }
00116
00117 ArcUsage& getArcUsage(void) { return mArcUsage; }
00118
00119 WireUsage& getWireUsage(void) { return mWireUsage; }
00120
00121
00122 void clearUsage(void) {
00123 mWireUsage.clear();
00124 mArcUsage.clear();
00125 }
00126
00127 void useArc(const Arc& inArc) {
00128 mArcUsage.use(inArc);
00129 useSegment(inArc.getSourceTilewire());
00130 useSegment(inArc.getSinkTilewire());
00131 }
00132
00133 void releaseArc(const Arc& inArc, bool releaseSource = true, bool releaseSink = true) {
00134 mArcUsage.release(inArc);
00135 if(releaseSource) releaseSegment(inArc.getSourceTilewire());
00136 if(releaseSink) releaseSegment(inArc.getSinkTilewire());
00137 }
00138
00139 void useSegment(const Tilewire& inTilewire) {
00140 TilewireVector segment;
00141 expandSegment(inTilewire, segment);
00142 TilewireVector::const_iterator p = segment.begin();
00143 TilewireVector::const_iterator e = segment.end();
00144 while(p < e) mWireUsage.use(*p++);
00145 }
00146
00147 void releaseSegment(const Tilewire& inTilewire) {
00148 TilewireVector segment;
00149 expandSegment(inTilewire, segment);
00150 TilewireVector::const_iterator p = segment.begin();
00151 TilewireVector::const_iterator e = segment.end();
00152 while(p < e) mWireUsage.release(*p++);
00153 }
00154
00155
00156
00157
00158
00159 void expandSegment(const Tilewire& inTilewire, TilewireVector& outTilewires,
00160 EExpandDirection inExpandDirection = eExpandDirectionNone);
00161
00162
00163
00164
00165 void expandTilewireSinks(const Tilewire& inTilewire, TilewireVector& outSinks,
00166 bool inUseTied = true, bool inUseRegular = true, bool inUseIrregular = true,
00167 bool inUseRoutethrough = true);
00168
00169
00170
00171
00172 void expandTilewireSources(const Tilewire& inTilewire, TilewireVector& outSources,
00173 bool inUseTied = true, bool inUseRegular = true, bool inUseIrregular = true,
00174 bool inUseRoutethrough = true);
00175
00176
00177
00178
00179 void expandSegmentSinks(const Tilewire& inTilewire, ArcVector& outSinks,
00180 EExpandDirection inExpandDirection = eExpandDirectionNone, bool inUseTied = true,
00181 bool inUseRegular = true, bool inUseIrregular = true, bool inUseRoutethrough = true);
00182
00183
00184
00185
00186 void expandSegmentSources(const Tilewire& inTilewire, ArcVector& outSources,
00187 EExpandDirection inExpandDirection = eExpandDirectionNone, bool inUseTied = true,
00188 bool inUseRegular = true, bool inUseIrregular = true, bool inUseRoutethrough = true);
00189
00190 Tilewire sitePinToTilewire(const std::string& inSiteName,
00191 const std::string& inPinName) {
00192 SiteIndex siteIndex = mSites.findSiteIndex(inSiteName);
00193 if(siteIndex.isUndefined()) return Tilewire::sInvalid;
00194 return mSites.getSite(siteIndex).getPinTilewire(inPinName);
00195 }
00196
00197 Arc tilePipToArc(const std::string& inTileName, const std::string& inSourceWireName,
00198 const std::string& inSinkWireName) {
00199 TileIndex tileIndex = mTiles.findTileIndex(inTileName);
00200 if(tileIndex.isUndefined()) return Arc();
00201 const TileInfo& tileInfo = mTiles.getTileInfo(tileIndex);
00202 TileTypeIndex tileTypeIndex = tileInfo.getTypeIndex();
00203 WireIndex sourceWireIndex = mTiles.findWireIndex(tileTypeIndex, inSourceWireName);
00204 if(sourceWireIndex.isUndefined()) return Arc();
00205 WireIndex sinkWireIndex = mTiles.findWireIndex(tileTypeIndex, inSinkWireName);
00206 if(sinkWireIndex.isUndefined()) return Arc();
00207 return Arc(Tilewire(tileIndex, sourceWireIndex), Tilewire(tileIndex, sinkWireIndex));
00208 }
00209
00210
00211 Tilewire lookupTilewire(const std::string& inTileName, const std::string& inWireName) {
00212 TileIndex tileIndex = mTiles.findTileIndex(inTileName);
00213 if(tileIndex.isUndefined()) return Tilewire::sInvalid;
00214 const TileInfo& tileInfo = mTiles.getTileInfo(tileIndex);
00215 TileTypeIndex tileTypeIndex = tileInfo.getTypeIndex();
00216 WireIndex wireIndex = mTiles.findWireIndex(tileTypeIndex, inWireName);
00217 if(wireIndex.isUndefined()) return Tilewire::sInvalid;
00218 return Tilewire(tileIndex, wireIndex);
00219 }
00220 };
00221
00222 }
00223 }
00224
00225 #endif // TORC_ARCHITECTURE_DDB_HPP