00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef TORC_ARCHITECTURE_TILES_HPP
00020 #define TORC_ARCHITECTURE_TILES_HPP
00021
00022 #include "torc/architecture/XilinxDatabaseTypes.hpp"
00023 #include "torc/architecture/DigestStream.hpp"
00024 #include "torc/architecture/Array.hpp"
00025 #include "torc/architecture/WireInfo.hpp"
00026 #include "torc/architecture/TileInfo.hpp"
00027
00028 namespace torc {
00029 namespace architecture {
00030
00031
00032
00033
00034
00035 class Tiles {
00036
00037
00038 friend class DDB;
00039 protected:
00040
00041 typedef std::string string;
00042 typedef boost::uint16_t uint16_t;
00043 typedef boost::uint32_t uint32_t;
00044 typedef xilinx::TileRow TileRow;
00045 typedef xilinx::TileCol TileCol;
00046 typedef xilinx::TileCount TileCount;
00047 typedef xilinx::TileIndex TileIndex;
00048 typedef xilinx::TileTypeCount TileTypeCount;
00049 typedef xilinx::TileTypeIndex TileTypeIndex;
00050 typedef xilinx::WireCount WireCount;
00051 typedef xilinx::WireIndex WireIndex;
00052
00053 typedef std::pair<std::string, xilinx::TileIndex> TileNameIndexPair;
00054
00055 typedef std::pair<std::string, xilinx::WireIndex> WireNameIndexPair;
00056
00057
00058 class CharStringWrapper {
00059
00060
00061 char* mString;
00062 public:
00063
00064
00065 CharStringWrapper(void) : mString(0) {}
00066
00067 CharStringWrapper(const char* inString) : mString(strdup(inString)) {}
00068
00069 ~CharStringWrapper(void) { if(mString != 0) { free(mString); mString = 0; } }
00070
00071
00072 operator const char*(void) const { return mString; }
00073
00074
00075 CharStringWrapper& operator= (const char* inString) {
00076 if(mString != 0) free(mString);
00077 mString = strdup(inString);
00078 return *this;
00079 }
00080 };
00081
00082
00083 TileCount mTileCount;
00084
00085 TileRow mRowCount;
00086
00087 TileCol mColCount;
00088
00089 TileIndex** mTileMap;
00090
00091 Array<const TileInfo> mTiles;
00092
00093 Array<const TileNameIndexPair> mOrderedTileNames;
00094
00095 TileTypeCount mTileTypeCount;
00096
00097 Array<const CharStringWrapper> mTileTypeNames;
00098
00099 Array2D<const WireInfo> mWires;
00100
00101 Array2D<const WireNameIndexPair> mOrderedWireNames;
00102
00103
00104 size_t readTileTypes(DigestStream& inStream);
00105
00106 size_t readTileWireInfo(DigestStream& inStream);
00107
00108 size_t readTileMap(DigestStream& inStream);
00109
00110
00111 static bool CompareTilePairByName(const TileNameIndexPair& inA,
00112 const TileNameIndexPair& inB) {
00113 return inA.first < inB.first;
00114 }
00115
00116 static bool CompareWirePairByName(const WireNameIndexPair& inA,
00117 const WireNameIndexPair& inB) {
00118 return inA.first < inB.first;
00119 }
00120
00121
00122 Tiles(void) : mTileCount(), mRowCount(), mColCount(), mTileMap(0), mTiles(),
00123 mTileTypeCount(), mTileTypeNames(), mWires() {}
00124 public:
00125
00126
00127 ~Tiles(void) {
00128
00129 if(mTileMap != 0) {
00130 if(mTileMap[0] != 0) { delete[] mTileMap[0]; mTileMap[0] = 0; }
00131 delete[] mTileMap; mTileMap = 0;
00132 }
00133 }
00134
00135
00136 const TileInfo& getTileInfo(TileIndex inTileIndex) const {
00137 return mTiles[inTileIndex]; }
00138
00139 const Array<const WireInfo>& getWireInfo(TileTypeIndex inTileTypeIndex) const
00140 { return mWires[inTileTypeIndex]; }
00141
00142 const WireInfo& getWireInfo(TileTypeIndex inTileTypeIndex, WireIndex inWireIndex) const
00143 { return mWires[inTileTypeIndex][inWireIndex]; }
00144
00145 TileCount getTileCount(void) const { return mTileCount; }
00146
00147 TileTypeCount getTileTypeCount(void) const { return mTileTypeCount; }
00148
00149 TileRow getRowCount(void) const { return mRowCount; }
00150
00151 TileCol getColCount(void) const { return mColCount; }
00152
00153 WireCount getWireCount(TileTypeIndex inTileTypeIndex) const
00154 { return WireCount(mWires[inTileTypeIndex].getSize()); }
00155
00156
00157 TileIndex getTileIndex(TileRow inRow, TileCol inCol) const
00158 { return mTileMap[inRow][inCol]; }
00159
00160 const char* getTileTypeName(TileTypeIndex inTileTypeIndex) const
00161 { return mTileTypeNames[inTileTypeIndex]; }
00162
00163
00164
00165
00166 TileIndex findTileIndex(const string& inName) const {
00167 Array<const TileNameIndexPair>::const_iterator b = mOrderedTileNames.begin();
00168 Array<const TileNameIndexPair>::const_iterator e = mOrderedTileNames.end();
00169 TileNameIndexPair value(inName, TileIndex(TileIndex::undefined()));
00170 Array<const TileNameIndexPair>::const_iterator p = lower_bound(b, e, value,
00171 &CompareTilePairByName);
00172 return TileIndex((p == e || p->first != inName) ? -1 : p->second);
00173 }
00174
00175
00176
00177
00178 WireIndex findWireIndex(TileTypeIndex inTileTypeIndex, const string& inName) const {
00179 const Array<const WireNameIndexPair>& wireNameIndexPairArray
00180 = mOrderedWireNames[inTileTypeIndex];
00181 Array<const WireNameIndexPair>::const_iterator b = wireNameIndexPairArray.begin();
00182 Array<const WireNameIndexPair>::const_iterator e = wireNameIndexPairArray.end();
00183 WireNameIndexPair value(inName, WireIndex(WireIndex::undefined()));
00184 Array<const WireNameIndexPair>::const_iterator p = lower_bound(b, e, value,
00185 &CompareWirePairByName);
00186 return WireIndex((p == e || p->first != inName) ? -1 : p->second);
00187 }
00188 };
00189
00190 }
00191 }
00192
00193 #endif // TORC_ARCHITECTURE_TILES_HPP