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