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 class segments_regression_test_helper {
00050 typedef xilinx::TileCount TileCount;
00051 typedef xilinx::TileIndex TileIndex;
00052 typedef xilinx::TileTypeIndex TileTypeIndex;
00053 typedef xilinx::WireCount WireCount;
00054 typedef xilinx::WireIndex WireIndex;
00055 typedef Segments::SegmentReference SegmentReference;
00056 typedef xilinx::CompactSegmentIndex CompactSegmentIndex;
00057 typedef boost::uint64_t uint64_t;
00058 DDB& mDDB;
00059 const Tiles& mTiles;
00060 const Segments& mSegments;
00061 std::map<Tilewire, CompactSegmentIndex> mUsage;
00062 const CompactSegmentIndex cUsagePruned;
00063 const CompactSegmentIndex cUsageUndefined;
00064 uint64_t mTilewireCount;
00065 uint64_t mTilewiresAnalyzed;
00066 uint64_t mTilewiresPruned;
00067 uint64_t mTilewiresUndefined;
00068 uint64_t mTilewireMismatches;
00069 static uint64_t sTotalTilewireCount;
00070 static uint64_t sTotalTilewiresAnalyzed;
00071 static uint64_t sTotalTilewiresPruned;
00072 static uint64_t sTotalTilewiresUndefined;
00073 static uint64_t sTotalTilewireMismatches;
00074 public:
00075
00076 segments_regression_test_helper(DDB& inDDB) : mDDB(inDDB), mTiles(mDDB.getTiles()),
00077 mSegments(mDDB.getSegments()),
00078 cUsagePruned(CompactSegmentIndex(CompactSegmentIndex::undefined())),
00079 cUsageUndefined(CompactSegmentIndex(static_cast<boost::uint32_t>(-2))), mTilewireCount(0),
00080 mTilewiresAnalyzed(0), mTilewiresPruned(0), mTilewiresUndefined(0), mTilewireMismatches(0) {
00081
00082
00083
00084
00085
00086 }
00087
00088 static void statistics(void) {
00089 std::cerr << "=======================================" << std::endl;
00090 std::cerr << "Total tilewire count: " << std::setw(12) << sTotalTilewireCount
00091 << std::endl;
00092 std::cerr << "Total tilewires analyzed: " << std::setw(12) << sTotalTilewiresAnalyzed
00093 << std::endl;
00094 std::cerr << "Total tilewires pruned: " << std::setw(12) << sTotalTilewiresPruned
00095 << std::endl;
00096 std::cerr << "Total tilewires undefined: " << std::setw(12) << sTotalTilewiresUndefined
00097 << std::endl;
00098 std::cerr << "Total tilewire mismatches: " << std::setw(12) << sTotalTilewireMismatches
00099 << std::endl;
00100 }
00101
00102 void operator ()(void) {
00103 TileCount tileCount = mTiles.getTileCount();
00104 mUsage.clear();
00105
00106
00107
00108
00109 for(TileIndex tileIndex; tileIndex < tileCount; tileIndex++) {
00110 const Array<SegmentReference>& tilewireSegments
00111 = mSegments.mTilewireSegments[tileIndex];
00112 WireCount wireCount = WireCount(tilewireSegments.getSize());
00113 for(WireIndex wireIndex; wireIndex < wireCount; wireIndex++) {
00114 Tilewire tilewire(tileIndex, wireIndex);
00115 mUsage[tilewire] = cUsageUndefined;
00116 mTilewireCount++;
00117 }
00118 }
00119
00120 for(TileIndex tileIndex; tileIndex < tileCount; tileIndex++) {
00121 const Array<SegmentReference>& tilewireSegments
00122 = mSegments.mTilewireSegments[tileIndex];
00123 WireCount wireCount = WireCount(tilewireSegments.getSize());
00124 for(WireIndex wireIndex; wireIndex < wireCount; wireIndex++) {
00125 Tilewire tilewire(tileIndex, wireIndex);
00126 analyzeSegmentTilewire(tilewire);
00127 TilewireVector segmentTilewires;
00128 mDDB.expandSegment(tilewire, segmentTilewires, DDB::eExpandDirectionNone);
00129 TilewireVector::const_iterator p = segmentTilewires.begin();
00130 TilewireVector::const_iterator e = segmentTilewires.end();
00131 while(p < e) {
00132 analyzeSegmentTilewire(*p++);
00133 }
00134 }
00135 }
00136
00137 for(TileIndex tileIndex; tileIndex < tileCount; tileIndex++) {
00138 const Array<SegmentReference>& tilewireSegments
00139 = mSegments.mTilewireSegments[tileIndex];
00140 WireCount wireCount = WireCount(tilewireSegments.getSize());
00141 for(WireIndex wireIndex; wireIndex < wireCount; wireIndex++) {
00142 Tilewire tilewire(tileIndex, wireIndex);
00143 CompactSegmentIndex usage = mUsage[tilewire];
00144 if(usage == cUsageUndefined) {
00145 mTilewiresUndefined++;
00146 std::cerr << "Undefined: " << tilewire << std::endl;
00147 BOOST_CHECK(mUsage[tilewire] != cUsageUndefined);
00148 } else if(usage == cUsagePruned) {
00149 mTilewiresPruned++;
00150 }
00151 }
00152 }
00153 std::cerr << "---------------------------------------" << std::endl;
00154 std::cerr << "Tilewire count: " << std::setw(12) << mTilewireCount
00155 << std::endl;
00156 std::cerr << "Tilewires analyzed: " << std::setw(12) << mTilewiresAnalyzed
00157 << std::endl;
00158 std::cerr << "Tilewires pruned: " << std::setw(12) << mTilewiresPruned
00159 << std::endl;
00160 std::cerr << "Tilewires undefined: " << std::setw(12) << mTilewiresUndefined
00161 << std::endl;
00162 std::cerr << "Tilewire mismatches: " << std::setw(12) << mTilewireMismatches
00163 << std::endl;
00164 sTotalTilewireCount += mTilewireCount;
00165 sTotalTilewiresAnalyzed += mTilewiresAnalyzed;
00166 sTotalTilewiresPruned += mTilewiresPruned;
00167 sTotalTilewiresUndefined += mTilewiresUndefined;
00168 sTotalTilewireMismatches += mTilewireMismatches;
00169
00170
00171
00172 BOOST_CHECK_EQUAL(mTilewireCount - mTilewiresPruned, mSegments.getTotalWireCount());
00173 BOOST_CHECK(mTilewireMismatches == 0);
00174 }
00175
00176 void analyzeSegmentTilewire(const Tilewire& inTilewire) {
00177 mTilewiresAnalyzed++;
00178
00179 TileIndex tileIndex = inTilewire.getTileIndex();
00180 WireIndex wireIndex = inTilewire.getWireIndex();
00181 const Array<SegmentReference>& tilewireSegments = mSegments.mTilewireSegments[tileIndex];
00182
00183 const SegmentReference& segmentReference = tilewireSegments[wireIndex];
00184 CompactSegmentIndex compactSegmentIndex = segmentReference.getCompactSegmentIndex();
00185 TileIndex anchorTileIndex = segmentReference.getAnchorTileIndex();
00186 (void) anchorTileIndex;
00187
00188 CompactSegmentIndex usageCompactSegmentIndex = mUsage[inTilewire];
00189 if(compactSegmentIndex == usageCompactSegmentIndex) {
00190
00191
00192
00193 } else if(usageCompactSegmentIndex == cUsageUndefined) {
00194
00195 mUsage[inTilewire] = compactSegmentIndex;
00196
00197
00198 } else {
00199 mTilewireMismatches++;
00200 std::cerr << "Mismatch (" << static_cast<int>(compactSegmentIndex) << " vs. "
00201 << static_cast<int>(usageCompactSegmentIndex) << ") for " << inTilewire
00202 << std::endl;
00203 BOOST_CHECK_EQUAL(static_cast<int>(compactSegmentIndex),
00204 static_cast<int>(usageCompactSegmentIndex));
00205 }
00206 }
00207 };
00208
00209
00210 uint64_t segments_regression_test_helper::sTotalTilewireCount = 0;
00211
00212 uint64_t segments_regression_test_helper::sTotalTilewiresAnalyzed = 0;
00213
00214 uint64_t segments_regression_test_helper::sTotalTilewiresPruned = 0;
00215
00216 uint64_t segments_regression_test_helper::sTotalTilewiresUndefined = 0;
00217
00218 uint64_t segments_regression_test_helper::sTotalTilewireMismatches = 0;
00219
00220
00221 BOOST_AUTO_TEST_CASE(SegmentsRegressionTest) {
00222
00223
00224 const torc::common::DeviceVector& devices = torc::common::Devices::getSupportedDevices();
00225 torc::common::DeviceVector::const_iterator dp = devices.begin();
00226 torc::common::DeviceVector::const_iterator de = devices.end();
00227 while(dp < de) {
00228 const std::string& device = *dp++;
00229 if(device.empty()) break;
00230 DDB ddb(device);
00231 std::cerr << ddb;
00232 segments_regression_test_helper segmentTester(ddb);
00233 segmentTester();
00234 }
00235 segments_regression_test_helper::statistics();
00236
00237 }
00238
00239 BOOST_AUTO_TEST_SUITE_END()
00240
00241 }
00242 }