OpenASIP 2.2
Loading...
Searching...
No Matches
Classes | Public Types | Public Member Functions | Static Public Member Functions | Protected Member Functions | Private Types | Private Member Functions | Static Private Member Functions | Private Attributes | Static Private Attributes | Friends | List of all members
HDB::HDBManager Class Referenceabstract

#include <HDBManager.hh>

Inheritance diagram for HDB::HDBManager:
Inheritance graph
Collaboration diagram for HDB::HDBManager:
Collaboration graph

Classes

struct  PipelineElementUsage
 

Public Types

typedef std::list< DataObjectDataObjectList
 

Public Member Functions

virtual ~HDBManager ()
 
std::string fileName () const
 
RowID addCostFunctionPlugin (const CostFunctionPlugin &plugin) const
 
virtual void removeCostFunctionPlugin (RowID pluginID) const
 
RowID addFUArchitecture (const FUArchitecture &architecture) const
 
bool canRemoveFUArchitecture (RowID archID) const
 
virtual void removeFUArchitecture (RowID archID) const
 
RowID addFUEntry () const
 
virtual void removeFUEntry (RowID id) const
 
RowID addFUImplementation (const FUEntry &entry) const
 
virtual void removeFUImplementation (RowID implementationID) const
 
void setArchitectureForFU (RowID fuID, RowID archID) const
 
void unsetArchitectureForFU (RowID fuID) const
 
RowID addRFArchitecture (const RFArchitecture &architecture) const
 
bool canRemoveRFArchitecture (RowID archID) const
 
virtual void removeRFArchitecture (RowID archID) const
 
RowID addRFEntry () const
 
virtual void removeRFEntry (RowID id) const
 
RowID addRFImplementation (const RFImplementation &implementation, RowID rfEntryID)
 
virtual void removeRFImplementation (RowID implID) const
 
void setArchitectureForRF (RowID rfID, RowID archID) const
 
void unsetArchitectureForRF (RowID rfID) const
 
void setCostFunctionPluginForFU (RowID fuID, RowID pluginID) const
 
void unsetCostFunctionPluginForFU (RowID fuID) const
 
void setCostFunctionPluginForRF (RowID rfID, RowID pluginID) const
 
void unsetCostFunctionPluginForRF (RowID rfID) const
 
std::set< RowIDfuEntryIDs () const
 
std::set< RowIDrfEntryIDs () const
 
std::set< RowIDbusEntryIDs () const
 
std::set< RowIDsocketEntryIDs () const
 
std::set< RowIDOperationImplementationIDs () const
 
std::set< RowIDOperationImplementationResourceIDs () const
 
OperationImplementation OperationImplementationByID (RowID id) const
 
OperationImplementationResource OperationImplementationResourceByID (RowID id) const
 
void addOperationImplementationResource (const OperationImplementationResource &resource)
 
void addOperationImplementation (const OperationImplementation &operation)
 
void removeOperationImplementation (RowID id)
 
void removeOperationImplementationResource (RowID id)
 
std::set< RowIDfuArchitectureIDs () const
 
std::set< RowIDfuArchitectureIDsByOperationSet (const std::set< std::string > &operationNames) const
 
std::set< RowIDrfArchitectureIDs () const
 
RowID fuEntryIDOfImplementation (RowID implID) const
 
RowID rfEntryIDOfImplementation (RowID implID) const
 
FUEntryfuByEntryID (RowID id) const
 
RFEntryrfByEntryID (RowID id) const
 
virtual FUArchitecturefuArchitectureByID (RowID id) const
 
virtual RFArchitecturerfArchitectureByID (RowID id) const
 
std::set< RowIDfuEntriesByArchitecture (const TTAMachine::FunctionUnit &fu) const
 
std::set< RowIDrfEntriesByArchitecture (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
 
virtual DataObject costEstimationDataValue (const std::string &valueName, const std::string &pluginName) const
 
DataObject costEstimationDataValue (RowID entryId) const
 
RowID addFUCostEstimationData (RowID fuID, const std::string &valueName, const std::string &value, RowID pluginID) const
 
RowID addRFCostEstimationData (RowID rfID, const std::string &valueName, const std::string &value, RowID pluginID) const
 
DataObject fuCostEstimationData (const std::string &valueName, RowID implementationId, const std::string &pluginName) const
 
DataObject rfCostEstimationData (const std::string &valueName, RowID implementationId, const std::string &pluginName) const
 
RowID addBusEntry () const
 
virtual void removeBusEntry (RowID id) const
 
RowID addBusCostEstimationData (RowID busID, const std::string &valueName, const std::string &value, RowID pluginID) const
 
DataObject busCostEstimationData (const std::string &valueName, RowID busID, const std::string &pluginName) const
 
DataObjectListbusCostEstimationDataList (const std::string &valueName, RowID implementationId, const std::string &pluginName) const
 
RowID addSocketEntry () const
 
virtual void removeSocketEntry (RowID id) const
 
RowID addSocketCostEstimationData (RowID socketID, const std::string &valueName, const std::string &value, RowID pluginID) const
 
DataObject socketCostEstimationData (const std::string &valueName, RowID socketID, const std::string &pluginName) const
 
DataObjectListsocketCostEstimationDataList (const std::string &valueName, RowID implementationID, const std::string &pluginName) const
 
std::set< RowIDfuCostEstimationDataIDs (RowID fuImplID) const
 
std::set< RowIDrfCostEstimationDataIDs (RowID rfImplID) const
 
std::set< RowIDbusCostEstimationDataIDs (RowID busID) const
 
std::set< RowIDsocketCostEstimationDataIDs (RowID socketID) const
 
CostEstimationData costEstimationData (RowID id) const
 
std::set< RowIDcostFunctionPluginIDs () const
 
std::set< RowIDcostFunctionPluginDataIDs (RowID pluginID) const
 
CostFunctionPlugincostFunctionPluginByID (RowID pluginID) const
 
virtual std::set< RowIDcostEstimationDataIDs (const CostEstimationData &match, bool useCompiledQueries=false, RelationalDBQueryResult *compiledQuery=NULL) const
 
RowID addCostEstimationData (const CostEstimationData &data) const
 
virtual void removeCostEstimationData (RowID id) const
 
virtual void modifyCostEstimationData (RowID id, const CostEstimationData &data)
 
virtual void modifyCostFunctionPlugin (RowID id, const CostFunctionPlugin &plugin)
 
virtual void deleteCostEstimationDataIDsQueries () const =0
 
std::list< std::string > blockSourceFile ()
 

Static Public Member Functions

static void createNew (const std::string &file)
 
static std::string formatString (BlockImplementationFile::Format format)
 

Protected Member Functions

virtual RFImplementationcreateImplementationOfRF (RowID id) const
 
virtual FUImplementationcreateImplementationOfFU (FUArchitecture &architecture, RowID id) const
 
void createCostEstimatioDataIdsQuery (const CostEstimationData &match, std::string *query, RelationalDBQueryResult *compiledQuery=NULL, short int *queryHash=NULL, bool createBindableQuery=false) const
 
RelationalDBConnectiongetDBConnection () const
 
 HDBManager (const std::string &hdbFile)
 

Private Types

typedef std::vector< PipelineElementUsagePipelineElementUsageTable
 

Private Member Functions

bool hasFUEntry (RowID id) const
 
bool hasRFEntry (RowID id) const
 
bool hasBusEntry (RowID id) const
 
bool hasSocketEntry (RowID id) const
 
bool hasCostEstimationDataByID (RowID id) const
 
bool hasCostFunctionPluginByID (RowID id) const
 
bool fuEntryHasArchitecture (RowID id) const
 
bool rfEntryHasArchitecture (RowID id) const
 
bool containsOperation (const std::string &opName) const
 
bool containsImplementationFile (const std::string &pathToFile) const
 
bool containsFUArchitecture (RowID id) const
 
bool containsRFArchitecture (RowID id) const
 
RowID fuArchitectureID (RowID fuEntryID) const
 
RowID rfArchitectureID (RowID rfEntryID) const
 
bool hasColumn (const std::string &table, const std::string &columnName) const
 
int addBooleanColumn (const std::string &table, const std::string &newcolumn)
 
CostFunctionPlugincreateCostFunctionOfFU (RowID id) const
 
CostFunctionPlugincreateCostFunctionOfRF (RowID id) const
 
void addPortsAndBindingsToFUArchitecture (FUArchitecture &architecture, RowID id) const
 
void addOperationPipelinesToFUArchitecture (FUArchitecture &architecture, RowID id) const
 
std::string resolveArchitecturePort (const FUArchitecture &architecture, RowID entryID, const std::string &implementedPort) const
 
void addOpcodesToImplementation (FUImplementation &implementation, RowID entryID) const
 
void addDataPortsToImplementation (FUImplementation &implementation, FUArchitecture &architecture, RowID entryID) const
 
void addFUExternalPortsToImplementation (FUImplementation &implementation, RowID entryID) const
 
void addRFExternalPortsToImplementation (RFImplementation &implementation, RowID entryID) const
 
void addFUParametersToImplementation (FUImplementation &implementation, RowID entryID) const
 
void addRFParametersToImplementation (RFImplementation &implementation, RowID entryID) const
 
void addBlockImplementationFiles (FUImplementation &implementation, RowID entryID) const
 
void addDataPortsToImplementation (RFImplementation &implementation, RowID entryID) const
 
void addBlockImplementationFiles (RFImplementation &implementation, RowID entryID) const
 
void addBlockImplementationFileToHDB (const BlockImplementationFile &file) const
 
void createCostEstimatioDataIdsQuery (const CostEstimationData &match, std::string &query) const
 

Static Private Member Functions

static bool isMatchingArchitecture (const TTAMachine::FunctionUnit &fu, const FUArchitecture &arch)
 
static bool areCompatiblePipelines (const PipelineElementUsageTable &table)
 
static void insertFileFormats (RelationalDBConnection &connection)
 
static BlockImplementationFile::Format fileFormat (const std::string &formatString)
 
static std::string directionString (HDB::Direction direction)
 
static std::string fuEntryByIDQuery (RowID id)
 
static std::string rfEntryByIDQuery (RowID id)
 
static std::string busEntryByIDQuery (RowID id)
 
static std::string socketEntryByIDQuery (RowID id)
 
static std::string fuArchitectureByIDQuery (RowID id)
 
static std::string fuPortsAndBindingsByIDQuery (RowID id)
 
static std::string ioUsageDataByIDQuery (RowID id)
 
static std::string resourceUsageDataByIDQuery (RowID id)
 
static std::string fuImplementationByIDQuery (RowID id)
 
static std::string opcodesByIDQuery (RowID id)
 
static std::string fuImplementationDataPortsByIDQuery (RowID id)
 
static std::string fuExternalPortsByIDQuery (RowID id)
 
static std::string rfExternalPortsByIDQuery (RowID id)
 
static std::string fuPortBindingByNameQuery (RowID fuID, const std::string &portName)
 
static std::string fuImplementationParametersByIDQuery (RowID id)
 
static std::string rfImplementationParametersByIDQuery (RowID id)
 
static std::string fuSourceFilesByIDQuery (RowID id)
 
static std::string rfArchitectureByIDQuery (RowID id)
 
static std::string rfImplementationByIDQuery (RowID id)
 
static std::string rfImplementationByIDQuery2 (RowID id)
 
static std::string rfImplementationDataPortsByIDQuery (RowID id)
 
static std::string rfSourceFilesByIDQuery (RowID id)
 

Private Attributes

SQLitedb_
 Handle to the database.
 
RelationalDBConnectiondbConnection_
 Handle to the database connection.
 
std::string hdbFile_
 The HDB file to manager.
 

Static Private Attributes

static HDBManagerinstance_ = NULL
 Unique instance of the HDBManager.
 

Friends

class HDBManagerTest
 

Detailed Description

Class used to access hardware database (HDB).

Provides methods to create new HDB and to search, add, and remove blocks from/to HDB. There can exist only one HDBManager instance per database at the same time because HDBManager creates a connection to the database in its constructor and does not close the connection unless the HDBManager instance is deleted. And there cannot be several connections to the same database at the same time.

Definition at line 82 of file HDBManager.hh.

Member Typedef Documentation

◆ DataObjectList

Definition at line 86 of file HDBManager.hh.

◆ PipelineElementUsageTable

Definition at line 297 of file HDBManager.hh.

Constructor & Destructor Documentation

◆ ~HDBManager()

HDB::HDBManager::~HDBManager ( )
virtual

The destructor.

Definition at line 520 of file HDBManager.cc.

520 {
522 delete db_;
523}
RelationalDBConnection * dbConnection_
Handle to the database connection.
SQLite * db_
Handle to the database.
virtual void close(const RelationalDBConnection &connection)
Definition SQLite.cc:100

References SQLite::close(), db_, and dbConnection_.

Here is the call graph for this function:

◆ HDBManager()

HDB::HDBManager::HDBManager ( const std::string &  hdbFile)
protected

The constructor.

Parameters
hdbFileName of the HDB file to be managed by the manager.
Exceptions
IOExceptionIf connection to the DB cannot be established.

Definition at line 394 of file HDBManager.cc.

395 : db_(new SQLite()), dbConnection_(NULL), hdbFile_(hdbFile) {
396 if (!FileSystem::fileExists(hdbFile)) {
397 string errorMsg = "File '" + hdbFile + "' doesn't exist.";
398 throw FileNotFound(__FILE__, __LINE__, __func__, errorMsg);
399 }
400
401 if (!FileSystem::fileIsReadable(hdbFile)) {
402 string errorMsg = "File '" + hdbFile + "' has no read rights.";
403 throw IOException(__FILE__, __LINE__, __func__, errorMsg);
404 }
405
406 try {
407 dbConnection_ = &db_->connect(hdbFile);
408 } catch (const RelationalDBException& exception) {
409 throw IOException(
410 __FILE__, __LINE__, __func__, exception.errorMessage());
411 }
412
413 // Update outdated HDB.
414 // Version 0 indicates db without version number also.
415 int dbVersion = dbConnection_->version();
416
417 // Version 0 -> 1
418 if (dbVersion < 1) {
419 // Initial fu-gen tables and fugen stuff.
426 dbConnection_->updateQuery(std::string(
427 "INSERT INTO format(id,format) VALUES"
428 "(NULL,\"" + VHDL_SIM_FORMAT + "\");"));
429 dbConnection_->updateQuery(std::string(
430 "INSERT INTO format(id,format) VALUES"
431 "(NULL,\"" + VERILOG_SIM_FORMAT + "\");"));
433 }
434
435 // Version 1 -> 2
436 if (dbVersion < 2) {
437 // Variables for operation snippets.
440 }
441
442 // Version 2 -> 3
443 if (dbVersion < 3) {
444 // ipxact to resource table
445 dbConnection_->updateQuery(std::string(
446 "ALTER TABLE operation_implementation_resource ADD COLUMN "
447 "ipxact TEXT;"));
449 }
450
451 // Version 3 -> 4
452 if (dbVersion < 4) {
453 // support for post-operation (for LOADs) and
454 // operation bus definitions for FUGen.
455 dbConnection_->updateQuery(std::string(
456 "ALTER TABLE operation_implementation ADD COLUMN "
457 "bus_definition TEXT;"));
458 dbConnection_->updateQuery(std::string(
459 "ALTER TABLE operation_implementation ADD COLUMN "
460 "post_op_vhdl TEXT;"));
461 dbConnection_->updateQuery(std::string(
462 "ALTER TABLE operation_implementation ADD COLUMN "
463 "post_op_verilog TEXT;"));
465 }
466
467 // Version 4 -> 5
468 if (dbVersion < 5) {
469 dbConnection_->updateQuery(std::string(
470 "ALTER TABLE operation_implementation_resource ADD COLUMN "
471 "latency INTEGER;"));
472 dbConnection_->updateQuery(std::string(
473 "ALTER TABLE operation_implementation ADD COLUMN "
474 "default_verilog TEXT;"));
475 dbConnection_->updateQuery(std::string(
476 "ALTER TABLE operation_implementation ADD COLUMN "
477 "default_vhdl TEXT;"));
479 }
480
481 // Version 5 -> 6
482 if (dbVersion < 6) {
483 try {
484 // rename default_vhdl and default_verilog to initial_*
485 // and add latency column
486 dbConnection_->updateQuery(std::string(
487 "ALTER TABLE operation_implementation ADD COLUMN "
488 "latency INTEGER;"));
489 dbConnection_->updateQuery(std::string(
490 "ALTER TABLE operation_implementation RENAME COLUMN "
491 "default_vhdl TO initial_vhdl;"));
492 dbConnection_->updateQuery(std::string(
493 "ALTER TABLE operation_implementation RENAME COLUMN "
494 "default_verilog TO initial_verilog;"));
496 } catch (const RelationalDBException& exception) {
497 throw IOException(
498 __FILE__, __LINE__, __func__, exception.errorMessage());
499 }
501 }
502
503 if (dbVersion < 7) {
504 try {
505 if (!hasColumn("rf_architecture", "zero_register")) {
506 addBooleanColumn("rf_architecture", "zero_register");
507 }
508 } catch (const RelationalDBException& exception) {
509 throw IOException(
510 __FILE__, __LINE__, __func__, exception.errorMessage());
511 }
513 }
514
515}
#define __func__
const string CQ_OPERATION_IMPLEMENTATION_VARIABLE
const string CQ_OPERATION_IMPLEMENTATION
const string CQ_OPERATION_IMPLEMENTATION_SOURCE_FILE
const string CQ_OPERATION_IMPLEMENTATION_RESOURCE_SOURCE_FILE
const string CQ_OPERATION_IMPLEMENTATION_RESOURCE
const string VERILOG_SIM_FORMAT
Definition HDBManager.cc:91
const string VHDL_SIM_FORMAT
Definition HDBManager.cc:90
const string CQ_OPERATION_IMPLEMENTATION_RESOURCES
std::string errorMessage() const
Definition Exception.cc:123
static bool fileIsReadable(const std::string fileName)
static bool fileExists(const std::string fileName)
int addBooleanColumn(const std::string &table, const std::string &newcolumn)
bool hasColumn(const std::string &table, const std::string &columnName) const
std::string hdbFile_
The HDB file to manager.
virtual void updateVersion(int version)=0
virtual int updateQuery(const std::string &queryString)=0
virtual void DDLQuery(const std::string &queryString)=0
virtual RelationalDBConnection & connect(const std::string &database, const std::string &login="", const std::string &password="", bool readOnly=false)
Definition SQLite.cc:69

References __func__, addBooleanColumn(), SQLite::connect(), CQ_OPERATION_IMPLEMENTATION, CQ_OPERATION_IMPLEMENTATION_RESOURCE, CQ_OPERATION_IMPLEMENTATION_RESOURCE_SOURCE_FILE, CQ_OPERATION_IMPLEMENTATION_RESOURCES, CQ_OPERATION_IMPLEMENTATION_SOURCE_FILE, CQ_OPERATION_IMPLEMENTATION_VARIABLE, db_, dbConnection_, RelationalDBConnection::DDLQuery(), Exception::errorMessage(), FileSystem::fileExists(), FileSystem::fileIsReadable(), hasColumn(), RelationalDBConnection::updateQuery(), RelationalDBConnection::updateVersion(), VERILOG_SIM_FORMAT, RelationalDBConnection::version(), and VHDL_SIM_FORMAT.

Here is the call graph for this function:

Member Function Documentation

◆ addBlockImplementationFiles() [1/2]

void HDB::HDBManager::addBlockImplementationFiles ( FUImplementation implementation,
RowID  entryID 
) const
private

Adds the block implementation files to the given FU implementation which is the implementation of the FU entry that has the given ID.

Parameters
implementationThe implementation.
entryIDID of the FU entry.

Definition at line 5323 of file HDBManager.cc.

5325 {
5326
5327 RelationalDBQueryResult* sourceFileData = NULL;
5328 try {
5329 sourceFileData = dbConnection_->query(
5330 fuSourceFilesByIDQuery(entryID));
5331 } catch (const Exception&) {
5332 assert(false);
5333 }
5334
5335 int fileColumn = sourceFileData->column("block_source_file.file");
5336 int formatColumn = sourceFileData->column("format.format");
5337
5338 while (sourceFileData->hasNext()) {
5339 sourceFileData->next();
5340 const DataObject& fileData = sourceFileData->data(fileColumn);
5341 const DataObject& formatData = sourceFileData->data(
5342 formatColumn);
5344 formatData.stringValue());
5345 BlockImplementationFile* file = new BlockImplementationFile(
5346 fileData.stringValue(), format);
5347 implementation.addImplementationFile(file);
5348 }
5349
5350 delete sourceFileData;
5351 sourceFileData = NULL;
5352}
#define assert(condition)
IDF::MachineImplementation * implementation
the implementation definition of the estimated processor
virtual std::string stringValue() const
static BlockImplementationFile::Format fileFormat(const std::string &formatString)
static std::string fuSourceFilesByIDQuery(RowID id)
virtual RelationalDBQueryResult * query(const std::string &queryString, bool init=true)=0
virtual int column(const std::string &name) const
virtual const DataObject & data(std::size_t column) const =0

References assert, RelationalDBQueryResult::column(), RelationalDBQueryResult::data(), dbConnection_, fileFormat(), fuSourceFilesByIDQuery(), RelationalDBQueryResult::hasNext(), implementation, RelationalDBQueryResult::next(), RelationalDBConnection::query(), and DataObject::stringValue().

Referenced by createImplementationOfFU(), and createImplementationOfRF().

Here is the call graph for this function:

◆ addBlockImplementationFiles() [2/2]

void HDB::HDBManager::addBlockImplementationFiles ( RFImplementation implementation,
RowID  entryID 
) const
private

Adds the block implementation files to the given RF implementation which is the implementation of the RF entry that has the given ID.

Parameters
implementationThe implementation.
entryIDID of the RF entry.

Definition at line 5429 of file HDBManager.cc.

5431 {
5432
5433 RelationalDBQueryResult* result = NULL;
5434 try {
5435 result = dbConnection_->query(rfSourceFilesByIDQuery(entryID));
5436 } catch (const Exception&) {
5437 assert(false);
5438 }
5439
5440 int fileColumn = result->column("block_source_file.file");
5441 int formatColumn = result->column("format.format");
5442
5443 while (result->hasNext()) {
5444 result->next();
5445 const DataObject& fileData = result->data(fileColumn);
5446 const DataObject& formatData = result->data(formatColumn);
5448 formatData.stringValue());
5449 BlockImplementationFile* file = new BlockImplementationFile(
5450 fileData.stringValue(), format);
5451 implementation.addImplementationFile(file);
5452 }
5453
5454 delete result;
5455 result = NULL;
5456}
static std::string rfSourceFilesByIDQuery(RowID id)

References assert, RelationalDBQueryResult::column(), RelationalDBQueryResult::data(), dbConnection_, fileFormat(), RelationalDBQueryResult::hasNext(), implementation, RelationalDBQueryResult::next(), RelationalDBConnection::query(), rfSourceFilesByIDQuery(), and DataObject::stringValue().

Here is the call graph for this function:

◆ addBlockImplementationFileToHDB()

void HDB::HDBManager::addBlockImplementationFileToHDB ( const BlockImplementationFile file) const
private

Adds the given block implementation file to the HDB.

Parameters
fileThe file to add.

Definition at line 5484 of file HDBManager.cc.

5485 {
5486 if (!containsImplementationFile(file.pathToFile())) {
5488 std::string(
5489 "INSERT INTO block_source_file(id,file,format) "
5490 "VALUES(NULL,\"" + file.pathToFile() +
5491 "\",(SELECT id FROM format WHERE format=\"" +
5492 formatString(file.format()) + "\"));"));
5493 }
5494}
static std::string formatString(BlockImplementationFile::Format format)
bool containsImplementationFile(const std::string &pathToFile) const

References containsImplementationFile(), dbConnection_, HDB::BlockImplementationFile::format(), formatString(), HDB::BlockImplementationFile::pathToFile(), and RelationalDBConnection::updateQuery().

Referenced by addFUImplementation(), and addRFImplementation().

Here is the call graph for this function:

◆ addBooleanColumn()

int HDB::HDBManager::addBooleanColumn ( const std::string &  table,
const std::string &  newcolumn 
)
private

Inserts a new boolean type column into existing table.

Parameters
tableThe name of the targeted table.
newColumnThe name of the new column.
Returns
Number of rows affected by the change.

Definition at line 4366 of file HDBManager.cc.

4367 {
4368 std::string add_column_query("ALTER TABLE ");
4369 add_column_query += table + " ADD COLUMN " + newcolumn;
4370 add_column_query += " INTEGER DEFAULT 0;";
4371
4372 int result = 0;
4373
4374 try {
4375 result = dbConnection_->updateQuery(add_column_query);
4376 } catch (const Exception& e) {
4378 assert(false);
4379 }
4380
4381 return result;
4382}
#define debugLog(text)

References assert, dbConnection_, debugLog, Exception::errorMessage(), and RelationalDBConnection::updateQuery().

Referenced by addRFImplementation(), and HDBManager().

Here is the call graph for this function:

◆ addBusCostEstimationData()

RowID HDB::HDBManager::addBusCostEstimationData ( RowID  busID,
const std::string &  valueName,
const std::string &  value,
RowID  pluginID 
) const

Adds the given cost estimation data values to given Bus entry.

Parameters
busIDThe ID of the Bus entry the cost data will be added. @valueName The name of the cost value. @value The cost value. @pluginID The ID of the cost function plugin that owns this data.

Definition at line 3451 of file HDBManager.cc.

3455 {
3456
3457
3458 RowID dataID;
3459
3460 // add the data
3461 try {
3463 std::string(
3464 "INSERT INTO cost_estimation_data (id,plugin_reference,"
3465 "bus_reference,name,value) VALUES (NULL," +
3466 Conversion::toString(pluginID) + "," +
3467 Conversion::toString(busID) + ",\"" + valueName + "\",\"" +
3468 value + "\");"));
3469 dataID = dbConnection_->lastInsertRowID();
3470 } catch (const Exception& e) {
3472 assert(false);
3473 }
3474 return dataID;
3475}
int RowID
Type definition of row ID in relational databases.
Definition DBTypes.hh:37
static std::string toString(const T &source)
virtual RowID lastInsertRowID()=0

References assert, dbConnection_, debugLog, Exception::errorMessage(), RelationalDBConnection::lastInsertRowID(), Conversion::toString(), and RelationalDBConnection::updateQuery().

Here is the call graph for this function:

◆ addBusEntry()

RowID HDB::HDBManager::addBusEntry ( ) const

Adds an empty Bus entry to the database.

Parameters
entryThe Bus entry.
Returns
ID of the added Bus entry.

Definition at line 3379 of file HDBManager.cc.

3379 {
3380 try {
3382 std::string("INSERT INTO bus(id) VALUES(NULL);"));
3384 } catch (const Exception& e) {
3386 assert(false);
3387 }
3388
3389 // dummy return to avoid compiler whining
3390 assert(false);
3391 return 0;
3392}

References assert, dbConnection_, debugLog, Exception::errorMessage(), RelationalDBConnection::lastInsertRowID(), and RelationalDBConnection::updateQuery().

Referenced by AddBusEntryCmd::Do().

Here is the call graph for this function:

◆ addCostEstimationData()

RowID HDB::HDBManager::addCostEstimationData ( const CostEstimationData data) const

Adds cost estimation data to the HDB.

Parameters
dataCost estimation data to add.
Returns
Row ID of the added cost data.

Definition at line 6680 of file HDBManager.cc.

6680 {
6681 if (!data.hasName() || !data.hasValue() || !data.hasPluginID()) {
6682 throw InvalidData(__FILE__, __LINE__, __func__);
6683 }
6684
6685 std::string query =
6686 std::string("INSERT INTO cost_estimation_data"
6687 " (id, name, value, plugin_reference, "
6688 " fu_reference, rf_reference, "
6689 " bus_reference, socket_reference) VALUES (") +
6690 "NULL, '" + data.name() + "', '" +
6691 data.value().stringValue() + "', " +
6692 Conversion::toString(data.pluginID()) + ", ";
6693
6694 // FU Reference
6695 if (data.hasFUReference()) {
6696 if (!hasFUEntry(data.fuReference())) {
6697 throw KeyNotFound(__FILE__, __LINE__, __func__);
6698 }
6699 query += Conversion::toString(data.fuReference());
6700 query += ", ";
6701 } else {
6702 query += "NULL, ";
6703 }
6704
6705 // RF Reference
6706 if (data.hasRFReference()) {
6707 if (!hasRFEntry(data.rfReference())) {
6708 throw KeyNotFound(__FILE__, __LINE__, __func__);
6709 }
6710 query += Conversion::toString(data.rfReference());
6711 query += ", ";
6712 } else {
6713 query += "NULL, ";
6714 }
6715
6716 // Bus Reference
6717 if (data.hasBusReference()) {
6718 if (!hasBusEntry(data.busReference())) {
6719 throw KeyNotFound(__FILE__, __LINE__, __func__);
6720 }
6721 query += Conversion::toString(data.busReference());
6722 query += ", ";
6723 } else {
6724 query += "NULL, ";
6725 }
6726
6727 // Socket Reference
6728 if (data.hasSocketReference()) {
6729 if (!hasSocketEntry(data.socketReference())) {
6730 throw KeyNotFound(__FILE__, __LINE__, __func__);
6731 }
6732 query += Conversion::toString(data.socketReference());
6733 query += ");";
6734 } else {
6735 query += "NULL);";
6736 }
6737
6738 try {
6739 dbConnection_->updateQuery(query);
6741 } catch (const Exception& e) {
6743 assert(false);
6744 }
6745
6746 // dummy return to avoid compiler whining
6747 assert(false);
6748 return 0;
6749}
DataObject value() const
bool hasBusReference() const
bool hasFUReference() const
std::string name() const
bool hasName() const
bool hasValue() const
RowID socketReference() const
bool hasSocketReference() const
bool hasRFReference() const
bool hasPluginID() const
bool hasBusEntry(RowID id) const
bool hasRFEntry(RowID id) const
bool hasSocketEntry(RowID id) const
bool hasFUEntry(RowID id) const

References __func__, assert, CostEstimationData::busReference(), dbConnection_, debugLog, Exception::errorMessage(), CostEstimationData::fuReference(), hasBusEntry(), CostEstimationData::hasBusReference(), hasFUEntry(), CostEstimationData::hasFUReference(), CostEstimationData::hasName(), CostEstimationData::hasPluginID(), hasRFEntry(), CostEstimationData::hasRFReference(), hasSocketEntry(), CostEstimationData::hasSocketReference(), CostEstimationData::hasValue(), RelationalDBConnection::lastInsertRowID(), CostEstimationData::name(), CostEstimationData::pluginID(), CostEstimationData::rfReference(), CostEstimationData::socketReference(), DataObject::stringValue(), Conversion::toString(), RelationalDBConnection::updateQuery(), and CostEstimationData::value().

Referenced by CostEstimationDataDialog::onOK().

Here is the call graph for this function:

◆ addCostFunctionPlugin()

RowID HDB::HDBManager::addCostFunctionPlugin ( const CostFunctionPlugin plugin) const

Add the given CostFunctionPlugin to the database.

Parameters
pluginThe CostFunctionPlugin to add.
Returns
ID of the plugin added.
Exceptions
ExceptionMay throw InvalidData if the CostFunctionPlugin type is unknown.

Definition at line 612 of file HDBManager.cc.

612 {
613 RowID pluginID;
614 try {
616
617 // insert into cost_function_plugin table
618 string description = plugin.description();
619 string pluginFilePath = plugin.pluginFilePath();
620 string type = "";
621 switch (plugin.type()) {
623 type = COST_PLUGIN_TYPE_FU;
624 break;
626 type = COST_PLUGIN_TYPE_RF;
627 break;
630 break;
633 break;
634 default:
635 InvalidData ex(
636 __FILE__, __LINE__, __func__,
637 (boost::format("Illegal cost_function_plugin type %d.") %
638 type).str());
639 throw ex;
640 break;
641 }
642 string name = plugin.name();
643
645 std::string(
646 "INSERT INTO cost_function_plugin(id,description,name,"
647 "plugin_file_path,type) VALUES"
648 "(NULL,\"" + description + "\",\"" + name + "\",\"" +
649 pluginFilePath + "\",\"" + type + "\");"));
650 pluginID = dbConnection_->lastInsertRowID();
652 } catch (const RelationalDBException& e) {
655 assert(false);
656 } catch (const Exception& e) {
659 assert(false);
660 }
661 return pluginID;
662}
const std::string COST_PLUGIN_TYPE_DECOMP
Definition HDBManager.cc:98
const std::string COST_PLUGIN_TYPE_RF
Definition HDBManager.cc:97
const std::string COST_PLUGIN_TYPE_ICDEC
Definition HDBManager.cc:99
const std::string COST_PLUGIN_TYPE_FU
Possible cost function plugin types.
Definition HDBManager.cc:96
@ COST_RF
register file cost estimator
@ COST_ICDEC
interconnection network & decoder cost estimator
@ COST_FU
function unit cost estimator
@ COST_DECOMP
decompressor cost estimator

References __func__, assert, RelationalDBConnection::beginTransaction(), RelationalDBConnection::commit(), HDB::CostFunctionPlugin::COST_DECOMP, HDB::CostFunctionPlugin::COST_FU, HDB::CostFunctionPlugin::COST_ICDEC, COST_PLUGIN_TYPE_DECOMP, COST_PLUGIN_TYPE_FU, COST_PLUGIN_TYPE_ICDEC, COST_PLUGIN_TYPE_RF, HDB::CostFunctionPlugin::COST_RF, dbConnection_, debugLog, HDB::CostFunctionPlugin::description(), Exception::errorMessage(), RelationalDBConnection::lastInsertRowID(), HDB::CostFunctionPlugin::name(), HDB::CostFunctionPlugin::pluginFilePath(), RelationalDBConnection::rollback(), HDB::CostFunctionPlugin::type(), and RelationalDBConnection::updateQuery().

Referenced by AddCostFunctionPluginCmd::Do().

Here is the call graph for this function:

◆ addDataPortsToImplementation() [1/2]

void HDB::HDBManager::addDataPortsToImplementation ( FUImplementation implementation,
FUArchitecture architecture,
RowID  entryID 
) const
private

Adds data ports to the given FU implementation which is the implementation of the FU entry that has the given ID.

Parameters
implementationThe implementation.
architectureThe corresponding architecture.
entryIDID of the FU entry.

Definition at line 4992 of file HDBManager.cc.

4995 {
4996
4997 RelationalDBQueryResult* portData = NULL;
4998 try {
4999 portData = dbConnection_->query(
5001 } catch (const Exception& e) {
5002 assert(false);
5003 }
5004 int portNameColumn = portData->column("fu_port_map.name");
5005 int widthFormulaColumn = portData->column("fu_port_map.width_formula");
5006 int loadPortColumn = portData->column("fu_port_map.load_port");
5007 int guardPortColumn = portData->column("fu_port_map.guard_port");
5008
5009 while (portData->hasNext()) {
5010 portData->next();
5011 const DataObject& portNameData = portData->data(portNameColumn);
5012 const DataObject& widthFormulaData = portData->data(
5013 widthFormulaColumn);
5014 const DataObject& loadPortData = portData->data(loadPortColumn);
5015 const DataObject& guardPortData = portData->data(guardPortColumn);
5016
5017 string portName = portNameData.stringValue();
5018 string widthFormula = widthFormulaData.stringValue();
5019 string loadPort = loadPortData.stringValue();
5020 string guardPort = guardPortData.stringValue();
5021 string architecturePort = resolveArchitecturePort(
5022 architecture, entryID, portName);
5023 new FUPortImplementation(
5024 portName, architecturePort, widthFormula, loadPort, guardPort,
5026 }
5027
5028 delete portData;
5029 portData = NULL;
5030}
static std::string fuImplementationDataPortsByIDQuery(RowID id)
std::string resolveArchitecturePort(const FUArchitecture &architecture, RowID entryID, const std::string &implementedPort) const

References assert, RelationalDBQueryResult::column(), RelationalDBQueryResult::data(), dbConnection_, fuImplementationDataPortsByIDQuery(), RelationalDBQueryResult::hasNext(), implementation, RelationalDBQueryResult::next(), RelationalDBConnection::query(), resolveArchitecturePort(), and DataObject::stringValue().

Referenced by createImplementationOfFU(), and createImplementationOfRF().

Here is the call graph for this function:

◆ addDataPortsToImplementation() [2/2]

void HDB::HDBManager::addDataPortsToImplementation ( RFImplementation implementation,
RowID  entryID 
) const
private

Adds data ports to the given RF implementation which is the implementation of the RF entry that has the given ID.

Parameters
implementationThe implementation.
entryIDID of the RF entry.

Definition at line 5363 of file HDBManager.cc.

5365 {
5366
5367 // obtain port data from HDB and add ports to RF implementation
5368 RelationalDBQueryResult* portData = NULL;
5369 try {
5370 portData = dbConnection_->query(
5372 } catch (const Exception& e) {
5374 assert(false);
5375 }
5376
5377 int portNameColumn = portData->column("name");
5378 int directionColumn = portData->column("direction");
5379 int loadPortColumn = portData->column("load_port");
5380 int opcodePortColumn = portData->column("opcode_port");
5381 int opcodePortFormulaColumn = portData->column(
5382 "opcode_port_width_formula");
5387 assert(
5388 opcodePortFormulaColumn != RelationalDBQueryResult::UNKNOWN_INDEX);
5389
5390 while (portData->hasNext()) {
5391 portData->next();
5392 const DataObject& portNameData = portData->data(portNameColumn);
5393 const DataObject& directionData = portData->data(
5394 directionColumn);
5395 const DataObject& loadPortData = portData->data(loadPortColumn);
5396 const DataObject& opcodePortData = portData->data(
5397 opcodePortColumn);
5398 const DataObject& opcodePortFormulaData = portData->data(
5399 opcodePortFormulaColumn);
5400 Direction direction;
5401 if (directionData.stringValue() == IN_DIRECTION) {
5402 direction = IN;
5403 } else if (directionData.stringValue() == OUT_DIRECTION) {
5404 direction = OUT;
5405 } else if (directionData.stringValue() == BIDIR_DIRECTION) {
5406 direction = BIDIR;
5407 } else {
5408 assert(false);
5409 }
5410 new RFPortImplementation(
5411 portNameData.stringValue(), direction,
5412 loadPortData.stringValue(), opcodePortData.stringValue(),
5413 opcodePortFormulaData.stringValue(), implementation);
5414 }
5415
5416 delete portData;
5417 portData = NULL;
5418}
const string IN_DIRECTION
Definition HDBManager.cc:85
const string BIDIR_DIRECTION
Definition HDBManager.cc:87
const string OUT_DIRECTION
Definition HDBManager.cc:86
static std::string rfImplementationDataPortsByIDQuery(RowID id)
Direction
Direction of port.
Definition HDBTypes.hh:40
@ OUT
Output port.
Definition HDBTypes.hh:42
@ BIDIR
Bidirectional port.
Definition HDBTypes.hh:43
@ IN
Input port.
Definition HDBTypes.hh:41

References assert, HDB::BIDIR, BIDIR_DIRECTION, RelationalDBQueryResult::column(), RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), implementation, HDB::IN, IN_DIRECTION, RelationalDBQueryResult::next(), HDB::OUT, OUT_DIRECTION, RelationalDBConnection::query(), rfImplementationDataPortsByIDQuery(), DataObject::stringValue(), and RelationalDBQueryResult::UNKNOWN_INDEX.

Here is the call graph for this function:

◆ addFUArchitecture()

RowID HDB::HDBManager::addFUArchitecture ( const FUArchitecture arch) const

Adds the given FU architecture to the database.

Parameters
archThe FU architecture to add.
Returns
ID of the architecture added.
Exceptions
InvalidDataIf the FU architecture is invalid.

Definition at line 703 of file HDBManager.cc.

703 {
704 // check the operand bindings of the FU
705 FunctionUnit& fu = arch.architecture();
707 FUValidator::checkOperations(fu, results);
709 if (results.errorCount() > 0) {
710 throw InvalidData(
711 __FILE__, __LINE__, __func__, results.error(0).second);
712 }
713
714 RowID archID;
715 std::map<FUPort*, RowID> portIDMap;
716
717 try {
719
720 // insert into fu_architecture table
722 std::string("INSERT INTO fu_architecture(id) VALUES(NULL);"));
723 archID = dbConnection_->lastInsertRowID();
724
725 // insert into fu_data_port table
726 for (int i = 0; i < fu.operationPortCount(); i++) {
727 FUPort* port = fu.operationPort(i);
728 string query(
729 "INSERT INTO fu_data_port(id,triggers,sets_opcode,"
730 "guard_support,width,fu_arch) "
731 "VALUES(NULL," +
732 Conversion::toString(port->isTriggering()) + "," +
734 Conversion::toString(arch.hasGuardSupport(port->name()))
735 + ",");
736 if (arch.hasParameterizedWidth(port->name())) {
737 query += "NULL,";
738 } else {
739 query += (Conversion::toString(port->width()) + ",");
740 }
741 query += (Conversion::toString(archID) + ");");
744 portIDMap.insert(std::pair<FUPort*, RowID>(port, portID));
745 }
746
747 // insert into operation table
748 for (int i = 0; i < fu.operationCount(); i++) {
749 HWOperation* operation = fu.operation(i);
750 if (!containsOperation(operation->name())) {
752 std::string(
753 "INSERT INTO operation(id,name) VALUES(NULL,\"" +
754 operation->name() + "\");"));
755 }
756 }
757
758 // insert into io_binding table
759 for (int i = 0; i < fu.operationCount(); i++) {
760 HWOperation* operation = fu.operation(i);
761 for (int i = 0; i < fu.operationPortCount(); i++) {
762 FUPort* port = fu.operationPort(i);
763 if (operation->isBound(*port)) {
764 int io = operation->io(*port);
765 string query(
766 "INSERT INTO io_binding(id,io_number,port,operation)"
767 " VALUES(NULL," + Conversion::toString(io) + "," +
769 MapTools::valueForKey<RowID>(portIDMap, port)) +
770 ",(SELECT id FROM operation WHERE "
771 "lower(name)=\"" + operation->name() + "\"));");
773 }
774 }
775 }
776
777 std::map<HWOperation*, RowID> pLineIDMap;
778
779 // insert into operation pipeline table
780 for (int i = 0; i < fu.operationCount(); i++) {
781 HWOperation* operation = fu.operation(i);
783 std::string(
784 "INSERT INTO operation_pipeline(id,fu_arch,operation) "
785 "VALUES(NULL," + Conversion::toString(archID) +
786 ",(SELECT id FROM operation WHERE lower(name)=\"" +
787 operation->name() + "\"));"));
788 pLineIDMap.insert(
789 std::pair<HWOperation*, RowID>(
790 operation, dbConnection_->lastInsertRowID()));
791 }
792
793 // insert into io_usage_table
794 for (int i = 0; i < fu.operationCount(); i++) {
795 HWOperation* operation = fu.operation(i);
796 ExecutionPipeline* pLine = operation->pipeline();
797 for (int cycle = 0; cycle < pLine->latency(); cycle++) {
798 ExecutionPipeline::OperandSet readOperands =
799 pLine->readOperands(cycle);
800 ExecutionPipeline::OperandSet writtenOperands =
801 pLine->writtenOperands(cycle);
802 for (ExecutionPipeline::OperandSet::const_iterator iter =
803 readOperands.begin();
804 iter != readOperands.end(); iter++) {
806 std::string(
807 "INSERT INTO io_usage(id,cycle,io_number,action,"
808 "pipeline) VALUES(NULL," +
809 Conversion::toString(cycle) + "," +
810 Conversion::toString(*iter) + "," +
814 pLineIDMap, operation)) + ");"));
815 }
816 for (ExecutionPipeline::OperandSet::const_iterator iter =
817 writtenOperands.begin();
818 iter != writtenOperands.end(); iter++) {
820 std::string(
821 "INSERT INTO io_usage(id,cycle,io_number,action,"
822 "pipeline) VALUES(NULL," +
823 Conversion::toString(cycle) + "," +
824 Conversion::toString(*iter) + "," +
828 pLineIDMap, operation)) + ");"));
829 }
830 }
831 }
832
833 // insert into pipeline_resource table
834 std::map<PipelineElement*, RowID> pipelineElementMap;
835 for (int i = 0; i < fu.pipelineElementCount(); i++) {
836 PipelineElement* element = fu.pipelineElement(i);
838 std::string(
839 "INSERT INTO pipeline_resource(id,fu_arch) VALUES "
840 "(NULL," + Conversion::toString(archID) + ");"));
841 pipelineElementMap.insert(
842 std::pair<PipelineElement*, RowID>(
843 element, dbConnection_->lastInsertRowID()));
844 }
845
846 // insert into pipeline_resource_usage table
847 for (int i = 0; i < fu.operationCount(); i++) {
848 HWOperation* operation = fu.operation(i);
849 ExecutionPipeline* pLine = operation->pipeline();
850 for (int i = 0; i < fu.pipelineElementCount(); i++) {
851 PipelineElement* element = fu.pipelineElement(i);
852 for (int cycle = 0; cycle < pLine->latency(); cycle++) {
853 if (pLine->isResourceUsed(element->name(), cycle)) {
854 string resID = Conversion::toString(
856 pipelineElementMap, element));
857 string pLineID = Conversion::toString(
859 pLineIDMap, operation));
861 std::string(
862 "INSERT INTO pipeline_resource_usage(id,"
863 "cycle,resource,pipeline) VALUES(NULL," +
864 Conversion::toString(cycle) + "," +
865 resID + "," + pLineID + ");"));
866 }
867 }
868 }
869 }
870
872
873 } catch (const Exception& e) {
876 assert(false);
877 }
878
879 return archID;
880}
const bool WRITE_ACTION
Definition HDBManager.cc:83
const bool READ_ACTION
Definition HDBManager.cc:82
static void checkOperations(const TTAMachine::FunctionUnit &fu, MachineValidatorResults &results)
static void checkOperandBindings(const TTAMachine::FunctionUnit &fu, MachineValidatorResults &results)
bool containsOperation(const std::string &opName) const
static KeyType keyForValue(const MapType &aMap, const ValueType &aValue)
virtual int width() const
OperandSet writtenOperands(int cycle) const
OperandSet readOperands(int cycle) const
std::set< int > OperandSet
Set for operand indexes.
bool isResourceUsed(const std::string &name, int cycle) const
virtual bool isTriggering() const
Definition FUPort.cc:182
virtual bool isOpcodeSetting() const
Definition FUPort.cc:195
virtual int pipelineElementCount() const
virtual HWOperation * operation(const std::string &name) const
virtual int operationCount() const
virtual FUPort * operationPort(const std::string &name) const
virtual PipelineElement * pipelineElement(int index) const
virtual int operationPortCount() const
ExecutionPipeline * pipeline() const
int io(const FUPort &port) const
const std::string & name() const
bool isBound(const FUPort &port) const
const std::string & name() const
virtual std::string name() const
Definition Port.cc:141

References __func__, HDB::FUArchitecture::architecture(), assert, RelationalDBConnection::beginTransaction(), FUValidator::checkOperandBindings(), FUValidator::checkOperations(), RelationalDBConnection::commit(), containsOperation(), dbConnection_, debugLog, MachineValidatorResults::error(), MachineValidatorResults::errorCount(), Exception::errorMessage(), HDB::FUArchitecture::hasGuardSupport(), HDB::FUArchitecture::hasParameterizedWidth(), TTAMachine::HWOperation::io(), TTAMachine::HWOperation::isBound(), TTAMachine::FUPort::isOpcodeSetting(), TTAMachine::ExecutionPipeline::isResourceUsed(), TTAMachine::FUPort::isTriggering(), MapTools::keyForValue(), RelationalDBConnection::lastInsertRowID(), TTAMachine::ExecutionPipeline::latency(), TTAMachine::HWOperation::name(), TTAMachine::PipelineElement::name(), TTAMachine::Port::name(), TTAMachine::FunctionUnit::operation(), TTAMachine::FunctionUnit::operationCount(), TTAMachine::FunctionUnit::operationPort(), TTAMachine::FunctionUnit::operationPortCount(), TTAMachine::HWOperation::pipeline(), TTAMachine::FunctionUnit::pipelineElement(), TTAMachine::FunctionUnit::pipelineElementCount(), READ_ACTION, TTAMachine::ExecutionPipeline::readOperands(), RelationalDBConnection::rollback(), Conversion::toString(), RelationalDBConnection::updateQuery(), TTAMachine::BaseFUPort::width(), WRITE_ACTION, and TTAMachine::ExecutionPipeline::writtenOperands().

Referenced by AddFUArchFromADFCmd::Do().

Here is the call graph for this function:

◆ addFUCostEstimationData()

RowID HDB::HDBManager::addFUCostEstimationData ( RowID  fuID,
const std::string &  valueName,
const std::string &  value,
RowID  pluginID 
) const

Adds the given cost estimation data values to given FU entry.

Parameters
fuIDThe ID of the FU entry the cost data will be added. @valueName The name of the cost value. @value The cost value. @pluginID The ID of the cost function plugin that owns this data.

Definition at line 3196 of file HDBManager.cc.

3200 {
3201
3202
3203 RowID dataID;
3204
3205 // add the data
3206 try {
3208 std::string(
3209 "INSERT INTO cost_estimation_data (id,plugin_reference,"
3210 "fu_reference,name,value) VALUES (NULL," +
3211 Conversion::toString(pluginID) + "," +
3212 Conversion::toString(fuID) + ",\"" + valueName + "\",\"" +
3213 value + "\");"));
3214 dataID = dbConnection_->lastInsertRowID();
3215 } catch (const Exception& e) {
3217 assert(false);
3218 }
3219 return dataID;
3220}

References assert, dbConnection_, debugLog, Exception::errorMessage(), RelationalDBConnection::lastInsertRowID(), Conversion::toString(), and RelationalDBConnection::updateQuery().

Here is the call graph for this function:

◆ addFUEntry()

RowID HDB::HDBManager::addFUEntry ( ) const

Adds an empty FU entry to the database.

Parameters
entryThe FU entry.
Returns
ID of the added FU entry.

Definition at line 1000 of file HDBManager.cc.

1000 {
1001 try {
1003 std::string("INSERT INTO fu(id) VALUES(NULL);"));
1005 } catch (const Exception& e) {
1007 assert(false);
1008 }
1009
1010 // dummy return to avoid compiler whining
1011 assert(false);
1012 return 0;
1013}

References assert, dbConnection_, debugLog, Exception::errorMessage(), RelationalDBConnection::lastInsertRowID(), and RelationalDBConnection::updateQuery().

Referenced by AddFUEntryCmd::Do(), and AddFUImplementationCmd::Do().

Here is the call graph for this function:

◆ addFUExternalPortsToImplementation()

void HDB::HDBManager::addFUExternalPortsToImplementation ( FUImplementation implementation,
RowID  entryID 
) const
private

Adds external ports to the given FU implementation which is the implementation of the FU entry that has the given ID.

Parameters
implementationThe implementation.
entryIDID of the FU entry.

Definition at line 5041 of file HDBManager.cc.

5043 {
5044
5045 RelationalDBQueryResult* extPortData = NULL;
5046 try {
5047 extPortData = dbConnection_->query(fuExternalPortsByIDQuery(entryID));
5048 } catch (const Exception& e) {
5049 assert(false);
5050 }
5051
5052 int extPortNameColumn = extPortData->column("fu_external_port.name");
5053 int directionColumn = extPortData->column(
5054 "fu_external_port.direction");
5055 int extPortWidthFormulaColumn = extPortData->column(
5056 "fu_external_port.width_formula");
5057 int descriptionColumn = extPortData->column(
5058 "fu_external_port.description");
5059
5060 while (extPortData->hasNext()) {
5061 extPortData->next();
5062 const DataObject& nameData = extPortData->data(
5063 extPortNameColumn);
5064 const DataObject& directionData = extPortData->data(
5065 directionColumn);
5066 const DataObject& widthFormulaData = extPortData->data(
5067 extPortWidthFormulaColumn);
5068 const DataObject& descriptionData = extPortData->data(
5069 descriptionColumn);
5070
5071 string name = nameData.stringValue();
5072 string widthFormula = widthFormulaData.stringValue();
5073 string description = descriptionData.stringValue();
5074
5075 Direction direction;
5076 if (directionData.stringValue() == IN_DIRECTION) {
5077 direction = IN;
5078 } else if (directionData.stringValue() == OUT_DIRECTION) {
5079 direction = OUT;
5080 } else {
5081 assert(directionData.stringValue() == BIDIR_DIRECTION);
5082 direction = BIDIR;
5083 }
5084
5085 new FUExternalPort(
5086 name, direction, widthFormula, description, implementation);
5087 }
5088
5089 delete extPortData;
5090 extPortData = NULL;
5091
5092 // add parameter dependencies
5093 for (int i = 0; i < implementation.externalPortCount(); i++) {
5094 FUExternalPort& port = implementation.externalPort(i);
5095 try {
5097 std::string(
5098 "SELECT fu_implementation_parameter.name FROM "
5099 "fu_implementation_parameter, fu_external_port, "
5100 "fu_ext_port_parameter_dependency, fu_implementation "
5101 "WHERE fu_implementation.fu=" +
5102 Conversion::toString(entryID) +
5103 " AND fu_external_port.fu_impl=fu_implementation.id AND "
5104 "fu_external_port.name=\"" + port.name() +
5105 "\" AND fu_ext_port_parameter_dependency.port="
5106 "fu_external_port.id AND fu_implementation_parameter.id="
5107 "fu_ext_port_parameter_dependency.parameter;"));
5108 while (result->hasNext()) {
5109 result->next();
5110 const DataObject& paramData = result->data(0);
5111 port.setParameterDependency(paramData.stringValue());
5112 }
5113 delete result;
5114 } catch (const Exception& e) {
5116 assert(false);
5117 }
5118 }
5119}
static std::string fuExternalPortsByIDQuery(RowID id)

References assert, HDB::BIDIR, BIDIR_DIRECTION, RelationalDBQueryResult::column(), RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), fuExternalPortsByIDQuery(), RelationalDBQueryResult::hasNext(), implementation, HDB::IN, IN_DIRECTION, HDB::ExternalPort::name(), RelationalDBQueryResult::next(), HDB::OUT, OUT_DIRECTION, RelationalDBConnection::query(), HDB::ExternalPort::setParameterDependency(), DataObject::stringValue(), and Conversion::toString().

Referenced by createImplementationOfFU().

Here is the call graph for this function:

◆ addFUImplementation()

RowID HDB::HDBManager::addFUImplementation ( const FUEntry entry) const

Adds the implementation of the given FU entry to the database.

In practice the implementation is added for the FU entry that has the same ID as the given FUEntry instance. The given FUEntry instance must also have an architecture similar to the architecture of the FU entry in the database. This is required in port mapping.

Parameters
entryThe FU entry containing the implementation to add.
Returns
ID of the implementation that was added.
Exceptions
InvalidDataIf the given FUEntry instance is invalid or if the FU entry does not have architecture in the database of if the FU entry has an implementation already.

Definition at line 1098 of file HDBManager.cc.

1098 {
1099 if (!entry.hasID() || !entry.hasImplementation() ||
1100 !entry.hasArchitecture() || !hasFUEntry(entry.id())) {
1101 throw InvalidData(__FILE__, __LINE__, __func__);
1102 }
1103
1104 FUImplementation& impl = entry.implementation();
1105 FUArchitecture& arch = entry.architecture();
1106 FunctionUnit& fu = arch.architecture();
1107
1108 FUEntry* existingEntry = fuByEntryID(entry.id());
1109 if (existingEntry->hasImplementation() ||
1110 !existingEntry->hasArchitecture()) {
1111 delete existingEntry;
1112 throw InvalidData(__FILE__, __LINE__, __func__);
1113 }
1114 delete existingEntry;
1115 existingEntry = NULL;
1116
1117 RowID archID = fuArchitectureID(entry.id());
1118 RowID implID;
1119
1120 try {
1122
1123 // insert into fu_implementation table
1124 string module = impl.moduleName();
1125 string opcPort = impl.opcodePort();
1126 string clkPort = impl.clkPort();
1127 string rstPort = impl.rstPort();
1128 string glockPort = impl.glockPort();
1129 string glockReqPort = impl.glockReqPort();
1130
1132 std::string(
1133 "INSERT INTO fu_implementation(id,name,opcode_port,"
1134 "clk_port,rst_port,glock_port,glock_req_port,fu) VALUES"
1135 "(NULL,\"" + module + "\",\"" + opcPort + "\",\"" +
1136 clkPort + "\",\"" + rstPort + "\",\"" + glockPort + "\",\""
1137 + glockReqPort + "\"," + Conversion::toString(entry.id())
1138 + ");"));
1139 implID = dbConnection_->lastInsertRowID();
1140
1141 // insert into fu_port_map table
1142 for (int i = 0; i < impl.architecturePortCount(); i++) {
1143 FUPortImplementation& portImpl = impl.architecturePort(i);
1144 string name = portImpl.name();
1145 string widthFormula = portImpl.widthFormula();
1146 string loadPort = portImpl.loadPort();
1147 string guardPort = portImpl.guardPort();
1148 string archPortName = portImpl.architecturePort();
1149 if (!fu.hasOperationPort(archPortName)) {
1150 throw InvalidData(__FILE__, __LINE__, __func__);
1151 }
1152 FUPort* port = fu.operationPort(archPortName);
1153 bool portAdded = false;
1154 for (int j = 0; j < fu.operationCount(); j++) {
1155 HWOperation* operation = fu.operation(j);
1156 if (operation->isBound(*port)) {
1157 int io = operation->io(*port);
1158 // find the fu_data_port from DB
1160 std::string(
1161 "SELECT fu_data_port.id FROM fu_data_port,"
1162 "io_binding,operation WHERE "
1163 "fu_data_port.fu_arch=" +
1164 Conversion::toString(archID) +
1165 " AND io_binding.port=fu_data_port.id AND "
1166 "io_binding.io_number=" +
1168 " AND lower(operation.name)=\"" +
1169 operation->name() +
1170 "\" AND io_binding.operation=operation.id;"));
1171 if (!result->hasNext()) {
1172 delete result;
1173 throw InvalidData(__FILE__, __LINE__, __func__);
1174 }
1175 result->next();
1176 string portID = result->data(0).stringValue();
1177 delete result;
1178
1179 // update fu_port_map table
1181 std::string(
1182 "INSERT INTO fu_port_map(id,name,width_formula,"
1183 "load_port,guard_port,fu_impl,arch_port) VALUES"
1184 "(NULL,\"" + name + "\",\"" + widthFormula +
1185 "\",\"" + loadPort + "\",\"" + guardPort +
1186 "\"," + Conversion::toString(implID) + "," +
1187 portID + ");"));
1188 portAdded = true;
1189 break;
1190 }
1191 }
1192
1193 if (!portAdded) {
1194 throw InvalidData(__FILE__, __LINE__, __func__);
1195 }
1196 }
1197#ifdef ALLOW_OPCODE_EDITING
1198 // insert into opcode_map table
1199 for (int i = 0; i < fu.operationCount(); i++) {
1200 HWOperation* operation = fu.operation(i);
1201 if (!containsOperation(operation->name())) {
1202 format errorMsg(
1203 "FU implementation uses unknown operation %1%.");
1204 errorMsg % operation->name();
1205 throw InvalidData(
1206 __FILE__, __LINE__, __func__, errorMsg.str());
1207 }
1208 if (fu.operationCount() > 1 &&
1209 !impl.hasOpcode(operation->name())) {
1210 format errorMsg("Opcode not defined for operation %1%.");
1211 errorMsg % operation->name();
1212 throw InvalidData(
1213 __FILE__, __LINE__, __func__, errorMsg.str());
1214 }
1215 if (fu.operationCount() > 1) {
1216 int opcode = impl.opcode(operation->name());
1218 std::string(
1219 "INSERT INTO opcode_map(id,opcode,operation,fu_impl)"
1220 " VALUES(NULL," + Conversion::toString(opcode) +
1221 ",(SELECT id FROM operation WHERE lower(name)=\"" +
1222 operation->name() + "\")," +
1223 Conversion::toString(implID) + ");"));
1224 }
1225 }
1226#endif
1227 // insert into fu_external_port table
1228 for (int i = 0; i < impl.externalPortCount(); i++) {
1229 FUExternalPort& port = impl.externalPort(i);
1230 string direction = directionString(port.direction());
1232 std::string(
1233 "INSERT INTO fu_external_port(id,name,direction,"
1234 "width_formula,description,fu_impl) VALUES(NULL,\"" +
1235 port.name() + "\",\"" + direction + "\",\"" +
1236 port.widthFormula() + "\",\"" + port.description() +
1237 "\"," + Conversion::toString(implID) + ");"));
1238 }
1239
1240 // insert into fu_implementation_parameter table
1241 for (int i = 0; i < impl.parameterCount(); i++) {
1242 FUImplementation::Parameter param = impl.parameter(i);
1244 std::string(
1245 "INSERT INTO fu_implementation_parameter(id,name,type,"
1246 "value,fu_impl) VALUES(NULL,\"" + param.name +
1247 "\",\"" + param.type + "\",\"" + param.value +
1248 "\"," + Conversion::toString(implID) + ");"));
1249 }
1250
1251 // insert into fu_ext_port_parameter_dependency table
1252 for (int i = 0; i < impl.externalPortCount(); i++) {
1253 FUExternalPort& port = impl.externalPort(i);
1254 for (int i = 0; i < port.parameterDependencyCount(); i++) {
1255 string param = port.parameterDependency(i);
1257 std::string(
1258 "INSERT INTO fu_ext_port_parameter_dependency(id,"
1259 "port,parameter) VALUES(NULL,(SELECT id FROM "
1260 "fu_external_port WHERE fu_impl=" +
1261 Conversion::toString(implID) + " AND name=\"" +
1262 port.name() + "\"),(SELECT id FROM "
1263 "fu_implementation_parameter WHERE fu_impl=" +
1264 Conversion::toString(implID) + " AND name=\"" +
1265 param + "\"));"));
1266 }
1267 }
1268
1269 // insert into block_source_file table
1270 for (int i = 0; i < impl.implementationFileCount(); i++) {
1271 BlockImplementationFile& file = impl.file(i);
1273 }
1274
1275 // insert into fu_source_file table
1276 for (int i = 0; i < impl.implementationFileCount(); i++) {
1277 BlockImplementationFile& file = impl.file(i);
1278 string path = file.pathToFile();
1280 std::string(
1281 "INSERT INTO fu_source_file(id,fu_impl,file) "
1282 "VALUES(NULL," + Conversion::toString(implID) +
1283 ",(SELECT id FROM block_source_file WHERE file=\"" +
1284 path + "\"));"));
1285 }
1286
1288
1289 } catch (const RelationalDBException& e) {
1292 assert(false);
1293 } catch (const InvalidData& e) {
1295 throw;
1296 } catch (const Exception& e) {
1299 assert(false);
1300 }
1301
1302 return implID;
1303}
HDB::Parameter Parameter
Parameter of FU implementation.
FUEntry * fuByEntryID(RowID id) const
static std::string directionString(HDB::Direction direction)
RowID fuArchitectureID(RowID fuEntryID) const
void addBlockImplementationFileToHDB(const BlockImplementationFile &file) const
virtual bool hasOperationPort(const std::string &name) const

References __func__, addBlockImplementationFileToHDB(), HDB::FUArchitecture::architecture(), HDB::FUEntry::architecture(), HDB::FUPortImplementation::architecturePort(), HDB::FUImplementation::architecturePort(), HDB::FUImplementation::architecturePortCount(), assert, RelationalDBConnection::beginTransaction(), HDB::HWBlockImplementation::clkPort(), RelationalDBConnection::commit(), containsOperation(), RelationalDBQueryResult::data(), dbConnection_, debugLog, HDB::ExternalPort::description(), HDB::ExternalPort::direction(), directionString(), Exception::errorMessage(), HDB::FUImplementation::externalPort(), HDB::FUImplementation::externalPortCount(), HDB::HWBlockImplementation::file(), fuArchitectureID(), fuByEntryID(), HDB::HWBlockImplementation::glockPort(), HDB::FUImplementation::glockReqPort(), HDB::FUPortImplementation::guardPort(), HDB::FUEntry::hasArchitecture(), hasFUEntry(), HDB::HDBEntry::hasID(), HDB::FUEntry::hasImplementation(), RelationalDBQueryResult::hasNext(), HDB::FUImplementation::hasOpcode(), TTAMachine::FunctionUnit::hasOperationPort(), HDB::HDBEntry::id(), HDB::FUEntry::implementation(), HDB::HWBlockImplementation::implementationFileCount(), TTAMachine::HWOperation::io(), TTAMachine::HWOperation::isBound(), RelationalDBConnection::lastInsertRowID(), HDB::PortImplementation::loadPort(), HDB::ExternalPort::name(), HDB::Parameter::name, HDB::PortImplementation::name(), TTAMachine::HWOperation::name(), RelationalDBQueryResult::next(), HDB::FUImplementation::opcode(), HDB::FUImplementation::opcodePort(), TTAMachine::FunctionUnit::operation(), TTAMachine::FunctionUnit::operationCount(), TTAMachine::FunctionUnit::operationPort(), HDB::FUImplementation::parameter(), HDB::FUImplementation::parameterCount(), HDB::ExternalPort::parameterDependency(), HDB::ExternalPort::parameterDependencyCount(), HDB::BlockImplementationFile::pathToFile(), RelationalDBConnection::query(), RelationalDBConnection::rollback(), HDB::HWBlockImplementation::rstPort(), DataObject::stringValue(), Conversion::toString(), HDB::Parameter::type, RelationalDBConnection::updateQuery(), HDB::Parameter::value, HDB::ExternalPort::widthFormula(), and HDB::FUPortImplementation::widthFormula().

Referenced by AddFUImplementationCmd::Do(), and HDBEditorModifyCmd::Do().

◆ addFUParametersToImplementation()

void HDB::HDBManager::addFUParametersToImplementation ( FUImplementation implementation,
RowID  entryID 
) const
private

Adds parameters to the given FU implementation which is the implementation of the FU entry that has the given ID.

Parameters
implementationThe implementation.
entryIDID of the FU entry.

Definition at line 5226 of file HDBManager.cc.

5228 {
5229
5230 RelationalDBQueryResult* result = NULL;
5231 try {
5232 result = dbConnection_->query(
5234 } catch (const Exception&) {
5235 assert(false);
5236 }
5237
5238 while (result->hasNext()) {
5239 result->next();
5240 const DataObject& nameData = result->data("name");
5241 const DataObject& typeData = result->data("type");
5242 const DataObject& valueData = result->data("value");
5243 string name = nameData.stringValue();
5244 string type = typeData.stringValue();
5245 string value = valueData.stringValue();
5246 implementation.addParameter(name, type, value);
5247 }
5248 delete result;
5249}
static std::string fuImplementationParametersByIDQuery(RowID id)

References assert, RelationalDBQueryResult::data(), dbConnection_, fuImplementationParametersByIDQuery(), RelationalDBQueryResult::hasNext(), implementation, RelationalDBQueryResult::next(), RelationalDBConnection::query(), and DataObject::stringValue().

Referenced by createImplementationOfFU().

Here is the call graph for this function:

◆ addOpcodesToImplementation()

void HDB::HDBManager::addOpcodesToImplementation ( FUImplementation implementation,
RowID  entryID 
) const
private

Adds the operation codes to the given FU implementation which is the implementation of the FU entry that has the given ID.

Parameters
implementationThe FU implementation.
entryIDID of the FU entry.

Definition at line 4957 of file HDBManager.cc.

4959 {
4960
4961 RelationalDBQueryResult* opcodeData = NULL;
4962 try {
4963 opcodeData = dbConnection_->query(opcodesByIDQuery(entryID));
4964 } catch (const Exception&) {
4965 assert(false);
4966 }
4967 int operationColumn = opcodeData->column("operation.name");
4968 int opcodeColumn = opcodeData->column("opcode_map.opcode");
4969 while (opcodeData->hasNext()) {
4970 opcodeData->next();
4971 const DataObject& operationData = opcodeData->data(
4972 operationColumn);
4973 const DataObject& opcodeDataObject = opcodeData->data(
4974 opcodeColumn);
4975 implementation.setOpcode(
4976 operationData.stringValue(), opcodeDataObject.integerValue());
4977 }
4978 delete opcodeData;
4979 opcodeData = NULL;
4980}
virtual int integerValue() const
static std::string opcodesByIDQuery(RowID id)

References assert, RelationalDBQueryResult::column(), RelationalDBQueryResult::data(), dbConnection_, RelationalDBQueryResult::hasNext(), implementation, DataObject::integerValue(), RelationalDBQueryResult::next(), opcodesByIDQuery(), RelationalDBConnection::query(), and DataObject::stringValue().

Referenced by createImplementationOfFU().

Here is the call graph for this function:

◆ addOperationImplementation()

void HDB::HDBManager::addOperationImplementation ( const OperationImplementation operation)

Add addOperationImplementation to the DB.

Definition at line 2527 of file HDBManager.cc.

2528 {
2529
2530
2531 std::string i1 = "INSERT INTO operation_implementation(id,name,latency,"
2532 "post_op_vhdl,post_op_verilog,bus_definition,"
2533 "initial_vhdl,initial_verilog) "
2534 "VALUES (NULL,\"" + operation.name + "\","
2535 + std::to_string(operation.latency) + ","
2536 "\"" + operation.postOpImplFileVhdl + "\","
2537 "\"" + operation.postOpImplFileVerilog + "\","
2538 "\"" + operation.absBusDefFile + "\","
2539 "\"" + operation.initialImplFileVhdl + "\","
2540 "\"" + operation.initialImplFileVerilog +
2541 "\");";
2544
2545 for (const auto r : operation.resources) {
2546 std::string i2 = "INSERT INTO operation_implementation_resources("
2547 "id, operation, resource, count) "
2548 "VALUES (NULL, " + std::to_string(newid)
2549 + ", " + std::to_string(r.id)
2550 + ", " + std::to_string(r.count)
2551 + ");";
2553 }
2554
2555 for (const auto r : operation.vhdlVariables) {
2556 std::string i2 = "INSERT INTO operation_implementation_variable("
2557 "id, operation, name, width, type, language) "
2558 "VALUES (NULL, " + std::to_string(newid)
2559 + ", \"" + r.name + "\""
2560 + ", \"" + r.width + "\""
2561 + ", \"" + r.type + "\""
2562 + ", \"VHDL\");";
2564 }
2565
2566 for (const auto r : operation.verilogVariables) {
2567 std::string i2 = "INSERT INTO operation_implementation_variable("
2568 "id, operation, name, width, type, language) "
2569 "VALUES (NULL, " + std::to_string(newid)
2570 + ", \"" + r.name + "\""
2571 + ", \"" + r.width + "\""
2572 + ", \"" + r.type + "\""
2573 + ", \"Verilog\");";
2575 }
2576
2577 std::string i3 = "INSERT INTO block_source_file(id,file,format) "
2578 "VALUES (NULL,\"" + operation.implFileVhdl +
2579 "\", " + std::to_string(BlockImplementationFile::VHDL) + ");";
2582
2583 std::string i4 = "INSERT INTO "
2584 "operation_implementation_source_file(id, operation, file) "
2585 "VALUES (NULL, " + std::to_string(newid) +
2586 ", " + std::to_string(vhdl) +
2587 ");";
2589
2590 std::string i5 = "INSERT INTO block_source_file(id,file,format) "
2591 "VALUES (NULL,\"" + operation.implFileVerilog +
2592 "\", " + std::to_string(BlockImplementationFile::Verilog) + ");";
2594 RowID verilog = dbConnection_->lastInsertRowID();
2595
2596 std::string i6 = "INSERT INTO "
2597 "operation_implementation_source_file(id, operation, file) "
2598 "VALUES (NULL, " + std::to_string(newid) +
2599 ", " + std::to_string(verilog) +
2600 ");";
2602}

References HDB::OperationImplementation::absBusDefFile, dbConnection_, HDB::OperationImplementation::implFileVerilog, HDB::OperationImplementation::implFileVhdl, HDB::OperationImplementation::initialImplFileVerilog, HDB::OperationImplementation::initialImplFileVhdl, RelationalDBConnection::lastInsertRowID(), HDB::OperationImplementation::latency, HDB::OperationImplementation::name, HDB::OperationImplementation::postOpImplFileVerilog, HDB::OperationImplementation::postOpImplFileVhdl, HDB::OperationImplementation::resources, RelationalDBConnection::updateQuery(), HDB::BlockImplementationFile::Verilog, HDB::OperationImplementation::verilogVariables, HDB::BlockImplementationFile::VHDL, and HDB::OperationImplementation::vhdlVariables.

Referenced by OperationImplementationDialog::onOK().

Here is the call graph for this function:

◆ addOperationImplementationResource()

void HDB::HDBManager::addOperationImplementationResource ( const OperationImplementationResource resource)

Add addOperationImplementationResource to the DB.

Definition at line 2468 of file HDBManager.cc.

2469 {
2470
2472 std::string(
2473 "INSERT INTO operation_implementation_resource(id,name,ipxact) "
2474 "VALUES (NULL, \"" +
2475 resource.name +"\", \"" + resource.ipxact+ "\");"));
2476 RowID resourceID = dbConnection_->lastInsertRowID();
2477
2478 auto t = resource.simFormats.begin();
2479 auto f = resource.simFiles.begin();
2480 for (; f != resource.simFiles.end(); ++f, ++t) {
2481 int type = fileFormat(*t) + 1;
2482
2484 std::string(
2485 "INSERT INTO block_source_file(id,file,format) "
2486 "VALUES (NULL, \"" + *f + "\","
2487 + std::to_string(type) +
2488 ");"));
2490
2492 std::string(
2493 "INSERT INTO operation_implementation_resource_source_file"
2494 "(id,resource,file) "
2495 "VALUES (NULL, " + std::to_string(resourceID) + ", "
2496 + std::to_string(fileID) +
2497 ");"));
2498 }
2499
2500 auto st = resource.synFormats.begin();
2501 auto sf = resource.synFiles.begin();
2502 for (; sf != resource.synFiles.end(); ++sf, ++st) {
2503 int type = fileFormat(*st) + 1;
2504
2506 std::string(
2507 "INSERT INTO block_source_file(id,file,format) "
2508 "VALUES (NULL, \"" + *sf + "\","
2509 + std::to_string(type) +
2510 ");"));
2512
2514 std::string(
2515 "INSERT INTO operation_implementation_resource_source_file"
2516 "(id,resource,file) "
2517 "VALUES (NULL, " + std::to_string(resourceID) + ", "
2518 + std::to_string(fileID) +
2519 ");"));
2520 }
2521}

References dbConnection_, fileFormat(), HDB::OperationImplementationResource::ipxact, RelationalDBConnection::lastInsertRowID(), HDB::OperationImplementationResource::name, HDB::OperationImplementationResource::simFiles, HDB::OperationImplementationResource::simFormats, HDB::OperationImplementationResource::synFiles, HDB::OperationImplementationResource::synFormats, and RelationalDBConnection::updateQuery().

Referenced by OperationImplementationResourceDialog::onOK().

Here is the call graph for this function:

◆ addOperationPipelinesToFUArchitecture()

void HDB::HDBManager::addOperationPipelinesToFUArchitecture ( FUArchitecture architecture,
RowID  id 
) const
private

Obtains data from HDB and creates the operation pipelines to the given FU architecture.

Parameters
architectureThe FU architecture to which the operations are added.
idID the FU architecture in HDB.

Definition at line 4503 of file HDBManager.cc.

4505 {
4506
4507 FunctionUnit& fu = architecture.architecture();
4508
4509 // make the SQL query to obtain IO usage data
4510 RelationalDBQueryResult* ioUsageData = NULL;
4511 try {
4512 ioUsageData = dbConnection_->query(ioUsageDataByIDQuery(id));
4513 } catch (const Exception& e) {
4514 assert(false);
4515 }
4516 int operationColumn = ioUsageData->column("operation.name");
4517 int cycleColumn = ioUsageData->column("io_usage.cycle");
4518 int ioColumn = ioUsageData->column("io_usage.io_number");
4519 int actionColumn = ioUsageData->column("io_usage.action");
4520
4521 while (ioUsageData->hasNext()) {
4522 ioUsageData->next();
4523 const DataObject& operationData = ioUsageData->data(operationColumn);
4524 const DataObject& cycleData = ioUsageData->data(cycleColumn);
4525 const DataObject& ioData = ioUsageData->data(ioColumn);
4526 const DataObject& actionData = ioUsageData->data(actionColumn);
4527
4528 string operationName = operationData.stringValue();
4529 int cycle = cycleData.integerValue();
4530 int ioNumber = ioData.integerValue();
4531 int action = actionData.boolValue();
4532
4533 assert(fu.hasOperation(operationName));
4534 HWOperation* operation = fu.operation(operationName);
4535 ExecutionPipeline* pipeline = operation->pipeline();
4536 if (action == READ_ACTION) {
4537 pipeline->addPortRead(ioNumber, cycle, 1);
4538 } else if (action == WRITE_ACTION) {
4539 pipeline->addPortWrite(ioNumber, cycle, 1);
4540 }
4541 }
4542
4543 delete ioUsageData;
4544 ioUsageData = NULL;
4545
4546 // add resource usages
4547 RelationalDBQueryResult* resUsageData = NULL;
4548 try {
4549 resUsageData = dbConnection_->query(resourceUsageDataByIDQuery(id));
4550 } catch (const Exception&) {
4551 assert(false);
4552 }
4553 operationColumn = resUsageData->column("operation.name");
4554 cycleColumn = resUsageData->column("pipeline_resource_usage.cycle");
4555 int resourceColumn = resUsageData->column("pipeline_resource.id");
4556
4557 int resourceName(0);
4558 std::map<int, string> resourceMap;
4559
4560 while (resUsageData->hasNext()) {
4561 resUsageData->next();
4562 const DataObject& operationData = resUsageData->data(
4563 operationColumn);
4564 const DataObject& cycleData = resUsageData->data(cycleColumn);
4565 const DataObject& resourceData = resUsageData->data(resourceColumn);
4566
4567 string operationName = operationData.stringValue();
4568 int cycle = cycleData.integerValue();
4569 int resourceID = resourceData.integerValue();
4570
4571 assert(fu.hasOperation(operationName));
4572 HWOperation* operation = fu.operation(operationName);
4573 ExecutionPipeline* pipeline = operation->pipeline();
4574 if (!MapTools::containsKey(resourceMap, resourceID)) {
4575 resourceMap.insert(
4576 std::pair<int, string>(
4577 resourceID, "res" + Conversion::toString(resourceName)));
4578 resourceName++;
4579 }
4580 pipeline->addResourceUse(
4582 resourceMap, resourceID), cycle, 1);
4583 }
4584
4585 delete resUsageData;
4586 resUsageData = NULL;
4587}
virtual bool boolValue() const
static std::string ioUsageDataByIDQuery(RowID id)
static std::string resourceUsageDataByIDQuery(RowID id)
static bool containsKey(const MapType &aMap, const KeyType &aKey)
void addResourceUse(const std::string &name, int start, int duration)
void addPortRead(int operand, int start, int duration)
void addPortWrite(int operand, int start, int duration)
virtual bool hasOperation(const std::string &name) const

References TTAMachine::ExecutionPipeline::addPortRead(), TTAMachine::ExecutionPipeline::addPortWrite(), TTAMachine::ExecutionPipeline::addResourceUse(), HDB::FUArchitecture::architecture(), assert, DataObject::boolValue(), RelationalDBQueryResult::column(), MapTools::containsKey(), RelationalDBQueryResult::data(), dbConnection_, RelationalDBQueryResult::hasNext(), TTAMachine::FunctionUnit::hasOperation(), DataObject::integerValue(), ioUsageDataByIDQuery(), MapTools::keyForValue(), RelationalDBQueryResult::next(), TTAMachine::FunctionUnit::operation(), TTAMachine::HWOperation::pipeline(), RelationalDBConnection::query(), READ_ACTION, resourceUsageDataByIDQuery(), DataObject::stringValue(), Conversion::toString(), and WRITE_ACTION.

Referenced by fuArchitectureByID().

Here is the call graph for this function:

◆ addPortsAndBindingsToFUArchitecture()

void HDB::HDBManager::addPortsAndBindingsToFUArchitecture ( FUArchitecture architecture,
RowID  id 
) const
private

Obtains data from HDB and creates ports and operand bindings to the given FU architecture that has the given ID in HDB.

Parameters
architectureThe FU architecture to which the ports are added.
idID of the FU architecture in HDB.

Definition at line 4392 of file HDBManager.cc.

4394 {
4395
4396 FunctionUnit& fu = architecture.architecture();
4397
4398 // make the SQL query to obtain the ports
4399 RelationalDBQueryResult* fuPorts = NULL;
4400 try {
4402 } catch (const Exception& e) {
4404 }
4405 int portIDColumnIndex = fuPorts->column("fu_data_port.id");
4406 int triggersColumnIndex = fuPorts->column("fu_data_port.triggers");
4407 int setsOpcodeColumnIndex = fuPorts->column("fu_data_port.sets_opcode");
4408 int guardSupportColumnIndex = fuPorts->column(
4409 "fu_data_port.guard_support");
4410 int widthColumnIndex = fuPorts->column("fu_data_port.width");
4411 int operationColumnIndex = fuPorts->column("operation.name");
4412 int bindingColumnIndex = fuPorts->column("io_binding.io_number");
4413
4414 // @fixme Do not assert() inside a library function in case of broken
4415 // user input data!!
4416 assert(portIDColumnIndex != RelationalDBQueryResult::UNKNOWN_INDEX);
4417 assert(triggersColumnIndex != RelationalDBQueryResult::UNKNOWN_INDEX);
4418 assert(setsOpcodeColumnIndex != RelationalDBQueryResult::UNKNOWN_INDEX);
4419 assert(
4420 guardSupportColumnIndex != RelationalDBQueryResult::UNKNOWN_INDEX);
4422 assert(operationColumnIndex != RelationalDBQueryResult::UNKNOWN_INDEX);
4423 assert(bindingColumnIndex != RelationalDBQueryResult::UNKNOWN_INDEX);
4424
4425 if (!fuPorts->hasNext()) {
4426 delete fuPorts;
4427 abortWithError("No row.");
4428 }
4429
4430 std::map<int, std::string> portIDMap;
4431
4432 // create ports, operations and bindings to the FU
4433 int name(1);
4434 while (fuPorts->hasNext()) {
4435 fuPorts->next();
4436
4437 const DataObject& idData = fuPorts->data(portIDColumnIndex);
4438 const DataObject& triggersData = fuPorts->data(triggersColumnIndex);
4439 const DataObject& setsOpcodeData = fuPorts->data(
4440 setsOpcodeColumnIndex);
4441 const DataObject& guardData = fuPorts->data(guardSupportColumnIndex);
4442 const DataObject& widthData = fuPorts->data(widthColumnIndex);
4443 const DataObject& operationData = fuPorts->data(
4444 operationColumnIndex);
4445 const DataObject& bindingData = fuPorts->data(bindingColumnIndex);
4446
4447 int portID = idData.integerValue();
4448
4449 // create operation if it is not created yet
4450 string operationName = operationData.stringValue();
4451 if (!fu.hasOperation(operationName)) {
4452 new HWOperation(operationName, fu);
4453 }
4454
4455 // create port if it is not created yet
4456 if (!MapTools::containsKey(portIDMap, portID)) {
4457 bool triggers = triggersData.boolValue();
4458 bool setsOpcode = setsOpcodeData.boolValue();
4459 string portName = "p" + Conversion::toString(name);
4460
4461 int width = DEFAULT_PORT_WIDTH;
4462 if (widthData.isNull()) {
4463 architecture.setParameterizedWidth(portName);
4464 } else {
4465 width = widthData.integerValue();
4466 }
4467 new FUPort(portName, width, fu, triggers, setsOpcode);
4468 portIDMap.insert(
4469 std::pair<int, string>(idData.integerValue(), portName));
4470 if (setsOpcode && !triggers)
4471 debugLog(
4472 std::string("Created a suspicious port ") + portName +
4473 " which sets opcode but does not trigger");
4474
4475 // set guard support
4476 if (guardData.boolValue()) {
4477 architecture.setGuardSupport(portName);
4478 }
4479
4480 name++;
4481 }
4482
4483 // create binding
4484 FUPort* portToBind = fu.operationPort(
4485 MapTools::valueForKey<string>(portIDMap, portID));
4486 HWOperation* operation = fu.operation(operationName);
4487 operation->bindPort(bindingData.integerValue(), *portToBind);
4488 }
4489
4490 delete fuPorts;
4491 fuPorts = NULL;
4492}
#define abortWithError(message)
const int DEFAULT_PORT_WIDTH
Definition HDBManager.cc:93
virtual bool isNull() const
static std::string fuPortsAndBindingsByIDQuery(RowID id)
virtual void bindPort(int operand, const FUPort &port)

References abortWithError, HDB::FUArchitecture::architecture(), assert, TTAMachine::HWOperation::bindPort(), DataObject::boolValue(), RelationalDBQueryResult::column(), MapTools::containsKey(), RelationalDBQueryResult::data(), dbConnection_, debugLog, DEFAULT_PORT_WIDTH, Exception::errorMessage(), fuPortsAndBindingsByIDQuery(), RelationalDBQueryResult::hasNext(), TTAMachine::FunctionUnit::hasOperation(), DataObject::integerValue(), DataObject::isNull(), MapTools::keyForValue(), RelationalDBQueryResult::next(), TTAMachine::FunctionUnit::operation(), TTAMachine::FunctionUnit::operationPort(), RelationalDBConnection::query(), HDB::FUArchitecture::setGuardSupport(), HDB::FUArchitecture::setParameterizedWidth(), DataObject::stringValue(), Conversion::toString(), and RelationalDBQueryResult::UNKNOWN_INDEX.

Referenced by fuArchitectureByID().

Here is the call graph for this function:

◆ addRFArchitecture()

RowID HDB::HDBManager::addRFArchitecture ( const RFArchitecture architecture) const

Adds the given RF architecture to the HDB.

Parameters
architectureThe architecture to add.
Returns
ID of the architecture added.

Definition at line 1447 of file HDBManager.cc.

1447 {
1448
1449 try {
1450 string query =
1451 "INSERT INTO rf_architecture(id,size,width,read_ports,"
1452 "write_ports,bidir_ports,latency,max_reads,max_writes,"
1453 "guard_support,guard_latency,zero_register) VALUES(NULL,";
1454 if (architecture.hasParameterizedSize()) {
1455 query += "NULL,";
1456 } else {
1457 query += (Conversion::toString(architecture.size()) + ",");
1458 }
1459 if (architecture.hasParameterizedWidth()) {
1460 query += "NULL,";
1461 } else {
1462 query += (Conversion::toString(architecture.width()) + ",");
1463 }
1464 query += (Conversion::toString(architecture.readPortCount()) + ",");
1465 query += (Conversion::toString(architecture.writePortCount()) + ",");
1466 query += (Conversion::toString(architecture.bidirPortCount()) + ",");
1467 query += (Conversion::toString(architecture.latency()) + ",");
1468 query += (Conversion::toString(architecture.maxReads()) + ",");
1469 query += (Conversion::toString(architecture.maxWrites()) + ",");
1470 query +=
1471 (Conversion::toString(architecture.hasGuardSupport()) + ",");
1472 query += (Conversion::toString(architecture.guardLatency()) + ",");
1473 query += (Conversion::toString(architecture.zeroRegister()));
1474 query += ");";
1475
1476 dbConnection_->updateQuery(query);
1477 } catch (const Exception& e) {
1479 assert(false);
1480 }
1481
1483}

References assert, HDB::RFArchitecture::bidirPortCount(), dbConnection_, debugLog, Exception::errorMessage(), HDB::RFArchitecture::guardLatency(), HDB::RFArchitecture::hasGuardSupport(), HDB::RFArchitecture::hasParameterizedSize(), HDB::RFArchitecture::hasParameterizedWidth(), RelationalDBConnection::lastInsertRowID(), HDB::RFArchitecture::latency(), HDB::RFArchitecture::maxReads(), HDB::RFArchitecture::maxWrites(), HDB::RFArchitecture::readPortCount(), HDB::RFArchitecture::size(), Conversion::toString(), RelationalDBConnection::updateQuery(), HDB::RFArchitecture::width(), HDB::RFArchitecture::writePortCount(), and HDB::RFArchitecture::zeroRegister().

Referenced by AddRFArchitectureCmd::Do().

Here is the call graph for this function:

◆ addRFCostEstimationData()

RowID HDB::HDBManager::addRFCostEstimationData ( RowID  rfID,
const std::string &  valueName,
const std::string &  value,
RowID  pluginID 
) const

Adds the given cost estimation data values to given RF entry.

Parameters
rfIDThe ID of the RF entry the cost data will be added. @valueName The name of the cost value. @value The cost value. @pluginID The ID of the cost function plugin that owns this data.

Definition at line 3232 of file HDBManager.cc.

3236 {
3237
3238 RowID dataID;
3239
3240 // add the data
3241 try {
3243 std::string(
3244 "INSERT INTO cost_estimation_data (id,plugin_reference,"
3245 "rf_reference,name,value) VALUES (NULL," +
3246 Conversion::toString(pluginID) + "," +
3247 Conversion::toString(rfID) + ",\"" + valueName + "\",\"" +
3248 value + "\");"));
3249 dataID = dbConnection_->lastInsertRowID();
3250 } catch (const Exception& e) {
3252 assert(false);
3253 }
3254 return dataID;
3255}

References assert, dbConnection_, debugLog, Exception::errorMessage(), RelationalDBConnection::lastInsertRowID(), Conversion::toString(), and RelationalDBConnection::updateQuery().

Here is the call graph for this function:

◆ addRFEntry()

RowID HDB::HDBManager::addRFEntry ( ) const

Adds an empty RF entry to the database.

Returns
ID of the entry added.

Definition at line 1543 of file HDBManager.cc.

1543 {
1544 try {
1546 std::string(
1547 "INSERT INTO rf(id,architecture,cost_function) "
1548 "VALUES(NULL,NULL,NULL);"));
1550 } catch (const Exception& e) {
1552 assert(false);
1553 }
1554
1555 // dummy return to avoid compiler whining
1556 assert(false);
1557 return 0;
1558}

References assert, dbConnection_, debugLog, Exception::errorMessage(), RelationalDBConnection::lastInsertRowID(), and RelationalDBConnection::updateQuery().

Referenced by AddRFEntryCmd::Do(), and AddRFImplementationCmd::Do().

Here is the call graph for this function:

◆ addRFExternalPortsToImplementation()

void HDB::HDBManager::addRFExternalPortsToImplementation ( RFImplementation implementation,
RowID  entryID 
) const
private

Adds external ports to the given RF implementation which is the implementation of the RF entry that has the given ID.

Parameters
implementationThe implementation.
entryIDID of the RF implementation entry.

Definition at line 5129 of file HDBManager.cc.

5131 {
5132
5133 if (!dbConnection_->tableExistsInDB("rf_external_port")) {
5134 return;
5135 }
5136
5137 RelationalDBQueryResult* extPortData = NULL;
5138 try {
5139 extPortData = dbConnection_->query(rfExternalPortsByIDQuery(entryID));
5140 } catch (const Exception& e) {
5141 assert(false);
5142 }
5143
5144 int extPortNameColumn = extPortData->column("rf_external_port.name");
5145 int directionColumn = extPortData->column(
5146 "rf_external_port.direction");
5147 int extPortWidthFormulaColumn = extPortData->column(
5148 "rf_external_port.width_formula");
5149 int descriptionColumn = extPortData->column(
5150 "rf_external_port.description");
5151
5152 while (extPortData->hasNext()) {
5153 extPortData->next();
5154 const DataObject& nameData = extPortData->data(
5155 extPortNameColumn);
5156 const DataObject& directionData = extPortData->data(
5157 directionColumn);
5158 const DataObject& widthFormulaData = extPortData->data(
5159 extPortWidthFormulaColumn);
5160 const DataObject& descriptionData = extPortData->data(
5161 descriptionColumn);
5162
5163 string name = nameData.stringValue();
5164 string widthFormula = widthFormulaData.stringValue();
5165 string description = descriptionData.stringValue();
5166
5167 Direction direction;
5168 if (directionData.stringValue() == IN_DIRECTION) {
5169 direction = IN;
5170 } else if (directionData.stringValue() == OUT_DIRECTION) {
5171 direction = OUT;
5172 } else {
5173 assert(directionData.stringValue() == BIDIR_DIRECTION);
5174 direction = BIDIR;
5175 }
5176
5177 new RFExternalPort(
5178 name, direction, widthFormula, description, implementation);
5179 }
5180
5181 delete extPortData;
5182 extPortData = NULL;
5183
5184 // add parameter dependencies
5185 if (!dbConnection_->tableExistsInDB("rf_ext_port_parameter_dependency")) {
5186 return;
5187 }
5188
5189 for (int i = 0; i < implementation.externalPortCount(); i++) {
5190 RFExternalPort& port = implementation.externalPort(i);
5191 try {
5193 std::string(
5194 "SELECT rf_implementation_parameter.name FROM "
5195 "rf_implementation_parameter, rf_external_port, "
5196 "rf_ext_port_parameter_dependency, rf_implementation "
5197 "WHERE rf_implementation.rf=" +
5198 Conversion::toString(entryID) +
5199 " AND rf_external_port.rf_impl=rf_implementation.id AND "
5200 "rf_external_port.name=\"" + port.name() +
5201 "\" AND rf_ext_port_parameter_dependency.port="
5202 "rf_external_port.id AND rf_implementation_parameter.id="
5203 "rf_ext_port_parameter_dependency.parameter;"));
5204 while (result->hasNext()) {
5205 result->next();
5206 const DataObject& paramData = result->data(0);
5207 port.setParameterDependency(paramData.stringValue());
5208 }
5209 delete result;
5210 } catch (const Exception& e) {
5212 assert(false);
5213 }
5214 }
5215}
static std::string rfExternalPortsByIDQuery(RowID id)
virtual bool tableExistsInDB(const std::string &tableName)=0

References assert, HDB::BIDIR, BIDIR_DIRECTION, RelationalDBQueryResult::column(), RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), implementation, HDB::IN, IN_DIRECTION, HDB::ExternalPort::name(), RelationalDBQueryResult::next(), HDB::OUT, OUT_DIRECTION, RelationalDBConnection::query(), rfExternalPortsByIDQuery(), HDB::ExternalPort::setParameterDependency(), DataObject::stringValue(), RelationalDBConnection::tableExistsInDB(), and Conversion::toString().

Referenced by createImplementationOfRF().

Here is the call graph for this function:

◆ addRFImplementation()

RowID HDB::HDBManager::addRFImplementation ( const RFImplementation implementation,
RowID  rfEntryID 
)

Adds an implementation for the the given RF entry.

Parameters
implementationThe implementation to add.
rfEntryIDID of the RF entry.
Exceptions
InvalidDataIf the RF entry has an implementation already or if the database does not contain an RF entry with the given ID.

Definition at line 1626 of file HDBManager.cc.

1627 {
1628 if (!hasRFEntry(rfEntryID)) {
1629 throw InvalidData(__FILE__, __LINE__, __func__);
1630 }
1631
1632 RFEntry* entry = rfByEntryID(rfEntryID);
1633 if (entry->hasImplementation()) {
1634 throw InvalidData(__FILE__, __LINE__, __func__);
1635 }
1636 delete entry;
1637 entry = NULL;
1638
1639 if(!hasColumn("rf_implementation", "sac_param")) {
1640 addBooleanColumn("rf_implementation", "sac_param");
1641 }
1642
1643 // Create tables for external ports, parameters and parameter dependecies
1644 // if needed.
1645 if (!dbConnection_->tableExistsInDB("rf_implementation_parameter")) {
1647 }
1648 if (!dbConnection_->tableExistsInDB("rf_external_port")) {
1650 }
1651 if (!dbConnection_->tableExistsInDB("rf_ext_port_parameter_dependency")) {
1653
1654 }
1655
1656 try {
1658
1659 int sacFlagAsInt = implementation.separateAddressCycleParameter();
1660
1661 // insert into rf_implementation table
1662 std::string insert_query(
1663 "INSERT INTO rf_implementation(id,name,size_param,"
1664 "width_param,clk_port,rst_port,glock_port,guard_port,sac_param,rf) "
1665 "VALUES(NULL,\"" + implementation.moduleName() + "\",\"" +
1666 implementation.sizeParameter() + "\",\"" +
1667 implementation.widthParameter() + "\",\"" +
1668 implementation.clkPort() + "\",\"" +
1669 implementation.rstPort() + "\",\"" +
1670 implementation.glockPort() + "\",\"" +
1671 implementation.guardPort() + "\"," +
1672 Conversion::toString(sacFlagAsInt) + "," +
1673 Conversion::toString(rfEntryID) + ");");
1674
1675 dbConnection_->updateQuery(insert_query);
1677
1678 // insert into rf_data_port table
1679 for (int i = 0; i < implementation.portCount(); i++) {
1680 RFPortImplementation& port = implementation.port(i);
1682 std::string(
1683 "INSERT INTO rf_data_port(id,name,direction,load_port,"
1684 "opcode_port,opcode_port_width_formula,rf_impl) "
1685 "VALUES(NULL,\"" + port.name() + "\",\"" +
1686 directionString(port.direction()) + "\",\"" +
1687 port.loadPort() + "\",\"" + port.opcodePort() + "\",\""
1688 + port.opcodePortWidthFormula() + "\"," +
1689 Conversion::toString(implID) + ");"));
1690 }
1691
1692 // insert into block_source_file table
1693 for (int i = 0; i < implementation.implementationFileCount(); i++) {
1694 BlockImplementationFile& file = implementation.file(i);
1696 }
1697
1698 // insert into rf_source_file table
1699 for (int i = 0; i < implementation.implementationFileCount(); i++) {
1700 BlockImplementationFile& file = implementation.file(i);
1701 string path = file.pathToFile();
1703 std::string(
1704 "INSERT INTO rf_source_file values(NULL, " +
1705 Conversion::toString(implID) +
1706 ", (SELECT id FROM block_source_file WHERE file=\"" +
1707 path + "\"));"));
1708 }
1709
1710 // insert into rf_external_port table
1711 for (int i = 0; i < implementation.externalPortCount(); i++) {
1712 RFExternalPort& port = implementation.externalPort(i);
1713 string direction = directionString(port.direction());
1715 std::string(
1716 "INSERT INTO rf_external_port(id,name,direction,"
1717 "width_formula,description,rf_impl) VALUES(NULL,\"" +
1718 port.name() + "\",\"" + direction + "\",\"" +
1719 port.widthFormula() + "\",\"" + port.description() +
1720 "\"," + Conversion::toString(implID) + ");"));
1721 }
1722
1723 // insert into rf_implementation_parameter table
1724 for (int i = 0; i < implementation.parameterCount(); i++) {
1725 RFImplementation::Parameter param = implementation.parameter(i);
1727 std::string(
1728 "INSERT INTO rf_implementation_parameter(id,name,type,"
1729 "value,rf_impl) VALUES(NULL,\"" + param.name +
1730 "\",\"" + param.type + "\",\"" + param.value +
1731 "\"," + Conversion::toString(implID) + ");"));
1732 }
1733
1734 // Insert implicit parameters to rf_implementation_parameter table
1735 // (size and width parameter references if not empty and parameters
1736 // for them do not exists).
1737 string widthParam = implementation.widthParameter();
1738 if (!widthParam.empty() && !implementation.hasParameter(widthParam)) {
1740 std::string(
1741 "INSERT INTO rf_implementation_parameter(id,name,type,"
1742 "value,rf_impl) VALUES(NULL,\"" + widthParam +
1743 "\", \"integer\", \"\"," +
1744 Conversion::toString(implID) + ");"));
1745 }
1746 string sizeParam = implementation.sizeParameter();
1747 if (!sizeParam.empty() && !implementation.hasParameter(sizeParam)) {
1749 std::string(
1750 "INSERT INTO rf_implementation_parameter(id,name,type,"
1751 "value,rf_impl) VALUES(NULL,\"" + sizeParam +
1752 "\", \"integer\", \"\"," +
1753 Conversion::toString(implID) + ");"));
1754 }
1755
1756 // insert into rf_ext_port_parameter_dependency table
1757 for (int i = 0; i < implementation.externalPortCount(); i++) {
1758 RFExternalPort& port = implementation.externalPort(i);
1759 for (int i = 0; i < port.parameterDependencyCount(); i++) {
1760 string param = port.parameterDependency(i);
1762 std::string(
1763 "INSERT INTO rf_ext_port_parameter_dependency(id,"
1764 "port,parameter) VALUES(NULL,(SELECT id FROM "
1765 "rf_external_port WHERE rf_impl=" +
1766 Conversion::toString(implID) + " AND name=\"" +
1767 port.name() + "\"),(SELECT id FROM "
1768 "rf_implementation_parameter WHERE rf_impl=" +
1769 Conversion::toString(implID) + " AND name=\"" +
1770 param + "\"));"));
1771 }
1772 }
1773
1775 return implID;
1776
1777 } catch (const Exception& e) {
1780 assert(false);
1781 }
1782
1783 // dummy return to avoid compiler whining
1784 assert(false);
1785 return 0;
1786}
const string CQ_RF_EXT_PORT_PARAMETER_DEPENDENCY
const string CQ_RF_IMPLEMENTATION_PARAMETER
const string CQ_RF_EXTERNAL_PORT
RFEntry * rfByEntryID(RowID id) const
HDB::Parameter Parameter
Parameter of FU implementation.

References __func__, addBlockImplementationFileToHDB(), addBooleanColumn(), assert, RelationalDBConnection::beginTransaction(), RelationalDBConnection::commit(), CQ_RF_EXT_PORT_PARAMETER_DEPENDENCY, CQ_RF_EXTERNAL_PORT, CQ_RF_IMPLEMENTATION_PARAMETER, dbConnection_, RelationalDBConnection::DDLQuery(), debugLog, HDB::ExternalPort::description(), HDB::ExternalPort::direction(), HDB::RFPortImplementation::direction(), directionString(), Exception::errorMessage(), hasColumn(), HDB::RFEntry::hasImplementation(), hasRFEntry(), implementation, RelationalDBConnection::lastInsertRowID(), HDB::PortImplementation::loadPort(), HDB::ExternalPort::name(), HDB::Parameter::name, HDB::PortImplementation::name(), HDB::RFPortImplementation::opcodePort(), HDB::RFPortImplementation::opcodePortWidthFormula(), HDB::ExternalPort::parameterDependency(), HDB::ExternalPort::parameterDependencyCount(), HDB::BlockImplementationFile::pathToFile(), rfByEntryID(), RelationalDBConnection::rollback(), RelationalDBConnection::tableExistsInDB(), Conversion::toString(), HDB::Parameter::type, RelationalDBConnection::updateQuery(), HDB::Parameter::value, and HDB::ExternalPort::widthFormula().

Referenced by AddRFImplementationCmd::Do(), and HDBEditorModifyCmd::Do().

Here is the call graph for this function:

◆ addRFParametersToImplementation()

void HDB::HDBManager::addRFParametersToImplementation ( RFImplementation implementation,
RowID  entryID 
) const
private

Adds parameters to the given RF implementation which is the implementation of the RF entry that has the given ID.

Parameters
implementationThe implementation.
entryIDID of the RF entry.

Definition at line 5260 of file HDBManager.cc.

5262 {
5263
5264 if (!dbConnection_->tableExistsInDB("rf_implementation_parameter")) {
5265 // Add implicit parameters: size and width parameters if older
5266 // hdb is opened.
5267 if (implementation.widthParameter() != "") {
5268 implementation.addParameter(implementation.widthParameter(),
5269 "integer", "");
5270 }
5271 if (implementation.sizeParameter() != "") {
5272 implementation.addParameter(implementation.sizeParameter(),
5273 "integer", "");
5274 }
5275 return;
5276 }
5277
5278 RelationalDBQueryResult* result = NULL;
5279 try {
5280 result = dbConnection_->query(
5282 } catch (const Exception&) {
5283 assert(false);
5284 }
5285
5286 while (result->hasNext()) {
5287 result->next();
5288 const DataObject& nameData = result->data("name");
5289 const DataObject& typeData = result->data("type");
5290 const DataObject& valueData = result->data("value");
5291 string name = nameData.stringValue();
5292 string type = typeData.stringValue();
5293 string value = valueData.stringValue();
5294 implementation.addParameter(name, type, value);
5295 }
5296
5297 // If RF implementation's size and width parameter dependencies do not have
5298 // parameter defined, add default parameters for them.
5299 if (implementation.widthParameter() != "" &&
5300 !implementation.hasParameter(implementation.widthParameter())) {
5301 implementation.addParameter(implementation.widthParameter(),
5302 "integer", "");
5303 implementation.addParameter(implementation.sizeParameter(),
5304 "integer", "");
5305 }
5306 if (implementation.sizeParameter() != "" &&
5307 !implementation.hasParameter(implementation.sizeParameter())) {
5308 implementation.addParameter(implementation.sizeParameter(),
5309 "integer", "");
5310 }
5311 delete result;
5312}
static std::string rfImplementationParametersByIDQuery(RowID id)

References assert, RelationalDBQueryResult::data(), dbConnection_, RelationalDBQueryResult::hasNext(), implementation, RelationalDBQueryResult::next(), RelationalDBConnection::query(), rfImplementationParametersByIDQuery(), DataObject::stringValue(), and RelationalDBConnection::tableExistsInDB().

Referenced by createImplementationOfRF().

Here is the call graph for this function:

◆ addSocketCostEstimationData()

RowID HDB::HDBManager::addSocketCostEstimationData ( RowID  socketID,
const std::string &  valueName,
const std::string &  value,
RowID  pluginID 
) const

Adds the given cost estimation data values to given Socket entry.

Parameters
socketIDThe ID of the Socket entry the cost data will be added. @valueName The name of the cost value. @value The cost value. @pluginID The ID of the cost function plugin that owns this data.

Definition at line 3664 of file HDBManager.cc.

3668 {
3669
3670
3671 RowID dataID;
3672
3673 // add the data
3674 try {
3676 std::string(
3677 "INSERT INTO cost_estimation_data (id,plugin_reference,"
3678 "socket_reference,name,value) VALUES (NULL," +
3679 Conversion::toString(pluginID) + "," +
3680 Conversion::toString(socketID) + ",\"" + valueName + "\",\"" +
3681 value + "\");"));
3682 dataID = dbConnection_->lastInsertRowID();
3683 } catch (const Exception& e) {
3685 assert(false);
3686 }
3687 return dataID;
3688}

References assert, dbConnection_, debugLog, Exception::errorMessage(), RelationalDBConnection::lastInsertRowID(), Conversion::toString(), and RelationalDBConnection::updateQuery().

Here is the call graph for this function:

◆ addSocketEntry()

RowID HDB::HDBManager::addSocketEntry ( ) const

Adds an empty Socket entry to the database.

Parameters
entryThe Socket entry.
Returns
ID of the added Socket entry.

Definition at line 3592 of file HDBManager.cc.

3592 {
3593 try {
3595 std::string("INSERT INTO socket(id) VALUES(NULL);"));
3597 } catch (const Exception& e) {
3599 assert(false);
3600 }
3601
3602 // dummy return to avoid compiler whining
3603 assert(false);
3604 return 0;
3605}

References assert, dbConnection_, debugLog, Exception::errorMessage(), RelationalDBConnection::lastInsertRowID(), and RelationalDBConnection::updateQuery().

Referenced by AddSocketEntryCmd::Do().

Here is the call graph for this function:

◆ areCompatiblePipelines()

bool HDB::HDBManager::areCompatiblePipelines ( const PipelineElementUsageTable table)
staticprivate

Checks whether the pipeline element usages of the given table are compatible.

They are compatible if the first pipeline is more restrictive or equal to the second pipeline.

Parameters
tableThe table that describes the pipeline usages.
Returns
True if the pipelines are compatible, otherwise false.

Definition at line 5620 of file HDBManager.cc.

5620 {
5621
5622 for (size_t i = 0; i < table.size(); i++) {
5623 std::set<const PipelineElement*> usedResources1 = table[i].usage1;
5624 // create a set of vector indices which mean what stages cannot be
5625 // executed at the same time
5626 std::set<size_t> illegalStages1;
5627 for (size_t usageIndex = 0; usageIndex < table.size();
5628 usageIndex++) {
5629 if (usageIndex == i) {
5630 continue;
5631 }
5632 std::set<const PipelineElement*> resources =
5633 table[usageIndex].usage1;
5634 std::set<const PipelineElement*> intersect;
5635 SetTools::intersection(usedResources1, resources, intersect);
5636 if (!intersect.empty()) {
5637 illegalStages1.insert(usageIndex);
5638 }
5639 }
5640
5641 // create a similar vector of the other pipeline
5642 std::set<const PipelineElement*> usedResources2 = table[i].usage2;
5643 std::set<size_t> illegalStages2;
5644 for (size_t usageIndex = 0; usageIndex < table.size();
5645 usageIndex++) {
5646 if (usageIndex == i) {
5647 continue;
5648 }
5649 std::set<const PipelineElement*> resources =
5650 table[usageIndex].usage2;
5651 std::set<const PipelineElement*> intersect;
5652 SetTools::intersection(usedResources2, resources, intersect);
5653 if (!intersect.empty()) {
5654 illegalStages2.insert(usageIndex);
5655 }
5656 }
5657
5658 std::set<size_t> difference;
5659 AssocTools::difference(illegalStages2, illegalStages1, difference);
5660 if (!difference.empty()) {
5661 return false;
5662 }
5663 }
5664
5665 return true;
5666}
static void difference(const ContainerType &firstContainer, const ContainerType &secondContainer, ContainerType &difference)
static void intersection(const std::set< ValueType > &firstContainer, const std::set< ValueType > &secondContainer, std::set< ValueType > &intersection)

References AssocTools::difference(), and SetTools::intersection().

Referenced by isMatchingArchitecture().

Here is the call graph for this function:

◆ blockSourceFile()

std::list< std::string > HDB::HDBManager::blockSourceFile ( )

Returns block source file names

Returns
List of block source file names.

Definition at line 7124 of file HDBManager.cc.

7124 {
7125
7126 RelationalDBQueryResult* queryResult;
7127 try {
7128 queryResult = dbConnection_->query(
7129 std::string("SELECT * FROM block_source_file"));
7130 } catch (const Exception& e) {
7132 assert(false);
7133 }
7134
7135 std::list<std::string> files;
7136 while (queryResult->hasNext()) {
7137 queryResult->next();
7138 files.push_back(queryResult->data(1).stringValue());
7139 }
7140
7141 delete queryResult;
7142 return files;
7143}

References assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), and DataObject::stringValue().

Here is the call graph for this function:

◆ busCostEstimationData()

DataObject HDB::HDBManager::busCostEstimationData ( const std::string &  valueName,
RowID  busID,
const std::string &  pluginName 
) const

Returns bus cost estimation data.

This version assumes that there's only one entry with given parameters.

Parameters
valueNameName of the value to fetch.
busIDThe ID of the bus entry.
pluginNameName of the cost estimation plugin that owns the data.
Returns
The data.
Exceptions
KeyNotFoundIf the HDB does not contain bus cost estimation data with the given arguments.

Definition at line 3492 of file HDBManager.cc.

3494 {
3495 RelationalDBQueryResult* queryResult = NULL;
3496 try {
3497 queryResult = dbConnection_->query(
3498 std::string(
3499 "SELECT value "
3500 "FROM cost_estimation_data, cost_function_plugin "
3501 "WHERE plugin_reference = cost_function_plugin.id AND "
3502 "cost_function_plugin.name LIKE('") +
3503 pluginName + "') " +
3504 " AND rf_reference IS NULL " +
3505 " AND socket_reference IS NULL AND " +
3506 " bus_reference = " + Conversion::toString(busID) +
3507 " AND cost_estimation_data.name LIKE('" + valueName + "');");
3508 } catch (const Exception& e) {
3509 // should not throw in any case
3511 assert(false);
3512 }
3513
3514 if (queryResult->hasNext()) {
3515 queryResult->next();
3516
3517 DataObject value = queryResult->data("value");
3518
3519 delete queryResult;
3520 queryResult = NULL;
3521
3522 return value;
3523 } else {
3524 delete queryResult;
3525 throw KeyNotFound(__FILE__, __LINE__, __func__);
3526 }
3527 // silence compiler warning
3528 throw 1;
3529}

References __func__, assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), and Conversion::toString().

Referenced by DefaultICDecoderEstimator::delayOfBus().

Here is the call graph for this function:

◆ busCostEstimationDataIDs()

std::set< RowID > HDB::HDBManager::busCostEstimationDataIDs ( RowID  busID) const

Returns a set of cost estimation data IDs which reference the given bus entry.

Parameters
busIDID of the bus entry.
Returns
Set of cost estimation data IDs.

Definition at line 6500 of file HDBManager.cc.

6500 {
6501
6502 // make the SQL query to obtain IDs.
6503 RelationalDBQueryResult* queryResult = NULL;
6504 try {
6505 std::string theQuery =
6506 std::string(
6507 "SELECT id "
6508 "FROM cost_estimation_data "
6509 "WHERE bus_reference = ") +
6510 Conversion::toString(busID);
6511
6512 queryResult = dbConnection_->query(theQuery);
6513
6514 } catch (const Exception& e) {
6515 // should not throw in any case
6517 assert(false);
6518 }
6519
6520 std::set<RowID> ids;
6521
6522 while (queryResult->hasNext()) {
6523 queryResult->next();
6524
6525 ids.insert(queryResult->data("id").integerValue());
6526 }
6527
6528 delete queryResult;
6529 queryResult = NULL;
6530 return ids;
6531}

References assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), DataObject::integerValue(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), and Conversion::toString().

Referenced by HDBToHtml::busEntryToHtml().

Here is the call graph for this function:

◆ busCostEstimationDataList()

HDBManager::DataObjectList * HDB::HDBManager::busCostEstimationDataList ( const std::string &  valueName,
RowID  busID,
const std::string &  pluginName 
) const

Returns a list of bus cost estimation data.

Parameters
valueNameName of the value to fetch.
busIDThe ID of the bus entry.
pluginNameName of the cost estimation plugin that owns the data.
Returns
The data. Becomes property of the caller.
Exceptions
KeyNotFoundIf the HDB does not contain bus cost estimation data with the given arguments.

Definition at line 3542 of file HDBManager.cc.

3544 {
3545 RelationalDBQueryResult* queryResult = NULL;
3546 try {
3547 queryResult = dbConnection_->query(
3548 std::string(
3549 "SELECT value "
3550 "FROM cost_estimation_data, cost_function_plugin "
3551 "WHERE plugin_reference = cost_function_plugin.id AND "
3552 "cost_function_plugin.name LIKE('") +
3553 pluginName + "') " +
3554 " AND rf_reference IS NULL " +
3555 " AND socket_reference IS NULL AND " +
3556 " bus_reference = " + Conversion::toString(busID) +
3557 " AND cost_estimation_data.name LIKE('" + valueName + "');");
3558 } catch (const Exception& e) {
3559 // should not throw in any case
3561 assert(false);
3562 }
3563
3564 if (queryResult->hasNext()) {
3565
3566 DataObjectList* data = new DataObjectList;
3567
3568 while (queryResult->hasNext()) {
3569 queryResult->next();
3570 DataObject value = queryResult->data("value");
3571 data->push_back(value);
3572 }
3573
3574 delete queryResult;
3575 queryResult = NULL;
3576 return data;
3577 } else {
3578 delete queryResult;
3579 throw KeyNotFound(__FILE__, __LINE__, __func__);
3580 }
3581 // silence compiler warning
3582 throw 1;
3583}
std::list< DataObject > DataObjectList
Definition HDBManager.hh:86

References __func__, assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), and Conversion::toString().

Here is the call graph for this function:

◆ busEntryByIDQuery()

std::string HDB::HDBManager::busEntryByIDQuery ( RowID  id)
staticprivate

Creates an SQL query for getting the Bus entry that has the given ID.

The result set has fields {id}.

Parameters
idID of the entry.
Returns
The SQL query.

Definition at line 5805 of file HDBManager.cc.

5805 {
5806 string idString = Conversion::toString(id);
5807 string query =
5808 "SELECT * "
5809 "FROM bus "
5810 "WHERE bus.id=" + idString + ";";
5811 return query;
5812}

References Conversion::toString().

Referenced by hasBusEntry().

Here is the call graph for this function:

◆ busEntryIDs()

std::set< RowID > HDB::HDBManager::busEntryIDs ( ) const

Returns a set of Bus entry IDs in the database.

Returns
A set containing all the Bus entry IDs in the database.

Definition at line 2085 of file HDBManager.cc.

2085 {
2086
2087 string query = "SELECT id AS 'bus.id' FROM bus;";
2088
2089 // make the SQL query to obtain all the IDs
2090 RelationalDBQueryResult* queryResult = NULL;
2091 try {
2092 queryResult = dbConnection_->query(query);
2093 } catch (const Exception& e) {
2094 // should not throw in any case
2096 assert(false);
2097 }
2098
2099 std::set<RowID> idSet;
2100 while (queryResult->hasNext()) {
2101 queryResult->next();
2102 const DataObject& idData = queryResult->data("bus.id");
2103 idSet.insert(idData.integerValue());
2104 }
2105
2106 delete queryResult;
2107 return idSet;
2108}

References assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), DataObject::integerValue(), RelationalDBQueryResult::next(), and RelationalDBConnection::query().

Referenced by CostDatabase::buildBuses(), CostEstimationDataDialog::onEntryTypeSelection(), and HDBBrowserWindow::update().

Here is the call graph for this function:

◆ canRemoveFUArchitecture()

bool HDB::HDBManager::canRemoveFUArchitecture ( RowID  archID) const

Tells whether the FU architecture that has the given ID can be removed from the database. It can be removed only if no FU entry uses it.

Parameters
archIDID of the FU architecture.
Returns
True if the architecture can be removed, otherwise false.

Definition at line 890 of file HDBManager.cc.

890 {
891
892 // check whether the architecture is used by FU entries
893 try {
895 std::string(
896 "SELECT id FROM fu WHERE architecture=" +
897 Conversion::toString(archID) + ";"));
898 if (queryResult->hasNext()) {
899 // there is an FU entry using the architecture
900 delete queryResult;
901 return false;
902 } else {
903 delete queryResult;
904 return true;
905 }
906 } catch (const Exception& e) {
908 assert(false);
909 }
910
911 // dummy return to avoid compiler whining
912 assert(false);
913 return false;
914}

References assert, dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), RelationalDBConnection::query(), and Conversion::toString().

Referenced by HDBEditorDeleteCmd::Do(), and removeFUArchitecture().

Here is the call graph for this function:

◆ canRemoveRFArchitecture()

bool HDB::HDBManager::canRemoveRFArchitecture ( RowID  archID) const

Tells whether the given RF architecture can be removed.

The architecture can be removed if it is not used by any RF entry.

Parameters
archIDID of the RF architecture.

Definition at line 1494 of file HDBManager.cc.

1494 {
1495 try {
1497 std::string(
1498 "SELECT id FROM rf WHERE architecture=" +
1499 Conversion::toString(archID) + ";"));
1500 bool returnValue = !result->hasNext();
1501 delete result;
1502 return returnValue;
1503 } catch (const Exception& e) {
1505 assert(false);
1506 }
1507
1508 // dummy return to avoid compiler whining
1509 assert(false);
1510 return false;
1511}

References assert, dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), RelationalDBConnection::query(), and Conversion::toString().

Referenced by HDBEditorDeleteCmd::Do(), and removeRFArchitecture().

Here is the call graph for this function:

◆ containsFUArchitecture()

bool HDB::HDBManager::containsFUArchitecture ( RowID  id) const
private

Tells whether the HDB contains a FU architecture that has the given ID.

Parameters
idThe ID.
Returns
True if the HDB contains the architecture, otherwise false.

Definition at line 4198 of file HDBManager.cc.

4198 {
4199
4200 try {
4202 std::string(
4203 "SELECT id FROM fu_architecture WHERE id=" +
4204 Conversion::toString(id) + ";"));
4205 bool returnValue = result->hasNext();
4206 delete result;
4207 return returnValue;
4208 } catch (const Exception& e) {
4210 assert(false);
4211 }
4212
4213 // dummy return to avoid compiler whining
4214 assert(false);
4215 return false;
4216}

References assert, dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), RelationalDBConnection::query(), and Conversion::toString().

Referenced by fuArchitectureByID(), and setArchitectureForFU().

Here is the call graph for this function:

◆ containsImplementationFile()

bool HDB::HDBManager::containsImplementationFile ( const std::string &  pathToFile) const
private

Tells whether the HDB contains the given block implementation file.

Parameters
pathToFileFull path to the file.

Definition at line 4171 of file HDBManager.cc.

4171 {
4172 try {
4174 std::string(
4175 "SELECT * FROM block_source_file WHERE file=\"" +
4176 pathToFile + "\";"));
4177 bool returnValue = result->hasNext();
4178 delete result;
4179 return returnValue;
4180 } catch (const Exception& e) {
4182 assert(false);
4183 }
4184
4185 // dummy return to avoid compiler whining
4186 assert(false);
4187 return false;
4188}

References assert, dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), and RelationalDBConnection::query().

Referenced by addBlockImplementationFileToHDB().

Here is the call graph for this function:

◆ containsOperation()

bool HDB::HDBManager::containsOperation ( const std::string &  opName) const
private

Tells whether the HDB contains the given operation in operation table.

Parameters
opNameName of the operation.
Returns
True if HDB contains the operation, otherwise false.

Definition at line 4145 of file HDBManager.cc.

4145 {
4146 try {
4148 std::string(
4149 "SELECT * FROM operation WHERE lower(name)=lower(\"" + opName
4150 + "\");"));
4151 bool returnValue = result->hasNext();
4152 delete result;
4153 return returnValue;
4154 } catch (const Exception& e) {
4156 assert(false);
4157 }
4158
4159 // dummy return to avoid compiler whining
4160 assert(false);
4161 return false;
4162}

References assert, dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), and RelationalDBConnection::query().

Referenced by addFUArchitecture(), and addFUImplementation().

Here is the call graph for this function:

◆ containsRFArchitecture()

bool HDB::HDBManager::containsRFArchitecture ( RowID  id) const
private

Tells whether the HDB contains a RF architecture with the given ID.

Parameters
idThe ID.
Returns
True if the HDB contains the architecture, otherwise false.

Definition at line 4226 of file HDBManager.cc.

4226 {
4227 try {
4229 std::string(
4230 "SELECT id FROM rf_architecture WHERE id=" +
4231 Conversion::toString(id) + ";"));
4232 bool returnValue = result->hasNext();
4233 delete result;
4234 return returnValue;
4235 } catch (const Exception& e) {
4237 assert(false);
4238 }
4239
4240 // dummy return to avoid compiler whining
4241 assert(false);
4242 return false;
4243}

References assert, dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), RelationalDBConnection::query(), and Conversion::toString().

Referenced by rfArchitectureByID(), and setArchitectureForRF().

Here is the call graph for this function:

◆ costEstimationData()

CostEstimationData HDB::HDBManager::costEstimationData ( RowID  entryId) const

Returns cost estimation data with the given id.

Parameters
entryIdId of the cost estimation data entry.
Returns
The data.
Exceptions
KeyNotFoundIf the HDB does not contain cost estimation data with the given arguments.

Definition at line 6309 of file HDBManager.cc.

6309 {
6310 // make the SQL query to obtain implementation data
6311 RelationalDBQueryResult* queryResult = NULL;
6312 try {
6313 std::string theQuery =
6314 std::string(
6315 "SELECT value, cost_estimation_data.name AS data_name, "
6316 " cost_function_plugin.id AS plugin_id, "
6317 " fu_reference, rf_reference, bus_reference, "
6318 " socket_reference "
6319 "FROM cost_estimation_data, cost_function_plugin "
6320 "WHERE cost_estimation_data.plugin_reference="
6321 " cost_function_plugin.id AND "
6322 " cost_estimation_data.id = ") +
6323 Conversion::toString(entryId);
6324
6325 queryResult = dbConnection_->query(theQuery);
6326
6327 } catch (const Exception& e) {
6328 // should not throw in any case
6330 assert(false);
6331 }
6332
6333 if (queryResult->hasNext()) {
6334 queryResult->next();
6335
6336 std::string name = queryResult->data("data_name").stringValue();
6337
6338 CostEstimationData data;
6339 data.setName(name);
6340 data.setValue(queryResult->data("value"));
6341 data.setPluginID(queryResult->data("plugin_id").integerValue());
6342
6343 if (!queryResult->data("fu_reference").isNull()) {
6344 data.setFUReference(queryResult->data("fu_reference").integerValue());
6345 }
6346 if (!queryResult->data("rf_reference").isNull()) {
6347 data.setRFReference(queryResult->data("rf_reference").integerValue());
6348 }
6349 if (!queryResult->data("bus_reference").isNull()) {
6350 data.setBusReference(queryResult->data("bus_reference").integerValue());
6351 }
6352 if (!queryResult->data("socket_reference").isNull()) {
6353 data.setSocketReference(
6354 queryResult->data("socket_reference").integerValue());
6355 }
6356
6357 delete queryResult;
6358 queryResult = NULL;
6359
6360 return data;
6361 } else {
6362 delete queryResult;
6363 throw KeyNotFound(__FILE__, __LINE__, __func__);
6364 }
6365 // silence compiler warning
6366 throw 1;
6367}
void setBusReference(RowID busEntryID)
void setValue(const DataObject &value)
void setPluginID(RowID pluginID)
void setRFReference(RowID rfEntryID)
void setSocketReference(RowID socketEntryID)
void setFUReference(RowID fuEntryID)
void setName(const std::string &name)

References __func__, assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), DataObject::integerValue(), DataObject::isNull(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), CostEstimationData::setBusReference(), CostEstimationData::setFUReference(), CostEstimationData::setName(), CostEstimationData::setPluginID(), CostEstimationData::setRFReference(), CostEstimationData::setSocketReference(), CostEstimationData::setValue(), DataObject::stringValue(), and Conversion::toString().

Referenced by CostDatabase::buildBuses(), CostDatabase::buildFunctionUnits(), CostDatabase::buildRegisterFiles(), CostDatabase::buildSockets(), HDBToHtml::busEntryToHtml(), HDBToHtml::costFunctionPluginToHtml(), HDBToHtml::fuEntryToHtml(), HDBToHtml::fuImplToHtml(), HDBToHtml::rfEntryToHtml(), HDBToHtml::rfImplToHtml(), HDBToHtml::socketEntryToHtml(), CostEstimationDataDialog::TransferDataToWindow(), and CostFunctionPluginDialog::TransferDataToWindow().

Here is the call graph for this function:

◆ costEstimationDataIDs()

std::set< RowID > HDB::HDBManager::costEstimationDataIDs ( const CostEstimationData match,
bool  useCompiledQueries = false,
RelationalDBQueryResult compiledQuery = NULL 
) const
virtual

Function for querying cost estimation data from the HDB.

Returns set of cost estiamtion data Row IDs that match the given datas attributes that are set.

Parameters
matchCostEstimationData which is matched to the HDB data.
useCompiledQueriesif true use a compiled query instead of making a new one.
compiledQueryPointer to a prepared query to be used.
Returns
Set of cost estimation data row IDs that match the query.

Reimplemented in HDB::CachedHDBManager.

Definition at line 6764 of file HDBManager.cc.

6767 {
6768
6769 std::string query = "";
6770 if (!compiledQuery) {
6771 createCostEstimatioDataIdsQuery(match, &query);
6772 } else {
6773 // only bind query variables
6774 createCostEstimatioDataIdsQuery(match, NULL, compiledQuery, NULL);
6775 }
6776
6777 RelationalDBQueryResult* result = NULL;
6778
6779 if (compiledQuery) {
6780 result = compiledQuery;
6781 } else {
6782 try {
6783 result = dbConnection_->query(query);
6784 } catch (const Exception& e) {
6785 debugLog(query);
6787 assert(false);
6788 }
6789 }
6790
6791 std::set<RowID> dataIDs;
6792 while (result->hasNext()) {
6793 result->next();
6794 dataIDs.insert(result->data(0).integerValue());
6795 }
6796
6797 if (!compiledQuery) {
6798 delete result;
6799 } else {
6800 compiledQuery->reset();
6801 }
6802
6803 return dataIDs;
6804}
void createCostEstimatioDataIdsQuery(const CostEstimationData &match, std::string *query, RelationalDBQueryResult *compiledQuery=NULL, short int *queryHash=NULL, bool createBindableQuery=false) const

References assert, createCostEstimatioDataIdsQuery(), RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), DataObject::integerValue(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), and RelationalDBQueryResult::reset().

Referenced by CostDatabase::buildBuses(), CostDatabase::buildFunctionUnits(), CostDatabase::buildRegisterFiles(), CostDatabase::buildSockets(), and HDB::CachedHDBManager::costEstimationDataIDs().

Here is the call graph for this function:

◆ costEstimationDataValue() [1/2]

DataObject HDB::HDBManager::costEstimationDataValue ( const std::string &  valueName,
const std::string &  pluginName 
) const
virtual

Returns cost estimation data which is not connected to any machine implementation id.

This version assumes that there's only one entry with given parameters.

Todo:
Another version for fetching lists of data.
Parameters
valueNameName of the value to fetch.
pluginNameName of the cost estimation plugin that owns the data.
Returns
The data.
Exceptions
KeyNotFoundIf the HDB does not contain cost estimation data with the given arguments.

Reimplemented in HDB::CachedHDBManager.

Definition at line 3817 of file HDBManager.cc.

3818 {
3819 // make the SQL query to obtain implementation data
3820 RelationalDBQueryResult* queryResult = NULL;
3821 try {
3822 std::string theQuery =
3823 std::string(
3824 "SELECT value "
3825 "FROM cost_estimation_data, cost_function_plugin "
3826 "WHERE plugin_reference = cost_function_plugin.id AND "
3827 "cost_function_plugin.name LIKE('") +
3828 pluginName + "') " +
3829 " AND rf_reference IS NULL " +
3830 " AND fu_reference IS NULL " +
3831 " AND socket_reference IS NULL " +
3832 " AND bus_reference IS NULL " +
3833 " AND cost_estimation_data.name LIKE('" + valueName + "');";
3834 queryResult = dbConnection_->query(theQuery);
3835
3836 } catch (const Exception& e) {
3837 // should not throw in any case
3839 assert(false);
3840 }
3841
3842 if (queryResult->hasNext()) {
3843 queryResult->next();
3844
3845 DataObject value = queryResult->data("value");
3846
3847 delete queryResult;
3848 queryResult = NULL;
3849
3850 return value;
3851 } else {
3852 delete queryResult;
3853 throw KeyNotFound(__FILE__, __LINE__, __func__);
3854 }
3855 // silence compiler warning
3856 throw 1;
3857}

References __func__, assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), RelationalDBQueryResult::next(), and RelationalDBConnection::query().

Referenced by HDB::CachedHDBManager::costEstimationDataValue(), DefaultICDecoderEstimator::delayOfBus(), DefaultICDecoderEstimator::delayOfSocket(), DefaultICDecoderEstimator::delayOfSocket(), DefaultICDecoderEstimator::estimateICArea(), and DefaultICDecoderEstimator::estimateICEnergy().

Here is the call graph for this function:

◆ costEstimationDataValue() [2/2]

DataObject HDB::HDBManager::costEstimationDataValue ( RowID  entryId) const

Returns cost estimation data value with the given id.

Parameters
entryIdId of the cost estimation data entry.
Returns
The data.
Exceptions
KeyNotFoundIf the HDB does not contain cost estimation data with the given arguments.

Definition at line 3868 of file HDBManager.cc.

3868 {
3869 // make the SQL query to obtain implementation data
3870 RelationalDBQueryResult* queryResult = NULL;
3871 try {
3872 std::string theQuery =
3873 std::string(
3874 "SELECT value "
3875 "FROM cost_estimation_data "
3876 "WHERE cost_estimation_data.id = ") +
3877 Conversion::toString(entryId);
3878
3879 queryResult = dbConnection_->query(theQuery);
3880
3881 } catch (const Exception& e) {
3882 // should not throw in any case
3884 assert(false);
3885 }
3886
3887 if (queryResult->hasNext()) {
3888 queryResult->next();
3889
3890 DataObject value = queryResult->data("value");
3891
3892 delete queryResult;
3893 queryResult = NULL;
3894
3895 return value;
3896 } else {
3897 delete queryResult;
3898 throw KeyNotFound(__FILE__, __LINE__, __func__);
3899 }
3900 // silence compiler warning
3901 throw 1;
3902}

References __func__, assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), and Conversion::toString().

Here is the call graph for this function:

◆ costFunctionPluginByID()

CostFunctionPlugin * HDB::HDBManager::costFunctionPluginByID ( RowID  pluginID) const

Returns cost function plugin with the given ID.

Parameters
pluginIDID of the cost function plugin.
Returns
Cost function plugin with the given ID.
Exceptions
ExceptionThrows if pluginID not found (KeyNotFound) or illegal cost_function_plugin row found.

Definition at line 6617 of file HDBManager.cc.

6617 {
6618 RelationalDBQueryResult* pluginData;
6619
6620 std::string pluginDataQuery =
6621 "SELECT id, description, name, plugin_file_path, type "
6622 " FROM cost_function_plugin WHERE id = ";
6623
6624 pluginDataQuery += Conversion::toString(pluginID);
6625
6626 try {
6627 pluginData = dbConnection_->query(pluginDataQuery);
6628 } catch (const Exception& e) {
6630 assert(false);
6631 }
6632
6633 if (pluginData->hasNext()) {
6634 pluginData->next();
6635
6636 int id = pluginData->data("id").integerValue();
6637 std::string name = pluginData->data("name").stringValue();
6638 std::string desc = pluginData->data("description").stringValue();
6639 std::string path = pluginData->data("plugin_file_path").stringValue();
6640 std::string typeStr = pluginData->data("type").stringValue();
6641
6644 if (typeStr == COST_PLUGIN_TYPE_FU) {
6646 } else if (typeStr == COST_PLUGIN_TYPE_RF) {
6648 } else if (typeStr == COST_PLUGIN_TYPE_DECOMP) {
6650 } else if (typeStr == COST_PLUGIN_TYPE_ICDEC) {
6652 } else {
6653 delete pluginData;
6654 InvalidData ex(
6655 __FILE__, __LINE__, __func__,
6656 (boost::format("Illegal cost_function_plugin type %d.") %
6657 type).str());
6658 throw ex;
6659 }
6660
6661 delete pluginData;
6662 return new CostFunctionPlugin(id, desc, name, path, type);
6663
6664 } else {
6665 delete pluginData;
6666 throw KeyNotFound(
6667 __FILE__, __LINE__, __func__,
6668 (boost::format("Cost function plugin with id %d not found.") %
6669 pluginID).str());
6670 }
6671}
CostFunctionPluginType
all supported cost function plugin types

References __func__, assert, HDB::CostFunctionPlugin::COST_DECOMP, HDB::CostFunctionPlugin::COST_FU, HDB::CostFunctionPlugin::COST_ICDEC, COST_PLUGIN_TYPE_DECOMP, COST_PLUGIN_TYPE_FU, COST_PLUGIN_TYPE_ICDEC, COST_PLUGIN_TYPE_RF, HDB::CostFunctionPlugin::COST_RF, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), DataObject::integerValue(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), DataObject::stringValue(), and Conversion::toString().

Referenced by CostDatabase::buildBuses(), CostDatabase::buildFunctionUnits(), CostDatabase::buildRegisterFiles(), CostDatabase::buildSockets(), HDBToHtml::costFunctionPluginToHtml(), SetCostFunctionPluginCmd::Do(), and HDBBrowserWindow::update().

Here is the call graph for this function:

◆ costFunctionPluginDataIDs()

std::set< RowID > HDB::HDBManager::costFunctionPluginDataIDs ( RowID  pluginID) const

Returns cost estimation data IDs related to the given cost function plugin.

Parameters
pluginIDID of the cost function plugin.
Returns
IDs of the cost function plugin estimation data.

Definition at line 6575 of file HDBManager.cc.

6575 {
6576
6577 // make the SQL query to obtain IDs.
6578 RelationalDBQueryResult* queryResult = NULL;
6579 try {
6580 std::string theQuery =
6581 std::string(
6582 "SELECT id "
6583 "FROM cost_estimation_data "
6584 "WHERE plugin_reference = ") +
6585 Conversion::toString(pluginID);
6586
6587 queryResult = dbConnection_->query(theQuery);
6588
6589 } catch (const Exception& e) {
6590 // should not throw in any case
6592 assert(false);
6593 }
6594
6595 std::set<RowID> ids;
6596
6597 while (queryResult->hasNext()) {
6598 queryResult->next();
6599
6600 ids.insert(queryResult->data("id").integerValue());
6601 }
6602
6603 delete queryResult;
6604 queryResult = NULL;
6605 return ids;
6606}

References assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), DataObject::integerValue(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), and Conversion::toString().

Referenced by HDBToHtml::costFunctionPluginToHtml(), and CostFunctionPluginDialog::TransferDataToWindow().

Here is the call graph for this function:

◆ costFunctionPluginIDs()

std::set< RowID > HDB::HDBManager::costFunctionPluginIDs ( ) const

Returns RowIDs of cost fucntion plugins in the HDB.

Returns
All cost function plugin IDs.

Definition at line 6539 of file HDBManager.cc.

6539 {
6540
6541 // make the SQL query to obtain IDs.
6542 RelationalDBQueryResult* queryResult = NULL;
6543 try {
6544 std::string theQuery =
6545 "SELECT id FROM cost_function_plugin";
6546
6547 queryResult = dbConnection_->query(theQuery);
6548
6549 } catch (const Exception& e) {
6550 // should not throw in any case
6552 assert(false);
6553 }
6554
6555 std::set<RowID> ids;
6556
6557 while (queryResult->hasNext()) {
6558 queryResult->next();
6559
6560 ids.insert(queryResult->data("id").integerValue());
6561 }
6562
6563 delete queryResult;
6564 queryResult = NULL;
6565 return ids;
6566}

References assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), DataObject::integerValue(), RelationalDBQueryResult::next(), and RelationalDBConnection::query().

Referenced by CostDatabase::buildBuses(), CostDatabase::buildFunctionUnits(), CostDatabase::buildRegisterFiles(), CostDatabase::buildSockets(), SetCostFunctionPluginCmd::Do(), and HDBBrowserWindow::update().

Here is the call graph for this function:

◆ createCostEstimatioDataIdsQuery() [1/2]

void HDB::HDBManager::createCostEstimatioDataIdsQuery ( const CostEstimationData match,
std::string &  query 
) const
private

◆ createCostEstimatioDataIdsQuery() [2/2]

void HDB::HDBManager::createCostEstimatioDataIdsQuery ( const CostEstimationData match,
std::string *  query,
RelationalDBQueryResult compiledQuery = NULL,
short int *  queryHash = NULL,
bool  createBindableQuery = false 
) const
protected

Creates or prepares the query for cost estimation data ids.

Parameters
matchCostEstimationData which is matched to the HDB data.
queryString variable where query is stored, null if no query is to be created.
compiledQueryPointer to a prepared query to be used, null if not to be used.
queryHashPointer to unique id variable to be created for the query, null if not to be created.
createBindableQueryIf true query of a kind where variables can be binded is created, if false normal query with values is created.

Definition at line 6821 of file HDBManager.cc.

6826 {
6827
6828 if (queryHash) {
6829 *queryHash = 0;
6830 }
6831 bool firstMatch = true;
6832 unsigned int count = 0;
6833
6834 if (query) {
6835 *query = "SELECT id FROM cost_estimation_data WHERE ";
6836 }
6837
6838 if (match.hasName()) {
6839 if (queryHash) {
6840 *queryHash |= 1;
6841 }
6842
6843 if (compiledQuery) {
6844 compiledQuery->bindString(++count, match.name());
6845 }
6846
6847 if (query) {
6848 firstMatch = false;
6849 *query += "name='";
6850 *query += createBindableQuery ? "?" : match.name();
6851 *query += "'";
6852 }
6853 }
6854
6855 if (match.hasValue()) {
6856 if (queryHash) {
6857 *queryHash |= 2;
6858 }
6859
6860 if (compiledQuery) {
6861 compiledQuery->bindString(++count, match.name());
6862 }
6863
6864 if (query) {
6865 if (!firstMatch) *query += " AND ";
6866 firstMatch = false;
6867 *query += "value='";
6868 *query += createBindableQuery ? "?" : match.name();
6869 *query += "'";
6870 }
6871 }
6872
6873 if (match.hasPluginID()) {
6874 if (queryHash) {
6875 *queryHash |= 4;
6876 }
6877
6878 if (compiledQuery) {
6879 compiledQuery->bindInt(++count, match.pluginID());
6880 }
6881
6882 if (query) {
6883 if (!firstMatch) *query += " AND ";
6884 firstMatch = false;
6885 *query += "plugin_reference = ";
6886 *query += createBindableQuery ? "?" :
6888 }
6889 }
6890
6891 if (match.hasFUReference()) {
6892 if (queryHash) {
6893 *queryHash |= 8;
6894 }
6895
6896 if (compiledQuery) {
6897 compiledQuery->bindInt(++count, match.fuReference());
6898 }
6899
6900 if (query) {
6901 if (!firstMatch) *query += " AND ";
6902 firstMatch = false;
6903 *query += "fu_reference = ";
6904 *query += createBindableQuery ? "?" :
6906 }
6907 }
6908
6909 if (match.hasRFReference()) {
6910 if (queryHash) {
6911 *queryHash |= 16;
6912 }
6913
6914 if (compiledQuery) {
6915 compiledQuery->bindInt(++count, match.rfReference());
6916 }
6917
6918 if (query) {
6919 if (!firstMatch) *query += " AND ";
6920 firstMatch = false;
6921 *query += "rf_reference = ";
6922 *query += createBindableQuery ? "?" :
6924 }
6925 }
6926
6927 if (match.hasBusReference()) {
6928 if (queryHash) {
6929 *queryHash |= 32;
6930 }
6931
6932 if (compiledQuery) {
6933 compiledQuery->bindInt(++count, match.rfReference());
6934 }
6935
6936 if (query) {
6937 if (!firstMatch) *query += " AND ";
6938 firstMatch = false;
6939 *query += "bus_reference = ";
6940 *query += createBindableQuery ? "?" :
6942 }
6943 }
6944
6945 if (match.hasSocketReference()) {
6946 if (queryHash) {
6947 *queryHash |= 64;
6948 }
6949
6950 if (compiledQuery) {
6951 compiledQuery->bindInt(++count, match.rfReference());
6952 }
6953
6954 if (query) {
6955 if (!firstMatch) *query += " AND ";
6956 firstMatch = false;
6957 *query += "socket_reference = ";
6958 *query += createBindableQuery ? "?" :
6960 }
6961 }
6962
6963 if (query) {
6964 *query += ";";
6965 }
6966}
virtual void bindInt(unsigned int position, int value)
virtual void bindString(unsigned int position, const std::string &value)

References RelationalDBQueryResult::bindInt(), RelationalDBQueryResult::bindString(), CostEstimationData::busReference(), CostEstimationData::fuReference(), CostEstimationData::hasBusReference(), CostEstimationData::hasFUReference(), CostEstimationData::hasName(), CostEstimationData::hasPluginID(), CostEstimationData::hasRFReference(), CostEstimationData::hasSocketReference(), CostEstimationData::hasValue(), CostEstimationData::name(), CostEstimationData::pluginID(), CostEstimationData::rfReference(), CostEstimationData::socketReference(), and Conversion::toString().

Referenced by HDB::CachedHDBManager::costEstimationDataIDs(), and costEstimationDataIDs().

Here is the call graph for this function:

◆ createCostFunctionOfFU()

CostFunctionPlugin * HDB::HDBManager::createCostFunctionOfFU ( RowID  id) const
private

Obtains the cost function data of the FU that has the given ID and creates a CostFunctionPlugin instance of it.

Parameters
idID of the FU entry.
Returns
The newly created FUImplementation instance or NULL if the FU has no cost function.

Definition at line 4677 of file HDBManager.cc.

4677 {
4678
4679 // make the SQL query to obtain implementation data
4680 RelationalDBQueryResult* queryResult = NULL;
4681 try {
4682 queryResult = dbConnection_->query(
4683 "SELECT cost_function_plugin.id AS id, "
4684 " cost_function_plugin.description AS description,"
4685 " cost_function_plugin.name AS name, "
4686 " cost_function_plugin.plugin_file_path AS plugin_file_path "
4687 "FROM cost_function_plugin, fu "
4688 "WHERE fu.id = " + Conversion::toString(id) +
4689 " AND cost_function_plugin.id = fu.cost_function;");
4690 } catch (const Exception& e) {
4691 delete queryResult;
4693 return NULL;
4694 }
4695
4696 CostFunctionPlugin* costFunction = NULL;
4697
4698 if (queryResult->hasNext()) {
4699 queryResult->next();
4700
4701 const DataObject& pluginIdData =
4702 queryResult->data("id");
4703 const DataObject& descriptionData =
4704 queryResult->data("description");
4705 const DataObject& nameData =
4706 queryResult->data("name");
4707 const DataObject& pluginFilePathData =
4708 queryResult->data("plugin_file_path");
4709
4710 int pluginId = -1;
4711 string description = "";
4712 string name = "";
4713 string pluginFilePath = "";
4714 try {
4715 if (!pluginIdData.isNull()) {
4716 pluginId = pluginIdData.integerValue();
4717 }
4718 description = descriptionData.stringValue();
4719 name = nameData.stringValue();
4720 pluginFilePath = pluginFilePathData.stringValue();
4721 } catch (const Exception& e) {
4722 debugLog(
4723 std::string("Something wrong with conversion: ") +
4724 e.errorMessage());
4725 delete queryResult;
4726 queryResult = NULL;
4727 return NULL;
4728 }
4729
4730 costFunction = new CostFunctionPlugin(
4731 pluginId, description, name, pluginFilePath,
4733 }
4734
4735 delete queryResult;
4736 queryResult = NULL;
4737 return costFunction;
4738}

References HDB::CostFunctionPlugin::COST_FU, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), DataObject::integerValue(), DataObject::isNull(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), DataObject::stringValue(), and Conversion::toString().

Referenced by fuByEntryID().

Here is the call graph for this function:

◆ createCostFunctionOfRF()

CostFunctionPlugin * HDB::HDBManager::createCostFunctionOfRF ( RowID  id) const
private

Obtains the cost function data of the RF that has the given ID and creates a CostFunctionPlugin instance of it.

Parameters
idID of the RF entry.
Returns
The newly created FUImplementation instance or NULL if the RF has no cost function.

Definition at line 4749 of file HDBManager.cc.

4749 {
4750
4751 // make the SQL query to obtain implementation data
4752 RelationalDBQueryResult* queryResult = NULL;
4753 try {
4754 queryResult = dbConnection_->query(
4755 "SELECT cost_function_plugin.id AS id, "
4756 " cost_function_plugin.description AS description,"
4757 " cost_function_plugin.name AS name, "
4758 " cost_function_plugin.plugin_file_path AS plugin_file_path "
4759 "FROM cost_function_plugin, rf "
4760 "WHERE rf.id = " + Conversion::toString(id) +
4761 " AND cost_function_plugin.id = rf.cost_function;");
4762 } catch (const Exception& e) {
4763 delete queryResult;
4765 return NULL;
4766 }
4767
4768 CostFunctionPlugin* costFunction = NULL;
4769
4770 if (queryResult->hasNext()) {
4771 queryResult->next();
4772
4773 const DataObject& pluginIdData =
4774 queryResult->data("id");
4775 const DataObject& descriptionData =
4776 queryResult->data("description");
4777 const DataObject& nameData =
4778 queryResult->data("name");
4779 const DataObject& pluginFilePathData =
4780 queryResult->data("plugin_file_path");
4781
4782 int pluginId = -1;
4783 string description = "";
4784 string name = "";
4785 string pluginFilePath = "";
4786 try {
4787 if (!pluginIdData.isNull()) {
4788 pluginId = pluginIdData.integerValue();
4789 }
4790 description = descriptionData.stringValue();
4791 name = nameData.stringValue();
4792 pluginFilePath = pluginFilePathData.stringValue();
4793 } catch (const Exception& e) {
4794 debugLog(
4795 std::string("Something wrong with conversion: ") +
4796 e.errorMessage());
4797 delete queryResult;
4798 queryResult = NULL;
4799 return NULL;
4800 }
4801
4802 costFunction = new CostFunctionPlugin(
4803 pluginId, description, name, pluginFilePath,
4805 }
4806
4807 delete queryResult;
4808 queryResult = NULL;
4809 return costFunction;
4810}

References HDB::CostFunctionPlugin::COST_RF, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), DataObject::integerValue(), DataObject::isNull(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), DataObject::stringValue(), and Conversion::toString().

Referenced by rfByEntryID().

Here is the call graph for this function:

◆ createImplementationOfFU()

FUImplementation * HDB::HDBManager::createImplementationOfFU ( FUArchitecture architecture,
RowID  id 
) const
protectedvirtual

Obtains implementation data of the FU that has the given ID and creates an FUImplementation instance of it.

Parameters
architectureArchitecture of the FU (needed when matching the ports in the implementation).
idID of the FU entry.
Returns
The newly created FUImplementation instance or NULL if the FU has no implementation.

Reimplemented in HDB::CachedHDBManager.

Definition at line 4601 of file HDBManager.cc.

4603 {
4604
4605 // make the SQL query to obtain implementation data
4606 RelationalDBQueryResult* implData = NULL;
4607 const std::string queryString = fuImplementationByIDQuery(id);
4608 try {
4609 implData = dbConnection_->query(queryString);
4610 } catch (const Exception& e) {
4611 delete implData;
4612 debugLog(
4613 std::string("query ") + queryString + " threw something: " +
4614 e.errorMessage());
4615 return NULL;
4616 }
4617
4618 FUImplementation* implementation = NULL;
4619
4620 if (implData->hasNext()) {
4621 implData->next();
4622 assert(!implData->hasNext());
4623
4624 int idColumn = implData->column("fu_implementation.id");
4625 int nameColumn = implData->column("fu_implementation.name");
4626 int opcodePortColumn = implData->column(
4627 "fu_implementation.opcode_port");
4628 int clkPortColumn = implData->column("fu_implementation.clk_port");
4629 int rstPortColumn = implData->column("fu_implementation.rst_port");
4630 int glockPortColumn = implData->column(
4631 "fu_implementation.glock_port");
4632 int glockReqPortColumn = implData->column(
4633 "fu_implementation.glock_req_port");
4634
4635 const DataObject& idData = implData->data(idColumn);
4636 const DataObject& nameData = implData->data(nameColumn);
4637 const DataObject& opcodePortData = implData->data(opcodePortColumn);
4638 const DataObject& clkPortData = implData->data(clkPortColumn);
4639 const DataObject& rstPortData = implData->data(rstPortColumn);
4640 const DataObject& glockPortData = implData->data(glockPortColumn);
4641 const DataObject& glockReqPortData = implData->data(
4642 glockReqPortColumn);
4643
4644 RowID implID = idData.integerValue();
4645 string name = nameData.stringValue();
4646 string opcodePort = opcodePortData.stringValue();
4647 string clkPort = clkPortData.stringValue();
4648 string rstPort = rstPortData.stringValue();
4649 string glockPort = glockPortData.stringValue();
4650 string glockReqPort = glockReqPortData.stringValue();
4651
4652 implementation = new FUImplementation(
4653 name, opcodePort, clkPort, rstPort, glockPort, glockReqPort);
4654 implementation->setID(implID);
4655
4658 addDataPortsToImplementation(*implementation, architecture, id);
4661 }
4662
4663 delete implData;
4664 implData = NULL;
4665 return implementation;
4666}
void addOpcodesToImplementation(FUImplementation &implementation, RowID entryID) const
void addDataPortsToImplementation(FUImplementation &implementation, FUArchitecture &architecture, RowID entryID) const
void addFUExternalPortsToImplementation(FUImplementation &implementation, RowID entryID) const
void addBlockImplementationFiles(FUImplementation &implementation, RowID entryID) const
static std::string fuImplementationByIDQuery(RowID id)
void addFUParametersToImplementation(FUImplementation &implementation, RowID entryID) const

References addBlockImplementationFiles(), addDataPortsToImplementation(), addFUExternalPortsToImplementation(), addFUParametersToImplementation(), addOpcodesToImplementation(), assert, RelationalDBQueryResult::column(), RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), fuImplementationByIDQuery(), RelationalDBQueryResult::hasNext(), implementation, DataObject::integerValue(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), and DataObject::stringValue().

Referenced by HDB::CachedHDBManager::createImplementationOfFU(), and fuByEntryID().

Here is the call graph for this function:

◆ createImplementationOfRF()

RFImplementation * HDB::HDBManager::createImplementationOfRF ( RowID  id) const
protectedvirtual

Obtains implementation data of the RF that has the given ID and creates an RFImplementation instance of it.

Parameters
idID of the RF entry.
Returns
The newly created RFImplementation instance or NULL if the RF has no implementation.

Reimplemented in HDB::CachedHDBManager.

Definition at line 4823 of file HDBManager.cc.

4823 {
4824
4825 RelationalDBQueryResult* implementationData = NULL;
4826 try {
4827 if(hasColumn("rf_implementation", "sac_param")) {
4828 // Use new query.
4829 implementationData = dbConnection_->query(
4831 } else {
4832 // Use fallback query.
4833 implementationData = dbConnection_->query(
4835 }
4836 } catch (const Exception& e) {
4837 assert(false);
4838 }
4839
4840 RFImplementation* implementation = NULL;
4841
4842 if (implementationData->hasNext()) {
4843 implementationData->next();
4844 assert(!implementationData->hasNext());
4845 int idColumn = implementationData->column("id");
4846 int nameColumn = implementationData->column("name");
4847 int sizeParamColumn = implementationData->column("size_param");
4848 int widthParamColumn = implementationData->column("width_param");
4849 int sacParamColumn = implementationData->column("sac_param");
4850 int clkPortColumn = implementationData->column("clk_port");
4851 int rstPortColumn = implementationData->column("rst_port");
4852 int glockPortColumn = implementationData->column("glock_port");
4853 int guardPortColumn = implementationData->column("guard_port");
4854
4855 const DataObject& idData = implementationData->data(idColumn);
4856 const DataObject& nameData = implementationData->data(nameColumn);
4857 const DataObject& sizeParamData = implementationData->data(
4858 sizeParamColumn);
4859 const DataObject& widthParamData = implementationData->data(
4860 widthParamColumn);
4861 const DataObject& clkPortData = implementationData->data(
4862 clkPortColumn);
4863 const DataObject& rstPortData = implementationData->data(
4864 rstPortColumn);
4865 const DataObject& glockPortData = implementationData->data(
4866 glockPortColumn);
4867 const DataObject& guardPortData = implementationData->data(
4868 guardPortColumn);
4869 const DataObject& sacParamData = implementationData->data(
4870 sacParamColumn);
4871
4872 string sizeParam = sizeParamData.stringValue();
4873 string widthParam = widthParamData.stringValue();
4874 string guardPort = guardPortData.stringValue();
4875 bool sacParam =
4876 (sacParamColumn != RelationalDBQueryResult::UNKNOWN_INDEX) ?
4877 sacParamData.boolValue() :
4878 false;
4879
4880 implementation = new RFImplementation(
4881 nameData.stringValue(), clkPortData.stringValue(),
4882 rstPortData.stringValue(), glockPortData.stringValue(),
4883 sizeParam, widthParam, guardPort, sacParam);
4884 implementation->setID(idData.integerValue());
4885
4890 }
4891
4892 delete implementationData;
4893 implementationData = NULL;
4894 return implementation;
4895}
static std::string rfImplementationByIDQuery(RowID id)
static std::string rfImplementationByIDQuery2(RowID id)
void addRFExternalPortsToImplementation(RFImplementation &implementation, RowID entryID) const
void addRFParametersToImplementation(RFImplementation &implementation, RowID entryID) const

References addBlockImplementationFiles(), addDataPortsToImplementation(), addRFExternalPortsToImplementation(), addRFParametersToImplementation(), assert, DataObject::boolValue(), RelationalDBQueryResult::column(), RelationalDBQueryResult::data(), dbConnection_, hasColumn(), RelationalDBQueryResult::hasNext(), implementation, DataObject::integerValue(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), rfImplementationByIDQuery(), rfImplementationByIDQuery2(), DataObject::stringValue(), and RelationalDBQueryResult::UNKNOWN_INDEX.

Referenced by HDB::CachedHDBManager::createImplementationOfRF(), and rfByEntryID().

Here is the call graph for this function:

◆ createNew()

void HDB::HDBManager::createNew ( const std::string &  file)
static

Creates a new HDB to the given file.

Parameters
fileThe database file to be created.
Exceptions
UnreachableStreamIf the given file exists already or cannot be created for another reason.

Definition at line 534 of file HDBManager.cc.

534 {
535 if (!FileSystem::fileIsCreatable(file)) {
536 const string procName = "HDBManager::createNew";
537 throw UnreachableStream(__FILE__, __LINE__, procName);
538 }
539
540 try {
541 SQLite db;
542 RelationalDBConnection& connection = db.connect(file);
543
544 // create tables to the database
545 connection.DDLQuery(CQ_FU);
546 connection.DDLQuery(CQ_FU_ARCHITECTURE);
547 connection.DDLQuery(CQ_PIPELINE_RESOURCE);
550 connection.DDLQuery(CQ_IO_USAGE);
551 connection.DDLQuery(CQ_OPERATION);
552 connection.DDLQuery(CQ_FU_DATA_PORT);
553 connection.DDLQuery(CQ_IO_BINDING);
554 connection.DDLQuery(CQ_FU_IMPLEMENTATION);
555 connection.DDLQuery(CQ_OPCODE_MAP);
556 connection.DDLQuery(CQ_FU_PORT_MAP);
557 connection.DDLQuery(CQ_FU_EXTERNAL_PORT);
560 connection.DDLQuery(CQ_RF);
561 connection.DDLQuery(CQ_RF_ARCHITECTURE);
562 connection.DDLQuery(CQ_RF_IMPLEMENTATION);
564 connection.DDLQuery(CQ_RF_EXTERNAL_PORT);
566 connection.DDLQuery(CQ_RF_DATA_PORT);
567 connection.DDLQuery(CQ_FORMAT);
568 connection.DDLQuery(CQ_BUS);
569 connection.DDLQuery(CQ_SOCKET);
572 connection.DDLQuery(CQ_BLOCK_SOURCE_FILE);
573 connection.DDLQuery(CQ_RF_SOURCE_FILE);
574 connection.DDLQuery(CQ_FU_SOURCE_FILE);
578
579 // insert the contents to format table
580 insertFileFormats(connection);
581 db.close(connection);
582 } catch (const Exception& e) {
583 debugLog(
584 std::string("Initialization of HDB failed. ") +
585 e.errorMessage());
586 // this should not normally happen, but only if our table creation
587 // queries are broken, thus it's a program error and not input error
588 assert(false);
589 }
590}
const string CQ_FU
const string CQ_PIPELINE_RESOURCE_USAGE
const string CQ_FU_SOURCE_FILE
const string CQ_FU_IMPL_ENTRY_INDEX
const string CQ_FU_ARCHITECTURE
const string CQ_IO_USAGE
const string CQ_RF
const string CQ_RF_IMPL_ENTRY_INDEX
const string CQ_RF_ARCHITECTURE
const string CQ_OPERATION_PIPELINE
const string CQ_SOCKET
const string CQ_FU_PORT_MAP_ARCH_INDEX
const string CQ_PIPELINE_RESOURCE
const string CQ_BLOCK_SOURCE_FILE
const string CQ_BUS
const string CQ_FU_IMPLEMENTATION_PARAMETER
const string CQ_RF_IMPLEMENTATION
const string CQ_FU_DATA_PORT
const string CQ_FU_IMPLEMENTATION
const string CQ_FU_EXT_PORT_PARAMETER_DEPENDENCY
const string CQ_RF_DATA_PORT
const string CQ_OPCODE_MAP
const string CQ_COST_ESTIMATION_DATA
type: {'fu'|'rf'|'decomp'|'icdec'}
const string CQ_RF_SOURCE_FILE
const string CQ_COST_FUNCTION_PLUGIN
const string CQ_FU_PORT_MAP
const string CQ_OPERATION
const string CQ_IO_BINDING
const string CQ_FORMAT
const string CQ_FU_EXTERNAL_PORT
static bool fileIsCreatable(const std::string fileName)
static void insertFileFormats(RelationalDBConnection &connection)

References assert, SQLite::close(), SQLite::connect(), CQ_BLOCK_SOURCE_FILE, CQ_BUS, CQ_COST_ESTIMATION_DATA, CQ_COST_FUNCTION_PLUGIN, CQ_FORMAT, CQ_FU, CQ_FU_ARCHITECTURE, CQ_FU_DATA_PORT, CQ_FU_EXT_PORT_PARAMETER_DEPENDENCY, CQ_FU_EXTERNAL_PORT, CQ_FU_IMPL_ENTRY_INDEX, CQ_FU_IMPLEMENTATION, CQ_FU_IMPLEMENTATION_PARAMETER, CQ_FU_PORT_MAP, CQ_FU_PORT_MAP_ARCH_INDEX, CQ_FU_SOURCE_FILE, CQ_IO_BINDING, CQ_IO_USAGE, CQ_OPCODE_MAP, CQ_OPERATION, CQ_OPERATION_PIPELINE, CQ_PIPELINE_RESOURCE, CQ_PIPELINE_RESOURCE_USAGE, CQ_RF, CQ_RF_ARCHITECTURE, CQ_RF_DATA_PORT, CQ_RF_EXT_PORT_PARAMETER_DEPENDENCY, CQ_RF_EXTERNAL_PORT, CQ_RF_IMPL_ENTRY_INDEX, CQ_RF_IMPLEMENTATION, CQ_RF_IMPLEMENTATION_PARAMETER, CQ_RF_SOURCE_FILE, CQ_SOCKET, RelationalDBConnection::DDLQuery(), debugLog, Exception::errorMessage(), FileSystem::fileIsCreatable(), and insertFileFormats().

Referenced by HDB::CachedHDBManager::createNew(), and main().

Here is the call graph for this function:

◆ deleteCostEstimationDataIDsQueries()

virtual void HDB::HDBManager::deleteCostEstimationDataIDsQueries ( ) const
pure virtual

◆ directionString()

std::string HDB::HDBManager::directionString ( HDB::Direction  direction)
staticprivate

Returns the string used to represent the given direction in HDB.

Parameters
directionThe direction.
Returns
The string.

Definition at line 5747 of file HDBManager.cc.

5747 {
5748 if (direction == HDB::IN) {
5749 return IN_DIRECTION;
5750 } else if (direction == HDB::OUT) {
5751 return OUT_DIRECTION;
5752 } else {
5753 return BIDIR_DIRECTION;
5754 }
5755}

References BIDIR_DIRECTION, HDB::IN, IN_DIRECTION, HDB::OUT, and OUT_DIRECTION.

Referenced by addFUImplementation(), and addRFImplementation().

◆ fileFormat()

BlockImplementationFile::Format HDB::HDBManager::fileFormat ( const std::string &  formatString)
staticprivate

Returns the format corresponding to the given string which is stored in the database.

Parameters
formatStringThe format string stored in the database.
Returns
The format.

Definition at line 5700 of file HDBManager.cc.

5700 {
5701 if (formatString == VHDL_FORMAT) {
5703 } else if (formatString == VERILOG_FORMAT) {
5705 } else if (formatString == VHDL_SIM_FORMAT) {
5707 } else if (formatString == VERILOG_SIM_FORMAT) {
5709 }
5710 assert(false);
5711 // dummy return to avoid whining with some compilers
5713}
const string VHDL_FORMAT
Definition HDBManager.cc:88
const string VERILOG_FORMAT
Definition HDBManager.cc:89
@ Verilogsim
Verilog simulation file.

References assert, formatString(), HDB::BlockImplementationFile::Verilog, VERILOG_FORMAT, VERILOG_SIM_FORMAT, HDB::BlockImplementationFile::Verilogsim, HDB::BlockImplementationFile::VHDL, VHDL_FORMAT, VHDL_SIM_FORMAT, and HDB::BlockImplementationFile::VHDLsim.

Referenced by addBlockImplementationFiles(), addBlockImplementationFiles(), and addOperationImplementationResource().

Here is the call graph for this function:

◆ fileName()

std::string HDB::HDBManager::fileName ( ) const

◆ formatString()

std::string HDB::HDBManager::formatString ( BlockImplementationFile::Format  format)
static

◆ fuArchitectureByID()

FUArchitecture * HDB::HDBManager::fuArchitectureByID ( RowID  id) const
virtual

Creates an FUArchitecture instance of the FU architecture that has the given ID.

Parameters
IDThe ID of the FU architecture.
Returns
The newly created FUArchitecture instance.
Exceptions
KeyNotFoundIf the HDB does not have a FU architecture with the given ID.

Reimplemented in HDB::CachedHDBManager.

Definition at line 2926 of file HDBManager.cc.

2926 {
2927 if (!containsFUArchitecture(id)) {
2928 throw KeyNotFound(__FILE__, __LINE__, __func__);
2929 }
2930
2931 FunctionUnit* fu = new FunctionUnit("name");
2932 FUArchitecture* architecture = new FUArchitecture(fu);
2933 architecture->setID(id);
2934 addPortsAndBindingsToFUArchitecture(*architecture, id);
2935 addOperationPipelinesToFUArchitecture(*architecture, id);
2936 return architecture;
2937}
void addOperationPipelinesToFUArchitecture(FUArchitecture &architecture, RowID id) const
void addPortsAndBindingsToFUArchitecture(FUArchitecture &architecture, RowID id) const
bool containsFUArchitecture(RowID id) const

References __func__, addOperationPipelinesToFUArchitecture(), addPortsAndBindingsToFUArchitecture(), containsFUArchitecture(), and HWBlockArchitecture::setID().

Referenced by HDB::CachedHDBManager::fuArchitectureByID(), HDB::CachedHDBManager::fuArchitectureByIDConst(), HDBToHtml::fuArchToHtml(), fuByEntryID(), fuEntriesByArchitecture(), and AddFUFromHDBDialog::loadHDB().

Here is the call graph for this function:

◆ fuArchitectureByIDQuery()

std::string HDB::HDBManager::fuArchitectureByIDQuery ( RowID  id)
staticprivate

Creates an SQL query for getting the architecture of the FU entry that has the given ID.

The result set has all the fields of fu_architecture.

Parameters
idID of the FU entry.

Definition at line 5843 of file HDBManager.cc.

5843 {
5844 string idString = Conversion::toString(id);
5845 string query =
5846 "SELECT * "
5847 "FROM fu, fu_architecture "
5848 "WHERE fu.id=" + idString + " AND"
5849 " fu_architecture.id = fu.architecture;";
5850 return query;
5851}

References Conversion::toString().

Here is the call graph for this function:

◆ fuArchitectureID()

RowID HDB::HDBManager::fuArchitectureID ( RowID  fuEntryID) const
private

Returns the ID of the architecture of the given FU entry.

Parameters
fuEntryIDID of the FU entry.
Returns
ID of the FU architecture.
Exceptions
NotAvailableIf the FU entry does not have an architecture.

Definition at line 4254 of file HDBManager.cc.

4254 {
4256 try {
4257 result = dbConnection_->query(
4258 std::string(
4259 "SELECT architecture FROM fu WHERE id=" +
4260 Conversion::toString(fuEntryID) + ";"));
4261 } catch (const Exception& e) {
4263 assert(false);
4264 }
4265
4266 if (!result->hasNext()) {
4267 delete result;
4268 throw NotAvailable(__FILE__, __LINE__, __func__);
4269 }
4270
4271 result->next();
4272 const DataObject& idData = result->data(0);
4273 if (idData.isNull()) {
4274 delete result;
4275 throw NotAvailable(__FILE__, __LINE__, __func__);
4276 } else {
4277 RowID retValue = idData.integerValue();
4278 delete result;
4279 return retValue;
4280 }
4281}

References __func__, assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), DataObject::integerValue(), DataObject::isNull(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), and Conversion::toString().

Referenced by addFUImplementation().

Here is the call graph for this function:

◆ fuArchitectureIDs()

std::set< RowID > HDB::HDBManager::fuArchitectureIDs ( ) const

Returns a set of FU architecture IDs in the database.

Returns
A set containing all the FU architecture IDs in the database.

Definition at line 2149 of file HDBManager.cc.

2149 {
2150
2151 RelationalDBQueryResult* result = NULL;
2152 try {
2153 result = dbConnection_->query(
2154 std::string("SELECT id FROM fu_architecture;"));
2155 } catch (const Exception& e) {
2157 assert(false);
2158 }
2159
2160 std::set<RowID> idSet;
2161 while (result->hasNext()) {
2162 result->next();
2163 const DataObject& idData = result->data(0);
2164 idSet.insert(idData.integerValue());
2165 }
2166
2167 delete result;
2168 return idSet;
2169}

References assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), DataObject::integerValue(), RelationalDBQueryResult::next(), and RelationalDBConnection::query().

Referenced by SetFUArchitectureCmd::Do(), AddFUFromHDBDialog::loadHDB(), and HDBBrowserWindow::update().

Here is the call graph for this function:

◆ fuArchitectureIDsByOperationSet()

std::set< RowID > HDB::HDBManager::fuArchitectureIDsByOperationSet ( const std::set< std::string > &  operationNames) const

Definition at line 2670 of file HDBManager.cc.

2671 {
2672
2673 RelationalDBQueryResult* result = NULL;
2674 try {
2675 std::string operationQuery = "(";
2676 std::set<string>::const_iterator iter = operationNames.begin();
2677 while (iter != operationNames.end()) {
2678 // LIKE makes case-insensitive match to operation names
2679 operationQuery +=
2680 "operation.name LIKE '" + *iter + "'";
2681 iter++;
2682 if (iter != operationNames.end()) {
2683 operationQuery += " OR ";
2684 }
2685 }
2686 operationQuery += ")";
2687 if (operationQuery == "()") {
2688 return std::set<RowID>();
2689 }
2690 result = dbConnection_->query(
2691 std::string("SELECT fu_architecture.id FROM operation_pipeline,"
2692 "operation, fu_architecture WHERE "
2693 "operation.id=operation_pipeline.operation AND "
2694 "operation_pipeline.fu_arch=fu_architecture.id AND "
2695 + operationQuery +
2696 "GROUP BY fu_architecture.id ORDER BY "
2697 "fu_architecture.id;"));
2698 } catch (const Exception& e) {
2699 std::string eMsg = ", HDB file where error occurred was: " + hdbFile_;
2700 debugLog(e.errorMessage() + eMsg);
2701 assert(false);
2702 }
2703
2704 std::set<RowID> idSet;
2705 while (result->hasNext()) {
2706 result->next();
2707 const DataObject& idData = result->data(0);
2708 idSet.insert(idData.integerValue());
2709 }
2710
2711 delete result;
2712 return idSet;
2713}

References assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), hdbFile_, DataObject::integerValue(), RelationalDBQueryResult::next(), and RelationalDBConnection::query().

Referenced by ComponentImplementationSelector::fuArchsByOpSetWithMinLatency().

Here is the call graph for this function:

◆ fuByEntryID()

FUEntry * HDB::HDBManager::fuByEntryID ( RowID  id) const

Returns the FU entry that has the given ID.

Parameters
idThe ID of the FU entry.
Returns
The FU entry. @excpetion KeyNotFound If the HDB does not contain an FU entry with the given ID.

Definition at line 2814 of file HDBManager.cc.

2814 {
2815 std::string query = "SELECT architecture FROM fu WHERE id=";
2816 query += Conversion::toString(id) + ";";
2817
2818 RelationalDBQueryResult* result = NULL;
2819 try {
2820 result = dbConnection_->query(query);
2821 } catch (const Exception& e) {
2823 assert(false);
2824 }
2825
2826 bool hasArch = false;
2827 RowID archID = -1;
2828 if (result->hasNext()) {
2829 result->next();
2830 DataObject data = result->data(0);
2831 if (!data.isNull()) {
2832 hasArch = true;
2833 archID = data.integerValue();
2834 }
2835 delete result;
2836 result = NULL;
2837 } else {
2838 delete result;
2839 std::ostringstream stream;
2840 stream << "FU entry with id " << id << " not found from hdb "
2841 << hdbFile_;
2842 throw KeyNotFound(__FILE__, __LINE__, __func__, stream.str());
2843 }
2844
2845 FUEntry* entry = new FUEntry();
2846 entry->setID(id);
2847 if (hasArch) {
2848 FUArchitecture* architecture = fuArchitectureByID(archID);
2849 entry->setArchitecture(architecture);
2850 FUImplementation* implementation = createImplementationOfFU(
2851 *architecture, id);
2852 entry->setImplementation(implementation);
2853 }
2854
2855 CostFunctionPlugin* costFunction = createCostFunctionOfFU(id);
2856 entry->setCostFunction(costFunction);
2857 entry->setHDBFile(hdbFile_);
2858 delete result;
2859 return entry;
2860}
virtual FUImplementation * createImplementationOfFU(FUArchitecture &architecture, RowID id) const
CostFunctionPlugin * createCostFunctionOfFU(RowID id) const
virtual FUArchitecture * fuArchitectureByID(RowID id) const

References __func__, assert, createCostFunctionOfFU(), createImplementationOfFU(), RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), fuArchitectureByID(), RelationalDBQueryResult::hasNext(), hdbFile_, implementation, DataObject::integerValue(), DataObject::isNull(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), HDB::FUEntry::setArchitecture(), HDB::HDBEntry::setCostFunction(), HDB::HDBEntry::setHDBFile(), HDB::HDBEntry::setID(), HDB::FUEntry::setImplementation(), and Conversion::toString().

Referenced by addFUImplementation(), ProGe::NetlistGenerator::addFUToNetlist(), CostDatabase::buildFunctionUnits(), ProGeTools::checkForSelectableFU(), Automagic::checkForSelectableFU(), ProGe::BlockSourceCopier::copyShared(), AddFUImplementationCmd::Do(), HDBEditorModifyCmd::Do(), CostEstimator::Estimator::fuCostFunctionPluginOfImplementation(), ImplementationTester::fuEntryFromHdb(), HDBToHtml::fuEntryToHtml(), HDBToHtml::fuImplToHtml(), ProGeTestBenchGenerator::generate(), ProGeScriptGenerator::getBlockOrder(), AddFUImplementationCmd::isEnabled(), PlatformIntegrator::loadFUExternalPorts(), BlockImplementationDialog::onHDBSelection(), setArchitectureForFU(), unsetArchitectureForFU(), and HDBBrowserWindow::update().

Here is the call graph for this function:

◆ fuCostEstimationData()

DataObject HDB::HDBManager::fuCostEstimationData ( const std::string &  valueName,
RowID  implementationId,
const std::string &  pluginName 
) const

Returns FU cost estimation data.

This version assumes that there's only one entry with given parameters.

Todo:

Another version for fetching lists of data.

Refactor most of the code in *costEstimationData() functions to a helper function

Parameters
valueNameName of the value to fetch.
implementationIdThe ID of the FU entry.
pluginNameName of the cost estimation plugin that owns the data.
Returns
The data.
Exceptions
KeyNotFoundIf the HDB does not contain FU cost estimation data with the given arguments.

Definition at line 3275 of file HDBManager.cc.

3277 {
3278 // make the SQL query to obtain implementation data
3279 RelationalDBQueryResult* queryResult = NULL;
3280 try {
3281 queryResult = dbConnection_->query(
3282 std::string(
3283 "SELECT value "
3284 "FROM cost_estimation_data, cost_function_plugin "
3285 "WHERE plugin_reference = cost_function_plugin.id AND "
3286 "cost_function_plugin.name LIKE('") +
3287 pluginName + "') " +
3288 " AND rf_reference IS NULL " +
3289 " AND bus_reference IS NULL " +
3290 " AND socket_reference IS NULL AND " +
3291 " fu_reference = " + Conversion::toString(implementationId) +
3292 " AND cost_estimation_data.name LIKE('" + valueName + "');");
3293 } catch (const Exception& e) {
3294 // should not throw in any case
3296 assert(false);
3297 }
3298
3299 if (queryResult->hasNext()) {
3300 queryResult->next();
3301
3302 DataObject value = queryResult->data("value");
3303
3304 delete queryResult;
3305 queryResult = NULL;
3306
3307 return value;
3308 } else {
3309 delete queryResult;
3310 throw KeyNotFound(__FILE__, __LINE__, __func__);
3311 }
3312 // silence compiler warning
3313 throw 1;
3314}

References __func__, assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), and Conversion::toString().

Referenced by StrictMatchFUEstimator::estimateArea(), StrictMatchFUEstimator::estimateEnergy(), StrictMatchFUEstimator::estimateMaximumComputationDelay(), StrictMatchFUEstimator::estimatePortReadDelay(), and StrictMatchFUEstimator::estimatePortWriteDelay().

Here is the call graph for this function:

◆ fuCostEstimationDataIDs()

std::set< RowID > HDB::HDBManager::fuCostEstimationDataIDs ( RowID  fuImplID) const

Returns a set of cost estimation data IDs which reference the give FU implementation.

Parameters
fuImplIDID of the FU implementation.
Returns
Set of cost estimation data IDs.

Definition at line 6377 of file HDBManager.cc.

6377 {
6378
6379 // make the SQL query to obtain IDs.
6380 RelationalDBQueryResult* queryResult = NULL;
6381 try {
6382 std::string theQuery =
6383 std::string(
6384 "SELECT id "
6385 "FROM cost_estimation_data "
6386 "WHERE fu_reference = ") +
6387 Conversion::toString(fuImplID);
6388
6389 queryResult = dbConnection_->query(theQuery);
6390
6391 } catch (const Exception& e) {
6392 // should not throw in any case
6394 assert(false);
6395 }
6396
6397 std::set<RowID> ids;
6398
6399 while (queryResult->hasNext()) {
6400 queryResult->next();
6401
6402 ids.insert(queryResult->data("id").integerValue());
6403 }
6404
6405 delete queryResult;
6406 queryResult = NULL;
6407 return ids;
6408}

References assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), DataObject::integerValue(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), and Conversion::toString().

Referenced by HDBToHtml::fuEntryToHtml(), and HDBToHtml::fuImplToHtml().

Here is the call graph for this function:

◆ fuEntriesByArchitecture()

std::set< RowID > HDB::HDBManager::fuEntriesByArchitecture ( const TTAMachine::FunctionUnit fu) const

Returns a set of FU entry IDs that have a corresponding architecture with the given one.

The set may contain FU entry IDs that have ports with parametrized width while the given one has fixed width.

Parameters
fuThe FU architecture.
Returns
Set of FU entry IDs.

Definition at line 3026 of file HDBManager.cc.

3027 {
3028
3029 std::set<RowID> architectureIDs;
3030 std::set<RowID> entryIDs;
3031
3032 try {
3033 // get FU architectures with required operation set
3034 string query = "";
3035 for (int i = 0; i < fu.operationCount(); i++) {
3036 query +=
3037 "SELECT fu_arch FROM operation_pipeline,operation "
3038 "WHERE operation.name=\"" + fu.operation(i)->name() +
3039 "\" AND operation_pipeline.operation=operation.id";
3040 if (i+1 < fu.operationCount()) {
3041 query += " INTERSECT ";
3042 } else {
3043 query += ";";
3044 }
3045 }
3046
3047 RelationalDBQueryResult* queryResult = dbConnection_->query(query);
3048
3049 // check the architectures are compeletely similar
3050 while (queryResult->hasNext()) {
3051 queryResult->next();
3052 const DataObject& archID = queryResult->data(0);
3053 FUArchitecture* arch = fuArchitectureByID(archID.integerValue());
3054 if (isMatchingArchitecture(fu, *arch)) {
3055 architectureIDs.insert(arch->id());
3056 }
3057 delete arch;
3058 }
3059
3060 delete queryResult;
3061
3062 if (!architectureIDs.empty()) {
3063 // find the FU entry IDs
3064 string fuEntryQuery = "SELECT id FROM fu WHERE ";
3065 for (std::set<RowID>::const_iterator iter =
3066 architectureIDs.begin();
3067 iter != architectureIDs.end(); iter++) {
3068 fuEntryQuery += "architecture=" +
3069 Conversion::toString(*iter);
3070 std::set<RowID>::const_iterator nextIter = iter;
3071 nextIter++;
3072 if (nextIter == architectureIDs.end()) {
3073 fuEntryQuery += ";";
3074 } else {
3075 fuEntryQuery += " OR ";
3076 }
3077 }
3078
3080 fuEntryQuery);
3081 while (fuEntryResult->hasNext()) {
3082 fuEntryResult->next();
3083 const DataObject& idData = fuEntryResult->data(0);
3084 entryIDs.insert(idData.integerValue());
3085 }
3086
3087 delete fuEntryResult;
3088 }
3089
3090 } catch (const Exception& e) {
3092 ;
3093 }
3094
3095 return entryIDs;
3096}
static bool isMatchingArchitecture(const TTAMachine::FunctionUnit &fu, const FUArchitecture &arch)

References RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), fuArchitectureByID(), RelationalDBQueryResult::hasNext(), HWBlockArchitecture::id(), DataObject::integerValue(), isMatchingArchitecture(), TTAMachine::HWOperation::name(), RelationalDBQueryResult::next(), TTAMachine::FunctionUnit::operation(), TTAMachine::FunctionUnit::operationCount(), RelationalDBConnection::query(), and Conversion::toString().

Referenced by ComponentImplementationSelector::fuImplementations(), and BlockImplementationDialog::onHDBSelection().

Here is the call graph for this function:

◆ fuEntryByIDQuery()

std::string HDB::HDBManager::fuEntryByIDQuery ( RowID  id)
staticprivate

Creates an SQL query for getting the FU entry that has the given ID.

The result set has fields {id, architecture, cost_function}.

Parameters
idID of the entry.
Returns
The SQL query.

Definition at line 5767 of file HDBManager.cc.

5767 {
5768 string idString = Conversion::toString(id);
5769 string query =
5770 "SELECT * "
5771 "FROM fu "
5772 "WHERE fu.id=" + idString + ";";
5773 return query;
5774}

References Conversion::toString().

Referenced by hasFUEntry().

Here is the call graph for this function:

◆ fuEntryHasArchitecture()

bool HDB::HDBManager::fuEntryHasArchitecture ( RowID  id) const
private

Tells whether the FU entry that has the given ID has an architecture.

Parameters
idID of the FU entry.
Returns
True if it has an architecture, otherwise false.
Exceptions
KeyNotFoundIf the HDB does not contain a FU entry with the given ID.

Definition at line 4083 of file HDBManager.cc.

4083 {
4085 try {
4086 result = dbConnection_->query(
4087 std::string(
4088 "SELECT architecture FROM fu WHERE id=" +
4089 Conversion::toString(id) + ";"));
4090 } catch (const Exception& e) {
4092 assert(false);
4093 }
4094
4095 if (result->hasNext()) {
4096 result->next();
4097 const DataObject& data = result->data(0);
4098 delete result;
4099 return !data.isNull();
4100 } else {
4101 delete result;
4102 throw KeyNotFound(__FILE__, __LINE__, __func__);
4103 }
4104}

References __func__, assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), DataObject::isNull(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), and Conversion::toString().

Here is the call graph for this function:

◆ fuEntryIDOfImplementation()

RowID HDB::HDBManager::fuEntryIDOfImplementation ( RowID  implID) const

Returns the ID of the FU entry that has the given implementation ID.

Parameters
implIDThe implementation ID.
Returns
The FU entry ID.
Exceptions
KeyNotFoundIf there is no implementation by the given ID.

Definition at line 2751 of file HDBManager.cc.

2751 {
2752 RelationalDBQueryResult* result = NULL;
2753 try {
2754 result = dbConnection_->query(
2755 std::string(
2756 "SELECT fu from fu_implementation WHERE id=" +
2757 Conversion::toString(implID) + ";"));
2758 } catch (const Exception& e) {
2760 assert(false);
2761 }
2762
2763 if (result->hasNext()) {
2764 result->next();
2765 RowID id = result->data(0).integerValue();
2766 delete result;
2767 return id;
2768 } else {
2769 delete result;
2770 throw KeyNotFound(__FILE__, __LINE__, __func__);
2771 }
2772}

References __func__, assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), DataObject::integerValue(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), and Conversion::toString().

Referenced by HDBEditorDeleteCmd::Do(), HDBEditorModifyCmd::Do(), HDBToHtml::fuImplToHtml(), and HDB::CachedHDBManager::removeFUImplementation().

Here is the call graph for this function:

◆ fuEntryIDs()

std::set< RowID > HDB::HDBManager::fuEntryIDs ( ) const

Returns a set of FU entry IDs in the database.

Returns
A set containing all the FU entry IDs in the database.

Definition at line 2021 of file HDBManager.cc.

2021 {
2022
2023 string query = "SELECT id AS 'fu.id' FROM fu;";
2024
2025 // make the SQL query to obtain all the IDs
2026 RelationalDBQueryResult* queryResult = NULL;
2027 try {
2028 queryResult = dbConnection_->query(query);
2029 } catch (const Exception& e) {
2030 // should not throw in any case
2032 assert(false);
2033 }
2034
2035 std::set<RowID> idSet;
2036 while (queryResult->hasNext()) {
2037 queryResult->next();
2038 const DataObject& idData = queryResult->data("fu.id");
2039 idSet.insert(idData.integerValue());
2040 }
2041
2042 delete queryResult;
2043 return idSet;
2044}

References assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), DataObject::integerValue(), RelationalDBQueryResult::next(), and RelationalDBConnection::query().

Referenced by CostDatabase::buildFunctionUnits(), ProGeTools::checkForSelectableFU(), Automagic::checkForSelectableFU(), ImplementationTester::fuEntryIDs(), CostEstimationDataDialog::onEntryTypeSelection(), and HDBBrowserWindow::update().

Here is the call graph for this function:

◆ fuExternalPortsByIDQuery()

std::string HDB::HDBManager::fuExternalPortsByIDQuery ( RowID  id)
staticprivate

Creates an SQL query for getting external port data of implementation of the FU that has the given ID.

The result table has fields {fu_external_port.name, fu_external_port.direction, fu_external_port.width_formula, fu_external_port.description}.

Parameters
idID of the FU entry in HDB.
Returns
The SQL query.

Definition at line 6029 of file HDBManager.cc.

6029 {
6030 string idString = Conversion::toString(id);
6031 string query =
6032 "SELECT fu_external_port.name AS 'fu_external_port.name',"
6033 " fu_external_port.direction AS 'fu_external_port.direction',"
6034 " fu_external_port.width_formula AS "
6035 " 'fu_external_port.width_formula',"
6036 " fu_external_port.description AS "
6037 " 'fu_external_port.description' "
6038 "FROM fu, fu_implementation, fu_external_port "
6039 "WHERE fu.id=" + idString + " AND"
6040 " fu_implementation.fu=fu.id AND"
6041 " fu_external_port.fu_impl=fu_implementation.id;";
6042 return query;
6043}

References Conversion::toString().

Referenced by addFUExternalPortsToImplementation().

Here is the call graph for this function:

◆ fuImplementationByIDQuery()

std::string HDB::HDBManager::fuImplementationByIDQuery ( RowID  id)
staticprivate

Creates an SQL query for getting FU implementation data of the FU that has the given ID.

The result table has fields {fu_implementation.id, fu_implementation.name, fu_implementation.opcode_port, fu_implementation.clk_port, fu_implementation.rst_port, fu_implementation.glock_port, fu_implementation.glock_req_port}.

Parameters
idID of the FU entry in HDB.

Definition at line 5948 of file HDBManager.cc.

5948 {
5949 string idString = Conversion::toString(id);
5950 string query =
5951 "SELECT fu_implementation.id AS 'fu_implementation.id',"
5952 " fu_implementation.name AS 'fu_implementation.name',"
5953 " fu_implementation.opcode_port AS "
5954 "'fu_implementation.opcode_port',"
5955 " fu_implementation.clk_port AS 'fu_implementation.clk_port',"
5956 " fu_implementation.rst_port AS 'fu_implementation.rst_port',"
5957 " fu_implementation.glock_port AS "
5958 " 'fu_implementation.glock_port',"
5959 " fu_implementation.glock_req_port AS "
5960 " 'fu_implementation.glock_req_port' "
5961 "FROM fu, fu_implementation "
5962 "WHERE fu.id=" + idString + " AND"
5963 " fu_implementation.fu=fu.id;";
5964 return query;
5965}

References Conversion::toString().

Referenced by createImplementationOfFU().

Here is the call graph for this function:

◆ fuImplementationDataPortsByIDQuery()

std::string HDB::HDBManager::fuImplementationDataPortsByIDQuery ( RowID  id)
staticprivate

Creates an SQL qury for getting data port data of implementation of the FU that has the given ID.

The result table has fields {fu_port_map.name, fu_port_map.width_formula, fu_port_map.load_port, fu_port_map.guard_port}

Parameters
idID of the FU entry in HDB.

Definition at line 6002 of file HDBManager.cc.

6002 {
6003 string idString = Conversion::toString(id);
6004 string query =
6005 "SELECT fu_port_map.name AS 'fu_port_map.name',"
6006 " fu_port_map.width_formula AS 'fu_port_map.width_formula',"
6007 " fu_port_map.load_port AS 'fu_port_map.load_port',"
6008 " fu_port_map.guard_port AS 'fu_port_map.guard_port' "
6009 "FROM fu, fu_port_map, fu_implementation "
6010 "WHERE fu.id=" + idString + " AND"
6011 " fu_implementation.fu=fu.id AND"
6012 " fu_port_map.fu_impl=fu_implementation.id;";
6013 return query;
6014}

References Conversion::toString().

Referenced by addDataPortsToImplementation().

Here is the call graph for this function:

◆ fuImplementationParametersByIDQuery()

std::string HDB::HDBManager::fuImplementationParametersByIDQuery ( RowID  id)
staticprivate

Creates an SQL query for getting the parameters of the implementation of the FU that has the given ID.

The result table has fields {name, type, value}.

Parameters
idID of the FU implementation entry.
Returns
The SQL query.

Definition at line 6085 of file HDBManager.cc.

6085 {
6086 string idString = Conversion::toString(id);
6087 string query =
6088 "SELECT fu_implementation_parameter.name AS 'name',"
6089 " fu_implementation_parameter.type AS 'type',"
6090 " fu_implementation_parameter.value AS 'value' "
6091 "FROM fu_implementation, fu_implementation_parameter "
6092 "WHERE fu_implementation.fu=" + idString + " AND"
6093 " fu_implementation_parameter.fu_impl=fu_implementation.id;";
6094 return query;
6095}

References Conversion::toString().

Referenced by addFUParametersToImplementation().

Here is the call graph for this function:

◆ fuPortBindingByNameQuery()

std::string HDB::HDBManager::fuPortBindingByNameQuery ( RowID  fuID,
const std::string &  portName 
)
staticprivate

Creates an SQL query for getting io binding data of port that has the given name.

The result table has fields {operation.name, io_binding.io_number}.

Parameters
fuIDID of the FU entry.
portNameName of the implemented port.
Returns
The SQL query.

Definition at line 6132 of file HDBManager.cc.

6134 {
6135
6136 string idString = Conversion::toString(fuID);
6137 string query =
6138 "SELECT operation.name AS 'operation.name',"
6139 " io_binding.io_number AS 'io_binding.io_number' "
6140 "FROM operation, io_binding, fu_port_map, fu_implementation "
6141 "WHERE fu_implementation.fu=" + idString + " AND"
6142 " fu_port_map.fu_impl=fu_implementation.id AND"
6143 " fu_port_map.name='" + portName + "' AND"
6144 " io_binding.port=fu_port_map.arch_port AND"
6145 " operation.id=io_binding.operation;";
6146 return query;
6147}

References Conversion::toString().

Referenced by resolveArchitecturePort().

Here is the call graph for this function:

◆ fuPortsAndBindingsByIDQuery()

std::string HDB::HDBManager::fuPortsAndBindingsByIDQuery ( RowID  id)
staticprivate

Creates an SQL query for getting the architectural ports and their operand bindings of the FU architecture that has the given ID.

The result table has fields {fu_data_port.id, fu_data_port.triggers, fu_data_port.sets-opcode, fu_data_port.guard_support, fu_data_port.width, operation.name, io_binding.io_number}

Parameters
idThe ID of the FU architecture.

Definition at line 5866 of file HDBManager.cc.

5866 {
5867 string idString = Conversion::toString(id);
5868 string query =
5869 "SELECT fu_data_port.id AS 'fu_data_port.id',"
5870 " fu_data_port.triggers AS 'fu_data_port.triggers',"
5871 " fu_data_port.sets_opcode AS 'fu_data_port.sets_opcode',"
5872 " fu_data_port.guard_support AS 'fu_data_port.guard_support',"
5873 " fu_data_port.width AS 'fu_data_port.width',"
5874 " operation.name AS 'operation.name',"
5875 " io_binding.io_number AS 'io_binding.io_number' "
5876 "FROM fu_data_port, io_binding, operation "
5877 "WHERE fu_data_port.fu_arch=" + idString + " AND"
5878 " io_binding.port=fu_data_port.id AND"
5879 " io_binding.operation=operation.id;";
5880 return query;
5881}

References Conversion::toString().

Referenced by addPortsAndBindingsToFUArchitecture().

Here is the call graph for this function:

◆ fuSourceFilesByIDQuery()

std::string HDB::HDBManager::fuSourceFilesByIDQuery ( RowID  id)
staticprivate

Creates an SQL query for getting the block source files of the FU entry that has the given ID.

The result table has fields {block_source_file.file, format.format}.

Parameters
idID of the FU entry.
Returns
The SQL query.

Definition at line 6160 of file HDBManager.cc.

6160 {
6161 string idString = Conversion::toString(id);
6162 string query =
6163 "SELECT block_source_file.file AS 'block_source_file.file',"
6164 " format.format AS 'format.format' "
6165 "FROM block_source_file, fu_source_file, fu_implementation, format "
6166 "WHERE fu_implementation.fu=" + idString + " AND"
6167 " fu_source_file.fu_impl=fu_implementation.id AND"
6168 " block_source_file.id=fu_source_file.file AND"
6169 " format.id=block_source_file.format;";
6170 return query;
6171}

References Conversion::toString().

Referenced by addBlockImplementationFiles().

Here is the call graph for this function:

◆ getDBConnection()

RelationalDBConnection * HDB::HDBManager::getDBConnection ( ) const
protected

Returns used database connection.

Definition at line 6973 of file HDBManager.cc.

6973 {
6974 return dbConnection_;
6975}

References dbConnection_.

Referenced by HDB::CachedHDBManager::costEstimationDataIDs().

◆ hasBusEntry()

bool HDB::HDBManager::hasBusEntry ( RowID  id) const
private

Tells whether the HDB has an Bus entry that has the given ID.

Returns
True if the HDB has the entry, otherwise false.

Definition at line 3966 of file HDBManager.cc.

3966 {
3967
3969
3970 try {
3971 result = dbConnection_->query(busEntryByIDQuery(id));
3972 } catch (const Exception&) {
3973 assert(false);
3974 }
3975
3976 if (result->hasNext()) {
3977 result->next();
3978 assert(!result->hasNext());
3979 delete result;
3980 return true;
3981 } else {
3982 delete result;
3983 return false;
3984 }
3985}
static std::string busEntryByIDQuery(RowID id)

References assert, busEntryByIDQuery(), dbConnection_, RelationalDBQueryResult::hasNext(), RelationalDBQueryResult::next(), and RelationalDBConnection::query().

Referenced by addCostEstimationData(), modifyCostEstimationData(), and removeBusEntry().

Here is the call graph for this function:

◆ hasColumn()

bool HDB::HDBManager::hasColumn ( const std::string &  table,
const std::string &  columnName 
) const
private

Returns true if a table by name has a column by given name.

Parameters
tableThe table by name to search the column from.
columnNameThe name of the column to be searched.
Returns
True if the table has the named column.

Definition at line 4328 of file HDBManager.cc.

4329 {
4330
4331 std::string table_info_query("PRAGMA table_info(");
4332 table_info_query += table;
4333 table_info_query += ");";
4334
4336 try {
4337 result = dbConnection_->query(table_info_query);
4338 } catch (const Exception& e) {
4340 assert(false);
4341 }
4342
4343 while(result->hasNext()) {
4344 result->next();
4345 // Second column in result row is column name of the table.
4346 const DataObject& columnData = result->data(1);
4347 std::string columnNameFromTable = columnData.stringValue();
4348
4349 assert(!columnNameFromTable.empty());
4350 if(columnNameFromTable == columnName) {
4351 return true;
4352 }
4353 }
4354
4355 return false;
4356}

References assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), and DataObject::stringValue().

Referenced by addRFImplementation(), createImplementationOfRF(), and HDBManager().

Here is the call graph for this function:

◆ hasCostEstimationDataByID()

bool HDB::HDBManager::hasCostEstimationDataByID ( RowID  id) const
private

Tells whether the HDB has cost estimation data that has the given ID.

Returns
True if the HDB has the data, otherwise false.

Definition at line 4021 of file HDBManager.cc.

4021 {
4022
4024 std::string query = "SELECT id FROM cost_estimation_data WHERE id=";
4025 query += Conversion::toString(id) + ";";
4026
4027 try {
4028 result = dbConnection_->query(query);
4029 } catch (const Exception&) {
4030 assert(false);
4031 }
4032
4033 if (result->hasNext()) {
4034 result->next();
4035 assert(!result->hasNext());
4036 delete result;
4037 return true;
4038 } else {
4039 delete result;
4040 return false;
4041 }
4042}

References assert, dbConnection_, RelationalDBQueryResult::hasNext(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), and Conversion::toString().

Referenced by modifyCostEstimationData().

Here is the call graph for this function:

◆ hasCostFunctionPluginByID()

bool HDB::HDBManager::hasCostFunctionPluginByID ( RowID  id) const
private

Tells whether the HDB has cost function plugin that has the given ID.

Returns
True if the HDB has the plugin, otherwise false.

Definition at line 4050 of file HDBManager.cc.

4050 {
4051
4053 std::string query = "SELECT id FROM cost_function_plugin WHERE id=";
4054 query += Conversion::toString(id) + ";";
4055
4056 try {
4057 result = dbConnection_->query(query);
4058 } catch (const Exception&) {
4059 assert(false);
4060 }
4061
4062 if (result->hasNext()) {
4063 result->next();
4064 assert(!result->hasNext());
4065 delete result;
4066 return true;
4067 } else {
4068 delete result;
4069 return false;
4070 }
4071}

References assert, dbConnection_, RelationalDBQueryResult::hasNext(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), and Conversion::toString().

Referenced by modifyCostFunctionPlugin().

Here is the call graph for this function:

◆ hasFUEntry()

bool HDB::HDBManager::hasFUEntry ( RowID  id) const
private

Tells whether the HDB has an FU entry that has the given ID.

Returns
True if the HDB has the entry, otherwise false.

Definition at line 3910 of file HDBManager.cc.

3910 {
3911
3913
3914 try {
3915 result = dbConnection_->query(fuEntryByIDQuery(id));
3916 } catch (const Exception&) {
3917 assert(false);
3918 }
3919
3920 if (result->hasNext()) {
3921 result->next();
3922 assert(!result->hasNext());
3923 delete result;
3924 return true;
3925 } else {
3926 delete result;
3927 return false;
3928 }
3929}
static std::string fuEntryByIDQuery(RowID id)

References assert, dbConnection_, fuEntryByIDQuery(), RelationalDBQueryResult::hasNext(), RelationalDBQueryResult::next(), and RelationalDBConnection::query().

Referenced by addCostEstimationData(), addFUImplementation(), modifyCostEstimationData(), removeFUEntry(), setArchitectureForFU(), and unsetArchitectureForFU().

Here is the call graph for this function:

◆ hasRFEntry()

bool HDB::HDBManager::hasRFEntry ( RowID  id) const
private

Tells whether the HDB has an RF entry that has the given ID.

Returns
True if the HDB has the entry, otherwise false.

Definition at line 3938 of file HDBManager.cc.

3938 {
3939
3941
3942 try {
3943 result = dbConnection_->query(rfEntryByIDQuery(id));
3944 } catch (const Exception&) {
3945 assert(false);
3946 }
3947
3948 if (result->hasNext()) {
3949 result->next();
3950 assert(!result->hasNext());
3951 delete result;
3952 return true;
3953 } else {
3954 delete result;
3955 return false;
3956 }
3957}
static std::string rfEntryByIDQuery(RowID id)

References assert, dbConnection_, RelationalDBQueryResult::hasNext(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), and rfEntryByIDQuery().

Referenced by addCostEstimationData(), addRFImplementation(), modifyCostEstimationData(), removeRFEntry(), and setArchitectureForRF().

Here is the call graph for this function:

◆ hasSocketEntry()

bool HDB::HDBManager::hasSocketEntry ( RowID  id) const
private

Tells whether the HDB has an Socket entry that has the given ID.

Returns
True if the HDB has the entry, otherwise false.

Definition at line 3994 of file HDBManager.cc.

3994 {
3995
3997
3998 try {
4000 } catch (const Exception&) {
4001 assert(false);
4002 }
4003
4004 if (result->hasNext()) {
4005 result->next();
4006 assert(!result->hasNext());
4007 delete result;
4008 return true;
4009 } else {
4010 delete result;
4011 return false;
4012 }
4013}
static std::string socketEntryByIDQuery(RowID id)

References assert, dbConnection_, RelationalDBQueryResult::hasNext(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), and socketEntryByIDQuery().

Referenced by addCostEstimationData(), modifyCostEstimationData(), and removeSocketEntry().

Here is the call graph for this function:

◆ insertFileFormats()

void HDB::HDBManager::insertFileFormats ( RelationalDBConnection connection)
staticprivate

Inserts the supported formats to the format table.

Parameters
connectionThe connection used when inserting the formats.

Definition at line 5675 of file HDBManager.cc.

5675 {
5676 try {
5677 connection.updateQuery(
5678 std::string(
5679 "INSERT INTO format(id,format) VALUES(1,\"" +
5680 VHDL_FORMAT + "\");"));
5681 connection.updateQuery(
5682 std::string(
5683 "INSERT INTO format(id,format) VALUES(2,\"" +
5684 VERILOG_FORMAT + "\");"));
5685 } catch (const Exception& e) {
5687 assert(false);
5688 }
5689}

References assert, debugLog, Exception::errorMessage(), RelationalDBConnection::updateQuery(), VERILOG_FORMAT, and VHDL_FORMAT.

Referenced by createNew().

Here is the call graph for this function:

◆ ioUsageDataByIDQuery()

std::string HDB::HDBManager::ioUsageDataByIDQuery ( RowID  id)
staticprivate

Creates an SQL query for getting the IO usage data of pipelines of operations contained in the FU architecture that has the given ID.

The result table has fields {operation.name, io_usage.cycle, io_usage.io_number, io_usage.action}.

Parameters
idID of the FU architecture in HDB.

Definition at line 5894 of file HDBManager.cc.

5894 {
5895 string idString = Conversion::toString(id);
5896 string query =
5897 "SELECT operation.name AS 'operation.name',"
5898 " io_usage.cycle AS 'io_usage.cycle',"
5899 " io_usage.io_number AS 'io_usage.io_number',"
5900 " io_usage.action AS 'io_usage.action' "
5901 "FROM operation_pipeline, io_usage, operation "
5902 "WHERE operation_pipeline.fu_arch=" + idString + " AND"
5903 " io_usage.pipeline=operation_pipeline.id AND"
5904 " operation.id=operation_pipeline.operation;";
5905 return query;
5906}

References Conversion::toString().

Referenced by addOperationPipelinesToFUArchitecture().

Here is the call graph for this function:

◆ isMatchingArchitecture()

bool HDB::HDBManager::isMatchingArchitecture ( const TTAMachine::FunctionUnit fu,
const FUArchitecture arch 
)
staticprivate

Checks whether the given FU has a mathing architecture with the given FU architecture instance.

Parameters
fuThe function unit.
archThe FU architecture.
Returns
True if the architectures match, otherwise false.

Definition at line 5505 of file HDBManager.cc.

5507 {
5508
5509 if (fu.operationCount() != arch.architecture().operationCount()) {
5510 return false;
5511 }
5512
5513 std::map<const FUPort*, const FUPort*> portMap;
5514 for (int i = 0; i < fu.operationPortCount(); i++) {
5515 portMap.insert(
5516 std::pair<const FUPort*, const FUPort*>(
5517 fu.operationPort(i), NULL));
5518 }
5519
5520 PipelineElementUsageTable plineElementUsages;
5521
5522 for (int i = 0; i < fu.operationCount(); i++) {
5523 HWOperation* operation = fu.operation(i);
5524 if (!arch.architecture().hasOperation(operation->name())) {
5525 return false;
5526 }
5527 HWOperation* archOp = arch.architecture().operation(
5528 operation->name());
5529 if (operation->latency() != archOp->latency()) {
5530 return false;
5531 }
5532
5533 // check operand bindings
5534 for (int i = 0; i < fu.operationPortCount(); i++) {
5535 FUPort* port = fu.operationPort(i);
5536 if (operation->isBound(*port)) {
5537 int io = operation->io(*port);
5538 FUPort* samePort = archOp->port(io);
5539 if (samePort == NULL) {
5540 return false;
5541 }
5542 const FUPort* existingSamePort =
5544 if (existingSamePort != NULL &&
5545 existingSamePort != samePort) {
5546 return false;
5547 }
5548
5549 // check the width of the ports
5550 if (!arch.hasParameterizedWidth(samePort->name()) &&
5551 samePort->width() != port->width()) {
5552 return false;
5553 }
5554
5555 if (port->isOpcodeSetting() != samePort->isOpcodeSetting() ||
5556 port->isTriggering() != samePort->isTriggering()) {
5557 return false;
5558 }
5559 portMap.erase(port);
5560 portMap.insert(
5561 std::pair<const FUPort*, const FUPort*>(port, samePort));
5562 }
5563 }
5564
5565 // check operation pipeline
5566 ExecutionPipeline* opPipeline = operation->pipeline();
5567 ExecutionPipeline* archOpPipeline = archOp->pipeline();
5568 for (int cycle = 0; cycle < operation->latency(); cycle++) {
5570 opPipeline->writtenOperands(cycle);
5572 archOpPipeline->writtenOperands(cycle);
5573 if (written1 != written2) {
5574 return false;
5575 }
5577 opPipeline->readOperands(cycle);
5579 archOpPipeline->readOperands(cycle);
5580 if (read1 != read2) {
5581 return false;
5582 }
5583
5584 PipelineElementUsage usage;
5585 for (int i = 0; i < fu.pipelineElementCount(); i++) {
5586 const PipelineElement* elem = fu.pipelineElement(i);
5587 if (opPipeline->isResourceUsed(elem->name(),cycle)) {
5588 usage.usage1.insert(elem);
5589 }
5590 }
5591
5592 for (int i = 0; i < arch.architecture().pipelineElementCount();
5593 i++) {
5594 const PipelineElement* elem =
5595 arch.architecture().pipelineElement(i);
5596 if (archOpPipeline->isResourceUsed(elem->name(), cycle)) {
5597 usage.usage2.insert(elem);
5598 }
5599 }
5600
5601 plineElementUsages.push_back(usage);
5602 }
5603 }
5604
5605 return areCompatiblePipelines(plineElementUsages);
5606}
std::vector< PipelineElementUsage > PipelineElementUsageTable
static bool areCompatiblePipelines(const PipelineElementUsageTable &table)
virtual FUPort * port(int operand) const

References HDB::FUArchitecture::architecture(), areCompatiblePipelines(), TTAMachine::FunctionUnit::hasOperation(), HDB::FUArchitecture::hasParameterizedWidth(), TTAMachine::HWOperation::io(), TTAMachine::HWOperation::isBound(), TTAMachine::FUPort::isOpcodeSetting(), TTAMachine::ExecutionPipeline::isResourceUsed(), TTAMachine::FUPort::isTriggering(), MapTools::keyForValue(), TTAMachine::HWOperation::latency(), TTAMachine::HWOperation::name(), TTAMachine::PipelineElement::name(), TTAMachine::Port::name(), TTAMachine::FunctionUnit::operation(), TTAMachine::FunctionUnit::operationCount(), TTAMachine::FunctionUnit::operationPort(), TTAMachine::FunctionUnit::operationPortCount(), TTAMachine::HWOperation::pipeline(), TTAMachine::FunctionUnit::pipelineElement(), TTAMachine::FunctionUnit::pipelineElementCount(), TTAMachine::HWOperation::port(), TTAMachine::ExecutionPipeline::readOperands(), HDB::HDBManager::PipelineElementUsage::usage1, HDB::HDBManager::PipelineElementUsage::usage2, TTAMachine::BaseFUPort::width(), and TTAMachine::ExecutionPipeline::writtenOperands().

Referenced by fuEntriesByArchitecture().

Here is the call graph for this function:

◆ modifyCostEstimationData()

void HDB::HDBManager::modifyCostEstimationData ( RowID  id,
const CostEstimationData data 
)
virtual

Updates cost estimation data in the HDB.

Parameters
idRow ID of the data to update.
dataUpdated data.

Reimplemented in HDB::CachedHDBManager.

Definition at line 6985 of file HDBManager.cc.

6985 {
6986 if (!data.hasName() || !data.hasValue() || !data.hasPluginID()) {
6987 throw InvalidData(__FILE__, __LINE__, __func__);
6988 }
6989
6990 if (!hasCostEstimationDataByID(id)) {
6991 throw KeyNotFound(__FILE__, __LINE__, __func__);
6992 }
6993
6994 std::string query =
6995 std::string("UPDATE cost_estimation_data SET ") +
6996 " name='" + data.name() +
6997 "', value='" + data.value().stringValue() +
6998 "', plugin_reference=" + Conversion::toString(data.pluginID());
6999
7000 // FU entry reference.
7001 if (data.hasFUReference()) {
7002 if (!hasFUEntry(data.fuReference())) {
7003 throw KeyNotFound(__FILE__, __LINE__, __func__);
7004 }
7005 query += ", fu_reference=";
7006 query += Conversion::toString(data.fuReference());
7007 } else {
7008 query += ", fu_reference=NULL";
7009 }
7010
7011 // RF entry reference.
7012 if (data.hasRFReference()) {
7013 if (!hasRFEntry(data.rfReference())) {
7014 throw KeyNotFound(__FILE__, __LINE__, __func__);
7015 }
7016 query += ", rf_reference=";
7017 query += Conversion::toString(data.rfReference());
7018 } else {
7019 query += ", rf_reference=NULL";
7020 }
7021
7022 // Bus entry reference
7023 if (data.hasBusReference()) {
7024 if (!hasBusEntry(data.busReference())) {
7025 throw KeyNotFound(__FILE__, __LINE__, __func__);
7026 }
7027 query += ", bus_reference=";
7028 query += Conversion::toString(data.busReference());
7029 } else {
7030 query += ", bus_reference=NULL";
7031 }
7032
7033 // Socket entry reference.
7034 if (data.hasSocketReference()) {
7035 if (!hasSocketEntry(data.socketReference())) {
7036 throw KeyNotFound(__FILE__, __LINE__, __func__);
7037 }
7038 query += ", socket_reference=";
7039 query += Conversion::toString(data.socketReference());
7040 } else {
7041 query += ", socket_reference=NULL";
7042 }
7043
7044 query += " WHERE id=";
7045 query += Conversion::toString(id);
7046 query += ";";
7047
7048 try {
7049 dbConnection_->updateQuery(query);
7050 } catch (const Exception& e) {
7052 assert(false);
7053 }
7054}
bool hasCostEstimationDataByID(RowID id) const

References __func__, assert, CostEstimationData::busReference(), dbConnection_, debugLog, Exception::errorMessage(), CostEstimationData::fuReference(), hasBusEntry(), CostEstimationData::hasBusReference(), hasCostEstimationDataByID(), hasFUEntry(), CostEstimationData::hasFUReference(), CostEstimationData::hasName(), CostEstimationData::hasPluginID(), hasRFEntry(), CostEstimationData::hasRFReference(), hasSocketEntry(), CostEstimationData::hasSocketReference(), CostEstimationData::hasValue(), CostEstimationData::name(), CostEstimationData::pluginID(), CostEstimationData::rfReference(), CostEstimationData::socketReference(), DataObject::stringValue(), Conversion::toString(), RelationalDBConnection::updateQuery(), and CostEstimationData::value().

Referenced by HDB::CachedHDBManager::modifyCostEstimationData(), and CostEstimationDataDialog::onOK().

Here is the call graph for this function:

◆ modifyCostFunctionPlugin()

void HDB::HDBManager::modifyCostFunctionPlugin ( RowID  id,
const CostFunctionPlugin plugin 
)
virtual

Modifies cost estimation function plugin attributes.

Parameters
idRowID of the plugin to modify.
pluginModified plugin (ID is ignored).
Exceptions
InvalidDataThrows if the given plugin was invalid.
KeyNotFoundThrows if no cost function plugin was found with given RowID.

Reimplemented in HDB::CachedHDBManager.

Definition at line 7066 of file HDBManager.cc.

7067 {
7068 if (plugin.name() == "") {
7069 throw InvalidData(__FILE__, __LINE__, __func__);
7070 }
7071
7072 if (!hasCostFunctionPluginByID(id)) {
7073 throw KeyNotFound(__FILE__, __LINE__, __func__);
7074 }
7075
7076 string type = "";
7077 switch (plugin.type()) {
7079 type = COST_PLUGIN_TYPE_FU;
7080 break;
7082 type = COST_PLUGIN_TYPE_RF;
7083 break;
7086 break;
7089 break;
7090 default:
7091 InvalidData ex(
7092 __FILE__, __LINE__, __func__,
7093 (boost::format("Illegal cost_function_plugin type %d.") %
7094 type).str());
7095 throw ex;
7096 break;
7097 }
7098
7099 std::string query =
7100 std::string("UPDATE cost_function_plugin SET ") +
7101 " name='" + plugin.name() +
7102 "', description='" + plugin.description() +
7103 "', plugin_file_path='" + plugin.pluginFilePath() +
7104 "', type='" + type + "'";
7105
7106 query += " WHERE id=";
7107 query += Conversion::toString(id);
7108 query += ";";
7109
7110 try {
7111 dbConnection_->updateQuery(query);
7112 } catch (const Exception& e) {
7114 assert(false);
7115 }
7116}
bool hasCostFunctionPluginByID(RowID id) const

References __func__, assert, HDB::CostFunctionPlugin::COST_DECOMP, HDB::CostFunctionPlugin::COST_FU, HDB::CostFunctionPlugin::COST_ICDEC, COST_PLUGIN_TYPE_DECOMP, COST_PLUGIN_TYPE_FU, COST_PLUGIN_TYPE_ICDEC, COST_PLUGIN_TYPE_RF, HDB::CostFunctionPlugin::COST_RF, dbConnection_, debugLog, HDB::CostFunctionPlugin::description(), Exception::errorMessage(), hasCostFunctionPluginByID(), HDB::CostFunctionPlugin::name(), HDB::CostFunctionPlugin::pluginFilePath(), Conversion::toString(), HDB::CostFunctionPlugin::type(), and RelationalDBConnection::updateQuery().

Referenced by HDB::CachedHDBManager::modifyCostFunctionPlugin(), and CostFunctionPluginDialog::onOK().

Here is the call graph for this function:

◆ opcodesByIDQuery()

std::string HDB::HDBManager::opcodesByIDQuery ( RowID  id)
staticprivate

Creates an SQL query for getting operation code data of the FU that has the given ID.

The result table has fields {operation.name, opcode_map.opcode}.

Parameters
idID of the FU entry in HDB.

Definition at line 5977 of file HDBManager.cc.

5977 {
5978 string idString = Conversion::toString(id);
5979 string query =
5980 "SELECT operation.name AS 'operation.name',"
5981 " opcode_map.opcode AS 'opcode_map.opcode' "
5982 "FROM fu, fu_implementation, operation, opcode_map "
5983 "WHERE fu.id=" + idString + " AND"
5984 " fu_implementation.fu=fu.id AND"
5985 " opcode_map.fu_impl=fu_implementation.id AND"
5986 " operation.id=opcode_map.operation;";
5987 return query;
5988}

References Conversion::toString().

Referenced by addOpcodesToImplementation().

Here is the call graph for this function:

◆ OperationImplementationByID()

HDB::OperationImplementation HDB::HDBManager::OperationImplementationByID ( RowID  id) const

Returns OperationImplementation.

Returns
OperationImplementation.

Definition at line 2234 of file HDBManager.cc.

2234 {
2235 RelationalDBQueryResult* result = nullptr;
2236 try {
2237 result = dbConnection_->query(
2238 std::string("SELECT * FROM operation_implementation WHERE id = ") +
2239 std::to_string(id) +
2240 std::string(";"));
2241 } catch (const Exception& e) {
2243 assert(false);
2244 }
2245
2246 OperationImplementation retval;
2247 if (result->hasNext()) {
2248 result->next();
2249
2250 retval.id = id;
2251 retval.latency = result->data("latency").integerValue();
2252 retval.name = result->data("name").stringValue();
2253 retval.postOpImplFileVhdl =
2254 result->data("post_op_vhdl").stringValue();
2255 retval.postOpImplFileVerilog =
2256 result->data("post_op_verilog").stringValue();
2257 retval.absBusDefFile =
2258 result->data("bus_definition").stringValue();
2259 retval.initialImplFileVerilog =
2260 result->data("initial_verilog").stringValue();
2261 retval.initialImplFileVhdl =
2262 result->data("initial_vhdl").stringValue();
2263 }
2264 delete result;
2265 result = nullptr;
2266
2267 try {
2268 result = dbConnection_->query(
2269 std::string("SELECT block_source_file.file "
2270 "FROM operation_implementation_source_file, "
2271 "block_source_file "
2272 "WHERE operation_implementation_source_"
2273 "file.operation = ") +
2274 std::to_string(id) +
2275 std::string(" AND operation_implementation_source_file.file = "
2276 " block_source_file.id"
2277 " AND block_source_file.format = "
2278 + std::to_string(
2280 ";"));
2281
2282 } catch (const Exception& e) {
2284 assert(false);
2285 }
2286 if (result->hasNext()) {
2287 result->next();
2288 retval.implFileVhdl = result->data("file").stringValue();
2289 }
2290 delete result;
2291 result = nullptr;
2292
2293 try {
2294 result = dbConnection_->query(
2295 std::string("SELECT block_source_file.file "
2296 "FROM operation_implementation_source_file, "
2297 "block_source_file "
2298 "WHERE operation_implementation_"
2299 "source_file.operation = ") +
2300 std::to_string(id) +
2301 std::string(" AND operation_implementation_source_file.file = "
2302 " block_source_file.id"
2303 " AND block_source_file.format = "
2304 + std::to_string(
2306 ";"));
2307
2308 } catch (const Exception& e) {
2310 assert(false);
2311 }
2312 if (result->hasNext()) {
2313 result->next();
2314 retval.implFileVerilog = result->data("file").stringValue();
2315 }
2316 delete result;
2317 result = nullptr;
2318
2319 std::string q1 = "SELECT resource, count "
2320 "FROM operation_implementation_resources "
2321 "WHERE operation_implementation_resources.operation = "
2322 + std::to_string(id) + ";";
2323 result = dbConnection_->query(q1);
2324 while (result->hasNext()) {
2325 result->next();
2326 int resource = result->data("resource").integerValue();
2327 OperationImplementationResource r =
2329 r.count = result->data("count").integerValue();
2330 retval.resources.emplace_back(r);
2331 }
2332
2333 std::string q2 = "SELECT name, width, type, language "
2334 "FROM operation_implementation_variable "
2335 "WHERE CAST(operation as TEXT) = \"" + std::to_string(id) + "\";";
2336 result = dbConnection_->query(q2);
2337 while (result->hasNext()) {
2338 result->next();
2339 std::string name = result->data("name").stringValue();
2340 std::string width = result->data("width").stringValue();
2341 std::string type = result->data("type").stringValue();
2342 std::string lang = result->data("language").stringValue();
2343 // TODO not all HDBs have a rename column yet, so variable renaming is
2344 // hardcoded
2345 bool rename = true;
2346 // std::string renamestr = result->data("rename").stringValue();
2347 // bool rename = renamestr != "0";
2348 if (lang == "VHDL") {
2349 Variable var = {name, width, type, rename};
2350 retval.vhdlVariables.emplace_back(var);
2351 } else if (lang == "Verilog") {
2352 retval.verilogVariables.emplace_back(
2353 Variable{name, width, type, rename});
2354 } else {
2355 throw std::runtime_error("Unknown language");
2356 }
2357 }
2358
2360 "operation_implementation_globalsignal")) {
2361 std::string q3 =
2362 "SELECT name, width, type, language, rename "
2363 "FROM operation_implementation_globalsignal "
2364 "WHERE CAST(operation as TEXT) = \"" +
2365 std::to_string(id) + "\";";
2366 result = dbConnection_->query(q3);
2367 while (result->hasNext()) {
2368 result->next();
2369 std::string name = result->data("name").stringValue();
2370 std::string width = result->data("width").stringValue();
2371 std::string type = result->data("type").stringValue();
2372 std::string lang = result->data("language").stringValue();
2373 std::string renamestr = result->data("rename").stringValue();
2374 bool rename = renamestr != "0";
2375 if (lang == "VHDL") {
2376 Variable var = {name, width, type, rename};
2377 retval.vhdlGlobalSignals.emplace_back(var);
2378 } else if (lang == "Verilog") {
2379 retval.verilogGlobalSignals.emplace_back(
2380 Variable{name, width, type, rename});
2381 } else {
2382 throw std::runtime_error("Unknown language");
2383 }
2384 }
2385 }
2386
2387 return retval;
2388}
OperationImplementationResource OperationImplementationResourceByID(RowID id) const

References HDB::OperationImplementation::absBusDefFile, assert, HDB::OperationImplementationResource::count, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), HDB::OperationImplementation::id, HDB::OperationImplementation::implFileVerilog, HDB::OperationImplementation::implFileVhdl, HDB::OperationImplementation::initialImplFileVerilog, HDB::OperationImplementation::initialImplFileVhdl, DataObject::integerValue(), HDB::OperationImplementation::latency, HDB::OperationImplementation::name, RelationalDBQueryResult::next(), OperationImplementationResourceByID(), HDB::OperationImplementation::postOpImplFileVerilog, HDB::OperationImplementation::postOpImplFileVhdl, RelationalDBConnection::query(), HDB::OperationImplementation::resources, DataObject::stringValue(), RelationalDBConnection::tableExistsInDB(), HDB::BlockImplementationFile::Verilog, HDB::OperationImplementation::verilogGlobalSignals, HDB::OperationImplementation::verilogVariables, HDB::BlockImplementationFile::VHDL, HDB::OperationImplementation::vhdlGlobalSignals, and HDB::OperationImplementation::vhdlVariables.

Referenced by ProGeTools::createFUGeneratableOperationInfos(), Automagic::createFUGeneratableOperationInfos(), FUGen::createImplementationFiles(), HDBToHtml::OperationImplementationToHtml(), FUGen::parseOperations(), and HDBBrowserWindow::update().

Here is the call graph for this function:

◆ OperationImplementationIDs()

std::set< RowID > HDB::HDBManager::OperationImplementationIDs ( ) const

Returns a set of Operation Implementation Resource IDs in the database.

Returns
A set containing all the Operation Implementation Resource IDs in the database.

Definition at line 2179 of file HDBManager.cc.

2179 {
2180 RelationalDBQueryResult* result = NULL;
2181 try {
2182 result = dbConnection_->query(
2183 std::string("SELECT id FROM operation_implementation;"));
2184 } catch (const Exception& e) {
2186 assert(false);
2187 }
2188
2189 std::set<RowID> idSet;
2190 while (result->hasNext()) {
2191 result->next();
2192 const DataObject& idData = result->data(0);
2193 idSet.insert(idData.integerValue());
2194 }
2195
2196 delete result;
2197 return idSet;
2198}

References assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), DataObject::integerValue(), RelationalDBQueryResult::next(), and RelationalDBConnection::query().

Referenced by ProGeTools::createFUGeneratableOperationInfos(), Automagic::createFUGeneratableOperationInfos(), and HDBBrowserWindow::update().

Here is the call graph for this function:

◆ OperationImplementationResourceByID()

HDB::OperationImplementationResource HDB::HDBManager::OperationImplementationResourceByID ( RowID  id) const

Returns OperationImplementationResource.

Returns
OperationImplementationResource.

Definition at line 2396 of file HDBManager.cc.

2396 {
2397 RelationalDBQueryResult* result = nullptr;
2398 try {
2399 result = dbConnection_->query(
2400 std::string("SELECT * FROM "
2401 "operation_implementation_resource WHERE id = ") +
2402 std::to_string(id) +
2403 std::string(";"));
2404 } catch (const Exception& e) {
2406 assert(false);
2407 }
2408
2409 OperationImplementationResource retval;
2410 if (result->hasNext()) {
2411 result->next();
2412
2413 retval.id = id;
2414 retval.name = result->data("name").stringValue();
2415 retval.ipxact = result->data("ipxact").stringValue();
2416 }
2417 delete result;
2418 result = nullptr;
2419
2420 try {
2421 result = dbConnection_->query(
2422 std::string("SELECT block_source_file.file, "
2423 "format.format "
2424 "FROM operation_implementation_resource_"
2425 "source_file, block_source_file, "
2426 "format "
2427 "WHERE operation_implementation_resource_"
2428 "source_file.resource = ") +
2429 std::to_string(id) +
2430 std::string(" AND operation_implementation_resource_"
2431 "source_file.file = "
2432 " block_source_file.id "
2433 "AND block_source_file.format = "
2434 "format.id;"
2435 ));
2436
2437 } catch (const Exception& e) {
2439 assert(false);
2440 }
2441 while (result->hasNext()) {
2442 result->next();
2443 std::string format = result->data("format").stringValue();
2444 if (format == VHDL_FORMAT) {
2445 retval.synFiles.push_back(result->data("file").stringValue());
2446 retval.synFormats.push_back(format);
2447 } else if (format == VHDL_SIM_FORMAT) {
2448 retval.simFiles.push_back(result->data("file").stringValue());
2449 retval.simFormats.push_back(format);
2450 } else if (format == VERILOG_FORMAT) {
2451 retval.synFiles.push_back(result->data("file").stringValue());
2452 retval.synFormats.push_back(format);
2453 } else if (format == VERILOG_SIM_FORMAT) {
2454 retval.simFiles.push_back(result->data("file").stringValue());
2455 retval.simFormats.push_back(format);
2456 }
2457 }
2458 delete result;
2459 result = nullptr;
2460
2461 return retval;
2462}

References assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), HDB::OperationImplementationResource::id, HDB::OperationImplementationResource::ipxact, HDB::OperationImplementationResource::name, RelationalDBQueryResult::next(), RelationalDBConnection::query(), HDB::OperationImplementationResource::simFiles, HDB::OperationImplementationResource::simFormats, DataObject::stringValue(), HDB::OperationImplementationResource::synFiles, HDB::OperationImplementationResource::synFormats, VERILOG_FORMAT, VERILOG_SIM_FORMAT, VHDL_FORMAT, and VHDL_SIM_FORMAT.

Referenced by OperationImplementationDialog::addAvailableResourcesToList(), OperationImplementationByID(), HDBToHtml::OperationImplementationResourceToHtml(), and HDBBrowserWindow::update().

Here is the call graph for this function:

◆ OperationImplementationResourceIDs()

std::set< RowID > HDB::HDBManager::OperationImplementationResourceIDs ( ) const

Returns a set of Operation Implementation IDs in the database.

Returns
A set containing all the Operation Implemnetation IDs in the database.

Definition at line 2207 of file HDBManager.cc.

2207 {
2208 RelationalDBQueryResult* result = NULL;
2209 try {
2210 result = dbConnection_->query(
2211 std::string("SELECT id FROM operation_implementation_resource;"));
2212 } catch (const Exception& e) {
2214 assert(false);
2215 }
2216
2217 std::set<RowID> idSet;
2218 while (result->hasNext()) {
2219 result->next();
2220 const DataObject& idData = result->data(0);
2221 idSet.insert(idData.integerValue());
2222 }
2223
2224 delete result;
2225 return idSet;
2226}

References assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), DataObject::integerValue(), RelationalDBQueryResult::next(), and RelationalDBConnection::query().

Referenced by OperationImplementationDialog::addAvailableResourcesToList(), and HDBBrowserWindow::update().

Here is the call graph for this function:

◆ removeBusEntry()

void HDB::HDBManager::removeBusEntry ( RowID  id) const
virtual

Removes the Bus entry that has the given ID from the database.

The entry is removed entirely, meaning that also cost estimation data of that entry are removed.

Parameters
idThe ID of the Bus entry.

Reimplemented in HDB::CachedHDBManager.

Definition at line 3404 of file HDBManager.cc.

3404 {
3405
3406 if (!hasBusEntry(id)) {
3407 return;
3408 }
3409
3410 // remove cost estimation data
3411 try {
3412 // get the IDs of cost estimation datas
3414 std::string(
3415 "SELECT id FROM cost_estimation_data "
3416 "WHERE bus_reference=" + Conversion::toString(id) + ";"));
3417 while (result->hasNext()) {
3418 result->next();
3419 const DataObject& costIDData = result->data(0);
3420 int dataID = costIDData.integerValue();
3422 }
3423 delete result;
3424 } catch (const Exception& e) {
3426 assert(false);
3427 }
3428
3429 // remove from bus table
3430 try {
3432 std::string(
3433 "DELETE FROM bus "
3434 "WHERE id=" + Conversion::toString(id) + ";"));
3435 } catch (const Exception& e) {
3437 assert(false);
3438 }
3439}
virtual void removeCostEstimationData(RowID id) const

References assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), hasBusEntry(), RelationalDBQueryResult::hasNext(), DataObject::integerValue(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), removeCostEstimationData(), Conversion::toString(), and RelationalDBConnection::updateQuery().

Referenced by HDBEditorDeleteCmd::Do(), and HDB::CachedHDBManager::removeBusEntry().

Here is the call graph for this function:

◆ removeCostEstimationData()

void HDB::HDBManager::removeCostEstimationData ( RowID  id) const
virtual

Removes the cost estimation data that has the given ID.

Parameters
idID of the cost estimation data.

Reimplemented in HDB::CachedHDBManager.

Definition at line 5465 of file HDBManager.cc.

5465 {
5466 try {
5468 std::string(
5469 "DELETE FROM cost_estimation_data "
5470 "WHERE id=" + Conversion::toString(id) + ";"));
5471 } catch (const Exception& e) {
5473 assert(false);
5474 }
5475}

References assert, dbConnection_, debugLog, Exception::errorMessage(), Conversion::toString(), and RelationalDBConnection::updateQuery().

Referenced by CostFunctionPluginDialog::onDelete(), removeBusEntry(), HDB::CachedHDBManager::removeCostEstimationData(), removeFUEntry(), and removeSocketEntry().

Here is the call graph for this function:

◆ removeCostFunctionPlugin()

void HDB::HDBManager::removeCostFunctionPlugin ( RowID  pluginID) const
virtual

Removes the CostFunctionPlugin that has the given ID.

Parameters
pluginIDID of the cost plugin.

Reimplemented in HDB::CachedHDBManager.

Definition at line 670 of file HDBManager.cc.

670 {
671
672 try {
674
675 // remove from cost_function_plugin table
677 std::string(
678 "DELETE FROM cost_function_plugin "
679 "WHERE id=" + Conversion::toString(pluginID) + ";"));
681 std::string(
682 "DELETE FROM cost_estimation_data "
683 "WHERE plugin_reference=" +
684 Conversion::toString(pluginID) + ";"));
685
687 } catch (const Exception& e) {
690 assert(false);
691 }
692}

References assert, RelationalDBConnection::beginTransaction(), RelationalDBConnection::commit(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBConnection::rollback(), Conversion::toString(), and RelationalDBConnection::updateQuery().

Referenced by AddCostFunctionPluginCmd::Do(), HDBEditorDeleteCmd::Do(), and HDB::CachedHDBManager::removeCostFunctionPlugin().

Here is the call graph for this function:

◆ removeFUArchitecture()

void HDB::HDBManager::removeFUArchitecture ( RowID  archID) const
virtual

Removes the FU architecture that has the given ID. The architecture is removed only it is not used by any FU entry. Otherwise an exception is thrown.

Parameters
archIDID of the FU architecture.
Exceptions
InvalidDataIf the architecture cannot be removed since it is used by some FU entry.

Reimplemented in HDB::CachedHDBManager.

Definition at line 927 of file HDBManager.cc.

927 {
928 if (!canRemoveFUArchitecture(archID)) {
929 throw InvalidData(__FILE__, __LINE__, __func__);
930 }
931
932 try {
934
935 // remove from io_binding table
937 std::string(
938 "DELETE FROM io_binding "
939 "WHERE port IN "
940 "(SELECT id "
941 "FROM fu_data_port "
942 "WHERE fu_arch=" + Conversion::toString(archID) + ");"));
943
944 // remove from fu_data_port table
946 std::string(
947 "DELETE FROM fu_data_port "
948 "WHERE fu_arch=" + Conversion::toString(archID) + ";"));
949
950 // remove from io_usage_table
952 std::string(
953 "DELETE FROM io_usage "
954 "WHERE pipeline IN "
955 "(SELECT id FROM operation_pipeline "
956 "WHERE fu_arch=" + Conversion::toString(archID) + ");"));
957
958 // remove from pipeline_resource_usage table
960 std::string(
961 "DELETE FROM pipeline_resource_usage "
962 "WHERE pipeline IN "
963 "(SELECT id FROM operation_pipeline "
964 "WHERE fu_arch=" + Conversion::toString(archID) + ");"));
965
966 // remove from pipeline_resource_table
968 std::string(
969 "DELETE FROM pipeline_resource "
970 "WHERE fu_arch=" + Conversion::toString(archID) + ";"));
971
972 // remove from operation_pipeline_table
974 std::string(
975 "DELETE FROM operation_pipeline "
976 "WHERE fu_arch=" + Conversion::toString(archID) + ";"));
977
978 // remove from fu_architecture table
980 std::string(
981 "DELETE FROM fu_architecture "
982 "WHERE id=" + Conversion::toString(archID) + ";"));
983
985
986 } catch (const Exception& e) {
989 assert(false);
990 }
991}
bool canRemoveFUArchitecture(RowID archID) const

References __func__, assert, RelationalDBConnection::beginTransaction(), canRemoveFUArchitecture(), RelationalDBConnection::commit(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBConnection::rollback(), Conversion::toString(), and RelationalDBConnection::updateQuery().

Referenced by HDBEditorDeleteCmd::Do(), and HDB::CachedHDBManager::removeFUArchitecture().

Here is the call graph for this function:

◆ removeFUEntry()

void HDB::HDBManager::removeFUEntry ( RowID  id) const
virtual

Removes the FU entry that has the given ID from the database.

The entry is removed entirely, meaning that all also FU implementation and cost estimation data of that entry are removed.

Parameters
idThe ID of the FU entry.

Reimplemented in HDB::CachedHDBManager.

Definition at line 1025 of file HDBManager.cc.

1025 {
1026
1027 if (!hasFUEntry(id)) {
1028 return;
1029 }
1030
1031 // remove implementation
1032 try {
1033 // get the ID of the implementation
1035 std::string(
1036 "SELECT id FROM fu_implementation "
1037 "WHERE fu=" + Conversion::toString(id) + ";"));
1038 if (result->hasNext()) {
1039 result->next();
1040 const DataObject& implIDData = result->data(0);
1041 int implID = implIDData.integerValue();
1042 removeFUImplementation(implID);
1043 }
1044 delete result;
1045 } catch (const Exception& e) {
1047 assert(false);
1048 }
1049
1050 // remove cost estimation data
1051 try {
1052 // get the IDs of cost estimation datas
1054 std::string(
1055 "SELECT id FROM cost_estimation_data "
1056 "WHERE fu_reference=" + Conversion::toString(id) + ";"));
1057 while (result->hasNext()) {
1058 result->next();
1059 const DataObject& costIDData = result->data(0);
1060 int dataID = costIDData.integerValue();
1062 }
1063 delete result;
1064 } catch (const Exception& e) {
1066 assert(false);
1067 }
1068
1069 // remove from fu table
1070 try {
1072 std::string(
1073 "DELETE FROM fu "
1074 "WHERE id=" + Conversion::toString(id) + ";"));
1075 } catch (const Exception& e) {
1077 assert(false);
1078 }
1079}
virtual void removeFUImplementation(RowID implementationID) const

References assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), hasFUEntry(), RelationalDBQueryResult::hasNext(), DataObject::integerValue(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), removeCostEstimationData(), removeFUImplementation(), Conversion::toString(), and RelationalDBConnection::updateQuery().

Referenced by HDBEditorDeleteCmd::Do(), and HDB::CachedHDBManager::removeFUEntry().

Here is the call graph for this function:

◆ removeFUImplementation()

void HDB::HDBManager::removeFUImplementation ( RowID  implID) const
virtual

Removes the given FU implementation from the database.

Parameters
implIDID of the FU implementation.

Reimplemented in HDB::CachedHDBManager.

Definition at line 1311 of file HDBManager.cc.

1311 {
1312
1313 try {
1315
1316 // remove from fu_ext_port_parameter_dependency table
1318 std::string(
1319 "DELETE FROM fu_ext_port_parameter_dependency "
1320 "WHERE parameter in (SELECT ALL id FROM "
1321 "fu_implementation_parameter WHERE fu_impl="
1322 + Conversion::toString(implID) + ");"));
1323
1324 // remove from fu_external_port table
1326 std::string(
1327 "DELETE FROM fu_external_port "
1328 "WHERE fu_impl=" + Conversion::toString(implID) + ";"));
1329
1330 // remove from fu_port_map table
1332 std::string(
1333 "DELETE FROM fu_port_map "
1334 "WHERE fu_impl=" + Conversion::toString(implID) + ";"));
1335
1336 // remove from opcode_map table
1338 std::string(
1339 "DELETE FROM opcode_map "
1340 "WHERE fu_impl=" + Conversion::toString(implID) + ";"));
1341
1342 // remove from fu_implementation_parameter
1344 std::string(
1345 "DELETE FROM fu_implementation_parameter "
1346 "WHERE fu_impl=" + Conversion::toString(implID) + ";"));
1347
1348 // remove from fu_source_file
1350 std::string(
1351 "DELETE FROM fu_source_file "
1352 "WHERE fu_impl=" + Conversion::toString(implID) + ";"));
1353
1354 // remove from block_source_file
1356 std::string(
1357 "DELETE FROM block_source_file "
1358 "WHERE id NOT IN "
1359 "(SELECT file FROM fu_source_file UNION "
1360 "SELECT file FROM rf_source_file);"));
1361
1362 // remove from fu_implementation
1364 std::string(
1365 "DELETE FROM fu_implementation "
1366 "WHERE id=" + Conversion::toString(implID) + ";"));
1367
1369
1370 } catch (const Exception& e) {
1373 assert(false);
1374 }
1375}

References assert, RelationalDBConnection::beginTransaction(), RelationalDBConnection::commit(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBConnection::rollback(), Conversion::toString(), and RelationalDBConnection::updateQuery().

Referenced by HDBEditorModifyCmd::Do(), removeFUEntry(), and HDB::CachedHDBManager::removeFUImplementation().

Here is the call graph for this function:

◆ removeOperationImplementation()

void HDB::HDBManager::removeOperationImplementation ( RowID  id)

Remove Operation Implemententation from DB.

Definition at line 2608 of file HDBManager.cc.

2608 {
2609 std::string d1 = "DELETE FROM operation_implementation "
2610 "WHERE id = " + std::to_string(id) + ";";
2611 std::string d2 =
2612 "DELETE FROM operation_implementation_source_file "
2613 "WHERE operation = " + std::to_string(id) + ";";
2614 std::string d3 =
2615 "DELETE FROM operation_implementation_resources "
2616 "WHERE operation = " + std::to_string(id) + ";";
2617 std::string d4 =
2618 "DELETE FROM operation_implementation_variable "
2619 "WHERE operation = " + std::to_string(id) + ";";
2620 std::string s1 = "SELECT file FROM "
2621 "operation_implementation_source_file "
2622 "WHERE operation = " + std::to_string(id) + ";";
2623
2625 while (result->hasNext()) {
2626 result->next();
2627 int file_id = result->data(0).integerValue();
2628 std::string d3lete = "DELETE FROM block_source_file "
2629 "WHERE id = " + std::to_string(file_id) + ";";
2630 dbConnection_->updateQuery(d3lete);
2631 }
2632
2637 delete result;
2638}

References RelationalDBQueryResult::data(), dbConnection_, RelationalDBQueryResult::hasNext(), DataObject::integerValue(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), and RelationalDBConnection::updateQuery().

Referenced by HDBEditorDeleteCmd::Do().

Here is the call graph for this function:

◆ removeOperationImplementationResource()

void HDB::HDBManager::removeOperationImplementationResource ( RowID  id)

Remove Operation Implemententation Resource from DB.

Definition at line 2644 of file HDBManager.cc.

2644 {
2645 std::string d1 = "DELETE FROM operation_implementation_resource "
2646 "WHERE id = " + std::to_string(id) + ";";
2647 std::string d2 =
2648 "DELETE FROM operation_implementation_resource_source_file "
2649 "WHERE resource = " + std::to_string(id) + ";";
2650 std::string s1 = "SELECT file FROM "
2651 "operation_implementation_resource_source_file "
2652 "WHERE resource = " + std::to_string(id) + ";";
2653
2655 while (result->hasNext()) {
2656 result->next();
2657 int file_id = result->data(0).integerValue();
2658 std::string d3 = "DELETE FROM block_source_file "
2659 "WHERE id = " + std::to_string(file_id) + ";";
2661 }
2662
2665 delete result;
2666}

References RelationalDBQueryResult::data(), dbConnection_, RelationalDBQueryResult::hasNext(), DataObject::integerValue(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), and RelationalDBConnection::updateQuery().

Referenced by HDBEditorDeleteCmd::Do().

Here is the call graph for this function:

◆ removeRFArchitecture()

void HDB::HDBManager::removeRFArchitecture ( RowID  archID) const
virtual

Removes the RF architecture that has the given ID.

Parameters
archIDID of the RF architecture.
Exceptions
InvalidDataIf the RF architecture cannot be removed.

Reimplemented in HDB::CachedHDBManager.

Definition at line 1521 of file HDBManager.cc.

1521 {
1522 if (!canRemoveRFArchitecture(archID)) {
1523 throw InvalidData(__FILE__, __LINE__, __func__);
1524 }
1525
1526 try {
1528 std::string(
1529 "DELETE FROM rf_architecture WHERE id=" +
1530 Conversion::toString(archID) + ";"));
1531 } catch (const Exception& e) {
1533 assert(false);
1534 }
1535}
bool canRemoveRFArchitecture(RowID archID) const

References __func__, assert, canRemoveRFArchitecture(), dbConnection_, debugLog, Exception::errorMessage(), Conversion::toString(), and RelationalDBConnection::updateQuery().

Referenced by HDBEditorDeleteCmd::Do(), and HDB::CachedHDBManager::removeRFArchitecture().

Here is the call graph for this function:

◆ removeRFEntry()

void HDB::HDBManager::removeRFEntry ( RowID  id) const
virtual

Removes the RF entry that has the given ID.

Cost estimation data and implementation of the entry are removed too.

Parameters
idID of the RF entry.

Reimplemented in HDB::CachedHDBManager.

Definition at line 1569 of file HDBManager.cc.

1569 {
1570
1571 if (!hasRFEntry(id)) {
1572 return;
1573 }
1574
1575 // remove from cost_estimation_data
1576 try {
1578 std::string(
1579 "DELETE FROM cost_estimation_data WHERE rf_reference=" +
1580 Conversion::toString(id) + ";"));
1581 } catch (const Exception& e) {
1583 assert(false);
1584 }
1585
1586 // remove implementation
1587 try {
1589 std::string(
1590 "SELECT id FROM rf_implementation WHERE rf=" +
1591 Conversion::toString(id) + ";"));
1592 if (result->hasNext()) {
1593 result->next();
1594 RowID implID = result->data(0).integerValue();
1595 removeRFImplementation(implID);
1596 }
1597 delete result;
1598 } catch (const Exception& e) {
1600 assert(false);
1601 }
1602
1603 // remove the entry
1604 try {
1606 std::string(
1607 "DELETE FROM rf WHERE id=" + Conversion::toString(id)
1608 + ";"));
1609 } catch (const Exception& e) {
1611 assert(false);
1612 }
1613}
virtual void removeRFImplementation(RowID implID) const

References assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), hasRFEntry(), DataObject::integerValue(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), removeRFImplementation(), Conversion::toString(), and RelationalDBConnection::updateQuery().

Referenced by HDBEditorDeleteCmd::Do(), and HDB::CachedHDBManager::removeRFEntry().

Here is the call graph for this function:

◆ removeRFImplementation()

void HDB::HDBManager::removeRFImplementation ( RowID  implID) const
virtual

Removes the RF implementation that has the given ID.

Parameters
implIDID of the RF implementation.

Reimplemented in HDB::CachedHDBManager.

Definition at line 1794 of file HDBManager.cc.

1794 {
1795
1796 bool dependencyTableExists =
1797 dbConnection_->tableExistsInDB("rf_ext_port_parameter_dependency");
1798 bool parameterTableExists =
1799 dbConnection_->tableExistsInDB("rf_implementation_parameter");
1800 bool externalPortTableExists =
1801 dbConnection_->tableExistsInDB("rf_external_port");
1802
1803 try {
1805
1806 // remove from rf_ext_port_parameter_dependency table if it exists
1807 // (backward compatibility for old HDBs).
1808 if (dependencyTableExists) {
1809 assert(parameterTableExists && externalPortTableExists);
1811 std::string(
1812 "DELETE FROM rf_ext_port_parameter_dependency "
1813 "WHERE parameter in (SELECT ALL id "
1814 "FROM rf_implementation_parameter WHERE rf_impl = " +
1815 Conversion::toString(implID) + ");"));
1816 }
1817
1818 // remove from rf_external_port table if it exists
1819 // (backward compatibility for old HDBs).
1820 if (externalPortTableExists) {
1822 std::string(
1823 "DELETE FROM rf_external_port "
1824 "WHERE rf_impl=" +
1825 Conversion::toString(implID) + ";"));
1826 }
1827
1828 // remove from rf_implementation_parameter table if it exists
1829 // (backward compatibility for old HDBs).
1830 if (parameterTableExists) {
1832 std::string(
1833 "DELETE FROM rf_implementation_parameter "
1834 "WHERE rf_impl=" + Conversion::toString(implID) + ";"));
1835 }
1836
1837 // remove from rf_source_file table
1839 std::string(
1840 "DELETE FROM rf_source_file WHERE rf_impl=" +
1841 Conversion::toString(implID) + ";"));
1842
1843 // remove from block_source_file table
1845 std::string(
1846 "DELETE FROM block_source_file WHERE id NOT IN "
1847 "(SELECT file FROM fu_source_file UNION "
1848 "SELECT file FROM rf_source_file);"));
1849
1850 // remove from rf_data_port
1852 std::string(
1853 "DELETE FROM rf_data_port WHERE rf_impl=" +
1854 Conversion::toString(implID) + ";"));
1855
1856 // remove from rf_implementation
1858 std::string(
1859 "DELETE FROM rf_implementation WHERE id=" +
1860 Conversion::toString(implID) + ";"));
1861
1863
1864 } catch (const Exception& e) {
1867 assert(false);
1868 }
1869}

References assert, RelationalDBConnection::beginTransaction(), RelationalDBConnection::commit(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBConnection::rollback(), RelationalDBConnection::tableExistsInDB(), Conversion::toString(), and RelationalDBConnection::updateQuery().

Referenced by HDBEditorModifyCmd::Do(), removeRFEntry(), and HDB::CachedHDBManager::removeRFImplementation().

Here is the call graph for this function:

◆ removeSocketEntry()

void HDB::HDBManager::removeSocketEntry ( RowID  id) const
virtual

Removes the Socket entry that has the given ID from the database.

The entry is removed entirely, meaning that also cost estimation data of that entry are removed.

Parameters
idThe ID of the Socket entry.

Reimplemented in HDB::CachedHDBManager.

Definition at line 3617 of file HDBManager.cc.

3617 {
3618
3619 if (!hasSocketEntry(id)) {
3620 return;
3621 }
3622
3623 // remove cost estimation data
3624 try {
3625 // get the IDs of cost estimation datas
3627 std::string(
3628 "SELECT id FROM cost_estimation_data "
3629 "WHERE socket_reference=" + Conversion::toString(id) + ";"));
3630 while (result->hasNext()) {
3631 result->next();
3632 const DataObject& costIDData = result->data(0);
3633 int dataID = costIDData.integerValue();
3635 }
3636 delete result;
3637 } catch (const Exception& e) {
3639 assert(false);
3640 }
3641
3642 // remove from socket table
3643 try {
3645 std::string(
3646 "DELETE FROM socket "
3647 "WHERE id=" + Conversion::toString(id) + ";"));
3648 } catch (const Exception& e) {
3650 assert(false);
3651 }
3652}

References assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), hasSocketEntry(), DataObject::integerValue(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), removeCostEstimationData(), Conversion::toString(), and RelationalDBConnection::updateQuery().

Referenced by HDBEditorDeleteCmd::Do(), and HDB::CachedHDBManager::removeSocketEntry().

Here is the call graph for this function:

◆ resolveArchitecturePort()

std::string HDB::HDBManager::resolveArchitecturePort ( const FUArchitecture architecture,
RowID  entryID,
const std::string &  implementedPort 
) const
private

Resolves what is the architectural port corresponding to the given implemented port.

Parameters
architectureThe architecture of the FU.
idID of the FU entry in the database.
implementedPortName of the implemented port to resolve.
Returns
Name of the corresponding port in the FU architecture.

Definition at line 4908 of file HDBManager.cc.

4911 {
4912
4913 RelationalDBQueryResult* bindingData = NULL;
4914 try {
4915 bindingData = dbConnection_->query(
4916 fuPortBindingByNameQuery(entryID, implementedPort));
4917 } catch (const Exception&) {
4918 assert(false);
4919 }
4920
4921 int operationColumn = bindingData->column("operation.name");
4922 int ioColumn = bindingData->column("io_binding.io_number");
4925
4926 FunctionUnit& fu = architecture.architecture();
4927 string portName = "";
4928
4929 while (bindingData->hasNext()) {
4930 bindingData->next();
4931 const DataObject& operationData = bindingData->data(operationColumn);
4932 const DataObject& ioData = bindingData->data(ioColumn);
4933 string operationName = operationData.stringValue();
4934 int io = ioData.integerValue();
4935 assert(fu.hasOperation(operationName));
4936 HWOperation* operation = fu.operation(operationName);
4937 FUPort* port = operation->port(io);
4938 assert(portName == "" || portName == port->name());
4939 portName = port->name();
4940 }
4941
4942 delete bindingData;
4943 bindingData = NULL;
4944
4945 return portName;
4946}
static std::string fuPortBindingByNameQuery(RowID fuID, const std::string &portName)

References HDB::FUArchitecture::architecture(), assert, RelationalDBQueryResult::column(), RelationalDBQueryResult::data(), dbConnection_, fuPortBindingByNameQuery(), RelationalDBQueryResult::hasNext(), TTAMachine::FunctionUnit::hasOperation(), DataObject::integerValue(), TTAMachine::Port::name(), RelationalDBQueryResult::next(), TTAMachine::FunctionUnit::operation(), TTAMachine::HWOperation::port(), RelationalDBConnection::query(), DataObject::stringValue(), and RelationalDBQueryResult::UNKNOWN_INDEX.

Referenced by addDataPortsToImplementation().

Here is the call graph for this function:

◆ resourceUsageDataByIDQuery()

std::string HDB::HDBManager::resourceUsageDataByIDQuery ( RowID  id)
staticprivate

Creates an SQL query for getting resource usage data of pipelines of the FU architecture that has the given ID.

The result table has fields {operation.name, pipeline_resource_usage.cycle, pipeline_resource.id}

Parameters
idID of the FU architecture in HDB.

Definition at line 5919 of file HDBManager.cc.

5919 {
5920 string idString = Conversion::toString(id);
5921 string query =
5922 "SELECT operation.name AS 'operation.name',"
5923 " pipeline_resource_usage.cycle AS "
5924 " 'pipeline_resource_usage.cycle',"
5925 " pipeline_resource.id AS 'pipeline_resource.id' "
5926 "FROM pipeline_resource_usage, pipeline_resource, operation,"
5927 " operation_pipeline "
5928 "WHERE operation_pipeline.fu_arch=" + idString + " AND"
5929 " pipeline_resource_usage.pipeline=operation_pipeline.id AND"
5930 " pipeline_resource.id = pipeline_resource_usage.resource AND"
5931 " operation.id=operation_pipeline.operation;";
5932 return query;
5933}

References Conversion::toString().

Referenced by addOperationPipelinesToFUArchitecture().

Here is the call graph for this function:

◆ rfArchitectureByID()

RFArchitecture * HDB::HDBManager::rfArchitectureByID ( RowID  id) const
virtual

Creates an RFArchitecture instance of the RF architecture that has the given ID.

Parameters
idThe ID of the RF architecture.
Returns
The newly created RFArchitecture instance.
Exceptions
KeyNotFoundIf the HDB does not contain RF architecture with the given ID.

Reimplemented in HDB::CachedHDBManager.

Definition at line 2949 of file HDBManager.cc.

2949 {
2950 if (!containsRFArchitecture(id)) {
2951 throw KeyNotFound(__FILE__, __LINE__, __func__);
2952 }
2953
2954 RelationalDBQueryResult* architectureData;
2955 try {
2956 architectureData = dbConnection_->query(rfArchitectureByIDQuery(id));
2957 } catch (const Exception& e) {
2959 assert(false);
2960 }
2961
2962 int sizeColumn = architectureData->column("size");
2963 int widthColumn = architectureData->column("width");
2964 int readPortsColumn = architectureData->column("read_ports");
2965 int writePortsColumn = architectureData->column("write_ports");
2966 int bidirPortsColumn = architectureData->column("bidir_ports");
2967 int latencyColumn = architectureData->column("latency");
2968 int maxReadsColumn = architectureData->column("max_reads");
2969 int maxWritesColumn = architectureData->column("max_writes");
2970 int guardSupportColumn = architectureData->column("guard_support");
2971 int guardLatencyColumn = architectureData->column("guard_latency");
2972 int zeroRegisterColumn = architectureData->column("zero_register");
2973
2974 assert(architectureData->hasNext());
2975 architectureData->next();
2976 assert(!architectureData->hasNext());
2977 const DataObject& sizeData = architectureData->data(sizeColumn);
2978 const DataObject& widthData = architectureData->data(widthColumn);
2979 const DataObject& readPortsData = architectureData->data(
2980 readPortsColumn);
2981 const DataObject& writePortsData = architectureData->data(
2982 writePortsColumn);
2983 const DataObject& bidirPortsData = architectureData->data(
2984 bidirPortsColumn);
2985 const DataObject& latencyData = architectureData->data(
2986 latencyColumn);
2987 const DataObject& maxReadsData = architectureData->data(
2988 maxReadsColumn);
2989 const DataObject& maxWritesData = architectureData->data(
2990 maxWritesColumn);
2991 const DataObject& guardSupportData = architectureData->data(
2992 guardSupportColumn);
2993 const DataObject& guardLatencyData = architectureData->data(
2994 guardLatencyColumn);
2995 const DataObject& zeroRegisterData = architectureData->data(
2996 zeroRegisterColumn);
2997 RFArchitecture* architecture = new RFArchitecture(
2998 readPortsData.integerValue(), writePortsData.integerValue(),
2999 bidirPortsData.integerValue(), maxReadsData.integerValue(),
3000 maxWritesData.integerValue(), latencyData.integerValue(),
3001 guardSupportData.boolValue(), guardLatencyData.integerValue(),
3002 zeroRegisterData.boolValue());
3003 std::cout.flush();
3004 architecture->setID(id);
3005 if (!sizeData.isNull()) {
3006 architecture->setSize(sizeData.integerValue());
3007 }
3008 if (!widthData.isNull()) {
3009 architecture->setWidth(widthData.integerValue());
3010 }
3011 delete architectureData;
3012 return architecture;
3013}
bool containsRFArchitecture(RowID id) const
static std::string rfArchitectureByIDQuery(RowID id)

References __func__, assert, DataObject::boolValue(), RelationalDBQueryResult::column(), containsRFArchitecture(), RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), DataObject::integerValue(), DataObject::isNull(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), rfArchitectureByIDQuery(), HWBlockArchitecture::setID(), HDB::RFArchitecture::setSize(), and HDB::RFArchitecture::setWidth().

Referenced by AddRFFromHDBDialog::loadHDB(), AddIUFromHDBDialog::loadHDB(), HDB::CachedHDBManager::rfArchitectureByID(), HDB::CachedHDBManager::rfArchitectureByIDConst(), HDBToHtml::rfArchToHtml(), and rfByEntryID().

Here is the call graph for this function:

◆ rfArchitectureByIDQuery()

std::string HDB::HDBManager::rfArchitectureByIDQuery ( RowID  id)
staticprivate

Creates an SQL query for getting the architecture data of the RF architecture that has the given ID.

The result table has all the fields of rf_architecture table.

Parameters
idID of the RF architecture.
Returns
The SQL query.

Definition at line 6184 of file HDBManager.cc.

6184 {
6185 string idString = Conversion::toString(id);
6186 string query =
6187 "SELECT * "
6188 "FROM rf_architecture "
6189 "WHERE id=" + idString + ";";
6190 return query;
6191}

References Conversion::toString().

Referenced by rfArchitectureByID().

Here is the call graph for this function:

◆ rfArchitectureID()

RowID HDB::HDBManager::rfArchitectureID ( RowID  rfEntryID) const
private

Returns the ID of the architecture of the given RF entry.

Parameters
rfEntryIDID of the RF entry.
Returns
ID of the RF architecture.
Exceptions
NotAvailableIf the RF entry does not have an architecture.

Definition at line 4291 of file HDBManager.cc.

4291 {
4293 try {
4294 result = dbConnection_->query(
4295 std::string(
4296 "SELECT architecture FROM rf WHERE id=" +
4297 Conversion::toString(rfEntryID) + ";"));
4298 } catch (const Exception& e) {
4300 assert(false);
4301 }
4302
4303 if (!result->hasNext()) {
4304 delete result;
4305 throw NotAvailable(__FILE__, __LINE__, __func__);
4306 }
4307
4308 result->next();
4309 const DataObject& idData = result->data(0);
4310 if (idData.isNull()) {
4311 delete result;
4312 throw NotAvailable(__FILE__, __LINE__, __func__);
4313 } else {
4314 RowID retValue = idData.integerValue();
4315 delete result;
4316 return retValue;
4317 }
4318}

References __func__, assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), DataObject::integerValue(), DataObject::isNull(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), and Conversion::toString().

Here is the call graph for this function:

◆ rfArchitectureIDs()

std::set< RowID > HDB::HDBManager::rfArchitectureIDs ( ) const

Returns a set of RF architecture IDs in the database.

Returns
A set containing all the RF architecture IDs in the database.

Definition at line 2720 of file HDBManager.cc.

2720 {
2721
2722 RelationalDBQueryResult* result = NULL;
2723 try {
2724 result = dbConnection_->query(
2725 std::string("SELECT id FROM rf_architecture;"));
2726 } catch (const Exception& e) {
2728 assert(false);
2729 }
2730
2731 std::set<RowID> idSet;
2732 while (result->hasNext()) {
2733 result->next();
2734 const DataObject& idData = result->data(0);
2735 idSet.insert(idData.integerValue());
2736 }
2737
2738 delete result;
2739 return idSet;
2740}

References assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), DataObject::integerValue(), RelationalDBQueryResult::next(), and RelationalDBConnection::query().

Referenced by SetRFArchitectureCmd::Do(), AddRFFromHDBDialog::loadHDB(), AddIUFromHDBDialog::loadHDB(), and HDBBrowserWindow::update().

Here is the call graph for this function:

◆ rfByEntryID()

RFEntry * HDB::HDBManager::rfByEntryID ( RowID  id) const

Returns the RF entry that has the given ID.

Parameters
idThe ID of the RF entry.
Returns
The RF entry.
Exceptions
KeyNotFoundIf the HDB does not contain an RF entry with the given ID.

Definition at line 2871 of file HDBManager.cc.

2871 {
2872 std::string query = "SELECT architecture FROM rf WHERE id=";
2873 query += Conversion::toString(id) + ";";
2874
2875 RelationalDBQueryResult* result = NULL;
2876 try {
2877 result = dbConnection_->query(query);
2878 } catch (const Exception& e) {
2879 debugLog(e.errorMessage());
2880 assert(false);
2881 }
2882
2883 bool hasArch = false;
2884 RowID archID = -1;
2885 if (result->hasNext()) {
2886 result->next();
2887 DataObject data = result->data(0);
2888 if (!data.isNull()) {
2889 hasArch = true;
2890 archID = data.integerValue();
2891 }
2892 delete result;
2893 result = NULL;
2894 } else {
2895 delete result;
2896 throw KeyNotFound(__FILE__, __LINE__, __func__);
2897 }
2898
2899 RFEntry* entry = new RFEntry();
2900 entry->setID(id);
2901 if (hasArch) {
2902 RFArchitecture* architecture = rfArchitectureByID(archID);
2903 entry->setArchitecture(architecture);
2904 }
2905
2906 RFImplementation* implementation = createImplementationOfRF(id);
2907 CostFunctionPlugin* costFunction = createCostFunctionOfRF(id);
2908 entry->setImplementation(implementation);
2909 entry->setCostFunction(costFunction);
2910 entry->setHDBFile(hdbFile_);
2911 delete result;
2912
2913 return entry;
2914}
virtual RFArchitecture * rfArchitectureByID(RowID id) const
CostFunctionPlugin * createCostFunctionOfRF(RowID id) const
virtual RFImplementation * createImplementationOfRF(RowID id) const

References __func__, assert, createCostFunctionOfRF(), createImplementationOfRF(), RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), hdbFile_, implementation, DataObject::integerValue(), DataObject::isNull(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), rfArchitectureByID(), HDB::RFEntry::setArchitecture(), HDB::HDBEntry::setCostFunction(), HDB::HDBEntry::setHDBFile(), HDB::HDBEntry::setID(), HDB::RFEntry::setImplementation(), and Conversion::toString().

Referenced by ProGe::NetlistGenerator::addBaseRFToNetlist(), addRFImplementation(), CostDatabase::buildRegisterFiles(), ProGeTools::checkForSelectableIU(), Automagic::checkForSelectableIU(), ProGeTools::checkForSelectableRF(), Automagic::checkForSelectableRF(), ProGe::ProcessorGenerator::checkIULatencies(), ProGe::BlockSourceCopier::copyBaseRFFiles(), AddRFImplementationCmd::Do(), HDBEditorModifyCmd::Do(), ProGeScriptGenerator::getBlockOrder(), AddRFImplementationCmd::isEnabled(), BlockImplementationDialog::onHDBSelection(), CostEstimator::Estimator::rfCostFunctionPluginOfImplementation(), ImplementationTester::rfEntryFromHdb(), HDBToHtml::rfEntryToHtml(), HDBToHtml::rfImplToHtml(), setArchitectureForRF(), and HDBBrowserWindow::update().

Here is the call graph for this function:

◆ rfCostEstimationData()

DataObject HDB::HDBManager::rfCostEstimationData ( const std::string &  valueName,
RowID  implementationId,
const std::string &  pluginName 
) const

Returns RF cost estimation data.

This version assumes that there's only one entry with given parameters.

Todo:
Another version for fetching lists of data.
Parameters
valueNameName of the value to fetch.
implementationIdThe ID of the RF entry.
pluginNameName of the cost estimation plugin that owns the data.
Returns
The data.
Exceptions
KeyNotFoundIf the HDB does not contain RF cost estimation data with the given arguments.

Definition at line 3331 of file HDBManager.cc.

3333 {
3334 // make the SQL query to obtain implementation data
3335 RelationalDBQueryResult* queryResult = NULL;
3336 try {
3337 queryResult = dbConnection_->query(
3338 std::string(
3339 "SELECT value "
3340 "FROM cost_estimation_data, cost_function_plugin "
3341 "WHERE plugin_reference = cost_function_plugin.id AND "
3342 "cost_function_plugin.name LIKE('") +
3343 pluginName + "') " +
3344 " AND fu_reference IS NULL " +
3345 " AND bus_reference IS NULL " +
3346 " AND socket_reference IS NULL AND " +
3347 " rf_reference = " + Conversion::toString(implementationId) +
3348 " AND cost_estimation_data.name LIKE('" + valueName + "');");
3349 } catch (const Exception& e) {
3350 // should not throw in any case
3352 assert(false);
3353 }
3354
3355 if (queryResult->hasNext()) {
3356 queryResult->next();
3357
3358 DataObject value = queryResult->data("value");
3359
3360 delete queryResult;
3361 queryResult = NULL;
3362
3363 return value;
3364 } else {
3365 delete queryResult;
3366 throw KeyNotFound(__FILE__, __LINE__, __func__);
3367 }
3368 // silence compiler warning
3369 throw 1;
3370}

References __func__, assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), and Conversion::toString().

Referenced by StrictMatchRFEstimator::estimateArea(), StrictMatchRFEstimator::estimateEnergy(), StrictMatchRFEstimator::estimateMaximumComputationDelay(), StrictMatchRFEstimator::estimatePortReadDelay(), and StrictMatchRFEstimator::estimatePortWriteDelay().

Here is the call graph for this function:

◆ rfCostEstimationDataIDs()

std::set< RowID > HDB::HDBManager::rfCostEstimationDataIDs ( RowID  rfImplID) const

Returns a set of cost estimation data IDs which reference the give RF implementation.

Parameters
rfImplIDID of the RF implementation.
Returns
Set of cost estimation data IDs.

Definition at line 6418 of file HDBManager.cc.

6418 {
6419
6420 // make the SQL query to obtain IDs.
6421 RelationalDBQueryResult* queryResult = NULL;
6422 try {
6423 std::string theQuery =
6424 std::string(
6425 "SELECT id "
6426 "FROM cost_estimation_data "
6427 "WHERE rf_reference = ") +
6428 Conversion::toString(rfImplID);
6429
6430 queryResult = dbConnection_->query(theQuery);
6431
6432 } catch (const Exception& e) {
6433 // should not throw in any case
6435 assert(false);
6436 }
6437
6438 std::set<RowID> ids;
6439
6440 while (queryResult->hasNext()) {
6441 queryResult->next();
6442
6443 ids.insert(queryResult->data("id").integerValue());
6444 }
6445
6446 delete queryResult;
6447 queryResult = NULL;
6448 return ids;
6449}

References assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), DataObject::integerValue(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), and Conversion::toString().

Referenced by HDBToHtml::rfEntryToHtml(), and HDBToHtml::rfImplToHtml().

Here is the call graph for this function:

◆ rfEntriesByArchitecture()

std::set< RowID > HDB::HDBManager::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

Returns a set of RF entry IDs that have the described architecture.

In case that size or width is given as a parameter are also the RF entries with a parameterized width or size returned as are the entries with matched width and/or size.

Parameters
readPortsThe number of read ports.
writePortsThe number of write ports.
bidirPortsThe number of bidirectional ports.
maxReadThe (minimum) max reads value.
latencyThe exact latency.
guardSupportGuard support.
guardLatencyThe guard latency.
widthThe bit withd of the register file.
sizeThe number of registers in the register file.
zeroRegisterzero register of the register file
Returns
Set of RF entry IDs.

Definition at line 3119 of file HDBManager.cc.

3130 {
3131
3132 RelationalDBQueryResult* result = NULL;
3133 try {
3134 string query = "SELECT rf.id FROM rf,rf_architecture "
3135 "WHERE rf_architecture.read_ports=" +
3136 Conversion::toString(readPorts) +
3137 " AND rf_architecture.write_ports=" +
3138 Conversion::toString(writePorts) +
3139 " AND rf_architecture.bidir_ports=" +
3140 Conversion::toString(bidirPorts) +
3141 " AND rf_architecture.max_reads>=" +
3142 Conversion::toString(maxReads) +
3143 " AND rf_architecture.max_writes>=" +
3144 Conversion::toString(maxWrites) +
3145 " AND rf_architecture.latency=" +
3146 Conversion::toString(latency);
3147 if (guardSupport) {
3148 query += " AND rf_architecture.guard_support=" +
3149 Conversion::toString(guardSupport) +
3150 " AND rf_architecture.guard_latency=" +
3151 Conversion::toString(guardLatency);
3152 }
3153 if (size != 0) {
3154 query += " AND (rf_architecture.size=" +
3155 Conversion::toString(size) +
3156 " OR rf_architecture.size is NULL)";
3157 }
3158 if (width != 0) {
3159 query += " AND (rf_architecture.width=" +
3160 Conversion::toString(width) +
3161 " OR rf_architecture.width is NULL)";
3162 }
3163 query += " AND (rf_architecture.zero_register=" +
3164 Conversion::toString(zeroRegister);
3165 if (!zeroRegister) {
3166 query += " OR rf_architecture.zero_register is NULL";
3167 }
3168 query += ")";
3169 query += " AND rf.architecture=rf_architecture.id;";
3170 result = dbConnection_->query(query);
3171 } catch (const Exception& e) {
3173 ;
3174 }
3175
3176 std::set<RowID> entryIDs;
3177 while (result->hasNext()) {
3178 result->next();
3179 entryIDs.insert(result->data(0).integerValue());
3180 }
3181 delete result;
3182
3183 return entryIDs;
3184}

References RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), DataObject::integerValue(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), and Conversion::toString().

Referenced by ComponentImplementationSelector::iuImplementations(), BlockImplementationDialog::onHDBSelection(), and ComponentImplementationSelector::rfImplementations().

Here is the call graph for this function:

◆ rfEntryByIDQuery()

std::string HDB::HDBManager::rfEntryByIDQuery ( RowID  id)
staticprivate

Creates an SQL query for getting the RF entry that has the given ID.

The result set has fields {id, architecture, cost_function}.

Parameters
idID of the entry.
Returns
The SQL query.

Definition at line 5786 of file HDBManager.cc.

5786 {
5787 string idString = Conversion::toString(id);
5788 string query =
5789 "SELECT * "
5790 "FROM rf "
5791 "WHERE rf.id=" + idString + ";";
5792 return query;
5793}

References Conversion::toString().

Referenced by hasRFEntry().

Here is the call graph for this function:

◆ rfEntryHasArchitecture()

bool HDB::HDBManager::rfEntryHasArchitecture ( RowID  id) const
private

Tells whether the RF entry that has the given ID has an architecture.

Parameters
idID of the RF entry.
Returns
True if it has an architecture, otherwise false.
Exceptions
KeyNotFoundIf the HDB does not contain a RF entry with the given ID.

Definition at line 4115 of file HDBManager.cc.

4115 {
4117 try {
4118 result = dbConnection_->query(
4119 std::string(
4120 "SELECT architecture FROM rf WHERE id=" +
4121 Conversion::toString(id) + ";"));
4122 } catch (const Exception& e) {
4124 assert(false);
4125 }
4126
4127 if (result->hasNext()) {
4128 result->next();
4129 const DataObject& data = result->data(0);
4130 delete result;
4131 return !data.isNull();
4132 } else {
4133 delete result;
4134 throw KeyNotFound(__FILE__, __LINE__, __func__);
4135 }
4136}

References __func__, assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), DataObject::isNull(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), and Conversion::toString().

Here is the call graph for this function:

◆ rfEntryIDOfImplementation()

RowID HDB::HDBManager::rfEntryIDOfImplementation ( RowID  implID) const

Returns the ID of the RF entry that has the given implementation ID.

Parameters
implIDThe implementation ID.
Returns
The RF entry ID.
Exceptions
KeyNotFoundIf there is no implementation by the given ID.

Definition at line 2782 of file HDBManager.cc.

2782 {
2783 RelationalDBQueryResult* result = NULL;
2784 try {
2785 result = dbConnection_->query(
2786 std::string(
2787 "SELECT rf from rf_implementation WHERE id=" +
2788 Conversion::toString(implID) + ";"));
2789 } catch (const Exception& e) {
2791 assert(false);
2792 }
2793
2794 if (result->hasNext()) {
2795 result->next();
2796 RowID id = result->data(0).integerValue();
2797 delete result;
2798 return id;
2799 } else {
2800 delete result;
2801 throw KeyNotFound(__FILE__, __LINE__, __func__);
2802 }
2803}

References __func__, assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), DataObject::integerValue(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), and Conversion::toString().

Referenced by HDBEditorDeleteCmd::Do(), HDBEditorModifyCmd::Do(), HDB::CachedHDBManager::removeRFImplementation(), and HDBToHtml::rfImplToHtml().

Here is the call graph for this function:

◆ rfEntryIDs()

std::set< RowID > HDB::HDBManager::rfEntryIDs ( ) const

Returns a set of RF entry IDs in the database.

Returns
A set containing all the RF entry IDs in the database.

Definition at line 2053 of file HDBManager.cc.

2053 {
2054
2055 string query = "SELECT id AS 'rf.id' FROM rf;";
2056
2057 // make the SQL query to obtain all the IDs
2058 RelationalDBQueryResult* queryResult = NULL;
2059 try {
2060 queryResult = dbConnection_->query(query);
2061 } catch (const Exception& e) {
2062 // should not throw in any case
2064 assert(false);
2065 }
2066
2067 std::set<RowID> idSet;
2068 while (queryResult->hasNext()) {
2069 queryResult->next();
2070 const DataObject& idData = queryResult->data("rf.id");
2071 idSet.insert(idData.integerValue());
2072 }
2073
2074 delete queryResult;
2075 return idSet;
2076}

References assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), DataObject::integerValue(), RelationalDBQueryResult::next(), and RelationalDBConnection::query().

Referenced by CostDatabase::buildRegisterFiles(), ProGeTools::checkForSelectableIU(), Automagic::checkForSelectableIU(), ProGeTools::checkForSelectableRF(), Automagic::checkForSelectableRF(), CostEstimationDataDialog::onEntryTypeSelection(), ImplementationTester::rfEntryIDs(), and HDBBrowserWindow::update().

Here is the call graph for this function:

◆ rfExternalPortsByIDQuery()

std::string HDB::HDBManager::rfExternalPortsByIDQuery ( RowID  id)
staticprivate

Creates an SQL query for getting external port data of implementation of the RF that has the given ID.

The result table has fields {rf_external_port.name, rf_external_port.direction, rf_external_port.width_formula, rf_external_port.description}.

Parameters
idID of the RF entry in HDB.
Returns
The SQL query.

Definition at line 6058 of file HDBManager.cc.

6058 {
6059 string idString = Conversion::toString(id);
6060 string query =
6061 "SELECT rf_external_port.name AS 'rf_external_port.name',"
6062 " rf_external_port.direction AS 'rf_external_port.direction',"
6063 " rf_external_port.width_formula AS "
6064 " 'rf_external_port.width_formula',"
6065 " rf_external_port.description AS "
6066 " 'rf_external_port.description' "
6067 "FROM rf, rf_implementation, rf_external_port "
6068 "WHERE rf.id=" + idString + " AND"
6069 " rf_implementation.rf=rf.id AND"
6070 " rf_external_port.rf_impl=rf_implementation.id;";
6071 return query;
6072}

References Conversion::toString().

Referenced by addRFExternalPortsToImplementation().

Here is the call graph for this function:

◆ rfImplementationByIDQuery()

std::string HDB::HDBManager::rfImplementationByIDQuery ( RowID  id)
staticprivate

Creates an SQL query for getting the implementation of the RF entry that has the given ID.

The result table has fields {id, name, size_param, width_param, clk_port, rst_port, glock_port, guard_port}.

Parameters
idThe ID of the RF entry.
Returns
The SQL query.

Definition at line 6205 of file HDBManager.cc.

6205 {
6206 string idString = Conversion::toString(id);
6207 string query =
6208 "SELECT id,"
6209 " name,"
6210 " size_param,"
6211 " width_param,"
6212 " clk_port,"
6213 " rst_port,"
6214 " glock_port,"
6215 " guard_port "
6216 "FROM rf_implementation "
6217 "WHERE rf_implementation.rf=" + idString + ";";
6218 return query;
6219}

References Conversion::toString().

Referenced by createImplementationOfRF().

Here is the call graph for this function:

◆ rfImplementationByIDQuery2()

std::string HDB::HDBManager::rfImplementationByIDQuery2 ( RowID  id)
staticprivate

Same as rfImplementationByIDQuery() bus has additional field for separate address cycle.

The result table has fields {id, name, size_param, width_param, clk_port, rst_port, glock_port, guard_port, sac_param}.

Parameters
idThe ID of the RF entry.
Returns
The SQL query.

Definition at line 6232 of file HDBManager.cc.

6232 {
6233 string idString = Conversion::toString(id);
6234 string query =
6235 "SELECT id,"
6236 " name,"
6237 " size_param,"
6238 " width_param,"
6239 " clk_port,"
6240 " rst_port,"
6241 " glock_port,"
6242 " guard_port, "
6243 " sac_param "
6244 "FROM rf_implementation "
6245 "WHERE rf_implementation.rf=" + idString + ";";
6246 return query;
6247}

References Conversion::toString().

Referenced by createImplementationOfRF().

Here is the call graph for this function:

◆ rfImplementationDataPortsByIDQuery()

std::string HDB::HDBManager::rfImplementationDataPortsByIDQuery ( RowID  id)
staticprivate

Creates an SQL query for getting the data ports of the implementation of the RF entry that has the given ID.

The result table has fields {name, direction, load_port, opcode_port, opcode_port_width_formula}.

Parameters
idID of the RF entry.
Returns
The SQL query.

Definition at line 6260 of file HDBManager.cc.

6260 {
6261 string idString = Conversion::toString(id);
6262 string query =
6263 "SELECT rf_data_port.name AS 'name',"
6264 " rf_data_port.direction AS 'direction',"
6265 " rf_data_port.load_port AS 'load_port',"
6266 " rf_data_port.opcode_port AS 'opcode_port',"
6267 " rf_data_port.opcode_port_width_formula AS "
6268 " 'opcode_port_width_formula' "
6269 "FROM rf_data_port, rf_implementation "
6270 "WHERE rf_implementation.rf=" + idString + " AND"
6271 " rf_data_port.rf_impl=rf_implementation.id;";
6272 return query;
6273}

References Conversion::toString().

Referenced by addDataPortsToImplementation().

Here is the call graph for this function:

◆ rfImplementationParametersByIDQuery()

std::string HDB::HDBManager::rfImplementationParametersByIDQuery ( RowID  id)
staticprivate

Creates an SQL query for getting the parameters of the implementation of the RF that has the given ID.

The result table has fields {name, type, value}.

Parameters
idID of the RF entry.
Returns
The SQL query.

Definition at line 6108 of file HDBManager.cc.

6108 {
6109 string idString = Conversion::toString(id);
6110 string query =
6111 "SELECT rf_implementation_parameter.name AS 'name',"
6112 " rf_implementation_parameter.type AS 'type',"
6113 " rf_implementation_parameter.value AS 'value' "
6114 "FROM rf_implementation, rf_implementation_parameter "
6115 "WHERE rf_implementation.rf=" + idString + " AND"
6116 " rf_implementation_parameter.rf_impl=rf_implementation.id;";
6117 return query;
6118}

References Conversion::toString().

Referenced by addRFParametersToImplementation().

Here is the call graph for this function:

◆ rfSourceFilesByIDQuery()

std::string HDB::HDBManager::rfSourceFilesByIDQuery ( RowID  id)
staticprivate

Creates an SQL query for getting the block implementation files of the RF entry that has the given ID.

The result table has fields {block_source_file.file, format.format}.

Parameters
idID of the RF entry.
Returns
The SQL query.

Definition at line 6286 of file HDBManager.cc.

6286 {
6287 string idString = Conversion::toString(id);
6288 string query =
6289 "SELECT block_source_file.file AS 'block_source_file.file',"
6290 " format.format AS 'format.format' "
6291 "FROM block_source_file, format, rf_implementation, rf_source_file "
6292 "WHERE rf_implementation.rf=" + idString + " AND"
6293 " rf_source_file.rf_impl=rf_implementation.id AND"
6294 " block_source_file.id=rf_source_file.file AND"
6295 " format.id=block_source_file.format;";
6296 return query;
6297}

References Conversion::toString().

Referenced by addBlockImplementationFiles().

Here is the call graph for this function:

◆ setArchitectureForFU()

void HDB::HDBManager::setArchitectureForFU ( RowID  fuID,
RowID  archID 
) const

Sets the given architecture for the given FU entry.

Parameters
fuIDID of the FU entry.
archIDID of the FU architecture.
Exceptions
InvalidDataIf the FU entry has an implementation already or if the HDB does not have FU or architecture by the given ID.

Definition at line 1387 of file HDBManager.cc.

1387 {
1388 if (!hasFUEntry(fuID) || !containsFUArchitecture(archID)) {
1389 throw InvalidData(__FILE__, __LINE__, __func__);
1390 }
1391
1392 FUEntry* entry = fuByEntryID(fuID);
1393 if (entry->hasImplementation()) {
1394 throw InvalidData(__FILE__, __LINE__, __func__);
1395 }
1396
1397 // set the architecture
1398 try {
1400 std::string(
1401 "UPDATE fu SET architecture=" +
1402 Conversion::toString(archID) + " WHERE id=" +
1403 Conversion::toString(fuID) + ";"));
1404 } catch (const Exception& e) {
1406 assert(false);
1407 }
1408}

References __func__, assert, containsFUArchitecture(), dbConnection_, debugLog, Exception::errorMessage(), fuByEntryID(), hasFUEntry(), HDB::FUEntry::hasImplementation(), Conversion::toString(), and RelationalDBConnection::updateQuery().

Referenced by AddFUImplementationCmd::Do(), and SetFUArchitectureCmd::Do().

Here is the call graph for this function:

◆ setArchitectureForRF()

void HDB::HDBManager::setArchitectureForRF ( RowID  rfID,
RowID  archID 
) const

Sets architecture for an RF entry.

Parameters
rfIDID of the RF entry.
archIDID of the RF architecture to set.
Exceptions
InvalidDataIf the database does not contain the given IDs or if the RF entry has an architecture already.

Definition at line 1881 of file HDBManager.cc.

1881 {
1882 if (!hasRFEntry(rfID)) {
1883 throw InvalidData(__FILE__, __LINE__, __func__);
1884 }
1885
1886 RFEntry* entry = rfByEntryID(rfID);
1887 if (entry->hasArchitecture()) {
1888 delete entry;
1889 throw InvalidData(__FILE__, __LINE__, __func__);
1890 }
1891 delete entry;
1892 entry = NULL;
1893
1894 if (!containsRFArchitecture(archID)) {
1895 throw InvalidData(__FILE__, __LINE__, __func__);
1896 }
1897
1898 try {
1900 std::string(
1901 "UPDATE rf SET architecture=" +
1902 Conversion::toString(archID) + " WHERE id=" +
1903 Conversion::toString(rfID) + ";"));
1904 } catch (const Exception& e) {
1906 assert(false);
1907 }
1908}

References __func__, assert, containsRFArchitecture(), dbConnection_, debugLog, Exception::errorMessage(), HDB::RFEntry::hasArchitecture(), hasRFEntry(), rfByEntryID(), Conversion::toString(), and RelationalDBConnection::updateQuery().

Referenced by AddRFImplementationCmd::Do(), and SetRFArchitectureCmd::Do().

Here is the call graph for this function:

◆ setCostFunctionPluginForFU()

void HDB::HDBManager::setCostFunctionPluginForFU ( RowID  fuID,
RowID  pluginID 
) const

Sets the given cost function plugin for the given FU entry.

Parameters
fuIDID of the FU entry.
pluginIDID of the cost function plugin.

Definition at line 1936 of file HDBManager.cc.

1936 {
1937
1938 // set the cost function plugin for fu
1939 try {
1941 std::string(
1942 "UPDATE fu SET cost_function=" +
1943 Conversion::toString(pluginID) + " WHERE id=" +
1944 Conversion::toString(fuID) + ";"));
1945 } catch (const Exception& e) {
1947 assert(false);
1948 }
1949}

References assert, dbConnection_, debugLog, Exception::errorMessage(), Conversion::toString(), and RelationalDBConnection::updateQuery().

Referenced by SetCostFunctionPluginCmd::Do().

Here is the call graph for this function:

◆ setCostFunctionPluginForRF()

void HDB::HDBManager::setCostFunctionPluginForRF ( RowID  rfID,
RowID  pluginID 
) const

Sets the given cost function plugin for the given RF entry.

Parameters
rfIDID of the RF entry.
pluginIDID of the cost function plugin.

Definition at line 1979 of file HDBManager.cc.

1979 {
1980
1981 // set the cost function plugin for rf
1982 try {
1984 std::string(
1985 "UPDATE rf SET cost_function=" +
1986 Conversion::toString(pluginID) + " WHERE id=" +
1987 Conversion::toString(rfID) + ";"));
1988 } catch (const Exception& e) {
1990 assert(false);
1991 }
1992}

References assert, dbConnection_, debugLog, Exception::errorMessage(), Conversion::toString(), and RelationalDBConnection::updateQuery().

Referenced by SetCostFunctionPluginCmd::Do().

Here is the call graph for this function:

◆ socketCostEstimationData()

DataObject HDB::HDBManager::socketCostEstimationData ( const std::string &  valueName,
RowID  socketID,
const std::string &  pluginName 
) const

Returns socket cost estimation data.

This version assumes that there's only one entry with given parameters.

Parameters
valueNameName of the value to fetch.
socketIDThe ID of the socket entry.
pluginNameName of the cost estimation plugin that owns the data.
Returns
The data.
Exceptions
KeyNotFoundIf the HDB does not contain socket cost estimation data with the given arguments.

Definition at line 3704 of file HDBManager.cc.

3706 {
3707 // make the SQL query to obtain implementation data
3708 RelationalDBQueryResult* queryResult = NULL;
3709 try {
3710 std::string theQuery =
3711 std::string(
3712 "SELECT value "
3713 "FROM cost_estimation_data, cost_function_plugin "
3714 "WHERE plugin_reference = cost_function_plugin.id AND "
3715 "cost_function_plugin.name LIKE('") +
3716 pluginName + "') " +
3717 " AND rf_reference IS NULL " +
3718 " AND bus_reference IS NULL AND " +
3719 " socket_reference = " +
3720 Conversion::toString(socketID) +
3721 " AND cost_estimation_data.name LIKE('" + valueName + "');";
3722 queryResult = dbConnection_->query(theQuery);
3723
3724 } catch (const Exception& e) {
3725 // should not throw in any case
3727 assert(false);
3728 }
3729
3730 if (queryResult->hasNext()) {
3731 queryResult->next();
3732
3733 DataObject value = queryResult->data("value");
3734
3735 delete queryResult;
3736 queryResult = NULL;
3737
3738 return value;
3739 } else {
3740 delete queryResult;
3741 throw KeyNotFound(__FILE__, __LINE__, __func__);
3742 }
3743 // silence compiler warning
3744 throw 1;
3745}

References __func__, assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), and Conversion::toString().

Referenced by DefaultICDecoderEstimator::delayOfSocket().

Here is the call graph for this function:

◆ socketCostEstimationDataIDs()

std::set< RowID > HDB::HDBManager::socketCostEstimationDataIDs ( RowID  socketID) const

Returns a set of cost estimation data IDs which reference the given socket entry.

Parameters
socketIDID of the socket entry.
Returns
Set of cost estimation data IDs.

Definition at line 6459 of file HDBManager.cc.

6459 {
6460
6461 // make the SQL query to obtain IDs.
6462 RelationalDBQueryResult* queryResult = NULL;
6463 try {
6464 std::string theQuery =
6465 std::string(
6466 "SELECT id "
6467 "FROM cost_estimation_data "
6468 "WHERE socket_reference = ") +
6469 Conversion::toString(socketID);
6470
6471 queryResult = dbConnection_->query(theQuery);
6472
6473 } catch (const Exception& e) {
6474 // should not throw in any case
6476 assert(false);
6477 }
6478
6479 std::set<RowID> ids;
6480
6481 while (queryResult->hasNext()) {
6482 queryResult->next();
6483
6484 ids.insert(queryResult->data("id").integerValue());
6485 }
6486
6487 delete queryResult;
6488 queryResult = NULL;
6489 return ids;
6490}

References assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), DataObject::integerValue(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), and Conversion::toString().

Referenced by HDBToHtml::socketEntryToHtml().

Here is the call graph for this function:

◆ socketCostEstimationDataList()

HDBManager::DataObjectList * HDB::HDBManager::socketCostEstimationDataList ( const std::string &  valueName,
RowID  socketID,
const std::string &  pluginName 
) const

Returns socket cost estimation data.

Parameters
valueNameName of the value to fetch.
socketIDThe ID of the socket entry.
pluginNameName of the cost estimation plugin that owns the data.
Returns
The data. Becomes property of the caller.
Exceptions
KeyNotFoundIf the HDB does not contain socket cost estimation data with the given arguments.

Definition at line 3758 of file HDBManager.cc.

3760 {
3761 RelationalDBQueryResult* queryResult = NULL;
3762 try {
3763 queryResult = dbConnection_->query(
3764 std::string(
3765 "SELECT value "
3766 "FROM cost_estimation_data, cost_function_plugin "
3767 "WHERE plugin_reference = cost_function_plugin.id AND "
3768 "cost_function_plugin.name LIKE('") +
3769 pluginName + "') " +
3770 " AND rf_reference IS NULL " +
3771 " AND bus_reference IS NULL AND " +
3772 " socket_reference = " +
3773 Conversion::toString(socketID) +
3774 " AND cost_estimation_data.name LIKE('" + valueName + "');");
3775 } catch (const Exception& e) {
3776 // should not throw in any case
3778 assert(false);
3779 }
3780
3781 if (queryResult->hasNext()) {
3782
3783 DataObjectList* data = new DataObjectList;
3784
3785 while (queryResult->hasNext()) {
3786 queryResult->next();
3787 DataObject value = queryResult->data("value");
3788 data->push_back(value);
3789 }
3790
3791 delete queryResult;
3792 queryResult = NULL;
3793 return data;
3794 } else {
3795 delete queryResult;
3796 throw KeyNotFound(__FILE__, __LINE__, __func__);
3797 }
3798 // silence compiler warning
3799 throw 1;
3800}

References __func__, assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), RelationalDBQueryResult::next(), RelationalDBConnection::query(), and Conversion::toString().

Here is the call graph for this function:

◆ socketEntryByIDQuery()

std::string HDB::HDBManager::socketEntryByIDQuery ( RowID  id)
staticprivate

Creates an SQL query for getting the Socket entry that has the given ID.

The result set has fields {id}.

Parameters
idID of the entry.
Returns
The SQL query.

Definition at line 5824 of file HDBManager.cc.

5824 {
5825 string idString = Conversion::toString(id);
5826 string query =
5827 "SELECT * "
5828 "FROM socket "
5829 "WHERE socket.id=" + idString + ";";
5830 return query;
5831}

References Conversion::toString().

Referenced by hasSocketEntry().

Here is the call graph for this function:

◆ socketEntryIDs()

std::set< RowID > HDB::HDBManager::socketEntryIDs ( ) const

Returns a set of Socket entry IDs in the database.

Returns
A set containing all the Socket entry IDs in the database.

Definition at line 2117 of file HDBManager.cc.

2117 {
2118
2119 string query = "SELECT id AS 'socket.id' FROM socket;";
2120
2121 // make the SQL query to obtain all the IDs
2122 RelationalDBQueryResult* queryResult = NULL;
2123 try {
2124 queryResult = dbConnection_->query(query);
2125 } catch (const Exception& e) {
2126 // should not throw in any case
2128 assert(false);
2129 }
2130
2131 std::set<RowID> idSet;
2132 while (queryResult->hasNext()) {
2133 queryResult->next();
2134 const DataObject& idData = queryResult->data("socket.id");
2135 idSet.insert(idData.integerValue());
2136 }
2137
2138 delete queryResult;
2139 return idSet;
2140}

References assert, RelationalDBQueryResult::data(), dbConnection_, debugLog, Exception::errorMessage(), RelationalDBQueryResult::hasNext(), DataObject::integerValue(), RelationalDBQueryResult::next(), and RelationalDBConnection::query().

Referenced by CostDatabase::buildSockets(), CostEstimationDataDialog::onEntryTypeSelection(), and HDBBrowserWindow::update().

Here is the call graph for this function:

◆ unsetArchitectureForFU()

void HDB::HDBManager::unsetArchitectureForFU ( RowID  fuID) const

Unsets the architecture of the given FU entry.

Parameters
fuIDID of the FU entry.
Exceptions
InvalidDataIf the HDB does not contain the given FU entry or if the FU entry has an implementation.

Definition at line 1418 of file HDBManager.cc.

1418 {
1419 if (!hasFUEntry(fuID)) {
1420 throw InvalidData(__FILE__, __LINE__, __func__);
1421 }
1422
1423 FUEntry* entry = fuByEntryID(fuID);
1424 if (entry->hasImplementation()) {
1425 throw InvalidData(__FILE__, __LINE__, __func__);
1426 }
1427
1428 // unset the architecture
1429 try {
1431 std::string(
1432 "UPDATE fu SET architecture=NULL WHERE id=" +
1433 Conversion::toString(fuID)));
1434 } catch (const Exception& e) {
1436 assert(false);
1437 }
1438}

References __func__, assert, dbConnection_, debugLog, Exception::errorMessage(), fuByEntryID(), hasFUEntry(), HDB::FUEntry::hasImplementation(), Conversion::toString(), and RelationalDBConnection::updateQuery().

Referenced by SetFUArchitectureCmd::Do().

Here is the call graph for this function:

◆ unsetArchitectureForRF()

void HDB::HDBManager::unsetArchitectureForRF ( RowID  rfID) const

Unsets architecture of the given RF entry.

Parameters
rfIDID of the RF entry.

Definition at line 1916 of file HDBManager.cc.

1916 {
1917 try {
1919 std::string(
1920 "UPDATE rf SET architecture=NULL WHERE id=" +
1921 Conversion::toString(rfID)));
1922 } catch (const Exception& e) {
1924 assert(false);
1925 }
1926}

References assert, dbConnection_, debugLog, Exception::errorMessage(), Conversion::toString(), and RelationalDBConnection::updateQuery().

Referenced by SetRFArchitectureCmd::Do().

Here is the call graph for this function:

◆ unsetCostFunctionPluginForFU()

void HDB::HDBManager::unsetCostFunctionPluginForFU ( RowID  fuID) const

Unsets cost function plugin of the given FU entry.

Parameters
fuIDID of the FU entry.

Definition at line 1957 of file HDBManager.cc.

1957 {
1958
1959 // unset the cost function plugin
1960 try {
1962 std::string(
1963 "UPDATE fu SET cost_function=NULL WHERE id=" +
1964 Conversion::toString(fuID)));
1965 } catch (const Exception& e) {
1967 assert(false);
1968 }
1969}

References assert, dbConnection_, debugLog, Exception::errorMessage(), Conversion::toString(), and RelationalDBConnection::updateQuery().

Referenced by SetCostFunctionPluginCmd::Do().

Here is the call graph for this function:

◆ unsetCostFunctionPluginForRF()

void HDB::HDBManager::unsetCostFunctionPluginForRF ( RowID  rfID) const

Unsets cost function plugin of the given RF entry.

Parameters
rfIDID of the RF entry.

Definition at line 2000 of file HDBManager.cc.

2000 {
2001
2002 // unset the cost function plugin
2003 try {
2005 std::string(
2006 "UPDATE rf SET cost_function=NULL WHERE id=" +
2007 Conversion::toString(rfID)));
2008 } catch (const Exception& e) {
2010 assert(false);
2011 }
2012}

References assert, dbConnection_, debugLog, Exception::errorMessage(), Conversion::toString(), and RelationalDBConnection::updateQuery().

Referenced by SetCostFunctionPluginCmd::Do().

Here is the call graph for this function:

Friends And Related Symbol Documentation

◆ HDBManagerTest

friend class HDBManagerTest
friend

Definition at line 84 of file HDBManager.hh.

Member Data Documentation

◆ db_

SQLite* HDB::HDBManager::db_
private

Handle to the database.

Definition at line 400 of file HDBManager.hh.

Referenced by HDBManager(), and ~HDBManager().

◆ dbConnection_

RelationalDBConnection* HDB::HDBManager::dbConnection_
private

Handle to the database connection.

Definition at line 402 of file HDBManager.hh.

Referenced by addBlockImplementationFiles(), addBlockImplementationFiles(), addBlockImplementationFileToHDB(), addBooleanColumn(), addBusCostEstimationData(), addBusEntry(), addCostEstimationData(), addCostFunctionPlugin(), addDataPortsToImplementation(), addDataPortsToImplementation(), addFUArchitecture(), addFUCostEstimationData(), addFUEntry(), addFUExternalPortsToImplementation(), addFUImplementation(), addFUParametersToImplementation(), addOpcodesToImplementation(), addOperationImplementation(), addOperationImplementationResource(), addOperationPipelinesToFUArchitecture(), addPortsAndBindingsToFUArchitecture(), addRFArchitecture(), addRFCostEstimationData(), addRFEntry(), addRFExternalPortsToImplementation(), addRFImplementation(), addRFParametersToImplementation(), addSocketCostEstimationData(), addSocketEntry(), blockSourceFile(), busCostEstimationData(), busCostEstimationDataIDs(), busCostEstimationDataList(), busEntryIDs(), canRemoveFUArchitecture(), canRemoveRFArchitecture(), containsFUArchitecture(), containsImplementationFile(), containsOperation(), containsRFArchitecture(), costEstimationData(), costEstimationDataIDs(), costEstimationDataValue(), costEstimationDataValue(), costFunctionPluginByID(), costFunctionPluginDataIDs(), costFunctionPluginIDs(), createCostFunctionOfFU(), createCostFunctionOfRF(), createImplementationOfFU(), createImplementationOfRF(), fuArchitectureID(), fuArchitectureIDs(), fuArchitectureIDsByOperationSet(), fuByEntryID(), fuCostEstimationData(), fuCostEstimationDataIDs(), fuEntriesByArchitecture(), fuEntryHasArchitecture(), fuEntryIDOfImplementation(), fuEntryIDs(), getDBConnection(), hasBusEntry(), hasColumn(), hasCostEstimationDataByID(), hasCostFunctionPluginByID(), hasFUEntry(), hasRFEntry(), hasSocketEntry(), HDBManager(), modifyCostEstimationData(), modifyCostFunctionPlugin(), OperationImplementationByID(), OperationImplementationIDs(), OperationImplementationResourceByID(), OperationImplementationResourceIDs(), removeBusEntry(), removeCostEstimationData(), removeCostFunctionPlugin(), removeFUArchitecture(), removeFUEntry(), removeFUImplementation(), removeOperationImplementation(), removeOperationImplementationResource(), removeRFArchitecture(), removeRFEntry(), removeRFImplementation(), removeSocketEntry(), resolveArchitecturePort(), rfArchitectureByID(), rfArchitectureID(), rfArchitectureIDs(), rfByEntryID(), rfCostEstimationData(), rfCostEstimationDataIDs(), rfEntriesByArchitecture(), rfEntryHasArchitecture(), rfEntryIDOfImplementation(), rfEntryIDs(), setArchitectureForFU(), setArchitectureForRF(), setCostFunctionPluginForFU(), setCostFunctionPluginForRF(), socketCostEstimationData(), socketCostEstimationDataIDs(), socketCostEstimationDataList(), socketEntryIDs(), unsetArchitectureForFU(), unsetArchitectureForRF(), unsetCostFunctionPluginForFU(), unsetCostFunctionPluginForRF(), and ~HDBManager().

◆ hdbFile_

std::string HDB::HDBManager::hdbFile_
private

The HDB file to manager.

Definition at line 404 of file HDBManager.hh.

Referenced by fileName(), fuArchitectureIDsByOperationSet(), fuByEntryID(), and rfByEntryID().

◆ instance_

HDBManager * HDB::HDBManager::instance_ = NULL
staticprivate

Unique instance of the HDBManager.

Definition at line 406 of file HDBManager.hh.


The documentation for this class was generated from the following files: