115map<const IDF::FUImplementationLocation*, CostEstimates*>
122 for (set<string>::const_iterator i =
usedHDBs_.begin();
127 set<RowID>::const_iterator
id = fuEntryIDs.begin();
128 for (;
id != fuEntryIDs.end();
id++) {
139 map<const IDF::FUImplementationLocation*, CostEstimates*> results;
140 set<const IDF::FUImplementationLocation*>::const_iterator iter =
145 if (
static_cast<int>(frequencyMHz) <= 0 &&
146 static_cast<int>(maxArea) <= 0) {
150 pair<const IDF::FUImplementationLocation*, CostEstimates*>(
161 if (area > maxArea &&
static_cast<int>(maxArea) > 0) {
167 double delayInNanoSeconds =
171 if (delayInNanoSeconds > 0 && (
static_cast<double>(1000) /
static_cast<double>(delayInNanoSeconds)) <
static_cast<double>(frequencyMHz)) {
181 pair<const IDF::FUImplementationLocation*, CostEstimates*>(
182 (*iter), estimates));
211list<TTAMachine::FunctionUnit*>
213 const std::set<std::string>& operationSet,
int width)
217 set<string> operations;
218 set<string>::const_iterator oper = operationSet.begin();
219 for (; oper != operationSet.end(); oper++) {
224 list<pair<TTAMachine::FunctionUnit*, int> >functionUnits;
225 for (set<string>::const_iterator i =
usedHDBs_.begin();
228 set<RowID> fuArchIDs =
231 set<RowID>::const_iterator iter = fuArchIDs.begin();
232 for (;iter != fuArchIDs.end(); iter++) {
238 bool portsDiffer =
false;
239 for (
int p = 0; p < fuArch->
architecture().portCount(); p++) {
248 pair<FunctionUnit*, int> fuIntPair(&fuArch->
architecture(), 0);
249 functionUnits.push_back(fuIntPair);
253 list<TTAMachine::FunctionUnit*> results;
256 while (operations.size() != 0) {
257 list<pair<TTAMachine::FunctionUnit*, int> >::iterator fu =
258 functionUnits.begin();
259 for (; fu != functionUnits.end(); fu++) {
260 int neededOperations = 0;
261 set<string>::iterator operation = operations.begin();
262 while (operation != operations.end()) {
263 if ((*fu).first->hasOperation(*operation)) {
268 (*fu).second = neededOperations;
271 list<TTAMachine::FunctionUnit*> bestMatches;
275 for (fu = functionUnits.begin(); fu != functionUnits.end(); fu++) {
276 if ((*fu).second > bestFU) {
278 bestMatches.push_back((*fu).first);
279 bestFU = (*fu).second;
280 }
else if ((*fu).second == bestFU) {
281 bestMatches.push_back((*fu).first);
286 if (bestMatches.size() != 0) {
289 int minOperations = -1;
290 int maxPortWidth = -1;
292 list<TTAMachine::FunctionUnit*>::const_iterator bestMatchFU =
294 for (; bestMatchFU != bestMatches.end(); bestMatchFU++) {
295 int fuMaxLatency = (*bestMatchFU)->
maxLatency();
296 if (fuMaxLatency < minLatency) {
297 minLatency = fuMaxLatency;
298 minOperations = (*bestMatchFU)->operationCount();
299 bestFU = (*bestMatchFU);
300 }
else if (minLatency == -1) {
301 minLatency = fuMaxLatency;
303 bestFU = (*bestMatchFU);
304 }
else if (fuMaxLatency == minLatency) {
306 if (fuOperations < minOperations) {
307 minOperations = fuOperations;
308 bestFU = (*bestMatchFU);
309 }
else if (minOperations == -1) {
310 minOperations = fuOperations;
311 bestFU = (*bestMatchFU);
312 }
else if (fuOperations == minOperations) {
313 int bestFUPortWidth = 0;
315 i < (*bestMatchFU)->operationPortCount();
318 FUPort* port = (*bestMatchFU)->operationPort(i);
320 if (bestFUPortWidth < port->width()) {
321 bestFUPortWidth = port->
width();
325 if (maxPortWidth < bestFUPortWidth) {
326 maxPortWidth = bestFUPortWidth;
327 bestFU = (*bestMatchFU);
337 results.push_back(bestFU);
340 list<pair<FunctionUnit*, int> >::iterator fuIntIter =
341 functionUnits.begin();
342 for (; fuIntIter != functionUnits.end(); fuIntIter++) {
343 if ((*fuIntIter).first == bestFU) {
344 functionUnits.erase(fuIntIter);
352 if (operations.size() != 0) {
376map<const IDF::RFImplementationLocation*, CostEstimates*>
384 for (set<string>::const_iterator i =
usedHDBs_.begin();
391 for (
int p = 0; p < rf.
portCount(); p++) {
411 set<RowID>::const_iterator
id = rfEntryIDs.begin();
412 for (;
id != rfEntryIDs.end();
id++) {
422 map<const IDF::RFImplementationLocation*, CostEstimates*> results;
423 set<const IDF::RFImplementationLocation*>::const_iterator iter =
428 if (
static_cast<int>(frequencyMHz) <= 0 &&
429 static_cast<int>(maxArea) <= 0) {
433 pair<const IDF::RFImplementationLocation*, CostEstimates*>(
443 if (area > maxArea &&
static_cast<int>(maxArea) > 0) {
449 double delayInNanoSeconds =
453 if ((1000/delayInNanoSeconds) < frequencyMHz) {
463 pair<const IDF::RFImplementationLocation*, CostEstimates*>(
464 (*iter), estimates));
493map<const IDF::IUImplementationLocation*, CostEstimates*>
500 for (set<string>::const_iterator i =
usedHDBs_.begin();
506 set<RowID> iuEntryIDs =
519 set<RowID>::const_iterator
id = iuEntryIDs.begin();
520 for (;
id != iuEntryIDs.end();
id++) {
530 map<const IDF::IUImplementationLocation*, CostEstimates*> results;
531 set<const IDF::IUImplementationLocation*>::const_iterator iter =
536 if (
static_cast<int>(frequencyMHz) <= 0 &&
537 static_cast<int>(maxArea) <= 0) {
541 pair<const IDF::IUImplementationLocation*, CostEstimates*>(
551 if (area > maxArea &&
static_cast<int>(maxArea) > 0) {
557 double delayInNanoSeconds =
561 if ((1000/delayInNanoSeconds) < frequencyMHz) {
571 pair<const IDF::IUImplementationLocation*, CostEstimates*>(
572 (*iter), estimates));
604 const std::string& icDecoderHDB,
const double& frequency,
605 const double& maxArea) {
621 mach, icDecoder, icDecoderHDB, frequency, maxArea);
647 const std::string& icDecoderHDB,
const double& frequency,
648 const double& maxArea) {
650 for (
int i = 0; i < hdbRegistry.
hdbCount(); i++) {
657 selectFUs(mach, idf, frequency, maxArea);
663 selectIUs(mach, idf, frequency, maxArea);
666 std::vector<std::string> icDecPaths =
670 std::vector<std::string>::const_iterator iter = icDecPaths.begin();
671 for (; iter != icDecPaths.end(); iter++) {
672 std::string path = *iter;
693 const double& frequency,
const double& maxArea,
694 const bool& filterLongestPathDelay) {
698 for (
int i = 0; i < fuNav.
count(); i++) {
701 map<const IDF::FUImplementationLocation*, CostEstimates*> fuMap =
705 set<std::pair<const IDF::FUImplementationLocation*, CostEstimates*>,
709 i != fuMap.end(); i++) {
711 std::make_pair(i->first, i->second));
714 set<std::pair<const IDF::FUImplementationLocation*, CostEstimates*> >::
715 const_iterator iter = fuSet.begin();
716 if (fuMap.size() != 0) {
719 if (filterLongestPathDelay && maxArea > 0 && frequency > 0) {
720 double longestPathDelay = 0;
723 while (iter != fuSet.end()) {
725 if (estimate == NULL) {
726 std::string errorMsg =
"When selecting FUs regarding"
727 " longest path delay, no cost estimates were"
728 " found for FU: " + fu->
name();
730 __FILE__, __LINE__,
__func__, errorMsg, 1);
734 area = estimate->
area();
738 }
else if (longestPathDelay <
741 area = estimate->
area();
743 }
else if (longestPathDelay ==
745 area < estimate->area()) {
746 area = estimate->
area();
771 "no implementations found for FU: " + fu->
name());
785 const double& frequency,
const double& maxArea) {
789 for (
int i = 0; i < rfNav.
count(); i++) {
791 map<const IDF::RFImplementationLocation*, CostEstimates*> rfMap;
802 set<std::pair<const IDF::RFImplementationLocation*, CostEstimates*>,
implComp> rfSet;
803 for ( map<const IDF::RFImplementationLocation*, CostEstimates*>::const_iterator i = rfMap.begin();
804 i != rfMap.end(); i++) {
805 rfSet.insert(std::make_pair(i->first, i->second));
807 set<std::pair<const IDF::RFImplementationLocation*, CostEstimates*> >::const_iterator iter = rfSet.begin();
808 if (rfMap.size() != 0) {
809 double longestPathDelay = 0;
814 if (maxArea > 0 && frequency > 0) {
815 while (iter != rfSet.end()) {
817 if (estimate == NULL) {
818 std::string errorMsg =
"When selecting RFs regarding"
819 " longest path delay, no cost estimates were"
820 " found for RF: " + rf->
name();
822 __FILE__, __LINE__,
__func__, errorMsg, 1);
826 area = estimate->
area();
830 }
else if (longestPathDelay < estimate->longestPathDelay()) {
832 area = estimate->
area();
834 }
else if (longestPathDelay == estimate->
longestPathDelay() && area < estimate->area()) {
835 area = estimate->
area();
857 "no implementations found for RF: " + rf->
name());
869 const double& frequency,
const double& maxArea) {
873 for (
int index = 0; index < iuNav.
count(); index++) {
876 map<const IDF::IUImplementationLocation*, CostEstimates*> iuMap =
880 set<std::pair<const IDF::IUImplementationLocation*, CostEstimates*>,
implComp> iuSet;
881 for (map<const IDF::IUImplementationLocation*, CostEstimates*>::const_iterator i =
882 iuMap.begin(); i != iuMap.end(); i++) {
883 iuSet.insert(std::make_pair(i->first, i->second));
887 if (iuMap.size() != 0) {
888 double longestPathDelay = 0;
891 set<std::pair<const IDF::RFImplementationLocation*, CostEstimates*> >::const_iterator wanted = iter;
893 while (iter != iuSet.end()) {
895 if (estimate == NULL) {
896 std::string errorMsg =
"When selecting IUs regarding"
897 " longest path delay, no cost estimates were"
898 " found for IU: " + iu->
name();
900 __FILE__, __LINE__,
__func__, errorMsg, 1);
904 area = estimate->
area();
908 }
else if (longestPathDelay < estimate->longestPathDelay()) {
910 area = estimate->
area();
912 }
else if (longestPathDelay == estimate->
longestPathDelay() && area < estimate->area()) {
913 area = estimate->
area();
934 "no implementations found for IU: " + iu->
name());
static void writeToErrorLog(const std::string fileName, const int lineNumber, const std::string functionName, const std::string message, const int neededVerbosity=0)
virtual ~ComponentImplementationSelector()
std::set< std::string > usedHDBs_
HDBs from which implementations are serched are stored in this set.
void selectRFs(const TTAMachine::Machine *mach, IDF::MachineImplementation *idf, const double &frequency=0, const double &maxArea=0)
std::list< TTAMachine::FunctionUnit * > fuArchsByOpSetWithMinLatency(const std::set< std::string > &operationSet, int width=0) const
void selectFUs(const TTAMachine::Machine *mach, IDF::MachineImplementation *idf, const double &frequency=0, const double &maxArea=0, const bool &filterLongestPathDelay=true)
ComponentImplementationSelector()
std::map< const IDF::FUImplementationLocation *, CostEstimates * > fuImplementations(const TTAMachine::FunctionUnit &fu, double frequencyMHz=0, double maxArea=0)
std::map< const IDF::RFImplementationLocation *, CostEstimates * > rfImplementations(const TTAMachine::RegisterFile &rf, bool guarded=false, double frequencyMHz=0, double maxArea=0)
std::map< const IDF::IUImplementationLocation *, CostEstimates * > iuImplementations(const TTAMachine::ImmediateUnit &iu, double frequencyMHz=0, double maxArea=0)
void addHDB(const HDB::HDBManager &hdb)
void selectIUs(const TTAMachine::Machine *mach, IDF::MachineImplementation *idf, const double &frequency=0, const double &maxArea=0)
void selectComponentsToConf(DSDBManager::MachineConfiguration &conf, DSDBManager &dsdb, TTAMachine::Machine *mach=NULL, const std::string &icDecoder="ic_hdb", const std::string &icDecoderHDB="asic_130nm_1.5V.hdb", const double &frequency=0, const double &maxArea=0)
CostEstimator::Estimator estimator_
Cost estimator to estimate the unit costs.
void addCase(const TTAProgram::Program &program, const ExecutionTrace &traceDB)
IDF::MachineImplementation * selectComponents(const TTAMachine::Machine *mach, const std::string &icDecoder="ic_hdb", const std::string &icDecoderHDB="asic_130nm_1.5V.hdb", const double &frequency=0, const double &maxArea=0)
void setLongestPathDelay(double delay)
void setArea(double area)
double longestPathDelay() const
DelayInNanoSeconds registerFileMaximumComputationDelay(const TTAMachine::BaseRegisterFile &architecture, const IDF::RFImplementationLocation &implementationEntry)
DelayInNanoSeconds functionUnitMaximumComputationDelay(const TTAMachine::FunctionUnit &architecture, const IDF::FUImplementationLocation &implementation)
AreaInGates registerFileArea(const TTAMachine::BaseRegisterFile &architecture, const IDF::RFImplementationLocation &implementationEntry)
AreaInGates functionUnitArea(const TTAMachine::FunctionUnit &architecture, const IDF::FUImplementationLocation &implementationEntry)
TTAMachine::Machine * architecture(RowID id) const
RowID addImplementation(const IDF::MachineImplementation &impl, double longestPathDelay, CostEstimator::AreaInGates area)
static std::vector< std::string > icDecoderPluginPaths(bool libraryPathsOnly=false)
std::string errorMessage() const
void setCause(const Exception &cause)
static const std::string DIRECTORY_SEPARATOR
static bool fileExists(const std::string fileName)
virtual FUArchitecture * fuArchitectureByID(RowID id) const
TTAMachine::FunctionUnit & architecture() const
std::set< RowID > fuEntriesByArchitecture(const TTAMachine::FunctionUnit &fu) const
std::set< RowID > fuArchitectureIDsByOperationSet(const std::set< std::string > &operationNames) const
std::string fileName() const
std::set< RowID > rfEntriesByArchitecture(int readPorts, int writePorts, int bidirPorts, int maxReads, int maxWrites, int latency, bool guardSupport, int guardLatency=0, int width=0, int size=0, bool zeroRegister=false) const
static HDBRegistry & instance()
CachedHDBManager & hdb(const std::string fileName)
void setICDecoderHDB(const std::string &file)
void setICDecoderPluginFile(const std::string &file)
void addIUImplementation(RFImplementationLocation *implementation)
void addRFImplementation(RFImplementationLocation *implementation)
void addFUImplementation(FUImplementationLocation *implementation)
void setICDecoderPluginName(const std::string &name)
ObjectState * saveState() const
virtual int width() const
virtual int numberOfRegisters() const
virtual int width() const
virtual RFPort * port(const std::string &name) const
virtual TCEString name() const
virtual bool isTriggering() const
virtual HWOperation * operation(const std::string &name) const
virtual int operationCount() const
virtual int maxLatency() const
virtual BaseFUPort * port(const std::string &name) const
const std::string & name() const
ComponentType * item(int index) const
virtual RegisterFileNavigator registerFileNavigator() const
virtual FunctionUnitNavigator functionUnitNavigator() const
virtual ImmediateUnitNavigator immediateUnitNavigator() const
virtual Socket * outputSocket() const
virtual Socket * inputSocket() const
virtual int maxReads() const
virtual bool zeroRegister() const
virtual int guardLatency() const
virtual bool isUsedAsGuard() const
virtual int maxWrites() const
virtual int portCount() const
UnitImplementationLocation IUImplementationLocation
UnitImplementationLocation RFImplementationLocation
UnitImplementationLocation FUImplementationLocation