Go to the documentation of this file.
40 #include <boost/regex.hpp>
77 searchStrategy_(NULL), hdb_(hdb), registerFilesBuilt_(
false),
146 for (CostDBTypes::EntryTable::iterator j = i->second.begin();
147 j != i->second.end(); j++) {
207 RowID rfEstimatorPluginID = 0;
208 std::set<RowID>::const_iterator pluginID = pluginIDs.begin();
209 for (; pluginID != pluginIDs.end(); pluginID++) {
211 if (plugin->
name() == rfEstimatorPluginName) {
213 rfEstimatorPluginID = *pluginID;
218 bool useCompiledQueries =
false;
222 std::set<RowID>::const_iterator
id = rfs.begin();
223 for (;
id != rfs.end();
id++) {
233 bool guardSupport =
false;
234 int guardLatency = 0;
337 std::set<RowID>::const_iterator dataID = dataIDs.begin();
338 for (; dataID != dataIDs.end(); dataID++) {
340 if (data.
name() ==
"area") {
344 if (data.
name() ==
"computation_delay") {
351 dataID = dataIDs.begin();
353 for (; dataID != dataIDs.end(); dataID++) {
355 const std::string dataName = data.
name();
359 if (dataName ==
"input_delay") {
364 boost::smatch match =
365 getValues(dataName,
"input_delay[ \t]*(\\S+)");
366 if (match.size() == 2) {
377 if (dataName ==
"output_delay") {
383 match =
getValues(dataName,
"output_delay[ \t]*(\\S+)");
384 if (match.size() == 2) {
392 if (dataName ==
"output_delay") {
402 getValues(dataName,
"rf_access_energy ([0-9])* ([0-9])*");
403 if (match.size() == 3) {
415 if (dataName ==
"rf_idle_energy") {
427 if (useCompiledQueries) {
444 RowID fuEstimatorPluginID = 0;
445 std::set<RowID>::const_iterator pluginID = pluginIDs.begin();
446 for (; pluginID != pluginIDs.end(); pluginID++) {
448 if (plugin->
name() == fuEstimatorPluginName) {
449 fuEstimatorPluginID = *pluginID;
454 bool useCompiledQueries =
false;
458 std::set<RowID>::const_iterator
id = fus.begin();
459 for (;
id != fus.end();
id++) {
461 set<string> operations;
462 set<vector<string> > parameters;
463 vector<string> portSet;
464 #ifdef CAUSE_COMPILER_WARNING_AND_NOT_USED_REMOVE_IF_NOT_EVER_NEEDED
465 int operationCount = 0;
485 #ifdef CAUSE_COMPILER_WARNING_AND_NOT_USED_REMOVE_IF_NOT_EVER_NEEDED
492 for (i = 0; i < ports; i++) {
495 if (
dynamic_cast<FUPort*
>(port) != NULL) {
503 width = fuPort->
width();
504 }
else if (width != fuPort->
width()) {
538 std::set<RowID>::const_iterator dataID = dataIDs.begin();
539 for (; dataID != dataIDs.end(); dataID++) {
541 if (data.
name() ==
"area") {
545 if (data.
name() ==
"computation_delay") {
554 dataID = dataIDs.begin();
555 for (; dataID != dataIDs.end(); dataID++) {
557 const std::string dataName = data.
name();
561 if (dataName ==
"input_delay") {
562 newStatistics->
setDelay(
"input_delay",
567 boost::smatch match =
568 getValues(dataName,
"input_delay[ \t]*(\\S+)");
569 if (match.size() == 2) {
580 if (dataName ==
"output_delay") {
587 dataName,
"output_delay[ \t]*(\\S+)");
588 if (match.size() == 2) {
596 dataName,
"(output_delay)");
597 if (match.size() == 2) {
607 dataName,
"operation_execution_energy (\\S+)");
608 if (match.size() == 2) {
617 if (dataName ==
"fu_idle_energy") {
629 if (useCompiledQueries) {
645 RowID busEstimatorPluginID = 0;
646 std::set<RowID>::const_iterator pluginID = pluginIDs.begin();
647 for (; pluginID != pluginIDs.end(); pluginID++) {
649 if (plugin->
name() == busEstimatorPluginName) {
650 busEstimatorPluginID = *pluginID;
657 std::set<RowID>::const_iterator
id = buses.begin();
658 for (;
id != buses.end();
id++) {
663 #ifdef CAUSE_COMPILER_WARNING_AND_NOT_USED_REMOVE_IF_NOT_EVER_NEEDED
668 double activeEnergy = 0.0;
669 double idleEnergy = 0.0;
675 std::set<RowID>::const_iterator dataID = dataIDs.begin();
676 for (; dataID != dataIDs.end(); dataID++) {
678 if (data.
name() ==
"area") {
682 if (data.
name() ==
"computation_delay") {
686 if (data.
name() ==
"fanin") {
690 if (data.
name() ==
"fanout") {
694 if (data.
name() ==
"dataw") {
698 if (data.
name() ==
"cntrl_delay") {
699 #ifdef CAUSE_COMPILER_WARNING_AND_NOT_USED_REMOVE_IF_NOT_EVER_NEEDED
704 if (data.
name() ==
"energy") {
708 if (data.
name() ==
"idle_energy") {
761 RowID socketEstimatorPluginID = 0;
762 std::set<RowID>::const_iterator pluginID = pluginIDs.begin();
763 for (; pluginID != pluginIDs.end(); pluginID++) {
765 if (plugin->
name() == socketEstimatorPluginName) {
766 socketEstimatorPluginID = *pluginID;
773 std::set<RowID>::const_iterator
id = sockets.begin();
774 for (;
id != sockets.end();
id++) {
782 double activeEnergy = 0.0;
783 double idleEnergy = 0.0;
789 std::set<RowID>::const_iterator dataID = dataIDs.begin();
790 for (; dataID != dataIDs.end(); dataID++) {
792 if (data.
name() ==
"area") {
796 if (data.
name() ==
"computation_delay") {
800 if (data.
name() ==
"fanin") {
804 if (data.
name() ==
"fanout") {
808 if (data.
name() ==
"dataw") {
812 if (data.
name() ==
"cntrl_delay") {
816 if (data.
name() ==
"energy") {
820 if (data.
name() ==
"idle_energy") {
829 newStatistics->
setDelay(
"cntrl_delay", cntrlDelay);
891 EntryMap::const_iterator i =
entries_.find(searchKey.
type());
895 throw KeyNotFound(__FILE__, __LINE__,
"CostDatabase::search");
913 newEntries.push_back(entry);
914 entries_.insert(pair<const EntryKeyProperty*, CostDBTypes::EntryTable>(
915 entry->
type(), newEntries));
920 for (CostDBTypes::EntryTable::iterator j = i->second.begin();
921 j != i->second.end(); j++) {
923 if ((*j)->isEqualKey(*entry)) {
926 "CostDatabase::insertEntry");
930 (*j)->addStatistics(newStats);
935 i->second.push_back(entry);
1002 boost::regex regx(regex +
".*");
1004 if (boost::regex_match(text, what, regx, boost::match_extra)) {
1007 boost::smatch empty;
static const std::string EK_RFILE
Entry type for register files.
int statisticsCount() const
void buildSockets(const std::string &socketEstimatorPluginName)
CostFunctionPlugin & costFunction() const
static const std::string EKF_GUARD_SUPPORT
Field type for guard support in an entry.
virtual SearchStrategy * copy() const =0
static const std::string EKF_BIT_WIDTH
Field type for bit width of an entry.
std::vector< MatchType * > MatchTypeTable
Table of types of match.
const HDB::HDBManager & hdb_
HDB used for creating cost database.
bool hasParameterizedWidth(const std::string &port) const
const EntryKeyProperty * type() const
SearchStrategy * searchStrategy_
Search strategy used for queries.
CostDatabase & costDatabase(const HDB::HDBManager &hdb)
boost::smatch getValues(const std::string &text, const std::string ®ex)
Finds string matches using regular expressions.
void buildRegisterFiles(const std::string &rfEstimatorPluginName)
static EntryKeyProperty * create(std::string type)
static const std::string EKF_WRITE_PORTS
Field type for number of write ports in an entry.
std::set< RowID > costFunctionPluginIDs() const
static const std::string EK_INLINE_IMM_SOCKET
Entry type for immediate sockets.
#define IGNORE_CLANG_WARNING(X)
std::vector< CostDBEntry * > EntryTable
Table of database entries.
TTAMachine::FunctionUnit & architecture() const
void addStatistics(CostDBEntryStats *newStats)
int RowID
Type definition of row ID in relational databases.
void setFUReference(RowID fuEntryID)
void setRFReference(RowID rfEntryID)
virtual BaseFUPort * port(const std::string &name) const
void addCostDatabase(CostDatabase *costDatabase, const HDB::HDBManager &hdb)
static const std::string EK_UNIT
Entry type for function units.
CostEstimationData costEstimationData(RowID id) const
CostFunctionPlugin * costFunctionPluginByID(RowID pluginID) const
void buildDefaultCostDatabase()
virtual int maxLatency() const
bool hasCostFunction() const
virtual void setEnergyOperation(const std::string &name, double energy)
RFArchitecture & architecture() const
virtual double doubleValue() const
static CostDatabaseRegistry & instance()
static const std::string EKF_NUM_REGISTERS
Field type for number of registers in an entry.
virtual int integerValue() const
bool busesBuilt_
Flag to note is buses built.
virtual bool hasArchitecture() const
CostDBTypes::EntryTable search(const CostDBEntryKey &searchKey, const CostDBTypes::MatchTypeTable &match) const
void setBusReference(RowID busEntryID)
void addField(EntryKeyField *field)
std::set< RowID > fuEntryIDs() const
static const std::string EKF_BUS_FANIN
Field type for fanin of bus in an entry.
FUArchitecture & architecture() const
virtual void setDelay(const std::string &port, double delay)
CostDatabase(const HDB::HDBManager &hdb)
CostDatabase must be created with instance() method.
static const std::string EK_OUTPUT_SOCKET
Entry type for output sockets.
std::set< RowID > socketEntryIDs() const
virtual CostDBEntryStats * copy() const
bool hasCostDatabase(const HDB::HDBManager &hdb)
static const std::string EK_INPUT_SOCKET
Entry type for input sockets.
const EntryKeyProperty * type() const
static const std::string EKF_OUTPUT_SOCKET_FANOUT
Field type for fanout of output socket in an entry.
virtual void setEnergyIdle(double energy)
static const std::string EKF_BIDIR_PORTS
Field type for number of bidirectional ports in an entry.
static const std::string EKF_INPUT_SOCKET_FANIN
Field type for fanin of input socket in an entry.
virtual int portCount() const
std::set< RowID > busEntryIDs() const
virtual void setEnergyReadWrite(int reads, int writes, double energy)
std::set< RowID > rfEntryIDs() const
static const std::string EKF_BUS_FANOUT
Field type for fanout of bus in an entry.
void buildFunctionUnits(const std::string &fuEstimatorPluginName)
virtual CostDBTypes::EntryTable search(const CostDBEntryKey &searchKey, CostDBTypes::EntryTable components, const CostDBTypes::MatchTypeTable &match)=0
bool hasGuardSupport() const
const CostDBEntryStats & statistics(int index) const
virtual std::set< RowID > costEstimationDataIDs(const CostEstimationData &match, bool useCompiledQueries=false, RelationalDBQueryResult *compiledQuery=NULL) const
bool registerFilesBuilt_
Flag to note is register files built.
find Finds info of the inner loops in the false
virtual void setEnergyActive(double energy)
static const std::string EKF_MAX_WRITES
Field type for number of max simultaneous writes in an entry.
EntryMap entries_
Database entries.
void setPluginID(RowID pluginID)
virtual std::string name() const
static const std::string EKF_FUNCTION_UNIT
Field type for function unit entry;.
int readPortCount() const
bool socketsBuilt_
Flag to note is sockets built.
void setSocketReference(RowID socketEntryID)
static const std::string EKF_READ_PORTS
Field type for number of read ports in an entry.
bool functionUnitsBuilt_
Flag to note is function units built.
static const std::string EKF_MAX_READS
Field type for number of max simultaneous reads in an entry.
static int toInt(const T &source)
bool isRegisterFilesBuilt()
static EntryKeyProperty * find(std::string type)
int bidirPortCount() const
static const std::string EKF_GUARD_LATENCY
Field type for guard latency in an entry.
static const std::string EK_MBUS
Entry type for move bus.
void setSearchStrategy(SearchStrategy *strategy)
virtual void deleteCostEstimationDataIDsQueries() const =0
static const std::string EKF_LATENCY
Field type for latency of an entry.
EntryKeyFieldProperty * createFieldProperty(std::string field)
FUEntry * fuByEntryID(RowID id) const
void insertEntry(CostDBEntry *entry)
static const std::string EK_SOCKET
Entry type for sockets.
EntryKeyFieldProperty * fieldProperty(std::string field) const
void buildBuses(const std::string &busEstimatorPluginName)
virtual bool hasArchitecture() const
virtual int width() const
int writePortCount() const
RFEntry * rfByEntryID(RowID id) const
static CostDatabase * instance_
Unique instance of the class.
bool isFunctionUnitsBuilt()
static CostDatabase & instance(const HDB::HDBManager &hdb)