00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef TORC_UTILS_MARKEXTRACTER_HPP
00020 #define TORC_UTILS_MARKEXTRACTER_HPP
00021
00022 #include <iostream>
00023 #include "torc/Physical.hpp"
00024 #include "torc/physical/OutputStreamHelpers.hpp"
00025 #include <vector>
00026 #include <boost/regex.hpp>
00027
00028 namespace torc {
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 class MarkExtracter {
00044 protected:
00045
00046 typedef std::string string;
00047
00048 typedef torc::physical::DesignSharedPtr DesignSharedPtr;
00049
00050 typedef torc::physical::ModuleSharedPtr ModuleSharedPtr;
00051
00052 typedef std::vector<ModuleSharedPtr> ModuleSharedPtrVector;
00053
00054 typedef torc::physical::CircuitSharedPtr CircuitSharedPtr;
00055
00056 typedef torc::physical::InstanceSharedPtr InstanceSharedPtr;
00057
00058 typedef std::vector<InstanceSharedPtr> InstanceSharedPtrVector;
00059
00060 typedef torc::physical::NetSharedPtr NetSharedPtr;
00061
00062 typedef std::vector<NetSharedPtr> NetSharedPtrVector;
00063
00064 typedef torc::physical::Circuit::InstanceSharedPtrConstIterator InstanceSharedPtrConstIterator;
00065
00066 typedef torc::physical::Circuit::InstanceSharedPtrIterator InstanceSharedPtrIterator;
00067
00068 typedef torc::physical::Circuit::NetSharedPtrConstIterator NetSharedPtrConstIterator;
00069
00070 typedef torc::physical::Circuit::NetSharedPtrIterator NetSharedPtrIterator;
00071
00072 typedef torc::physical::InstanceWeakPtr InstanceWeakPtr;
00073
00074 typedef torc::physical::Design::ModuleSharedPtrConstIterator ModuleSharedPtrConstIterator;
00075
00076 typedef torc::physical::Design::ModuleSharedPtrIterator ModuleSharedPtrIterator;
00077
00078 typedef torc::physical::ConfigMap::const_iterator ConfigMapConstIterator;
00079
00080 typedef torc::physical::Net::InstancePinSharedPtrConstIterator
00081 InstancePinSharedPtrConstIterator;
00082
00083 typedef torc::physical::Net::PipConstIterator PipConstIterator;
00084
00085 typedef boost::shared_ptr<torc::physical::Named> NamedSharedPtr;
00086
00087 typedef boost::shared_ptr<torc::physical::ConfigMap> ConfigMapSharedPtr;
00088
00089 typedef torc::physical::Module::PortSharedPtrConstIterator PortSharedPtrConstIterator;
00090
00091 typedef torc::physical::Net::InstancePinSharedPtrIterator InstancePinSharedPtrIterator;
00092
00093 typedef torc::physical::Pip Pip;
00094 typedef torc::physical::PipVector PipVector;
00095 typedef torc::physical::Net::PipIterator PipIterator;
00096
00097
00098 std::ostream& mStream;
00099 DesignSharedPtr mDesign;
00100 DesignSharedPtr mNewDesign;
00101 const string mPattern;
00102 boost::regex mRegex;
00103
00104 public:
00105 MarkExtracter(std::ostream& inOutStream, const DesignSharedPtr& inDesign,
00106 string inPattern) : mStream(inOutStream), mDesign(inDesign), mPattern(inPattern) {
00107 mStream << "Searching for '" << mPattern << "'" << std::endl;
00108 mStream << "NEAT" << std::endl;
00109 mRegex.assign(mPattern);
00110 }
00111
00112
00113 DesignSharedPtr extract() {
00114
00115 std::cout << "### " << mPattern << " ###" << std::endl;
00116
00117 ModuleSharedPtrConstIterator p;
00118 for (p = mDesign->modulesBegin(); p!= mDesign->modulesEnd(); p++) {
00119 std::cout << "MODULES ARE NOT CURRENTLY SUPPORTED!" << std::endl;
00120 }
00121 mNewDesign = physical::Factory::newDesignPtr(mDesign->getName(), mDesign->getDevice(),
00122 mDesign->getPackage(), mDesign->getSpeedGrade(), mDesign->getXdlVersion());
00123
00124 pruneCircuit(mDesign);
00125
00126
00127 return mNewDesign;
00128 }
00129 void pruneCircuit(CircuitSharedPtr circuit) {
00130 InstanceSharedPtrIterator inst_i;
00131 NetSharedPtrIterator net_i;
00132
00133 std::map<InstanceSharedPtr, bool> instanceMap;
00134 std::map<NetSharedPtr, bool> netMap;
00135
00136 boost::smatch smatches;
00137
00138 for (inst_i = circuit->instancesBegin(); inst_i != circuit->instancesEnd(); inst_i++) {
00139 bool test = regex_match((*inst_i)->getName(), smatches, mRegex);
00140 std::multimap<std::string, physical::Config>::const_iterator p;
00141 for (p = (*inst_i)->configBegin(); p != (*inst_i)->configEnd(); p++) {
00142 test = test || regex_match((*p).first, smatches, mRegex);
00143 test = test || regex_match((*p).second.getName(), smatches, mRegex);
00144 test = test || regex_match((*p).second.getValue(), smatches, mRegex);
00145 }
00146
00147 instanceMap[*inst_i] = test;
00148 }
00149 for (net_i = circuit->netsBegin(); net_i != circuit->netsEnd(); net_i++) {
00150 bool test = regex_match((*net_i)->getName(), smatches, mRegex);
00151
00152 netMap[*net_i] = test;
00153 if (!test) continue;
00154 InstancePinSharedPtrIterator pin_i;
00155 for (pin_i = (*net_i)->sourcesBegin(); pin_i != (*net_i)->sourcesEnd(); pin_i++) {
00156 std::cout << "NET INST source: " << ((*pin_i)->getInstancePtr().lock())->getName()
00157 << " -- " << true << std::endl;
00158 instanceMap[(*pin_i)->getInstancePtr().lock()] = true;
00159 }
00160 for (pin_i = (*net_i)->sinksBegin(); pin_i != (*net_i)->sinksEnd(); pin_i++) {
00161 std::cout << "NET INST sink: " << ((*pin_i)->getInstancePtr().lock())->getName()
00162 << " -- " << true << std::endl;
00163 instanceMap[(*pin_i)->getInstancePtr().lock()] = true;
00164 }
00165 }
00166
00167 std::map<InstanceSharedPtr, bool>::iterator imap_i;
00168 std::map<NetSharedPtr, bool>::iterator nmap_i;
00169 std::cout << "Copying marked instances and nets..." << std::endl;
00170 for (imap_i = instanceMap.begin(); imap_i != instanceMap.end(); imap_i++) {
00171
00172
00173 if (imap_i->second) {
00174 InstanceSharedPtr isp = imap_i->first;
00175 mNewDesign->addInstance(isp);
00176 }
00177 }
00178 for (nmap_i = netMap.begin(); nmap_i != netMap.end(); nmap_i++) {
00179
00180
00181 if (nmap_i->second) {
00182 NetSharedPtr nsp = nmap_i->first;
00183 mNewDesign->addNet(nsp);
00184 }
00185 }
00186
00187 }
00188 void filterOnPips(CircuitSharedPtr circuit) {
00189 InstanceSharedPtrIterator inst_i;
00190 NetSharedPtrIterator net_i;
00191
00192 std::map<InstanceSharedPtr, bool> instanceMap;
00193 std::map<NetSharedPtr, bool> netMap;
00194
00195 boost::smatch smatches;
00196
00197 for (inst_i = circuit->instancesBegin(); inst_i != circuit->instancesEnd(); inst_i++) {
00198 instanceMap[*inst_i] = false;
00199 }
00200 for (net_i = circuit->netsBegin(); net_i != circuit->netsEnd(); net_i++) {
00201 bool test = false;
00202 for (PipIterator pip_i = (*net_i)->pipsBegin(); pip_i != (*net_i)->pipsEnd(); pip_i++) {
00203 test = test || regex_match(pip_i->getTileName(), smatches, mRegex);
00204 test = test || regex_match(pip_i->getSourceWireName(), smatches, mRegex);
00205 test = test || regex_match(pip_i->getSinkWireName(), smatches, mRegex);
00206 }
00207
00208
00209 netMap[*net_i] = test;
00210 if (!test) continue;
00211 InstancePinSharedPtrIterator pin_i;
00212 for (pin_i = (*net_i)->sourcesBegin(); pin_i != (*net_i)->sourcesEnd(); pin_i++) {
00213 std::cout << "NET INST source: " << ((*pin_i)->getInstancePtr().lock())->getName()
00214 << " -- " << true << std::endl;
00215 instanceMap[(*pin_i)->getInstancePtr().lock()] = true;
00216 }
00217 for (pin_i = (*net_i)->sinksBegin(); pin_i != (*net_i)->sinksEnd(); pin_i++) {
00218 std::cout << "NET INST sink: " << ((*pin_i)->getInstancePtr().lock())->getName()
00219 << " -- " << true << std::endl;
00220 instanceMap[(*pin_i)->getInstancePtr().lock()] = true;
00221 }
00222 }
00223
00224 std::map<InstanceSharedPtr, bool>::iterator imap_i;
00225 std::map<NetSharedPtr, bool>::iterator nmap_i;
00226 std::cout << "Copying marked instances and nets..." << std::endl;
00227 for (imap_i = instanceMap.begin(); imap_i != instanceMap.end(); imap_i++) {
00228
00229
00230 if (imap_i->second) {
00231 InstanceSharedPtr isp = imap_i->first;
00232 mNewDesign->addInstance(isp);
00233 }
00234 }
00235 for (nmap_i = netMap.begin(); nmap_i != netMap.end(); nmap_i++) {
00236
00237
00238 if (nmap_i->second) {
00239 NetSharedPtr nsp = nmap_i->first;
00240 mNewDesign->addNet(nsp);
00241 }
00242 }
00243
00244 }
00245
00246 };
00247
00248 }
00249
00250 #endif // TORC_UTILS_MARKEXTRACTER_HPP