Ucache.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#include <pthread.h> 3410152Satgutier@umich.edu 3510152Satgutier@umich.edu#include <algorithm> 3610152Satgutier@umich.edu#include <cmath> 3710152Satgutier@umich.edu#include <ctime> 3810152Satgutier@umich.edu#include <iostream> 3910152Satgutier@umich.edu#include <list> 4010152Satgutier@umich.edu 4110152Satgutier@umich.edu#include "Ucache.h" 4210152Satgutier@umich.edu#include "area.h" 4310152Satgutier@umich.edu#include "bank.h" 4410152Satgutier@umich.edu#include "basic_circuit.h" 4510152Satgutier@umich.edu#include "component.h" 4610152Satgutier@umich.edu#include "const.h" 4710152Satgutier@umich.edu#include "decoder.h" 4810152Satgutier@umich.edu#include "parameter.h" 4910152Satgutier@umich.edu#include "subarray.h" 5010152Satgutier@umich.edu#include "uca.h" 5110152Satgutier@umich.edu 5210152Satgutier@umich.eduusing namespace std; 5310152Satgutier@umich.edu 5410152Satgutier@umich.educonst uint32_t nthreads = NTHREADS; 5510152Satgutier@umich.edu 5610152Satgutier@umich.edu 5710152Satgutier@umich.eduvoid min_values_t::update_min_values(const min_values_t * val) 5810152Satgutier@umich.edu{ 5910152Satgutier@umich.edu min_delay = (min_delay > val->min_delay) ? val->min_delay : min_delay; 6010152Satgutier@umich.edu min_dyn = (min_dyn > val->min_dyn) ? val->min_dyn : min_dyn; 6110152Satgutier@umich.edu min_leakage = (min_leakage > val->min_leakage) ? val->min_leakage : min_leakage; 6210152Satgutier@umich.edu min_area = (min_area > val->min_area) ? val->min_area : min_area; 6310152Satgutier@umich.edu min_cyc = (min_cyc > val->min_cyc) ? val->min_cyc : min_cyc; 6410152Satgutier@umich.edu} 6510152Satgutier@umich.edu 6610152Satgutier@umich.edu 6710152Satgutier@umich.edu 6810152Satgutier@umich.eduvoid min_values_t::update_min_values(const uca_org_t & res) 6910152Satgutier@umich.edu{ 7010152Satgutier@umich.edu min_delay = (min_delay > res.access_time) ? res.access_time : min_delay; 7110152Satgutier@umich.edu min_dyn = (min_dyn > res.power.readOp.dynamic) ? res.power.readOp.dynamic : min_dyn; 7210152Satgutier@umich.edu min_leakage = (min_leakage > res.power.readOp.leakage) ? res.power.readOp.leakage : min_leakage; 7310152Satgutier@umich.edu min_area = (min_area > res.area) ? res.area : min_area; 7410152Satgutier@umich.edu min_cyc = (min_cyc > res.cycle_time) ? res.cycle_time : min_cyc; 7510152Satgutier@umich.edu} 7610152Satgutier@umich.edu 7710152Satgutier@umich.eduvoid min_values_t::update_min_values(const nuca_org_t * res) 7810152Satgutier@umich.edu{ 7910152Satgutier@umich.edu min_delay = (min_delay > res->nuca_pda.delay) ? res->nuca_pda.delay : min_delay; 8010152Satgutier@umich.edu min_dyn = (min_dyn > res->nuca_pda.power.readOp.dynamic) ? res->nuca_pda.power.readOp.dynamic : min_dyn; 8110152Satgutier@umich.edu min_leakage = (min_leakage > res->nuca_pda.power.readOp.leakage) ? res->nuca_pda.power.readOp.leakage : min_leakage; 8210152Satgutier@umich.edu min_area = (min_area > res->nuca_pda.area.get_area()) ? res->nuca_pda.area.get_area() : min_area; 8310152Satgutier@umich.edu min_cyc = (min_cyc > res->nuca_pda.cycle_time) ? res->nuca_pda.cycle_time : min_cyc; 8410152Satgutier@umich.edu} 8510152Satgutier@umich.edu 8610152Satgutier@umich.eduvoid min_values_t::update_min_values(const mem_array * res) 8710152Satgutier@umich.edu{ 8810152Satgutier@umich.edu min_delay = (min_delay > res->access_time) ? res->access_time : min_delay; 8910152Satgutier@umich.edu min_dyn = (min_dyn > res->power.readOp.dynamic) ? res->power.readOp.dynamic : min_dyn; 9010152Satgutier@umich.edu min_leakage = (min_leakage > res->power.readOp.leakage) ? res->power.readOp.leakage : min_leakage; 9110152Satgutier@umich.edu min_area = (min_area > res->area) ? res->area : min_area; 9210152Satgutier@umich.edu min_cyc = (min_cyc > res->cycle_time) ? res->cycle_time : min_cyc; 9310152Satgutier@umich.edu} 9410152Satgutier@umich.edu 9510152Satgutier@umich.edu 9610152Satgutier@umich.edu 9710152Satgutier@umich.eduvoid * calc_time_mt_wrapper(void * void_obj) 9810152Satgutier@umich.edu{ 9910152Satgutier@umich.edu calc_time_mt_wrapper_struct * calc_obj = (calc_time_mt_wrapper_struct *) void_obj; 10010152Satgutier@umich.edu uint32_t tid = calc_obj->tid; 10110152Satgutier@umich.edu list<mem_array *> & data_arr = calc_obj->data_arr; 10210152Satgutier@umich.edu list<mem_array *> & tag_arr = calc_obj->tag_arr; 10310152Satgutier@umich.edu bool is_tag = calc_obj->is_tag; 10410152Satgutier@umich.edu bool pure_ram = calc_obj->pure_ram; 10510152Satgutier@umich.edu bool pure_cam = calc_obj->pure_cam; 10610152Satgutier@umich.edu bool is_main_mem = calc_obj->is_main_mem; 10710152Satgutier@umich.edu double Nspd_min = calc_obj->Nspd_min; 10810152Satgutier@umich.edu min_values_t * data_res = calc_obj->data_res; 10910152Satgutier@umich.edu min_values_t * tag_res = calc_obj->tag_res; 11010152Satgutier@umich.edu 11110152Satgutier@umich.edu data_arr.clear(); 11210152Satgutier@umich.edu data_arr.push_back(new mem_array); 11310152Satgutier@umich.edu tag_arr.clear(); 11410152Satgutier@umich.edu tag_arr.push_back(new mem_array); 11510152Satgutier@umich.edu 11610152Satgutier@umich.edu uint32_t Ndwl_niter = _log2(MAXDATAN) + 1; 11710152Satgutier@umich.edu uint32_t Ndbl_niter = _log2(MAXDATAN) + 1; 11810152Satgutier@umich.edu uint32_t Ndcm_niter = _log2(MAX_COL_MUX) + 1; 11910152Satgutier@umich.edu uint32_t niter = Ndwl_niter * Ndbl_niter * Ndcm_niter; 12010152Satgutier@umich.edu 12110152Satgutier@umich.edu 12210152Satgutier@umich.edu bool is_valid_partition; 12310152Satgutier@umich.edu int wt_min, wt_max; 12410152Satgutier@umich.edu 12510152Satgutier@umich.edu if (g_ip->force_wiretype) { 12610152Satgutier@umich.edu if (g_ip->wt == 0) { 12710152Satgutier@umich.edu wt_min = Low_swing; 12810152Satgutier@umich.edu wt_max = Low_swing; 12910152Satgutier@umich.edu } 13010152Satgutier@umich.edu else { 13110152Satgutier@umich.edu wt_min = Global; 13210152Satgutier@umich.edu wt_max = Low_swing-1; 13310152Satgutier@umich.edu } 13410152Satgutier@umich.edu } 13510152Satgutier@umich.edu else { 13610152Satgutier@umich.edu wt_min = Global; 13710152Satgutier@umich.edu wt_max = Low_swing; 13810152Satgutier@umich.edu } 13910152Satgutier@umich.edu 14010152Satgutier@umich.edu for (double Nspd = Nspd_min; Nspd <= MAXDATASPD; Nspd *= 2) 14110152Satgutier@umich.edu { 14210152Satgutier@umich.edu for (int wr = wt_min; wr <= wt_max; wr++) 14310152Satgutier@umich.edu { 14410152Satgutier@umich.edu for (uint32_t iter = tid; iter < niter; iter += nthreads) 14510152Satgutier@umich.edu { 14610152Satgutier@umich.edu // reconstruct Ndwl, Ndbl, Ndcm 14710152Satgutier@umich.edu unsigned int Ndwl = 1 << (iter / (Ndbl_niter * Ndcm_niter)); 14810152Satgutier@umich.edu unsigned int Ndbl = 1 << ((iter / (Ndcm_niter))%Ndbl_niter); 14910152Satgutier@umich.edu unsigned int Ndcm = 1 << (iter % Ndcm_niter); 15010152Satgutier@umich.edu for(unsigned int Ndsam_lev_1 = 1; Ndsam_lev_1 <= MAX_COL_MUX; Ndsam_lev_1 *= 2) 15110152Satgutier@umich.edu { 15210152Satgutier@umich.edu for(unsigned int Ndsam_lev_2 = 1; Ndsam_lev_2 <= MAX_COL_MUX; Ndsam_lev_2 *= 2) 15310152Satgutier@umich.edu { 15410152Satgutier@umich.edu //for debuging 15510152Satgutier@umich.edu if (g_ip->force_cache_config && is_tag == false) 15610152Satgutier@umich.edu { 15710152Satgutier@umich.edu wr = g_ip->wt; 15810152Satgutier@umich.edu Ndwl = g_ip->ndwl; 15910152Satgutier@umich.edu Ndbl = g_ip->ndbl; 16010152Satgutier@umich.edu Ndcm = g_ip->ndcm; 16110152Satgutier@umich.edu if(g_ip->nspd != 0) { 16210152Satgutier@umich.edu Nspd = g_ip->nspd; 16310152Satgutier@umich.edu } 16410152Satgutier@umich.edu if(g_ip->ndsam1 != 0) { 16510152Satgutier@umich.edu Ndsam_lev_1 = g_ip->ndsam1; 16610152Satgutier@umich.edu Ndsam_lev_2 = g_ip->ndsam2; 16710152Satgutier@umich.edu } 16810152Satgutier@umich.edu } 16910152Satgutier@umich.edu 17010152Satgutier@umich.edu if (is_tag == true) 17110152Satgutier@umich.edu { 17210152Satgutier@umich.edu is_valid_partition = calculate_time(is_tag, pure_ram, pure_cam, Nspd, Ndwl, 17310152Satgutier@umich.edu Ndbl, Ndcm, Ndsam_lev_1, Ndsam_lev_2, 17410152Satgutier@umich.edu tag_arr.back(), 0, NULL, NULL, 17510152Satgutier@umich.edu is_main_mem); 17610152Satgutier@umich.edu } 17710152Satgutier@umich.edu // If it's a fully-associative cache, the data array partition parameters are identical to that of 17810152Satgutier@umich.edu // the tag array, so compute data array partition properties also here. 17910152Satgutier@umich.edu if (is_tag == false || g_ip->fully_assoc) 18010152Satgutier@umich.edu { 18110152Satgutier@umich.edu is_valid_partition = calculate_time(is_tag/*false*/, pure_ram, pure_cam, Nspd, Ndwl, 18210152Satgutier@umich.edu Ndbl, Ndcm, Ndsam_lev_1, Ndsam_lev_2, 18310152Satgutier@umich.edu data_arr.back(), 0, NULL, NULL, 18410152Satgutier@umich.edu is_main_mem); 18510152Satgutier@umich.edu } 18610152Satgutier@umich.edu 18710152Satgutier@umich.edu if (is_valid_partition) 18810152Satgutier@umich.edu { 18910152Satgutier@umich.edu if (is_tag == true) 19010152Satgutier@umich.edu { 19110152Satgutier@umich.edu tag_arr.back()->wt = (enum Wire_type) wr; 19210152Satgutier@umich.edu tag_res->update_min_values(tag_arr.back()); 19310152Satgutier@umich.edu tag_arr.push_back(new mem_array); 19410152Satgutier@umich.edu } 19510152Satgutier@umich.edu if (is_tag == false || g_ip->fully_assoc) 19610152Satgutier@umich.edu { 19710152Satgutier@umich.edu data_arr.back()->wt = (enum Wire_type) wr; 19810152Satgutier@umich.edu data_res->update_min_values(data_arr.back()); 19910152Satgutier@umich.edu data_arr.push_back(new mem_array); 20010152Satgutier@umich.edu } 20110152Satgutier@umich.edu } 20210152Satgutier@umich.edu 20310152Satgutier@umich.edu if (g_ip->force_cache_config && is_tag == false) 20410152Satgutier@umich.edu { 20510152Satgutier@umich.edu wr = wt_max; 20610152Satgutier@umich.edu iter = niter; 20710152Satgutier@umich.edu if(g_ip->nspd != 0) { 20810152Satgutier@umich.edu Nspd = MAXDATASPD; 20910152Satgutier@umich.edu } 21010152Satgutier@umich.edu if (g_ip->ndsam1 != 0) { 21110152Satgutier@umich.edu Ndsam_lev_1 = MAX_COL_MUX+1; 21210152Satgutier@umich.edu Ndsam_lev_2 = MAX_COL_MUX+1; 21310152Satgutier@umich.edu } 21410152Satgutier@umich.edu } 21510152Satgutier@umich.edu } 21610152Satgutier@umich.edu } 21710152Satgutier@umich.edu } 21810152Satgutier@umich.edu } 21910152Satgutier@umich.edu } 22010152Satgutier@umich.edu 22110152Satgutier@umich.edu delete data_arr.back(); 22210152Satgutier@umich.edu delete tag_arr.back(); 22310152Satgutier@umich.edu data_arr.pop_back(); 22410152Satgutier@umich.edu tag_arr.pop_back(); 22510152Satgutier@umich.edu 22610152Satgutier@umich.edu pthread_exit(NULL); 22710152Satgutier@umich.edu} 22810152Satgutier@umich.edu 22910152Satgutier@umich.edu 23010152Satgutier@umich.edu 23110152Satgutier@umich.edubool calculate_time( 23210152Satgutier@umich.edu bool is_tag, 23310152Satgutier@umich.edu int pure_ram, 23410152Satgutier@umich.edu bool pure_cam, 23510152Satgutier@umich.edu double Nspd, 23610152Satgutier@umich.edu unsigned int Ndwl, 23710152Satgutier@umich.edu unsigned int Ndbl, 23810152Satgutier@umich.edu unsigned int Ndcm, 23910152Satgutier@umich.edu unsigned int Ndsam_lev_1, 24010152Satgutier@umich.edu unsigned int Ndsam_lev_2, 24110152Satgutier@umich.edu mem_array *ptr_array, 24210152Satgutier@umich.edu int flag_results_populate, 24310152Satgutier@umich.edu results_mem_array *ptr_results, 24410152Satgutier@umich.edu uca_org_t *ptr_fin_res, 24510152Satgutier@umich.edu bool is_main_mem) 24610152Satgutier@umich.edu{ 24710152Satgutier@umich.edu DynamicParameter dyn_p(is_tag, pure_ram, pure_cam, Nspd, Ndwl, Ndbl, Ndcm, Ndsam_lev_1, Ndsam_lev_2, is_main_mem); 24810152Satgutier@umich.edu 24910152Satgutier@umich.edu if (dyn_p.is_valid == false) 25010152Satgutier@umich.edu { 25110152Satgutier@umich.edu return false; 25210152Satgutier@umich.edu } 25310152Satgutier@umich.edu 25410152Satgutier@umich.edu UCA * uca = new UCA(dyn_p); 25510152Satgutier@umich.edu 25610152Satgutier@umich.edu 25710152Satgutier@umich.edu if (flag_results_populate) 25810152Satgutier@umich.edu { //For the final solution, populate the ptr_results data structure -- TODO: copy only necessary variables 25910152Satgutier@umich.edu } 26010152Satgutier@umich.edu else 26110152Satgutier@umich.edu { 26210152Satgutier@umich.edu int num_act_mats_hor_dir = uca->bank.dp.num_act_mats_hor_dir; 26310152Satgutier@umich.edu int num_mats = uca->bank.dp.num_mats; 26410152Satgutier@umich.edu bool is_fa = uca->bank.dp.fully_assoc; 26510152Satgutier@umich.edu bool pure_cam = uca->bank.dp.pure_cam; 26610152Satgutier@umich.edu ptr_array->Ndwl = Ndwl; 26710152Satgutier@umich.edu ptr_array->Ndbl = Ndbl; 26810152Satgutier@umich.edu ptr_array->Nspd = Nspd; 26910152Satgutier@umich.edu ptr_array->deg_bl_muxing = dyn_p.deg_bl_muxing; 27010152Satgutier@umich.edu ptr_array->Ndsam_lev_1 = Ndsam_lev_1; 27110152Satgutier@umich.edu ptr_array->Ndsam_lev_2 = Ndsam_lev_2; 27210152Satgutier@umich.edu ptr_array->access_time = uca->access_time; 27310152Satgutier@umich.edu ptr_array->cycle_time = uca->cycle_time; 27410152Satgutier@umich.edu ptr_array->multisubbank_interleave_cycle_time = uca->multisubbank_interleave_cycle_time; 27510152Satgutier@umich.edu ptr_array->area_ram_cells = uca->area_all_dataramcells; 27610152Satgutier@umich.edu ptr_array->area = uca->area.get_area(); 27710152Satgutier@umich.edu ptr_array->height = uca->area.h; 27810152Satgutier@umich.edu ptr_array->width = uca->area.w; 27910152Satgutier@umich.edu ptr_array->mat_height = uca->bank.mat.area.h; 28010152Satgutier@umich.edu ptr_array->mat_length = uca->bank.mat.area.w; 28110152Satgutier@umich.edu ptr_array->subarray_height = uca->bank.mat.subarray.area.h; 28210152Satgutier@umich.edu ptr_array->subarray_length = uca->bank.mat.subarray.area.w; 28310152Satgutier@umich.edu ptr_array->power = uca->power; 28410152Satgutier@umich.edu ptr_array->delay_senseamp_mux_decoder = 28510152Satgutier@umich.edu MAX(uca->delay_array_to_sa_mux_lev_1_decoder, 28610152Satgutier@umich.edu uca->delay_array_to_sa_mux_lev_2_decoder); 28710152Satgutier@umich.edu ptr_array->delay_before_subarray_output_driver = uca->delay_before_subarray_output_driver; 28810152Satgutier@umich.edu ptr_array->delay_from_subarray_output_driver_to_output = uca->delay_from_subarray_out_drv_to_out; 28910152Satgutier@umich.edu 29010152Satgutier@umich.edu ptr_array->delay_route_to_bank = uca->htree_in_add->delay; 29110152Satgutier@umich.edu ptr_array->delay_input_htree = uca->bank.htree_in_add->delay; 29210152Satgutier@umich.edu ptr_array->delay_row_predecode_driver_and_block = uca->bank.mat.r_predec->delay; 29310152Satgutier@umich.edu ptr_array->delay_row_decoder = uca->bank.mat.row_dec->delay; 29410152Satgutier@umich.edu ptr_array->delay_bitlines = uca->bank.mat.delay_bitline; 29510152Satgutier@umich.edu ptr_array->delay_matchlines = uca->bank.mat.delay_matchchline; 29610152Satgutier@umich.edu ptr_array->delay_sense_amp = uca->bank.mat.delay_sa; 29710152Satgutier@umich.edu ptr_array->delay_subarray_output_driver = uca->bank.mat.delay_subarray_out_drv_htree; 29810152Satgutier@umich.edu ptr_array->delay_dout_htree = uca->bank.htree_out_data->delay; 29910152Satgutier@umich.edu ptr_array->delay_comparator = uca->bank.mat.delay_comparator; 30010152Satgutier@umich.edu 30110152Satgutier@umich.edu ptr_array->all_banks_height = uca->area.h; 30210152Satgutier@umich.edu ptr_array->all_banks_width = uca->area.w; 30310152Satgutier@umich.edu ptr_array->area_efficiency = uca->area_all_dataramcells * 100 / (uca->area.get_area()); 30410152Satgutier@umich.edu 30510152Satgutier@umich.edu ptr_array->power_routing_to_bank = uca->power_routing_to_bank; 30610152Satgutier@umich.edu ptr_array->power_addr_input_htree = uca->bank.htree_in_add->power; 30710152Satgutier@umich.edu ptr_array->power_data_input_htree = uca->bank.htree_in_data->power; 30810152Satgutier@umich.edu// cout<<"power_data_input_htree"<<uca->bank.htree_in_data->power.readOp.leakage<<endl; 30910152Satgutier@umich.edu ptr_array->power_data_output_htree = uca->bank.htree_out_data->power; 31010152Satgutier@umich.edu// cout<<"power_data_output_htree"<<uca->bank.htree_out_data->power.readOp.leakage<<endl; 31110152Satgutier@umich.edu ptr_array->power_row_predecoder_drivers = uca->bank.mat.r_predec->driver_power; 31210152Satgutier@umich.edu ptr_array->power_row_predecoder_drivers.readOp.dynamic *= num_act_mats_hor_dir; 31310152Satgutier@umich.edu ptr_array->power_row_predecoder_drivers.writeOp.dynamic *= num_act_mats_hor_dir; 31410152Satgutier@umich.edu ptr_array->power_row_predecoder_drivers.searchOp.dynamic *= num_act_mats_hor_dir; 31510152Satgutier@umich.edu 31610152Satgutier@umich.edu ptr_array->power_row_predecoder_blocks = uca->bank.mat.r_predec->block_power; 31710152Satgutier@umich.edu ptr_array->power_row_predecoder_blocks.readOp.dynamic *= num_act_mats_hor_dir; 31810152Satgutier@umich.edu ptr_array->power_row_predecoder_blocks.writeOp.dynamic *= num_act_mats_hor_dir; 31910152Satgutier@umich.edu ptr_array->power_row_predecoder_blocks.searchOp.dynamic *= num_act_mats_hor_dir; 32010152Satgutier@umich.edu 32110152Satgutier@umich.edu ptr_array->power_row_decoders = uca->bank.mat.power_row_decoders; 32210152Satgutier@umich.edu ptr_array->power_row_decoders.readOp.dynamic *= num_act_mats_hor_dir; 32310152Satgutier@umich.edu ptr_array->power_row_decoders.writeOp.dynamic *= num_act_mats_hor_dir; 32410152Satgutier@umich.edu ptr_array->power_row_decoders.searchOp.dynamic *= num_act_mats_hor_dir; 32510152Satgutier@umich.edu 32610152Satgutier@umich.edu ptr_array->power_bit_mux_predecoder_drivers = uca->bank.mat.b_mux_predec->driver_power; 32710152Satgutier@umich.edu ptr_array->power_bit_mux_predecoder_drivers.readOp.dynamic *= num_act_mats_hor_dir; 32810152Satgutier@umich.edu ptr_array->power_bit_mux_predecoder_drivers.writeOp.dynamic *= num_act_mats_hor_dir; 32910152Satgutier@umich.edu ptr_array->power_bit_mux_predecoder_drivers.searchOp.dynamic *= num_act_mats_hor_dir; 33010152Satgutier@umich.edu 33110152Satgutier@umich.edu ptr_array->power_bit_mux_predecoder_blocks = uca->bank.mat.b_mux_predec->block_power; 33210152Satgutier@umich.edu ptr_array->power_bit_mux_predecoder_blocks.readOp.dynamic *= num_act_mats_hor_dir; 33310152Satgutier@umich.edu ptr_array->power_bit_mux_predecoder_blocks.writeOp.dynamic *= num_act_mats_hor_dir; 33410152Satgutier@umich.edu ptr_array->power_bit_mux_predecoder_blocks.searchOp.dynamic *= num_act_mats_hor_dir; 33510152Satgutier@umich.edu 33610152Satgutier@umich.edu ptr_array->power_bit_mux_decoders = uca->bank.mat.power_bit_mux_decoders; 33710152Satgutier@umich.edu ptr_array->power_bit_mux_decoders.readOp.dynamic *= num_act_mats_hor_dir; 33810152Satgutier@umich.edu ptr_array->power_bit_mux_decoders.writeOp.dynamic *= num_act_mats_hor_dir; 33910152Satgutier@umich.edu ptr_array->power_bit_mux_decoders.searchOp.dynamic *= num_act_mats_hor_dir; 34010152Satgutier@umich.edu 34110152Satgutier@umich.edu ptr_array->power_senseamp_mux_lev_1_predecoder_drivers = uca->bank.mat.sa_mux_lev_1_predec->driver_power; 34210152Satgutier@umich.edu ptr_array->power_senseamp_mux_lev_1_predecoder_drivers .readOp.dynamic *= num_act_mats_hor_dir; 34310152Satgutier@umich.edu ptr_array->power_senseamp_mux_lev_1_predecoder_drivers .writeOp.dynamic *= num_act_mats_hor_dir; 34410152Satgutier@umich.edu ptr_array->power_senseamp_mux_lev_1_predecoder_drivers .searchOp.dynamic *= num_act_mats_hor_dir; 34510152Satgutier@umich.edu 34610152Satgutier@umich.edu ptr_array->power_senseamp_mux_lev_1_predecoder_blocks = uca->bank.mat.sa_mux_lev_1_predec->block_power; 34710152Satgutier@umich.edu ptr_array->power_senseamp_mux_lev_1_predecoder_blocks.readOp.dynamic *= num_act_mats_hor_dir; 34810152Satgutier@umich.edu ptr_array->power_senseamp_mux_lev_1_predecoder_blocks.writeOp.dynamic *= num_act_mats_hor_dir; 34910152Satgutier@umich.edu ptr_array->power_senseamp_mux_lev_1_predecoder_blocks.searchOp.dynamic *= num_act_mats_hor_dir; 35010152Satgutier@umich.edu 35110152Satgutier@umich.edu ptr_array->power_senseamp_mux_lev_1_decoders = uca->bank.mat.power_sa_mux_lev_1_decoders; 35210152Satgutier@umich.edu ptr_array->power_senseamp_mux_lev_1_decoders.readOp.dynamic *= num_act_mats_hor_dir; 35310152Satgutier@umich.edu ptr_array->power_senseamp_mux_lev_1_decoders.writeOp.dynamic *= num_act_mats_hor_dir; 35410152Satgutier@umich.edu ptr_array->power_senseamp_mux_lev_1_decoders.searchOp.dynamic *= num_act_mats_hor_dir; 35510152Satgutier@umich.edu 35610152Satgutier@umich.edu ptr_array->power_senseamp_mux_lev_2_predecoder_drivers = uca->bank.mat.sa_mux_lev_2_predec->driver_power; 35710152Satgutier@umich.edu ptr_array->power_senseamp_mux_lev_2_predecoder_drivers.readOp.dynamic *= num_act_mats_hor_dir; 35810152Satgutier@umich.edu ptr_array->power_senseamp_mux_lev_2_predecoder_drivers.writeOp.dynamic *= num_act_mats_hor_dir; 35910152Satgutier@umich.edu ptr_array->power_senseamp_mux_lev_2_predecoder_drivers.searchOp.dynamic *= num_act_mats_hor_dir; 36010152Satgutier@umich.edu 36110152Satgutier@umich.edu ptr_array->power_senseamp_mux_lev_2_predecoder_blocks = uca->bank.mat.sa_mux_lev_2_predec->block_power; 36210152Satgutier@umich.edu ptr_array->power_senseamp_mux_lev_2_predecoder_blocks.readOp.dynamic *= num_act_mats_hor_dir; 36310152Satgutier@umich.edu ptr_array->power_senseamp_mux_lev_2_predecoder_blocks.writeOp.dynamic *= num_act_mats_hor_dir; 36410152Satgutier@umich.edu ptr_array->power_senseamp_mux_lev_2_predecoder_blocks.searchOp.dynamic *= num_act_mats_hor_dir; 36510152Satgutier@umich.edu 36610152Satgutier@umich.edu ptr_array->power_senseamp_mux_lev_2_decoders = uca->bank.mat.power_sa_mux_lev_2_decoders; 36710152Satgutier@umich.edu ptr_array->power_senseamp_mux_lev_2_decoders .readOp.dynamic *= num_act_mats_hor_dir; 36810152Satgutier@umich.edu ptr_array->power_senseamp_mux_lev_2_decoders .writeOp.dynamic *= num_act_mats_hor_dir; 36910152Satgutier@umich.edu ptr_array->power_senseamp_mux_lev_2_decoders .searchOp.dynamic *= num_act_mats_hor_dir; 37010152Satgutier@umich.edu 37110152Satgutier@umich.edu ptr_array->power_bitlines = uca->bank.mat.power_bitline; 37210152Satgutier@umich.edu ptr_array->power_bitlines.readOp.dynamic *= num_act_mats_hor_dir; 37310152Satgutier@umich.edu ptr_array->power_bitlines.writeOp.dynamic *= num_act_mats_hor_dir; 37410152Satgutier@umich.edu ptr_array->power_bitlines.searchOp.dynamic *= num_act_mats_hor_dir; 37510152Satgutier@umich.edu 37610152Satgutier@umich.edu ptr_array->power_sense_amps = uca->bank.mat.power_sa; 37710152Satgutier@umich.edu ptr_array->power_sense_amps.readOp.dynamic *= num_act_mats_hor_dir; 37810152Satgutier@umich.edu ptr_array->power_sense_amps.writeOp.dynamic *= num_act_mats_hor_dir; 37910152Satgutier@umich.edu ptr_array->power_sense_amps.searchOp.dynamic *= num_act_mats_hor_dir; 38010152Satgutier@umich.edu 38110152Satgutier@umich.edu ptr_array->power_prechg_eq_drivers = uca->bank.mat.power_bl_precharge_eq_drv; 38210152Satgutier@umich.edu ptr_array->power_prechg_eq_drivers.readOp.dynamic *= num_act_mats_hor_dir; 38310152Satgutier@umich.edu ptr_array->power_prechg_eq_drivers.writeOp.dynamic *= num_act_mats_hor_dir; 38410152Satgutier@umich.edu ptr_array->power_prechg_eq_drivers.searchOp.dynamic *= num_act_mats_hor_dir; 38510152Satgutier@umich.edu 38610152Satgutier@umich.edu ptr_array->power_output_drivers_at_subarray = uca->bank.mat.power_subarray_out_drv; 38710152Satgutier@umich.edu ptr_array->power_output_drivers_at_subarray.readOp.dynamic *= num_act_mats_hor_dir; 38810152Satgutier@umich.edu ptr_array->power_output_drivers_at_subarray.writeOp.dynamic *= num_act_mats_hor_dir; 38910152Satgutier@umich.edu ptr_array->power_output_drivers_at_subarray.searchOp.dynamic *= num_act_mats_hor_dir; 39010152Satgutier@umich.edu 39110152Satgutier@umich.edu ptr_array->power_comparators = uca->bank.mat.power_comparator; 39210152Satgutier@umich.edu ptr_array->power_comparators.readOp.dynamic *= num_act_mats_hor_dir; 39310152Satgutier@umich.edu ptr_array->power_comparators.writeOp.dynamic *= num_act_mats_hor_dir; 39410152Satgutier@umich.edu ptr_array->power_comparators.searchOp.dynamic *= num_act_mats_hor_dir; 39510152Satgutier@umich.edu 39610152Satgutier@umich.edu// cout << " num of mats: " << dyn_p.num_mats << endl; 39710152Satgutier@umich.edu if (is_fa || pure_cam) 39810152Satgutier@umich.edu { 39910152Satgutier@umich.edu ptr_array->power_htree_in_search = uca->bank.htree_in_search->power; 40010152Satgutier@umich.edu// cout<<"power_htree_in_search"<<uca->bank.htree_in_search->power.readOp.leakage<<endl; 40110152Satgutier@umich.edu ptr_array->power_htree_out_search = uca->bank.htree_out_search->power; 40210152Satgutier@umich.edu// cout<<"power_htree_out_search"<<uca->bank.htree_out_search->power.readOp.leakage<<endl; 40310152Satgutier@umich.edu ptr_array->power_searchline = uca->bank.mat.power_searchline; 40410152Satgutier@umich.edu// cout<<"power_searchlineh"<<uca->bank.mat.power_searchline.readOp.leakage<<endl; 40510152Satgutier@umich.edu ptr_array->power_searchline.searchOp.dynamic *= num_mats; 40610152Satgutier@umich.edu ptr_array->power_searchline_precharge = uca->bank.mat.power_searchline_precharge; 40710152Satgutier@umich.edu ptr_array->power_searchline_precharge.searchOp.dynamic *= num_mats; 40810152Satgutier@umich.edu ptr_array->power_matchlines = uca->bank.mat.power_matchline; 40910152Satgutier@umich.edu ptr_array->power_matchlines.searchOp.dynamic *= num_mats; 41010152Satgutier@umich.edu ptr_array->power_matchline_precharge = uca->bank.mat.power_matchline_precharge; 41110152Satgutier@umich.edu ptr_array->power_matchline_precharge.searchOp.dynamic *= num_mats; 41210152Satgutier@umich.edu ptr_array->power_matchline_to_wordline_drv = uca->bank.mat.power_ml_to_ram_wl_drv; 41310152Satgutier@umich.edu// cout<<"power_matchline.searchOp.leakage"<<uca->bank.mat.power_matchline.searchOp.leakage<<endl; 41410152Satgutier@umich.edu } 41510152Satgutier@umich.edu 41610152Satgutier@umich.edu ptr_array->activate_energy = uca->activate_energy; 41710152Satgutier@umich.edu ptr_array->read_energy = uca->read_energy; 41810152Satgutier@umich.edu ptr_array->write_energy = uca->write_energy; 41910152Satgutier@umich.edu ptr_array->precharge_energy = uca->precharge_energy; 42010152Satgutier@umich.edu ptr_array->refresh_power = uca->refresh_power; 42110152Satgutier@umich.edu ptr_array->leak_power_subbank_closed_page = uca->leak_power_subbank_closed_page; 42210152Satgutier@umich.edu ptr_array->leak_power_subbank_open_page = uca->leak_power_subbank_open_page; 42310152Satgutier@umich.edu ptr_array->leak_power_request_and_reply_networks = uca->leak_power_request_and_reply_networks; 42410152Satgutier@umich.edu 42510152Satgutier@umich.edu ptr_array->precharge_delay = uca->precharge_delay; 42610152Satgutier@umich.edu 42710152Satgutier@umich.edu 42810152Satgutier@umich.edu// cout<<"power_matchline.searchOp.leakage"<<uca->bank.mat.<<endl; 42910152Satgutier@umich.edu// 43010152Satgutier@umich.edu// if (!(is_fa || pure_cam)) 43110152Satgutier@umich.edu// { 43210152Satgutier@umich.edu// cout << " num of cols: " << dyn_p.num_c_subarray << endl; 43310152Satgutier@umich.edu// } 43410152Satgutier@umich.edu// else if (is_fa) 43510152Satgutier@umich.edu// { 43610152Satgutier@umich.edu// cout << " num of cols: " << dyn_p.tag_num_c_subarray+ dyn_p.data_num_c_subarray<< endl; 43710152Satgutier@umich.edu// } else 43810152Satgutier@umich.edu// cout << " num of cols: " << dyn_p.tag_num_c_subarray<< endl; 43910152Satgutier@umich.edu// cout << uca->bank.mat.subarray.get_total_cell_area()<<endl; 44010152Satgutier@umich.edu } 44110152Satgutier@umich.edu 44210152Satgutier@umich.edu 44310152Satgutier@umich.edu delete uca; 44410152Satgutier@umich.edu return true; 44510152Satgutier@umich.edu} 44610152Satgutier@umich.edu 44710152Satgutier@umich.edu 44810152Satgutier@umich.edu 44910152Satgutier@umich.edubool check_uca_org(uca_org_t & u, min_values_t *minval) 45010152Satgutier@umich.edu{ 45110152Satgutier@umich.edu if (((u.access_time - minval->min_delay)*100/minval->min_delay) > g_ip->delay_dev) { 45210152Satgutier@umich.edu return false; 45310152Satgutier@umich.edu } 45410152Satgutier@umich.edu if (((u.power.readOp.dynamic - minval->min_dyn)/minval->min_dyn)*100 > 45510152Satgutier@umich.edu g_ip->dynamic_power_dev) { 45610152Satgutier@umich.edu return false; 45710152Satgutier@umich.edu } 45810152Satgutier@umich.edu if (((u.power.readOp.leakage - minval->min_leakage)/minval->min_leakage)*100 > 45910152Satgutier@umich.edu g_ip->leakage_power_dev) { 46010152Satgutier@umich.edu return false; 46110152Satgutier@umich.edu } 46210152Satgutier@umich.edu if (((u.cycle_time - minval->min_cyc)/minval->min_cyc)*100 > 46310152Satgutier@umich.edu g_ip->cycle_time_dev) { 46410152Satgutier@umich.edu return false; 46510152Satgutier@umich.edu } 46610152Satgutier@umich.edu if (((u.area - minval->min_area)/minval->min_area)*100 > 46710152Satgutier@umich.edu g_ip->area_dev) { 46810152Satgutier@umich.edu return false; 46910152Satgutier@umich.edu } 47010152Satgutier@umich.edu return true; 47110152Satgutier@umich.edu} 47210152Satgutier@umich.edu 47310152Satgutier@umich.edubool check_mem_org(mem_array & u, const min_values_t *minval) 47410152Satgutier@umich.edu{ 47510152Satgutier@umich.edu if (((u.access_time - minval->min_delay)*100/minval->min_delay) > g_ip->delay_dev) { 47610152Satgutier@umich.edu return false; 47710152Satgutier@umich.edu } 47810152Satgutier@umich.edu if (((u.power.readOp.dynamic - minval->min_dyn)/minval->min_dyn)*100 > 47910152Satgutier@umich.edu g_ip->dynamic_power_dev) { 48010152Satgutier@umich.edu return false; 48110152Satgutier@umich.edu } 48210152Satgutier@umich.edu if (((u.power.readOp.leakage - minval->min_leakage)/minval->min_leakage)*100 > 48310152Satgutier@umich.edu g_ip->leakage_power_dev) { 48410152Satgutier@umich.edu return false; 48510152Satgutier@umich.edu } 48610152Satgutier@umich.edu if (((u.cycle_time - minval->min_cyc)/minval->min_cyc)*100 > 48710152Satgutier@umich.edu g_ip->cycle_time_dev) { 48810152Satgutier@umich.edu return false; 48910152Satgutier@umich.edu } 49010152Satgutier@umich.edu if (((u.area - minval->min_area)/minval->min_area)*100 > 49110152Satgutier@umich.edu g_ip->area_dev) { 49210152Satgutier@umich.edu return false; 49310152Satgutier@umich.edu } 49410152Satgutier@umich.edu return true; 49510152Satgutier@umich.edu} 49610152Satgutier@umich.edu 49710152Satgutier@umich.edu 49810152Satgutier@umich.edu 49910152Satgutier@umich.edu 50010152Satgutier@umich.eduvoid find_optimal_uca(uca_org_t *res, min_values_t * minval, list<uca_org_t> & ulist) 50110152Satgutier@umich.edu{ 50210152Satgutier@umich.edu double cost = 0; 50310152Satgutier@umich.edu double min_cost = BIGNUM; 50410152Satgutier@umich.edu float d, a, dp, lp, c; 50510152Satgutier@umich.edu 50610152Satgutier@umich.edu dp = g_ip->dynamic_power_wt; 50710152Satgutier@umich.edu lp = g_ip->leakage_power_wt; 50810152Satgutier@umich.edu a = g_ip->area_wt; 50910152Satgutier@umich.edu d = g_ip->delay_wt; 51010152Satgutier@umich.edu c = g_ip->cycle_time_wt; 51110152Satgutier@umich.edu 51210152Satgutier@umich.edu if (ulist.empty() == true) 51310152Satgutier@umich.edu { 51410152Satgutier@umich.edu cout << "ERROR: no valid cache organizations found" << endl; 51510152Satgutier@umich.edu exit(0); 51610152Satgutier@umich.edu } 51710152Satgutier@umich.edu 51810152Satgutier@umich.edu for (list<uca_org_t>::iterator niter = ulist.begin(); niter != ulist.end(); niter++) 51910152Satgutier@umich.edu { 52010152Satgutier@umich.edu if (g_ip->ed == 1) 52110152Satgutier@umich.edu { 52210152Satgutier@umich.edu cost = ((niter)->access_time/minval->min_delay) * ((niter)->power.readOp.dynamic/minval->min_dyn); 52310152Satgutier@umich.edu if (min_cost > cost) 52410152Satgutier@umich.edu { 52510152Satgutier@umich.edu min_cost = cost; 52610152Satgutier@umich.edu *res = (*(niter)); 52710152Satgutier@umich.edu } 52810152Satgutier@umich.edu } 52910152Satgutier@umich.edu else if (g_ip->ed == 2) 53010152Satgutier@umich.edu { 53110152Satgutier@umich.edu cost = ((niter)->access_time/minval->min_delay)* 53210152Satgutier@umich.edu ((niter)->access_time/minval->min_delay)* 53310152Satgutier@umich.edu ((niter)->power.readOp.dynamic/minval->min_dyn); 53410152Satgutier@umich.edu if (min_cost > cost) 53510152Satgutier@umich.edu { 53610152Satgutier@umich.edu min_cost = cost; 53710152Satgutier@umich.edu *res = (*(niter)); 53810152Satgutier@umich.edu } 53910152Satgutier@umich.edu } 54010152Satgutier@umich.edu else 54110152Satgutier@umich.edu { 54210152Satgutier@umich.edu /* 54310152Satgutier@umich.edu * check whether the current organization 54410152Satgutier@umich.edu * meets the input deviation constraints 54510152Satgutier@umich.edu */ 54610152Satgutier@umich.edu bool v = check_uca_org(*niter, minval); 54710152Satgutier@umich.edu //if (minval->min_leakage == 0) minval->min_leakage = 0.1; //FIXME remove this after leakage modeling 54810152Satgutier@umich.edu 54910152Satgutier@umich.edu if (v) 55010152Satgutier@umich.edu { 55110152Satgutier@umich.edu cost = (d * ((niter)->access_time/minval->min_delay) + 55210152Satgutier@umich.edu c * ((niter)->cycle_time/minval->min_cyc) + 55310152Satgutier@umich.edu dp * ((niter)->power.readOp.dynamic/minval->min_dyn) + 55410152Satgutier@umich.edu lp * ((niter)->power.readOp.leakage/minval->min_leakage) + 55510152Satgutier@umich.edu a * ((niter)->area/minval->min_area)); 55610152Satgutier@umich.edu //fprintf(stderr, "cost = %g\n", cost); 55710152Satgutier@umich.edu 55810152Satgutier@umich.edu if (min_cost > cost) { 55910152Satgutier@umich.edu min_cost = cost; 56010152Satgutier@umich.edu *res = (*(niter)); 56110152Satgutier@umich.edu niter = ulist.erase(niter); 56210152Satgutier@umich.edu if (niter!=ulist.begin()) 56310152Satgutier@umich.edu niter--; 56410152Satgutier@umich.edu } 56510152Satgutier@umich.edu } 56610152Satgutier@umich.edu else { 56710152Satgutier@umich.edu niter = ulist.erase(niter); 56810152Satgutier@umich.edu if (niter!=ulist.begin()) 56910152Satgutier@umich.edu niter--; 57010152Satgutier@umich.edu } 57110152Satgutier@umich.edu } 57210152Satgutier@umich.edu } 57310152Satgutier@umich.edu 57410152Satgutier@umich.edu if (min_cost == BIGNUM) 57510152Satgutier@umich.edu { 57610152Satgutier@umich.edu cout << "ERROR: no cache organizations met optimization criteria" << endl; 57710152Satgutier@umich.edu exit(0); 57810152Satgutier@umich.edu } 57910152Satgutier@umich.edu} 58010152Satgutier@umich.edu 58110152Satgutier@umich.edu 58210152Satgutier@umich.edu 58310152Satgutier@umich.eduvoid filter_tag_arr(const min_values_t * min, list<mem_array *> & list) 58410152Satgutier@umich.edu{ 58510152Satgutier@umich.edu double cost = BIGNUM; 58610152Satgutier@umich.edu double cur_cost; 58710152Satgutier@umich.edu double wt_delay = g_ip->delay_wt, wt_dyn = g_ip->dynamic_power_wt, wt_leakage = g_ip->leakage_power_wt, wt_cyc = g_ip->cycle_time_wt, wt_area = g_ip->area_wt; 58810152Satgutier@umich.edu mem_array * res = NULL; 58910152Satgutier@umich.edu 59010152Satgutier@umich.edu if (list.empty() == true) 59110152Satgutier@umich.edu { 59210152Satgutier@umich.edu cout << "ERROR: no valid tag organizations found" << endl; 59310152Satgutier@umich.edu exit(1); 59410152Satgutier@umich.edu } 59510152Satgutier@umich.edu 59610152Satgutier@umich.edu 59710152Satgutier@umich.edu while (list.empty() != true) 59810152Satgutier@umich.edu { 59910152Satgutier@umich.edu bool v = check_mem_org(*list.back(), min); 60010152Satgutier@umich.edu if (v) 60110152Satgutier@umich.edu { 60210152Satgutier@umich.edu cur_cost = wt_delay * (list.back()->access_time/min->min_delay) + 60310152Satgutier@umich.edu wt_dyn * (list.back()->power.readOp.dynamic/min->min_dyn) + 60410152Satgutier@umich.edu wt_leakage * (list.back()->power.readOp.leakage/min->min_leakage) + 60510152Satgutier@umich.edu wt_area * (list.back()->area/min->min_area) + 60610152Satgutier@umich.edu wt_cyc * (list.back()->cycle_time/min->min_cyc); 60710152Satgutier@umich.edu } 60810152Satgutier@umich.edu else 60910152Satgutier@umich.edu { 61010152Satgutier@umich.edu cur_cost = BIGNUM; 61110152Satgutier@umich.edu } 61210152Satgutier@umich.edu if (cur_cost < cost) 61310152Satgutier@umich.edu { 61410152Satgutier@umich.edu if (res != NULL) 61510152Satgutier@umich.edu { 61610152Satgutier@umich.edu delete res; 61710152Satgutier@umich.edu } 61810152Satgutier@umich.edu cost = cur_cost; 61910152Satgutier@umich.edu res = list.back(); 62010152Satgutier@umich.edu } 62110152Satgutier@umich.edu else 62210152Satgutier@umich.edu { 62310152Satgutier@umich.edu delete list.back(); 62410152Satgutier@umich.edu } 62510152Satgutier@umich.edu list.pop_back(); 62610152Satgutier@umich.edu } 62710152Satgutier@umich.edu if(!res) 62810152Satgutier@umich.edu { 62910152Satgutier@umich.edu cout << "ERROR: no valid tag organizations found" << endl; 63010152Satgutier@umich.edu exit(0); 63110152Satgutier@umich.edu } 63210152Satgutier@umich.edu 63310152Satgutier@umich.edu list.push_back(res); 63410152Satgutier@umich.edu} 63510152Satgutier@umich.edu 63610152Satgutier@umich.edu 63710152Satgutier@umich.edu 63810152Satgutier@umich.eduvoid filter_data_arr(list<mem_array *> & curr_list) 63910152Satgutier@umich.edu{ 64010152Satgutier@umich.edu if (curr_list.empty() == true) 64110152Satgutier@umich.edu { 64210152Satgutier@umich.edu cout << "ERROR: no valid data array organizations found" << endl; 64310152Satgutier@umich.edu exit(1); 64410152Satgutier@umich.edu } 64510152Satgutier@umich.edu 64610152Satgutier@umich.edu list<mem_array *>::iterator iter; 64710152Satgutier@umich.edu 64810152Satgutier@umich.edu for (iter = curr_list.begin(); iter != curr_list.end(); ++iter) 64910152Satgutier@umich.edu { 65010152Satgutier@umich.edu mem_array * m = *iter; 65110152Satgutier@umich.edu 65210152Satgutier@umich.edu if (m == NULL) exit(1); 65310152Satgutier@umich.edu 65410152Satgutier@umich.edu if(((m->access_time - m->arr_min->min_delay)/m->arr_min->min_delay > 0.5) && 65510152Satgutier@umich.edu ((m->power.readOp.dynamic - m->arr_min->min_dyn)/m->arr_min->min_dyn > 0.5)) 65610152Satgutier@umich.edu { 65710152Satgutier@umich.edu delete m; 65810152Satgutier@umich.edu iter = curr_list.erase(iter); 65910152Satgutier@umich.edu iter --; 66010152Satgutier@umich.edu } 66110152Satgutier@umich.edu } 66210152Satgutier@umich.edu} 66310152Satgutier@umich.edu 66410152Satgutier@umich.edu 66510152Satgutier@umich.edu 66610152Satgutier@umich.edu/* 66710152Satgutier@umich.edu * Performs exhaustive search across different sub-array sizes, 66810152Satgutier@umich.edu * wire types and aspect ratios to find an optimal UCA organization 66910152Satgutier@umich.edu * 1. First different valid tag array organizations are calculated 67010152Satgutier@umich.edu * and stored in tag_arr array 67110152Satgutier@umich.edu * 2. The exhaustive search is repeated to find valid data array 67210152Satgutier@umich.edu * organizations and stored in data_arr array 67310152Satgutier@umich.edu * 3. Cache area, delay, power, and cycle time for different 67410152Satgutier@umich.edu * cache organizations are calculated based on the 67510152Satgutier@umich.edu * above results 67610152Satgutier@umich.edu * 4. Cache model with least cost is picked from sol_list 67710152Satgutier@umich.edu */ 67810152Satgutier@umich.eduvoid solve(uca_org_t *fin_res) 67910152Satgutier@umich.edu{ 68010152Satgutier@umich.edu bool is_dram = false; 68110152Satgutier@umich.edu int pure_ram = g_ip->pure_ram; 68210152Satgutier@umich.edu bool pure_cam = g_ip->pure_cam; 68310152Satgutier@umich.edu 68410152Satgutier@umich.edu init_tech_params(g_ip->F_sz_um, false); 68510152Satgutier@umich.edu 68610152Satgutier@umich.edu 68710152Satgutier@umich.edu list<mem_array *> tag_arr (0); 68810152Satgutier@umich.edu list<mem_array *> data_arr(0); 68910152Satgutier@umich.edu list<mem_array *>::iterator miter; 69010152Satgutier@umich.edu list<uca_org_t> sol_list(1, uca_org_t()); 69110152Satgutier@umich.edu 69210152Satgutier@umich.edu fin_res->tag_array.access_time = 0; 69310152Satgutier@umich.edu fin_res->tag_array.Ndwl = 0; 69410152Satgutier@umich.edu fin_res->tag_array.Ndbl = 0; 69510152Satgutier@umich.edu fin_res->tag_array.Nspd = 0; 69610152Satgutier@umich.edu fin_res->tag_array.deg_bl_muxing = 0; 69710152Satgutier@umich.edu fin_res->tag_array.Ndsam_lev_1 = 0; 69810152Satgutier@umich.edu fin_res->tag_array.Ndsam_lev_2 = 0; 69910152Satgutier@umich.edu 70010152Satgutier@umich.edu 70110152Satgutier@umich.edu // distribute calculate_time() execution to multiple threads 70210152Satgutier@umich.edu calc_time_mt_wrapper_struct * calc_array = new calc_time_mt_wrapper_struct[nthreads]; 70310152Satgutier@umich.edu pthread_t threads[nthreads]; 70410152Satgutier@umich.edu 70510152Satgutier@umich.edu for (uint32_t t = 0; t < nthreads; t++) 70610152Satgutier@umich.edu { 70710152Satgutier@umich.edu calc_array[t].tid = t; 70810152Satgutier@umich.edu calc_array[t].pure_ram = pure_ram; 70910152Satgutier@umich.edu calc_array[t].pure_cam = pure_cam; 71010152Satgutier@umich.edu calc_array[t].data_res = new min_values_t(); 71110152Satgutier@umich.edu calc_array[t].tag_res = new min_values_t(); 71210152Satgutier@umich.edu } 71310152Satgutier@umich.edu 71410152Satgutier@umich.edu bool is_tag; 71510152Satgutier@umich.edu uint32_t ram_cell_tech_type; 71610152Satgutier@umich.edu 71710152Satgutier@umich.edu // If it's a cache, first calculate the area, delay and power for all tag array partitions. 71810152Satgutier@umich.edu if (!(pure_ram||pure_cam||g_ip->fully_assoc)) 71910152Satgutier@umich.edu { //cache 72010152Satgutier@umich.edu is_tag = true; 72110152Satgutier@umich.edu ram_cell_tech_type = g_ip->tag_arr_ram_cell_tech_type; 72210152Satgutier@umich.edu is_dram = ((ram_cell_tech_type == lp_dram) || (ram_cell_tech_type == comm_dram)); 72310152Satgutier@umich.edu init_tech_params(g_ip->F_sz_um, is_tag); 72410152Satgutier@umich.edu 72510152Satgutier@umich.edu for (uint32_t t = 0; t < nthreads; t++) 72610152Satgutier@umich.edu { 72710152Satgutier@umich.edu calc_array[t].is_tag = is_tag; 72810152Satgutier@umich.edu calc_array[t].is_main_mem = false; 72910152Satgutier@umich.edu calc_array[t].Nspd_min = 0.125; 73010152Satgutier@umich.edu pthread_create(&threads[t], NULL, calc_time_mt_wrapper, (void *)(&(calc_array[t]))); 73110152Satgutier@umich.edu } 73210152Satgutier@umich.edu 73310152Satgutier@umich.edu for (uint32_t t = 0; t < nthreads; t++) 73410152Satgutier@umich.edu { 73510152Satgutier@umich.edu pthread_join(threads[t], NULL); 73610152Satgutier@umich.edu } 73710152Satgutier@umich.edu 73810152Satgutier@umich.edu for (uint32_t t = 0; t < nthreads; t++) 73910152Satgutier@umich.edu { 74010152Satgutier@umich.edu calc_array[t].data_arr.sort(mem_array::lt); 74110152Satgutier@umich.edu data_arr.merge(calc_array[t].data_arr, mem_array::lt); 74210152Satgutier@umich.edu calc_array[t].tag_arr.sort(mem_array::lt); 74310152Satgutier@umich.edu tag_arr.merge(calc_array[t].tag_arr, mem_array::lt); 74410152Satgutier@umich.edu } 74510152Satgutier@umich.edu } 74610152Satgutier@umich.edu 74710152Satgutier@umich.edu 74810152Satgutier@umich.edu // calculate the area, delay and power for all data array partitions (for cache or plain RAM). 74910152Satgutier@umich.edu// if (!g_ip->fully_assoc) 75010152Satgutier@umich.edu// {//in the new cacti, cam, fully_associative cache are processed as single array in the data portion 75110152Satgutier@umich.edu is_tag = false; 75210152Satgutier@umich.edu ram_cell_tech_type = g_ip->data_arr_ram_cell_tech_type; 75310152Satgutier@umich.edu is_dram = ((ram_cell_tech_type == lp_dram) || (ram_cell_tech_type == comm_dram)); 75410152Satgutier@umich.edu init_tech_params(g_ip->F_sz_um, is_tag); 75510152Satgutier@umich.edu 75610152Satgutier@umich.edu for (uint32_t t = 0; t < nthreads; t++) 75710152Satgutier@umich.edu { 75810152Satgutier@umich.edu calc_array[t].is_tag = is_tag; 75910152Satgutier@umich.edu calc_array[t].is_main_mem = g_ip->is_main_mem; 76010152Satgutier@umich.edu if (!(pure_cam||g_ip->fully_assoc)) 76110152Satgutier@umich.edu { 76210152Satgutier@umich.edu calc_array[t].Nspd_min = (double)(g_ip->out_w)/(double)(g_ip->block_sz*8); 76310152Satgutier@umich.edu } 76410152Satgutier@umich.edu else 76510152Satgutier@umich.edu { 76610152Satgutier@umich.edu calc_array[t].Nspd_min = 1; 76710152Satgutier@umich.edu } 76810152Satgutier@umich.edu 76910152Satgutier@umich.edu pthread_create(&threads[t], NULL, calc_time_mt_wrapper, (void *)(&(calc_array[t]))); 77010152Satgutier@umich.edu } 77110152Satgutier@umich.edu 77210152Satgutier@umich.edu for (uint32_t t = 0; t < nthreads; t++) 77310152Satgutier@umich.edu { 77410152Satgutier@umich.edu pthread_join(threads[t], NULL); 77510152Satgutier@umich.edu } 77610152Satgutier@umich.edu 77710152Satgutier@umich.edu data_arr.clear(); 77810152Satgutier@umich.edu for (uint32_t t = 0; t < nthreads; t++) 77910152Satgutier@umich.edu { 78010152Satgutier@umich.edu calc_array[t].data_arr.sort(mem_array::lt); 78110152Satgutier@umich.edu data_arr.merge(calc_array[t].data_arr, mem_array::lt); 78210152Satgutier@umich.edu } 78310152Satgutier@umich.edu// } 78410152Satgutier@umich.edu 78510152Satgutier@umich.edu 78610152Satgutier@umich.edu min_values_t * d_min = new min_values_t(); 78710152Satgutier@umich.edu min_values_t * t_min = new min_values_t(); 78810152Satgutier@umich.edu min_values_t * cache_min = new min_values_t(); 78910152Satgutier@umich.edu 79010152Satgutier@umich.edu for (uint32_t t = 0; t < nthreads; t++) 79110152Satgutier@umich.edu { 79210152Satgutier@umich.edu d_min->update_min_values(calc_array[t].data_res); 79310152Satgutier@umich.edu t_min->update_min_values(calc_array[t].tag_res); 79410152Satgutier@umich.edu } 79510152Satgutier@umich.edu 79610152Satgutier@umich.edu for (miter = data_arr.begin(); miter != data_arr.end(); miter++) 79710152Satgutier@umich.edu { 79810152Satgutier@umich.edu (*miter)->arr_min = d_min; 79910152Satgutier@umich.edu } 80010152Satgutier@umich.edu 80110152Satgutier@umich.edu 80210152Satgutier@umich.edu //cout << data_arr.size() << "\t" << tag_arr.size() <<" before\n"; 80310152Satgutier@umich.edu filter_data_arr(data_arr); 80410152Satgutier@umich.edu if(!(pure_ram||pure_cam||g_ip->fully_assoc)) 80510152Satgutier@umich.edu { 80610152Satgutier@umich.edu filter_tag_arr(t_min, tag_arr); 80710152Satgutier@umich.edu } 80810152Satgutier@umich.edu //cout << data_arr.size() << "\t" << tag_arr.size() <<" after\n"; 80910152Satgutier@umich.edu 81010152Satgutier@umich.edu 81110152Satgutier@umich.edu if (pure_ram||pure_cam||g_ip->fully_assoc) 81210152Satgutier@umich.edu { 81310152Satgutier@umich.edu for (miter = data_arr.begin(); miter != data_arr.end(); miter++) 81410152Satgutier@umich.edu { 81510152Satgutier@umich.edu uca_org_t & curr_org = sol_list.back(); 81610152Satgutier@umich.edu curr_org.tag_array2 = NULL; 81710152Satgutier@umich.edu curr_org.data_array2 = (*miter); 81810152Satgutier@umich.edu 81910152Satgutier@umich.edu curr_org.find_delay(); 82010152Satgutier@umich.edu curr_org.find_energy(); 82110152Satgutier@umich.edu curr_org.find_area(); 82210152Satgutier@umich.edu curr_org.find_cyc(); 82310152Satgutier@umich.edu 82410152Satgutier@umich.edu //update min values for the entire cache 82510152Satgutier@umich.edu cache_min->update_min_values(curr_org); 82610152Satgutier@umich.edu 82710152Satgutier@umich.edu sol_list.push_back(uca_org_t()); 82810152Satgutier@umich.edu } 82910152Satgutier@umich.edu } 83010152Satgutier@umich.edu else 83110152Satgutier@umich.edu { 83210152Satgutier@umich.edu while (tag_arr.empty() != true) 83310152Satgutier@umich.edu { 83410152Satgutier@umich.edu mem_array * arr_temp = (tag_arr.back()); 83510152Satgutier@umich.edu //delete tag_arr.back(); 83610152Satgutier@umich.edu tag_arr.pop_back(); 83710152Satgutier@umich.edu 83810152Satgutier@umich.edu for (miter = data_arr.begin(); miter != data_arr.end(); miter++) 83910152Satgutier@umich.edu { 84010152Satgutier@umich.edu uca_org_t & curr_org = sol_list.back(); 84110152Satgutier@umich.edu curr_org.tag_array2 = arr_temp; 84210152Satgutier@umich.edu curr_org.data_array2 = (*miter); 84310152Satgutier@umich.edu 84410152Satgutier@umich.edu curr_org.find_delay(); 84510152Satgutier@umich.edu curr_org.find_energy(); 84610152Satgutier@umich.edu curr_org.find_area(); 84710152Satgutier@umich.edu curr_org.find_cyc(); 84810152Satgutier@umich.edu 84910152Satgutier@umich.edu //update min values for the entire cache 85010152Satgutier@umich.edu cache_min->update_min_values(curr_org); 85110152Satgutier@umich.edu 85210152Satgutier@umich.edu sol_list.push_back(uca_org_t()); 85310152Satgutier@umich.edu } 85410152Satgutier@umich.edu } 85510152Satgutier@umich.edu } 85610152Satgutier@umich.edu 85710152Satgutier@umich.edu sol_list.pop_back(); 85810152Satgutier@umich.edu 85910152Satgutier@umich.edu find_optimal_uca(fin_res, cache_min, sol_list); 86010152Satgutier@umich.edu 86110152Satgutier@umich.edu sol_list.clear(); 86210152Satgutier@umich.edu 86310152Satgutier@umich.edu for (miter = data_arr.begin(); miter != data_arr.end(); ++miter) 86410152Satgutier@umich.edu { 86510152Satgutier@umich.edu if (*miter != fin_res->data_array2) 86610152Satgutier@umich.edu { 86710152Satgutier@umich.edu delete *miter; 86810152Satgutier@umich.edu } 86910152Satgutier@umich.edu } 87010152Satgutier@umich.edu data_arr.clear(); 87110152Satgutier@umich.edu 87210152Satgutier@umich.edu for (uint32_t t = 0; t < nthreads; t++) 87310152Satgutier@umich.edu { 87410152Satgutier@umich.edu delete calc_array[t].data_res; 87510152Satgutier@umich.edu delete calc_array[t].tag_res; 87610152Satgutier@umich.edu } 87710152Satgutier@umich.edu 87810152Satgutier@umich.edu delete [] calc_array; 87910152Satgutier@umich.edu delete cache_min; 88010152Satgutier@umich.edu delete d_min; 88110152Satgutier@umich.edu delete t_min; 88210152Satgutier@umich.edu} 88310152Satgutier@umich.edu 88410152Satgutier@umich.eduvoid update(uca_org_t *fin_res) 88510152Satgutier@umich.edu{ 88610152Satgutier@umich.edu if(fin_res->tag_array2) 88710152Satgutier@umich.edu { 88810152Satgutier@umich.edu init_tech_params(g_ip->F_sz_um,true); 88910152Satgutier@umich.edu DynamicParameter tag_arr_dyn_p(true, g_ip->pure_ram, g_ip->pure_cam, fin_res->tag_array2->Nspd, fin_res->tag_array2->Ndwl, fin_res->tag_array2->Ndbl, fin_res->tag_array2->Ndcm, fin_res->tag_array2->Ndsam_lev_1, fin_res->tag_array2->Ndsam_lev_2, g_ip->is_main_mem); 89010152Satgutier@umich.edu if(tag_arr_dyn_p.is_valid) 89110152Satgutier@umich.edu { 89210152Satgutier@umich.edu UCA * tag_arr = new UCA(tag_arr_dyn_p); 89310152Satgutier@umich.edu fin_res->tag_array2->power = tag_arr->power; 89410152Satgutier@umich.edu } 89510152Satgutier@umich.edu else 89610152Satgutier@umich.edu { 89710152Satgutier@umich.edu cout << "ERROR: Cannot retrieve array structure for leakage feedback" << endl; 89810152Satgutier@umich.edu exit(1); 89910152Satgutier@umich.edu } 90010152Satgutier@umich.edu } 90110152Satgutier@umich.edu init_tech_params(g_ip->F_sz_um,false); 90210152Satgutier@umich.edu DynamicParameter data_arr_dyn_p(false, g_ip->pure_ram, g_ip->pure_cam, fin_res->data_array2->Nspd, fin_res->data_array2->Ndwl, fin_res->data_array2->Ndbl, fin_res->data_array2->Ndcm, fin_res->data_array2->Ndsam_lev_1, fin_res->data_array2->Ndsam_lev_2, g_ip->is_main_mem); 90310152Satgutier@umich.edu if(data_arr_dyn_p.is_valid) 90410152Satgutier@umich.edu { 90510152Satgutier@umich.edu UCA * data_arr = new UCA(data_arr_dyn_p); 90610152Satgutier@umich.edu fin_res->data_array2->power = data_arr->power; 90710152Satgutier@umich.edu } 90810152Satgutier@umich.edu else 90910152Satgutier@umich.edu { 91010152Satgutier@umich.edu cout << "ERROR: Cannot retrieve array structure for leakage feedback" << endl; 91110152Satgutier@umich.edu exit(1); 91210152Satgutier@umich.edu } 91310152Satgutier@umich.edu 91410152Satgutier@umich.edu fin_res->find_energy(); 91510152Satgutier@umich.edu} 91610152Satgutier@umich.edu 917