includes: sort all includes
[gem5.git] / src / mem / ruby / network / orion / OrionConfig.cc
1 /*
2 * Copyright (c) 2010 Massachusetts Institute of Technology
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;
9 * redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution;
12 * neither the name of the copyright holders nor the names of its
13 * contributors may be used to endorse or promote products derived from
14 * this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 * Authors: Chia-Hsin Owen Chen
29 */
30
31 #include <iostream>
32 #include <string>
33
34 #include "mem/ruby/network/orion/ConfigFile.hh"
35 #include "mem/ruby/network/orion/OrionConfig.hh"
36 #include "mem/ruby/network/orion/TechParameter.hh"
37
38 using namespace std;
39
40 string OrionConfig::ms_param_name[] = {
41 "TECH_NODE",
42 "TRANSISTOR_TYPE",
43 "VDD",
44 "FREQUENCY",
45 "NUM_INPUT_PORT",
46 "NUM_OUTPUT_PORT",
47 "FLIT_WIDTH",
48 "NUM_VIRTUAL_CLASS",
49 "NUM_VIRTUAL_CHANNEL",
50 "IS_IN_SHARED_BUFFER",
51 "IS_OUT_SHARED_BUFFER",
52 "IS_IN_SHARED_SWITCH",
53 "IS_OUT_SHARED_SWITCH",
54 "IS_INPUT_BUFFER",
55 "IN_BUF_MODEL",
56 "IN_BUF_NUM_SET",
57 "IN_BUF_NUM_READ_PORT",
58 "IS_OUTPUT_BUFFER",
59 "OUT_BUF_MODEL",
60 "OUT_BUF_NUM_SET",
61 "OUT_BUF_NUM_WRITE_PORT",
62 "SRAM_NUM_DATA_END",
63 "SRAM_ROWDEC_MODEL",
64 "SRAM_ROWDEC_PRE_MODEL",
65 "SRAM_WORDLINE_MODEL",
66 "SRAM_BITLINE_PRE_MODEL",
67 "SRAM_BITLINE_MODEL",
68 "SRAM_AMP_MODEL",
69 "SRAM_OUTDRV_MODEL",
70 "CROSSBAR_MODEL",
71 "CROSSBAR_CONNECT_TYPE",
72 "CROSSBAR_TRANS_GATE_TYPE",
73 "CROSSBAR_MUX_DEGREE",
74 "CROSSBAR_NUM_IN_SEG",
75 "CROSSBAR_NUM_OUT_SEG",
76 "CROSSBAR_LEN_IN_WIRE",
77 "CROSSBAR_LEN_OUT_WIRE",
78 "VA_MODEL",
79 "VA_IN_ARB_MODEL",
80 "VA_IN_ARB_FF_MODEL",
81 "VA_OUT_ARB_MODEL",
82 "VA_OUT_ARB_FF_MODEL",
83 "VA_BUF_MODEL",
84 "SA_IN_ARB_MODEL",
85 "SA_IN_ARB_FF_MODEL",
86 "SA_OUT_ARB_MODEL",
87 "SA_OUT_ARB_FF_MODEL",
88 "LINK_LENGTH",
89 "WIRE_LAYER_TYPE",
90 "WIRE_WIDTH_SPACING",
91 "WIRE_BUFFERING_MODEL",
92 "WIRE_IS_SHIELDING",
93 "IS_HTREE_CLOCK",
94 "ROUTER_DIAGONAL"
95 };
96
97 OrionConfig::OrionConfig(const string& cfg_fn_)
98 {
99 uint32_t num_param = sizeof(ms_param_name)/sizeof(string);
100
101 for(uint32_t i = 0; i < num_param; i++)
102 {
103 m_params_map[ms_param_name[i]] = "NOT_SET";
104 }
105
106 read_file(cfg_fn_);
107 m_tech_param_ptr = new TechParameter(this);
108 }
109
110 OrionConfig::OrionConfig(const OrionConfig& orion_cfg_)
111 {
112 m_params_map = orion_cfg_.m_params_map;
113 m_num_in_port = orion_cfg_.m_num_in_port;
114 m_num_out_port = orion_cfg_.m_num_out_port;
115 m_num_vclass = orion_cfg_.m_num_vclass;
116 m_num_vchannel = orion_cfg_.m_num_vchannel;
117 m_in_buf_num_set = orion_cfg_.m_in_buf_num_set;
118 m_flit_width = orion_cfg_.m_flit_width;
119
120 m_tech_param_ptr = new TechParameter(this);
121 }
122
123 OrionConfig::~OrionConfig()
124 {
125 delete m_tech_param_ptr;
126 }
127
128 void OrionConfig::set_num_in_port(uint32_t num_in_port_)
129 {
130 m_params_map[string("NUM_INPUT_PORT")] = T_as_string<uint32_t>(num_in_port_);
131 m_num_in_port = num_in_port_;
132 return;
133 }
134
135 void OrionConfig::set_num_out_port(uint32_t num_out_port_)
136 {
137 m_params_map[string("NUM_OUTPUT_PORT")] = T_as_string<uint32_t>(num_out_port_);
138 m_num_out_port = num_out_port_;
139 return;
140 }
141
142 void OrionConfig::set_num_vclass(uint32_t num_vclass_)
143 {
144 m_params_map[string("NUM_VIRTUAL_CLASS")] = T_as_string<uint32_t>(num_vclass_);
145 m_num_vclass = num_vclass_;
146 return;
147 }
148
149 void OrionConfig::set_num_vchannel(uint32_t num_vchannel_)
150 {
151 m_params_map[string("NUM_VIRTUAL_CHANNEL")] = T_as_string<uint32_t>(num_vchannel_);
152 m_num_vchannel = num_vchannel_;
153 return;
154 }
155
156 void OrionConfig::set_in_buf_num_set(uint32_t in_buf_num_set_)
157 {
158 m_params_map[string("IN_BUF_NUM_SET")] = T_as_string<uint32_t>(in_buf_num_set_);
159 m_in_buf_num_set = in_buf_num_set_;
160 return;
161 }
162
163 void OrionConfig::set_flit_width(uint32_t flit_width_)
164 {
165 m_params_map[string("FLIT_WIDTH")] = T_as_string<uint32_t>(flit_width_);
166 m_flit_width = flit_width_;
167 return;
168 }
169
170 void OrionConfig::read_file(
171 const string& filename_
172 )
173 {
174 ConfigFile cfg_file(filename_);
175
176 uint32_t num_param = sizeof(ms_param_name)/sizeof(string);
177 for(uint32_t i = 0; i < num_param; i++)
178 {
179 cfg_file.readInto(m_params_map[ms_param_name[i]], ms_param_name[i]);
180 }
181
182 m_num_in_port = get<uint32_t>("NUM_INPUT_PORT");
183 m_num_out_port = get<uint32_t>("NUM_OUTPUT_PORT");
184 m_num_vclass = get<uint32_t>("NUM_VIRTUAL_CLASS");
185 m_num_vchannel = get<uint32_t>("NUM_VIRTUAL_CHANNEL");
186 m_in_buf_num_set = get<uint32_t>("IN_BUF_NUM_SET");
187 m_flit_width = get<uint32_t>("FLIT_WIDTH");
188 return;
189 }
190
191 void OrionConfig::print_config(ostream& out_)
192 {
193 uint32_t num_param = sizeof(ms_param_name)/sizeof(string);
194
195 for(uint32_t i = 0; i < num_param; i++)
196 {
197 out_ << ms_param_name[i] << " = " << m_params_map[ms_param_name[i]] << endl;
198 }
199 return;
200 }
201