00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 #ifndef __BASIC_CIRCUIT_H__
00045 #define __BASIC_CIRCUIT_H__
00046
00047 #include "const.h"
00048 #include "cacti_interface.h"
00049
00050 using namespace std;
00051
00052 #define UNI_LEAK_STACK_FACTOR 0.43
00053
00054 int powers (int base, int n);
00055 bool is_pow2(int64_t val);
00056 uint32_t _log2(uint64_t num);
00057 int factorial(int n, int m = 1);
00058 int combination(int n, int m);
00059
00060
00061 #ifdef DBG
00062 #define PRINTDW(a);\
00063 a;
00064 #else
00065 #define PRINTDW(a);\
00066
00067 #endif
00068
00069
00070 enum Wire_placement {
00071 outside_mat,
00072 inside_mat,
00073 local_wires
00074 };
00075
00076
00077
00078 enum Htree_type {
00079 Add_htree,
00080 Data_in_htree,
00081 Data_out_htree,
00082 Search_in_htree,
00083 Search_out_htree,
00084 };
00085
00086 enum Gate_type {
00087 nmos,
00088 pmos,
00089 inv,
00090 nand,
00091 nor,
00092 tri,
00093 tg
00094 };
00095
00096 enum Half_net_topology {
00097 parallel,
00098 series
00099 };
00100
00101 double logtwo (double x);
00102
00103 double gate_C(
00104 double width,
00105 double wirelength,
00106 bool _is_dram = false,
00107 bool _is_sram = false,
00108 bool _is_wl_tr = false);
00109
00110 double gate_C_pass(
00111 double width,
00112 double wirelength,
00113 bool _is_dram = false,
00114 bool _is_sram = false,
00115 bool _is_wl_tr = false);
00116
00117 double drain_C_(
00118 double width,
00119 int nchannel,
00120 int stack,
00121 int next_arg_thresh_folding_width_or_height_cell,
00122 double fold_dimension,
00123 bool _is_dram = false,
00124 bool _is_sram = false,
00125 bool _is_wl_tr = false);
00126
00127 double tr_R_on(
00128 double width,
00129 int nchannel,
00130 int stack,
00131 bool _is_dram = false,
00132 bool _is_sram = false,
00133 bool _is_wl_tr = false);
00134
00135 double R_to_w(
00136 double res,
00137 int nchannel,
00138 bool _is_dram = false,
00139 bool _is_sram = false,
00140 bool _is_wl_tr = false);
00141
00142 double horowitz (
00143 double inputramptime,
00144 double tf,
00145 double vs1,
00146 double vs2,
00147 int rise);
00148
00149 double pmos_to_nmos_sz_ratio(
00150 bool _is_dram = false,
00151 bool _is_wl_tr = false);
00152
00153 double simplified_nmos_leakage(
00154 double nwidth,
00155 bool _is_dram = false,
00156 bool _is_cell = false,
00157 bool _is_wl_tr = false);
00158
00159 double simplified_pmos_leakage(
00160 double pwidth,
00161 bool _is_dram = false,
00162 bool _is_cell = false,
00163 bool _is_wl_tr = false);
00164
00165
00166 double cmos_Ileak(
00167 double nWidth,
00168 double pWidth,
00169 bool _is_dram = false,
00170 bool _is_cell = false,
00171 bool _is_wl_tr = false);
00172
00173 double cmos_Ig_n(
00174 double nWidth,
00175 bool _is_dram = false,
00176 bool _is_cell = false,
00177 bool _is_wl_tr= false);
00178
00179 double cmos_Ig_p(
00180 double pWidth,
00181 bool _is_dram = false,
00182 bool _is_cell = false,
00183 bool _is_wl_tr= false);
00184
00185
00186 double cmos_Isub_leakage(
00187 double nWidth,
00188 double pWidth,
00189 int fanin,
00190 enum Gate_type g_type,
00191 bool _is_dram = false,
00192 bool _is_cell = false,
00193 bool _is_wl_tr = false,
00194 enum Half_net_topology topo = series);
00195
00196 double cmos_Ig_leakage(
00197 double nWidth,
00198 double pWidth,
00199 int fanin,
00200 enum Gate_type g_type,
00201 bool _is_dram = false,
00202 bool _is_cell = false,
00203 bool _is_wl_tr = false,
00204 enum Half_net_topology topo = series);
00205
00206 double shortcircuit(
00207 double vt,
00208 double velocity_index,
00209 double c_in,
00210 double c_out,
00211 double w_nmos,
00212 double w_pmos,
00213 double i_on_n,
00214 double i_on_p,
00215 double i_on_n_in,
00216 double i_on_p_in,
00217 double vdd);
00218
00219 double shortcircuit_simple(
00220 double vt,
00221 double velocity_index,
00222 double c_in,
00223 double c_out,
00224 double w_nmos,
00225 double w_pmos,
00226 double i_on_n,
00227 double i_on_p,
00228 double i_on_n_in,
00229 double i_on_p_in,
00230 double vdd);
00231
00232 inline void set_pppm(
00233 double * pppv,
00234 double a=1,
00235 double b=1,
00236 double c=1,
00237 double d=1
00238 ){
00239 pppv[0]= a;
00240 pppv[1]= b;
00241 pppv[2]= c;
00242 pppv[3]= d;
00243
00244 }
00245
00246 inline void set_sppm(
00247 double * sppv,
00248 double a=1,
00249 double b=1,
00250 double c=1,
00251 double d=1
00252 ){
00253 sppv[0]= a;
00254 sppv[1]= b;
00255 sppv[2]= c;
00256 }
00257
00258 #endif