1 /*****************************************************************************
3 * SOFTWARE LICENSE AGREEMENT
4 * Copyright (c) 2010-2013 Advanced Micro Devices, Inc.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are
9 * met: redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer;
11 * redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution;
14 * neither the name of the copyright holders nor the names of its
15 * contributors may be used to endorse or promote products derived from
16 * this software without specific prior written permission.
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 * Authors: Joel Hestness
33 ***************************************************************************/
43 #include "basic_circuit.h"
46 #include "parameter.h"
50 // TODO: Fix this constructor to default initialize all pointers to NULL
51 System::System(XMLNode
* _xml_data
)
52 : McPATComponent(_xml_data
) {
59 // TODO: This loop can (and should) be called by every component in
60 // the hierarchy. Consider moving it to McPATComponent
61 int numChildren
= xml_data
->nChildNode("component");
62 for (i
= 0; i
< numChildren
; i
++ ) {
63 // For each child node of the system,
64 XMLNode
* childXML
= xml_data
->getChildNodePtr("component", &i
);
65 XMLCSTR type
= childXML
->getAttribute("type");
68 warnMissingComponentType(childXML
->getAttribute("id"));
70 } STRCMP(type
, "Core") {
71 // TODO: If homogeneous cores, and currCore > 0, just copy core 0
72 children
.push_back(new Core(childXML
, currCore
, &interface_ip
));
74 } STRCMP(type
, "CacheUnit") {
75 children
.push_back(new CacheUnit(childXML
, &interface_ip
));
76 } STRCMP(type
, "CacheController") {
77 // TODO: Remove reliance on interface_ip - there should be a better
78 // way to share global variables than passing, copying
79 children
.push_back(new CacheController(childXML
, &interface_ip
));
80 } STRCMP(type
, "MemoryController") {
81 children
.push_back(new MemoryController(childXML
, &interface_ip
));
82 } STRCMP(type
, "FlashController") {
83 children
.push_back(new FlashController(childXML
, &interface_ip
));
84 } STRCMP(type
, "NIUController") {
85 children
.push_back(new NIUController(childXML
, &interface_ip
));
86 } STRCMP(type
, "PCIeController") {
87 children
.push_back(new PCIeController(childXML
, &interface_ip
));
88 } STRCMP(type
, "Memory") {
90 warnIncompleteComponentType(type
);
91 } STRCMP(type
, "OnChipNetwork") {
92 // TODO: Many of the parameters to this constructor should be
93 // handled in another way
94 children
.push_back(new OnChipNetwork(childXML
, currNOC
,
97 warnIncompleteComponentType(type
);
98 } STRCMP(type
, "BusInterconnect") {
99 // TODO: Many of the parameters to this constructor should be
100 // handled in another way
101 children
.push_back(new BusInterconnect(childXML
, &interface_ip
));
102 warnIncompleteComponentType(type
);
104 // TODO: Add a directory data type that can handle the directories
105 // as defined by certain McScript output
107 warnUnrecognizedComponent(type
);
112 void System::displayDeviceType(int device_type_
, uint32_t indent
) {
113 string
indent_str(indent
, ' ');
114 cout
<< indent_str
<< "Device Type = ";
116 switch ( device_type_
) {
118 cout
<< "ITRS high performance device type" << endl
;
121 cout
<< "ITRS low standby power device type" << endl
;
124 cout
<< "ITRS low operating power device type" << endl
;
127 cout
<< "LP-DRAM device type" << endl
;
130 cout
<< "COMM-DRAM device type" << endl
;
133 cout
<< indent_str
<< "Unknown!" << endl
;
138 void System::displayInterconnectType(int interconnect_type_
, uint32_t indent
) {
139 string
indent_str(indent
, ' ');
140 cout
<< indent_str
<< "Interconnect metal projection = ";
142 switch ( interconnect_type_
) {
144 cout
<< "aggressive interconnect technology projection" << endl
;
147 cout
<< "conservative interconnect technology projection" << endl
;
150 cout
<< indent_str
<< "Unknown!" << endl
;
155 // TODO: Migrate this down to the McPATComponent::displayData function
156 void System::displayData(uint32_t indent
, int plevel
) {
157 string
indent_str(indent
, ' ');
158 string
indent_str_next(indent
+ 2, ' ');
160 cout
<< "\nMcPAT (version " << VER_MAJOR
<< "." << VER_MINOR
161 << " of " << VER_UPDATE
<< ") results (current print level is "
163 << ", please increase print level to see the details in "
164 << "components) " << endl
;
166 cout
<< "\nMcPAT (version " << VER_MAJOR
<< "." << VER_MINOR
167 << " of " << VER_UPDATE
<< ") results (current print level is 5)"
171 cout
<< "*****************************************************************"
172 << "************************" << endl
;
173 cout
<< indent_str
<< "Technology " << core_tech_node
<< " nm" << endl
;
174 if (longer_channel_device
)
175 cout
<< indent_str
<< "Using Long Channel Devices When Appropriate" << endl
;
176 displayInterconnectType(interconnect_projection_type
, indent
);
177 cout
<< indent_str
<< "Target Clock Rate (MHz) " << target_core_clockrate
/ 1e6
<< endl
;
180 cout
<< "*****************************************************************"
181 << "************************" << endl
;
183 McPATComponent::displayData(indent
, plevel
);
186 void System::set_proc_param() {
187 // TODO: Consider creating a SystemParams class that tracks system-wide
188 // parameters like these
189 longer_channel_device
= false;
192 interconnect_projection_type
= -1;
194 physical_address_width
= -1;
196 int num_children
= xml_data
->nChildNode("param");
198 for (i
= 0; i
< num_children
; i
++) {
199 XMLNode
* paramNode
= xml_data
->getChildNodePtr("param", &i
);
200 XMLCSTR node_name
= paramNode
->getAttribute("name");
201 XMLCSTR value
= paramNode
->getAttribute("value");
204 warnMissingParamName(paramNode
->getAttribute("id"));
206 ASSIGN_FP_IF("core_tech_node", core_tech_node
);
207 ASSIGN_INT_IF("target_core_clockrate", target_core_clockrate
);
208 ASSIGN_INT_IF("temperature", temperature
);
209 ASSIGN_INT_IF("device_type", device_type
);
210 ASSIGN_INT_IF("longer_channel_device", longer_channel_device
);
211 ASSIGN_INT_IF("interconnect_projection_type",
212 interconnect_projection_type
);
213 ASSIGN_INT_IF("machine_bits", data_path_width
);
214 ASSIGN_INT_IF("virtual_address_width", virtual_address_width
);
215 ASSIGN_INT_IF("physical_address_width", physical_address_width
);
216 ASSIGN_INT_IF("virtual_memory_page_size", virtual_memory_page_size
);
217 ASSIGN_INT_IF("wire_is_mat_type", interface_ip
.wire_is_mat_type
);
218 ASSIGN_INT_IF("wire_os_mat_type", interface_ip
.wire_os_mat_type
);
219 ASSIGN_INT_IF("delay_wt", interface_ip
.delay_wt
);
220 ASSIGN_INT_IF("area_wt", interface_ip
.area_wt
);
221 ASSIGN_INT_IF("dynamic_power_wt", interface_ip
.dynamic_power_wt
);
222 ASSIGN_INT_IF("leakage_power_wt", interface_ip
.leakage_power_wt
);
223 ASSIGN_INT_IF("cycle_time_wt", interface_ip
.cycle_time_wt
);
224 ASSIGN_INT_IF("delay_dev", interface_ip
.delay_dev
);
225 ASSIGN_INT_IF("area_dev", interface_ip
.area_dev
);
226 ASSIGN_INT_IF("dynamic_power_dev", interface_ip
.dynamic_power_dev
);
227 ASSIGN_INT_IF("leakage_power_dev", interface_ip
.leakage_power_dev
);
228 ASSIGN_INT_IF("cycle_time_dev", interface_ip
.cycle_time_dev
);
229 ASSIGN_INT_IF("ed", interface_ip
.ed
);
230 ASSIGN_INT_IF("burst_len", interface_ip
.burst_len
);
231 ASSIGN_INT_IF("int_prefetch_w", interface_ip
.int_prefetch_w
);
232 ASSIGN_INT_IF("page_sz_bits", interface_ip
.page_sz_bits
);
233 ASSIGN_ENUM_IF("rpters_in_htree", interface_ip
.rpters_in_htree
, bool);
234 ASSIGN_INT_IF("ver_htree_wires_over_array",
235 interface_ip
.ver_htree_wires_over_array
);
236 ASSIGN_INT_IF("broadcast_addr_din_over_ver_htrees",
237 interface_ip
.broadcast_addr_din_over_ver_htrees
);
238 ASSIGN_INT_IF("nuca", interface_ip
.nuca
);
239 ASSIGN_INT_IF("nuca_bank_count", interface_ip
.nuca_bank_count
);
240 ASSIGN_ENUM_IF("force_cache_config",
241 interface_ip
.force_cache_config
, bool);
242 ASSIGN_ENUM_IF("wt", interface_ip
.wt
, Wire_type
);
243 ASSIGN_INT_IF("force_wiretype", interface_ip
.force_wiretype
);
244 ASSIGN_INT_IF("print_detail", interface_ip
.print_detail
);
245 ASSIGN_ENUM_IF("add_ecc_b_", interface_ip
.add_ecc_b_
, bool);
248 warnUnrecognizedParam(node_name
);
252 // Change from MHz to Hz
253 target_core_clockrate
*= 1e6
;
254 interconnect_projection_type
=
255 (interconnect_projection_type
== 0) ? 0 : 1;
257 num_children
= xml_data
->nChildNode("stat");
258 for (i
= 0; i
< num_children
; i
++) {
259 XMLNode
* statNode
= xml_data
->getChildNodePtr("stat", &i
);
260 XMLCSTR node_name
= statNode
->getAttribute("name");
261 XMLCSTR value
= statNode
->getAttribute("value");
264 warnMissingStatName(statNode
->getAttribute("id"));
266 ASSIGN_FP_IF("total_cycles", total_cycles
);
269 warnUnrecognizedStat(node_name
);
273 if (temperature
< 0) {
274 errorUnspecifiedParam("temperature");
277 if (core_tech_node
< 0) {
278 errorUnspecifiedParam("core_tech_node");
281 if (interconnect_projection_type
< 0) {
282 errorUnspecifiedParam("interconnect_projection_type");
285 if (device_type
< 0) {
286 errorUnspecifiedParam("device_type");
289 if (physical_address_width
<= 0) {
290 errorNonPositiveParam("physical_address_width");
293 if (data_path_width
<= 0) {
294 errorNonPositiveParam("machine_bits");
297 if (total_cycles
<= 0) {
298 fprintf(stderr
, "WARNING: total_cycles <= 0 in system component, ",
299 "power numbers will be funky...\n");
302 clockRate
= target_core_clockrate
;
303 execution_time
= total_cycles
/ (target_core_clockrate
);
305 /* Basic parameters*/
306 interface_ip
.data_arr_ram_cell_tech_type
= device_type
;
307 interface_ip
.data_arr_peri_global_tech_type
= device_type
;
308 interface_ip
.tag_arr_ram_cell_tech_type
= device_type
;
309 interface_ip
.tag_arr_peri_global_tech_type
= device_type
;
311 interface_ip
.ic_proj_type
= interconnect_projection_type
;
312 interface_ip
.temp
= temperature
;
313 interface_ip
.F_sz_nm
= core_tech_node
;
314 interface_ip
.F_sz_um
= interface_ip
.F_sz_nm
/ 1000;
315 interface_ip
.is_main_mem
= false;
317 // These are there just to make CACTI's error_checking() happy.
318 // They are either not actually used or overwritten by each component.
319 interface_ip
.cache_sz
= MIN_BUFFER_SIZE
;
320 interface_ip
.nbanks
= 1;
321 interface_ip
.out_w
= 0;
322 interface_ip
.line_sz
= 1;
323 interface_ip
.assoc
= 1;
324 interface_ip
.num_rw_ports
= 1;
325 interface_ip
.num_search_ports
= 1;
326 interface_ip
.is_cache
= true;
327 interface_ip
.pure_ram
= false;
328 interface_ip
.pure_cam
= false;
331 //This section of code does not have real meaning; it is just to ensure
332 //all data will have initial value to prevent errors.
333 //They will be overridden during each components initialization
334 interface_ip
.specific_tag
= 1;
335 interface_ip
.tag_w
= 64;
336 interface_ip
.access_mode
= 2;
338 interface_ip
.obj_func_dyn_energy
= 0;
339 interface_ip
.obj_func_dyn_power
= 0;
340 interface_ip
.obj_func_leak_power
= 0;
341 interface_ip
.obj_func_cycle_t
= 1;
342 interface_ip
.num_rw_ports
= 1;
343 interface_ip
.num_rd_ports
= 0;
344 interface_ip
.num_wr_ports
= 0;
345 interface_ip
.num_se_rd_ports
= 0;
349 // TODO: Delete children... do this in McPATComponent