io.cc revision 10152
110152Satgutier@umich.edu/*****************************************************************************
210152Satgutier@umich.edu *                                McPAT/CACTI
310152Satgutier@umich.edu *                      SOFTWARE LICENSE AGREEMENT
410152Satgutier@umich.edu *            Copyright 2012 Hewlett-Packard Development Company, L.P.
510152Satgutier@umich.edu *                          All Rights Reserved
610152Satgutier@umich.edu *
710152Satgutier@umich.edu * Redistribution and use in source and binary forms, with or without
810152Satgutier@umich.edu * modification, are permitted provided that the following conditions are
910152Satgutier@umich.edu * met: redistributions of source code must retain the above copyright
1010152Satgutier@umich.edu * notice, this list of conditions and the following disclaimer;
1110152Satgutier@umich.edu * redistributions in binary form must reproduce the above copyright
1210152Satgutier@umich.edu * notice, this list of conditions and the following disclaimer in the
1310152Satgutier@umich.edu * documentation and/or other materials provided with the distribution;
1410152Satgutier@umich.edu * neither the name of the copyright holders nor the names of its
1510152Satgutier@umich.edu * contributors may be used to endorse or promote products derived from
1610152Satgutier@umich.edu * this software without specific prior written permission.
1710152Satgutier@umich.edu
1810152Satgutier@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1910152Satgutier@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2010152Satgutier@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2110152Satgutier@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2210152Satgutier@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2310152Satgutier@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2410152Satgutier@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2510152Satgutier@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2610152Satgutier@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2710152Satgutier@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2810152Satgutier@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.”
2910152Satgutier@umich.edu *
3010152Satgutier@umich.edu ***************************************************************************/
3110152Satgutier@umich.edu
3210152Satgutier@umich.edu
3310152Satgutier@umich.edu
3410152Satgutier@umich.edu#include <fstream>
3510152Satgutier@umich.edu#include <iostream>
3610152Satgutier@umich.edu#include <sstream>
3710152Satgutier@umich.edu
3810152Satgutier@umich.edu#include "Ucache.h"
3910152Satgutier@umich.edu#include "arbiter.h"
4010152Satgutier@umich.edu#include "area.h"
4110152Satgutier@umich.edu#include "basic_circuit.h"
4210152Satgutier@umich.edu#include "crossbar.h"
4310152Satgutier@umich.edu#include "io.h"
4410152Satgutier@umich.edu#include "nuca.h"
4510152Satgutier@umich.edu#include "parameter.h"
4610152Satgutier@umich.edu//#include "highradix.h"
4710152Satgutier@umich.edu
4810152Satgutier@umich.eduusing namespace std;
4910152Satgutier@umich.edu
5010152Satgutier@umich.edu
5110152Satgutier@umich.edu/* Parses "cache.cfg" file */
5210152Satgutier@umich.edu  void
5310152Satgutier@umich.eduInputParameter::parse_cfg(const string & in_file)
5410152Satgutier@umich.edu{
5510152Satgutier@umich.edu  FILE *fp = fopen(in_file.c_str(), "r");
5610152Satgutier@umich.edu  char line[5000];
5710152Satgutier@umich.edu  char jk[5000];
5810152Satgutier@umich.edu  char temp_var[5000];
5910152Satgutier@umich.edu
6010152Satgutier@umich.edu  if(!fp) {
6110152Satgutier@umich.edu    cout << in_file << " is missing!\n";
6210152Satgutier@umich.edu    exit(-1);
6310152Satgutier@umich.edu  }
6410152Satgutier@umich.edu
6510152Satgutier@umich.edu  while(fscanf(fp, "%[^\n]\n", line) != EOF) {
6610152Satgutier@umich.edu
6710152Satgutier@umich.edu    if (!strncmp("-size", line, strlen("-size"))) {
6810152Satgutier@umich.edu      sscanf(line, "-size %[(:-~)*]%u", jk, &(cache_sz));
6910152Satgutier@umich.edu      continue;
7010152Satgutier@umich.edu    }
7110152Satgutier@umich.edu
7210152Satgutier@umich.edu    if (!strncmp("-page size", line, strlen("-page size"))) {
7310152Satgutier@umich.edu      sscanf(line, "-page size %[(:-~)*]%u", jk, &(page_sz_bits));
7410152Satgutier@umich.edu      continue;
7510152Satgutier@umich.edu    }
7610152Satgutier@umich.edu
7710152Satgutier@umich.edu    if (!strncmp("-burst length", line, strlen("-burst length"))) {
7810152Satgutier@umich.edu      sscanf(line, "-burst %[(:-~)*]%u", jk, &(burst_len));
7910152Satgutier@umich.edu      continue;
8010152Satgutier@umich.edu    }
8110152Satgutier@umich.edu
8210152Satgutier@umich.edu    if (!strncmp("-internal prefetch width", line, strlen("-internal prefetch width"))) {
8310152Satgutier@umich.edu      sscanf(line, "-internal prefetch %[(:-~)*]%u", jk, &(int_prefetch_w));
8410152Satgutier@umich.edu      continue;
8510152Satgutier@umich.edu    }
8610152Satgutier@umich.edu
8710152Satgutier@umich.edu    if (!strncmp("-block", line, strlen("-block"))) {
8810152Satgutier@umich.edu      sscanf(line, "-block size (bytes) %d", &(line_sz));
8910152Satgutier@umich.edu      continue;
9010152Satgutier@umich.edu    }
9110152Satgutier@umich.edu
9210152Satgutier@umich.edu    if (!strncmp("-associativity", line, strlen("-associativity"))) {
9310152Satgutier@umich.edu      sscanf(line, "-associativity %d", &(assoc));
9410152Satgutier@umich.edu      continue;
9510152Satgutier@umich.edu    }
9610152Satgutier@umich.edu
9710152Satgutier@umich.edu    if (!strncmp("-read-write", line, strlen("-read-write"))) {
9810152Satgutier@umich.edu      sscanf(line, "-read-write port %d", &(num_rw_ports));
9910152Satgutier@umich.edu      continue;
10010152Satgutier@umich.edu    }
10110152Satgutier@umich.edu
10210152Satgutier@umich.edu    if (!strncmp("-exclusive read", line, strlen("exclusive read"))) {
10310152Satgutier@umich.edu      sscanf(line, "-exclusive read port %d", &(num_rd_ports));
10410152Satgutier@umich.edu      continue;
10510152Satgutier@umich.edu    }
10610152Satgutier@umich.edu
10710152Satgutier@umich.edu    if(!strncmp("-exclusive write", line, strlen("-exclusive write"))) {
10810152Satgutier@umich.edu      sscanf(line, "-exclusive write port %d", &(num_wr_ports));
10910152Satgutier@umich.edu      continue;
11010152Satgutier@umich.edu    }
11110152Satgutier@umich.edu
11210152Satgutier@umich.edu    if (!strncmp("-single ended", line, strlen("-single ended"))) {
11310152Satgutier@umich.edu      sscanf(line, "-single %[(:-~)*]%d", jk,
11410152Satgutier@umich.edu          &(num_se_rd_ports));
11510152Satgutier@umich.edu      continue;
11610152Satgutier@umich.edu    }
11710152Satgutier@umich.edu
11810152Satgutier@umich.edu    if (!strncmp("-search", line, strlen("-search"))) {
11910152Satgutier@umich.edu      sscanf(line, "-search port %d", &(num_search_ports));
12010152Satgutier@umich.edu      continue;
12110152Satgutier@umich.edu    }
12210152Satgutier@umich.edu
12310152Satgutier@umich.edu    if (!strncmp("-UCA bank", line, strlen("-UCA bank"))) {
12410152Satgutier@umich.edu      sscanf(line, "-UCA bank%[((:-~)| )*]%d", jk, &(nbanks));
12510152Satgutier@umich.edu      continue;
12610152Satgutier@umich.edu    }
12710152Satgutier@umich.edu
12810152Satgutier@umich.edu    if (!strncmp("-technology", line, strlen("-technology"))) {
12910152Satgutier@umich.edu      sscanf(line, "-technology (u) %lf", &(F_sz_um));
13010152Satgutier@umich.edu      F_sz_nm = F_sz_um*1000;
13110152Satgutier@umich.edu      continue;
13210152Satgutier@umich.edu    }
13310152Satgutier@umich.edu
13410152Satgutier@umich.edu    if (!strncmp("-output/input", line, strlen("-output/input"))) {
13510152Satgutier@umich.edu      sscanf(line, "-output/input bus %[(:-~)*]%d", jk, &(out_w));
13610152Satgutier@umich.edu      continue;
13710152Satgutier@umich.edu    }
13810152Satgutier@umich.edu
13910152Satgutier@umich.edu    if (!strncmp("-operating temperature", line, strlen("-operating temperature"))) {
14010152Satgutier@umich.edu      sscanf(line, "-operating temperature %[(:-~)*]%d", jk, &(temp));
14110152Satgutier@umich.edu      continue;
14210152Satgutier@umich.edu    }
14310152Satgutier@umich.edu
14410152Satgutier@umich.edu    if (!strncmp("-cache type", line, strlen("-cache type"))) {
14510152Satgutier@umich.edu      sscanf(line, "-cache type%[^\"]\"%[^\"]\"", jk, temp_var);
14610152Satgutier@umich.edu
14710152Satgutier@umich.edu      if (!strncmp("cache", temp_var, sizeof("cache"))) {
14810152Satgutier@umich.edu        is_cache = true;
14910152Satgutier@umich.edu      }
15010152Satgutier@umich.edu      else
15110152Satgutier@umich.edu      {
15210152Satgutier@umich.edu        is_cache = false;
15310152Satgutier@umich.edu      }
15410152Satgutier@umich.edu
15510152Satgutier@umich.edu      if (!strncmp("main memory", temp_var, sizeof("main memory"))) {
15610152Satgutier@umich.edu        is_main_mem = true;
15710152Satgutier@umich.edu      }
15810152Satgutier@umich.edu      else {
15910152Satgutier@umich.edu        is_main_mem = false;
16010152Satgutier@umich.edu      }
16110152Satgutier@umich.edu
16210152Satgutier@umich.edu      if (!strncmp("cam", temp_var, sizeof("cam"))) {
16310152Satgutier@umich.edu        pure_cam = true;
16410152Satgutier@umich.edu      }
16510152Satgutier@umich.edu      else {
16610152Satgutier@umich.edu        pure_cam = false;
16710152Satgutier@umich.edu      }
16810152Satgutier@umich.edu
16910152Satgutier@umich.edu      if (!strncmp("ram", temp_var, sizeof("ram"))) {
17010152Satgutier@umich.edu        pure_ram = true;
17110152Satgutier@umich.edu      }
17210152Satgutier@umich.edu      else {
17310152Satgutier@umich.edu          if (!is_main_mem)
17410152Satgutier@umich.edu                  pure_ram = false;
17510152Satgutier@umich.edu          else
17610152Satgutier@umich.edu                  pure_ram = true;
17710152Satgutier@umich.edu      }
17810152Satgutier@umich.edu
17910152Satgutier@umich.edu      continue;
18010152Satgutier@umich.edu    }
18110152Satgutier@umich.edu
18210152Satgutier@umich.edu
18310152Satgutier@umich.edu    if (!strncmp("-tag size", line, strlen("-tag size"))) {
18410152Satgutier@umich.edu      sscanf(line, "-tag size%[^\"]\"%[^\"]\"", jk, temp_var);
18510152Satgutier@umich.edu      if (!strncmp("default", temp_var, sizeof("default"))) {
18610152Satgutier@umich.edu        specific_tag = false;
18710152Satgutier@umich.edu        tag_w = 42; /* the acutal value is calculated
18810152Satgutier@umich.edu                     * later based on the cache size, bank count, and associativity
18910152Satgutier@umich.edu                     */
19010152Satgutier@umich.edu      }
19110152Satgutier@umich.edu      else {
19210152Satgutier@umich.edu        specific_tag = true;
19310152Satgutier@umich.edu        sscanf(line, "-tag size (b) %d", &(tag_w));
19410152Satgutier@umich.edu      }
19510152Satgutier@umich.edu      continue;
19610152Satgutier@umich.edu    }
19710152Satgutier@umich.edu
19810152Satgutier@umich.edu    if (!strncmp("-access mode", line, strlen("-access mode"))) {
19910152Satgutier@umich.edu      sscanf(line, "-access %[^\"]\"%[^\"]\"", jk, temp_var);
20010152Satgutier@umich.edu      if (!strncmp("fast", temp_var, strlen("fast"))) {
20110152Satgutier@umich.edu        access_mode = 2;
20210152Satgutier@umich.edu      }
20310152Satgutier@umich.edu      else if (!strncmp("sequential", temp_var, strlen("sequential"))) {
20410152Satgutier@umich.edu        access_mode = 1;
20510152Satgutier@umich.edu      }
20610152Satgutier@umich.edu      else if(!strncmp("normal", temp_var, strlen("normal"))) {
20710152Satgutier@umich.edu        access_mode = 0;
20810152Satgutier@umich.edu      }
20910152Satgutier@umich.edu      else {
21010152Satgutier@umich.edu        cout << "ERROR: Invalid access mode!\n";
21110152Satgutier@umich.edu        exit(0);
21210152Satgutier@umich.edu      }
21310152Satgutier@umich.edu      continue;
21410152Satgutier@umich.edu    }
21510152Satgutier@umich.edu
21610152Satgutier@umich.edu    if (!strncmp("-Data array cell type", line, strlen("-Data array cell type"))) {
21710152Satgutier@umich.edu      sscanf(line, "-Data array cell type %[^\"]\"%[^\"]\"", jk, temp_var);
21810152Satgutier@umich.edu
21910152Satgutier@umich.edu      if(!strncmp("itrs-hp", temp_var, strlen("itrs-hp"))) {
22010152Satgutier@umich.edu        data_arr_ram_cell_tech_type = 0;
22110152Satgutier@umich.edu      }
22210152Satgutier@umich.edu      else if(!strncmp("itrs-lstp", temp_var, strlen("itrs-lstp"))) {
22310152Satgutier@umich.edu        data_arr_ram_cell_tech_type = 1;
22410152Satgutier@umich.edu      }
22510152Satgutier@umich.edu      else if(!strncmp("itrs-lop", temp_var, strlen("itrs-lop"))) {
22610152Satgutier@umich.edu        data_arr_ram_cell_tech_type = 2;
22710152Satgutier@umich.edu      }
22810152Satgutier@umich.edu      else if(!strncmp("lp-dram", temp_var, strlen("lp-dram"))) {
22910152Satgutier@umich.edu        data_arr_ram_cell_tech_type = 3;
23010152Satgutier@umich.edu      }
23110152Satgutier@umich.edu      else if(!strncmp("comm-dram", temp_var, strlen("comm-dram"))) {
23210152Satgutier@umich.edu        data_arr_ram_cell_tech_type = 4;
23310152Satgutier@umich.edu      }
23410152Satgutier@umich.edu      else {
23510152Satgutier@umich.edu        cout << "ERROR: Invalid type!\n";
23610152Satgutier@umich.edu        exit(0);
23710152Satgutier@umich.edu      }
23810152Satgutier@umich.edu      continue;
23910152Satgutier@umich.edu    }
24010152Satgutier@umich.edu
24110152Satgutier@umich.edu    if (!strncmp("-Data array peripheral type", line, strlen("-Data array peripheral type"))) {
24210152Satgutier@umich.edu      sscanf(line, "-Data array peripheral type %[^\"]\"%[^\"]\"", jk, temp_var);
24310152Satgutier@umich.edu
24410152Satgutier@umich.edu      if(!strncmp("itrs-hp", temp_var, strlen("itrs-hp"))) {
24510152Satgutier@umich.edu        data_arr_peri_global_tech_type = 0;
24610152Satgutier@umich.edu      }
24710152Satgutier@umich.edu      else if(!strncmp("itrs-lstp", temp_var, strlen("itrs-lstp"))) {
24810152Satgutier@umich.edu        data_arr_peri_global_tech_type = 1;
24910152Satgutier@umich.edu      }
25010152Satgutier@umich.edu      else if(!strncmp("itrs-lop", temp_var, strlen("itrs-lop"))) {
25110152Satgutier@umich.edu        data_arr_peri_global_tech_type = 2;
25210152Satgutier@umich.edu      }
25310152Satgutier@umich.edu      else {
25410152Satgutier@umich.edu        cout << "ERROR: Invalid type!\n";
25510152Satgutier@umich.edu        exit(0);
25610152Satgutier@umich.edu      }
25710152Satgutier@umich.edu      continue;
25810152Satgutier@umich.edu    }
25910152Satgutier@umich.edu
26010152Satgutier@umich.edu    if (!strncmp("-Tag array cell type", line, strlen("-Tag array cell type"))) {
26110152Satgutier@umich.edu      sscanf(line, "-Tag array cell type %[^\"]\"%[^\"]\"", jk, temp_var);
26210152Satgutier@umich.edu
26310152Satgutier@umich.edu      if(!strncmp("itrs-hp", temp_var, strlen("itrs-hp"))) {
26410152Satgutier@umich.edu        tag_arr_ram_cell_tech_type = 0;
26510152Satgutier@umich.edu      }
26610152Satgutier@umich.edu      else if(!strncmp("itrs-lstp", temp_var, strlen("itrs-lstp"))) {
26710152Satgutier@umich.edu        tag_arr_ram_cell_tech_type = 1;
26810152Satgutier@umich.edu      }
26910152Satgutier@umich.edu      else if(!strncmp("itrs-lop", temp_var, strlen("itrs-lop"))) {
27010152Satgutier@umich.edu        tag_arr_ram_cell_tech_type = 2;
27110152Satgutier@umich.edu      }
27210152Satgutier@umich.edu      else if(!strncmp("lp-dram", temp_var, strlen("lp-dram"))) {
27310152Satgutier@umich.edu        tag_arr_ram_cell_tech_type = 3;
27410152Satgutier@umich.edu      }
27510152Satgutier@umich.edu      else if(!strncmp("comm-dram", temp_var, strlen("comm-dram"))) {
27610152Satgutier@umich.edu        tag_arr_ram_cell_tech_type = 4;
27710152Satgutier@umich.edu      }
27810152Satgutier@umich.edu      else {
27910152Satgutier@umich.edu        cout << "ERROR: Invalid type!\n";
28010152Satgutier@umich.edu        exit(0);
28110152Satgutier@umich.edu      }
28210152Satgutier@umich.edu      continue;
28310152Satgutier@umich.edu    }
28410152Satgutier@umich.edu
28510152Satgutier@umich.edu    if (!strncmp("-Tag array peripheral type", line, strlen("-Tag array peripheral type"))) {
28610152Satgutier@umich.edu      sscanf(line, "-Tag array peripheral type %[^\"]\"%[^\"]\"", jk, temp_var);
28710152Satgutier@umich.edu
28810152Satgutier@umich.edu      if(!strncmp("itrs-hp", temp_var, strlen("itrs-hp"))) {
28910152Satgutier@umich.edu        tag_arr_peri_global_tech_type = 0;
29010152Satgutier@umich.edu      }
29110152Satgutier@umich.edu      else if(!strncmp("itrs-lstp", temp_var, strlen("itrs-lstp"))) {
29210152Satgutier@umich.edu        tag_arr_peri_global_tech_type = 1;
29310152Satgutier@umich.edu      }
29410152Satgutier@umich.edu      else if(!strncmp("itrs-lop", temp_var, strlen("itrs-lop"))) {
29510152Satgutier@umich.edu        tag_arr_peri_global_tech_type = 2;
29610152Satgutier@umich.edu      }
29710152Satgutier@umich.edu      else {
29810152Satgutier@umich.edu        cout << "ERROR: Invalid type!\n";
29910152Satgutier@umich.edu        exit(0);
30010152Satgutier@umich.edu      }
30110152Satgutier@umich.edu      continue;
30210152Satgutier@umich.edu    }
30310152Satgutier@umich.edu    if(!strncmp("-design", line, strlen("-design"))) {
30410152Satgutier@umich.edu      sscanf(line, "-%[((:-~)| |,)*]%d:%d:%d:%d:%d", jk,
30510152Satgutier@umich.edu          &(delay_wt), &(dynamic_power_wt),
30610152Satgutier@umich.edu          &(leakage_power_wt),
30710152Satgutier@umich.edu          &(cycle_time_wt), &(area_wt));
30810152Satgutier@umich.edu      continue;
30910152Satgutier@umich.edu    }
31010152Satgutier@umich.edu
31110152Satgutier@umich.edu    if(!strncmp("-deviate", line, strlen("-deviate"))) {
31210152Satgutier@umich.edu      sscanf(line, "-%[((:-~)| |,)*]%d:%d:%d:%d:%d", jk,
31310152Satgutier@umich.edu          &(delay_dev), &(dynamic_power_dev),
31410152Satgutier@umich.edu          &(leakage_power_dev),
31510152Satgutier@umich.edu          &(cycle_time_dev), &(area_dev));
31610152Satgutier@umich.edu      continue;
31710152Satgutier@umich.edu    }
31810152Satgutier@umich.edu
31910152Satgutier@umich.edu    if(!strncmp("-Optimize", line, strlen("-Optimize"))) {
32010152Satgutier@umich.edu      sscanf(line, "-Optimize  %[^\"]\"%[^\"]\"", jk, temp_var);
32110152Satgutier@umich.edu
32210152Satgutier@umich.edu      if(!strncmp("ED^2", temp_var, strlen("ED^2"))) {
32310152Satgutier@umich.edu        ed = 2;
32410152Satgutier@umich.edu      }
32510152Satgutier@umich.edu      else if(!strncmp("ED", temp_var, strlen("ED"))) {
32610152Satgutier@umich.edu        ed = 1;
32710152Satgutier@umich.edu      }
32810152Satgutier@umich.edu      else {
32910152Satgutier@umich.edu        ed = 0;
33010152Satgutier@umich.edu      }
33110152Satgutier@umich.edu    }
33210152Satgutier@umich.edu
33310152Satgutier@umich.edu    if(!strncmp("-NUCAdesign", line, strlen("-NUCAdesign"))) {
33410152Satgutier@umich.edu      sscanf(line, "-%[((:-~)| |,)*]%d:%d:%d:%d:%d", jk,
33510152Satgutier@umich.edu          &(delay_wt_nuca), &(dynamic_power_wt_nuca),
33610152Satgutier@umich.edu          &(leakage_power_wt_nuca),
33710152Satgutier@umich.edu          &(cycle_time_wt_nuca), &(area_wt_nuca));
33810152Satgutier@umich.edu      continue;
33910152Satgutier@umich.edu    }
34010152Satgutier@umich.edu
34110152Satgutier@umich.edu    if(!strncmp("-NUCAdeviate", line, strlen("-NUCAdeviate"))) {
34210152Satgutier@umich.edu      sscanf(line, "-%[((:-~)| |,)*]%d:%d:%d:%d:%d", jk,
34310152Satgutier@umich.edu          &(delay_dev_nuca), &(dynamic_power_dev_nuca),
34410152Satgutier@umich.edu          &(leakage_power_dev_nuca),
34510152Satgutier@umich.edu          &(cycle_time_dev_nuca), &(area_dev_nuca));
34610152Satgutier@umich.edu      continue;
34710152Satgutier@umich.edu    }
34810152Satgutier@umich.edu
34910152Satgutier@umich.edu    if(!strncmp("-Cache model", line, strlen("-cache model"))) {
35010152Satgutier@umich.edu      sscanf(line, "-Cache model %[^\"]\"%[^\"]\"", jk, temp_var);
35110152Satgutier@umich.edu
35210152Satgutier@umich.edu      if (!strncmp("UCA", temp_var, strlen("UCA"))) {
35310152Satgutier@umich.edu        nuca = 0;
35410152Satgutier@umich.edu      }
35510152Satgutier@umich.edu      else {
35610152Satgutier@umich.edu        nuca = 1;
35710152Satgutier@umich.edu      }
35810152Satgutier@umich.edu      continue;
35910152Satgutier@umich.edu    }
36010152Satgutier@umich.edu
36110152Satgutier@umich.edu    if(!strncmp("-NUCA bank", line, strlen("-NUCA bank"))) {
36210152Satgutier@umich.edu      sscanf(line, "-NUCA bank count %d", &(nuca_bank_count));
36310152Satgutier@umich.edu
36410152Satgutier@umich.edu      if (nuca_bank_count != 0) {
36510152Satgutier@umich.edu        force_nuca_bank = 1;
36610152Satgutier@umich.edu      }
36710152Satgutier@umich.edu      continue;
36810152Satgutier@umich.edu    }
36910152Satgutier@umich.edu
37010152Satgutier@umich.edu    if(!strncmp("-Wire inside mat", line, strlen("-Wire inside mat"))) {
37110152Satgutier@umich.edu      sscanf(line, "-Wire%[^\"]\"%[^\"]\"", jk, temp_var);
37210152Satgutier@umich.edu
37310152Satgutier@umich.edu      if (!strncmp("global", temp_var, strlen("global"))) {
37410152Satgutier@umich.edu        wire_is_mat_type = 2;
37510152Satgutier@umich.edu        continue;
37610152Satgutier@umich.edu      }
37710152Satgutier@umich.edu      else if (!strncmp("local", temp_var, strlen("local"))) {
37810152Satgutier@umich.edu        wire_is_mat_type = 0;
37910152Satgutier@umich.edu        continue;
38010152Satgutier@umich.edu      }
38110152Satgutier@umich.edu      else {
38210152Satgutier@umich.edu        wire_is_mat_type = 1;
38310152Satgutier@umich.edu        continue;
38410152Satgutier@umich.edu      }
38510152Satgutier@umich.edu    }
38610152Satgutier@umich.edu
38710152Satgutier@umich.edu    if(!strncmp("-Wire outside mat", line, strlen("-Wire outside mat"))) {
38810152Satgutier@umich.edu      sscanf(line, "-Wire%[^\"]\"%[^\"]\"", jk, temp_var);
38910152Satgutier@umich.edu
39010152Satgutier@umich.edu      if (!strncmp("global", temp_var, strlen("global"))) {
39110152Satgutier@umich.edu        wire_os_mat_type = 2;
39210152Satgutier@umich.edu      }
39310152Satgutier@umich.edu      else {
39410152Satgutier@umich.edu        wire_os_mat_type = 1;
39510152Satgutier@umich.edu      }
39610152Satgutier@umich.edu      continue;
39710152Satgutier@umich.edu    }
39810152Satgutier@umich.edu
39910152Satgutier@umich.edu    if(!strncmp("-Interconnect projection", line, strlen("-Interconnect projection"))) {
40010152Satgutier@umich.edu      sscanf(line, "-Interconnect projection%[^\"]\"%[^\"]\"", jk, temp_var);
40110152Satgutier@umich.edu
40210152Satgutier@umich.edu      if (!strncmp("aggressive", temp_var, strlen("aggressive"))) {
40310152Satgutier@umich.edu        ic_proj_type = 0;
40410152Satgutier@umich.edu      }
40510152Satgutier@umich.edu      else {
40610152Satgutier@umich.edu        ic_proj_type = 1;
40710152Satgutier@umich.edu      }
40810152Satgutier@umich.edu      continue;
40910152Satgutier@umich.edu    }
41010152Satgutier@umich.edu
41110152Satgutier@umich.edu    if(!strncmp("-Wire signalling", line, strlen("-wire signalling"))) {
41210152Satgutier@umich.edu      sscanf(line, "-Wire%[^\"]\"%[^\"]\"", jk, temp_var);
41310152Satgutier@umich.edu
41410152Satgutier@umich.edu      if (!strncmp("default", temp_var, strlen("default"))) {
41510152Satgutier@umich.edu        force_wiretype = 0;
41610152Satgutier@umich.edu        wt = Global;
41710152Satgutier@umich.edu      }
41810152Satgutier@umich.edu      else if (!(strncmp("Global_10", temp_var, strlen("Global_10")))) {
41910152Satgutier@umich.edu        force_wiretype = 1;
42010152Satgutier@umich.edu        wt = Global_10;
42110152Satgutier@umich.edu      }
42210152Satgutier@umich.edu      else if (!(strncmp("Global_20", temp_var, strlen("Global_20")))) {
42310152Satgutier@umich.edu        force_wiretype = 1;
42410152Satgutier@umich.edu        wt = Global_20;
42510152Satgutier@umich.edu      }
42610152Satgutier@umich.edu      else if (!(strncmp("Global_30", temp_var, strlen("Global_30")))) {
42710152Satgutier@umich.edu        force_wiretype = 1;
42810152Satgutier@umich.edu        wt = Global_30;
42910152Satgutier@umich.edu      }
43010152Satgutier@umich.edu      else if (!(strncmp("Global_5", temp_var, strlen("Global_5")))) {
43110152Satgutier@umich.edu        force_wiretype = 1;
43210152Satgutier@umich.edu        wt = Global_5;
43310152Satgutier@umich.edu      }
43410152Satgutier@umich.edu      else if (!(strncmp("Global", temp_var, strlen("Global")))) {
43510152Satgutier@umich.edu        force_wiretype = 1;
43610152Satgutier@umich.edu        wt = Global;
43710152Satgutier@umich.edu      }
43810152Satgutier@umich.edu      else {
43910152Satgutier@umich.edu        wt = Low_swing;
44010152Satgutier@umich.edu        force_wiretype = 1;
44110152Satgutier@umich.edu      }
44210152Satgutier@umich.edu      continue;
44310152Satgutier@umich.edu    }
44410152Satgutier@umich.edu
44510152Satgutier@umich.edu
44610152Satgutier@umich.edu
44710152Satgutier@umich.edu    if(!strncmp("-Core", line, strlen("-Core"))) {
44810152Satgutier@umich.edu      sscanf(line, "-Core count %d\n", &(cores));
44910152Satgutier@umich.edu      if (cores > 16) {
45010152Satgutier@umich.edu        printf("No. of cores should be less than 16!\n");
45110152Satgutier@umich.edu      }
45210152Satgutier@umich.edu      continue;
45310152Satgutier@umich.edu    }
45410152Satgutier@umich.edu
45510152Satgutier@umich.edu    if(!strncmp("-Cache level", line, strlen("-Cache level"))) {
45610152Satgutier@umich.edu      sscanf(line, "-Cache l%[^\"]\"%[^\"]\"", jk, temp_var);
45710152Satgutier@umich.edu      if (!strncmp("L2", temp_var, strlen("L2"))) {
45810152Satgutier@umich.edu        cache_level = 0;
45910152Satgutier@umich.edu      }
46010152Satgutier@umich.edu      else {
46110152Satgutier@umich.edu        cache_level = 1;
46210152Satgutier@umich.edu      }
46310152Satgutier@umich.edu    }
46410152Satgutier@umich.edu
46510152Satgutier@umich.edu    if(!strncmp("-Print level", line, strlen("-Print level"))) {
46610152Satgutier@umich.edu      sscanf(line, "-Print l%[^\"]\"%[^\"]\"", jk, temp_var);
46710152Satgutier@umich.edu      if (!strncmp("DETAILED", temp_var, strlen("DETAILED"))) {
46810152Satgutier@umich.edu        print_detail = 1;
46910152Satgutier@umich.edu      }
47010152Satgutier@umich.edu      else {
47110152Satgutier@umich.edu        print_detail = 0;
47210152Satgutier@umich.edu      }
47310152Satgutier@umich.edu
47410152Satgutier@umich.edu    }
47510152Satgutier@umich.edu    if(!strncmp("-Add ECC", line, strlen("-Add ECC"))) {
47610152Satgutier@umich.edu      sscanf(line, "-Add ECC %[^\"]\"%[^\"]\"", jk, temp_var);
47710152Satgutier@umich.edu      if (!strncmp("true", temp_var, strlen("true"))) {
47810152Satgutier@umich.edu        add_ecc_b_ = true;
47910152Satgutier@umich.edu      }
48010152Satgutier@umich.edu      else {
48110152Satgutier@umich.edu        add_ecc_b_ = false;
48210152Satgutier@umich.edu      }
48310152Satgutier@umich.edu    }
48410152Satgutier@umich.edu
48510152Satgutier@umich.edu    if(!strncmp("-Print input parameters", line, strlen("-Print input parameters"))) {
48610152Satgutier@umich.edu      sscanf(line, "-Print input %[^\"]\"%[^\"]\"", jk, temp_var);
48710152Satgutier@umich.edu      if (!strncmp("true", temp_var, strlen("true"))) {
48810152Satgutier@umich.edu        print_input_args = true;
48910152Satgutier@umich.edu      }
49010152Satgutier@umich.edu      else {
49110152Satgutier@umich.edu        print_input_args = false;
49210152Satgutier@umich.edu      }
49310152Satgutier@umich.edu    }
49410152Satgutier@umich.edu
49510152Satgutier@umich.edu    if(!strncmp("-Force cache config", line, strlen("-Force cache config"))) {
49610152Satgutier@umich.edu      sscanf(line, "-Force cache %[^\"]\"%[^\"]\"", jk, temp_var);
49710152Satgutier@umich.edu      if (!strncmp("true", temp_var, strlen("true"))) {
49810152Satgutier@umich.edu        force_cache_config = true;
49910152Satgutier@umich.edu      }
50010152Satgutier@umich.edu      else {
50110152Satgutier@umich.edu        force_cache_config = false;
50210152Satgutier@umich.edu      }
50310152Satgutier@umich.edu    }
50410152Satgutier@umich.edu
50510152Satgutier@umich.edu    if(!strncmp("-Ndbl", line, strlen("-Ndbl"))) {
50610152Satgutier@umich.edu      sscanf(line, "-Ndbl %d\n", &(ndbl));
50710152Satgutier@umich.edu      continue;
50810152Satgutier@umich.edu    }
50910152Satgutier@umich.edu    if(!strncmp("-Ndwl", line, strlen("-Ndwl"))) {
51010152Satgutier@umich.edu      sscanf(line, "-Ndwl %d\n", &(ndwl));
51110152Satgutier@umich.edu      continue;
51210152Satgutier@umich.edu    }
51310152Satgutier@umich.edu    if(!strncmp("-Nspd", line, strlen("-Nspd"))) {
51410152Satgutier@umich.edu      sscanf(line, "-Nspd %d\n", &(nspd));
51510152Satgutier@umich.edu      continue;
51610152Satgutier@umich.edu    }
51710152Satgutier@umich.edu    if(!strncmp("-Ndsam1", line, strlen("-Ndsam1"))) {
51810152Satgutier@umich.edu      sscanf(line, "-Ndsam1 %d\n", &(ndsam1));
51910152Satgutier@umich.edu      continue;
52010152Satgutier@umich.edu    }
52110152Satgutier@umich.edu    if(!strncmp("-Ndsam2", line, strlen("-Ndsam2"))) {
52210152Satgutier@umich.edu      sscanf(line, "-Ndsam2 %d\n", &(ndsam2));
52310152Satgutier@umich.edu      continue;
52410152Satgutier@umich.edu    }
52510152Satgutier@umich.edu   if(!strncmp("-Ndcm", line, strlen("-Ndcm"))) {
52610152Satgutier@umich.edu      sscanf(line, "-Ndcm %d\n", &(ndcm));
52710152Satgutier@umich.edu      continue;
52810152Satgutier@umich.edu    }
52910152Satgutier@umich.edu
53010152Satgutier@umich.edu  }
53110152Satgutier@umich.edu  rpters_in_htree = true;
53210152Satgutier@umich.edu  fclose(fp);
53310152Satgutier@umich.edu}
53410152Satgutier@umich.edu
53510152Satgutier@umich.edu  void
53610152Satgutier@umich.eduInputParameter::display_ip()
53710152Satgutier@umich.edu{
53810152Satgutier@umich.edu  cout << "Cache size                    : " << cache_sz << endl;
53910152Satgutier@umich.edu  cout << "Block size                    : " << line_sz << endl;
54010152Satgutier@umich.edu  cout << "Associativity                 : " << assoc << endl;
54110152Satgutier@umich.edu  cout << "Read only ports               : " << num_rd_ports << endl;
54210152Satgutier@umich.edu  cout << "Write only ports              : " << num_wr_ports << endl;
54310152Satgutier@umich.edu  cout << "Read write ports              : " << num_rw_ports << endl;
54410152Satgutier@umich.edu  cout << "Single ended read ports       : " << num_se_rd_ports << endl;
54510152Satgutier@umich.edu  if (fully_assoc||pure_cam)
54610152Satgutier@umich.edu  {
54710152Satgutier@umich.edu          cout << "Search ports                  : " << num_search_ports << endl;
54810152Satgutier@umich.edu  }
54910152Satgutier@umich.edu  cout << "Cache banks (UCA)             : " << nbanks << endl;
55010152Satgutier@umich.edu  cout << "Technology                    : " << F_sz_um << endl;
55110152Satgutier@umich.edu  cout << "Temperature                   : " << temp << endl;
55210152Satgutier@umich.edu  cout << "Tag size                      : " << tag_w << endl;
55310152Satgutier@umich.edu  if (is_cache) {
55410152Satgutier@umich.edu    cout << "array type                    : " << "Cache" << endl;
55510152Satgutier@umich.edu  }
55610152Satgutier@umich.edu  if (pure_ram) {
55710152Satgutier@umich.edu    cout << "array type                    : " << "Scratch RAM" << endl;
55810152Satgutier@umich.edu  }
55910152Satgutier@umich.edu  if (pure_cam)
56010152Satgutier@umich.edu  {
56110152Satgutier@umich.edu      cout << "array type                    : " << "CAM" << endl;
56210152Satgutier@umich.edu  }
56310152Satgutier@umich.edu  cout << "Model as memory               : " << is_main_mem << endl;
56410152Satgutier@umich.edu  cout << "Access mode                   : " << access_mode << endl;
56510152Satgutier@umich.edu  cout << "Data array cell type          : " << data_arr_ram_cell_tech_type << endl;
56610152Satgutier@umich.edu  cout << "Data array peripheral type    : " << data_arr_peri_global_tech_type << endl;
56710152Satgutier@umich.edu  cout << "Tag array cell type           : " << tag_arr_ram_cell_tech_type << endl;
56810152Satgutier@umich.edu  cout << "Tag array peripheral type     : " << tag_arr_peri_global_tech_type << endl;
56910152Satgutier@umich.edu  cout << "Optimization target           : " << ed << endl;
57010152Satgutier@umich.edu  cout << "Design objective (UCA wt)     : " << delay_wt << " "
57110152Satgutier@umich.edu                                                << dynamic_power_wt << " " << leakage_power_wt << " " << cycle_time_wt
57210152Satgutier@umich.edu                                                << " " << area_wt << endl;
57310152Satgutier@umich.edu  cout << "Design objective (UCA dev)    : " << delay_dev << " "
57410152Satgutier@umich.edu                                                << dynamic_power_dev << " " << leakage_power_dev << " " << cycle_time_dev
57510152Satgutier@umich.edu                                                << " " << area_dev << endl;
57610152Satgutier@umich.edu  if (nuca)
57710152Satgutier@umich.edu    {
57810152Satgutier@umich.edu    cout << "Cores                         : " << cores << endl;
57910152Satgutier@umich.edu
58010152Satgutier@umich.edu
58110152Satgutier@umich.edu    cout << "Design objective (NUCA wt)    : " << delay_wt_nuca << " "
58210152Satgutier@umich.edu                                                << dynamic_power_wt_nuca << " " << leakage_power_wt_nuca << " " << cycle_time_wt_nuca
58310152Satgutier@umich.edu                                                << " " << area_wt_nuca << endl;
58410152Satgutier@umich.edu    cout << "Design objective (NUCA dev)   : " << delay_dev_nuca << " "
58510152Satgutier@umich.edu                                                << dynamic_power_dev_nuca << " " << leakage_power_dev_nuca << " " << cycle_time_dev_nuca
58610152Satgutier@umich.edu                                       << " " << area_dev_nuca << endl;
58710152Satgutier@umich.edu    }
58810152Satgutier@umich.edu  cout << "Cache model                   : " << nuca << endl;
58910152Satgutier@umich.edu  cout << "Nuca bank                     : " << nuca_bank_count << endl;
59010152Satgutier@umich.edu  cout << "Wire inside mat               : " << wire_is_mat_type << endl;
59110152Satgutier@umich.edu  cout << "Wire outside mat              : " << wire_os_mat_type << endl;
59210152Satgutier@umich.edu  cout << "Interconnect projection       : " << ic_proj_type << endl;
59310152Satgutier@umich.edu  cout << "Wire signalling               : " << force_wiretype << endl;
59410152Satgutier@umich.edu  cout << "Print level                   : " << print_detail << endl;
59510152Satgutier@umich.edu  cout << "ECC overhead                  : " << add_ecc_b_ << endl;
59610152Satgutier@umich.edu  cout << "Page size                     : " << page_sz_bits << endl;
59710152Satgutier@umich.edu  cout << "Burst length                  : " << burst_len << endl;
59810152Satgutier@umich.edu  cout << "Internal prefetch width       : " << int_prefetch_w << endl;
59910152Satgutier@umich.edu  cout << "Force cache config            : " << g_ip->force_cache_config << endl;
60010152Satgutier@umich.edu  if (g_ip->force_cache_config) {
60110152Satgutier@umich.edu    cout << "Ndwl                          : " << g_ip->ndwl << endl;
60210152Satgutier@umich.edu    cout << "Ndbl                          : " << g_ip->ndbl << endl;
60310152Satgutier@umich.edu    cout << "Nspd                          : " << g_ip->nspd << endl;
60410152Satgutier@umich.edu    cout << "Ndcm                          : " << g_ip->ndcm << endl;
60510152Satgutier@umich.edu    cout << "Ndsam1                        : " << g_ip->ndsam1 << endl;
60610152Satgutier@umich.edu    cout << "Ndsam2                        : " << g_ip->ndsam2 << endl;
60710152Satgutier@umich.edu  }
60810152Satgutier@umich.edu}
60910152Satgutier@umich.edu
61010152Satgutier@umich.edu
61110152Satgutier@umich.edu
61210152Satgutier@umich.edupowerComponents operator+(const powerComponents & x, const powerComponents & y)
61310152Satgutier@umich.edu{
61410152Satgutier@umich.edu  powerComponents z;
61510152Satgutier@umich.edu
61610152Satgutier@umich.edu  z.dynamic = x.dynamic + y.dynamic;
61710152Satgutier@umich.edu  z.leakage = x.leakage + y.leakage;
61810152Satgutier@umich.edu  z.gate_leakage  = x.gate_leakage  + y.gate_leakage;
61910152Satgutier@umich.edu  z.short_circuit = x.short_circuit + y.short_circuit;
62010152Satgutier@umich.edu  z.longer_channel_leakage = x.longer_channel_leakage + y.longer_channel_leakage;
62110152Satgutier@umich.edu
62210152Satgutier@umich.edu  return z;
62310152Satgutier@umich.edu}
62410152Satgutier@umich.edu
62510152Satgutier@umich.edupowerComponents operator*(const powerComponents & x, double const * const y)
62610152Satgutier@umich.edu{
62710152Satgutier@umich.edu  powerComponents z;
62810152Satgutier@umich.edu
62910152Satgutier@umich.edu  z.dynamic = x.dynamic*y[0];
63010152Satgutier@umich.edu  z.leakage = x.leakage*y[1];
63110152Satgutier@umich.edu  z.gate_leakage  = x.gate_leakage*y[2];
63210152Satgutier@umich.edu  z.short_circuit = x.short_circuit*y[3];
63310152Satgutier@umich.edu  z.longer_channel_leakage = x.longer_channel_leakage*y[1];//longer channel leakage has the same behavior as normal leakage
63410152Satgutier@umich.edu
63510152Satgutier@umich.edu  return z;
63610152Satgutier@umich.edu}
63710152Satgutier@umich.edu
63810152Satgutier@umich.edu
63910152Satgutier@umich.edupowerDef operator+(const powerDef & x, const powerDef & y)
64010152Satgutier@umich.edu{
64110152Satgutier@umich.edu  powerDef z;
64210152Satgutier@umich.edu
64310152Satgutier@umich.edu  z.readOp   = x.readOp  + y.readOp;
64410152Satgutier@umich.edu  z.writeOp  = x.writeOp + y.writeOp;
64510152Satgutier@umich.edu  z.searchOp = x.searchOp + y.searchOp;
64610152Satgutier@umich.edu  return z;
64710152Satgutier@umich.edu}
64810152Satgutier@umich.edu
64910152Satgutier@umich.edupowerDef operator*(const powerDef & x, double const * const y)
65010152Satgutier@umich.edu{
65110152Satgutier@umich.edu  powerDef z;
65210152Satgutier@umich.edu
65310152Satgutier@umich.edu  z.readOp   = x.readOp*y;
65410152Satgutier@umich.edu  z.writeOp  = x.writeOp*y;
65510152Satgutier@umich.edu  z.searchOp = x.searchOp*y;
65610152Satgutier@umich.edu  return z;
65710152Satgutier@umich.edu}
65810152Satgutier@umich.edu
65910152Satgutier@umich.eduuca_org_t cacti_interface(const string & infile_name)
66010152Satgutier@umich.edu{
66110152Satgutier@umich.edu
66210152Satgutier@umich.edu  uca_org_t fin_res;
66310152Satgutier@umich.edu  //uca_org_t result;
66410152Satgutier@umich.edu  fin_res.valid = false;
66510152Satgutier@umich.edu
66610152Satgutier@umich.edu  g_ip = new InputParameter();
66710152Satgutier@umich.edu  g_ip->parse_cfg(infile_name);
66810152Satgutier@umich.edu  if(!g_ip->error_checking())
66910152Satgutier@umich.edu          exit(0);
67010152Satgutier@umich.edu  if (g_ip->print_input_args)
67110152Satgutier@umich.edu    g_ip->display_ip();
67210152Satgutier@umich.edu
67310152Satgutier@umich.edu  init_tech_params(g_ip->F_sz_um, false);
67410152Satgutier@umich.edu  Wire winit; // Do not delete this line. It initializes wires.
67510152Satgutier@umich.edu
67610152Satgutier@umich.edu
67710152Satgutier@umich.edu//  For HighRadix Only
67810152Satgutier@umich.edu//  ////  Wire wirea(g_ip->wt, 1000);
67910152Satgutier@umich.edu//  ////  wirea.print_wire();
68010152Satgutier@umich.edu//  ////  cout << "Wire Area " << wirea.area.get_area() << " sq. u" << endl;
68110152Satgutier@umich.edu//  //  winit.print_wire();
68210152Satgutier@umich.edu//  //
68310152Satgutier@umich.edu//    HighRadix *hr;
68410152Satgutier@umich.edu//      hr = new HighRadix();
68510152Satgutier@umich.edu//      hr->compute_power();
68610152Satgutier@umich.edu//      hr->print_router();
68710152Satgutier@umich.edu//    exit(0);
68810152Satgutier@umich.edu//
68910152Satgutier@umich.edu//    double sub_switch_sz = 2;
69010152Satgutier@umich.edu//    double rows = 32;
69110152Satgutier@umich.edu//    for (int i=0; i<6; i++) {
69210152Satgutier@umich.edu//      sub_switch_sz = pow(2, i);
69310152Satgutier@umich.edu//      rows = 64/sub_switch_sz;
69410152Satgutier@umich.edu//      hr = new HighRadix(sub_switch_sz, rows, .8/* freq */, 64, 2, 64, 0.7);
69510152Satgutier@umich.edu//      hr->compute_power();
69610152Satgutier@umich.edu//      hr->print_router();
69710152Satgutier@umich.edu//      delete hr;
69810152Satgutier@umich.edu//    }
69910152Satgutier@umich.edu//  //  HighRadix yarc;
70010152Satgutier@umich.edu//  //  yarc.compute_power();
70110152Satgutier@umich.edu//  //  yarc.print_router();
70210152Satgutier@umich.edu//    winit.print_wire();
70310152Satgutier@umich.edu//    exit(0);
70410152Satgutier@umich.edu//  For HighRadix Only End
70510152Satgutier@umich.edu
70610152Satgutier@umich.edu  if (g_ip->nuca == 1)
70710152Satgutier@umich.edu  {
70810152Satgutier@umich.edu    Nuca n(&g_tp.peri_global);
70910152Satgutier@umich.edu    n.sim_nuca();
71010152Satgutier@umich.edu  }
71110152Satgutier@umich.edu  g_ip->display_ip();
71210152Satgutier@umich.edu  solve(&fin_res);
71310152Satgutier@umich.edu
71410152Satgutier@umich.edu  output_UCA(&fin_res);
71510152Satgutier@umich.edu  output_data_csv(fin_res);
71610152Satgutier@umich.edu
71710152Satgutier@umich.edu  delete (g_ip);
71810152Satgutier@umich.edu  return fin_res;
71910152Satgutier@umich.edu}
72010152Satgutier@umich.edu
72110152Satgutier@umich.edu//cacti6.5's plain interface, please keep !!!
72210152Satgutier@umich.eduuca_org_t cacti_interface(
72310152Satgutier@umich.edu    int cache_size,
72410152Satgutier@umich.edu    int line_size,
72510152Satgutier@umich.edu    int associativity,
72610152Satgutier@umich.edu    int rw_ports,
72710152Satgutier@umich.edu    int excl_read_ports,
72810152Satgutier@umich.edu    int excl_write_ports,
72910152Satgutier@umich.edu    int single_ended_read_ports,
73010152Satgutier@umich.edu    int banks,
73110152Satgutier@umich.edu    double tech_node, // in nm
73210152Satgutier@umich.edu    int page_sz,
73310152Satgutier@umich.edu    int burst_length,
73410152Satgutier@umich.edu    int pre_width,
73510152Satgutier@umich.edu    int output_width,
73610152Satgutier@umich.edu    int specific_tag,
73710152Satgutier@umich.edu    int tag_width,
73810152Satgutier@umich.edu    int access_mode, //0 normal, 1 seq, 2 fast
73910152Satgutier@umich.edu    int cache, //scratch ram or cache
74010152Satgutier@umich.edu    int main_mem,
74110152Satgutier@umich.edu    int obj_func_delay,
74210152Satgutier@umich.edu    int obj_func_dynamic_power,
74310152Satgutier@umich.edu    int obj_func_leakage_power,
74410152Satgutier@umich.edu    int obj_func_area,
74510152Satgutier@umich.edu    int obj_func_cycle_time,
74610152Satgutier@umich.edu    int dev_func_delay,
74710152Satgutier@umich.edu    int dev_func_dynamic_power,
74810152Satgutier@umich.edu    int dev_func_leakage_power,
74910152Satgutier@umich.edu    int dev_func_area,
75010152Satgutier@umich.edu    int dev_func_cycle_time,
75110152Satgutier@umich.edu    int ed_ed2_none, // 0 - ED, 1 - ED^2, 2 - use weight and deviate
75210152Satgutier@umich.edu    int temp,
75310152Satgutier@umich.edu    int wt, //0 - default(search across everything), 1 - global, 2 - 5% delay penalty, 3 - 10%, 4 - 20 %, 5 - 30%, 6 - low-swing
75410152Satgutier@umich.edu    int data_arr_ram_cell_tech_flavor_in, // 0-4
75510152Satgutier@umich.edu    int data_arr_peri_global_tech_flavor_in,
75610152Satgutier@umich.edu    int tag_arr_ram_cell_tech_flavor_in,
75710152Satgutier@umich.edu    int tag_arr_peri_global_tech_flavor_in,
75810152Satgutier@umich.edu    int interconnect_projection_type_in, // 0 - aggressive, 1 - normal
75910152Satgutier@umich.edu    int wire_inside_mat_type_in,
76010152Satgutier@umich.edu    int wire_outside_mat_type_in,
76110152Satgutier@umich.edu    int is_nuca, // 0 - UCA, 1 - NUCA
76210152Satgutier@umich.edu    int core_count,
76310152Satgutier@umich.edu    int cache_level, // 0 - L2, 1 - L3
76410152Satgutier@umich.edu    int nuca_bank_count,
76510152Satgutier@umich.edu    int nuca_obj_func_delay,
76610152Satgutier@umich.edu    int nuca_obj_func_dynamic_power,
76710152Satgutier@umich.edu    int nuca_obj_func_leakage_power,
76810152Satgutier@umich.edu    int nuca_obj_func_area,
76910152Satgutier@umich.edu    int nuca_obj_func_cycle_time,
77010152Satgutier@umich.edu    int nuca_dev_func_delay,
77110152Satgutier@umich.edu    int nuca_dev_func_dynamic_power,
77210152Satgutier@umich.edu    int nuca_dev_func_leakage_power,
77310152Satgutier@umich.edu    int nuca_dev_func_area,
77410152Satgutier@umich.edu    int nuca_dev_func_cycle_time,
77510152Satgutier@umich.edu    int REPEATERS_IN_HTREE_SEGMENTS_in,//TODO for now only wires with repeaters are supported
77610152Satgutier@umich.edu    int p_input)
77710152Satgutier@umich.edu{
77810152Satgutier@umich.edu  g_ip = new InputParameter();
77910152Satgutier@umich.edu  g_ip->add_ecc_b_ = true;
78010152Satgutier@umich.edu
78110152Satgutier@umich.edu  g_ip->data_arr_ram_cell_tech_type    = data_arr_ram_cell_tech_flavor_in;
78210152Satgutier@umich.edu  g_ip->data_arr_peri_global_tech_type = data_arr_peri_global_tech_flavor_in;
78310152Satgutier@umich.edu  g_ip->tag_arr_ram_cell_tech_type     = tag_arr_ram_cell_tech_flavor_in;
78410152Satgutier@umich.edu  g_ip->tag_arr_peri_global_tech_type  = tag_arr_peri_global_tech_flavor_in;
78510152Satgutier@umich.edu
78610152Satgutier@umich.edu  g_ip->ic_proj_type     = interconnect_projection_type_in;
78710152Satgutier@umich.edu  g_ip->wire_is_mat_type = wire_inside_mat_type_in;
78810152Satgutier@umich.edu  g_ip->wire_os_mat_type = wire_outside_mat_type_in;
78910152Satgutier@umich.edu  g_ip->burst_len        = burst_length;
79010152Satgutier@umich.edu  g_ip->int_prefetch_w   = pre_width;
79110152Satgutier@umich.edu  g_ip->page_sz_bits     = page_sz;
79210152Satgutier@umich.edu
79310152Satgutier@umich.edu  g_ip->cache_sz            = cache_size;
79410152Satgutier@umich.edu  g_ip->line_sz             = line_size;
79510152Satgutier@umich.edu  g_ip->assoc               = associativity;
79610152Satgutier@umich.edu  g_ip->nbanks              = banks;
79710152Satgutier@umich.edu  g_ip->out_w               = output_width;
79810152Satgutier@umich.edu  g_ip->specific_tag        = specific_tag;
79910152Satgutier@umich.edu  if (tag_width == 0) {
80010152Satgutier@umich.edu    g_ip->tag_w = 42;
80110152Satgutier@umich.edu  }
80210152Satgutier@umich.edu  else {
80310152Satgutier@umich.edu    g_ip->tag_w               = tag_width;
80410152Satgutier@umich.edu  }
80510152Satgutier@umich.edu
80610152Satgutier@umich.edu  g_ip->access_mode         = access_mode;
80710152Satgutier@umich.edu  g_ip->delay_wt = obj_func_delay;
80810152Satgutier@umich.edu  g_ip->dynamic_power_wt = obj_func_dynamic_power;
80910152Satgutier@umich.edu  g_ip->leakage_power_wt = obj_func_leakage_power;
81010152Satgutier@umich.edu  g_ip->area_wt = obj_func_area;
81110152Satgutier@umich.edu  g_ip->cycle_time_wt    = obj_func_cycle_time;
81210152Satgutier@umich.edu  g_ip->delay_dev = dev_func_delay;
81310152Satgutier@umich.edu  g_ip->dynamic_power_dev = dev_func_dynamic_power;
81410152Satgutier@umich.edu  g_ip->leakage_power_dev = dev_func_leakage_power;
81510152Satgutier@umich.edu  g_ip->area_dev = dev_func_area;
81610152Satgutier@umich.edu  g_ip->cycle_time_dev    = dev_func_cycle_time;
81710152Satgutier@umich.edu  g_ip->ed = ed_ed2_none;
81810152Satgutier@umich.edu
81910152Satgutier@umich.edu  switch(wt) {
82010152Satgutier@umich.edu    case (0):
82110152Satgutier@umich.edu      g_ip->force_wiretype = 0;
82210152Satgutier@umich.edu      g_ip->wt = Global;
82310152Satgutier@umich.edu      break;
82410152Satgutier@umich.edu    case (1):
82510152Satgutier@umich.edu      g_ip->force_wiretype = 1;
82610152Satgutier@umich.edu      g_ip->wt = Global;
82710152Satgutier@umich.edu      break;
82810152Satgutier@umich.edu    case (2):
82910152Satgutier@umich.edu      g_ip->force_wiretype = 1;
83010152Satgutier@umich.edu      g_ip->wt = Global_5;
83110152Satgutier@umich.edu      break;
83210152Satgutier@umich.edu    case (3):
83310152Satgutier@umich.edu      g_ip->force_wiretype = 1;
83410152Satgutier@umich.edu      g_ip->wt = Global_10;
83510152Satgutier@umich.edu      break;
83610152Satgutier@umich.edu    case (4):
83710152Satgutier@umich.edu      g_ip->force_wiretype = 1;
83810152Satgutier@umich.edu      g_ip->wt = Global_20;
83910152Satgutier@umich.edu      break;
84010152Satgutier@umich.edu    case (5):
84110152Satgutier@umich.edu      g_ip->force_wiretype = 1;
84210152Satgutier@umich.edu      g_ip->wt = Global_30;
84310152Satgutier@umich.edu      break;
84410152Satgutier@umich.edu    case (6):
84510152Satgutier@umich.edu      g_ip->force_wiretype = 1;
84610152Satgutier@umich.edu      g_ip->wt = Low_swing;
84710152Satgutier@umich.edu      break;
84810152Satgutier@umich.edu    default:
84910152Satgutier@umich.edu      cout << "Unknown wire type!\n";
85010152Satgutier@umich.edu      exit(0);
85110152Satgutier@umich.edu  }
85210152Satgutier@umich.edu
85310152Satgutier@umich.edu  g_ip->delay_wt_nuca = nuca_obj_func_delay;
85410152Satgutier@umich.edu  g_ip->dynamic_power_wt_nuca = nuca_obj_func_dynamic_power;
85510152Satgutier@umich.edu  g_ip->leakage_power_wt_nuca = nuca_obj_func_leakage_power;
85610152Satgutier@umich.edu  g_ip->area_wt_nuca = nuca_obj_func_area;
85710152Satgutier@umich.edu  g_ip->cycle_time_wt_nuca    = nuca_obj_func_cycle_time;
85810152Satgutier@umich.edu  g_ip->delay_dev_nuca = dev_func_delay;
85910152Satgutier@umich.edu  g_ip->dynamic_power_dev_nuca = nuca_dev_func_dynamic_power;
86010152Satgutier@umich.edu  g_ip->leakage_power_dev_nuca = nuca_dev_func_leakage_power;
86110152Satgutier@umich.edu  g_ip->area_dev_nuca = nuca_dev_func_area;
86210152Satgutier@umich.edu  g_ip->cycle_time_dev_nuca    = nuca_dev_func_cycle_time;
86310152Satgutier@umich.edu  g_ip->nuca = is_nuca;
86410152Satgutier@umich.edu  g_ip->nuca_bank_count = nuca_bank_count;
86510152Satgutier@umich.edu  if(nuca_bank_count > 0) {
86610152Satgutier@umich.edu    g_ip->force_nuca_bank = 1;
86710152Satgutier@umich.edu  }
86810152Satgutier@umich.edu  g_ip->cores = core_count;
86910152Satgutier@umich.edu  g_ip->cache_level = cache_level;
87010152Satgutier@umich.edu
87110152Satgutier@umich.edu  g_ip->temp = temp;
87210152Satgutier@umich.edu
87310152Satgutier@umich.edu  g_ip->F_sz_nm         = tech_node;
87410152Satgutier@umich.edu  g_ip->F_sz_um         = tech_node / 1000;
87510152Satgutier@umich.edu  g_ip->is_main_mem     = (main_mem != 0) ? true : false;
87610152Satgutier@umich.edu  g_ip->is_cache        = (cache != 0) ? true : false;
87710152Satgutier@umich.edu  g_ip->rpters_in_htree = (REPEATERS_IN_HTREE_SEGMENTS_in != 0) ? true : false;
87810152Satgutier@umich.edu
87910152Satgutier@umich.edu  g_ip->num_rw_ports    = rw_ports;
88010152Satgutier@umich.edu  g_ip->num_rd_ports    = excl_read_ports;
88110152Satgutier@umich.edu  g_ip->num_wr_ports    = excl_write_ports;
88210152Satgutier@umich.edu  g_ip->num_se_rd_ports = single_ended_read_ports;
88310152Satgutier@umich.edu  g_ip->print_detail = 1;
88410152Satgutier@umich.edu  g_ip->nuca = 0;
88510152Satgutier@umich.edu
88610152Satgutier@umich.edu  g_ip->wt = Global_5;
88710152Satgutier@umich.edu  g_ip->force_cache_config = false;
88810152Satgutier@umich.edu  g_ip->force_wiretype = false;
88910152Satgutier@umich.edu  g_ip->print_input_args = p_input;
89010152Satgutier@umich.edu
89110152Satgutier@umich.edu
89210152Satgutier@umich.edu  uca_org_t fin_res;
89310152Satgutier@umich.edu  fin_res.valid = false;
89410152Satgutier@umich.edu
89510152Satgutier@umich.edu  if (g_ip->error_checking() == false) exit(0);
89610152Satgutier@umich.edu  if (g_ip->print_input_args)
89710152Satgutier@umich.edu    g_ip->display_ip();
89810152Satgutier@umich.edu  init_tech_params(g_ip->F_sz_um, false);
89910152Satgutier@umich.edu  Wire winit; // Do not delete this line. It initializes wires.
90010152Satgutier@umich.edu
90110152Satgutier@umich.edu  if (g_ip->nuca == 1)
90210152Satgutier@umich.edu  {
90310152Satgutier@umich.edu    Nuca n(&g_tp.peri_global);
90410152Satgutier@umich.edu    n.sim_nuca();
90510152Satgutier@umich.edu  }
90610152Satgutier@umich.edu  solve(&fin_res);
90710152Satgutier@umich.edu
90810152Satgutier@umich.edu  output_UCA(&fin_res);
90910152Satgutier@umich.edu
91010152Satgutier@umich.edu  delete (g_ip);
91110152Satgutier@umich.edu  return fin_res;
91210152Satgutier@umich.edu}
91310152Satgutier@umich.edu
91410152Satgutier@umich.edu//McPAT's plain interface, please keep !!!
91510152Satgutier@umich.eduuca_org_t cacti_interface(
91610152Satgutier@umich.edu    int cache_size,
91710152Satgutier@umich.edu    int line_size,
91810152Satgutier@umich.edu    int associativity,
91910152Satgutier@umich.edu    int rw_ports,
92010152Satgutier@umich.edu    int excl_read_ports,// para5
92110152Satgutier@umich.edu    int excl_write_ports,
92210152Satgutier@umich.edu    int single_ended_read_ports,
92310152Satgutier@umich.edu    int search_ports,
92410152Satgutier@umich.edu    int banks,
92510152Satgutier@umich.edu    double tech_node,//para10
92610152Satgutier@umich.edu    int output_width,
92710152Satgutier@umich.edu    int specific_tag,
92810152Satgutier@umich.edu    int tag_width,
92910152Satgutier@umich.edu    int access_mode,
93010152Satgutier@umich.edu    int cache,      //para15
93110152Satgutier@umich.edu    int main_mem,
93210152Satgutier@umich.edu    int obj_func_delay,
93310152Satgutier@umich.edu    int obj_func_dynamic_power,
93410152Satgutier@umich.edu    int obj_func_leakage_power,
93510152Satgutier@umich.edu    int obj_func_cycle_time, //para20
93610152Satgutier@umich.edu    int obj_func_area,
93710152Satgutier@umich.edu    int dev_func_delay,
93810152Satgutier@umich.edu    int dev_func_dynamic_power,
93910152Satgutier@umich.edu    int dev_func_leakage_power,
94010152Satgutier@umich.edu    int dev_func_area, //para25
94110152Satgutier@umich.edu    int dev_func_cycle_time,
94210152Satgutier@umich.edu    int ed_ed2_none, // 0 - ED, 1 - ED^2, 2 - use weight and deviate
94310152Satgutier@umich.edu    int temp,
94410152Satgutier@umich.edu    int wt, //0 - default(search across everything), 1 - global, 2 - 5% delay penalty, 3 - 10%, 4 - 20 %, 5 - 30%, 6 - low-swing
94510152Satgutier@umich.edu    int data_arr_ram_cell_tech_flavor_in,//para30
94610152Satgutier@umich.edu    int data_arr_peri_global_tech_flavor_in,
94710152Satgutier@umich.edu    int tag_arr_ram_cell_tech_flavor_in,
94810152Satgutier@umich.edu    int tag_arr_peri_global_tech_flavor_in,
94910152Satgutier@umich.edu    int interconnect_projection_type_in,
95010152Satgutier@umich.edu    int wire_inside_mat_type_in,//para35
95110152Satgutier@umich.edu    int wire_outside_mat_type_in,
95210152Satgutier@umich.edu    int REPEATERS_IN_HTREE_SEGMENTS_in,
95310152Satgutier@umich.edu    int VERTICAL_HTREE_WIRES_OVER_THE_ARRAY_in,
95410152Satgutier@umich.edu    int BROADCAST_ADDR_DATAIN_OVER_VERTICAL_HTREES_in,
95510152Satgutier@umich.edu    int PAGE_SIZE_BITS_in,//para40
95610152Satgutier@umich.edu    int BURST_LENGTH_in,
95710152Satgutier@umich.edu    int INTERNAL_PREFETCH_WIDTH_in,
95810152Satgutier@umich.edu    int force_wiretype,
95910152Satgutier@umich.edu    int wiretype,
96010152Satgutier@umich.edu    int force_config,//para45
96110152Satgutier@umich.edu    int ndwl,
96210152Satgutier@umich.edu    int ndbl,
96310152Satgutier@umich.edu    int nspd,
96410152Satgutier@umich.edu    int ndcm,
96510152Satgutier@umich.edu    int ndsam1,//para50
96610152Satgutier@umich.edu    int ndsam2,
96710152Satgutier@umich.edu    int ecc)
96810152Satgutier@umich.edu{
96910152Satgutier@umich.edu  g_ip = new InputParameter();
97010152Satgutier@umich.edu
97110152Satgutier@umich.edu  uca_org_t fin_res;
97210152Satgutier@umich.edu  fin_res.valid = false;
97310152Satgutier@umich.edu
97410152Satgutier@umich.edu  g_ip->data_arr_ram_cell_tech_type    = data_arr_ram_cell_tech_flavor_in;
97510152Satgutier@umich.edu  g_ip->data_arr_peri_global_tech_type = data_arr_peri_global_tech_flavor_in;
97610152Satgutier@umich.edu  g_ip->tag_arr_ram_cell_tech_type     = tag_arr_ram_cell_tech_flavor_in;
97710152Satgutier@umich.edu  g_ip->tag_arr_peri_global_tech_type  = tag_arr_peri_global_tech_flavor_in;
97810152Satgutier@umich.edu
97910152Satgutier@umich.edu  g_ip->ic_proj_type     = interconnect_projection_type_in;
98010152Satgutier@umich.edu  g_ip->wire_is_mat_type = wire_inside_mat_type_in;
98110152Satgutier@umich.edu  g_ip->wire_os_mat_type = wire_outside_mat_type_in;
98210152Satgutier@umich.edu  g_ip->burst_len        = BURST_LENGTH_in;
98310152Satgutier@umich.edu  g_ip->int_prefetch_w   = INTERNAL_PREFETCH_WIDTH_in;
98410152Satgutier@umich.edu  g_ip->page_sz_bits     = PAGE_SIZE_BITS_in;
98510152Satgutier@umich.edu
98610152Satgutier@umich.edu  g_ip->cache_sz            = cache_size;
98710152Satgutier@umich.edu  g_ip->line_sz             = line_size;
98810152Satgutier@umich.edu  g_ip->assoc               = associativity;
98910152Satgutier@umich.edu  g_ip->nbanks              = banks;
99010152Satgutier@umich.edu  g_ip->out_w               = output_width;
99110152Satgutier@umich.edu  g_ip->specific_tag        = specific_tag;
99210152Satgutier@umich.edu  if (specific_tag == 0) {
99310152Satgutier@umich.edu    g_ip->tag_w = 42;
99410152Satgutier@umich.edu  }
99510152Satgutier@umich.edu  else {
99610152Satgutier@umich.edu    g_ip->tag_w               = tag_width;
99710152Satgutier@umich.edu  }
99810152Satgutier@umich.edu
99910152Satgutier@umich.edu  g_ip->access_mode         = access_mode;
100010152Satgutier@umich.edu  g_ip->delay_wt = obj_func_delay;
100110152Satgutier@umich.edu  g_ip->dynamic_power_wt = obj_func_dynamic_power;
100210152Satgutier@umich.edu  g_ip->leakage_power_wt = obj_func_leakage_power;
100310152Satgutier@umich.edu  g_ip->area_wt = obj_func_area;
100410152Satgutier@umich.edu  g_ip->cycle_time_wt    = obj_func_cycle_time;
100510152Satgutier@umich.edu  g_ip->delay_dev = dev_func_delay;
100610152Satgutier@umich.edu  g_ip->dynamic_power_dev = dev_func_dynamic_power;
100710152Satgutier@umich.edu  g_ip->leakage_power_dev = dev_func_leakage_power;
100810152Satgutier@umich.edu  g_ip->area_dev = dev_func_area;
100910152Satgutier@umich.edu  g_ip->cycle_time_dev    = dev_func_cycle_time;
101010152Satgutier@umich.edu  g_ip->temp = temp;
101110152Satgutier@umich.edu  g_ip->ed = ed_ed2_none;
101210152Satgutier@umich.edu
101310152Satgutier@umich.edu  g_ip->F_sz_nm         = tech_node;
101410152Satgutier@umich.edu  g_ip->F_sz_um         = tech_node / 1000;
101510152Satgutier@umich.edu  g_ip->is_main_mem     = (main_mem != 0) ? true : false;
101610152Satgutier@umich.edu  g_ip->is_cache        = (cache ==1) ? true : false;
101710152Satgutier@umich.edu  g_ip->pure_ram        = (cache ==0) ? true : false;
101810152Satgutier@umich.edu  g_ip->pure_cam        = (cache ==2) ? true : false;
101910152Satgutier@umich.edu  g_ip->rpters_in_htree = (REPEATERS_IN_HTREE_SEGMENTS_in != 0) ? true : false;
102010152Satgutier@umich.edu  g_ip->ver_htree_wires_over_array = VERTICAL_HTREE_WIRES_OVER_THE_ARRAY_in;
102110152Satgutier@umich.edu  g_ip->broadcast_addr_din_over_ver_htrees = BROADCAST_ADDR_DATAIN_OVER_VERTICAL_HTREES_in;
102210152Satgutier@umich.edu
102310152Satgutier@umich.edu  g_ip->num_rw_ports    = rw_ports;
102410152Satgutier@umich.edu  g_ip->num_rd_ports    = excl_read_ports;
102510152Satgutier@umich.edu  g_ip->num_wr_ports    = excl_write_ports;
102610152Satgutier@umich.edu  g_ip->num_se_rd_ports = single_ended_read_ports;
102710152Satgutier@umich.edu  g_ip->num_search_ports = search_ports;
102810152Satgutier@umich.edu
102910152Satgutier@umich.edu  g_ip->print_detail = 1;
103010152Satgutier@umich.edu  g_ip->nuca = 0;
103110152Satgutier@umich.edu
103210152Satgutier@umich.edu  if (force_wiretype == 0)
103310152Satgutier@umich.edu  {
103410152Satgutier@umich.edu          g_ip->wt = Global;
103510152Satgutier@umich.edu      g_ip->force_wiretype = false;
103610152Satgutier@umich.edu  }
103710152Satgutier@umich.edu  else
103810152Satgutier@umich.edu  {   g_ip->force_wiretype = true;
103910152Satgutier@umich.edu          if (wiretype==10) {
104010152Satgutier@umich.edu                  g_ip->wt = Global_10;
104110152Satgutier@umich.edu                }
104210152Satgutier@umich.edu          if (wiretype==20) {
104310152Satgutier@umich.edu                  g_ip->wt = Global_20;
104410152Satgutier@umich.edu                }
104510152Satgutier@umich.edu          if (wiretype==30) {
104610152Satgutier@umich.edu                  g_ip->wt = Global_30;
104710152Satgutier@umich.edu                }
104810152Satgutier@umich.edu          if (wiretype==5) {
104910152Satgutier@umich.edu              g_ip->wt = Global_5;
105010152Satgutier@umich.edu                }
105110152Satgutier@umich.edu          if (wiretype==0) {
105210152Satgutier@umich.edu                  g_ip->wt = Low_swing;
105310152Satgutier@umich.edu          }
105410152Satgutier@umich.edu  }
105510152Satgutier@umich.edu  //g_ip->wt = Global_5;
105610152Satgutier@umich.edu  if (force_config == 0)
105710152Satgutier@umich.edu    {
105810152Satgutier@umich.edu          g_ip->force_cache_config = false;
105910152Satgutier@umich.edu    }
106010152Satgutier@umich.edu    else
106110152Satgutier@umich.edu    {
106210152Satgutier@umich.edu        g_ip->force_cache_config = true;
106310152Satgutier@umich.edu        g_ip->ndbl=ndbl;
106410152Satgutier@umich.edu        g_ip->ndwl=ndwl;
106510152Satgutier@umich.edu        g_ip->nspd=nspd;
106610152Satgutier@umich.edu        g_ip->ndcm=ndcm;
106710152Satgutier@umich.edu        g_ip->ndsam1=ndsam1;
106810152Satgutier@umich.edu        g_ip->ndsam2=ndsam2;
106910152Satgutier@umich.edu
107010152Satgutier@umich.edu
107110152Satgutier@umich.edu    }
107210152Satgutier@umich.edu
107310152Satgutier@umich.edu  if (ecc==0){
107410152Satgutier@umich.edu          g_ip->add_ecc_b_=false;
107510152Satgutier@umich.edu  }
107610152Satgutier@umich.edu  else
107710152Satgutier@umich.edu  {
107810152Satgutier@umich.edu          g_ip->add_ecc_b_=true;
107910152Satgutier@umich.edu  }
108010152Satgutier@umich.edu
108110152Satgutier@umich.edu
108210152Satgutier@umich.edu  if(!g_ip->error_checking())
108310152Satgutier@umich.edu          exit(0);
108410152Satgutier@umich.edu
108510152Satgutier@umich.edu  init_tech_params(g_ip->F_sz_um, false);
108610152Satgutier@umich.edu  Wire winit; // Do not delete this line. It initializes wires.
108710152Satgutier@umich.edu
108810152Satgutier@umich.edu  g_ip->display_ip();
108910152Satgutier@umich.edu  solve(&fin_res);
109010152Satgutier@umich.edu  output_UCA(&fin_res);
109110152Satgutier@umich.edu  output_data_csv(fin_res);
109210152Satgutier@umich.edu  delete (g_ip);
109310152Satgutier@umich.edu
109410152Satgutier@umich.edu  return fin_res;
109510152Satgutier@umich.edu}
109610152Satgutier@umich.edu
109710152Satgutier@umich.edu
109810152Satgutier@umich.edu
109910152Satgutier@umich.edubool InputParameter::error_checking()
110010152Satgutier@umich.edu{
110110152Satgutier@umich.edu  int  A;
110210152Satgutier@umich.edu  bool seq_access  = false;
110310152Satgutier@umich.edu  fast_access = true;
110410152Satgutier@umich.edu
110510152Satgutier@umich.edu  switch (access_mode)
110610152Satgutier@umich.edu  {
110710152Satgutier@umich.edu    case 0:
110810152Satgutier@umich.edu      seq_access  = false;
110910152Satgutier@umich.edu      fast_access = false;
111010152Satgutier@umich.edu      break;
111110152Satgutier@umich.edu    case 1:
111210152Satgutier@umich.edu      seq_access  = true;
111310152Satgutier@umich.edu      fast_access = false;
111410152Satgutier@umich.edu      break;
111510152Satgutier@umich.edu    case 2:
111610152Satgutier@umich.edu      seq_access  = false;
111710152Satgutier@umich.edu      fast_access = true;
111810152Satgutier@umich.edu      break;
111910152Satgutier@umich.edu  }
112010152Satgutier@umich.edu
112110152Satgutier@umich.edu  if(is_main_mem)
112210152Satgutier@umich.edu  {
112310152Satgutier@umich.edu    if(ic_proj_type == 0)
112410152Satgutier@umich.edu    {
112510152Satgutier@umich.edu      cerr << "DRAM model supports only conservative interconnect projection!\n\n";
112610152Satgutier@umich.edu      return false;
112710152Satgutier@umich.edu    }
112810152Satgutier@umich.edu  }
112910152Satgutier@umich.edu
113010152Satgutier@umich.edu
113110152Satgutier@umich.edu  uint32_t B = line_sz;
113210152Satgutier@umich.edu
113310152Satgutier@umich.edu  if (B < 1)
113410152Satgutier@umich.edu  {
113510152Satgutier@umich.edu    cerr << "Block size must >= 1" << endl;
113610152Satgutier@umich.edu    return false;
113710152Satgutier@umich.edu  }
113810152Satgutier@umich.edu  else if (B*8 < out_w)
113910152Satgutier@umich.edu  {
114010152Satgutier@umich.edu    cerr << "Block size must be at least " << out_w/8 << endl;
114110152Satgutier@umich.edu    return false;
114210152Satgutier@umich.edu  }
114310152Satgutier@umich.edu
114410152Satgutier@umich.edu  if (F_sz_um <= 0)
114510152Satgutier@umich.edu  {
114610152Satgutier@umich.edu    cerr << "Feature size must be > 0" << endl;
114710152Satgutier@umich.edu    return false;
114810152Satgutier@umich.edu  }
114910152Satgutier@umich.edu  else if (F_sz_um > 0.091)
115010152Satgutier@umich.edu  {
115110152Satgutier@umich.edu    cerr << "Feature size must be <= 90 nm" << endl;
115210152Satgutier@umich.edu    return false;
115310152Satgutier@umich.edu  }
115410152Satgutier@umich.edu
115510152Satgutier@umich.edu
115610152Satgutier@umich.edu  uint32_t RWP  = num_rw_ports;
115710152Satgutier@umich.edu  uint32_t ERP  = num_rd_ports;
115810152Satgutier@umich.edu  uint32_t EWP  = num_wr_ports;
115910152Satgutier@umich.edu  uint32_t NSER = num_se_rd_ports;
116010152Satgutier@umich.edu  uint32_t SCHP = num_search_ports;
116110152Satgutier@umich.edu
116210152Satgutier@umich.edu//TODO: revisit this. This is an important feature. Sheng thought this should be used
116310152Satgutier@umich.edu//  // If multiple banks and multiple ports are specified, then if number of ports is less than or equal to
116410152Satgutier@umich.edu//  // the number of banks, we assume that the multiple ports are implemented via the multiple banks.
116510152Satgutier@umich.edu//  // In such a case we assume that each bank has 1 RWP port.
116610152Satgutier@umich.edu//  if ((RWP + ERP + EWP) <= nbanks && nbanks>1)
116710152Satgutier@umich.edu//  {
116810152Satgutier@umich.edu//    RWP  = 1;
116910152Satgutier@umich.edu//    ERP  = 0;
117010152Satgutier@umich.edu//    EWP  = 0;
117110152Satgutier@umich.edu//    NSER = 0;
117210152Satgutier@umich.edu//  }
117310152Satgutier@umich.edu//  else if ((RWP < 0) || (EWP < 0) || (ERP < 0))
117410152Satgutier@umich.edu//  {
117510152Satgutier@umich.edu//    cerr << "Ports must >=0" << endl;
117610152Satgutier@umich.edu//    return false;
117710152Satgutier@umich.edu//  }
117810152Satgutier@umich.edu//  else if (RWP > 2)
117910152Satgutier@umich.edu//  {
118010152Satgutier@umich.edu//    cerr << "Maximum of 2 read/write ports" << endl;
118110152Satgutier@umich.edu//    return false;
118210152Satgutier@umich.edu//  }
118310152Satgutier@umich.edu//  else if ((RWP+ERP+EWP) < 1)
118410152Satgutier@umich.edu  // Changed to new implementation:
118510152Satgutier@umich.edu  // The number of ports specified at input is per bank
118610152Satgutier@umich.edu  if ((RWP+ERP+EWP) < 1)
118710152Satgutier@umich.edu  {
118810152Satgutier@umich.edu    cerr << "Must have at least one port" << endl;
118910152Satgutier@umich.edu    return false;
119010152Satgutier@umich.edu  }
119110152Satgutier@umich.edu
119210152Satgutier@umich.edu  if (is_pow2(nbanks) == false)
119310152Satgutier@umich.edu  {
119410152Satgutier@umich.edu    cerr << "Number of subbanks should be greater than or equal to 1 and should be a power of 2" << endl;
119510152Satgutier@umich.edu    return false;
119610152Satgutier@umich.edu  }
119710152Satgutier@umich.edu
119810152Satgutier@umich.edu  int C = cache_sz/nbanks;
119910152Satgutier@umich.edu  if (C < 64)
120010152Satgutier@umich.edu  {
120110152Satgutier@umich.edu    cerr << "Cache size must >=64" << endl;
120210152Satgutier@umich.edu    return false;
120310152Satgutier@umich.edu  }
120410152Satgutier@umich.edu
120510152Satgutier@umich.edu//TODO: revisit this
120610152Satgutier@umich.edu//   if (pure_ram==true && assoc!=1)
120710152Satgutier@umich.edu//    {
120810152Satgutier@umich.edu//  	  cerr << "Pure RAM must have assoc as 1" << endl;
120910152Satgutier@umich.edu//  	  return false;
121010152Satgutier@umich.edu//    }
121110152Satgutier@umich.edu
121210152Satgutier@umich.edu    //fully assoc and cam check
121310152Satgutier@umich.edu    if (is_cache && assoc==0)
121410152Satgutier@umich.edu        fully_assoc =true;
121510152Satgutier@umich.edu    else
121610152Satgutier@umich.edu        fully_assoc = false;
121710152Satgutier@umich.edu
121810152Satgutier@umich.edu    if (pure_cam==true && assoc!=0)
121910152Satgutier@umich.edu    {
122010152Satgutier@umich.edu          cerr << "Pure CAM must have associativity as 0" << endl;
122110152Satgutier@umich.edu          return false;
122210152Satgutier@umich.edu    }
122310152Satgutier@umich.edu
122410152Satgutier@umich.edu    if (assoc==0 && (pure_cam==false && is_cache ==false))
122510152Satgutier@umich.edu    {
122610152Satgutier@umich.edu          cerr << "Only CAM or Fully associative cache can have associativity as 0" << endl;
122710152Satgutier@umich.edu          return false;
122810152Satgutier@umich.edu    }
122910152Satgutier@umich.edu
123010152Satgutier@umich.edu    if ((fully_assoc==true || pure_cam==true)
123110152Satgutier@umich.edu                  &&  (data_arr_ram_cell_tech_type!= tag_arr_ram_cell_tech_type
123210152Satgutier@umich.edu                                 || data_arr_peri_global_tech_type != tag_arr_peri_global_tech_type  ))
123310152Satgutier@umich.edu    {
123410152Satgutier@umich.edu          cerr << "CAM and fully associative cache must have same device type for both data and tag array" << endl;
123510152Satgutier@umich.edu          return false;
123610152Satgutier@umich.edu    }
123710152Satgutier@umich.edu
123810152Satgutier@umich.edu    if ((fully_assoc==true || pure_cam==true)
123910152Satgutier@umich.edu                  &&  (data_arr_ram_cell_tech_type== lp_dram || data_arr_ram_cell_tech_type== comm_dram))
124010152Satgutier@umich.edu    {
124110152Satgutier@umich.edu          cerr << "DRAM based CAM and fully associative cache are not supported" << endl;
124210152Satgutier@umich.edu          return false;
124310152Satgutier@umich.edu    }
124410152Satgutier@umich.edu
124510152Satgutier@umich.edu    if ((fully_assoc==true || pure_cam==true)
124610152Satgutier@umich.edu                  &&  (is_main_mem==true))
124710152Satgutier@umich.edu    {
124810152Satgutier@umich.edu          cerr << "CAM and fully associative cache cannot be as main memory" << endl;
124910152Satgutier@umich.edu          return false;
125010152Satgutier@umich.edu    }
125110152Satgutier@umich.edu
125210152Satgutier@umich.edu    if ((fully_assoc || pure_cam) && SCHP<1)
125310152Satgutier@umich.edu    {
125410152Satgutier@umich.edu          cerr << "CAM and fully associative must have at least 1 search port" << endl;
125510152Satgutier@umich.edu          return false;
125610152Satgutier@umich.edu    }
125710152Satgutier@umich.edu
125810152Satgutier@umich.edu   if (RWP==0 && ERP==0 && SCHP>0 && ((fully_assoc || pure_cam)))
125910152Satgutier@umich.edu    {
126010152Satgutier@umich.edu          ERP=SCHP;
126110152Satgutier@umich.edu    }
126210152Satgutier@umich.edu
126310152Satgutier@umich.edu//    if ((!(fully_assoc || pure_cam)) && SCHP>=1)
126410152Satgutier@umich.edu//    {
126510152Satgutier@umich.edu//	  cerr << "None CAM and fully associative cannot have search ports" << endl;
126610152Satgutier@umich.edu//	  return false;
126710152Satgutier@umich.edu//    }
126810152Satgutier@umich.edu
126910152Satgutier@umich.edu  if (assoc == 0)
127010152Satgutier@umich.edu  {
127110152Satgutier@umich.edu    A = C/B;
127210152Satgutier@umich.edu    //fully_assoc = true;
127310152Satgutier@umich.edu  }
127410152Satgutier@umich.edu  else
127510152Satgutier@umich.edu  {
127610152Satgutier@umich.edu    if (assoc == 1)
127710152Satgutier@umich.edu    {
127810152Satgutier@umich.edu      A = 1;
127910152Satgutier@umich.edu      //fully_assoc = false;
128010152Satgutier@umich.edu    }
128110152Satgutier@umich.edu    else
128210152Satgutier@umich.edu    {
128310152Satgutier@umich.edu      //fully_assoc = false;
128410152Satgutier@umich.edu      A = assoc;
128510152Satgutier@umich.edu      if (is_pow2(A) == false)
128610152Satgutier@umich.edu      {
128710152Satgutier@umich.edu        cerr << "Associativity must be a power of 2" << endl;
128810152Satgutier@umich.edu        return false;
128910152Satgutier@umich.edu      }
129010152Satgutier@umich.edu    }
129110152Satgutier@umich.edu  }
129210152Satgutier@umich.edu
129310152Satgutier@umich.edu  if (C/(B*A) <= 1 && assoc!=0)
129410152Satgutier@umich.edu  {
129510152Satgutier@umich.edu    cerr << "Number of sets is too small: " << endl;
129610152Satgutier@umich.edu    cerr << " Need to either increase cache size, or decrease associativity or block size" << endl;
129710152Satgutier@umich.edu    cerr << " (or use fully associative cache)" << endl;
129810152Satgutier@umich.edu    return false;
129910152Satgutier@umich.edu  }
130010152Satgutier@umich.edu
130110152Satgutier@umich.edu  block_sz = B;
130210152Satgutier@umich.edu
130310152Satgutier@umich.edu  /*dt: testing sequential access mode*/
130410152Satgutier@umich.edu  if(seq_access)
130510152Satgutier@umich.edu  {
130610152Satgutier@umich.edu    tag_assoc  = A;
130710152Satgutier@umich.edu    data_assoc = 1;
130810152Satgutier@umich.edu    is_seq_acc = true;
130910152Satgutier@umich.edu  }
131010152Satgutier@umich.edu  else
131110152Satgutier@umich.edu  {
131210152Satgutier@umich.edu    tag_assoc  = A;
131310152Satgutier@umich.edu    data_assoc = A;
131410152Satgutier@umich.edu    is_seq_acc = false;
131510152Satgutier@umich.edu  }
131610152Satgutier@umich.edu
131710152Satgutier@umich.edu  if (assoc==0)
131810152Satgutier@umich.edu  {
131910152Satgutier@umich.edu    data_assoc = 1;
132010152Satgutier@umich.edu  }
132110152Satgutier@umich.edu  num_rw_ports     = RWP;
132210152Satgutier@umich.edu  num_rd_ports     = ERP;
132310152Satgutier@umich.edu  num_wr_ports     = EWP;
132410152Satgutier@umich.edu  num_se_rd_ports  = NSER;
132510152Satgutier@umich.edu  if (!(fully_assoc || pure_cam))
132610152Satgutier@umich.edu    num_search_ports = 0;
132710152Satgutier@umich.edu  nsets            = C/(B*A);
132810152Satgutier@umich.edu
132910152Satgutier@umich.edu  if (temp < 300 || temp > 400 || temp%10 != 0)
133010152Satgutier@umich.edu  {
133110152Satgutier@umich.edu    cerr << temp << " Temperature must be between 300 and 400 Kelvin and multiple of 10." << endl;
133210152Satgutier@umich.edu    return false;
133310152Satgutier@umich.edu  }
133410152Satgutier@umich.edu
133510152Satgutier@umich.edu  if (nsets < 1)
133610152Satgutier@umich.edu  {
133710152Satgutier@umich.edu    cerr << "Less than one set..." << endl;
133810152Satgutier@umich.edu    return false;
133910152Satgutier@umich.edu  }
134010152Satgutier@umich.edu
134110152Satgutier@umich.edu  return true;
134210152Satgutier@umich.edu}
134310152Satgutier@umich.edu
134410152Satgutier@umich.edu
134510152Satgutier@umich.edu
134610152Satgutier@umich.eduvoid output_data_csv(const uca_org_t & fin_res)
134710152Satgutier@umich.edu{
134810152Satgutier@umich.edu  //TODO: the csv output should remain
134910152Satgutier@umich.edu  fstream file("out.csv", ios::in);
135010152Satgutier@umich.edu  bool    print_index = file.fail();
135110152Satgutier@umich.edu  file.close();
135210152Satgutier@umich.edu
135310152Satgutier@umich.edu  file.open("out.csv", ios::out|ios::app);
135410152Satgutier@umich.edu  if (file.fail() == true)
135510152Satgutier@umich.edu  {
135610152Satgutier@umich.edu    cerr << "File out.csv could not be opened successfully" << endl;
135710152Satgutier@umich.edu  }
135810152Satgutier@umich.edu  else
135910152Satgutier@umich.edu  {
136010152Satgutier@umich.edu    if (print_index == true)
136110152Satgutier@umich.edu    {
136210152Satgutier@umich.edu      file << "Tech node (nm), ";
136310152Satgutier@umich.edu      file << "Capacity (bytes), ";
136410152Satgutier@umich.edu      file << "Number of banks, ";
136510152Satgutier@umich.edu      file << "Associativity, ";
136610152Satgutier@umich.edu      file << "Output width (bits), ";
136710152Satgutier@umich.edu      file << "Access time (ns), ";
136810152Satgutier@umich.edu      file << "Random cycle time (ns), ";
136910152Satgutier@umich.edu//      file << "Multisubbank interleave cycle time (ns), ";
137010152Satgutier@umich.edu
137110152Satgutier@umich.edu//      file << "Delay request network (ns), ";
137210152Satgutier@umich.edu//      file << "Delay inside mat (ns), ";
137310152Satgutier@umich.edu//      file << "Delay reply network (ns), ";
137410152Satgutier@umich.edu//      file << "Tag array access time (ns), ";
137510152Satgutier@umich.edu//      file << "Data array access time (ns), ";
137610152Satgutier@umich.edu//      file << "Refresh period (microsec), ";
137710152Satgutier@umich.edu//      file << "DRAM array availability (%), ";
137810152Satgutier@umich.edu      file << "Dynamic search energy (nJ), ";
137910152Satgutier@umich.edu      file << "Dynamic read energy (nJ), ";
138010152Satgutier@umich.edu      file << "Dynamic write energy (nJ), ";
138110152Satgutier@umich.edu//      file << "Tag Dynamic read energy (nJ), ";
138210152Satgutier@umich.edu//      file << "Data Dynamic read energy (nJ), ";
138310152Satgutier@umich.edu//      file << "Dynamic read power (mW), ";
138410152Satgutier@umich.edu      file << "Standby leakage per bank(mW), ";
138510152Satgutier@umich.edu//      file << "Leakage per bank with leak power management (mW), ";
138610152Satgutier@umich.edu//      file << "Leakage per bank with leak power management (mW), ";
138710152Satgutier@umich.edu//      file << "Refresh power as percentage of standby leakage, ";
138810152Satgutier@umich.edu      file << "Area (mm2), ";
138910152Satgutier@umich.edu      file << "Ndwl, ";
139010152Satgutier@umich.edu      file << "Ndbl, ";
139110152Satgutier@umich.edu      file << "Nspd, ";
139210152Satgutier@umich.edu      file << "Ndcm, ";
139310152Satgutier@umich.edu      file << "Ndsam_level_1, ";
139410152Satgutier@umich.edu      file << "Ndsam_level_2, ";
139510152Satgutier@umich.edu      file << "Data arrary area efficiency %, ";
139610152Satgutier@umich.edu      file << "Ntwl, ";
139710152Satgutier@umich.edu      file << "Ntbl, ";
139810152Satgutier@umich.edu      file << "Ntspd, ";
139910152Satgutier@umich.edu      file << "Ntcm, ";
140010152Satgutier@umich.edu      file << "Ntsam_level_1, ";
140110152Satgutier@umich.edu      file << "Ntsam_level_2, ";
140210152Satgutier@umich.edu      file << "Tag arrary area efficiency %, ";
140310152Satgutier@umich.edu
140410152Satgutier@umich.edu//      file << "Resistance per unit micron (ohm-micron), ";
140510152Satgutier@umich.edu//      file << "Capacitance per unit micron (fF per micron), ";
140610152Satgutier@umich.edu//      file << "Unit-length wire delay (ps), ";
140710152Satgutier@umich.edu//      file << "FO4 delay (ps), ";
140810152Satgutier@umich.edu//      file << "delay route to bank (including crossb delay) (ps), ";
140910152Satgutier@umich.edu//      file << "Crossbar delay (ps), ";
141010152Satgutier@umich.edu//      file << "Dyn read energy per access from closed page (nJ), ";
141110152Satgutier@umich.edu//      file << "Dyn read energy per access from open page (nJ), ";
141210152Satgutier@umich.edu//      file << "Leak power of an subbank with page closed (mW), ";
141310152Satgutier@umich.edu//      file << "Leak power of a subbank with page  open (mW), ";
141410152Satgutier@umich.edu//      file << "Leak power of request and reply networks (mW), ";
141510152Satgutier@umich.edu//      file << "Number of subbanks, ";
141610152Satgutier@umich.edu//      file << "Page size in bits, ";
141710152Satgutier@umich.edu//      file << "Activate power, ";
141810152Satgutier@umich.edu//      file << "Read power, ";
141910152Satgutier@umich.edu//      file << "Write power, ";
142010152Satgutier@umich.edu//      file << "Precharge power, ";
142110152Satgutier@umich.edu//      file << "tRCD, ";
142210152Satgutier@umich.edu//      file << "CAS latency, ";
142310152Satgutier@umich.edu//      file << "Precharge delay, ";
142410152Satgutier@umich.edu//      file << "Perc dyn energy bitlines, ";
142510152Satgutier@umich.edu//      file << "perc dyn energy wordlines, ";
142610152Satgutier@umich.edu//      file << "perc dyn energy outside mat, ";
142710152Satgutier@umich.edu//      file << "Area opt (perc), ";
142810152Satgutier@umich.edu//      file << "Delay opt (perc), ";
142910152Satgutier@umich.edu//      file << "Repeater opt (perc), ";
143010152Satgutier@umich.edu//      file << "Aspect ratio";
143110152Satgutier@umich.edu      file << endl;
143210152Satgutier@umich.edu    }
143310152Satgutier@umich.edu    file << g_ip->F_sz_nm << ", ";
143410152Satgutier@umich.edu    file << g_ip->cache_sz << ", ";
143510152Satgutier@umich.edu    file << g_ip->nbanks << ", ";
143610152Satgutier@umich.edu    file << g_ip->tag_assoc << ", ";
143710152Satgutier@umich.edu    file << g_ip->out_w << ", ";
143810152Satgutier@umich.edu    file << fin_res.access_time*1e+9 << ", ";
143910152Satgutier@umich.edu    file << fin_res.cycle_time*1e+9 << ", ";
144010152Satgutier@umich.edu//    file << fin_res.data_array2->multisubbank_interleave_cycle_time*1e+9 << ", ";
144110152Satgutier@umich.edu//    file << fin_res.data_array2->delay_request_network*1e+9 << ", ";
144210152Satgutier@umich.edu//    file << fin_res.data_array2->delay_inside_mat*1e+9 <<  ", ";
144310152Satgutier@umich.edu//    file << fin_res.data_array2.delay_reply_network*1e+9 << ", ";
144410152Satgutier@umich.edu
144510152Satgutier@umich.edu//    if (!(g_ip->fully_assoc || g_ip->pure_cam || g_ip->pure_ram))
144610152Satgutier@umich.edu//        {
144710152Satgutier@umich.edu//    	  file << fin_res.tag_array2->access_time*1e+9 << ", ";
144810152Satgutier@umich.edu//        }
144910152Satgutier@umich.edu//    else
145010152Satgutier@umich.edu//    {
145110152Satgutier@umich.edu//    	file << 0 << ", ";
145210152Satgutier@umich.edu//    }
145310152Satgutier@umich.edu//    file << fin_res.data_array2->access_time*1e+9 << ", ";
145410152Satgutier@umich.edu//    file << fin_res.data_array2->dram_refresh_period*1e+6 << ", ";
145510152Satgutier@umich.edu//    file << fin_res.data_array2->dram_array_availability <<  ", ";
145610152Satgutier@umich.edu    if (g_ip->fully_assoc || g_ip->pure_cam)
145710152Satgutier@umich.edu    {
145810152Satgutier@umich.edu        file << fin_res.power.searchOp.dynamic*1e+9 << ", ";
145910152Satgutier@umich.edu    }
146010152Satgutier@umich.edu        else
146110152Satgutier@umich.edu    {
146210152Satgutier@umich.edu                file << "N/A" << ", ";
146310152Satgutier@umich.edu    }
146410152Satgutier@umich.edu    file << fin_res.power.readOp.dynamic*1e+9 << ", ";
146510152Satgutier@umich.edu    file << fin_res.power.writeOp.dynamic*1e+9 << ", ";
146610152Satgutier@umich.edu//    if (!(g_ip->fully_assoc || g_ip->pure_cam || g_ip->pure_ram))
146710152Satgutier@umich.edu//        {
146810152Satgutier@umich.edu//        	file << fin_res.tag_array2->power.readOp.dynamic*1e+9 << ", ";
146910152Satgutier@umich.edu//        }
147010152Satgutier@umich.edu//        	else
147110152Satgutier@umich.edu//        {
147210152Satgutier@umich.edu//        		file << "NA" << ", ";
147310152Satgutier@umich.edu//        }
147410152Satgutier@umich.edu//    file << fin_res.data_array2->power.readOp.dynamic*1e+9 << ", ";
147510152Satgutier@umich.edu//    if (g_ip->fully_assoc || g_ip->pure_cam)
147610152Satgutier@umich.edu//        {
147710152Satgutier@umich.edu//    	    file << fin_res.power.searchOp.dynamic*1000/fin_res.cycle_time << ", ";
147810152Satgutier@umich.edu//        }
147910152Satgutier@umich.edu//        	else
148010152Satgutier@umich.edu//        {
148110152Satgutier@umich.edu//        	file << fin_res.power.readOp.dynamic*1000/fin_res.cycle_time << ", ";
148210152Satgutier@umich.edu//        }
148310152Satgutier@umich.edu
148410152Satgutier@umich.edu    file <<( fin_res.power.readOp.leakage + fin_res.power.readOp.gate_leakage )*1000 << ", ";
148510152Satgutier@umich.edu//    file << fin_res.leak_power_with_sleep_transistors_in_mats*1000 << ", ";
148610152Satgutier@umich.edu//    file << fin_res.data_array.refresh_power / fin_res.data_array.total_power.readOp.leakage << ", ";
148710152Satgutier@umich.edu    file << fin_res.area*1e-6 << ", ";
148810152Satgutier@umich.edu
148910152Satgutier@umich.edu    file << fin_res.data_array2->Ndwl << ", ";
149010152Satgutier@umich.edu    file << fin_res.data_array2->Ndbl << ", ";
149110152Satgutier@umich.edu    file << fin_res.data_array2->Nspd << ", ";
149210152Satgutier@umich.edu    file << fin_res.data_array2->deg_bl_muxing << ", ";
149310152Satgutier@umich.edu    file << fin_res.data_array2->Ndsam_lev_1 << ", ";
149410152Satgutier@umich.edu    file << fin_res.data_array2->Ndsam_lev_2 << ", ";
149510152Satgutier@umich.edu    file << fin_res.data_array2->area_efficiency << ", ";
149610152Satgutier@umich.edu    if (!(g_ip->fully_assoc || g_ip->pure_cam || g_ip->pure_ram))
149710152Satgutier@umich.edu    {
149810152Satgutier@umich.edu    file << fin_res.tag_array2->Ndwl << ", ";
149910152Satgutier@umich.edu    file << fin_res.tag_array2->Ndbl << ", ";
150010152Satgutier@umich.edu    file << fin_res.tag_array2->Nspd << ", ";
150110152Satgutier@umich.edu    file << fin_res.tag_array2->deg_bl_muxing << ", ";
150210152Satgutier@umich.edu    file << fin_res.tag_array2->Ndsam_lev_1 << ", ";
150310152Satgutier@umich.edu    file << fin_res.tag_array2->Ndsam_lev_2 << ", ";
150410152Satgutier@umich.edu    file << fin_res.tag_array2->area_efficiency << ", ";
150510152Satgutier@umich.edu    }
150610152Satgutier@umich.edu    else
150710152Satgutier@umich.edu    {
150810152Satgutier@umich.edu        file << "N/A" << ", ";
150910152Satgutier@umich.edu        file << "N/A"<< ", ";
151010152Satgutier@umich.edu        file << "N/A" << ", ";
151110152Satgutier@umich.edu        file << "N/A" << ", ";
151210152Satgutier@umich.edu        file << "N/A" << ", ";
151310152Satgutier@umich.edu        file << "N/A" << ", ";
151410152Satgutier@umich.edu        file << "N/A" << ", ";
151510152Satgutier@umich.edu    }
151610152Satgutier@umich.edu
151710152Satgutier@umich.edu//    file << g_tp.wire_inside_mat.R_per_um << ", ";
151810152Satgutier@umich.edu//    file << g_tp.wire_inside_mat.C_per_um / 1e-15 << ", ";
151910152Satgutier@umich.edu//    file << g_tp.unit_len_wire_del / 1e-12 << ", ";
152010152Satgutier@umich.edu//    file << g_tp.FO4 / 1e-12 << ", ";
152110152Satgutier@umich.edu//    file << fin_res.data_array.delay_route_to_bank / 1e-9 << ", ";
152210152Satgutier@umich.edu//    file << fin_res.data_array.delay_crossbar / 1e-9 << ", ";
152310152Satgutier@umich.edu//    file << fin_res.data_array.dyn_read_energy_from_closed_page / 1e-9 << ", ";
152410152Satgutier@umich.edu//    file << fin_res.data_array.dyn_read_energy_from_open_page / 1e-9 << ", ";
152510152Satgutier@umich.edu//    file << fin_res.data_array.leak_power_subbank_closed_page / 1e-3 << ", ";
152610152Satgutier@umich.edu//    file << fin_res.data_array.leak_power_subbank_open_page / 1e-3 << ", ";
152710152Satgutier@umich.edu//    file << fin_res.data_array.leak_power_request_and_reply_networks / 1e-3 << ", ";
152810152Satgutier@umich.edu//    file << fin_res.data_array.number_subbanks << ", " ;
152910152Satgutier@umich.edu//    file << fin_res.data_array.page_size_in_bits << ", " ;
153010152Satgutier@umich.edu//    file << fin_res.data_array.activate_energy * 1e9 << ", " ;
153110152Satgutier@umich.edu//    file << fin_res.data_array.read_energy * 1e9 << ", " ;
153210152Satgutier@umich.edu//    file << fin_res.data_array.write_energy * 1e9 << ", " ;
153310152Satgutier@umich.edu//    file << fin_res.data_array.precharge_energy * 1e9 << ", " ;
153410152Satgutier@umich.edu//    file << fin_res.data_array.trcd * 1e9 << ", " ;
153510152Satgutier@umich.edu//    file << fin_res.data_array.cas_latency * 1e9 << ", " ;
153610152Satgutier@umich.edu//    file << fin_res.data_array.precharge_delay * 1e9 << ", " ;
153710152Satgutier@umich.edu//    file << fin_res.data_array.all_banks_height / fin_res.data_array.all_banks_width;
153810152Satgutier@umich.edu    file<<endl;
153910152Satgutier@umich.edu  }
154010152Satgutier@umich.edu  file.close();
154110152Satgutier@umich.edu}
154210152Satgutier@umich.edu
154310152Satgutier@umich.edu
154410152Satgutier@umich.edu
154510152Satgutier@umich.eduvoid output_UCA(uca_org_t *fr)
154610152Satgutier@umich.edu{
154710152Satgutier@umich.edu  //    if (NUCA)
154810152Satgutier@umich.edu  if (0) {
154910152Satgutier@umich.edu    cout << "\n\n Detailed Bank Stats:\n";
155010152Satgutier@umich.edu    cout << "    Bank Size (bytes): %d\n" <<
155110152Satgutier@umich.edu                                     (int) (g_ip->cache_sz);
155210152Satgutier@umich.edu  }
155310152Satgutier@umich.edu  else {
155410152Satgutier@umich.edu    if (g_ip->data_arr_ram_cell_tech_type == 3) {
155510152Satgutier@umich.edu      cout << "\n---------- CACTI version 6.5, Uniform Cache Access " <<
155610152Satgutier@umich.edu        "Logic Process Based DRAM Model ----------\n";
155710152Satgutier@umich.edu    }
155810152Satgutier@umich.edu    else if (g_ip->data_arr_ram_cell_tech_type == 4) {
155910152Satgutier@umich.edu      cout << "\n---------- CACTI version 6.5, Uniform" <<
156010152Satgutier@umich.edu        "Cache Access Commodity DRAM Model ----------\n";
156110152Satgutier@umich.edu    }
156210152Satgutier@umich.edu    else {
156310152Satgutier@umich.edu      cout << "\n---------- CACTI version 6.5, Uniform Cache Access "
156410152Satgutier@umich.edu        "SRAM Model ----------\n";
156510152Satgutier@umich.edu    }
156610152Satgutier@umich.edu    cout << "\nCache Parameters:\n";
156710152Satgutier@umich.edu    cout << "    Total cache size (bytes): " <<
156810152Satgutier@umich.edu      (int) (g_ip->cache_sz) << endl;
156910152Satgutier@umich.edu  }
157010152Satgutier@umich.edu
157110152Satgutier@umich.edu  cout << "    Number of banks: " << (int) g_ip->nbanks << endl;
157210152Satgutier@umich.edu  if (g_ip->fully_assoc|| g_ip->pure_cam)
157310152Satgutier@umich.edu    cout << "    Associativity: fully associative\n";
157410152Satgutier@umich.edu  else {
157510152Satgutier@umich.edu    if (g_ip->tag_assoc == 1)
157610152Satgutier@umich.edu      cout << "    Associativity: direct mapped\n";
157710152Satgutier@umich.edu    else
157810152Satgutier@umich.edu      cout << "    Associativity: " <<
157910152Satgutier@umich.edu        g_ip->tag_assoc << endl;
158010152Satgutier@umich.edu  }
158110152Satgutier@umich.edu
158210152Satgutier@umich.edu
158310152Satgutier@umich.edu  cout << "    Block size (bytes): " << g_ip->line_sz << endl;
158410152Satgutier@umich.edu  cout << "    Read/write Ports: " <<
158510152Satgutier@umich.edu    g_ip->num_rw_ports << endl;
158610152Satgutier@umich.edu  cout << "    Read ports: " <<
158710152Satgutier@umich.edu    g_ip->num_rd_ports << endl;
158810152Satgutier@umich.edu  cout << "    Write ports: " <<
158910152Satgutier@umich.edu    g_ip->num_wr_ports << endl;
159010152Satgutier@umich.edu  if (g_ip->fully_assoc|| g_ip->pure_cam)
159110152Satgutier@umich.edu          cout << "    search ports: " <<
159210152Satgutier@umich.edu              g_ip->num_search_ports << endl;
159310152Satgutier@umich.edu  cout << "    Technology size (nm): " <<
159410152Satgutier@umich.edu    g_ip->F_sz_nm << endl << endl;
159510152Satgutier@umich.edu
159610152Satgutier@umich.edu  cout << "    Access time (ns): " << fr->access_time*1e9 << endl;
159710152Satgutier@umich.edu  cout << "    Cycle time (ns):  " << fr->cycle_time*1e9 << endl;
159810152Satgutier@umich.edu  if (g_ip->data_arr_ram_cell_tech_type >= 4) {
159910152Satgutier@umich.edu    cout << "    Precharge Delay (ns): " << fr->data_array2->precharge_delay*1e9 << endl;
160010152Satgutier@umich.edu    cout << "    Activate Energy (nJ): " << fr->data_array2->activate_energy*1e9 << endl;
160110152Satgutier@umich.edu    cout << "    Read Energy (nJ): " << fr->data_array2->read_energy*1e9 << endl;
160210152Satgutier@umich.edu    cout << "    Write Energy (nJ): " << fr->data_array2->write_energy*1e9 << endl;
160310152Satgutier@umich.edu    cout << "    Precharge Energy (nJ): " << fr->data_array2->precharge_energy*1e9 << endl;
160410152Satgutier@umich.edu    cout << "    Leakage Power Closed Page (mW): " << fr->data_array2->leak_power_subbank_closed_page*1e3 << endl;
160510152Satgutier@umich.edu    cout << "    Leakage Power Open Page (mW): " << fr->data_array2->leak_power_subbank_open_page*1e3 << endl;
160610152Satgutier@umich.edu    cout << "    Leakage Power I/O (mW): " << fr->data_array2->leak_power_request_and_reply_networks*1e3 << endl;
160710152Satgutier@umich.edu    cout << "    Refresh power (mW): " <<
160810152Satgutier@umich.edu      fr->data_array2->refresh_power*1e3 << endl;
160910152Satgutier@umich.edu  }
161010152Satgutier@umich.edu  else {
161110152Satgutier@umich.edu          if ((g_ip->fully_assoc|| g_ip->pure_cam))
161210152Satgutier@umich.edu          {
161310152Satgutier@umich.edu                  cout << "    Total dynamic associative search energy per access (nJ): " <<
161410152Satgutier@umich.edu                  fr->power.searchOp.dynamic*1e9 << endl;
161510152Satgutier@umich.edu//		  cout << "    Total dynamic read energy per access (nJ): " <<
161610152Satgutier@umich.edu//		  fr->power.readOp.dynamic*1e9 << endl;
161710152Satgutier@umich.edu//		  cout << "    Total dynamic write energy per access (nJ): " <<
161810152Satgutier@umich.edu//		  fr->power.writeOp.dynamic*1e9 << endl;
161910152Satgutier@umich.edu          }
162010152Satgutier@umich.edu//	  else
162110152Satgutier@umich.edu//	  {
162210152Satgutier@umich.edu                  cout << "    Total dynamic read energy per access (nJ): " <<
162310152Satgutier@umich.edu                  fr->power.readOp.dynamic*1e9 << endl;
162410152Satgutier@umich.edu                  cout << "    Total dynamic write energy per access (nJ): " <<
162510152Satgutier@umich.edu                  fr->power.writeOp.dynamic*1e9 << endl;
162610152Satgutier@umich.edu//	  }
162710152Satgutier@umich.edu          cout << "    Total leakage power of a bank"
162810152Satgutier@umich.edu          " (mW): " << fr->power.readOp.leakage*1e3 << endl;
162910152Satgutier@umich.edu          cout << "    Total gate leakage power of a bank"
163010152Satgutier@umich.edu          " (mW): " << fr->power.readOp.gate_leakage*1e3 << endl;
163110152Satgutier@umich.edu  }
163210152Satgutier@umich.edu
163310152Satgutier@umich.edu  if (g_ip->data_arr_ram_cell_tech_type ==3 || g_ip->data_arr_ram_cell_tech_type ==4)
163410152Satgutier@umich.edu  {
163510152Satgutier@umich.edu  }
163610152Satgutier@umich.edu  cout <<  "    Cache height x width (mm): " <<
163710152Satgutier@umich.edu    fr->cache_ht*1e-3 << " x " << fr->cache_len*1e-3 << endl << endl;
163810152Satgutier@umich.edu
163910152Satgutier@umich.edu
164010152Satgutier@umich.edu  cout << "    Best Ndwl : " << fr->data_array2->Ndwl << endl;
164110152Satgutier@umich.edu  cout << "    Best Ndbl : " << fr->data_array2->Ndbl << endl;
164210152Satgutier@umich.edu  cout << "    Best Nspd : " << fr->data_array2->Nspd << endl;
164310152Satgutier@umich.edu  cout << "    Best Ndcm : " << fr->data_array2->deg_bl_muxing << endl;
164410152Satgutier@umich.edu  cout << "    Best Ndsam L1 : " << fr->data_array2->Ndsam_lev_1 << endl;
164510152Satgutier@umich.edu  cout << "    Best Ndsam L2 : " << fr->data_array2->Ndsam_lev_2 << endl << endl;
164610152Satgutier@umich.edu
164710152Satgutier@umich.edu  if ((!(g_ip->pure_ram|| g_ip->pure_cam || g_ip->fully_assoc)) && !g_ip->is_main_mem)
164810152Satgutier@umich.edu  {
164910152Satgutier@umich.edu    cout << "    Best Ntwl : " << fr->tag_array2->Ndwl << endl;
165010152Satgutier@umich.edu    cout << "    Best Ntbl : " << fr->tag_array2->Ndbl << endl;
165110152Satgutier@umich.edu    cout << "    Best Ntspd : " << fr->tag_array2->Nspd << endl;
165210152Satgutier@umich.edu    cout << "    Best Ntcm : " << fr->tag_array2->deg_bl_muxing << endl;
165310152Satgutier@umich.edu    cout << "    Best Ntsam L1 : " << fr->tag_array2->Ndsam_lev_1 << endl;
165410152Satgutier@umich.edu    cout << "    Best Ntsam L2 : " << fr->tag_array2->Ndsam_lev_2 << endl;
165510152Satgutier@umich.edu  }
165610152Satgutier@umich.edu
165710152Satgutier@umich.edu  switch (fr->data_array2->wt) {
165810152Satgutier@umich.edu    case (0):
165910152Satgutier@umich.edu      cout <<  "    Data array, H-tree wire type: Delay optimized global wires\n";
166010152Satgutier@umich.edu      break;
166110152Satgutier@umich.edu    case (1):
166210152Satgutier@umich.edu      cout <<  "    Data array, H-tree wire type: Global wires with 5\% delay penalty\n";
166310152Satgutier@umich.edu      break;
166410152Satgutier@umich.edu    case (2):
166510152Satgutier@umich.edu      cout <<  "    Data array, H-tree wire type: Global wires with 10\% delay penalty\n";
166610152Satgutier@umich.edu      break;
166710152Satgutier@umich.edu    case (3):
166810152Satgutier@umich.edu      cout <<  "    Data array, H-tree wire type: Global wires with 20\% delay penalty\n";
166910152Satgutier@umich.edu      break;
167010152Satgutier@umich.edu    case (4):
167110152Satgutier@umich.edu      cout <<  "    Data array, H-tree wire type: Global wires with 30\% delay penalty\n";
167210152Satgutier@umich.edu      break;
167310152Satgutier@umich.edu    case (5):
167410152Satgutier@umich.edu      cout <<  "    Data array, wire type: Low swing wires\n";
167510152Satgutier@umich.edu      break;
167610152Satgutier@umich.edu    default:
167710152Satgutier@umich.edu      cout << "ERROR - Unknown wire type " << (int) fr->data_array2->wt <<endl;
167810152Satgutier@umich.edu      exit(0);
167910152Satgutier@umich.edu  }
168010152Satgutier@umich.edu
168110152Satgutier@umich.edu  if (!(g_ip->pure_ram|| g_ip->pure_cam || g_ip->fully_assoc)) {
168210152Satgutier@umich.edu    switch (fr->tag_array2->wt) {
168310152Satgutier@umich.edu      case (0):
168410152Satgutier@umich.edu        cout <<  "    Tag array, H-tree wire type: Delay optimized global wires\n";
168510152Satgutier@umich.edu        break;
168610152Satgutier@umich.edu      case (1):
168710152Satgutier@umich.edu        cout <<  "    Tag array, H-tree wire type: Global wires with 5\% delay penalty\n";
168810152Satgutier@umich.edu        break;
168910152Satgutier@umich.edu      case (2):
169010152Satgutier@umich.edu        cout <<  "    Tag array, H-tree wire type: Global wires with 10\% delay penalty\n";
169110152Satgutier@umich.edu        break;
169210152Satgutier@umich.edu      case (3):
169310152Satgutier@umich.edu        cout <<  "    Tag array, H-tree wire type: Global wires with 20\% delay penalty\n";
169410152Satgutier@umich.edu        break;
169510152Satgutier@umich.edu      case (4):
169610152Satgutier@umich.edu        cout <<  "    Tag array, H-tree wire type: Global wires with 30\% delay penalty\n";
169710152Satgutier@umich.edu        break;
169810152Satgutier@umich.edu      case (5):
169910152Satgutier@umich.edu        cout <<  "    Tag array, wire type: Low swing wires\n";
170010152Satgutier@umich.edu        break;
170110152Satgutier@umich.edu      default:
170210152Satgutier@umich.edu        cout << "ERROR - Unknown wire type " << (int) fr->tag_array2->wt <<endl;
170310152Satgutier@umich.edu        exit(-1);
170410152Satgutier@umich.edu    }
170510152Satgutier@umich.edu  }
170610152Satgutier@umich.edu
170710152Satgutier@umich.edu  if (g_ip->print_detail)
170810152Satgutier@umich.edu  {
170910152Satgutier@umich.edu    //if(g_ip->fully_assoc) return;
171010152Satgutier@umich.edu
171110152Satgutier@umich.edu    /* Delay stats */
171210152Satgutier@umich.edu    /* data array stats */
171310152Satgutier@umich.edu    cout << endl << "Time Components:" << endl << endl;
171410152Satgutier@umich.edu
171510152Satgutier@umich.edu    cout << "  Data side (with Output driver) (ns): " <<
171610152Satgutier@umich.edu      fr->data_array2->access_time/1e-9 << endl;
171710152Satgutier@umich.edu
171810152Satgutier@umich.edu    cout <<  "\tH-tree input delay (ns): " <<
171910152Satgutier@umich.edu      fr->data_array2->delay_route_to_bank * 1e9 +
172010152Satgutier@umich.edu      fr->data_array2->delay_input_htree * 1e9 << endl;
172110152Satgutier@umich.edu
172210152Satgutier@umich.edu    if (!(g_ip->pure_cam || g_ip->fully_assoc))
172310152Satgutier@umich.edu    {
172410152Satgutier@umich.edu      cout <<  "\tDecoder + wordline delay (ns): " <<
172510152Satgutier@umich.edu        fr->data_array2->delay_row_predecode_driver_and_block * 1e9 +
172610152Satgutier@umich.edu        fr->data_array2->delay_row_decoder * 1e9 << endl;
172710152Satgutier@umich.edu    }
172810152Satgutier@umich.edu    else
172910152Satgutier@umich.edu    {
173010152Satgutier@umich.edu        cout <<  "\tCAM search delay (ns): " <<
173110152Satgutier@umich.edu          fr->data_array2->delay_matchlines * 1e9 << endl;
173210152Satgutier@umich.edu    }
173310152Satgutier@umich.edu
173410152Satgutier@umich.edu    cout <<  "\tBitline delay (ns): " <<
173510152Satgutier@umich.edu      fr->data_array2->delay_bitlines/1e-9 << endl;
173610152Satgutier@umich.edu
173710152Satgutier@umich.edu    cout <<  "\tSense Amplifier delay (ns): " <<
173810152Satgutier@umich.edu      fr->data_array2->delay_sense_amp * 1e9 << endl;
173910152Satgutier@umich.edu
174010152Satgutier@umich.edu
174110152Satgutier@umich.edu    cout <<  "\tH-tree output delay (ns): " <<
174210152Satgutier@umich.edu      fr->data_array2->delay_subarray_output_driver * 1e9 +
174310152Satgutier@umich.edu      fr->data_array2->delay_dout_htree * 1e9 << endl;
174410152Satgutier@umich.edu
174510152Satgutier@umich.edu    if ((!(g_ip->pure_ram|| g_ip->pure_cam || g_ip->fully_assoc)) && !g_ip->is_main_mem)
174610152Satgutier@umich.edu    {
174710152Satgutier@umich.edu      /* tag array stats */
174810152Satgutier@umich.edu      cout << endl << "  Tag side (with Output driver) (ns): " <<
174910152Satgutier@umich.edu        fr->tag_array2->access_time/1e-9 << endl;
175010152Satgutier@umich.edu
175110152Satgutier@umich.edu      cout <<  "\tH-tree input delay (ns): " <<
175210152Satgutier@umich.edu        fr->tag_array2->delay_route_to_bank * 1e9 +
175310152Satgutier@umich.edu        fr->tag_array2->delay_input_htree * 1e9 << endl;
175410152Satgutier@umich.edu
175510152Satgutier@umich.edu      cout <<  "\tDecoder + wordline delay (ns): " <<
175610152Satgutier@umich.edu        fr->tag_array2->delay_row_predecode_driver_and_block * 1e9 +
175710152Satgutier@umich.edu        fr->tag_array2->delay_row_decoder * 1e9 << endl;
175810152Satgutier@umich.edu
175910152Satgutier@umich.edu      cout <<  "\tBitline delay (ns): " <<
176010152Satgutier@umich.edu        fr->tag_array2->delay_bitlines/1e-9 << endl;
176110152Satgutier@umich.edu
176210152Satgutier@umich.edu      cout <<  "\tSense Amplifier delay (ns): " <<
176310152Satgutier@umich.edu        fr->tag_array2->delay_sense_amp * 1e9 << endl;
176410152Satgutier@umich.edu
176510152Satgutier@umich.edu      cout <<  "\tComparator delay (ns): " <<
176610152Satgutier@umich.edu        fr->tag_array2->delay_comparator * 1e9 << endl;
176710152Satgutier@umich.edu
176810152Satgutier@umich.edu      cout <<  "\tH-tree output delay (ns): " <<
176910152Satgutier@umich.edu        fr->tag_array2->delay_subarray_output_driver * 1e9 +
177010152Satgutier@umich.edu        fr->tag_array2->delay_dout_htree * 1e9 << endl;
177110152Satgutier@umich.edu    }
177210152Satgutier@umich.edu
177310152Satgutier@umich.edu
177410152Satgutier@umich.edu
177510152Satgutier@umich.edu    /* Energy/Power stats */
177610152Satgutier@umich.edu    cout << endl << endl << "Power Components:" << endl << endl;
177710152Satgutier@umich.edu
177810152Satgutier@umich.edu    if (!(g_ip->pure_cam || g_ip->fully_assoc))
177910152Satgutier@umich.edu    {
178010152Satgutier@umich.edu        cout << "  Data array: Total dynamic read energy/access  (nJ): " <<
178110152Satgutier@umich.edu              fr->data_array2->power.readOp.dynamic * 1e9 << endl;
178210152Satgutier@umich.edu        cout << "\tTotal leakage read/write power of a bank (mW): " <<
178310152Satgutier@umich.edu                fr->data_array2->power.readOp.leakage * 1e3 << endl;
178410152Satgutier@umich.edu
178510152Satgutier@umich.edu        cout << "\tTotal energy in H-tree (that includes both "
178610152Satgutier@umich.edu              "address and data transfer) (nJ): " <<
178710152Satgutier@umich.edu                (fr->data_array2->power_addr_input_htree.readOp.dynamic +
178810152Satgutier@umich.edu                 fr->data_array2->power_data_output_htree.readOp.dynamic +
178910152Satgutier@umich.edu                 fr->data_array2->power_routing_to_bank.readOp.dynamic) * 1e9 << endl;
179010152Satgutier@umich.edu
179110152Satgutier@umich.edu        cout << "\tTotal leakage power in H-tree (that includes both "
179210152Satgutier@umich.edu              "address and data network) ((mW)): " <<
179310152Satgutier@umich.edu                (fr->data_array2->power_addr_input_htree.readOp.leakage +
179410152Satgutier@umich.edu                 fr->data_array2->power_data_output_htree.readOp.leakage +
179510152Satgutier@umich.edu                 fr->data_array2->power_routing_to_bank.readOp.leakage) * 1e3 << endl;
179610152Satgutier@umich.edu
179710152Satgutier@umich.edu        cout << "\tTotal gate leakage power in H-tree (that includes both "
179810152Satgutier@umich.edu              "address and data network) ((mW)): " <<
179910152Satgutier@umich.edu                (fr->data_array2->power_addr_input_htree.readOp.gate_leakage +
180010152Satgutier@umich.edu                 fr->data_array2->power_data_output_htree.readOp.gate_leakage +
180110152Satgutier@umich.edu                 fr->data_array2->power_routing_to_bank.readOp.gate_leakage) * 1e3 << endl;
180210152Satgutier@umich.edu
180310152Satgutier@umich.edu        cout << "\tOutput Htree inside bank Energy (nJ): " <<
180410152Satgutier@umich.edu           fr->data_array2->power_data_output_htree.readOp.dynamic * 1e9 << endl;
180510152Satgutier@umich.edu        cout <<  "\tDecoder (nJ): " <<
180610152Satgutier@umich.edu           fr->data_array2->power_row_predecoder_drivers.readOp.dynamic * 1e9 +
180710152Satgutier@umich.edu           fr->data_array2->power_row_predecoder_blocks.readOp.dynamic * 1e9 << endl;
180810152Satgutier@umich.edu        cout <<  "\tWordline (nJ): " <<
180910152Satgutier@umich.edu           fr->data_array2->power_row_decoders.readOp.dynamic * 1e9 << endl;
181010152Satgutier@umich.edu        cout <<  "\tBitline mux & associated drivers (nJ): " <<
181110152Satgutier@umich.edu           fr->data_array2->power_bit_mux_predecoder_drivers.readOp.dynamic * 1e9 +
181210152Satgutier@umich.edu           fr->data_array2->power_bit_mux_predecoder_blocks.readOp.dynamic * 1e9 +
181310152Satgutier@umich.edu           fr->data_array2->power_bit_mux_decoders.readOp.dynamic * 1e9 << endl;
181410152Satgutier@umich.edu        cout <<  "\tSense amp mux & associated drivers (nJ): " <<
181510152Satgutier@umich.edu           fr->data_array2->power_senseamp_mux_lev_1_predecoder_drivers.readOp.dynamic * 1e9 +
181610152Satgutier@umich.edu           fr->data_array2->power_senseamp_mux_lev_1_predecoder_blocks.readOp.dynamic * 1e9 +
181710152Satgutier@umich.edu           fr->data_array2->power_senseamp_mux_lev_1_decoders.readOp.dynamic * 1e9  +
181810152Satgutier@umich.edu           fr->data_array2->power_senseamp_mux_lev_2_predecoder_drivers.readOp.dynamic * 1e9 +
181910152Satgutier@umich.edu           fr->data_array2->power_senseamp_mux_lev_2_predecoder_blocks.readOp.dynamic * 1e9 +
182010152Satgutier@umich.edu           fr->data_array2->power_senseamp_mux_lev_2_decoders.readOp.dynamic * 1e9 << endl;
182110152Satgutier@umich.edu
182210152Satgutier@umich.edu        cout <<  "\tBitlines precharge and equalization circuit (nJ): " <<
182310152Satgutier@umich.edu                   fr->data_array2->power_prechg_eq_drivers.readOp.dynamic * 1e9 << endl;
182410152Satgutier@umich.edu        cout <<  "\tBitlines (nJ): " <<
182510152Satgutier@umich.edu           fr->data_array2->power_bitlines.readOp.dynamic * 1e9 << endl;
182610152Satgutier@umich.edu        cout <<  "\tSense amplifier energy (nJ): " <<
182710152Satgutier@umich.edu           fr->data_array2->power_sense_amps.readOp.dynamic * 1e9 << endl;
182810152Satgutier@umich.edu        cout <<  "\tSub-array output driver (nJ): " <<
182910152Satgutier@umich.edu           fr->data_array2->power_output_drivers_at_subarray.readOp.dynamic * 1e9 << endl;
183010152Satgutier@umich.edu    }
183110152Satgutier@umich.edu
183210152Satgutier@umich.edu        else if (g_ip->pure_cam)
183310152Satgutier@umich.edu        {
183410152Satgutier@umich.edu
183510152Satgutier@umich.edu                cout << "  CAM array:"<<endl;
183610152Satgutier@umich.edu                cout << "  Total dynamic associative search energy/access  (nJ): " <<
183710152Satgutier@umich.edu                      fr->data_array2->power.searchOp.dynamic * 1e9 << endl;
183810152Satgutier@umich.edu                cout << "\tTotal energy in H-tree (that includes both "
183910152Satgutier@umich.edu                              "match key and data transfer) (nJ): " <<
184010152Satgutier@umich.edu                      (fr->data_array2->power_htree_in_search.searchOp.dynamic +
184110152Satgutier@umich.edu                       fr->data_array2->power_htree_out_search.searchOp.dynamic +
184210152Satgutier@umich.edu                       fr->data_array2->power_routing_to_bank.searchOp.dynamic) * 1e9 << endl;
184310152Satgutier@umich.edu                cout << "\tKeyword input and result output Htrees inside bank Energy (nJ): " <<
184410152Satgutier@umich.edu                      (fr->data_array2->power_htree_in_search.searchOp.dynamic +
184510152Satgutier@umich.edu                               fr->data_array2->power_htree_out_search.searchOp.dynamic) * 1e9 << endl;
184610152Satgutier@umich.edu                cout <<  "\tSearchlines (nJ): " <<
184710152Satgutier@umich.edu                           fr->data_array2->power_searchline.searchOp.dynamic * 1e9 +
184810152Satgutier@umich.edu                           fr->data_array2->power_searchline_precharge.searchOp.dynamic * 1e9 << endl;
184910152Satgutier@umich.edu                cout <<  "\tMatchlines  (nJ): " <<
185010152Satgutier@umich.edu                       fr->data_array2->power_matchlines.searchOp.dynamic * 1e9 +
185110152Satgutier@umich.edu                           fr->data_array2->power_matchline_precharge.searchOp.dynamic * 1e9 << endl;
185210152Satgutier@umich.edu                cout <<  "\tSub-array output driver (nJ): " <<
185310152Satgutier@umich.edu                           fr->data_array2->power_output_drivers_at_subarray.searchOp.dynamic * 1e9 << endl;
185410152Satgutier@umich.edu
185510152Satgutier@umich.edu
185610152Satgutier@umich.edu                cout <<endl<< "  Total dynamic read energy/access  (nJ): " <<
185710152Satgutier@umich.edu                      fr->data_array2->power.readOp.dynamic * 1e9 << endl;
185810152Satgutier@umich.edu                cout << "\tTotal energy in H-tree (that includes both "
185910152Satgutier@umich.edu                              "address and data transfer) (nJ): " <<
186010152Satgutier@umich.edu                      (fr->data_array2->power_addr_input_htree.readOp.dynamic +
186110152Satgutier@umich.edu                       fr->data_array2->power_data_output_htree.readOp.dynamic +
186210152Satgutier@umich.edu                       fr->data_array2->power_routing_to_bank.readOp.dynamic) * 1e9 << endl;
186310152Satgutier@umich.edu                cout << "\tOutput Htree inside bank Energy (nJ): " <<
186410152Satgutier@umich.edu                           fr->data_array2->power_data_output_htree.readOp.dynamic * 1e9 << endl;
186510152Satgutier@umich.edu                cout <<  "\tDecoder (nJ): " <<
186610152Satgutier@umich.edu                           fr->data_array2->power_row_predecoder_drivers.readOp.dynamic * 1e9 +
186710152Satgutier@umich.edu                           fr->data_array2->power_row_predecoder_blocks.readOp.dynamic * 1e9 << endl;
186810152Satgutier@umich.edu                cout <<  "\tWordline (nJ): " <<
186910152Satgutier@umich.edu                           fr->data_array2->power_row_decoders.readOp.dynamic * 1e9 << endl;
187010152Satgutier@umich.edu                cout <<  "\tBitline mux & associated drivers (nJ): " <<
187110152Satgutier@umich.edu                           fr->data_array2->power_bit_mux_predecoder_drivers.readOp.dynamic * 1e9 +
187210152Satgutier@umich.edu                           fr->data_array2->power_bit_mux_predecoder_blocks.readOp.dynamic * 1e9 +
187310152Satgutier@umich.edu                           fr->data_array2->power_bit_mux_decoders.readOp.dynamic * 1e9 << endl;
187410152Satgutier@umich.edu                cout <<  "\tSense amp mux & associated drivers (nJ): " <<
187510152Satgutier@umich.edu                           fr->data_array2->power_senseamp_mux_lev_1_predecoder_drivers.readOp.dynamic * 1e9 +
187610152Satgutier@umich.edu                           fr->data_array2->power_senseamp_mux_lev_1_predecoder_blocks.readOp.dynamic * 1e9 +
187710152Satgutier@umich.edu                           fr->data_array2->power_senseamp_mux_lev_1_decoders.readOp.dynamic * 1e9  +
187810152Satgutier@umich.edu                           fr->data_array2->power_senseamp_mux_lev_2_predecoder_drivers.readOp.dynamic * 1e9 +
187910152Satgutier@umich.edu                           fr->data_array2->power_senseamp_mux_lev_2_predecoder_blocks.readOp.dynamic * 1e9 +
188010152Satgutier@umich.edu                           fr->data_array2->power_senseamp_mux_lev_2_decoders.readOp.dynamic * 1e9 << endl;
188110152Satgutier@umich.edu                cout <<  "\tBitlines (nJ): " <<
188210152Satgutier@umich.edu                           fr->data_array2->power_bitlines.readOp.dynamic * 1e9 +
188310152Satgutier@umich.edu                           fr->data_array2->power_prechg_eq_drivers.readOp.dynamic * 1e9<< endl;
188410152Satgutier@umich.edu                cout <<  "\tSense amplifier energy (nJ): " <<
188510152Satgutier@umich.edu                           fr->data_array2->power_sense_amps.readOp.dynamic * 1e9 << endl;
188610152Satgutier@umich.edu                cout <<  "\tSub-array output driver (nJ): " <<
188710152Satgutier@umich.edu                           fr->data_array2->power_output_drivers_at_subarray.readOp.dynamic * 1e9 << endl;
188810152Satgutier@umich.edu
188910152Satgutier@umich.edu                cout << endl <<"  Total leakage power of a bank (mW): " <<
189010152Satgutier@umich.edu                      fr->data_array2->power.readOp.leakage * 1e3 << endl;
189110152Satgutier@umich.edu        }
189210152Satgutier@umich.edu        else
189310152Satgutier@umich.edu        {
189410152Satgutier@umich.edu                cout << "  Fully associative array:"<<endl;
189510152Satgutier@umich.edu                cout << "  Total dynamic associative search energy/access  (nJ): " <<
189610152Satgutier@umich.edu                  fr->data_array2->power.searchOp.dynamic * 1e9 << endl;
189710152Satgutier@umich.edu                cout << "\tTotal energy in H-tree (that includes both "
189810152Satgutier@umich.edu                              "match key and data transfer) (nJ): " <<
189910152Satgutier@umich.edu                      (fr->data_array2->power_htree_in_search.searchOp.dynamic +
190010152Satgutier@umich.edu                       fr->data_array2->power_htree_out_search.searchOp.dynamic +
190110152Satgutier@umich.edu                       fr->data_array2->power_routing_to_bank.searchOp.dynamic) * 1e9 << endl;
190210152Satgutier@umich.edu                cout << "\tKeyword input and result output Htrees inside bank Energy (nJ): " <<
190310152Satgutier@umich.edu                      (fr->data_array2->power_htree_in_search.searchOp.dynamic +
190410152Satgutier@umich.edu                               fr->data_array2->power_htree_out_search.searchOp.dynamic) * 1e9 << endl;
190510152Satgutier@umich.edu                cout <<  "\tSearchlines (nJ): " <<
190610152Satgutier@umich.edu                           fr->data_array2->power_searchline.searchOp.dynamic * 1e9 +
190710152Satgutier@umich.edu                           fr->data_array2->power_searchline_precharge.searchOp.dynamic * 1e9 << endl;
190810152Satgutier@umich.edu                cout <<  "\tMatchlines  (nJ): " <<
190910152Satgutier@umich.edu                       fr->data_array2->power_matchlines.searchOp.dynamic * 1e9 +
191010152Satgutier@umich.edu                           fr->data_array2->power_matchline_precharge.searchOp.dynamic * 1e9 << endl;
191110152Satgutier@umich.edu                cout <<  "\tData portion wordline (nJ): " <<
191210152Satgutier@umich.edu                           fr->data_array2->power_matchline_to_wordline_drv.searchOp.dynamic * 1e9 << endl;
191310152Satgutier@umich.edu                cout <<  "\tData Bitlines (nJ): " <<
191410152Satgutier@umich.edu                           fr->data_array2->power_bitlines.searchOp.dynamic * 1e9 +
191510152Satgutier@umich.edu                           fr->data_array2->power_prechg_eq_drivers.searchOp.dynamic * 1e9 << endl;
191610152Satgutier@umich.edu                cout <<  "\tSense amplifier energy (nJ): " <<
191710152Satgutier@umich.edu                           fr->data_array2->power_sense_amps.searchOp.dynamic * 1e9 << endl;
191810152Satgutier@umich.edu                cout <<  "\tSub-array output driver (nJ): " <<
191910152Satgutier@umich.edu                           fr->data_array2->power_output_drivers_at_subarray.searchOp.dynamic * 1e9 << endl;
192010152Satgutier@umich.edu
192110152Satgutier@umich.edu
192210152Satgutier@umich.edu                cout <<endl<< "  Total dynamic read energy/access  (nJ): " <<
192310152Satgutier@umich.edu                      fr->data_array2->power.readOp.dynamic * 1e9 << endl;
192410152Satgutier@umich.edu                cout << "\tTotal energy in H-tree (that includes both "
192510152Satgutier@umich.edu                              "address and data transfer) (nJ): " <<
192610152Satgutier@umich.edu                      (fr->data_array2->power_addr_input_htree.readOp.dynamic +
192710152Satgutier@umich.edu                       fr->data_array2->power_data_output_htree.readOp.dynamic +
192810152Satgutier@umich.edu                       fr->data_array2->power_routing_to_bank.readOp.dynamic) * 1e9 << endl;
192910152Satgutier@umich.edu                cout << "\tOutput Htree inside bank Energy (nJ): " <<
193010152Satgutier@umich.edu                           fr->data_array2->power_data_output_htree.readOp.dynamic * 1e9 << endl;
193110152Satgutier@umich.edu                cout <<  "\tDecoder (nJ): " <<
193210152Satgutier@umich.edu                           fr->data_array2->power_row_predecoder_drivers.readOp.dynamic * 1e9 +
193310152Satgutier@umich.edu                           fr->data_array2->power_row_predecoder_blocks.readOp.dynamic * 1e9 << endl;
193410152Satgutier@umich.edu                cout <<  "\tWordline (nJ): " <<
193510152Satgutier@umich.edu                           fr->data_array2->power_row_decoders.readOp.dynamic * 1e9 << endl;
193610152Satgutier@umich.edu                cout <<  "\tBitline mux & associated drivers (nJ): " <<
193710152Satgutier@umich.edu                           fr->data_array2->power_bit_mux_predecoder_drivers.readOp.dynamic * 1e9 +
193810152Satgutier@umich.edu                           fr->data_array2->power_bit_mux_predecoder_blocks.readOp.dynamic * 1e9 +
193910152Satgutier@umich.edu                           fr->data_array2->power_bit_mux_decoders.readOp.dynamic * 1e9 << endl;
194010152Satgutier@umich.edu                cout <<  "\tSense amp mux & associated drivers (nJ): " <<
194110152Satgutier@umich.edu                           fr->data_array2->power_senseamp_mux_lev_1_predecoder_drivers.readOp.dynamic * 1e9 +
194210152Satgutier@umich.edu                           fr->data_array2->power_senseamp_mux_lev_1_predecoder_blocks.readOp.dynamic * 1e9 +
194310152Satgutier@umich.edu                           fr->data_array2->power_senseamp_mux_lev_1_decoders.readOp.dynamic * 1e9  +
194410152Satgutier@umich.edu                           fr->data_array2->power_senseamp_mux_lev_2_predecoder_drivers.readOp.dynamic * 1e9 +
194510152Satgutier@umich.edu                           fr->data_array2->power_senseamp_mux_lev_2_predecoder_blocks.readOp.dynamic * 1e9 +
194610152Satgutier@umich.edu                           fr->data_array2->power_senseamp_mux_lev_2_decoders.readOp.dynamic * 1e9 << endl;
194710152Satgutier@umich.edu                cout <<  "\tBitlines (nJ): " <<
194810152Satgutier@umich.edu                           fr->data_array2->power_bitlines.readOp.dynamic * 1e9 +
194910152Satgutier@umich.edu                           fr->data_array2->power_prechg_eq_drivers.readOp.dynamic * 1e9<< endl;
195010152Satgutier@umich.edu                cout <<  "\tSense amplifier energy (nJ): " <<
195110152Satgutier@umich.edu                           fr->data_array2->power_sense_amps.readOp.dynamic * 1e9 << endl;
195210152Satgutier@umich.edu                cout <<  "\tSub-array output driver (nJ): " <<
195310152Satgutier@umich.edu                           fr->data_array2->power_output_drivers_at_subarray.readOp.dynamic * 1e9 << endl;
195410152Satgutier@umich.edu
195510152Satgutier@umich.edu                cout << endl <<"  Total leakage power of a bank (mW): " <<
195610152Satgutier@umich.edu                  fr->data_array2->power.readOp.leakage * 1e3 << endl;
195710152Satgutier@umich.edu      }
195810152Satgutier@umich.edu
195910152Satgutier@umich.edu
196010152Satgutier@umich.edu    if ((!(g_ip->pure_ram|| g_ip->pure_cam || g_ip->fully_assoc)) && !g_ip->is_main_mem)
196110152Satgutier@umich.edu    {
196210152Satgutier@umich.edu      cout << endl << "  Tag array:  Total dynamic read energy/access (nJ): " <<
196310152Satgutier@umich.edu        fr->tag_array2->power.readOp.dynamic * 1e9 << endl;
196410152Satgutier@umich.edu      cout << "\tTotal leakage read/write power of a bank (mW): " <<
196510152Satgutier@umich.edu          fr->tag_array2->power.readOp.leakage * 1e3 << endl;
196610152Satgutier@umich.edu      cout << "\tTotal energy in H-tree (that includes both "
196710152Satgutier@umich.edu        "address and data transfer) (nJ): " <<
196810152Satgutier@umich.edu          (fr->tag_array2->power_addr_input_htree.readOp.dynamic +
196910152Satgutier@umich.edu           fr->tag_array2->power_data_output_htree.readOp.dynamic +
197010152Satgutier@umich.edu           fr->tag_array2->power_routing_to_bank.readOp.dynamic) * 1e9 << endl;
197110152Satgutier@umich.edu
197210152Satgutier@umich.edu      cout << "\tTotal leakage power in H-tree (that includes both "
197310152Satgutier@umich.edu              "address and data network) ((mW)): " <<
197410152Satgutier@umich.edu                (fr->tag_array2->power_addr_input_htree.readOp.leakage +
197510152Satgutier@umich.edu                 fr->tag_array2->power_data_output_htree.readOp.leakage +
197610152Satgutier@umich.edu                 fr->tag_array2->power_routing_to_bank.readOp.leakage) * 1e3 << endl;
197710152Satgutier@umich.edu
197810152Satgutier@umich.edu          cout << "\tTotal gate leakage power in H-tree (that includes both "
197910152Satgutier@umich.edu              "address and data network) ((mW)): " <<
198010152Satgutier@umich.edu                (fr->tag_array2->power_addr_input_htree.readOp.gate_leakage +
198110152Satgutier@umich.edu                 fr->tag_array2->power_data_output_htree.readOp.gate_leakage +
198210152Satgutier@umich.edu                 fr->tag_array2->power_routing_to_bank.readOp.gate_leakage) * 1e3 << endl;
198310152Satgutier@umich.edu
198410152Satgutier@umich.edu      cout << "\tOutput Htree inside a bank Energy (nJ): " <<
198510152Satgutier@umich.edu        fr->tag_array2->power_data_output_htree.readOp.dynamic * 1e9 << endl;
198610152Satgutier@umich.edu      cout <<  "\tDecoder (nJ): " <<
198710152Satgutier@umich.edu        fr->tag_array2->power_row_predecoder_drivers.readOp.dynamic * 1e9 +
198810152Satgutier@umich.edu        fr->tag_array2->power_row_predecoder_blocks.readOp.dynamic * 1e9 << endl;
198910152Satgutier@umich.edu      cout <<  "\tWordline (nJ): " <<
199010152Satgutier@umich.edu        fr->tag_array2->power_row_decoders.readOp.dynamic * 1e9 << endl;
199110152Satgutier@umich.edu      cout <<  "\tBitline mux & associated drivers (nJ): " <<
199210152Satgutier@umich.edu        fr->tag_array2->power_bit_mux_predecoder_drivers.readOp.dynamic * 1e9 +
199310152Satgutier@umich.edu        fr->tag_array2->power_bit_mux_predecoder_blocks.readOp.dynamic * 1e9 +
199410152Satgutier@umich.edu        fr->tag_array2->power_bit_mux_decoders.readOp.dynamic * 1e9 << endl;
199510152Satgutier@umich.edu      cout <<  "\tSense amp mux & associated drivers (nJ): " <<
199610152Satgutier@umich.edu        fr->tag_array2->power_senseamp_mux_lev_1_predecoder_drivers.readOp.dynamic * 1e9 +
199710152Satgutier@umich.edu        fr->tag_array2->power_senseamp_mux_lev_1_predecoder_blocks.readOp.dynamic * 1e9 +
199810152Satgutier@umich.edu        fr->tag_array2->power_senseamp_mux_lev_1_decoders.readOp.dynamic * 1e9  +
199910152Satgutier@umich.edu        fr->tag_array2->power_senseamp_mux_lev_2_predecoder_drivers.readOp.dynamic * 1e9 +
200010152Satgutier@umich.edu        fr->tag_array2->power_senseamp_mux_lev_2_predecoder_blocks.readOp.dynamic * 1e9 +
200110152Satgutier@umich.edu        fr->tag_array2->power_senseamp_mux_lev_2_decoders.readOp.dynamic * 1e9 << endl;
200210152Satgutier@umich.edu      cout <<  "\tBitlines precharge and equalization circuit (nJ): " <<
200310152Satgutier@umich.edu        fr->tag_array2->power_prechg_eq_drivers.readOp.dynamic * 1e9 << endl;
200410152Satgutier@umich.edu      cout <<  "\tBitlines (nJ): " <<
200510152Satgutier@umich.edu        fr->tag_array2->power_bitlines.readOp.dynamic * 1e9 << endl;
200610152Satgutier@umich.edu      cout <<  "\tSense amplifier energy (nJ): " <<
200710152Satgutier@umich.edu        fr->tag_array2->power_sense_amps.readOp.dynamic * 1e9 << endl;
200810152Satgutier@umich.edu      cout <<  "\tSub-array output driver (nJ): " <<
200910152Satgutier@umich.edu        fr->tag_array2->power_output_drivers_at_subarray.readOp.dynamic * 1e9 << endl;
201010152Satgutier@umich.edu    }
201110152Satgutier@umich.edu
201210152Satgutier@umich.edu    cout << endl << endl <<  "Area Components:" << endl << endl;
201310152Satgutier@umich.edu    /* Data array area stats */
201410152Satgutier@umich.edu    if (!(g_ip->pure_cam || g_ip->fully_assoc))
201510152Satgutier@umich.edu        cout <<  "  Data array: Area (mm2): " << fr->data_array2->area * 1e-6 << endl;
201610152Satgutier@umich.edu    else if (g_ip->pure_cam)
201710152Satgutier@umich.edu        cout <<  "  CAM array: Area (mm2): " << fr->data_array2->area * 1e-6 << endl;
201810152Satgutier@umich.edu    else
201910152Satgutier@umich.edu        cout <<  "  Fully associative cache array: Area (mm2): " << fr->data_array2->area * 1e-6 << endl;
202010152Satgutier@umich.edu    cout <<  "\tHeight (mm): " <<
202110152Satgutier@umich.edu      fr->data_array2->all_banks_height*1e-3 << endl;
202210152Satgutier@umich.edu    cout <<  "\tWidth (mm): " <<
202310152Satgutier@umich.edu      fr->data_array2->all_banks_width*1e-3 << endl;
202410152Satgutier@umich.edu    if (g_ip->print_detail) {
202510152Satgutier@umich.edu      cout <<  "\tArea efficiency (Memory cell area/Total area) - " <<
202610152Satgutier@umich.edu        fr->data_array2->area_efficiency << " %" << endl;
202710152Satgutier@umich.edu      cout << "\t\tMAT Height (mm): " <<
202810152Satgutier@umich.edu        fr->data_array2->mat_height*1e-3 << endl;
202910152Satgutier@umich.edu      cout << "\t\tMAT Length (mm): " <<
203010152Satgutier@umich.edu        fr->data_array2->mat_length*1e-3 << endl;
203110152Satgutier@umich.edu      cout << "\t\tSubarray Height (mm): " <<
203210152Satgutier@umich.edu        fr->data_array2->subarray_height*1e-3 << endl;
203310152Satgutier@umich.edu      cout << "\t\tSubarray Length (mm): " <<
203410152Satgutier@umich.edu        fr->data_array2->subarray_length*1e-3 << endl;
203510152Satgutier@umich.edu    }
203610152Satgutier@umich.edu
203710152Satgutier@umich.edu    /* Tag array area stats */
203810152Satgutier@umich.edu    if ((!(g_ip->pure_ram|| g_ip->pure_cam || g_ip->fully_assoc)) && !g_ip->is_main_mem)
203910152Satgutier@umich.edu    {
204010152Satgutier@umich.edu      cout << endl << "  Tag array: Area (mm2): " << fr->tag_array2->area * 1e-6 << endl;
204110152Satgutier@umich.edu      cout <<  "\tHeight (mm): " <<
204210152Satgutier@umich.edu        fr->tag_array2->all_banks_height*1e-3 << endl;
204310152Satgutier@umich.edu      cout <<  "\tWidth (mm): " <<
204410152Satgutier@umich.edu        fr->tag_array2->all_banks_width*1e-3 << endl;
204510152Satgutier@umich.edu      if (g_ip->print_detail)
204610152Satgutier@umich.edu      {
204710152Satgutier@umich.edu        cout <<  "\tArea efficiency (Memory cell area/Total area) - " <<
204810152Satgutier@umich.edu          fr->tag_array2->area_efficiency << " %" << endl;
204910152Satgutier@umich.edu      cout << "\t\tMAT Height (mm): " <<
205010152Satgutier@umich.edu        fr->tag_array2->mat_height*1e-3 << endl;
205110152Satgutier@umich.edu      cout << "\t\tMAT Length (mm): " <<
205210152Satgutier@umich.edu        fr->tag_array2->mat_length*1e-3 << endl;
205310152Satgutier@umich.edu      cout << "\t\tSubarray Height (mm): " <<
205410152Satgutier@umich.edu        fr->tag_array2->subarray_height*1e-3 << endl;
205510152Satgutier@umich.edu      cout << "\t\tSubarray Length (mm): " <<
205610152Satgutier@umich.edu        fr->tag_array2->subarray_length*1e-3 << endl;
205710152Satgutier@umich.edu      }
205810152Satgutier@umich.edu    }
205910152Satgutier@umich.edu    Wire wpr;
206010152Satgutier@umich.edu    wpr.print_wire();
206110152Satgutier@umich.edu
206210152Satgutier@umich.edu    //cout << "FO4 = " << g_tp.FO4 << endl;
206310152Satgutier@umich.edu  }
206410152Satgutier@umich.edu}
206510152Satgutier@umich.edu
206610152Satgutier@umich.edu//McPAT's plain interface, please keep !!!
206710152Satgutier@umich.eduuca_org_t cacti_interface(InputParameter  * const local_interface)
206810152Satgutier@umich.edu{
206910152Satgutier@umich.edu//  g_ip = new InputParameter();
207010152Satgutier@umich.edu  //g_ip->add_ecc_b_ = true;
207110152Satgutier@umich.edu
207210152Satgutier@umich.edu  uca_org_t fin_res;
207310152Satgutier@umich.edu  fin_res.valid = false;
207410152Satgutier@umich.edu
207510152Satgutier@umich.edu  g_ip = local_interface;
207610152Satgutier@umich.edu
207710152Satgutier@umich.edu
207810152Satgutier@umich.edu//  g_ip->data_arr_ram_cell_tech_type    = data_arr_ram_cell_tech_flavor_in;
207910152Satgutier@umich.edu//  g_ip->data_arr_peri_global_tech_type = data_arr_peri_global_tech_flavor_in;
208010152Satgutier@umich.edu//  g_ip->tag_arr_ram_cell_tech_type     = tag_arr_ram_cell_tech_flavor_in;
208110152Satgutier@umich.edu//  g_ip->tag_arr_peri_global_tech_type  = tag_arr_peri_global_tech_flavor_in;
208210152Satgutier@umich.edu//
208310152Satgutier@umich.edu//  g_ip->ic_proj_type     = interconnect_projection_type_in;
208410152Satgutier@umich.edu//  g_ip->wire_is_mat_type = wire_inside_mat_type_in;
208510152Satgutier@umich.edu//  g_ip->wire_os_mat_type = wire_outside_mat_type_in;
208610152Satgutier@umich.edu//  g_ip->burst_len        = BURST_LENGTH_in;
208710152Satgutier@umich.edu//  g_ip->int_prefetch_w   = INTERNAL_PREFETCH_WIDTH_in;
208810152Satgutier@umich.edu//  g_ip->page_sz_bits     = PAGE_SIZE_BITS_in;
208910152Satgutier@umich.edu//
209010152Satgutier@umich.edu//  g_ip->cache_sz            = cache_size;
209110152Satgutier@umich.edu//  g_ip->line_sz             = line_size;
209210152Satgutier@umich.edu//  g_ip->assoc               = associativity;
209310152Satgutier@umich.edu//  g_ip->nbanks              = banks;
209410152Satgutier@umich.edu//  g_ip->out_w               = output_width;
209510152Satgutier@umich.edu//  g_ip->specific_tag        = specific_tag;
209610152Satgutier@umich.edu//  if (tag_width == 0) {
209710152Satgutier@umich.edu//    g_ip->tag_w = 42;
209810152Satgutier@umich.edu//  }
209910152Satgutier@umich.edu//  else {
210010152Satgutier@umich.edu//    g_ip->tag_w               = tag_width;
210110152Satgutier@umich.edu//  }
210210152Satgutier@umich.edu//
210310152Satgutier@umich.edu//  g_ip->access_mode         = access_mode;
210410152Satgutier@umich.edu//  g_ip->delay_wt = obj_func_delay;
210510152Satgutier@umich.edu//  g_ip->dynamic_power_wt = obj_func_dynamic_power;
210610152Satgutier@umich.edu//  g_ip->leakage_power_wt = obj_func_leakage_power;
210710152Satgutier@umich.edu//  g_ip->area_wt = obj_func_area;
210810152Satgutier@umich.edu//  g_ip->cycle_time_wt    = obj_func_cycle_time;
210910152Satgutier@umich.edu//  g_ip->delay_dev = dev_func_delay;
211010152Satgutier@umich.edu//  g_ip->dynamic_power_dev = dev_func_dynamic_power;
211110152Satgutier@umich.edu//  g_ip->leakage_power_dev = dev_func_leakage_power;
211210152Satgutier@umich.edu//  g_ip->area_dev = dev_func_area;
211310152Satgutier@umich.edu//  g_ip->cycle_time_dev    = dev_func_cycle_time;
211410152Satgutier@umich.edu//  g_ip->temp = temp;
211510152Satgutier@umich.edu//
211610152Satgutier@umich.edu//  g_ip->F_sz_nm         = tech_node;
211710152Satgutier@umich.edu//  g_ip->F_sz_um         = tech_node / 1000;
211810152Satgutier@umich.edu//  g_ip->is_main_mem     = (main_mem != 0) ? true : false;
211910152Satgutier@umich.edu//  g_ip->is_cache        = (cache ==1) ? true : false;
212010152Satgutier@umich.edu//  g_ip->pure_ram        = (cache ==0) ? true : false;
212110152Satgutier@umich.edu//  g_ip->pure_cam        = (cache ==2) ? true : false;
212210152Satgutier@umich.edu//  g_ip->rpters_in_htree = (REPEATERS_IN_HTREE_SEGMENTS_in != 0) ? true : false;
212310152Satgutier@umich.edu//  g_ip->ver_htree_wires_over_array = VERTICAL_HTREE_WIRES_OVER_THE_ARRAY_in;
212410152Satgutier@umich.edu//  g_ip->broadcast_addr_din_over_ver_htrees = BROADCAST_ADDR_DATAIN_OVER_VERTICAL_HTREES_in;
212510152Satgutier@umich.edu//
212610152Satgutier@umich.edu//  g_ip->num_rw_ports    = rw_ports;
212710152Satgutier@umich.edu//  g_ip->num_rd_ports    = excl_read_ports;
212810152Satgutier@umich.edu//  g_ip->num_wr_ports    = excl_write_ports;
212910152Satgutier@umich.edu//  g_ip->num_se_rd_ports = single_ended_read_ports;
213010152Satgutier@umich.edu//  g_ip->num_search_ports = search_ports;
213110152Satgutier@umich.edu//
213210152Satgutier@umich.edu//  g_ip->print_detail = 1;
213310152Satgutier@umich.edu//    g_ip->nuca = 0;
213410152Satgutier@umich.edu//    g_ip->is_cache=true;
213510152Satgutier@umich.edu//
213610152Satgutier@umich.edu//  if (force_wiretype == 0)
213710152Satgutier@umich.edu//  {
213810152Satgutier@umich.edu//	  g_ip->wt = Global;
213910152Satgutier@umich.edu//      g_ip->force_wiretype = false;
214010152Satgutier@umich.edu//  }
214110152Satgutier@umich.edu//  else
214210152Satgutier@umich.edu//  {   g_ip->force_wiretype = true;
214310152Satgutier@umich.edu//	  if (wiretype==10) {
214410152Satgutier@umich.edu//		  g_ip->wt = Global_10;
214510152Satgutier@umich.edu//	        }
214610152Satgutier@umich.edu//	  if (wiretype==20) {
214710152Satgutier@umich.edu//		  g_ip->wt = Global_20;
214810152Satgutier@umich.edu//	        }
214910152Satgutier@umich.edu//	  if (wiretype==30) {
215010152Satgutier@umich.edu//		  g_ip->wt = Global_30;
215110152Satgutier@umich.edu//	        }
215210152Satgutier@umich.edu//	  if (wiretype==5) {
215310152Satgutier@umich.edu//	      g_ip->wt = Global_5;
215410152Satgutier@umich.edu//	        }
215510152Satgutier@umich.edu//	  if (wiretype==0) {
215610152Satgutier@umich.edu//		  g_ip->wt = Low_swing;
215710152Satgutier@umich.edu//	  }
215810152Satgutier@umich.edu//  }
215910152Satgutier@umich.edu//  //g_ip->wt = Global_5;
216010152Satgutier@umich.edu//  if (force_config == 0)
216110152Satgutier@umich.edu//    {
216210152Satgutier@umich.edu//  	  g_ip->force_cache_config = false;
216310152Satgutier@umich.edu//    }
216410152Satgutier@umich.edu//    else
216510152Satgutier@umich.edu//    {
216610152Satgutier@umich.edu//    	g_ip->force_cache_config = true;
216710152Satgutier@umich.edu//    	g_ip->ndbl=ndbl;
216810152Satgutier@umich.edu//    	g_ip->ndwl=ndwl;
216910152Satgutier@umich.edu//    	g_ip->nspd=nspd;
217010152Satgutier@umich.edu//    	g_ip->ndcm=ndcm;
217110152Satgutier@umich.edu//    	g_ip->ndsam1=ndsam1;
217210152Satgutier@umich.edu//    	g_ip->ndsam2=ndsam2;
217310152Satgutier@umich.edu//
217410152Satgutier@umich.edu//
217510152Satgutier@umich.edu//    }
217610152Satgutier@umich.edu//
217710152Satgutier@umich.edu//  if (ecc==0){
217810152Satgutier@umich.edu//	  g_ip->add_ecc_b_=false;
217910152Satgutier@umich.edu//  }
218010152Satgutier@umich.edu//  else
218110152Satgutier@umich.edu//  {
218210152Satgutier@umich.edu//	  g_ip->add_ecc_b_=true;
218310152Satgutier@umich.edu//  }
218410152Satgutier@umich.edu
218510152Satgutier@umich.edu
218610152Satgutier@umich.edu  g_ip->error_checking();
218710152Satgutier@umich.edu
218810152Satgutier@umich.edu
218910152Satgutier@umich.edu  init_tech_params(g_ip->F_sz_um, false);
219010152Satgutier@umich.edu  Wire winit; // Do not delete this line. It initializes wires.
219110152Satgutier@umich.edu
219210152Satgutier@umich.edu  solve(&fin_res);
219310152Satgutier@umich.edu
219410152Satgutier@umich.edu//  g_ip->display_ip();
219510152Satgutier@umich.edu//  output_UCA(&fin_res);
219610152Satgutier@umich.edu//  output_data_csv(fin_res);
219710152Satgutier@umich.edu
219810152Satgutier@umich.edu // delete (g_ip);
219910152Satgutier@umich.edu
220010152Satgutier@umich.edu  return fin_res;
220110152Satgutier@umich.edu}
220210152Satgutier@umich.edu
220310152Satgutier@umich.edu//McPAT's plain interface, please keep !!!
220410152Satgutier@umich.eduuca_org_t init_interface(InputParameter* const local_interface)
220510152Satgutier@umich.edu{
220610152Satgutier@umich.edu // g_ip = new InputParameter();
220710152Satgutier@umich.edu  //g_ip->add_ecc_b_ = true;
220810152Satgutier@umich.edu
220910152Satgutier@umich.edu  uca_org_t fin_res;
221010152Satgutier@umich.edu  fin_res.valid = false;
221110152Satgutier@umich.edu
221210152Satgutier@umich.edu   g_ip = local_interface;
221310152Satgutier@umich.edu
221410152Satgutier@umich.edu
221510152Satgutier@umich.edu//  g_ip->data_arr_ram_cell_tech_type    = data_arr_ram_cell_tech_flavor_in;
221610152Satgutier@umich.edu//  g_ip->data_arr_peri_global_tech_type = data_arr_peri_global_tech_flavor_in;
221710152Satgutier@umich.edu//  g_ip->tag_arr_ram_cell_tech_type     = tag_arr_ram_cell_tech_flavor_in;
221810152Satgutier@umich.edu//  g_ip->tag_arr_peri_global_tech_type  = tag_arr_peri_global_tech_flavor_in;
221910152Satgutier@umich.edu//
222010152Satgutier@umich.edu//  g_ip->ic_proj_type     = interconnect_projection_type_in;
222110152Satgutier@umich.edu//  g_ip->wire_is_mat_type = wire_inside_mat_type_in;
222210152Satgutier@umich.edu//  g_ip->wire_os_mat_type = wire_outside_mat_type_in;
222310152Satgutier@umich.edu//  g_ip->burst_len        = BURST_LENGTH_in;
222410152Satgutier@umich.edu//  g_ip->int_prefetch_w   = INTERNAL_PREFETCH_WIDTH_in;
222510152Satgutier@umich.edu//  g_ip->page_sz_bits     = PAGE_SIZE_BITS_in;
222610152Satgutier@umich.edu//
222710152Satgutier@umich.edu//  g_ip->cache_sz            = cache_size;
222810152Satgutier@umich.edu//  g_ip->line_sz             = line_size;
222910152Satgutier@umich.edu//  g_ip->assoc               = associativity;
223010152Satgutier@umich.edu//  g_ip->nbanks              = banks;
223110152Satgutier@umich.edu//  g_ip->out_w               = output_width;
223210152Satgutier@umich.edu//  g_ip->specific_tag        = specific_tag;
223310152Satgutier@umich.edu//  if (tag_width == 0) {
223410152Satgutier@umich.edu//    g_ip->tag_w = 42;
223510152Satgutier@umich.edu//  }
223610152Satgutier@umich.edu//  else {
223710152Satgutier@umich.edu//    g_ip->tag_w               = tag_width;
223810152Satgutier@umich.edu//  }
223910152Satgutier@umich.edu//
224010152Satgutier@umich.edu//  g_ip->access_mode         = access_mode;
224110152Satgutier@umich.edu//  g_ip->delay_wt = obj_func_delay;
224210152Satgutier@umich.edu//  g_ip->dynamic_power_wt = obj_func_dynamic_power;
224310152Satgutier@umich.edu//  g_ip->leakage_power_wt = obj_func_leakage_power;
224410152Satgutier@umich.edu//  g_ip->area_wt = obj_func_area;
224510152Satgutier@umich.edu//  g_ip->cycle_time_wt    = obj_func_cycle_time;
224610152Satgutier@umich.edu//  g_ip->delay_dev = dev_func_delay;
224710152Satgutier@umich.edu//  g_ip->dynamic_power_dev = dev_func_dynamic_power;
224810152Satgutier@umich.edu//  g_ip->leakage_power_dev = dev_func_leakage_power;
224910152Satgutier@umich.edu//  g_ip->area_dev = dev_func_area;
225010152Satgutier@umich.edu//  g_ip->cycle_time_dev    = dev_func_cycle_time;
225110152Satgutier@umich.edu//  g_ip->temp = temp;
225210152Satgutier@umich.edu//
225310152Satgutier@umich.edu//  g_ip->F_sz_nm         = tech_node;
225410152Satgutier@umich.edu//  g_ip->F_sz_um         = tech_node / 1000;
225510152Satgutier@umich.edu//  g_ip->is_main_mem     = (main_mem != 0) ? true : false;
225610152Satgutier@umich.edu//  g_ip->is_cache        = (cache ==1) ? true : false;
225710152Satgutier@umich.edu//  g_ip->pure_ram        = (cache ==0) ? true : false;
225810152Satgutier@umich.edu//  g_ip->pure_cam        = (cache ==2) ? true : false;
225910152Satgutier@umich.edu//  g_ip->rpters_in_htree = (REPEATERS_IN_HTREE_SEGMENTS_in != 0) ? true : false;
226010152Satgutier@umich.edu//  g_ip->ver_htree_wires_over_array = VERTICAL_HTREE_WIRES_OVER_THE_ARRAY_in;
226110152Satgutier@umich.edu//  g_ip->broadcast_addr_din_over_ver_htrees = BROADCAST_ADDR_DATAIN_OVER_VERTICAL_HTREES_in;
226210152Satgutier@umich.edu//
226310152Satgutier@umich.edu//  g_ip->num_rw_ports    = rw_ports;
226410152Satgutier@umich.edu//  g_ip->num_rd_ports    = excl_read_ports;
226510152Satgutier@umich.edu//  g_ip->num_wr_ports    = excl_write_ports;
226610152Satgutier@umich.edu//  g_ip->num_se_rd_ports = single_ended_read_ports;
226710152Satgutier@umich.edu//  g_ip->num_search_ports = search_ports;
226810152Satgutier@umich.edu//
226910152Satgutier@umich.edu//  g_ip->print_detail = 1;
227010152Satgutier@umich.edu//  g_ip->nuca = 0;
227110152Satgutier@umich.edu//
227210152Satgutier@umich.edu//  if (force_wiretype == 0)
227310152Satgutier@umich.edu//  {
227410152Satgutier@umich.edu//	  g_ip->wt = Global;
227510152Satgutier@umich.edu//      g_ip->force_wiretype = false;
227610152Satgutier@umich.edu//  }
227710152Satgutier@umich.edu//  else
227810152Satgutier@umich.edu//  {   g_ip->force_wiretype = true;
227910152Satgutier@umich.edu//	  if (wiretype==10) {
228010152Satgutier@umich.edu//		  g_ip->wt = Global_10;
228110152Satgutier@umich.edu//	        }
228210152Satgutier@umich.edu//	  if (wiretype==20) {
228310152Satgutier@umich.edu//		  g_ip->wt = Global_20;
228410152Satgutier@umich.edu//	        }
228510152Satgutier@umich.edu//	  if (wiretype==30) {
228610152Satgutier@umich.edu//		  g_ip->wt = Global_30;
228710152Satgutier@umich.edu//	        }
228810152Satgutier@umich.edu//	  if (wiretype==5) {
228910152Satgutier@umich.edu//	      g_ip->wt = Global_5;
229010152Satgutier@umich.edu//	        }
229110152Satgutier@umich.edu//	  if (wiretype==0) {
229210152Satgutier@umich.edu//		  g_ip->wt = Low_swing;
229310152Satgutier@umich.edu//	  }
229410152Satgutier@umich.edu//  }
229510152Satgutier@umich.edu//  //g_ip->wt = Global_5;
229610152Satgutier@umich.edu//  if (force_config == 0)
229710152Satgutier@umich.edu//    {
229810152Satgutier@umich.edu//  	  g_ip->force_cache_config = false;
229910152Satgutier@umich.edu//    }
230010152Satgutier@umich.edu//    else
230110152Satgutier@umich.edu//    {
230210152Satgutier@umich.edu//    	g_ip->force_cache_config = true;
230310152Satgutier@umich.edu//    	g_ip->ndbl=ndbl;
230410152Satgutier@umich.edu//    	g_ip->ndwl=ndwl;
230510152Satgutier@umich.edu//    	g_ip->nspd=nspd;
230610152Satgutier@umich.edu//    	g_ip->ndcm=ndcm;
230710152Satgutier@umich.edu//    	g_ip->ndsam1=ndsam1;
230810152Satgutier@umich.edu//    	g_ip->ndsam2=ndsam2;
230910152Satgutier@umich.edu//
231010152Satgutier@umich.edu//
231110152Satgutier@umich.edu//    }
231210152Satgutier@umich.edu//
231310152Satgutier@umich.edu//  if (ecc==0){
231410152Satgutier@umich.edu//	  g_ip->add_ecc_b_=false;
231510152Satgutier@umich.edu//  }
231610152Satgutier@umich.edu//  else
231710152Satgutier@umich.edu//  {
231810152Satgutier@umich.edu//	  g_ip->add_ecc_b_=true;
231910152Satgutier@umich.edu//  }
232010152Satgutier@umich.edu
232110152Satgutier@umich.edu
232210152Satgutier@umich.edu  g_ip->error_checking();
232310152Satgutier@umich.edu
232410152Satgutier@umich.edu  init_tech_params(g_ip->F_sz_um, false);
232510152Satgutier@umich.edu  Wire winit; // Do not delete this line. It initializes wires.
232610152Satgutier@umich.edu  //solve(&fin_res);
232710152Satgutier@umich.edu  //g_ip->display_ip();
232810152Satgutier@umich.edu
232910152Satgutier@umich.edu  //solve(&fin_res);
233010152Satgutier@umich.edu  //output_UCA(&fin_res);
233110152Satgutier@umich.edu  //output_data_csv(fin_res);
233210152Satgutier@umich.edu // delete (g_ip);
233310152Satgutier@umich.edu
233410152Satgutier@umich.edu  return fin_res;
233510152Satgutier@umich.edu}
233610152Satgutier@umich.edu
233710152Satgutier@umich.eduvoid reconfigure(InputParameter *local_interface, uca_org_t *fin_res)
233810152Satgutier@umich.edu{
233910152Satgutier@umich.edu  // Copy the InputParameter to global interface (g_ip) and do error checking.
234010152Satgutier@umich.edu  g_ip = local_interface;
234110152Satgutier@umich.edu  g_ip->error_checking();
234210152Satgutier@umich.edu
234310152Satgutier@umich.edu  // Initialize technology parameters
234410152Satgutier@umich.edu  init_tech_params(g_ip->F_sz_um,false);
234510152Satgutier@umich.edu
234610152Satgutier@umich.edu  Wire winit; // Do not delete this line. It initializes wires.
234710152Satgutier@umich.edu
234810152Satgutier@umich.edu  // This corresponds to solve() in the initialization process.
234910152Satgutier@umich.edu  update(fin_res);
235010152Satgutier@umich.edu}
2351