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.
510234Syasuko.eckert@amd.com *            Copyright (c) 2010-2013 Advanced Micro Devices, Inc.
610152Satgutier@umich.edu *                          All Rights Reserved
710152Satgutier@umich.edu *
810152Satgutier@umich.edu * Redistribution and use in source and binary forms, with or without
910152Satgutier@umich.edu * modification, are permitted provided that the following conditions are
1010152Satgutier@umich.edu * met: redistributions of source code must retain the above copyright
1110152Satgutier@umich.edu * notice, this list of conditions and the following disclaimer;
1210152Satgutier@umich.edu * redistributions in binary form must reproduce the above copyright
1310152Satgutier@umich.edu * notice, this list of conditions and the following disclaimer in the
1410152Satgutier@umich.edu * documentation and/or other materials provided with the distribution;
1510152Satgutier@umich.edu * neither the name of the copyright holders nor the names of its
1610152Satgutier@umich.edu * contributors may be used to endorse or promote products derived from
1710152Satgutier@umich.edu * this software without specific prior written permission.
1810152Satgutier@umich.edu
1910152Satgutier@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2010152Satgutier@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2110152Satgutier@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2210152Satgutier@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2310152Satgutier@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2410152Satgutier@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2510152Satgutier@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2610152Satgutier@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2710152Satgutier@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2810152Satgutier@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2910234Syasuko.eckert@amd.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3010152Satgutier@umich.edu *
3110152Satgutier@umich.edu ***************************************************************************/
3210152Satgutier@umich.edu
3310152Satgutier@umich.edu
3410152Satgutier@umich.edu
3510152Satgutier@umich.edu#ifndef __BASIC_CIRCUIT_H__
3610152Satgutier@umich.edu#define __BASIC_CIRCUIT_H__
3710152Satgutier@umich.edu
3810152Satgutier@umich.edu#include "cacti_interface.h"
3910152Satgutier@umich.edu#include "const.h"
4010152Satgutier@umich.edu
4110152Satgutier@umich.eduusing namespace std;
4210152Satgutier@umich.edu
4310152Satgutier@umich.edu#define UNI_LEAK_STACK_FACTOR 0.43
4410152Satgutier@umich.edu
4510152Satgutier@umich.eduint powers (int base, int n);
4610152Satgutier@umich.edubool is_pow2(int64_t val);
4710152Satgutier@umich.eduuint32_t _log2(uint64_t num);
4810152Satgutier@umich.eduint factorial(int n, int m = 1);
4910152Satgutier@umich.eduint combination(int n, int m);
5010152Satgutier@umich.edu
5110152Satgutier@umich.edu//#define DBG
5210152Satgutier@umich.edu#ifdef DBG
5310234Syasuko.eckert@amd.com#define PRINTDW(a);\
5410152Satgutier@umich.edu    a;
5510152Satgutier@umich.edu#else
5610234Syasuko.eckert@amd.com#define PRINTDW(a);\
5710152Satgutier@umich.edu
5810152Satgutier@umich.edu#endif
5910152Satgutier@umich.edu
6010152Satgutier@umich.edu
6110152Satgutier@umich.eduenum Wire_placement {
6210152Satgutier@umich.edu    outside_mat,
6310152Satgutier@umich.edu    inside_mat,
6410152Satgutier@umich.edu    local_wires
6510152Satgutier@umich.edu};
6610152Satgutier@umich.edu
6710152Satgutier@umich.edu
6810152Satgutier@umich.edu
6910152Satgutier@umich.eduenum Htree_type {
7010152Satgutier@umich.edu    Add_htree,
7110152Satgutier@umich.edu    Data_in_htree,
7210152Satgutier@umich.edu    Data_out_htree,
7310152Satgutier@umich.edu    Search_in_htree,
7410152Satgutier@umich.edu    Search_out_htree,
7510152Satgutier@umich.edu};
7610152Satgutier@umich.edu
7710152Satgutier@umich.eduenum Gate_type {
7810152Satgutier@umich.edu    nmos,
7910152Satgutier@umich.edu    pmos,
8010234Syasuko.eckert@amd.com    inv,
8110152Satgutier@umich.edu    nand,
8210152Satgutier@umich.edu    nor,
8310152Satgutier@umich.edu    tri,
8410152Satgutier@umich.edu    tg
8510152Satgutier@umich.edu};
8610152Satgutier@umich.edu
8710152Satgutier@umich.eduenum Half_net_topology {
8810152Satgutier@umich.edu    parallel,
8910152Satgutier@umich.edu    series
9010152Satgutier@umich.edu};
9110152Satgutier@umich.edu
9210152Satgutier@umich.edudouble logtwo (double x);
9310152Satgutier@umich.edu
9410152Satgutier@umich.edudouble gate_C(
9510152Satgutier@umich.edu    double width,
9610152Satgutier@umich.edu    double wirelength,
9710152Satgutier@umich.edu    bool _is_dram = false,
9810152Satgutier@umich.edu    bool _is_sram = false,
9910152Satgutier@umich.edu    bool _is_wl_tr = false);
10010152Satgutier@umich.edu
10110152Satgutier@umich.edudouble gate_C_pass(
10210152Satgutier@umich.edu    double width,
10310152Satgutier@umich.edu    double wirelength,
10410152Satgutier@umich.edu    bool   _is_dram = false,
10510152Satgutier@umich.edu    bool   _is_sram = false,
10610152Satgutier@umich.edu    bool   _is_wl_tr = false);
10710152Satgutier@umich.edu
10810152Satgutier@umich.edudouble drain_C_(
10910152Satgutier@umich.edu    double width,
11010152Satgutier@umich.edu    int nchannel,
11110152Satgutier@umich.edu    int stack,
11210152Satgutier@umich.edu    int next_arg_thresh_folding_width_or_height_cell,
11310152Satgutier@umich.edu    double fold_dimension,
11410152Satgutier@umich.edu    bool _is_dram = false,
11510152Satgutier@umich.edu    bool _is_sram = false,
11610152Satgutier@umich.edu    bool _is_wl_tr = false);
11710152Satgutier@umich.edu
11810152Satgutier@umich.edudouble tr_R_on(
11910152Satgutier@umich.edu    double width,
12010152Satgutier@umich.edu    int nchannel,
12110152Satgutier@umich.edu    int stack,
12210152Satgutier@umich.edu    bool _is_dram = false,
12310152Satgutier@umich.edu    bool _is_sram = false,
12410152Satgutier@umich.edu    bool _is_wl_tr = false);
12510152Satgutier@umich.edu
12610152Satgutier@umich.edudouble R_to_w(
12710152Satgutier@umich.edu    double res,
12810152Satgutier@umich.edu    int nchannel,
12910152Satgutier@umich.edu    bool _is_dram = false,
13010152Satgutier@umich.edu    bool _is_sram = false,
13110152Satgutier@umich.edu    bool _is_wl_tr = false);
13210152Satgutier@umich.edu
13310152Satgutier@umich.edudouble horowitz (
13410152Satgutier@umich.edu    double inputramptime,
13510152Satgutier@umich.edu    double tf,
13610152Satgutier@umich.edu    double vs1,
13710152Satgutier@umich.edu    double vs2,
13810152Satgutier@umich.edu    int rise);
13910152Satgutier@umich.edu
14010152Satgutier@umich.edudouble pmos_to_nmos_sz_ratio(
14110152Satgutier@umich.edu    bool _is_dram = false,
14210152Satgutier@umich.edu    bool _is_wl_tr = false);
14310152Satgutier@umich.edu
14410152Satgutier@umich.edudouble simplified_nmos_leakage(
14510152Satgutier@umich.edu    double nwidth,
14610152Satgutier@umich.edu    bool _is_dram = false,
14710152Satgutier@umich.edu    bool _is_cell = false,
14810152Satgutier@umich.edu    bool _is_wl_tr = false);
14910152Satgutier@umich.edu
15010152Satgutier@umich.edudouble simplified_pmos_leakage(
15110152Satgutier@umich.edu    double pwidth,
15210152Satgutier@umich.edu    bool _is_dram = false,
15310152Satgutier@umich.edu    bool _is_cell = false,
15410152Satgutier@umich.edu    bool _is_wl_tr = false);
15510152Satgutier@umich.edu
15610152Satgutier@umich.edu
15710152Satgutier@umich.edudouble cmos_Ileak(
15810152Satgutier@umich.edu    double nWidth,
15910152Satgutier@umich.edu    double pWidth,
16010152Satgutier@umich.edu    bool _is_dram = false,
16110152Satgutier@umich.edu    bool _is_cell = false,
16210152Satgutier@umich.edu    bool _is_wl_tr = false);
16310152Satgutier@umich.edu
16410152Satgutier@umich.edudouble cmos_Ig_n(
16510152Satgutier@umich.edu    double nWidth,
16610152Satgutier@umich.edu    bool _is_dram = false,
16710152Satgutier@umich.edu    bool _is_cell = false,
16810234Syasuko.eckert@amd.com    bool _is_wl_tr = false);
16910152Satgutier@umich.edu
17010152Satgutier@umich.edudouble cmos_Ig_p(
17110152Satgutier@umich.edu    double pWidth,
17210152Satgutier@umich.edu    bool _is_dram = false,
17310152Satgutier@umich.edu    bool _is_cell = false,
17410234Syasuko.eckert@amd.com    bool _is_wl_tr = false);
17510152Satgutier@umich.edu
17610152Satgutier@umich.edu
17710152Satgutier@umich.edudouble cmos_Isub_leakage(
17810152Satgutier@umich.edu    double nWidth,
17910152Satgutier@umich.edu    double pWidth,
18010152Satgutier@umich.edu    int    fanin,
18110152Satgutier@umich.edu    enum Gate_type g_type,
18210152Satgutier@umich.edu    bool _is_dram = false,
18310152Satgutier@umich.edu    bool _is_cell = false,
18410152Satgutier@umich.edu    bool _is_wl_tr = false,
18510152Satgutier@umich.edu    enum Half_net_topology topo = series);
18610152Satgutier@umich.edu
18710152Satgutier@umich.edudouble cmos_Ig_leakage(
18810152Satgutier@umich.edu    double nWidth,
18910152Satgutier@umich.edu    double pWidth,
19010152Satgutier@umich.edu    int    fanin,
19110152Satgutier@umich.edu    enum Gate_type g_type,
19210152Satgutier@umich.edu    bool _is_dram = false,
19310152Satgutier@umich.edu    bool _is_cell = false,
19410152Satgutier@umich.edu    bool _is_wl_tr = false,
19510152Satgutier@umich.edu    enum Half_net_topology topo = series);
19610152Satgutier@umich.edu
19710152Satgutier@umich.edudouble shortcircuit(
19810152Satgutier@umich.edu    double vt,
19910152Satgutier@umich.edu    double velocity_index,
20010152Satgutier@umich.edu    double c_in,
20110152Satgutier@umich.edu    double c_out,
20210152Satgutier@umich.edu    double w_nmos,
20310152Satgutier@umich.edu    double w_pmos,
20410152Satgutier@umich.edu    double i_on_n,
20510152Satgutier@umich.edu    double i_on_p,
20610152Satgutier@umich.edu    double i_on_n_in,
20710152Satgutier@umich.edu    double i_on_p_in,
20810152Satgutier@umich.edu    double vdd);
20910152Satgutier@umich.edu
21010152Satgutier@umich.edudouble shortcircuit_simple(
21110152Satgutier@umich.edu    double vt,
21210152Satgutier@umich.edu    double velocity_index,
21310152Satgutier@umich.edu    double c_in,
21410152Satgutier@umich.edu    double c_out,
21510152Satgutier@umich.edu    double w_nmos,
21610152Satgutier@umich.edu    double w_pmos,
21710152Satgutier@umich.edu    double i_on_n,
21810152Satgutier@umich.edu    double i_on_p,
21910152Satgutier@umich.edu    double i_on_n_in,
22010152Satgutier@umich.edu    double i_on_p_in,
22110152Satgutier@umich.edu    double vdd);
22210152Satgutier@umich.edu//set power point product mask; strictly speaking this is not real point product
22310152Satgutier@umich.eduinline void set_pppm(
22410234Syasuko.eckert@amd.com    double * pppv,
22510234Syasuko.eckert@amd.com    double a = 1,
22610234Syasuko.eckert@amd.com    double b = 1,
22710234Syasuko.eckert@amd.com    double c = 1,
22810234Syasuko.eckert@amd.com    double d = 1
22910234Syasuko.eckert@amd.com) {
23010234Syasuko.eckert@amd.com    pppv[0] = a;
23110234Syasuko.eckert@amd.com    pppv[1] = b;
23210234Syasuko.eckert@amd.com    pppv[2] = c;
23310234Syasuko.eckert@amd.com    pppv[3] = d;
23410152Satgutier@umich.edu
23510152Satgutier@umich.edu}
23610152Satgutier@umich.edu
23710152Satgutier@umich.eduinline void set_sppm(
23810234Syasuko.eckert@amd.com    double * sppv,
23910234Syasuko.eckert@amd.com    double a = 1,
24010234Syasuko.eckert@amd.com    double b = 1,
24110234Syasuko.eckert@amd.com    double c = 1,
24210234Syasuko.eckert@amd.com    double d = 1
24310234Syasuko.eckert@amd.com) {
24410234Syasuko.eckert@amd.com    sppv[0] = a;
24510234Syasuko.eckert@amd.com    sppv[1] = b;
24610234Syasuko.eckert@amd.com    sppv[2] = c;
24710152Satgutier@umich.edu}
24810152Satgutier@umich.edu
24910152Satgutier@umich.edu#endif
250