00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef TORC_ROUTER_ROUTUTILITIES_HPP
00020 #define TORC_ROUTER_ROUTUTILITIES_HPP
00021
00022 #include "torc/router/RouteNet.hpp"
00023 #include "torc/Physical.hpp"
00024 #include "torc/architecture/DDB.hpp"
00025 #include "torc/architecture/Tilewire.hpp"
00026 #include "torc/architecture/XdlImporter.hpp"
00027
00028 #include <string>
00029 #include <map>
00030 #include <boost/unordered_map.hpp>
00031 #include <boost/any.hpp>
00032
00033 namespace torc {
00034 namespace router {
00035
00036
00037
00038
00039 class RouteUtilities {
00040
00041
00042 typedef std::string string;
00043 typedef architecture::Tilewire Tilewire;
00044 typedef architecture::TilewireVector TilewireVector;
00045 typedef architecture::Arc Arc;
00046 typedef architecture::ArcVector ArcVector;
00047
00048 typedef torc::physical::NetSharedPtr NetSharedPtr;
00049 typedef std::vector<NetSharedPtr> NetSharedPtrVector;
00050 typedef torc::physical::Circuit::NetSharedPtrConstIterator NetSharedPtrConstIterator;
00051 typedef torc::physical::Circuit::NetSharedPtrIterator NetSharedPtrIterator;
00052 typedef torc::physical::Net::InstancePinSharedPtrConstIterator
00053 InstancePinSharedPtrConstIterator;
00054 typedef torc::physical::Net::InstancePinSharedPtrIterator
00055 InstancePinSharedPtrIterator;
00056 typedef torc::physical::Pip Pip;
00057
00058 public:
00059 typedef ArcVector::const_iterator ArcConstIterator;
00060 typedef ArcVector::iterator ArcIterator;
00061 typedef TilewireVector::const_iterator TilewireConstIterator;
00062 typedef TilewireVector::iterator TilewireIterator;
00063 typedef RouteNodePtrVector::const_iterator RouteNodePtrConstIterator;
00064 typedef RouteNodePtrVector::iterator RouteNodePtrIterator;
00065
00066 protected:
00067
00068
00069 string mName;
00070
00071 TilewireVector mSources;
00072
00073 TilewireVector mSinks;
00074
00075 ArcVector mArcs;
00076
00077 RouteNodePtrVector mRouteNodes;
00078
00079 public:
00080 boost::unordered_map<boost::uint32_t, boost::any> mProperties;
00081
00082 public:
00083
00084
00085 RouteUtilities() {}
00086
00087 void design2routenets(NetSharedPtrIterator netsbegin, NetSharedPtrIterator netsend,
00088 RouteNetVector& routenets) {
00089 NetSharedPtrIterator p = netsbegin;
00090 for (p = netsbegin; p != netsend; p++) {
00091 TilewireVector sources;
00092 TilewireVector sinks;
00093
00094
00095 for (InstancePinSharedPtrIterator pinPtr = (*p)->sourcesBegin();
00096 pinPtr != (*p)->sourcesEnd(); pinPtr++) {
00097
00098 sources.push_back(INSTANCE_PIN_PHYSICAL_TO_ARCHITECTURE(*pinPtr)->getTilewire());
00099
00100 if (sources.back() == Tilewire::sInvalid) {
00101 std::cout << "BAD IMPORT: " << (*p)->getName() << " - "
00102 << (*pinPtr)->getPinName() << std::endl;
00103 }
00104 }
00105 for (InstancePinSharedPtrIterator pinPtr = (*p)->sinksBegin();
00106 pinPtr != (*p)->sinksEnd(); pinPtr++) {
00107 sinks.push_back(INSTANCE_PIN_PHYSICAL_TO_ARCHITECTURE(*pinPtr)->getTilewire());
00108
00109 if (sinks.back() == Tilewire::sInvalid) {
00110 std::cout << "BAD IMPORT: " << (*p)->getName() << " - "
00111 << (*pinPtr)->getPinName() << std::endl;
00112 }
00113 }
00114
00115
00116 std::string name = (*p)->getName();
00117 routenets.push_back(RouteNet(name, sources, sinks));
00118 }
00119 }
00120 void routenets2design(RouteNetVector& routenets, NetSharedPtrIterator netsbegin,
00121 NetSharedPtrIterator netsend, architecture::DDB& ddb) {
00122 NetSharedPtrIterator p = netsbegin;
00123 architecture::ExtendedWireInfo ewisource(ddb);
00124 architecture::ExtendedWireInfo ewisink(ddb);
00125 unsigned int i = 0;
00126 for (p = netsbegin; p != netsend; p++) {
00127 if (!((*p)->getName() == routenets[i].getName())) {
00128 std::cout << "Name mismatch for corresponding entry: "
00129 << (*p)->getName() << " " << routenets[i].getName() << std::endl;
00130 throw;
00131 }
00132
00133 RouteNodePtrVector& routeNodes = routenets[i].routeNodes();
00134 for (unsigned int j = 0; j < routeNodes.size(); j++) {
00135 Arc arc = routeNodes[j]->getArc();
00136
00137 if (arc.getSourceTilewire() == arc.getSinkTilewire()) continue;
00138
00139 ewisource = arc.getSourceTilewire();
00140 ewisink = arc.getSinkTilewire();
00141
00142 Pip pip = physical::Factory::newPip(ewisource.mTileName, ewisource.mWireName,
00143 ewisink.mWireName, physical::ePipUnidirectionalBuffered);
00144
00145 (*p)->addPip(pip);
00146 }
00147
00148
00149
00150 i++;
00151 }
00152 }
00153 };
00154
00155
00156 }
00157 }
00158
00159 #endif // TORC_ROUTER_ROUTEUTILITIES_HPP