-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathkey_functions.cpp
More file actions
executable file
·321 lines (292 loc) · 12.2 KB
/
key_functions.cpp
File metadata and controls
executable file
·321 lines (292 loc) · 12.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
/*
*
* Author: Tatiana Djaba Nya (Lead author)
* Author: Stephan C. Stilkerich
*
* Reference Architecture Model (EPiCS FP7 FET program, No. 257906)
* - Peter R. Lewis, University of Birmingham
* - Xin Yao, University of Birmingham
*
* Copyright (c) 2013, EADS Deutschland GmbH, EADS Innovation Works
*
*==============================================================================
*
*This file is part of ProprioSimEnv.
*
* ProprioSimEnv is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* ProprioSimEnv is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with ProprioSimEnv. If not, see <http://www.gnu.org/licenses/>.
*/
//==============================================================================
/// @file key_functions.h
//
/// @brief This contents the functions used to compute the latency times and the
// sizes of the memory blocks needed in the model.
//
//
//==============================================================================
#include "key_functions.h"
#include <iostream>
#include <fstream>
#include <algorithm>
namespace key_parameters
{
//Memory Sizes
//======================================================================
/// @fn get_see_gvoc_memsize
//
/// @brief determines the see's memory size for g.v.o.c. data
//======================================================================
unsigned int get_see_gvoc_memsize ( const unsigned int& gvoc_dl
, const unsigned int& anz_data_perzyklus)
{
return gvoc_dl*anz_data_perzyklus;
}
//======================================================================
/// @fn get_sae_memsize
//
/// @brief determines the sae's memory size
//======================================================================
unsigned int get_sae_memsize( const unsigned int& anz_data_perzyklus
, const unsigned int& anz_ic1_initiatoren
, const unsigned int& ic1_initiator_max_dl
)
{
return anz_data_perzyklus * (anz_ic1_initiatoren) * ic1_initiator_max_dl;
}
unsigned int get_lm_sae_memsize(const unsigned int& ic1_initiator_max_dl)
{
return ic1_initiator_max_dl;
}
unsigned int get_lm_rep_memsize ( const unsigned int& lm_rep_dl )
{
return lm_rep_dl;
}
//======================================================================
/// @fn get_see_lm_memsize
//
/// @brief determines the see's memory size for the lm data
//======================================================================
unsigned int get_see_lm_memsize ( const unsigned int& lm_res_dl )
{
return lm_res_dl;
}
//======================================================================
/// @fn get_see_rep_memsize
//
/// @brief determines the see's memory size for its report data
//======================================================================
unsigned int get_see_rep_memsize( const unsigned int& see_rep_dl )
{
return see_rep_dl;
}
//======================================================================
/// @fn get_monitor_gvoc_memsize
//
/// @brief determines the monitor's memory size for the g.v.o.c data
//======================================================================
unsigned int get_monitor_gvoc_memsize ( const unsigned int& gvoc_dl
, const unsigned int& anz_data_prozyklus)
{
return gvoc_dl*anz_data_prozyklus;
}
//======================================================================
/// @fn get_actuator_memsize
//
/// @brief determines the actuator's memory size for the see data
//======================================================================
unsigned int get_actuator_memsize( const unsigned int& see_actions_dl
, const unsigned int& anz_data_prozyklus)
{
return see_actions_dl*anz_data_prozyklus;
}
//======================================================================
/// @fn get_extaction_memsize
//
/// @brief determines the extaction's memory size for the see data
//======================================================================
unsigned int get_extaction_memsize ( const unsigned int& see_actions_dl
, const unsigned int& anz_data_prozyklus)
{
return see_actions_dl*anz_data_prozyklus;
}
//other key parameters
//sc_core::sc_time get_global_quantum ( const unsigned int& bus_width
// , const unsigned int& sensor_dl
// , const unsigned int& anz_data_perzyklus //Anzahl der Prozessausführungen jedes sensorsenv in einem Zyklus
// , const sc_core::sc_time& sae_wl
// )
//{
// double x = ceil((double)sensor_dl/bus_width);
// unsigned int burst_length = static_cast<unsigned int>(x + 0.5);
// sc_core::sc_time glob_quantum;
// unsigned int anz_process_ausf_pro_zyklus = burst_length*anz_data_perzyklus;
// glob_quantum = sae_wl*anz_process_ausf_pro_zyklus;
// return glob_quantum;
//}
//======================================================================
/// @fn get_sae_wl
//
/// @brief determines the write latency for a single write transaction on the sae
//======================================================================
sc_core::sc_time get_sae_wl ( const sc_core::sc_time& glob_quantum
, const unsigned int& sensor_dl
, const unsigned int& bus_width
, const unsigned int& anz_data_perzyklus
)
{
double x = ceil((double)sensor_dl/bus_width);
unsigned int burst_length = static_cast<unsigned int>(x + 0.5);
unsigned int anz_process_ausf_pro_zyklus =anz_data_perzyklus*burst_length;
return glob_quantum / (anz_process_ausf_pro_zyklus);
}
//======================================================================
/// @fn get_sae_rl
//
/// @brief determines the read latency for a single read transaction on the sae
//======================================================================
sc_core::sc_time get_sae_rl ( const sc_core::sc_time& sae_wl
, const unsigned int& anz_ic1_initiatoren
)
{
return sae_wl / (anz_ic1_initiatoren);
}
//======================================================================
/// @fn get_see_gvoc_wl
//
/// @brief determines the write latency for a single write transaction initiated by the gvoc on the see
//======================================================================
sc_core::sc_time get_see_gvoc_wl( const sc_core::sc_time& glob_quantum
, const unsigned int& gvoc_dl
, const unsigned int& bus_width
, const unsigned int& anz_data_perzyklus
)
{
double x = ceil((double)gvoc_dl/bus_width);
unsigned int burst_length = static_cast<unsigned int>(x + 0.5);
unsigned int anz_process_ausf_pro_zyklus =anz_data_perzyklus*burst_length;
return glob_quantum / (anz_process_ausf_pro_zyklus);
}
//======================================================================
/// @fn get_monitor_wl
//
/// @brief determines the write latency for a single write transaction on the monitor
//======================================================================
sc_core::sc_time get_monitor_wl ( const sc_core::sc_time& glob_quantum
, const unsigned int& gvoc_dl
, const unsigned int& bus_width
, const unsigned int& anz_data_perzyklus
)
{
double x = ceil((double)gvoc_dl/bus_width);
unsigned int burst_length = static_cast<unsigned int>(x + 0.5);
unsigned int anz_process_ausf_pro_zyklus =anz_data_perzyklus*burst_length;
return glob_quantum / (anz_process_ausf_pro_zyklus);
}
//======================================================================
/// @fn get_lm_reportmem_rl
//
/// @brief determines the read latency for a single read transaction on the LM
//======================================================================
sc_core::sc_time get_lm_reportmem_rl ( const sc_core::sc_time& glob_quantum
, const unsigned int& lm_rep_dl
, const unsigned int& bus_width
, const unsigned int& anz_data_perzyklus
, const unsigned int& anz_ic1_initiatoren
)
{
double x = ceil((double)lm_rep_dl/bus_width);
unsigned int burst_length = static_cast<unsigned int>(x + 0.5);
unsigned int anz_process_ausf_pro_zyklus =anz_data_perzyklus*anz_ic1_initiatoren*burst_length;
return glob_quantum / (anz_process_ausf_pro_zyklus);
}
//======================================================================
/// @fn get_see_reportmem_rl
//
/// @brief determines the read latency for a single read transaction on the SEE
//======================================================================
sc_core::sc_time get_see_reportmem_rl ( const sc_core::sc_time& glob_quantum
, const unsigned int& see_rep_dl
, const unsigned int& bus_width
, const unsigned int& anz_data_perzyklus
, const unsigned int& anz_ic1_initiatoren
)
{
double x = ceil((double)see_rep_dl/bus_width);
unsigned int burst_length = static_cast<unsigned int>(x + 0.5);
unsigned int anz_process_ausf_pro_zyklus =anz_data_perzyklus*anz_ic1_initiatoren*burst_length;
return glob_quantum / (anz_process_ausf_pro_zyklus);
}
//======================================================================
/// @fn get_act_wl
//
/// @brief determines the write latency for a single write transaction on the actuator
//======================================================================
sc_core::sc_time get_act_wl ( const sc_core::sc_time& glob_quantum
, const unsigned int& see_act_dl
, const unsigned int& bus_width
, const unsigned int& anz_data_perzyklus
, const unsigned int& anz_ic1_initiatoren
)
{
double x = ceil((double)see_act_dl/bus_width);
unsigned int burst_length = static_cast<unsigned int>(x + 0.5);
unsigned int anz_process_ausf_pro_zyklus =anz_data_perzyklus*anz_ic1_initiatoren*burst_length;
return glob_quantum / (anz_process_ausf_pro_zyklus);
}
//======================================================================
/// @fn get_extact_wl
//
/// @brief determines the write latency for a single write transaction on the extaction
//======================================================================
sc_core::sc_time get_extact_wl ( const sc_core::sc_time& glob_quantum
, const unsigned int& see_act_dl
, const unsigned int& bus_width
, const unsigned int& anz_data_perzyklus
, const unsigned int& anz_ic1_initiatoren
)
{
double x = ceil((double)see_act_dl/bus_width);
unsigned int burst_length = static_cast<unsigned int>(x + 0.5);
unsigned int anz_process_ausf_pro_zyklus =anz_data_perzyklus*anz_ic1_initiatoren*burst_length;
return glob_quantum / (anz_process_ausf_pro_zyklus);
}
//======================================================================
/// @fn get_see_lm_wl
//
/// @brief determines the write latency for a single write transaction initiated by the LM on the see
//======================================================================
sc_core::sc_time get_see_lm_wl( const sc_core::sc_time& glob_quantum
, const unsigned int& lm_act_dl
, const unsigned int& bus_width
, const unsigned int& anz_data_perzyklus
, const unsigned int& anz_ic1_initiatoren
)
{
double x = ceil((double)lm_act_dl/bus_width);
unsigned int burst_length = static_cast<unsigned int>(x + 0.5);
unsigned int anz_process_ausf_pro_zyklus = anz_data_perzyklus*anz_ic1_initiatoren*burst_length;
return glob_quantum / (anz_process_ausf_pro_zyklus);
}
}
namespace file_ops
{
std::string build_filename ( std::string &name_prefix ///< prefix for the filename
, const char* name_suffix ///< suffix for the filename
)
{
std::string name (name_suffix);
std::string undersc("_");
//name = name_prefix + undersc + name;
return name_prefix + undersc + name;
}
}