OpenASIP 2.2
Loading...
Searching...
No Matches
Functions
ProGeTools Namespace Reference

Functions

std::string findHDBPath (std::string name)
 
bool findInOptionList (const std::string &option, std::vector< std::string > list, bool enableAll=true)
 
std::vector< IDF::FUGenerated::DAGOperationgenerateableDAGOperations (const std::vector< IDF::FUGenerated::Info > infos, std::ostream &verbose)
 
std::vector< IDF::FUGenerated::InfocreateFUGeneratableOperationInfos (const ProGeOptions &options, std::ostream &verbose)
 
bool checkForGeneratableFU (const ProGeOptions &options, TTAMachine::FunctionUnit &fu, IDF::FUGenerated &fug, const std::vector< IDF::FUGenerated::Info > &infos, const std::vector< IDF::FUGenerated::DAGOperation > dagops)
 
bool checkForSelectableFU (const ProGeOptions &options, TTAMachine::FunctionUnit &fu, IDF::FUImplementationLocation &loc, std::ostream &verbose)
 
bool checkForSelectableRF (const ProGeOptions &options, TTAMachine::RegisterFile &rf, IDF::RFImplementationLocation &loc, std::ostream &verbose)
 
bool checkForSelectableIU (const ProGeOptions &options, TTAMachine::ImmediateUnit &iu, IDF::IUImplementationLocation &loc, std::ostream &verbose)
 
bool canGenerateFromDAG (const OperationDAG &dag, const std::vector< IDF::FUGenerated::Info > infos, std::vector< IDF::FUGenerated::Info > *subops)
 
int dagLatency (const OperationDAG &dag, const std::unordered_map< std::string, int > &maxOpLatency)
 
int maxLatencyToNode (const OperationDAG &dag, OperationDAGNode &node, const std::unordered_map< std::string, int > &maxOpLatency, bool allowDifference=true)
 
int nodeLatency (OperationDAGNode &node, const std::unordered_map< std::string, int > &maxOpLatency)
 
bool languageMatches (HDB::BlockImplementationFile::Format format, ProGe::HDL language)
 

Function Documentation

◆ canGenerateFromDAG()

bool ProGeTools::canGenerateFromDAG ( const OperationDAG dag,
const std::vector< IDF::FUGenerated::Info infos,
std::vector< IDF::FUGenerated::Info > *  subops 
)

Checks if DAG operation can be implemented, i.e. all basic operations can be implemented

Definition at line 194 of file ProGeTools.cc.

196 {
197 if (dag.isNull()) {
198 return false;
199 }
200
201 bool canImplement = true;
202 for (int n = 0; n < dag.nodeCount(); ++n) {
203 OperationNode* operationNode =
204 dynamic_cast<OperationNode*>(&dag.node(n));
205 if (operationNode) {
206 std::string operation =
207 operationNode->referencedOperation().name();
208 operation = StringTools::stringToLower(operation);
209
210 bool foundOperation = false;
211 for (auto&& info : infos) {
212 if (info.operationName == operation) {
213 foundOperation = true;
214 if (subops) {
215 subops->emplace_back(info);
216 }
217 break;
218 }
219 }
220 if (foundOperation == false) {
221 canImplement = false;
222 break;
223 }
224 }
225 }
226 return canImplement;
227}
int nodeCount() const
Node & node(const int index) const
bool isNull() const
Operation & referencedOperation() const
virtual TCEString name() const
Definition Operation.cc:93
static std::string stringToLower(const std::string &source)

References OperationDAG::isNull(), Operation::name(), BoostGraph< GraphNode, GraphEdge >::node(), BoostGraph< GraphNode, GraphEdge >::nodeCount(), OperationNode::referencedOperation(), and StringTools::stringToLower().

Referenced by generateableDAGOperations(), and FUGen::parseOperations().

Here is the call graph for this function:

◆ checkForGeneratableFU()

bool ProGeTools::checkForGeneratableFU ( const ProGeOptions options,
TTAMachine::FunctionUnit fu,
IDF::FUGenerated fug,
const std::vector< IDF::FUGenerated::Info > &  infos,
const std::vector< IDF::FUGenerated::DAGOperation dagops 
)

Check if given fu can be generated. If so return it in fug.

Definition at line 59 of file ProGeTools.cc.

62 {
63 std::vector<TTAMachine::HWOperation*> operations;
64 std::vector<std::string> genops;
65
66 for (int i = 0; i < fu.operationCount(); ++i) {
67 operations.emplace_back(fu.operation(i));
68 }
69
70 for (auto&& op : operations) {
71 int maxLatency;
73 fug.name(), options.fuFrontRegistered, false)) {
74 maxLatency = op->latency() - 1;
76 fug.name(), options.fuMiddleRegistered, false)) {
77 maxLatency = op->latency() - 2;
79 fug.name(), options.fuBackRegistered, false)) {
80 maxLatency = op->latency();
82 fug.name(), options.fuFrontRegistered)) {
83 maxLatency = op->latency() - 1;
85 fug.name(), options.fuMiddleRegistered)) {
86 maxLatency = op->latency() - 2;
87 } else { // Default to back-register
88 maxLatency = op->latency();
89 }
90 for (auto&& info : infos) {
91 if (op->name() == info.operationName &&
92 maxLatency >= info.latency) {
93 fug.addOperation(info);
94 genops.emplace_back(info.operationName);
95 break;
96 }
97 }
98 }
99
100 for (auto&& op : operations) {
101 for (auto&& dop : dagops) {
102 if (std::find(genops.begin(), genops.end(), op->name()) ==
103 genops.end() &&
104 op->name() == dop.operationName) {
105 fug.addOperation(dop);
106 genops.emplace_back(dop.operationName);
107 }
108 }
109 }
110
111 size_t neededFUops = fu.operationCount();
112
113 if (genops.size() == neededFUops) {
114 return true;
115 } else {
116 return false;
117 }
118}
static MachInfoCmdLineOptions options
Definition MachInfo.cc:46
void addOperation(const Info &op)
std::string name() const
virtual HWOperation * operation(const std::string &name) const
virtual int operationCount() const
bool findInOptionList(const std::string &option, std::vector< std::string > list, bool enableAll=true)

References IDF::FUGenerated::addOperation(), findInOptionList(), IDF::FUGenerated::name(), TTAMachine::FunctionUnit::operation(), TTAMachine::FunctionUnit::operationCount(), and options.

Referenced by ProGe::ProGeUI::generateIDF().

Here is the call graph for this function:

◆ checkForSelectableFU()

bool ProGeTools::checkForSelectableFU ( const ProGeOptions options,
TTAMachine::FunctionUnit fu,
IDF::FUImplementationLocation loc,
std::ostream &  verbose 
)

Checks if FU has an implementation in hdbs.

Definition at line 352 of file ProGeTools.cc.

354 {
355 (void)verbose;
356 for (auto&& hdb : options.hdbList) {
357 std::string hdbPath = findHDBPath(hdb);
358 HDB::CachedHDBManager& manager =
360 std::set<RowID> rows = manager.fuEntryIDs();
361 for (auto&& row : rows) {
362 auto fuEntry = manager.fuByEntryID(row);
363 if (!fuEntry->hasImplementation() ||
364 !fuEntry->hasArchitecture()) {
365 continue;
366 }
367 auto arch = fuEntry->architecture();
368 auto impl = fuEntry->implementation();
369 // Check that operations match.
370 if (fu.operationCount() != arch.architecture().operationCount()) {
371 continue;
372 }
373 bool wrongLanguage = false;
374 for (int i = 0; i < impl.implementationFileCount(); ++i) {
375 auto f = impl.file(i);
376 if (f.format() ==
378 options.language == ProGe::HDL::Verilog) {
379 wrongLanguage = true;
380 break;
381 } else if (
382 f.format() ==
384 options.language == ProGe::HDL::VHDL) {
385 wrongLanguage = true;
386 break;
387 }
388 }
389 if (wrongLanguage) {
390 continue;
391 }
392 bool found = true;
393 for (int i = 0; i < fu.operationCount(); ++i) {
394 auto op = fu.operation(i);
395 if (!arch.architecture().hasOperation(op->name())) {
396 found = false;
397 break;
398 }
399 if (op->latency() !=
400 arch.architecture().operation(op->name())->latency()) {
401 found = false;
402 break;
403 }
404 }
405 if (!found) {
406 continue;
407 }
408
409 loc.setID(row);
410 loc.setHDBFile(hdbPath);
411 return true;
412 }
413 }
414
415 return false;
416}
static CachedHDBManager & instance(const std::string &hdbFile)
FUArchitecture & architecture() const
Definition FUEntry.cc:129
FUEntry * fuByEntryID(RowID id) const
std::set< RowID > fuEntryIDs() const
virtual void setHDBFile(std::string file)
std::string findHDBPath(std::string name)
@ Verilog
Verilog.
Definition ProGeTypes.hh:42
@ VHDL
VHDL.
Definition ProGeTypes.hh:41

References HDB::FUEntry::architecture(), findHDBPath(), HDB::HDBManager::fuByEntryID(), HDB::HDBManager::fuEntryIDs(), HDB::CachedHDBManager::instance(), TTAMachine::FunctionUnit::operation(), TTAMachine::FunctionUnit::operationCount(), options, IDF::UnitImplementationLocation::setHDBFile(), IDF::UnitImplementationLocation::setID(), HDB::BlockImplementationFile::Verilog, ProGe::Verilog, HDB::BlockImplementationFile::VHDL, and ProGe::VHDL.

Referenced by ProGe::ProGeUI::generateIDF().

Here is the call graph for this function:

◆ checkForSelectableIU()

bool ProGeTools::checkForSelectableIU ( const ProGeOptions options,
TTAMachine::ImmediateUnit iu,
IDF::IUImplementationLocation loc,
std::ostream &  verbose 
)

Checks if RF has an implementation in hdbs.

Definition at line 500 of file ProGeTools.cc.

502 {
503 (void)verbose;
504 for (auto&& hdb : options.hdbList) {
505 std::string hdbPath = findHDBPath(hdb);
506 HDB::CachedHDBManager& manager =
508 std::set<RowID> rows = manager.rfEntryIDs();
509 for (auto&& row : rows) {
510 auto rfEntry = manager.rfByEntryID(row);
511 // Exclude these:
512 if (!rfEntry->hasImplementation() ||
513 !rfEntry->hasArchitecture()) {
514 continue;
515 }
516 auto arch = rfEntry->architecture();
517 auto impl = rfEntry->implementation();
518 bool wrongLanguage = false;
519 for (int i = 0; i < impl.implementationFileCount(); ++i) {
520 auto f = impl.file(i);
521 if (f.format() ==
523 options.language == ProGe::HDL::Verilog) {
524 wrongLanguage = true;
525 break;
526 } else if (
527 f.format() ==
529 options.language == ProGe::HDL::VHDL) {
530 wrongLanguage = true;
531 break;
532 }
533 }
534 if (wrongLanguage) {
535 continue;
536 }
537 if (iu.isUsedAsGuard() != arch.hasGuardSupport()) {
538 continue;
539 }
540 if (iu.maxReads() != arch.readPortCount()) {
541 continue;
542 }
543 if (1 != arch.writePortCount()) {
544 continue;
545 }
546 if (iu.latency() != arch.latency()) {
547 continue;
548 }
549 if (!arch.hasParameterizedWidth() &&
550 (iu.width() != arch.width())) {
551 continue;
552 }
553 if (!arch.hasParameterizedSize() && (iu.size() != arch.size())) {
554 continue;
555 }
556 // Must be a perfect choise.
557 loc.setID(row);
558 loc.setHDBFile(hdbPath);
559 return true;
560 }
561 }
562 return false;
563}
std::set< RowID > rfEntryIDs() const
RFEntry * rfByEntryID(RowID id) const
RFArchitecture & architecture() const
Definition RFEntry.cc:145
virtual int size() const
virtual int width() const
virtual int latency() const
virtual int maxReads() const
virtual bool isUsedAsGuard() const

References HDB::RFEntry::architecture(), findHDBPath(), HDB::CachedHDBManager::instance(), TTAMachine::RegisterFile::isUsedAsGuard(), TTAMachine::ImmediateUnit::latency(), TTAMachine::RegisterFile::maxReads(), options, HDB::HDBManager::rfByEntryID(), HDB::HDBManager::rfEntryIDs(), IDF::UnitImplementationLocation::setHDBFile(), IDF::UnitImplementationLocation::setID(), TTAMachine::BaseRegisterFile::size(), HDB::BlockImplementationFile::Verilog, ProGe::Verilog, HDB::BlockImplementationFile::VHDL, ProGe::VHDL, and TTAMachine::BaseRegisterFile::width().

Referenced by ProGe::ProGeUI::generateIDF().

Here is the call graph for this function:

◆ checkForSelectableRF()

bool ProGeTools::checkForSelectableRF ( const ProGeOptions options,
TTAMachine::RegisterFile rf,
IDF::RFImplementationLocation loc,
std::ostream &  verbose 
)

Checks if RF has an implementation in hdbs.

Definition at line 422 of file ProGeTools.cc.

424 {
425 (void)verbose;
426 for (auto&& hdb : options.hdbList) {
427 std::string hdbPath = findHDBPath(hdb);
428 HDB::CachedHDBManager& manager =
430 std::set<RowID> rows = manager.rfEntryIDs();
431 for (auto&& row : rows) {
432 auto rfEntry = manager.rfByEntryID(row);
433 // Exclude these:
434 if (!rfEntry->hasImplementation() ||
435 !rfEntry->hasArchitecture()) {
436 continue;
437 }
438 auto arch = rfEntry->architecture();
439 auto impl = rfEntry->implementation();
440 bool wrongLanguage = false;
441 for (int i = 0; i < impl.implementationFileCount(); ++i) {
442 auto f = impl.file(i);
443 if (f.format() ==
445 options.language == ProGe::HDL::Verilog) {
446 wrongLanguage = true;
447 break;
448 } else if (
449 f.format() ==
451 options.language == ProGe::HDL::VHDL) {
452 wrongLanguage = true;
453 break;
454 }
455 }
456 if (wrongLanguage) {
457 continue;
458 }
459 if (rf.isUsedAsGuard() != arch.hasGuardSupport()) {
460 continue;
461 }
462 if (rf.outputPortCount() != arch.readPortCount()) {
463 continue;
464 }
465 if (rf.inputPortCount() != arch.writePortCount()) {
466 continue;
467 }
468 if (rf.bidirPortCount() != arch.bidirPortCount()) {
469 continue;
470 }
471 if (1 != arch.latency()) {
472 continue;
473 }
474 if (rf.guardLatency() != arch.guardLatency()) {
475 continue;
476 }
477 if (!arch.hasParameterizedWidth() &&
478 (rf.width() != arch.width())) {
479 continue;
480 }
481 if (!arch.hasParameterizedSize() && (rf.size() != arch.size())) {
482 continue;
483 }
484 if (rf.zeroRegister() != arch.zeroRegister()) {
485 continue;
486 }
487 // Must be a perfect choise.
488 loc.setID(row);
489 loc.setHDBFile(hdbPath);
490 return true;
491 }
492 }
493 return false;
494}
virtual bool zeroRegister() const
virtual int guardLatency() const
virtual int bidirPortCount() const
Definition Unit.cc:174
virtual int inputPortCount(bool countBidir=false) const
Definition Unit.cc:160
virtual int outputPortCount(bool countBidir=false) const
Definition Unit.cc:145

References HDB::RFEntry::architecture(), TTAMachine::Unit::bidirPortCount(), findHDBPath(), TTAMachine::RegisterFile::guardLatency(), TTAMachine::Unit::inputPortCount(), HDB::CachedHDBManager::instance(), TTAMachine::RegisterFile::isUsedAsGuard(), options, TTAMachine::Unit::outputPortCount(), HDB::HDBManager::rfByEntryID(), HDB::HDBManager::rfEntryIDs(), IDF::UnitImplementationLocation::setHDBFile(), IDF::UnitImplementationLocation::setID(), TTAMachine::BaseRegisterFile::size(), HDB::BlockImplementationFile::Verilog, ProGe::Verilog, HDB::BlockImplementationFile::VHDL, ProGe::VHDL, TTAMachine::BaseRegisterFile::width(), and TTAMachine::RegisterFile::zeroRegister().

Referenced by ProGe::ProGeUI::generateIDF().

Here is the call graph for this function:

◆ createFUGeneratableOperationInfos()

std::vector< IDF::FUGenerated::Info > ProGeTools::createFUGeneratableOperationInfos ( const ProGeOptions options,
std::ostream &  verbose 
)

Parses all given hdbs for operation implementations.

Definition at line 306 of file ProGeTools.cc.

307 {
308 std::vector<IDF::FUGenerated::Info> infos;
309
310 for (auto&& hdb : options.hdbList) {
311 std::string hdbPath = findHDBPath(hdb);
312 verbose << " searching implementations from " << hdbPath << "\n";
313 HDB::CachedHDBManager& manager =
315 std::set<RowID> rows = manager.OperationImplementationIDs();
316 std::vector<IDF::FUGenerated::Info> newInfos;
317 for (auto&& row : rows) {
318 auto opimpl = manager.OperationImplementationByID(row);
319 newInfos.emplace_back(IDF::FUGenerated::Info{
320 opimpl.name, hdbPath, opimpl.id, opimpl.latency});
321 }
322
323 std::sort(
324 newInfos.begin(), newInfos.end(),
326 return a.latency > b.latency;
327 });
328
329 infos.insert(infos.end(), newInfos.begin(), newInfos.end());
330 }
331
332 return infos;
333}
std::set< RowID > OperationImplementationIDs() const
OperationImplementation OperationImplementationByID(RowID id) const

References findHDBPath(), IDF::FUGenerated::Info::id, HDB::CachedHDBManager::instance(), HDB::HDBManager::OperationImplementationByID(), HDB::HDBManager::OperationImplementationIDs(), and options.

Referenced by ProGe::ProGeUI::generateIDF().

Here is the call graph for this function:

◆ dagLatency()

int ProGeTools::dagLatency ( const OperationDAG dag,
const std::unordered_map< std::string, int > &  maxOpLatency 
)

Finds the maximum latency of the dag. Uses maxOpLatency for the node latencies.

Definition at line 234 of file ProGeTools.cc.

236 {
237 assert(!dag.isNull());
238
239 int maxLatency = 0;
240
241 // To find the global critical path, go through every end terminal's
242 // critical path and find the maximum.
243 auto sinkNodes = dag.sinkNodes();
244 for (auto node : sinkNodes) {
245 int latency = maxLatencyToNode(dag, *node, maxOpLatency);
246 maxLatency = std::max(latency, maxLatency);
247 }
248 return maxLatency;
249}
#define assert(condition)
virtual NodeSet sinkNodes() const
int maxLatencyToNode(const OperationDAG &dag, OperationDAGNode &node, const std::unordered_map< std::string, int > &maxOpLatency, bool allowDifference=true)

References assert, OperationDAG::isNull(), maxLatencyToNode(), and BoostGraph< GraphNode, GraphEdge >::sinkNodes().

Referenced by FUGen::parseOperations().

Here is the call graph for this function:

◆ findHDBPath()

std::string ProGeTools::findHDBPath ( std::string  name)

Tries to find full path for hdb file.

Definition at line 339 of file ProGeTools.cc.

339 {
340 if (FileSystem::fileExists(name)) {
341 return name;
342 }
343
344 std::vector<std::string> paths = Environment::hdbPaths();
345 return FileSystem::findFileInSearchPaths(paths, name);
346}
static std::vector< std::string > hdbPaths(bool libraryPathsOnly=false)
static std::string findFileInSearchPaths(const std::vector< std::string > &searchPaths, const std::string &file)
static bool fileExists(const std::string fileName)

References FileSystem::fileExists(), FileSystem::findFileInSearchPaths(), and Environment::hdbPaths().

Referenced by checkForSelectableFU(), checkForSelectableIU(), checkForSelectableRF(), and createFUGeneratableOperationInfos().

Here is the call graph for this function:

◆ findInOptionList()

bool ProGeTools::findInOptionList ( const std::string &  option,
std::vector< std::string >  list,
bool  enableAll = true 
)

Check if option is in the list or list has 'ALL' in it.

Definition at line 124 of file ProGeTools.cc.

126 {
127 std::string lowered_option = StringTools::stringToLower(option);
128 for (auto&& item : list) {
129 std::string lowered_item = StringTools::stringToLower(item);
130 if (lowered_item == lowered_option ||
131 (enableAll && lowered_item == "all")) {
132 return true;
133 }
134 }
135 return false;
136}

References StringTools::stringToLower().

Referenced by checkForGeneratableFU(), FUGen::createMandatoryPorts(), FUGen::createShadowRegisters(), and FUGen::implement().

Here is the call graph for this function:

◆ generateableDAGOperations()

std::vector< IDF::FUGenerated::DAGOperation > ProGeTools::generateableDAGOperations ( const std::vector< IDF::FUGenerated::Info infos,
std::ostream &  verbose 
)

Find out all operations we can generate from DAG.

Definition at line 142 of file ProGeTools.cc.

143 {
144 std::vector<IDF::FUGenerated::DAGOperation> dagops;
145 std::set<std::string> opNames;
146
147 verbose << " can implement DAG operations that use:\n ";
148 std::string sep;
149 for (auto&& info : infos) {
150 verbose << sep << info.operationName;
151 sep = ", ";
152 }
153 verbose << "\n";
154
155 OperationPool opPool;
156 OperationIndex& opIndex = opPool.index();
157 for (int i = 0; i < opIndex.moduleCount(); ++i) {
158 OperationModule& module = opIndex.module(i);
159 for (int j = 0; j < opIndex.operationCount(module); ++j) {
160 std::string opName = opIndex.operationName(j, module);
161 if (opNames.count(opName) > 0) {
162 continue;
163 }
164 Operation& op = opPool.operation(opName.c_str());
165 for (int d = 0; d < op.dagCount(); ++d) {
166 std::vector<IDF::FUGenerated::Info> subops;
167 if (canGenerateFromDAG(op.dag(d), infos, &subops)) {
168 opName = StringTools::stringToLower(opName);
169 dagops.emplace_back(
170 IDF::FUGenerated::DAGOperation{opName, subops});
171 opNames.insert(opName);
172 break;
173 }
174 }
175 }
176 }
177
178 verbose << " can implement DAG operations:\n ";
179 sep = "";
180 for (auto&& op : dagops) {
181 verbose << sep << op.operationName;
182 sep = ", ";
183 }
184 verbose << "\n";
185
186 return dagops;
187}
std::string operationName(int i, const OperationModule &om)
int operationCount(const OperationModule &om)
int moduleCount() const
OperationIndex & index()
Operation & operation(const char *name)
virtual OperationDAG & dag(int index) const
Definition Operation.cc:148
virtual int dagCount() const
Definition Operation.cc:134
bool canGenerateFromDAG(const OperationDAG &dag, const std::vector< IDF::FUGenerated::Info > infos, std::vector< IDF::FUGenerated::Info > *subops)

References canGenerateFromDAG(), Operation::dag(), Operation::dagCount(), OperationPool::index(), OperationIndex::moduleCount(), OperationPool::operation(), OperationIndex::operationCount(), OperationIndex::operationName(), and StringTools::stringToLower().

Referenced by ProGe::ProGeUI::generateIDF().

Here is the call graph for this function:

◆ languageMatches()

bool ProGeTools::languageMatches ( HDB::BlockImplementationFile::Format  format,
ProGe::HDL  language 
)

◆ maxLatencyToNode()

int ProGeTools::maxLatencyToNode ( const OperationDAG dag,
OperationDAGNode node,
const std::unordered_map< std::string, int > &  maxOpLatency,
bool  allowDifference = true 
)

Definition at line 274 of file ProGeTools.cc.

277 {
278 // Go through all the parents.
279 int maxLeafLatency = -1;
280 for (auto&& e : dag.inEdges(node)) {
281 OperationDAGNode& nextNode = dag.tailNode(*e);
282 // Recursive call to parent nodes
283 int parentLatency = maxLatencyToNode(dag, nextNode, maxOpLatency) +
284 nodeLatency(nextNode, maxOpLatency);
285
286 if (!allowDifference && maxLeafLatency != -1) {
287 assert(
288 maxLeafLatency == parentLatency &&
289 "Two input edges of DAG node have different latency!");
290 }
291
292 maxLeafLatency = std::max(maxLeafLatency, parentLatency);
293 }
294
295 // For nodes without children
296 maxLeafLatency = std::max(maxLeafLatency, 0);
297
298 // Return only the longest leaf latency.
299 return maxLeafLatency;
300}
virtual Node & tailNode(const Edge &edge) const
int nodeLatency(OperationDAGNode &node, const std::unordered_map< std::string, int > &maxOpLatency)

References assert, BoostGraph< GraphNode, GraphEdge >::inEdges(), maxLatencyToNode(), nodeLatency(), and BoostGraph< GraphNode, GraphEdge >::tailNode().

Referenced by dagLatency(), maxLatencyToNode(), and FUGen::scheduleOperations().

Here is the call graph for this function:

◆ nodeLatency()

int ProGeTools::nodeLatency ( OperationDAGNode node,
const std::unordered_map< std::string, int > &  maxOpLatency 
)

Definition at line 252 of file ProGeTools.cc.

254 {
255 int latency = 0;
256
257 OperationNode* operationNode = dynamic_cast<OperationNode*>(&node);
258 if (operationNode) {
259 std::string subOpName = operationNode->referencedOperation().name();
260 subOpName = StringTools::stringToLower(subOpName);
261 if (maxOpLatency.find(subOpName) != maxOpLatency.end()) {
262 latency = maxOpLatency.at(subOpName);
263 }
264 }
265
266 return latency;
267}

References Operation::name(), OperationNode::referencedOperation(), and StringTools::stringToLower().

Referenced by maxLatencyToNode().

Here is the call graph for this function: