00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef TORC_ARCHITECTURE_ARCUSAGE_HPP
00020 #define TORC_ARCHITECTURE_ARCUSAGE_HPP
00021
00022 #include "torc/architecture/Array.hpp"
00023 #include "torc/architecture/Arc.hpp"
00024 #include "torc/architecture/Tiles.hpp"
00025 #include "torc/architecture/Tilewire.hpp"
00026 #include <boost/dynamic_bitset.hpp>
00027
00028 namespace torc {
00029 namespace architecture {
00030
00031 namespace architecture { class ArcUsageUnitTest; }
00032
00033
00034
00035
00036
00037
00038 class ArcUsage {
00039
00040 friend class torc::architecture::architecture::ArcUsageUnitTest;
00041 protected:
00042
00043 typedef boost::dynamic_bitset<> dynamic_bitset;
00044 typedef xilinx::TileIndex TileIndex;
00045 typedef xilinx::TileCount TileCount;
00046 typedef xilinx::TileTypeIndex TileTypeIndex;
00047 typedef xilinx::WireIndex WireIndex;
00048
00049
00050 const Tiles& mTiles;
00051
00052 TileCount mTileUsageCount;
00053
00054 Array<dynamic_bitset*> mBitsets;
00055
00056 uint32_t mBitCount;
00057
00058 dynamic_bitset mTileDirty;
00059
00060
00061
00062
00063
00064 uint32_t getArcOffset(const Tilewire& inTilewire1, const Tilewire& inTilewire2) const {
00065
00066 if(inTilewire1.isUndefined() || inTilewire2.isUndefined())
00067 throw InvalidArcException(Arc(inTilewire1, inTilewire2));
00068
00069 TileIndex tile1 = inTilewire1.getTileIndex();
00070 WireIndex wire1 = inTilewire1.getWireIndex();
00071 WireIndex wire2 = inTilewire2.getWireIndex();
00072
00073 const TileInfo& tileInfo = mTiles.getTileInfo(tile1);
00074 TileTypeIndex type = tileInfo.getTypeIndex();
00075
00076 const WireInfo& wireInfo = mTiles.getWireInfo(type, wire1);
00077 uint32_t offset = wireInfo.getArcOffset();
00078
00079 const WireArray& sinks = wireInfo.getSinks();
00080 for(WireIndex i; i < sinks.getSize(); i++) {
00081 if(sinks[i] == wire2) return offset;
00082 offset++;
00083 }
00084
00085 const WireArray& irregularSinks = wireInfo.getIrregularSinks();
00086 for(WireIndex i; i < irregularSinks.getSize(); i++) {
00087 if(irregularSinks[i] == wire2) return offset;
00088 offset++;
00089 }
00090
00091 const WireArray& routethroughSinks = wireInfo.getRoutethroughSinks();
00092 for(WireIndex i; i < routethroughSinks.getSize(); i++) {
00093 if(routethroughSinks[i] == wire2) return offset;
00094 offset++;
00095 }
00096
00097 const WireArray& tiedSinks = wireInfo.getTiedSinks();
00098 for(WireIndex i; i < tiedSinks.getSize(); i++) {
00099 if(tiedSinks[i] == wire2) return offset;
00100 offset++;
00101 }
00102
00103
00104 throw InvalidArcException(Arc(inTilewire1, inTilewire2));
00105 }
00106 public:
00107
00108
00109 ArcUsage(const Tiles& inTiles) : mTiles(inTiles), mTileUsageCount(), mBitsets(0),
00110 mBitCount(0), mTileDirty(0) {}
00111
00112 ~ArcUsage(void) {
00113 size_t tileCount = mBitsets.getSize();
00114 for(TileIndex i; i < tileCount; i++) {
00115 if(mBitsets[i] != 0) { delete mBitsets[i]; mBitsets[i] = 0; }
00116 }
00117 }
00118
00119
00120 void autosize(void) {
00121
00122 for(TileCount i; i < mBitsets.getSize(); i++) {
00123 if(mBitsets[i] != 0) { delete mBitsets[i]; mBitsets[i] = 0; }
00124 mTileDirty.reset(i);
00125 }
00126
00127 TileCount tileCount = mTiles.getTileCount();
00128 mBitsets.setSize(tileCount);
00129 for(TileCount i; i < tileCount; i++) mBitsets[i] = 0;
00130 mTileDirty.resize(tileCount);
00131 }
00132
00133 inline void use(const Arc& inArc)
00134 { use(inArc.getSourceTilewire(), inArc.getSinkTilewire()); }
00135
00136 void use(const Tilewire& inTilewire1, const Tilewire& inTilewire2) {
00137
00138 TileIndex tileIndex1 = inTilewire1.getTileIndex();
00139 TileIndex tileIndex2 = inTilewire2.getTileIndex();
00140
00141
00142 if(tileIndex1 != tileIndex2) throw InvalidArcException(Arc(inTilewire1, inTilewire2));
00143
00144
00145 dynamic_bitset* bitset = mBitsets[tileIndex1];
00146 if(bitset == 0) {
00147
00148 const TileInfo& tileInfo = mTiles.getTileInfo(tileIndex1);
00149 TileTypeIndex type = tileInfo.getTypeIndex();
00150 const Array<const WireInfo>& wires = mTiles.getWireInfo(type);
00151 if(wires.getSize() == 0) return;
00152 const WireInfo& wireInfo = mTiles.getWireInfo(type, WireIndex(wires.getSize() - 1));
00153
00154 size_t size = wireInfo.getArcOffset() + wireInfo.getSinks().getSize()
00155 + wireInfo.getIrregularSinks().getSize()
00156 + wireInfo.getRoutethroughSinks().getSize()
00157 + wireInfo.getTiedSinks().getSize();
00158 bitset = mBitsets[tileIndex1] = new dynamic_bitset(size);
00159
00160 mTileUsageCount++;
00161 mBitCount += size;
00162 }
00163
00164
00165 bitset->set(getArcOffset(inTilewire1, inTilewire2));
00166 mTileDirty.set(tileIndex1, true);
00167 }
00168
00169 inline void release(const Arc& inArc)
00170 { release(inArc.getSourceTilewire(), inArc.getSinkTilewire()); }
00171
00172 void release(const Tilewire& inTilewire1, const Tilewire& inTilewire2) {
00173
00174 TileIndex tileIndex1 = inTilewire1.getTileIndex();
00175 TileIndex tileIndex2 = inTilewire2.getTileIndex();
00176
00177
00178 if(tileIndex1 != tileIndex2) throw -1;
00179
00180
00181 dynamic_bitset* bitset = mBitsets[tileIndex1];
00182 if(bitset == 0) return;
00183
00184
00185 bitset->set(getArcOffset(inTilewire1, inTilewire2), false);
00186 mTileDirty.set(tileIndex1, true);
00187 }
00188
00189
00190
00191
00192 void clear(void) {
00193
00194 size_t tileCount = mBitsets.getSize();
00195 for(TileIndex i; i < tileCount; i++) {
00196
00197 if(!mTileDirty[i]) continue;
00198
00199 mTileDirty.reset(i);
00200
00201 dynamic_bitset* bitset = mBitsets[i];
00202
00203 if(bitset == 0) continue;
00204
00205 bitset->reset();
00206 }
00207 }
00208
00209 inline bool isUsed(const Arc& inArc)
00210 { return isUsed(inArc.getSourceTilewire(), inArc.getSinkTilewire()); }
00211
00212 bool isUsed(const Tilewire& inTilewire1, const Tilewire& inTilewire2) const {
00213
00214 TileIndex tileIndex1 = inTilewire1.getTileIndex();
00215 TileIndex tileIndex2 = inTilewire2.getTileIndex();
00216
00217
00218 if(tileIndex1 != tileIndex2) throw -1;
00219
00220
00221 dynamic_bitset* bitset = mBitsets[tileIndex1];
00222 if(bitset == 0) return false;
00223
00224
00225 return bitset->test(getArcOffset(inTilewire1, inTilewire2));
00226 }
00227
00228 uint32_t getArcUsageCount(void) const {
00229 uint32_t usageCount = 0;
00230 size_t tileCount = mBitsets.getSize();
00231 for(TileIndex i; i < tileCount; i++) {
00232
00233
00234
00235
00236 dynamic_bitset* bitset = mBitsets[i];
00237
00238 if(bitset == 0) continue;
00239
00240 usageCount += bitset->count();
00241 }
00242 return usageCount;
00243 }
00244
00245
00246 TileCount getTileUsageCount(void) const { return mTileUsageCount; }
00247
00248 uint32_t getBitCount(void) const { return mBitCount; }
00249 };
00250
00251 }
00252 }
00253
00254 #endif // TORC_ARCHITECTURE_ARCUSAGE_HPP