Otawa  0.10
ProcessorBuilder.h
Go to the documentation of this file.
1 /*
2  * hard::ProcessorBuilder class interface
3  *
4  * This file is part of OTAWA
5  * Copyright (c) 2005-12, IRIT UPS.
6  *
7  * OTAWA is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * OTAWA is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with OTAWA; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 #ifndef OTAWA_HARD_PROCESSORBUILDER_H_
22 #define OTAWA_HARD_PROCESSORBUILDER_H_
23 
24 #include <otawa/hard/Processor.h>
25 #include <elm/genstruct/Vector.h>
26 
27 namespace otawa { namespace hard {
28 
29 // FunctionalUnitBuilder class
31 public:
32  inline FunctionalUnitBuilder(string name): fu(new FunctionalUnit()) { fu->name = name; }
33  inline FunctionalUnitBuilder& latency(int l) { fu->latency = l; return *this; }
34  inline FunctionalUnitBuilder& width(int w) { fu->width = w; return *this; }
35  inline FunctionalUnitBuilder& pipelined(void) { fu->pipelined = true; return *this; }
36  inline FunctionalUnit *operator*(void) { return fu; }
37 private:
39 };
40 
41 
42 // StageBuilder class
43 class StageBuilder {
44 public:
45  inline StageBuilder(string name): stage(new Stage()), completed(false) { stage->name = name; }
46  inline StageBuilder& type(Stage::type_t t) { stage->type = t; return *this; }
47  inline StageBuilder& width(int w) { stage->width = w; return *this; }
48  inline StageBuilder& latency(int l) { stage->latency = l; return *this; }
49  inline StageBuilder& ordered(void) { stage->ordered = true; return *this; }
50  inline StageBuilder& fu(FunctionalUnitBuilder& fu) { fus.add(*fu); return *this; }
51  inline StageBuilder& dispatch(Inst::kind_t t, FunctionalUnitBuilder& fu) { Dispatch *d = new Dispatch(); disps.add(d); d->type = t; d->fu = *fu; return *this; }
52  inline Stage *operator*(void) { complete(); return stage; }
53 private:
57  bool completed;
58  void complete(void);
59 };
60 
61 // QueueBuilder class
62 class QueueBuilder {
63 public:
64  inline QueueBuilder(string name): queue(new Queue()), completed(false) { queue->name = name; }
65  inline QueueBuilder& input(StageBuilder& stage) { queue->input = *stage; return *this; }
66  inline QueueBuilder& output(StageBuilder& stage) { queue->output = *stage; return *this; }
67  inline QueueBuilder& intern(StageBuilder& stage) { interns.add(*stage); return *this; }
68  inline QueueBuilder& size(int s) { queue->size = s; return *this; }
69  inline Queue *operator*(void) { complete(); return queue; }
70 
71 private:
74  bool completed;
75  void complete(void);
76 };
77 
78 // ProcessorBuilder class
80 public:
81  inline ProcessorBuilder(string model): proc(new Processor()), completed(false) { proc->model = model; }
82  inline ProcessorBuilder& arch(string arch) { proc->arch = arch; return *this; }
83  inline ProcessorBuilder& builder(string builder) { proc->builder = builder; return *this; }
85  inline ProcessorBuilder& add(StageBuilder& stage) { stages.add(*stage); return *this; }
86  inline ProcessorBuilder& add(QueueBuilder& queue) { queues.add(*queue); return *this; }
87  inline Processor *operator*(void) { complete(); return proc; }
88 
89 private:
93  bool completed;
94  void complete(void);
95 };
96 
97 } } // otawa::hard
98 
99 #endif /* OTAWA_HARD_PROCESSORBUILDER_H_ */
int latency
Definition: Processor.h:53
void complete(void)
Definition: hard_Processor.cpp:267
ProcessorBuilder & builder(string builder)
Definition: ProcessorBuilder.h:83
FunctionalUnitBuilder(string name)
Definition: ProcessorBuilder.h:32
A dispatch object allows to map some kinds of instructions to a functional unit.
Definition: Processor.h:71
QueueBuilder & intern(StageBuilder &stage)
Definition: ProcessorBuilder.h:67
type_t type
Definition: Processor.h:77
Queue * queue
Definition: ProcessorBuilder.h:72
FunctionalUnit * fu
Definition: ProcessorBuilder.h:38
FunctionalUnitBuilder & width(int w)
Definition: ProcessorBuilder.h:34
Stage * input
Definition: Processor.h:122
Definition: ProcessorBuilder.h:79
type_t type
Definition: Processor.h:100
bool ordered
Definition: Processor.h:103
QueueBuilder & size(int s)
Definition: ProcessorBuilder.h:68
bool completed
Definition: ProcessorBuilder.h:93
Processor * proc
Definition: ProcessorBuilder.h:90
Stage * output
Definition: Processor.h:122
Definition: ProcessorBuilder.h:62
Description of a processor pipeline.
Definition: Processor.h:136
genstruct::Vector< Queue * > queues
Definition: ProcessorBuilder.h:92
StageBuilder & ordered(void)
Definition: ProcessorBuilder.h:49
elm::String arch
Definition: Processor.h:156
StageBuilder & type(Stage::type_t t)
Definition: ProcessorBuilder.h:46
bool pipelined
Definition: Processor.h:63
genstruct::Vector< Stage * > interns
Definition: ProcessorBuilder.h:73
FunctionalUnitBuilder & latency(int l)
Definition: ProcessorBuilder.h:33
elm::String builder
Definition: Processor.h:158
void complete(void)
Definition: hard_Processor.cpp:234
FunctionalUnitBuilder & pipelined(void)
Definition: ProcessorBuilder.h:35
Stage * stage
Definition: ProcessorBuilder.h:54
void complete(void)
Definition: hard_Processor.cpp:248
int width
Definition: Processor.h:54
bool completed
Definition: ProcessorBuilder.h:74
Definition: ProcessorBuilder.h:30
This class represents a stage in a pipeline.
Definition: Processor.h:87
FunctionalUnit * fu
Definition: Processor.h:78
elm::String name
Definition: Processor.h:120
StageBuilder & dispatch(Inst::kind_t t, FunctionalUnitBuilder &fu)
Definition: ProcessorBuilder.h:51
ProcessorBuilder & add(StageBuilder &stage)
Definition: ProcessorBuilder.h:85
The instructions queues stores instruction that come from one stage to another one.
Definition: Processor.h:116
type_t
Definition: Processor.h:91
Queue * operator*(void)
Definition: ProcessorBuilder.h:69
elm::t::uint32 kind_t
Definition: Inst.h:67
StageBuilder & width(int w)
Definition: ProcessorBuilder.h:47
StageBuilder & latency(int l)
Definition: ProcessorBuilder.h:48
genstruct::Vector< FunctionalUnit * > fus
Definition: ProcessorBuilder.h:55
QueueBuilder(string name)
Definition: ProcessorBuilder.h:64
Processor * operator*(void)
Definition: ProcessorBuilder.h:87
A functional unit is specialized in the computation of some kinds of instructions.
Definition: Processor.h:60
FunctionalUnit * operator*(void)
Definition: ProcessorBuilder.h:36
Stage * operator*(void)
Definition: ProcessorBuilder.h:52
ProcessorBuilder(string model)
Definition: ProcessorBuilder.h:81
QueueBuilder & output(StageBuilder &stage)
Definition: ProcessorBuilder.h:66
cstring name
Definition: odisasm.cpp:107
StageBuilder & fu(FunctionalUnitBuilder &fu)
Definition: ProcessorBuilder.h:50
ProcessorBuilder & frequency(t::uint64 frequency)
Definition: ProcessorBuilder.h:84
Definition: ProcessorBuilder.h:43
QueueBuilder & input(StageBuilder &stage)
Definition: ProcessorBuilder.h:65
string name
Definition: Processor.h:52
t::uint64 frequency
Definition: Processor.h:161
ProcessorBuilder & add(QueueBuilder &queue)
Definition: ProcessorBuilder.h:86
bool completed
Definition: ProcessorBuilder.h:57
StageBuilder(string name)
Definition: ProcessorBuilder.h:45
elm::String model
Definition: Processor.h:157
genstruct::Vector< Stage * > stages
Definition: ProcessorBuilder.h:91
int size
Definition: Processor.h:121
uint64_t uint64
ProcessorBuilder & arch(string arch)
Definition: ProcessorBuilder.h:82
genstruct::Vector< Dispatch * > disps
Definition: ProcessorBuilder.h:56