00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <boost/test/unit_test.hpp>
00020 #include "torc/architecture/Segments.hpp"
00021 #include "torc/architecture/DDB.hpp"
00022 #include "torc/common/Devices.hpp"
00023 #include "torc/architecture/DDBStreamHelper.hpp"
00024 #include "torc/architecture/OutputStreamHelpers.hpp"
00025 #include <iostream>
00026 #include <iomanip>
00027
00028 namespace torc {
00029 namespace architecture {
00030
00031 BOOST_AUTO_TEST_SUITE(architecture)
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050 class segments_unit_test_helper {
00051 typedef xilinx::TileCount TileCount;
00052 typedef xilinx::TileIndex TileIndex;
00053 typedef xilinx::TileTypeIndex TileTypeIndex;
00054 typedef xilinx::WireCount WireCount;
00055 typedef xilinx::WireIndex WireIndex;
00056 typedef Segments::SegmentReference SegmentReference;
00057 typedef xilinx::CompactSegmentIndex CompactSegmentIndex;
00058 typedef boost::uint64_t uint64_t;
00059 DDB& mDDB;
00060 const Tiles& mTiles;
00061 const Segments& mSegments;
00062 std::map<Tilewire, CompactSegmentIndex> mUsage;
00063 const CompactSegmentIndex cUsagePruned;
00064 const CompactSegmentIndex cUsageUndefined;
00065 uint64_t mTilewireCount;
00066 uint64_t mTilewiresAnalyzed;
00067 uint64_t mTilewiresPruned;
00068 uint64_t mTilewiresUndefined;
00069 static uint64_t sTotalTilewireCount;
00070 static uint64_t sTotalTilewiresAnalyzed;
00071 static uint64_t sTotalTilewiresPruned;
00072 static uint64_t sTotalTilewiresUndefined;
00073 public:
00074
00075 segments_unit_test_helper(DDB& inDDB) : mDDB(inDDB), mTiles(mDDB.getTiles()),
00076 mSegments(mDDB.getSegments()),
00077 cUsagePruned(CompactSegmentIndex(CompactSegmentIndex::undefined())),
00078 cUsageUndefined(CompactSegmentIndex(static_cast<boost::uint32_t>(-2))), mTilewireCount(0),
00079 mTilewiresAnalyzed(0), mTilewiresPruned(0), mTilewiresUndefined(0) {
00080
00081
00082
00083
00084
00085 }
00086
00087 static void statistics(void) {
00088 std::cerr << "=======================================" << std::endl;
00089 std::cerr << "Total tilewire count: " << std::setw(12) << sTotalTilewireCount
00090 << std::endl;
00091 std::cerr << "Total tilewires analyzed: " << std::setw(12) << sTotalTilewiresAnalyzed
00092 << std::endl;
00093 std::cerr << "Total tilewires pruned: " << std::setw(12) << sTotalTilewiresPruned
00094 << std::endl;
00095 std::cerr << "Total tilewires undefined: " << std::setw(12) << sTotalTilewiresUndefined
00096 << std::endl;
00097 }
00098
00099 void operator ()(void) {
00100
00101
00102 TileCount tileCount = mTiles.getTileCount();
00103 mUsage.clear();
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124 for(TileIndex tileIndex; tileIndex < tileCount; tileIndex++) {
00125 const Array<SegmentReference>& tilewireSegments
00126 = mSegments.mTilewireSegments[tileIndex];
00127 WireCount wireCount = WireCount(tilewireSegments.getSize());
00128 for(WireIndex wireIndex; wireIndex < wireCount; wireIndex++) {
00129 Tilewire tilewire(tileIndex, wireIndex);
00130 mUsage[tilewire] = cUsageUndefined;
00131 mTilewireCount++;
00132 }
00133 }
00134
00135
00136 for(TileIndex tileIndex; tileIndex < tileCount; tileIndex++) {
00137 const Array<SegmentReference>& tilewireSegments
00138 = mSegments.mTilewireSegments[tileIndex];
00139 WireCount wireCount = WireCount(tilewireSegments.getSize());
00140 for(WireIndex wireIndex; wireIndex < wireCount; wireIndex++) {
00141 Tilewire tilewire(tileIndex, wireIndex);
00142 analyzeSegmentTilewire(tilewire);
00143 TilewireVector segmentTilewires;
00144 mDDB.expandSegment(tilewire, segmentTilewires, DDB::eExpandDirectionNone);
00145 TilewireVector::const_iterator p = segmentTilewires.begin();
00146 TilewireVector::const_iterator e = segmentTilewires.end();
00147 while(p < e) {
00148 analyzeSegmentTilewire(*p++);
00149 }
00150 }
00151 }
00152
00153
00154 for(TileIndex tileIndex; tileIndex < tileCount; tileIndex++) {
00155 const Array<SegmentReference>& tilewireSegments
00156 = mSegments.mTilewireSegments[tileIndex];
00157 WireCount wireCount = WireCount(tilewireSegments.getSize());
00158 for(WireIndex wireIndex; wireIndex < wireCount; wireIndex++) {
00159 Tilewire tilewire(tileIndex, wireIndex);
00160 CompactSegmentIndex usage = mUsage[tilewire];
00161 if(usage == cUsageUndefined) {
00162 mTilewiresUndefined++;
00163 std::cerr << "Undefined: " << tilewire << std::endl;
00164 BOOST_CHECK(mUsage[tilewire] != cUsageUndefined);
00165 } else if(usage == cUsagePruned) {
00166 mTilewiresPruned++;
00167 }
00168 }
00169 }
00170 std::cerr << "---------------------------------------" << std::endl;
00171 std::cerr << "Tilewire count: " << std::setw(12) << mTilewireCount
00172 << std::endl;
00173 std::cerr << "Tilewires analyzed: " << std::setw(12) << mTilewiresAnalyzed
00174 << std::endl;
00175 std::cerr << "Tilewires pruned: " << std::setw(12) << mTilewiresPruned
00176 << std::endl;
00177 std::cerr << "Tilewires undefined: " << std::setw(12) << mTilewiresUndefined
00178 << std::endl;
00179 sTotalTilewireCount += mTilewireCount;
00180 sTotalTilewiresAnalyzed += mTilewiresAnalyzed;
00181 sTotalTilewiresPruned += mTilewiresPruned;
00182 sTotalTilewiresUndefined += mTilewiresUndefined;
00183 }
00184
00185 void analyzeSegmentTilewire(const Tilewire& inTilewire) {
00186 mTilewiresAnalyzed++;
00187
00188 TileIndex tileIndex = inTilewire.getTileIndex();
00189 WireIndex wireIndex = inTilewire.getWireIndex();
00190 const Array<SegmentReference>& tilewireSegments = mSegments.mTilewireSegments[tileIndex];
00191
00192 const SegmentReference& segmentReference = tilewireSegments[wireIndex];
00193 CompactSegmentIndex compactSegmentIndex = segmentReference.getCompactSegmentIndex();
00194 TileIndex anchorTileIndex = segmentReference.getAnchorTileIndex();
00195 (void) anchorTileIndex;
00196
00197 CompactSegmentIndex usageCompactSegmentIndex = mUsage[inTilewire];
00198 if(compactSegmentIndex == usageCompactSegmentIndex) {
00199
00200
00201
00202 } else if(usageCompactSegmentIndex == cUsageUndefined) {
00203
00204 mUsage[inTilewire] = compactSegmentIndex;
00205
00206
00207 } else {
00208 std::cerr << "Mismatch (" << static_cast<int>(compactSegmentIndex) << " vs. "
00209 << static_cast<int>(usageCompactSegmentIndex) << ") for " << inTilewire
00210 << std::endl;
00211 BOOST_CHECK_EQUAL(static_cast<int>(compactSegmentIndex),
00212 static_cast<int>(usageCompactSegmentIndex));
00213 }
00214 }
00215 };
00216
00217
00218 uint64_t segments_unit_test_helper::sTotalTilewireCount = 0;
00219
00220 uint64_t segments_unit_test_helper::sTotalTilewiresAnalyzed = 0;
00221
00222 uint64_t segments_unit_test_helper::sTotalTilewiresPruned = 0;
00223
00224 uint64_t segments_unit_test_helper::sTotalTilewiresUndefined = 0;
00225
00226
00227 #if 0
00228
00229
00230 BOOST_AUTO_TEST_CASE(SegmentsUnitTest) {
00231
00232
00233 const torc::common::DeviceVector& devices = torc::common::Devices::getUnitTestDevices();
00234 torc::common::DeviceVector::const_iterator dp = devices.begin();
00235 torc::common::DeviceVector::const_iterator de = devices.end();
00236
00237 while(dp < de) {
00238 const std::string& device = *dp++;
00239 if(device.empty()) break;
00240 DDB ddb(device);
00241 std::cerr << ddb;
00242 segments_unit_test_helper segmentTester(ddb);
00243 segmentTester();
00244 segments_unit_test_helper::statistics();
00245 }
00246
00247 }
00248 #endif
00249
00250 BOOST_AUTO_TEST_SUITE_END()
00251
00252 }
00253 }