22 #ifndef OTAWA_MICROPROCESSOR_H
23 #define OTAWA_MICROPROCESSOR_H
26 #include <elm/genstruct/Vector.h>
27 #include <elm/string/String.h>
28 #include <elm/genstruct/DLList.h>
36 using namespace elm::genstruct;
73 : _name(name), _size(size) {}
79 {
return _filling_stage;}
81 {
return _emptying_stage;}
83 {_filling_stage = stage;}
85 {_emptying_stage = stage;}
113 NUMBER_OF_CATEGORIES=7
114 } pipeline_stage_category_t;
136 {
return _info.short_name;}
138 {
return _info.is_pipelined;}
140 {
return _info.ordder_policy;}
142 {
return _info.min_latency;}
144 {
return _info.max_latency;}
146 {
return _info.width;}
148 {
return _pipeline.get(0);}
181 {
return _info.order_policy;}
183 {
return _info.stage_width;}
185 {
return _info.stage_name;}
187 {
return _info.stage_short_name;}
189 {
return _info.stage_category;}
191 {
return _category_name[_info.stage_category].toString();}
193 {
return _order_name[_info.order_policy].toString();}
195 {
return _info.source_queue;}
197 {
return _info.destination_queue;}
201 {
return _info.min_latency;}
203 {
return _info.max_latency;}
212 {
return _nodes.length();}
214 if (index >= _nodes.length())
216 return _nodes[index];
221 {bindings.add(
pair(kind, fu));}
223 for(
int i = 0; i < bindings.length(); i++) {
225 if((kind & mask) ==
mask) {
226 return bindings[i].snd;
229 cerr <<
"Unsupported instruction kind : " <<
io::hex(kind) << io::endl;
236 : elm::genstruct::
Vector<N *>::Iterator(stage->_nodes) {}
242 : _info(fu_info), _processor(proc) {
248 user_stage->fus.add(
this);
255 pipeline_info.
source_queue = user_stage->_info.source_queue;
275 pipeline_info.
source_queue = user_stage->_info.source_queue;
307 {
return _pipeline_stage_index++;}
309 {_operand_reading_stage = stage;}
311 {_operand_producing_stage = stage;}
313 {
return _operand_reading_stage;}
315 {
return _operand_producing_stage;}
317 {
return (_pipeline.get(_pipeline.length()-1) == stage);}
328 : elm::genstruct::
Vector<
Queue<N> *>::Iterator(processor->_queues) {}
336 _pipeline.add(stage);
337 if ( stage->sourceQueue() != NULL)
338 stage->sourceQueue()->setEmptyingStage(stage);
339 if ( stage->destinationQueue() != NULL)
340 stage->destinationQueue()->setFillingStage(stage);
380 : _pipeline_stage_index(0),
381 _operand_reading_stage(0),
382 _operand_producing_stage(0)
395 : _pipeline_stage_index(0),
396 _operand_reading_stage(0),
397 _operand_producing_stage(0)
404 for(
int i = 0; i < oqueues.count(); i++)
406 oqueues[i]->getName(),
407 1 << oqueues[i]->getSize()));
411 for(
int i = 0; i < ostages.count(); i++) {
421 bool is_exec =
false;
422 int exec_stage_index = 0;
423 switch(ostages[i]->getType()) {
434 exec_stage_index = i;
450 for(
int j = 0; j < oqueues.count(); j++) {
451 if(oqueues[j]->getInput() == ostages[i])
453 if(oqueues[j]->getOutput() == ostages[i])
466 for(
int j = 0; j < fus.count(); j++) {
468 info.
name = fus[j]->getName();
473 info.
order_policy = ostages[exec_stage_index]->isOrdered()
475 info.
width = fus[j]->getWidth();
476 stage->addFunctionalUnit(info);
481 for(
int j = 0; j < dispatch.count(); j++) {
483 for(
int k = 0; k < fus.count(); k++)
484 if(fus[k] == dispatch[j]->getFU()) {
485 stage->addBinding(dispatch[j]->getType(), stage->getFUs()[k]);
502 out_stream <<
"---------------------------------------------\n";
503 out_stream <<
"Microprocessor configuration: \n";
504 out_stream <<
"---------------------------------------------\n";
505 out_stream <<
"\tpipeline stages:\n";
508 out_stream <<
"\t\t" << stage->name() <<
" (" ;
509 out_stream << stage->shortName() <<
"): category=" << stage->categoryString();
510 out_stream <<
" - policy=" << stage->orderPolicyString();
511 out_stream <<
" - width=" << stage->width();
512 if (stage->sourceQueue() != NULL)
513 out_stream <<
" - source_queue=" << stage->sourceQueue()->name();
514 if (stage->destinationQueue() != NULL)
515 out_stream <<
" - destination_queue=" << stage->destinationQueue()->name();
517 if (stage->usesFunctionalUnits()) {
518 out_stream <<
"\t\t\tuses functional units:\n";
521 out_stream <<
"\t\t\t\tinstruction category " << i <<
" processed by unit ";
542 out_stream <<
"\tqueues:\n";
545 out_stream <<
"\t\t" << queue->name() <<
": size=" << queue->size();
546 out_stream <<
" - filling_stage=" << queue->fillingStage()->name();
547 out_stream <<
" - emptying_stage=" << queue->emptyingStage()->name() <<
"\n";
554 #endif // OTAWA_MICROPROCESSOR_H
int numberOfNodes()
Definition: Microprocessor.h:211
struct otawa::sem::inst inst
PipelineStage< N > * fillingStage(void)
Definition: Microprocessor.h:78
void setEmptyingStage(PipelineStage< N > *stage)
Definition: Microprocessor.h:84
ExeNodeIterator(const PipelineStage< N > *stage)
Definition: Microprocessor.h:235
pipeline_info_t _info
Definition: Microprocessor.h:169
bool is_pipelined
Definition: Microprocessor.h:121
instruction_category_t
Definition: Microprocessor.h:46
elm::genstruct::Vector< PipelineStage< N > * > _pipeline
Definition: Microprocessor.h:295
PipelineStage< N > * addPipelineStage(typename PipelineStage< N >::pipeline_info_t &info)
Definition: Microprocessor.h:334
bool _uses_fus
Definition: Microprocessor.h:170
Definition: Microprocessor.h:149
Queue(elm::String name, int size)
Definition: Microprocessor.h:72
PipelineStage< N > * _emptying_stage
Definition: Microprocessor.h:70
Definition: Microprocessor.h:118
Queue< N > * destination_queue
Definition: Microprocessor.h:163
elm::genstruct::Vector< PipelineStage< N > * > _pipeline
Definition: Microprocessor.h:129
t::uint32 mask
Definition: base.h:45
PipelineStage< N > * firstStage()
Definition: Microprocessor.h:147
elm::String stage_short_name
Definition: Microprocessor.h:160
PipelineIterator(const FunctionalUnit *fu)
Definition: Microprocessor.h:151
Definition: Microprocessor.h:233
int minLatency(void)
Definition: Microprocessor.h:200
Definition: Processor.h:96
Queue< N > * source_queue
Definition: Microprocessor.h:162
PipelineStage< N > * operandReadingStage(void)
Definition: Microprocessor.h:312
Definition: Microprocessor.h:110
elm::String categoryString(void)
Definition: Microprocessor.h:190
void addNode(N *node)
Definition: Microprocessor.h:207
Pair< T1, T2 > pair(const T1 &v1, const T2 &v2)
Definition: Processor.h:93
IntFormat hex(IntFormat fmt)
StringBuffer _order_name[NUMBER_OF_POLICIES]
Definition: Microprocessor.h:177
Queue< N > * addQueue(elm::String name, int size)
Definition: Microprocessor.h:345
int max_latency
Definition: Microprocessor.h:123
int maxLatency(void)
Definition: Microprocessor.h:202
elm::String orderPolicyString(void)
Definition: Microprocessor.h:192
elm::String name(void)
Definition: Microprocessor.h:133
Definition: Microprocessor.h:156
int index(void)
Definition: Microprocessor.h:198
bool isPipelined(void)
Definition: Microprocessor.h:137
Definition: Microprocessor.h:48
Description of a processor pipeline.
Definition: Processor.h:136
elm::String _name
Definition: Microprocessor.h:67
Definition: Processor.h:94
Definition: Microprocessor.h:102
int max_latency
Definition: Microprocessor.h:165
void deleteNodes()
Definition: Microprocessor.h:209
elm::genstruct::Vector< FunctionalUnit * > & getFUs(void)
Definition: Microprocessor.h:218
pipeline_stage_category_t category(void)
Definition: Microprocessor.h:188
fu_info_t _info
Definition: Microprocessor.h:128
Microprocessor< N > * _processor
Definition: Microprocessor.h:130
StringOption proc(command, 'p',"processor","used processor","path","")
FunctionalUnit * findFU(Inst::kind_t kind)
Definition: Microprocessor.h:222
Definition: Microprocessor.h:40
order_policy_t orderPolicy()
Definition: Microprocessor.h:139
Definition: features.h:44
void addBinding(Inst::kind_t kind, FunctionalUnit *fu)
Definition: Microprocessor.h:220
Inst::kind_t kind
Definition: odisasm.cpp:106
Definition: Microprocessor.h:325
Vector< Pair< Inst::kind_t, FunctionalUnit * > > bindings
Definition: Microprocessor.h:171
String concat(const CString str) const
order_policy_t orderPolicy(void)
Definition: Microprocessor.h:180
Definition: Microprocessor.h:50
order_policy_t order_policy
Definition: Microprocessor.h:125
elm::String name
Definition: Microprocessor.h:119
QueueIterator(const Microprocessor< N > *processor)
Definition: Microprocessor.h:327
Queue< N > * sourceQueue(void)
Definition: Microprocessor.h:194
int _pipeline_stage_index
Definition: Microprocessor.h:296
Definition: Microprocessor.h:319
PipelineIterator(const Microprocessor< N > *processor)
Definition: Microprocessor.h:321
Definition: Microprocessor.h:49
int min_latency
Definition: Microprocessor.h:122
int maxLatency(void)
Definition: Microprocessor.h:143
Definition: Microprocessor.h:38
Definition: Processor.h:95
Definition: Microprocessor.h:47
N * node(int index)
Definition: Microprocessor.h:213
int minLatency(void)
Definition: Microprocessor.h:141
PipelineStage< N > * operandProducingStage(void)
Definition: Microprocessor.h:314
elm::genstruct::Vector< FunctionalUnit * > fus
Definition: Microprocessor.h:172
FunctionalUnit(fu_info_t &info, PipelineStage< N > *user_stage, Microprocessor< N > *proc)
Definition: Microprocessor.h:241
elm::String name(void)
Definition: Microprocessor.h:74
elm::genstruct::Vector< Queue< N > * > _queues
Definition: Microprocessor.h:294
instruction_category_t instCategory(Inst *inst)
Definition: exegraph_Microprocessor.cpp:34
int _index
Definition: Microprocessor.h:173
elm::t::uint32 kind_t
Definition: Inst.h:67
PipelineStage< N > * _operand_reading_stage
Definition: Microprocessor.h:297
StringBuffer _category_name[NUMBER_OF_CATEGORIES]
Definition: Microprocessor.h:176
PipelineStage< N > * _operand_producing_stage
Definition: Microprocessor.h:298
Definition: Microprocessor.h:112
Definition: Microprocessor.h:101
const Table< Queue * > & getQueues(void) const
Definition: Processor.h:148
Definition: Microprocessor.h:116
pipeline_stage_category_t
Definition: Microprocessor.h:105
elm::genstruct::Vector< N * > _nodes
Definition: Microprocessor.h:175
void dump(elm::io::Output &out_stream)
Dump the description of the microprocessor.
Definition: Microprocessor.h:501
void setFillingStage(PipelineStage< N > *stage)
Definition: Microprocessor.h:82
Definition: Microprocessor.h:65
Definition: Microprocessor.h:111
Definition: Microprocessor.h:109
Microprocessor< N > * _processor
Definition: Microprocessor.h:174
FunctionalUnit * addFunctionalUnit(typename PipelineStage< N >::FunctionalUnit::fu_info_t &fu_info)
Definition: Microprocessor.h:368
cstring name
Definition: odisasm.cpp:107
elm::String shortName(void)
Definition: Microprocessor.h:186
Definition: Microprocessor.h:100
Definition: Microprocessor.h:106
PipelineStage< N > * _filling_stage
Definition: Microprocessor.h:69
const Table< Stage * > & getStages(void) const
Definition: Processor.h:147
elm::String shortName(void)
Definition: Microprocessor.h:135
Definition: Microprocessor.h:107
void setOperandReadingStage(PipelineStage< N > *stage)
Definition: Microprocessor.h:308
int size(void)
Definition: Microprocessor.h:76
int getPipelineStageIndex()
Definition: Microprocessor.h:306
Definition: Microprocessor.h:53
int stage_width
Definition: Microprocessor.h:158
Definition: Microprocessor.h:108
int width(void)
Definition: Microprocessor.h:145
int _size
Definition: Microprocessor.h:68
Definition: Microprocessor.h:52
elm::String short_name
Definition: Microprocessor.h:120
PipelineStage(pipeline_info_t &info, Microprocessor< N > *proc)
Definition: Microprocessor.h:352
void setOperandProducingStage(PipelineStage< N > *stage)
Definition: Microprocessor.h:310
Queue< N > * destinationQueue(void)
Definition: Microprocessor.h:196
bool isLastStage(PipelineStage< N > *stage)
Definition: Microprocessor.h:316
bool usesFunctionalUnits(void)
Definition: Microprocessor.h:205
Definition: Microprocessor.h:51
order_policy_t order_policy
Definition: Microprocessor.h:157
elm::String stage_name
Definition: Microprocessor.h:159
order_policy_t
Definition: Microprocessor.h:99
int min_latency
Definition: Microprocessor.h:164
int width
Definition: Microprocessor.h:124
PipelineStage< N > * emptyingStage(void)
Definition: Microprocessor.h:80
Microprocessor(void)
Build an empty microprocessor.
Definition: Microprocessor.h:379
elm::String name(void)
Definition: Microprocessor.h:184
pipeline_stage_category_t stage_category
Definition: Microprocessor.h:161
int width(void) const
Definition: Microprocessor.h:182