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