router.cc (10152:52c552138ba1) router.cc (10234:5cb711fa6176)
1/*****************************************************************************
2 * McPAT/CACTI
3 * SOFTWARE LICENSE AGREEMENT
4 * Copyright 2012 Hewlett-Packard Development Company, L.P.
1/*****************************************************************************
2 * McPAT/CACTI
3 * SOFTWARE LICENSE AGREEMENT
4 * Copyright 2012 Hewlett-Packard Development Company, L.P.
5 * Copyright (c) 2010-2013 Advanced Micro Devices, Inc.
5 * All Rights Reserved
6 *
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

--- 7 unchanged lines hidden (view full) ---

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
6 * All Rights Reserved
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions are
10 * met: redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer;
12 * redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the

--- 7 unchanged lines hidden (view full) ---

21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (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.
29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 *
30 ***************************************************************************/
31
32
33
34#include "router.h"
35
36Router::Router(
37 double flit_size_,
38 double vc_buf, /* vc size = vc_buffer_size * flit_size */
39 double vc_c,
40 TechnologyParameter::DeviceType *dt,
41 double I_,
42 double O_,
43 double M_
30 *
31 ***************************************************************************/
32
33
34
35#include "router.h"
36
37Router::Router(
38 double flit_size_,
39 double vc_buf, /* vc size = vc_buffer_size * flit_size */
40 double vc_c,
41 TechnologyParameter::DeviceType *dt,
42 double I_,
43 double O_,
44 double M_
44 ):flit_size(flit_size_),
45 deviceType(dt),
46 I(I_),
47 O(O_),
48 M(M_)
49{
50 vc_buffer_size = vc_buf;
51 vc_count = vc_c;
52 min_w_pmos = deviceType->n_to_p_eff_curr_drv_ratio*g_tp.min_w_nmos_;
53 double technology = g_ip->F_sz_um;
45 ): flit_size(flit_size_),
46 deviceType(dt),
47 I(I_),
48 O(O_),
49 M(M_) {
50 vc_buffer_size = vc_buf;
51 vc_count = vc_c;
52 min_w_pmos = deviceType->n_to_p_eff_curr_drv_ratio * g_tp.min_w_nmos_;
53 double technology = g_ip->F_sz_um;
54
54
55 Vdd = dt->Vdd;
55 Vdd = dt->Vdd;
56
56
57 /*Crossbar parameters. Transmisson gate is employed for connector*/
58 NTtr = 10*technology*1e-6/2; /*Transmission gate's nmos tr. length*/
59 PTtr = 20*technology*1e-6/2; /* pmos tr. length*/
60 wt = 15*technology*1e-6/2; /*track width*/
61 ht = 15*technology*1e-6/2; /*track height*/
57 /*Crossbar parameters. Transmisson gate is employed for connector*/
58 NTtr = 10 * technology * 1e-6 / 2; /*Transmission gate's nmos tr. length*/
59 PTtr = 20 * technology * 1e-6 / 2; /* pmos tr. length*/
60 wt = 15 * technology * 1e-6 / 2; /*track width*/
61 ht = 15 * technology * 1e-6 / 2; /*track height*/
62// I = 5; /*Number of crossbar input ports*/
63// O = 5; /*Number of crossbar output ports*/
62// I = 5; /*Number of crossbar input ports*/
63// O = 5; /*Number of crossbar output ports*/
64 NTi = 12.5*technology*1e-6/2;
65 PTi = 25*technology*1e-6/2;
64 NTi = 12.5 * technology * 1e-6 / 2;
65 PTi = 25 * technology * 1e-6 / 2;
66
66
67 NTid = 60*technology*1e-6/2; //m
68 PTid = 120*technology*1e-6/2; // m
69 NTod = 60*technology*1e-6/2; // m
70 PTod = 120*technology*1e-6/2; // m
67 NTid = 60 * technology * 1e-6 / 2; //m
68 PTid = 120 * technology * 1e-6 / 2; // m
69 NTod = 60 * technology * 1e-6 / 2; // m
70 PTod = 120 * technology * 1e-6 / 2; // m
71
71
72 calc_router_parameters();
72 calc_router_parameters();
73}
74
73}
74
75Router::~Router(){}
75Router::~Router() {}
76
77
78double //wire cap with triple spacing
79Router::Cw3(double length) {
76
77
78double //wire cap with triple spacing
79Router::Cw3(double length) {
80 Wire wc(g_ip->wt, length, 1, 3, 3);
81 return (wc.wire_cap(length));
80 Wire wc(g_ip->wt, length, 1, 3, 3);
81 return (wc.wire_cap(length));
82}
83
84/*Function to calculate the gate capacitance*/
85double
86Router::gate_cap(double w) {
82}
83
84/*Function to calculate the gate capacitance*/
85double
86Router::gate_cap(double w) {
87 return (double) gate_C (w*1e6 /*u*/, 0);
87 return (double) gate_C (w*1e6 /*u*/, 0);
88}
89
90/*Function to calculate the diffusion capacitance*/
91double
92Router::diff_cap(double w, int type /*0 for n-mos and 1 for p-mos*/,
88}
89
90/*Function to calculate the diffusion capacitance*/
91double
92Router::diff_cap(double w, int type /*0 for n-mos and 1 for p-mos*/,
93 double s /*number of stacking transistors*/) {
94 return (double) drain_C_(w*1e6 /*u*/, type, (int) s, 1, g_tp.cell_h_def);
93 double s /*number of stacking transistors*/) {
94 return (double) drain_C_(w*1e6 /*u*/, type, (int) s, 1, g_tp.cell_h_def);
95}
96
97
98/*crossbar related functions */
99
100// Model for simple transmission gate
101double
102Router::transmission_buf_inpcap() {
95}
96
97
98/*crossbar related functions */
99
100// Model for simple transmission gate
101double
102Router::transmission_buf_inpcap() {
103 return diff_cap(NTtr, 0, 1)+diff_cap(PTtr, 1, 1);
103 return diff_cap(NTtr, 0, 1) + diff_cap(PTtr, 1, 1);
104}
105
106double
107Router::transmission_buf_outcap() {
104}
105
106double
107Router::transmission_buf_outcap() {
108 return diff_cap(NTtr, 0, 1)+diff_cap(PTtr, 1, 1);
108 return diff_cap(NTtr, 0, 1) + diff_cap(PTtr, 1, 1);
109}
110
111double
112Router::transmission_buf_ctrcap() {
109}
110
111double
112Router::transmission_buf_ctrcap() {
113 return gate_cap(NTtr)+gate_cap(PTtr);
113 return gate_cap(NTtr) + gate_cap(PTtr);
114}
115
116double
117Router::crossbar_inpline() {
114}
115
116double
117Router::crossbar_inpline() {
118 return (Cw3(O*flit_size*wt) + O*transmission_buf_inpcap() + gate_cap(NTid) +
119 gate_cap(PTid) + diff_cap(NTid, 0, 1) + diff_cap(PTid, 1, 1));
118 return (Cw3(O*flit_size*wt) + O*transmission_buf_inpcap() + gate_cap(NTid) +
119 gate_cap(PTid) + diff_cap(NTid, 0, 1) + diff_cap(PTid, 1, 1));
120}
121
122double
123Router::crossbar_outline() {
120}
121
122double
123Router::crossbar_outline() {
124 return (Cw3(I*flit_size*ht) + I*transmission_buf_outcap() + gate_cap(NTod) +
125 gate_cap(PTod) + diff_cap(NTod, 0, 1) + diff_cap(PTod, 1, 1));
124 return (Cw3(I*flit_size*ht) + I*transmission_buf_outcap() + gate_cap(NTod) +
125 gate_cap(PTod) + diff_cap(NTod, 0, 1) + diff_cap(PTod, 1, 1));
126}
127
128double
129Router::crossbar_ctrline() {
126}
127
128double
129Router::crossbar_ctrline() {
130 return (Cw3(0.5*O*flit_size*wt) + flit_size*transmission_buf_ctrcap() +
131 diff_cap(NTi, 0, 1) + diff_cap(PTi, 1, 1) +
132 gate_cap(NTi) + gate_cap(PTi));
130 return (Cw3(0.5*O*flit_size*wt) + flit_size*transmission_buf_ctrcap() +
131 diff_cap(NTi, 0, 1) + diff_cap(PTi, 1, 1) +
132 gate_cap(NTi) + gate_cap(PTi));
133}
134
135double
136Router::tr_crossbar_power() {
133}
134
135double
136Router::tr_crossbar_power() {
137 return (crossbar_inpline()*Vdd*Vdd*flit_size/2 +
138 crossbar_outline()*Vdd*Vdd*flit_size/2)*2;
137 return (crossbar_inpline()*Vdd*Vdd*flit_size / 2 +
138 crossbar_outline()*Vdd*Vdd*flit_size / 2) * 2;
139}
140
139}
140
141void Router::buffer_stats()
142{
143 DynamicParameter dyn_p;
144 dyn_p.is_tag = false;
145 dyn_p.pure_cam = false;
146 dyn_p.fully_assoc = false;
147 dyn_p.pure_ram = true;
148 dyn_p.is_dram = false;
149 dyn_p.is_main_mem = false;
150 dyn_p.num_subarrays = 1;
151 dyn_p.num_mats = 1;
152 dyn_p.Ndbl = 1;
153 dyn_p.Ndwl = 1;
154 dyn_p.Nspd = 1;
155 dyn_p.deg_bl_muxing = 1;
156 dyn_p.deg_senseamp_muxing_non_associativity = 1;
157 dyn_p.Ndsam_lev_1 = 1;
158 dyn_p.Ndsam_lev_2 = 1;
159 dyn_p.Ndcm = 1;
160 dyn_p.number_addr_bits_mat = 8;
161 dyn_p.number_way_select_signals_mat = 1;
162 dyn_p.number_subbanks_decode = 0;
163 dyn_p.num_act_mats_hor_dir = 1;
164 dyn_p.V_b_sense = Vdd; // FIXME check power calc.
165 dyn_p.ram_cell_tech_type = 0;
166 dyn_p.num_r_subarray = (int) vc_buffer_size;
167 dyn_p.num_c_subarray = (int) flit_size * (int) vc_count;
168 dyn_p.num_mats_h_dir = 1;
169 dyn_p.num_mats_v_dir = 1;
170 dyn_p.num_do_b_subbank = (int)flit_size;
171 dyn_p.num_di_b_subbank = (int)flit_size;
172 dyn_p.num_do_b_mat = (int) flit_size;
173 dyn_p.num_di_b_mat = (int) flit_size;
174 dyn_p.num_do_b_mat = (int) flit_size;
175 dyn_p.num_di_b_mat = (int) flit_size;
176 dyn_p.num_do_b_bank_per_port = (int) flit_size;
177 dyn_p.num_di_b_bank_per_port = (int) flit_size;
178 dyn_p.out_w = (int) flit_size;
141void Router::buffer_stats() {
142 DynamicParameter dyn_p;
143 dyn_p.is_tag = false;
144 dyn_p.pure_cam = false;
145 dyn_p.fully_assoc = false;
146 dyn_p.pure_ram = true;
147 dyn_p.is_dram = false;
148 dyn_p.is_main_mem = false;
149 dyn_p.num_subarrays = 1;
150 dyn_p.num_mats = 1;
151 dyn_p.Ndbl = 1;
152 dyn_p.Ndwl = 1;
153 dyn_p.Nspd = 1;
154 dyn_p.deg_bl_muxing = 1;
155 dyn_p.deg_senseamp_muxing_non_associativity = 1;
156 dyn_p.Ndsam_lev_1 = 1;
157 dyn_p.Ndsam_lev_2 = 1;
158 dyn_p.Ndcm = 1;
159 dyn_p.number_addr_bits_mat = 8;
160 dyn_p.number_way_select_signals_mat = 1;
161 dyn_p.number_subbanks_decode = 0;
162 dyn_p.num_act_mats_hor_dir = 1;
163 dyn_p.V_b_sense = Vdd; // FIXME check power calc.
164 dyn_p.ram_cell_tech_type = 0;
165 dyn_p.num_r_subarray = (int) vc_buffer_size;
166 dyn_p.num_c_subarray = (int) flit_size * (int) vc_count;
167 dyn_p.num_mats_h_dir = 1;
168 dyn_p.num_mats_v_dir = 1;
169 dyn_p.num_do_b_subbank = (int)flit_size;
170 dyn_p.num_di_b_subbank = (int)flit_size;
171 dyn_p.num_do_b_mat = (int) flit_size;
172 dyn_p.num_di_b_mat = (int) flit_size;
173 dyn_p.num_do_b_mat = (int) flit_size;
174 dyn_p.num_di_b_mat = (int) flit_size;
175 dyn_p.num_do_b_bank_per_port = (int) flit_size;
176 dyn_p.num_di_b_bank_per_port = (int) flit_size;
177 dyn_p.out_w = (int) flit_size;
179
178
180 dyn_p.use_inp_params = 1;
181 dyn_p.num_wr_ports = (unsigned int) vc_count;
182 dyn_p.num_rd_ports = 1;//(unsigned int) vc_count;//based on Bill Dally's book
183 dyn_p.num_rw_ports = 0;
184 dyn_p.num_se_rd_ports =0;
185 dyn_p.num_search_ports =0;
179 dyn_p.use_inp_params = 1;
180 dyn_p.num_wr_ports = (unsigned int) vc_count;
181 dyn_p.num_rd_ports = 1;//(unsigned int) vc_count;//based on Bill Dally's book
182 dyn_p.num_rw_ports = 0;
183 dyn_p.num_se_rd_ports = 0;
184 dyn_p.num_search_ports = 0;
186
187
188
185
186
187
189 dyn_p.cell.h = g_tp.sram.b_h + 2 * g_tp.wire_outside_mat.pitch * (dyn_p.num_wr_ports +
190 dyn_p.num_rw_ports - 1 + dyn_p.num_rd_ports);
191 dyn_p.cell.w = g_tp.sram.b_w + 2 * g_tp.wire_outside_mat.pitch * (dyn_p.num_rw_ports - 1 +
192 (dyn_p.num_rd_ports - dyn_p.num_se_rd_ports) +
193 dyn_p.num_wr_ports) + g_tp.wire_outside_mat.pitch * dyn_p.num_se_rd_ports;
188 dyn_p.cell.h = g_tp.sram.b_h + 2 * g_tp.wire_outside_mat.pitch * (dyn_p.num_wr_ports +
189 dyn_p.num_rw_ports - 1 + dyn_p.num_rd_ports);
190 dyn_p.cell.w = g_tp.sram.b_w + 2 * g_tp.wire_outside_mat.pitch * (dyn_p.num_rw_ports - 1 +
191 (dyn_p.num_rd_ports - dyn_p.num_se_rd_ports) +
192 dyn_p.num_wr_ports) + g_tp.wire_outside_mat.pitch * dyn_p.num_se_rd_ports;
194
193
195 Mat buff(dyn_p);
196 buff.compute_delays(0);
197 buff.compute_power_energy();
198 buffer.power.readOp = buff.power.readOp;
199 buffer.power.writeOp = buffer.power.readOp; //FIXME
200 buffer.area = buff.area;
194 Mat buff(dyn_p);
195 buff.compute_delays(0);
196 buff.compute_power_energy();
197 buffer.power.readOp = buff.power.readOp;
198 buffer.power.writeOp = buffer.power.readOp; //FIXME
199 buffer.area = buff.area;
201}
202
203
204
200}
201
202
203
205 void
206Router::cb_stats ()
207{
208 if (1) {
209 Crossbar c_b(I, O, flit_size);
210 c_b.compute_power();
211 crossbar.delay = c_b.delay;
212 crossbar.power.readOp.dynamic = c_b.power.readOp.dynamic;
213 crossbar.power.readOp.leakage = c_b.power.readOp.leakage;
214 crossbar.power.readOp.gate_leakage = c_b.power.readOp.gate_leakage;
215 crossbar.area = c_b.area;
204void
205Router::cb_stats () {
206 if (1) {
207 Crossbar c_b(I, O, flit_size);
208 c_b.compute_power();
209 crossbar.delay = c_b.delay;
210 crossbar.power.readOp.dynamic = c_b.power.readOp.dynamic;
211 crossbar.power.readOp.leakage = c_b.power.readOp.leakage;
212 crossbar.power.readOp.gate_leakage = c_b.power.readOp.gate_leakage;
213 crossbar.area = c_b.area;
216// c_b.print_crossbar();
214// c_b.print_crossbar();
217 }
218 else {
219 crossbar.power.readOp.dynamic = tr_crossbar_power();
220 crossbar.power.readOp.leakage = flit_size * I * O *
221 cmos_Isub_leakage(NTtr*g_tp.min_w_nmos_, PTtr*min_w_pmos, 1, tg);
222 crossbar.power.readOp.gate_leakage = flit_size * I * O *
223 cmos_Ig_leakage(NTtr*g_tp.min_w_nmos_, PTtr*min_w_pmos, 1, tg);
224 }
215 } else {
216 crossbar.power.readOp.dynamic = tr_crossbar_power();
217 crossbar.power.readOp.leakage = flit_size * I * O *
218 cmos_Isub_leakage(NTtr * g_tp.min_w_nmos_, PTtr * min_w_pmos, 1, tg);
219 crossbar.power.readOp.gate_leakage = flit_size * I * O *
220 cmos_Ig_leakage(NTtr * g_tp.min_w_nmos_, PTtr * min_w_pmos, 1, tg);
221 }
225}
226
227void
222}
223
224void
228Router::get_router_power()
229{
230 /* calculate buffer stats */
231 buffer_stats();
225Router::get_router_power() {
226 /* calculate buffer stats */
227 buffer_stats();
232
228
233 /* calculate cross-bar stats */
234 cb_stats();
229 /* calculate cross-bar stats */
230 cb_stats();
235
231
236 /* calculate arbiter stats */
237 Arbiter vcarb(vc_count, flit_size, buffer.area.w);
238 Arbiter cbarb(I, flit_size, crossbar.area.w);
239 vcarb.compute_power();
240 cbarb.compute_power();
241 arbiter.power.readOp.dynamic = vcarb.power.readOp.dynamic * I +
242 cbarb.power.readOp.dynamic * O;
243 arbiter.power.readOp.leakage = vcarb.power.readOp.leakage * I +
244 cbarb.power.readOp.leakage * O;
245 arbiter.power.readOp.gate_leakage = vcarb.power.readOp.gate_leakage * I +
246 cbarb.power.readOp.gate_leakage * O;
232 /* calculate arbiter stats */
233 Arbiter vcarb(vc_count, flit_size, buffer.area.w);
234 Arbiter cbarb(I, flit_size, crossbar.area.w);
235 vcarb.compute_power();
236 cbarb.compute_power();
237 arbiter.power.readOp.dynamic = vcarb.power.readOp.dynamic * I +
238 cbarb.power.readOp.dynamic * O;
239 arbiter.power.readOp.leakage = vcarb.power.readOp.leakage * I +
240 cbarb.power.readOp.leakage * O;
241 arbiter.power.readOp.gate_leakage = vcarb.power.readOp.gate_leakage * I +
242 cbarb.power.readOp.gate_leakage * O;
247
248// arb_stats();
243
244// arb_stats();
249 power.readOp.dynamic = ((buffer.power.readOp.dynamic+buffer.power.writeOp.dynamic) +
250 crossbar.power.readOp.dynamic +
251 arbiter.power.readOp.dynamic)*MIN(I, O)*M;
252 double pppm_t[4] = {1,I,I,1};
253 power = power + (buffer.power*pppm_t + crossbar.power + arbiter.power)*pppm_lkg;
245 power.readOp.dynamic = ((buffer.power.readOp.dynamic +
246 buffer.power.writeOp.dynamic) +
247 crossbar.power.readOp.dynamic +
248 arbiter.power.readOp.dynamic) * MIN(I, O) * M;
249 double pppm_t[4] = {1, I, I, 1};
250 power = power + (buffer.power * pppm_t + crossbar.power + arbiter.power) *
251 pppm_lkg;
254
255}
256
252
253}
254
257 void
258Router::get_router_delay ()
259{
260 FREQUENCY=5; // move this to config file --TODO
261 cycle_time = (1/(double)FREQUENCY)*1e3; //ps
262 delay = 4;
263 max_cyc = 17 * g_tp.FO4; //s
264 max_cyc *= 1e12; //ps
265 if (cycle_time < max_cyc) {
266 FREQUENCY = (1/max_cyc)*1e3; //GHz
267 }
255void
256Router::get_router_delay () {
257 FREQUENCY = 5; // move this to config file --TODO
258 cycle_time = (1 / (double)FREQUENCY) * 1e3; //ps
259 delay = 4;
260 max_cyc = 17 * g_tp.FO4; //s
261 max_cyc *= 1e12; //ps
262 if (cycle_time < max_cyc) {
263 FREQUENCY = (1 / max_cyc) * 1e3; //GHz
264 }
268}
269
265}
266
270 void
271Router::get_router_area()
272{
273 area.h = I*buffer.area.h;
274 area.w = buffer.area.w+crossbar.area.w;
267void
268Router::get_router_area() {
269 area.h = I * buffer.area.h;
270 area.w = buffer.area.w + crossbar.area.w;
275}
276
271}
272
277 void
278Router::calc_router_parameters()
279{
280 /* calculate router frequency and pipeline cycles */
281 get_router_delay();
273void
274Router::calc_router_parameters() {
275 /* calculate router frequency and pipeline cycles */
276 get_router_delay();
282
277
283 /* router power stats */
284 get_router_power();
278 /* router power stats */
279 get_router_power();
285
280
286 /* area stats */
287 get_router_area();
281 /* area stats */
282 get_router_area();
288}
289
283}
284
290 void
291Router::print_router()
292{
293 cout << "\n\nRouter stats:\n";
294 cout << "\tRouter Area - "<< area.get_area()*1e-6<<"(mm^2)\n";
295 cout << "\tMaximum possible network frequency - " << (1/max_cyc)*1e3 << "GHz\n";
296 cout << "\tNetwork frequency - " << FREQUENCY <<" GHz\n";
297 cout << "\tNo. of Virtual channels - " << vc_count << "\n";
298 cout << "\tNo. of pipeline stages - " << delay << endl;
299 cout << "\tLink bandwidth - " << flit_size << " (bits)\n";
300 cout << "\tNo. of buffer entries per virtual channel - "<< vc_buffer_size << "\n";
301 cout << "\tSimple buffer Area - "<< buffer.area.get_area()*1e-6<<"(mm^2)\n";
302 cout << "\tSimple buffer access (Read) - " << buffer.power.readOp.dynamic * 1e9 <<" (nJ)\n";
303 cout << "\tSimple buffer leakage - " << buffer.power.readOp.leakage * 1e3 <<" (mW)\n";
304 cout << "\tCrossbar Area - "<< crossbar.area.get_area()*1e-6<<"(mm^2)\n";
305 cout << "\tCross bar access energy - " << crossbar.power.readOp.dynamic * 1e9<<" (nJ)\n";
306 cout << "\tCross bar leakage power - " << crossbar.power.readOp.leakage * 1e3<<" (mW)\n";
307 cout << "\tArbiter access energy (VC arb + Crossbar arb) - "<<arbiter.power.readOp.dynamic * 1e9 <<" (nJ)\n";
308 cout << "\tArbiter leakage (VC arb + Crossbar arb) - "<<arbiter.power.readOp.leakage * 1e3 <<" (mW)\n";
285void
286Router::print_router() {
287 cout << "\n\nRouter stats:\n";
288 cout << "\tRouter Area - " << area.get_area()*1e-6 << "(mm^2)\n";
289 cout << "\tMaximum possible network frequency - " << (1 / max_cyc)*1e3
290 << "GHz\n";
291 cout << "\tNetwork frequency - " << FREQUENCY << " GHz\n";
292 cout << "\tNo. of Virtual channels - " << vc_count << "\n";
293 cout << "\tNo. of pipeline stages - " << delay << endl;
294 cout << "\tLink bandwidth - " << flit_size << " (bits)\n";
295 cout << "\tNo. of buffer entries per virtual channel - "
296 << vc_buffer_size << "\n";
297 cout << "\tSimple buffer Area - " << buffer.area.get_area()*1e-6
298 << "(mm^2)\n";
299 cout << "\tSimple buffer access (Read) - "
300 << buffer.power.readOp.dynamic * 1e9 << " (nJ)\n";
301 cout << "\tSimple buffer leakage - " << buffer.power.readOp.leakage * 1e3
302 << " (mW)\n";
303 cout << "\tCrossbar Area - " << crossbar.area.get_area()*1e-6
304 << "(mm^2)\n";
305 cout << "\tCross bar access energy - "
306 << crossbar.power.readOp.dynamic * 1e9 << " (nJ)\n";
307 cout << "\tCross bar leakage power - "
308 << crossbar.power.readOp.leakage * 1e3 << " (mW)\n";
309 cout << "\tArbiter access energy (VC arb + Crossbar arb) - "
310 << arbiter.power.readOp.dynamic * 1e9 << " (nJ)\n";
311 cout << "\tArbiter leakage (VC arb + Crossbar arb) - "
312 << arbiter.power.readOp.leakage * 1e3 << " (mW)\n";
309
310}
311
313
314}
315