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;
#define IGNORE_CLANG_WARNING(X)
int RowID
Type definition of row ID in relational databases.
find Finds info of the inner loops in the false
static int toInt(const T &source)
void addField(EntryKeyField *field)
const EntryKeyProperty * type() const
virtual void setEnergyOperation(const std::string &name, double energy)
virtual void setEnergyReadWrite(int reads, int writes, double energy)
virtual CostDBEntryStats * copy() const
virtual void setEnergyIdle(double energy)
virtual void setEnergyActive(double energy)
virtual void setDelay(const std::string &port, double delay)
const EntryKeyProperty * type() const
void addStatistics(CostDBEntryStats *newStats)
const CostDBEntryStats & statistics(int index) const
int statisticsCount() const
static const std::string EKF_READ_PORTS
Field type for number of read ports in an entry.
static const std::string EK_INPUT_SOCKET
Entry type for input sockets.
static const std::string EKF_INPUT_SOCKET_FANIN
Field type for fanin of input socket in an entry.
static const std::string EKF_OUTPUT_SOCKET_FANOUT
Field type for fanout of output socket in an entry.
static const std::string EKF_MAX_WRITES
Field type for number of max simultaneous writes in an entry.
static const std::string EK_SOCKET
Entry type for sockets.
static const std::string EK_UNIT
Entry type for function units.
static const std::string EKF_BIDIR_PORTS
Field type for number of bidirectional ports in an entry.
static const std::string EK_INLINE_IMM_SOCKET
Entry type for immediate sockets.
static const std::string EKF_GUARD_SUPPORT
Field type for guard support in an entry.
std::vector< MatchType * > MatchTypeTable
Table of types of match.
static const std::string EKF_BUS_FANOUT
Field type for fanout of bus in an entry.
static const std::string EKF_LATENCY
Field type for latency of an entry.
static const std::string EK_OUTPUT_SOCKET
Entry type for output sockets.
static const std::string EKF_GUARD_LATENCY
Field type for guard latency in an entry.
static const std::string EKF_FUNCTION_UNIT
Field type for function unit entry;.
static const std::string EKF_MAX_READS
Field type for number of max simultaneous reads in an entry.
static const std::string EKF_WRITE_PORTS
Field type for number of write ports in an entry.
static const std::string EK_RFILE
Entry type for register files.
static const std::string EK_MBUS
Entry type for move bus.
static const std::string EKF_BUS_FANIN
Field type for fanin of bus in an entry.
static const std::string EKF_NUM_REGISTERS
Field type for number of registers in an entry.
std::vector< CostDBEntry * > EntryTable
Table of database entries.
static const std::string EKF_BIT_WIDTH
Field type for bit width of an entry.
bool hasCostDatabase(const HDB::HDBManager &hdb)
static CostDatabaseRegistry & instance()
CostDatabase & costDatabase(const HDB::HDBManager &hdb)
void addCostDatabase(CostDatabase *costDatabase, const HDB::HDBManager &hdb)
boost::smatch getValues(const std::string &text, const std::string ®ex)
Finds string matches using regular expressions.
void buildBuses(const std::string &busEstimatorPluginName)
static CostDatabase & instance(const HDB::HDBManager &hdb)
void buildSockets(const std::string &socketEstimatorPluginName)
void setSearchStrategy(SearchStrategy *strategy)
void buildRegisterFiles(const std::string &rfEstimatorPluginName)
void buildFunctionUnits(const std::string &fuEstimatorPluginName)
void buildDefaultCostDatabase()
static CostDatabase * instance_
Unique instance of the class.
bool busesBuilt_
Flag to note is buses built.
bool isRegisterFilesBuilt()
bool socketsBuilt_
Flag to note is sockets built.
bool functionUnitsBuilt_
Flag to note is function units built.
CostDatabase(const HDB::HDBManager &hdb)
CostDatabase must be created with instance() method.
void insertEntry(CostDBEntry *entry)
bool registerFilesBuilt_
Flag to note is register files built.
const HDB::HDBManager & hdb_
HDB used for creating cost database.
EntryMap entries_
Database entries.
CostDBTypes::EntryTable search(const CostDBEntryKey &searchKey, const CostDBTypes::MatchTypeTable &match) const
bool isFunctionUnitsBuilt()
SearchStrategy * searchStrategy_
Search strategy used for queries.
void setBusReference(RowID busEntryID)
void setPluginID(RowID pluginID)
void setRFReference(RowID rfEntryID)
void setSocketReference(RowID socketEntryID)
void setFUReference(RowID fuEntryID)
virtual double doubleValue() const
virtual int integerValue() const
static EntryKeyProperty * find(std::string type)
static EntryKeyProperty * create(std::string type)
EntryKeyFieldProperty * createFieldProperty(std::string field)
EntryKeyFieldProperty * fieldProperty(std::string field) const
bool hasParameterizedWidth(const std::string &port) const
TTAMachine::FunctionUnit & architecture() const
FUArchitecture & architecture() const
virtual bool hasArchitecture() const
bool hasCostFunction() const
CostFunctionPlugin & costFunction() const
FUEntry * fuByEntryID(RowID id) const
CostFunctionPlugin * costFunctionPluginByID(RowID pluginID) const
virtual std::set< RowID > costEstimationDataIDs(const CostEstimationData &match, bool useCompiledQueries=false, RelationalDBQueryResult *compiledQuery=NULL) const
CostEstimationData costEstimationData(RowID id) const
std::set< RowID > socketEntryIDs() const
std::set< RowID > rfEntryIDs() const
std::set< RowID > costFunctionPluginIDs() const
std::set< RowID > busEntryIDs() const
RFEntry * rfByEntryID(RowID id) const
std::set< RowID > fuEntryIDs() const
virtual void deleteCostEstimationDataIDsQueries() const =0
int readPortCount() const
bool hasGuardSupport() const
int writePortCount() const
int bidirPortCount() const
RFArchitecture & architecture() const
virtual bool hasArchitecture() const
virtual CostDBTypes::EntryTable search(const CostDBEntryKey &searchKey, CostDBTypes::EntryTable components, const CostDBTypes::MatchTypeTable &match)=0
virtual SearchStrategy * copy() const =0
virtual int width() const
virtual int maxLatency() const
virtual BaseFUPort * port(const std::string &name) const
virtual std::string name() const
virtual int portCount() const