00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef TORC_UTILS_ARCHITECTUREBROWSER_HPP
00020 #define TORC_UTILS_ARCHITECTUREBROWSER_HPP
00021
00022 #include <iostream>
00023 #include <iomanip>
00024 #include <map>
00025 #include <sstream>
00026 #include "torc/architecture/DDB.hpp"
00027 #include "torc/architecture/DDBStreamHelper.hpp"
00028 #include "torc/architecture/OutputStreamHelpers.hpp"
00029 #include <boost/regex.hpp>
00030 #include <boost/lexical_cast.hpp>
00031 #include <boost/algorithm/string/case_conv.hpp>
00032
00033
00034 namespace torc {
00035
00036
00037 class ArchitectureBrowser {
00038
00039 protected:
00040
00041 typedef std::string string;
00042
00043 typedef architecture::DDB DDB;
00044
00045 typedef architecture::PrimitiveDef PrimitiveDef;
00046
00047 typedef architecture::Segments Segments;
00048
00049 typedef architecture::Sites Sites;
00050
00051 typedef architecture::Tiles Tiles;
00052
00053 typedef architecture::ArcUsage ArcUsage;
00054
00055 typedef architecture::WireUsage WireUsage;
00056
00057 typedef architecture::Tilewire Tilewire;
00058
00059 typedef architecture::TilewireVector TilewireVector;
00060
00061 typedef architecture::WireInfo WireInfo;
00062
00063 typedef architecture::xilinx::TileIndex TileIndex;
00064
00065 typedef architecture::xilinx::TileCount TileCount;
00066
00067 typedef architecture::xilinx::WireIndex WireIndex;
00068
00069 typedef architecture::xilinx::TileTypeIndex TileTypeIndex;
00070
00071 typedef architecture::xilinx::SiteIndex SiteIndex;
00072
00073 typedef void (ArchitectureBrowser::*BrowserFunction)(const std::string& x);
00074
00075
00076 DDB& mDB;
00077
00078 const Segments& mSegments;
00079
00080 const Sites& mSites;
00081
00082 const Tiles& mTiles;
00083
00084 ArcUsage& mArcUsage;
00085
00086 WireUsage& mWireUsage;
00087
00088
00089 static boost::regex sTilewireRegEx;
00090
00091 static boost::regex sIndexRegEx;
00092
00093 static boost::regex sNameRegEx;
00094
00095
00096 enum EFunctionMap {
00097 eNotDefined, eQuit, eBit, eClear, eDetail, eFind, eGoto, eSinks,
00098 eInstances, eRoute, eSources, eWires, eTypes, eEquations, eeXtent, eMap,
00099 eSites, eSitePins, eSegment, eSiteTypes, eDeviceSummary, eTiles, eSiteDetail, eSitesOfType
00100 };
00101
00102
00103 std::map<string, EFunctionMap> mFunctionMap;
00104
00105
00106
00107 public:
00108
00109 ArchitectureBrowser(DDB& inDB) : mDB(inDB), mSegments(inDB.getSegments()),
00110 mSites(inDB.getSites()), mTiles(inDB.getTiles()),
00111 mArcUsage(inDB.getArcUsage()), mWireUsage(inDB.getWireUsage()) {
00112 setupFunctionMap();
00113 }
00114
00115 ~ArchitectureBrowser() {}
00116 public:
00117
00118 void browse() {
00119 using std::cout;
00120 using std::cin;
00121 using std::endl;
00122
00123 BrowserFunction getFilteredTileListRef = &ArchitectureBrowser::getFilteredTileList;
00124 BrowserFunction getTilewireDetailRef = &ArchitectureBrowser::getTilewireDetail;
00125 BrowserFunction displayFullSegmentRef = &ArchitectureBrowser::displayFullSegment;
00126 BrowserFunction getWireListForTileTypeRef = &ArchitectureBrowser::getWireListForTileType;
00127 BrowserFunction displaySegmentSourcesRef = &ArchitectureBrowser::displaySegmentSources;
00128 BrowserFunction displaySegmentSinksRef = &ArchitectureBrowser::displaySegmentSinks;
00129 BrowserFunction getFilteredSiteListRef = &ArchitectureBrowser::getFilteredSiteList;
00130 BrowserFunction getSiteDetailRef = &ArchitectureBrowser::getSiteDetail;
00131 BrowserFunction displaySitesOfTypeRef = &ArchitectureBrowser::displaySitesOfType;
00132
00133 string function;
00134 string userinput;
00135 Tilewire tw;
00136 while (true) {
00137 printFullMenu();
00138 cin >> function;
00139 switch (mFunctionMap[function]) {
00140 case eQuit:
00141 cout << "Bye!" << endl << endl;
00142 return;
00143 break;
00144 case eDeviceSummary:
00145 cout << "Device Summary." << endl;
00146 deviceSummary();
00147 break;
00148 case eTiles:
00149
00150 functionPrompt("Enter regexp filter (\".*\" to match all tiles), q to quit",
00151 getFilteredTileListRef);
00152 break;
00153 case eWires:
00154 functionPrompt("Enter tile type index, tile type name or tile name, q to quit",
00155 getWireListForTileTypeRef);
00156 break;
00157 case eDetail:
00158 functionPrompt("Enter wire@tile, q to quit", getTilewireDetailRef);
00159 break;
00160 case eSegment:
00161 functionPrompt("Enter wire@tile, q to quit", displayFullSegmentRef);
00162 break;
00163 case eSources:
00164 functionPrompt("Enter wire@tile, q to quit", displaySegmentSourcesRef);
00165 break;
00166 case eSinks:
00167 functionPrompt("Enter wire@tile, q to quit", displaySegmentSinksRef);
00168 break;
00169 case eSites:
00170
00171 functionPrompt("Enter regexp filter (\".*\" to match all sites), q to quit",
00172 getFilteredSiteListRef);
00173 break;
00174 case eSiteDetail:
00175 functionPrompt("Enter site name or index, q to quit", getSiteDetailRef);
00176 break;
00177 case eSiteTypes:
00178 cout << "List site types: " << endl;
00179 enumerateSiteTypes();
00180 break;
00181 case eSitesOfType:
00182 functionPrompt("Enter site type name, q to quit", displaySitesOfTypeRef);
00183 break;
00184
00185
00186
00187 case eBit:
00188 cout << "Bit - Nothing here yet." << endl;
00189 break;
00190 case eClear:
00191 cout << "Clear - Nothing here yet." << endl;
00192 break;
00193 case eFind:
00194 cout << "Enter tile index: ";
00195 cin >> userinput;
00196
00197 break;
00198 case eGoto:
00199 cout << "Enter wire@tile: " << endl;
00200 cin >> userinput;
00201
00202 break;
00203 case eInstances:
00204 cout << "Enter tile type: ";
00205 cin >> userinput;
00206
00207 break;
00208 case eRoute:
00209 cout << "Route - Not yet supported" << endl;
00210
00211
00212 break;
00213 case eTypes:
00214 cout << "Available tile types:" << endl;
00215
00216 break;
00217 case eEquations:
00218 cout << "Equations - Nothing here yet." << endl;
00219 break;
00220 case eeXtent:
00221 cout << "Enter wire@tile: ";
00222 cin >> userinput;
00223
00224 break;
00225 case eMap:
00226 cout << "Displaying tilemap:" << endl;
00227
00228 break;
00229 case eSitePins:
00230 cout << "Enter site: ";
00231 cin >> userinput;
00232
00233 break;
00234 default:
00235 cout << "Invalid Function: " << function << endl;
00236 }
00237 }
00238 }
00239
00240 void functionPrompt(const char* inPrompt, BrowserFunction f) {
00241 using std::cout;
00242 using std::endl;
00243 using std::cin;
00244 string userinput;
00245 while (true) {
00246 cout << endl << inPrompt << "> ";
00247 cin >> userinput;
00248 switch (mFunctionMap[userinput]) {
00249 case eQuit:
00250 return;
00251 default:
00252 (this->*f)(userinput);
00253 break;
00254 }
00255 }
00256 }
00257
00258 void deviceSummary() {
00259 using std::cout;
00260 using std::endl;
00261 cout << "Name: " << mDB.getDeviceName() << endl;
00262 cout << "Family: " << mDB.getFamilyName() << endl;
00263 cout << "Speed grades:";
00264 for (unsigned int i =0; i < mDB.getSpeedGrades().size(); i++) {
00265 cout << " " << mDB.getSpeedGrades()[i];
00266 }
00267 cout << endl;
00268
00269 cout << "Total tiles: " << mTiles.getTileCount() << endl;
00270 cout << "Family tile type count: " << mTiles.getTileTypeCount() << endl;
00271 cout << "Tilemap dimensions: " << mTiles.getRowCount() << " "
00272 << mTiles.getColCount() << endl;
00273 cout << "Wire use: " << mWireUsage.getWireUsageCount() << endl;
00274 cout << "Arc use: " << mArcUsage.getArcUsageCount() << endl;
00275 }
00276
00277 void getTileList() {
00278 using std::cout;
00279 using std::endl;
00280 std::ios_base::fmtflags saveflags = cout.flags();
00281
00282 for (TileIndex i(0); i < mTiles.getTileCount(); i++) {
00283 const architecture::TileInfo& ti = mTiles.getTileInfo(i);
00284 cout << std::setw(6) << i << " type " << std::setw(3) << ti.getTypeIndex() << " "
00285 << "(" << std::setw(3) << ti.getRow() << "," << std::setw(3) << ti.getCol()
00286 << ") " << ti.getName() << endl;
00287 }
00288 cout.flags(saveflags);
00289 }
00290
00291 void getFilteredTileList(const string& inString) {
00292 using std::cout;
00293 using std::endl;
00294 std::ios_base::fmtflags saveflags = cout.flags();
00295
00296
00297 std::string userPattern = regex_replace(inString, boost::regex("(?<!\\.)\\*"), ".*");
00298
00299
00300 boost::regex sTileNameRegEx(userPattern, boost::regex::perl | boost::regex::icase
00301 | boost::regex::no_except);
00302
00303 if (sTileNameRegEx.empty()) {
00304 cout << "Bad regular expression. Try again." << endl;
00305 return;
00306 }
00307
00308
00309 boost::smatch smatches;
00310 int matchCount = 0;
00311 for (TileIndex i(0); i < mTiles.getTileCount(); i++) {
00312 const architecture::TileInfo& ti = mTiles.getTileInfo(i);
00313 if (regex_match(std::string(ti.getName()), smatches, sTileNameRegEx)) {
00314 matchCount++;
00315 cout << std::setw(6) << i << " type " << std::setw(3) << ti.getTypeIndex() << " "
00316 << "(" << std::setw(3) << ti.getRow() << "," << std::setw(3) << ti.getCol()
00317 << ") " << ti.getName() << endl;
00318 }
00319 }
00320
00321
00322 cout << endl << matchCount << " match" << (matchCount == 1 ? "." : "es.") << endl;
00323
00324 cout.flags(saveflags);
00325 }
00326
00327 void getSiteList() {
00328 using std::cout;
00329 using std::endl;
00330 std::ios_base::fmtflags saveflags = cout.flags();
00331
00332 for (SiteIndex i(0); i < mSites.getSiteCount(); i++) {
00333 const architecture::Site& site = mSites.getSite(i);
00334 cout << std::setw(7) << i << " " << site.getName() << endl;
00335 }
00336 cout.flags(saveflags);
00337 }
00338
00339 void getFilteredSiteList(const string& inString) {
00340 using std::cout;
00341 using std::endl;
00342 std::ios_base::fmtflags saveflags = cout.flags();
00343
00344
00345 std::string userPattern = regex_replace(inString, boost::regex("(?<!\\.)\\*"), ".*");
00346
00347
00348 boost::regex sSiteNameRegEx(userPattern, boost::regex::perl | boost::regex::icase
00349 | boost::regex::no_except);
00350
00351 if (sSiteNameRegEx.empty()) {
00352 cout << "Bad regular expression. Try again." << endl;
00353 return;
00354 }
00355
00356
00357 boost::smatch smatches;
00358 int matchCount = 0;
00359 for (SiteIndex i(0); i < mSites.getSiteCount(); i++) {
00360 const architecture::Site& site = mSites.getSite(i);
00361 if (regex_match(site.getName(), smatches, sSiteNameRegEx)) {
00362 matchCount++;
00363 cout << std::setw(7) << i << " " << site.getName() << endl;
00364 }
00365 }
00366
00367
00368 cout << endl << matchCount << " match" << (matchCount == 1 ? "." : "es.") << endl;
00369
00370 cout.flags(saveflags);
00371 }
00372
00373 void getSiteDetail(const string& inString) {
00374 using std::cout;
00375 using std::endl;
00376 std::ios_base::fmtflags saveflags = cout.flags();
00377 SiteIndex siteIndex(0);
00378 std::string siteName;
00379 boost::smatch smatches;
00380 if (regex_match(inString, smatches, ArchitectureBrowser::sIndexRegEx)) {
00381 siteIndex = boost::lexical_cast<SiteIndex>(smatches[1]);
00382 if (siteIndex >= mSites.getSiteCount()) {
00383 cout << "Site index " << siteIndex << " out of range! "
00384 << mSites.getSiteCount() << endl;
00385 return;
00386 }
00387 } else if (regex_match(inString, smatches, ArchitectureBrowser::sNameRegEx)) {
00388 siteIndex = mSites.findSiteIndex(inString);
00389 if (siteIndex == SiteIndex(-1)) {
00390 cout << "Site not found: " << inString << endl;
00391 return;
00392 }
00393 } else {
00394 cout << "Input invalid: " << inString << endl;
00395 return;
00396 }
00397 const architecture::Site& site = mSites.getSite(siteIndex);
00398 cout << "Site: " << site.getName() << endl;
00399 cout << "\tTile: " << mTiles.getTileInfo(site.getTileIndex()).getName()
00400 << " (" << site.getTileIndex() << ") " << endl;
00401 cout << "\tFlags: " << std::hex << site.getFlags() << endl;
00402 cout << std::dec << "\tPinMapPtr" << endl << "\t\t";
00403 for (unsigned int i = 0; i < (site.getPinMapPtr())->getSize(); i++) {
00404 cout << " " << (*site.getPinMapPtr())[i];
00405 }
00406 cout << endl;
00407 const PrimitiveDef& primDef = *site.getPrimitiveDefPtr();
00408 cout << "\tPrimitive Definition: " << primDef.getName() << endl;
00409 cout.flags(saveflags);
00410
00411 }
00412
00413 void displaySitesOfType(const string& inString) {
00414 using std::cout;
00415 using std::endl;
00416 std::ios_base::fmtflags saveflags = cout.flags();
00417
00418 for (SiteIndex i(0); i < mSites.getSiteCount(); i++) {
00419 const architecture::Site& site = mSites.getSite(i);
00420 const PrimitiveDef* siteTypePtr = site.getPrimitiveDefPtr();
00421 if (siteTypePtr->getName() == inString)
00422 cout << std::setw(7) << i << " " << site.getName() << endl;
00423 }
00424
00425 cout.flags(saveflags);
00426 }
00427
00428 void getTilewireDetail(const string& inString) {
00429 using std::cout;
00430 using std::endl;
00431 Tilewire tw = stringToTilewire(inString);
00432 if (tw == Tilewire::sInvalid) {
00433 cout << "Specified tilewire not found: " << inString << endl;
00434 return;
00435 }
00436 TileTypeIndex tti = mTiles.getTileInfo(tw.getTileIndex()).getTypeIndex();
00437 architecture::ExtendedWireInfo ewi(mDB, tw);
00438 cout << ewi << endl;
00439 const architecture::WireInfo& wireinfo = mTiles.getWireInfo(tti, tw.getWireIndex());
00440 cout << "\toffset: " << wireinfo.getArcOffset() << endl;
00441 cout << "\tattributes: ";
00442 cout << (wireinfo.isHidden() ? "HIDDEN " : "");
00443 cout << (wireinfo.isInput() ? "INPUT " : "");
00444 cout << (wireinfo.isOutput() ? "OUTPUT " : "");
00445 cout << (wireinfo.isRemote() ? "REMOTE " : "");
00446 cout << (wireinfo.isGlobal() ? "GLOBAL " : "");
00447 cout << (wireinfo.isRemoteNodeCapable() ? "REMOTE_NODE_CAPABLE " : "");
00448 cout << (wireinfo.isRemoteArcCapable() ? "REMOTE_ARC_CAPABLE " : "") << endl;
00449 const architecture::WireArray& sinks = wireinfo.getSinks();
00450 cout << "\tsinks: ";
00451 for (uint32_t i = 0; i < sinks.getSize(); i++) cout << sinks[i] << " "; cout << endl;
00452
00453 const architecture::WireArray& sources = wireinfo.getSources();
00454 cout << "\tsources: ";
00455 for (uint32_t i = 0; i < sources.getSize(); i++) cout << sources[i] << " "; cout << endl;
00456
00457 const architecture::WireArray& isinks = wireinfo.getIrregularSinks();
00458 cout << "\tirregular sinks: ";
00459 for (uint32_t i = 0; i < isinks.getSize(); i++) cout << isinks[i] << " "; cout << endl;
00460
00461 const architecture::WireArray& isources = wireinfo.getIrregularSources();
00462 cout << "\tirregular sources: ";
00463 for (uint32_t i = 0; i < isources.getSize(); i++) cout << isources[i] << " "; cout << endl;
00464
00465 const architecture::WireArray& tsinks = wireinfo.getTiedSinks();
00466 cout << "\ttied sinks: ";
00467 for (uint32_t i = 0; i < tsinks.getSize(); i++) cout << tsinks[i] << " "; cout << endl;
00468
00469 const architecture::WireArray& tsources = wireinfo.getTiedSources();
00470 cout << "\ttied sources: ";
00471 for (uint32_t i = 0; i < tsources.getSize(); i++) cout << tsources[i] << " "; cout << endl;
00472
00473
00474
00475 architecture::TilewireVector segmentwires;
00476 mDB.expandSegment(tw, segmentwires);
00477 cout << "\t";
00478 for (uint32_t i = 0; i < segmentwires.size(); i++) cout << segmentwires[i] << " ";
00479 cout << endl;
00480 }
00481
00482 void displaySegmentSources(const string& inString) {
00483 using std::cout;
00484 using std::endl;
00485
00486 Tilewire tw = stringToTilewire(inString);
00487 if (tw == Tilewire::sInvalid) {
00488 cout << inString << " is not a valid Tilewire" << endl;
00489 return;
00490 }
00491 architecture::TilewireVector segmentWires;
00492 architecture::TilewireVector sourceWires;
00493 cout << "Sources for segment containing: " << inString << endl;
00494 mDB.expandSegment(tw, segmentWires);
00495 for (uint32_t i = 0; i < segmentWires.size(); i++) {
00496 architecture::ExtendedWireInfo ewi(mDB, segmentWires[i]);
00497 cout << "|\t" << ewi << endl;
00498 sourceWires.clear();
00499 mDB.expandTilewireSources(segmentWires[i], sourceWires);
00500 for (uint32_t j = 0; j < sourceWires.size(); j++) {
00501 architecture::ExtendedWireInfo ewi2(mDB, sourceWires[j]);
00502 cout << "|<--\t\t" << ewi2 << endl;
00503 }
00504 }
00505 }
00506
00507 void displaySegmentSinks(const string& inString) {
00508 using std::cout;
00509 using std::endl;
00510
00511 Tilewire tw = stringToTilewire(inString);
00512 if (tw == Tilewire::sInvalid) {
00513 cout << inString << " is not a valid Tilewire" << endl;
00514 return;
00515 }
00516 architecture::TilewireVector segmentWires;
00517 architecture::TilewireVector sinkWires;
00518 cout << "Sinks for segment containing: " << inString << endl;
00519 mDB.expandSegment(tw, segmentWires);
00520 for (uint32_t i = 0; i < segmentWires.size(); i++) {
00521 architecture::ExtendedWireInfo ewi(mDB, segmentWires[i]);
00522 cout << "|\t" << ewi << endl;
00523 sinkWires.clear();
00524 mDB.expandTilewireSinks(segmentWires[i], sinkWires);
00525 for (uint32_t j = 0; j < sinkWires.size(); j++) {
00526 architecture::ExtendedWireInfo ewi2(mDB, sinkWires[j]);
00527 cout << "|-->\t\t" << ewi2 << endl;
00528 }
00529 }
00530 }
00531
00532 void displayFullSegment(const string& inString) {
00533 using std::cout;
00534 using std::endl;
00535
00536 std::map<string, std::vector<string> > sourcemap;
00537 std::map<string, std::vector<string> > sinkmap;
00538 std::vector<string> segmentstrings;
00539
00540 Tilewire tw = stringToTilewire(inString);
00541 if (tw == Tilewire::sInvalid) {
00542 cout << inString << " is not a valid Tilewire" << std::endl;
00543 return;
00544 }
00545 architecture::TilewireVector segmentwires;
00546 architecture::TilewireVector arcwires;
00547 mDB.expandSegment(tw, segmentwires);
00548 for (uint32_t i = 0; i < segmentwires.size(); i++) {
00549 architecture::ExtendedWireInfo ewi(mDB, segmentwires[i]);
00550 std::stringstream segwire;
00551 segwire << ewi;
00552 string segwirestring = segwire.str();
00553 segmentstrings.push_back(segwirestring);
00554
00555 sinkmap[segwirestring] = std::vector<string>();
00556 sourcemap[segwirestring] = std::vector<string>();
00557
00558 arcwires.clear();
00559 mDB.expandTilewireSinks(segmentwires[i], arcwires);
00560 for (uint32_t j = 0; j < arcwires.size(); j++) {
00561 architecture::ExtendedWireInfo ewi2(mDB, arcwires[j]);
00562 std::stringstream arcwire;
00563 arcwire << ewi2;
00564
00565 sinkmap[segwirestring].push_back(arcwire.str());
00566 }
00567 arcwires.clear();
00568 mDB.expandTilewireSources(segmentwires[i], arcwires);
00569 for (uint32_t j = 0; j < arcwires.size(); j++) {
00570 architecture::ExtendedWireInfo ewi2(mDB, arcwires[j]);
00571 std::stringstream arcwire;
00572 arcwire << ewi2;
00573
00574 sourcemap[segwirestring].push_back(arcwire.str());
00575 }
00576 }
00577 cout << "Displaying segment containing: " << inString << endl;
00578
00579
00580
00581
00582
00583
00584
00585
00586
00587
00588 for (uint32_t i = 0; i < segmentstrings.size(); i++) {
00589 cout << "|" << endl << "| " << segmentstrings[i] << endl;
00590
00591 for (uint32_t j = 0; j < sourcemap[segmentstrings[i]].size(); j++) {
00592 cout << "| <--- " << sourcemap[segmentstrings[i]][j] << endl;
00593 }
00594 for (uint32_t j = 0; j < sinkmap[segmentstrings[i]].size(); j++) {
00595 cout << "| ---> " << sinkmap[segmentstrings[i]][j] << endl;
00596 }
00597 }
00598
00599 }
00600
00601 void displayFullSegmentFANCY(const string& inString) {
00602 using std::cout;
00603 using std::endl;
00604
00605 std::map<string, std::vector<string> > sourcemap;
00606 std::map<string, std::vector<string> > sinkmap;
00607 std::vector<string> segmentstrings;
00608
00609 Tilewire tw = stringToTilewire(inString);
00610 architecture::TilewireVector segmentwires;
00611 architecture::TilewireVector arcwires;
00612 mDB.expandSegment(tw, segmentwires);
00613 for (uint32_t i = 0; i < segmentwires.size(); i++) {
00614 architecture::ExtendedWireInfo ewi(mDB, segmentwires[i]);
00615 std::stringstream segwire;
00616
00617 segwire << ewi;
00618 string segwirestring = segwire.str();
00619 segmentstrings.push_back(segwirestring);
00620
00621 sinkmap[segwirestring] = std::vector<string>();
00622 sourcemap[segwirestring] = std::vector<string>();
00623
00624 arcwires.clear();
00625 mDB.expandTilewireSinks(segmentwires[i], arcwires);
00626 for (uint32_t j = 0; j < arcwires.size(); j++) {
00627 architecture::ExtendedWireInfo ewi2(mDB, arcwires[j]);
00628 std::stringstream arcwire;
00629
00630 arcwire << ewi2;
00631
00632 sinkmap[segwirestring].push_back(arcwire.str());
00633 }
00634 arcwires.clear();
00635 mDB.expandTilewireSources(segmentwires[i], arcwires);
00636 for (uint32_t j = 0; j < arcwires.size(); j++) {
00637 architecture::ExtendedWireInfo ewi2(mDB, arcwires[j]);
00638 std::stringstream arcwire;
00639
00640 arcwire << ewi2;
00641
00642 sourcemap[segwirestring].push_back(arcwire.str());
00643 }
00644 }
00645
00646 uint32_t sourcewidth = 0;
00647 uint32_t segwidth = 0;
00648 uint32_t sinkwidth = 0;
00649
00650 std::map<string, std::vector<string> >::iterator e;
00651 std::map<string, std::vector<string> >::iterator p;
00652
00653 e = sourcemap.end();
00654 for (p = sourcemap.begin(); p != e; p++) {
00655
00656 for (uint32_t j = 0; j < p->second.size(); j++) {
00657 if (p->second[j].size() > sourcewidth) sourcewidth = p->second[j].size();
00658 }
00659 }
00660 e = sinkmap.end();
00661 for (p = sinkmap.begin(); p != e; p++) {
00662
00663 for (uint32_t j = 0; j < p->second.size(); j++) {
00664 if (p->second[j].size() > sinkwidth) sinkwidth = p->second[j].size();
00665 }
00666 }
00667 for (uint32_t i = 0; i < segmentstrings.size(); i++) {
00668 if (segmentstrings[i].size() > segwidth) segwidth = segmentstrings[i].size();
00669 }
00670 sourcewidth += 2;
00671 segwidth += 2;
00672 sinkwidth += 2;
00673
00674 for (uint32_t i = 0; i < segmentstrings.size(); i++) {
00675 std::map<string, std::vector<string> >::iterator p;
00676 p = sourcemap.find(segmentstrings[i]);
00677 if (p != sourcemap.end() && p->second.size() > 0) {
00678 for (uint32_t j = 0; j < p->second.size() - 1; j++) {
00679 cout << " " << p->second[j];
00680 for (uint32_t k = p->second[j].size(); k < sourcewidth; k++) cout << " ";
00681 cout << "|" << endl;
00682 }
00683 cout << " " << p->second[p->second.size() - 1];
00684 for (uint32_t k = p->second[p->second.size() - 1].size();
00685 k < sourcewidth; k++) cout << " ";
00686 cout << "+ ";
00687 } else {
00688 for (uint32_t k = 0; k < sourcewidth + 3; k++) cout << " ";
00689 }
00690
00691 cout << segmentstrings[i];
00692 for (uint32_t k = segmentstrings[i].size(); k < segwidth; k++) cout << " ";
00693 p = sinkmap.find(segmentstrings[i]);
00694 if (p != sinkmap.end()) {
00695 if (p->second.size() > 0) cout << " + " << p->second[0] << endl;
00696 else cout << endl;
00697 for (uint32_t j = 1; j < p->second.size(); j++) {
00698 for (uint32_t k = 0; k < sourcewidth + segwidth + 4; k++) cout << " ";
00699 cout << "| " << p->second[j] << endl;
00700 }
00701 }
00702 }
00703
00704 }
00705
00706 void getWireListForTileType(const string& inString) {
00707 using std::cout;
00708 using std::endl;
00709
00710 TileTypeIndex tileType(0);
00711 TileIndex tileIndex(0);
00712 string tileTypeName;
00713 string tileName;
00714
00715 boost::smatch smatches;
00716 if (regex_match(inString, smatches, ArchitectureBrowser::sIndexRegEx)) {
00717 tileType = boost::lexical_cast<TileTypeIndex>(smatches[1]);
00718 if (tileType >= mTiles.getTileTypeCount()) {
00719 cout << "Type index " << tileType << " out of range! "
00720 << mTiles.getTileTypeCount() << endl;
00721 return;
00722 }
00723 tileTypeName = mTiles.getTileTypeName(tileType);
00724 } else if (regex_match(inString, smatches, ArchitectureBrowser::sNameRegEx)) {
00725 bool flag = false;
00726 tileTypeName = smatches[1];
00727 for ( ; tileType < mTiles.getTileTypeCount(); tileType++) {
00728 if (tileTypeName == mTiles.getTileTypeName(tileType)) {
00729 flag = true;
00730 break;
00731 }
00732 }
00733 tileName = tileTypeName;
00734 for ( ; tileIndex < mTiles.getTileCount(); tileIndex++) {
00735 const architecture::TileInfo& tileInfo = mTiles.getTileInfo(tileIndex);
00736 if (tileTypeName == tileInfo.getName()) {
00737 tileType = tileInfo.getTypeIndex();
00738 tileTypeName = mTiles.getTileTypeName(tileType);
00739 flag = true;
00740 break;
00741 }
00742 }
00743 if (!flag) {
00744 cout << inString << " not found." << endl;
00745 return;
00746 }
00747 } else {
00748 cout << "Input invalid: " << inString << endl;
00749 return;
00750 }
00751
00752 const architecture::Array<const architecture::WireInfo>& wireInfoArray =
00753 mTiles.getWireInfo(tileType);
00754
00755 cout << "Wires for tile type: " << tileTypeName << " (" << tileType << ")" << endl;
00756 for (uint32_t i = 0; i < wireInfoArray.getSize(); i++) {
00757 const WireInfo& wireInfo = wireInfoArray[i];
00758 cout << "\t" << i << ": " << wireInfo.getName();
00759 cout << (wireInfo.isHidden() ? " (HIDDEN) " : "");
00760 cout << (wireInfo.isInput() ? " (INPUT) " : "");
00761 cout << (wireInfo.isOutput() ? " (OUTPUT) " : "");
00762 cout << (wireInfo.isRemote() ? " (REMOTE) " : "");
00763 cout << (wireInfo.isGlobal() ? " (GLOBAL) " : "");
00764 cout << (wireInfo.isRemoteNodeCapable() ? " (REMOTE_NODE_CAPABLE) " : "");
00765 cout << (wireInfo.isRemoteArcCapable() ? " (REMOTE_ARC_CAPABLE) " : "");
00766 cout << endl;
00767 }
00768 }
00769 void enumerateSiteTypes() {
00770 using std::cout;
00771 using std::endl;
00772 cout << "Device Site Types:" << endl;
00773
00774 const architecture::Array<const PrimitiveDef>& siteTypes = mSites.getSiteTypes();
00775 for (uint32_t i = 0; i < siteTypes.getSize(); i++) {
00776 cout << siteTypes[i].getName() << endl;
00777 }
00778 }
00779 public:
00780
00781 Tilewire stringToTilewire(const string& inString) {
00782 TileIndex tile;
00783 WireIndex wire;
00784
00785 boost::smatch smatches;
00786 boost::smatch smatches2;
00787 if (regex_match(inString, smatches, ArchitectureBrowser::sTilewireRegEx)) {
00788
00789 string tilePart = smatches[2];
00790 boost::to_upper(tilePart);
00791 if (regex_match(tilePart, smatches2, ArchitectureBrowser::sIndexRegEx)) {
00792 tile = boost::lexical_cast<TileIndex>(smatches2[1]);
00793 } else if (regex_match(tilePart, smatches2, ArchitectureBrowser::sNameRegEx)) {
00794 tile = mTiles.findTileIndex(tilePart);
00795 } else {
00796 return Tilewire::sInvalid;
00797 }
00798 if (tile >= mTiles.getTileCount()) return Tilewire::sInvalid;
00799 TileTypeIndex tti = mTiles.getTileInfo(tile).getTypeIndex();
00800 string wirePart = smatches[1];
00801 boost::to_upper(wirePart);
00802 if (regex_match(wirePart, smatches2, ArchitectureBrowser::sIndexRegEx)) {
00803 wire = boost::lexical_cast<WireIndex>(smatches2[1]);
00804 } else if (regex_match(wirePart, smatches2, ArchitectureBrowser::sNameRegEx)) {
00805 wire = mTiles.findWireIndex(tti, wirePart);
00806 } else {
00807 return Tilewire::sInvalid;
00808 }
00809 if (wire >= mTiles.getWireInfo(tti).getSize()) return Tilewire::sInvalid;
00810 return Tilewire(tile, wire);
00811 }
00812 else {
00813 return Tilewire::sInvalid;
00814 }
00815 }
00816
00817 void printFullMenu();
00818
00819 void setupFunctionMap();
00820
00821 };
00822
00823 }
00824
00825 #endif // TORC_UTILS_ARCHITECTUREBROWSER_HPP