OpenASIP 2.2
Loading...
Searching...
No Matches
HDBManager.hh
Go to the documentation of this file.
1/*
2 Copyright (c) 2002-2014 Tampere University.
3
4 This file is part of TTA-Based Codesign Environment (TCE).
5
6 Permission is hereby granted, free of charge, to any person obtaining a
7 copy of this software and associated documentation files (the "Software"),
8 to deal in the Software without restriction, including without limitation
9 the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 and/or sell copies of the Software, and to permit persons to whom the
11 Software is furnished to do so, subject to the following conditions:
12
13 The above copyright notice and this permission notice shall be included in
14 all copies or substantial portions of the Software.
15
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 DEALINGS IN THE SOFTWARE.
23 */
24/**
25 * @file HDBManager.hh
26 *
27 * Declaration of HDBManager class.
28 *
29 * @author Lasse Laasonen 2005 (lasse.laasonen-no.spam-tut.fi)
30 * @author Esa Määttä 2007 (esa.maatta-no.spam-tut.fi)
31 * @author Vinogradov Viacheslav(added Verilog generating) 2012
32 * @note rating: red
33 */
34
35#ifndef TTA_HDB_MANAGER_HH
36#define TTA_HDB_MANAGER_HH
37
38#include <string>
39#include <list>
40#include <set>
41#include <vector>
42
44#include "Exception.hh"
45#include "DataObject.hh"
46#include "DBTypes.hh"
47#include "HDBTypes.hh"
48#include "CostEstimationData.hh"
49#include "SQLiteConnection.hh"
51
52class SQLite;
54
55namespace TTAMachine {
56class FunctionUnit;
57class PipelineElement;
58}
59
60namespace HDB {
61
62class FUEntry;
63class RFEntry;
64class FUArchitecture;
65class RFArchitecture;
66class FUImplementation;
67class RFImplementation;
68class CostFunctionPlugin;
69class HDBRegistry;
70
71/**
72 * Class used to access hardware database (HDB).
73 *
74 * Provides methods to create new HDB and to search, add, and remove
75 * blocks from/to HDB. There can exist only one HDBManager instance
76 * per database at the same time because HDBManager creates a
77 * connection to the database in its constructor and does not close
78 * the connection unless the HDBManager instance is deleted. And there
79 * cannot be several connections to the same database at the same
80 * time.
81 */
83public:
84 friend class HDBManagerTest;
85
86 typedef std::list<DataObject> DataObjectList;
87 virtual ~HDBManager();
88 static void createNew(const std::string& file);
89
90 std::string fileName() const;
91
93 virtual void removeCostFunctionPlugin(RowID pluginID) const;
94
95 RowID addFUArchitecture(const FUArchitecture& architecture) const;
96 bool canRemoveFUArchitecture(RowID archID) const;
97 virtual void removeFUArchitecture(RowID archID) const;
98
99 RowID addFUEntry() const;
100 virtual void removeFUEntry(RowID id) const;
101
102 RowID addFUImplementation(const FUEntry& entry) const;
103
104 virtual void removeFUImplementation(RowID implementationID) const;
105
106 void setArchitectureForFU(RowID fuID, RowID archID) const;
107 void unsetArchitectureForFU(RowID fuID) const;
108
109 RowID addRFArchitecture(const RFArchitecture& architecture) const;
110 bool canRemoveRFArchitecture(RowID archID) const;
111 virtual void removeRFArchitecture(RowID archID) const;
112
113 RowID addRFEntry() const;
114 virtual void removeRFEntry(RowID id) const;
115
117 const RFImplementation& implementation, RowID rfEntryID);
118
119 virtual void removeRFImplementation(RowID implID) const;
120
121 void setArchitectureForRF(RowID rfID, RowID archID) const;
122
123 void unsetArchitectureForRF(RowID rfID) const;
124
125 void setCostFunctionPluginForFU(RowID fuID, RowID pluginID) const;
126 void unsetCostFunctionPluginForFU(RowID fuID) const;
127 void setCostFunctionPluginForRF(RowID rfID, RowID pluginID) const;
128 void unsetCostFunctionPluginForRF(RowID rfID) const;
129
130 std::set<RowID> fuEntryIDs() const;
131 std::set<RowID> rfEntryIDs() const;
132 std::set<RowID> busEntryIDs() const;
133 std::set<RowID> socketEntryIDs() const;
134 std::set<RowID> OperationImplementationIDs() const;
135 std::set<RowID> OperationImplementationResourceIDs() const;
136
139 RowID id) const;
140
142 const OperationImplementationResource& resource);
144 const OperationImplementation& operation);
145
148
149 std::set<RowID> fuArchitectureIDs() const;
150 std::set<RowID> fuArchitectureIDsByOperationSet(
151 const std::set<std::string>& operationNames) const;
152 std::set<RowID> rfArchitectureIDs() const;
153
155
157
158 FUEntry* fuByEntryID(RowID id) const;
159
160 RFEntry* rfByEntryID(RowID id) const;
161
162 virtual FUArchitecture* fuArchitectureByID(RowID id) const;
163
164 virtual RFArchitecture* rfArchitectureByID(RowID id) const;
165
166 std::set<RowID> fuEntriesByArchitecture(
167 const TTAMachine::FunctionUnit& fu) const;
168
169 std::set<RowID> rfEntriesByArchitecture(
170 int readPorts,
171 int writePorts,
172 int bidirPorts,
173 int maxReads,
174 int maxWrites,
175 int latency,
176 bool guardSupport,
177 int guardLatency = 0,
178 int width = 0,
179 int size = 0,
180 bool zeroRegister = false) const;
181
183 const std::string& valueName, const std::string& pluginName) const;
184
186
188 RowID fuID,
189 const std::string& valueName,
190 const std::string& value,
191 RowID pluginID) const;
192
194 RowID rfID,
195 const std::string& valueName,
196 const std::string& value,
197 RowID pluginID) const;
198
200 const std::string& valueName, RowID implementationId,
201 const std::string& pluginName) const;
202
204 const std::string& valueName, RowID implementationId,
205 const std::string& pluginName) const;
206
207 RowID addBusEntry() const;
208 virtual void removeBusEntry(RowID id) const;
209
211 RowID busID,
212 const std::string& valueName,
213 const std::string& value,
214 RowID pluginID) const;
215
217 const std::string& valueName, RowID busID,
218 const std::string& pluginName) const;
219
221 const std::string& valueName, RowID implementationId,
222 const std::string& pluginName) const;
223
224 RowID addSocketEntry() const;
225 virtual void removeSocketEntry(RowID id) const;
226
228 RowID socketID,
229 const std::string& valueName,
230 const std::string& value,
231 RowID pluginID) const;
232
234 const std::string& valueName, RowID socketID,
235 const std::string& pluginName) const;
236
238 const std::string& valueName, RowID implementationID,
239 const std::string& pluginName) const;
240
241 std::set<RowID> fuCostEstimationDataIDs(RowID fuImplID) const;
242
243 std::set<RowID> rfCostEstimationDataIDs(RowID rfImplID) const;
244 std::set<RowID> busCostEstimationDataIDs(RowID busID) const;
245 std::set<RowID> socketCostEstimationDataIDs(RowID socketID) const;
246
248
249 std::set<RowID> costFunctionPluginIDs() const;
250 std::set<RowID> costFunctionPluginDataIDs(RowID pluginID) const;
252
253 virtual std::set<RowID> costEstimationDataIDs(
254 const CostEstimationData& match,
255 bool useCompiledQueries = false,
256 RelationalDBQueryResult* compiledQuery = NULL) const;
257
259
260 virtual void removeCostEstimationData(RowID id) const;
261
262 virtual void modifyCostEstimationData(
263 RowID id, const CostEstimationData& data);
264
265 virtual void modifyCostFunctionPlugin(
266 RowID id, const CostFunctionPlugin& plugin);
267
268 virtual void deleteCostEstimationDataIDsQueries() const = 0;
269
270 std::list<std::string> blockSourceFile();
271
272 static std::string formatString(BlockImplementationFile::Format format);
273
274protected:
277 FUArchitecture& architecture,
278 RowID id) const;
280 const CostEstimationData& match,
281 std::string* query,
282 RelationalDBQueryResult* compiledQuery = NULL,
283 short int* queryHash = NULL,
284 bool createBindableQuery = false) const;
286
287 HDBManager(const std::string& hdbFile);
288
289private:
290 // Struct PipelineElementUsage
292 std::set<const TTAMachine::PipelineElement*> usage1;
293 std::set<const TTAMachine::PipelineElement*> usage2;
294 };
295
296 // typedef for PipelineElemtnUsageTable
297 typedef std::vector<PipelineElementUsage> PipelineElementUsageTable;
298
299 bool hasFUEntry(RowID id) const;
300 bool hasRFEntry(RowID id) const;
301 bool hasBusEntry(RowID id) const;
302 bool hasSocketEntry(RowID id) const;
303 bool hasCostEstimationDataByID(RowID id) const;
304 bool hasCostFunctionPluginByID(RowID id) const;
305 bool fuEntryHasArchitecture(RowID id) const;
306 bool rfEntryHasArchitecture(RowID id) const;
307 bool containsOperation(const std::string& opName) const;
308 bool containsImplementationFile(const std::string& pathToFile) const;
309 bool containsFUArchitecture(RowID id) const;
310 bool containsRFArchitecture(RowID id) const;
311 RowID fuArchitectureID(RowID fuEntryID) const;
312 RowID rfArchitectureID(RowID rfEntryID) const;
313 bool hasColumn(
314 const std::string& table, const std::string& columnName) const;
316 const std::string& table, const std::string& newcolumn);
317
320
322 FUArchitecture& architecture,
323 RowID id) const;
325 FUArchitecture& architecture,
326 RowID id) const;
327 std::string resolveArchitecturePort(
328 const FUArchitecture& architecture,
329 RowID entryID,
330 const std::string& implementedPort) const;
333 RowID entryID) const;
336 FUArchitecture& architecture,
337 RowID entryID) const;
340 RowID entryID) const;
343 RowID entryID) const;
346 RowID entryID) const;
349 RowID entryID) const;
352 RowID entryID) const;
355 RowID entryID) const;
358 RowID entryID) const;
360 const BlockImplementationFile& file) const;
362 const CostEstimationData& match,
363 std::string& query) const;
364
365 static bool isMatchingArchitecture(
366 const TTAMachine::FunctionUnit& fu, const FUArchitecture& arch);
367 static bool areCompatiblePipelines(
368 const PipelineElementUsageTable& table);
369 static void insertFileFormats(RelationalDBConnection& connection);
371 const std::string& formatString);
372
373 static std::string directionString(HDB::Direction direction);
374 static std::string fuEntryByIDQuery(RowID id);
375 static std::string rfEntryByIDQuery(RowID id);
376 static std::string busEntryByIDQuery(RowID id);
377 static std::string socketEntryByIDQuery(RowID id);
378 static std::string fuArchitectureByIDQuery(RowID id);
379 static std::string fuPortsAndBindingsByIDQuery(RowID id);
380 static std::string ioUsageDataByIDQuery(RowID id);
381 static std::string resourceUsageDataByIDQuery(RowID id);
382 static std::string fuImplementationByIDQuery(RowID id);
383 static std::string opcodesByIDQuery(RowID id);
384 static std::string fuImplementationDataPortsByIDQuery(RowID id);
385 static std::string fuExternalPortsByIDQuery(RowID id);
386 static std::string rfExternalPortsByIDQuery(RowID id);
387 static std::string fuPortBindingByNameQuery(
388 RowID fuID,
389 const std::string& portName);
390 static std::string fuImplementationParametersByIDQuery(RowID id);
391 static std::string rfImplementationParametersByIDQuery(RowID id);
392 static std::string fuSourceFilesByIDQuery(RowID id);
393 static std::string rfArchitectureByIDQuery(RowID id);
394 static std::string rfImplementationByIDQuery(RowID id);
395 static std::string rfImplementationByIDQuery2(RowID id);
396 static std::string rfImplementationDataPortsByIDQuery(RowID id);
397 static std::string rfSourceFilesByIDQuery(RowID id);
398
399 /// Handle to the database.
401 /// Handle to the database connection.
403 /// The HDB file to manager.
404 std::string hdbFile_;
405 /// Unique instance of the HDBManager.
407};
408
409}
410
411#endif
int RowID
Type definition of row ID in relational databases.
Definition DBTypes.hh:37
IDF::MachineImplementation * implementation
the implementation definition of the estimated processor
static std::string rfImplementationDataPortsByIDQuery(RowID id)
std::set< RowID > socketCostEstimationDataIDs(RowID socketID) const
DataObjectList * busCostEstimationDataList(const std::string &valueName, RowID implementationId, const std::string &pluginName) const
std::set< RowID > fuEntriesByArchitecture(const TTAMachine::FunctionUnit &fu) const
static std::string busEntryByIDQuery(RowID id)
static std::string ioUsageDataByIDQuery(RowID id)
std::set< RowID > busCostEstimationDataIDs(RowID busID) const
bool containsRFArchitecture(RowID id) const
bool fuEntryHasArchitecture(RowID id) const
virtual ~HDBManager()
std::vector< PipelineElementUsage > PipelineElementUsageTable
static BlockImplementationFile::Format fileFormat(const std::string &formatString)
static std::string rfImplementationByIDQuery(RowID id)
static std::string fuExternalPortsByIDQuery(RowID id)
void createCostEstimatioDataIdsQuery(const CostEstimationData &match, std::string *query, RelationalDBQueryResult *compiledQuery=NULL, short int *queryHash=NULL, bool createBindableQuery=false) const
static void createNew(const std::string &file)
RowID addBusEntry() const
FUEntry * fuByEntryID(RowID id) const
int addBooleanColumn(const std::string &table, const std::string &newcolumn)
std::set< RowID > rfArchitectureIDs() const
bool hasBusEntry(RowID id) const
void addOpcodesToImplementation(FUImplementation &implementation, RowID entryID) const
virtual void modifyCostFunctionPlugin(RowID id, const CostFunctionPlugin &plugin)
std::set< RowID > fuArchitectureIDsByOperationSet(const std::set< std::string > &operationNames) const
RowID addRFArchitecture(const RFArchitecture &architecture) const
RowID addCostFunctionPlugin(const CostFunctionPlugin &plugin) const
static bool isMatchingArchitecture(const TTAMachine::FunctionUnit &fu, const FUArchitecture &arch)
void addOperationPipelinesToFUArchitecture(FUArchitecture &architecture, RowID id) const
virtual void removeFUEntry(RowID id) const
RowID addFUEntry() const
void removeOperationImplementation(RowID id)
RowID addRFEntry() const
void setArchitectureForRF(RowID rfID, RowID archID) const
RowID addBusCostEstimationData(RowID busID, const std::string &valueName, const std::string &value, RowID pluginID) const
RowID rfArchitectureID(RowID rfEntryID) const
CostFunctionPlugin * costFunctionPluginByID(RowID pluginID) const
RelationalDBConnection * dbConnection_
Handle to the database connection.
OperationImplementationResource OperationImplementationResourceByID(RowID id) const
static std::string formatString(BlockImplementationFile::Format format)
static std::string fuSourceFilesByIDQuery(RowID id)
static std::string fuImplementationDataPortsByIDQuery(RowID id)
std::list< std::string > blockSourceFile()
void addDataPortsToImplementation(FUImplementation &implementation, FUArchitecture &architecture, RowID entryID) const
void addOperationImplementationResource(const OperationImplementationResource &resource)
std::string fileName() const
std::set< RowID > OperationImplementationIDs() const
bool containsOperation(const std::string &opName) const
RowID addRFCostEstimationData(RowID rfID, const std::string &valueName, const std::string &value, RowID pluginID) const
RelationalDBConnection * getDBConnection() const
virtual void removeFUImplementation(RowID implementationID) const
static std::string fuImplementationParametersByIDQuery(RowID id)
std::set< RowID > costFunctionPluginDataIDs(RowID pluginID) const
RowID addSocketCostEstimationData(RowID socketID, const std::string &valueName, const std::string &value, RowID pluginID) const
static std::string fuArchitectureByIDQuery(RowID id)
virtual std::set< RowID > costEstimationDataIDs(const CostEstimationData &match, bool useCompiledQueries=false, RelationalDBQueryResult *compiledQuery=NULL) const
void setCostFunctionPluginForFU(RowID fuID, RowID pluginID) const
virtual void removeSocketEntry(RowID id) const
void addPortsAndBindingsToFUArchitecture(FUArchitecture &architecture, RowID id) const
void unsetCostFunctionPluginForFU(RowID fuID) const
void removeOperationImplementationResource(RowID id)
static std::string directionString(HDB::Direction direction)
RowID addSocketEntry() const
virtual void removeRFImplementation(RowID implID) const
virtual void modifyCostEstimationData(RowID id, const CostEstimationData &data)
virtual RFArchitecture * rfArchitectureByID(RowID id) const
void addFUExternalPortsToImplementation(FUImplementation &implementation, RowID entryID) const
RowID fuArchitectureID(RowID fuEntryID) const
OperationImplementation OperationImplementationByID(RowID id) const
bool canRemoveFUArchitecture(RowID archID) const
virtual DataObject costEstimationDataValue(const std::string &valueName, const std::string &pluginName) const
bool hasRFEntry(RowID id) const
bool rfEntryHasArchitecture(RowID id) const
bool containsImplementationFile(const std::string &pathToFile) const
void unsetArchitectureForRF(RowID rfID) const
bool hasColumn(const std::string &table, const std::string &columnName) const
static std::string socketEntryByIDQuery(RowID id)
std::set< RowID > fuArchitectureIDs() const
RowID addFUArchitecture(const FUArchitecture &architecture) const
CostEstimationData costEstimationData(RowID id) const
void addBlockImplementationFiles(FUImplementation &implementation, RowID entryID) const
RowID addFUImplementation(const FUEntry &entry) const
bool containsFUArchitecture(RowID id) const
static HDBManager * instance_
Unique instance of the HDBManager.
static std::string fuImplementationByIDQuery(RowID id)
virtual void removeCostEstimationData(RowID id) const
static std::string rfSourceFilesByIDQuery(RowID id)
virtual FUImplementation * createImplementationOfFU(FUArchitecture &architecture, RowID id) const
static void insertFileFormats(RelationalDBConnection &connection)
virtual void removeRFEntry(RowID id) const
static std::string fuEntryByIDQuery(RowID id)
void createCostEstimatioDataIdsQuery(const CostEstimationData &match, std::string &query) const
void setCostFunctionPluginForRF(RowID rfID, RowID pluginID) const
DataObjectList * socketCostEstimationDataList(const std::string &valueName, RowID implementationID, const std::string &pluginName) const
std::set< RowID > socketEntryIDs() const
bool hasSocketEntry(RowID id) const
void addOperationImplementation(const OperationImplementation &operation)
bool hasCostFunctionPluginByID(RowID id) const
CostFunctionPlugin * createCostFunctionOfFU(RowID id) const
SQLite * db_
Handle to the database.
static std::string rfImplementationByIDQuery2(RowID id)
RowID addFUCostEstimationData(RowID fuID, const std::string &valueName, const std::string &value, RowID pluginID) const
DataObject socketCostEstimationData(const std::string &valueName, RowID socketID, const std::string &pluginName) const
void unsetCostFunctionPluginForRF(RowID rfID) const
std::set< RowID > fuCostEstimationDataIDs(RowID fuImplID) const
RowID addRFImplementation(const RFImplementation &implementation, RowID rfEntryID)
std::string hdbFile_
The HDB file to manager.
std::set< RowID > rfCostEstimationDataIDs(RowID rfImplID) const
void addBlockImplementationFileToHDB(const BlockImplementationFile &file) const
RowID fuEntryIDOfImplementation(RowID implID) const
std::set< RowID > rfEntryIDs() const
static std::string opcodesByIDQuery(RowID id)
void setArchitectureForFU(RowID fuID, RowID archID) const
virtual void removeBusEntry(RowID id) const
virtual void removeRFArchitecture(RowID archID) const
static std::string rfExternalPortsByIDQuery(RowID id)
void addFUParametersToImplementation(FUImplementation &implementation, RowID entryID) const
std::set< RowID > rfEntriesByArchitecture(int readPorts, int writePorts, int bidirPorts, int maxReads, int maxWrites, int latency, bool guardSupport, int guardLatency=0, int width=0, int size=0, bool zeroRegister=false) const
static std::string resourceUsageDataByIDQuery(RowID id)
std::set< RowID > costFunctionPluginIDs() const
static std::string fuPortsAndBindingsByIDQuery(RowID id)
DataObject busCostEstimationData(const std::string &valueName, RowID busID, const std::string &pluginName) const
bool hasFUEntry(RowID id) const
static bool areCompatiblePipelines(const PipelineElementUsageTable &table)
std::set< RowID > busEntryIDs() const
static std::string rfEntryByIDQuery(RowID id)
void addRFExternalPortsToImplementation(RFImplementation &implementation, RowID entryID) const
RowID rfEntryIDOfImplementation(RowID implID) const
virtual FUArchitecture * fuArchitectureByID(RowID id) const
static std::string rfArchitectureByIDQuery(RowID id)
virtual void removeCostFunctionPlugin(RowID pluginID) const
RFEntry * rfByEntryID(RowID id) const
DataObject fuCostEstimationData(const std::string &valueName, RowID implementationId, const std::string &pluginName) const
static std::string rfImplementationParametersByIDQuery(RowID id)
void addRFParametersToImplementation(RFImplementation &implementation, RowID entryID) const
friend class HDBManagerTest
Definition HDBManager.hh:84
CostFunctionPlugin * createCostFunctionOfRF(RowID id) const
bool canRemoveRFArchitecture(RowID archID) const
virtual void removeFUArchitecture(RowID archID) const
std::set< RowID > fuEntryIDs() const
void unsetArchitectureForFU(RowID fuID) const
std::set< RowID > OperationImplementationResourceIDs() const
virtual void deleteCostEstimationDataIDsQueries() const =0
static std::string fuPortBindingByNameQuery(RowID fuID, const std::string &portName)
std::string resolveArchitecturePort(const FUArchitecture &architecture, RowID entryID, const std::string &implementedPort) const
bool hasCostEstimationDataByID(RowID id) const
RowID addCostEstimationData(const CostEstimationData &data) const
DataObject rfCostEstimationData(const std::string &valueName, RowID implementationId, const std::string &pluginName) const
virtual RFImplementation * createImplementationOfRF(RowID id) const
std::list< DataObject > DataObjectList
Definition HDBManager.hh:86
Direction
Direction of port.
Definition HDBTypes.hh:40
std::set< const TTAMachine::PipelineElement * > usage2
std::set< const TTAMachine::PipelineElement * > usage1