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