• Main Page
  • Related Pages
  • Modules
  • Data Structures
  • Files
  • File List
  • Globals

sst/core/techModels/libsim-panalyzer/libecacti/ecacti.h

00001 #ifndef ECACTI_H
00002 #define ECACTI_H
00003 #include "../libpanalyzer/panalyzer.h"
00004 
00005 /*
00006  * The output can be in 'long' format, which shows everything, or
00007  * 'short' format, which is just what a program like 'grap' would
00008  * want to see
00009  */
00010 
00011 #define LONG 1
00012 #define SHORT 2
00013 #define OUTPUTTYPE LONG
00014 
00015 /*
00016  * Address bits in a word, and number of output bits from the cache 
00017  */
00018 
00019 #define ADDRESS_BITS 32
00020 #define BITOUT 32
00021 
00022 
00023 /* limits on the various N parameters */
00024 
00025 #define MAXN 32          /* Maximum for Ndwl,Ntwl,Ndbl,Ntbl */
00026 #define MAXSUBARRAYS 32    /* Maximum subarrays for data and tag arrays */
00027 #define MAXSPD 32         /* Maximum for Nspd, Ntspd */
00028 
00029 
00030 
00031 /*
00032  * The following scale factor can be used to scale between technologies.
00033  * To convert from 0.8um to 0.5um, make FUDGEFACTOR = 1.6
00034  */
00035  
00036 #define FEATURESIZE 0.8
00037 
00038 /*===================================================================*/
00039 
00040 /*
00041  * Cache layout parameters and process parameters 
00042  */
00043 
00044 
00045 /*
00046  * CMOS 0.8um model parameters
00047  *   - directly from Appendix II of tech report
00048  */
00049 
00050 /*#define WORDWIRELENGTH (8+2*WIREPITCH*(EXTRAWRITEPORTS)+2*WIREPITCH*(EXTRAREADPORTS))*/
00051 /*#define BITWIRELENGTH (16+2*WIREPITCH*(EXTRAWRITEPORTS+EXTRAREADPORTS))*/
00052 #define WIRESPACING (2*FEATURESIZE)
00053 #define WIREWIDTH (3*FEATURESIZE)
00054 #define WIREPITCH (WIRESPACING+WIREWIDTH)
00055 #define Cmetal 275e-18
00056 #define Rmetal 48e-3
00057 
00058 /* fF/um2 at 1.5V */
00059 #define Cndiffarea    0.137e-15
00060 
00061 /* fF/um2 at 1.5V */
00062 #define Cpdiffarea    0.343e-15
00063 
00064 /* fF/um at 1.5V */
00065 #define Cndiffside    0.275e-15
00066 
00067 /* fF/um at 1.5V */
00068 #define Cpdiffside    0.275e-15
00069 
00070 /* fF/um at 1.5V */
00071 #define Cndiffovlp    0.138e-15
00072 
00073 /* fF/um at 1.5V */
00074 #define Cpdiffovlp    0.138e-15
00075 
00076 /* fF/um assuming 25% Miller effect */
00077 #define Cnoxideovlp   0.263e-15
00078 
00079 /* fF/um assuming 25% Miller effect */
00080 #define Cpoxideovlp   0.338e-15
00081 
00082 /* um */
00083 #define Leff          (0.8)
00084 
00085 /* fF/um2 */
00086 #define Cgate         1.95e-15  
00087 
00088 /* fF/um2 */
00089 #define Cgatepass     1.45e-15  
00090 
00091 /* note that the value of Cgatepass will be different depending on 
00092    whether or not the source and drain are at different potentials or
00093    the same potential.  The two values were averaged */
00094 
00095 /* fF/um */
00096 #define Cpolywire       (0.25e-15)                       
00097 
00098 /* ohms*um of channel width */
00099 #define Rnchannelstatic (25800)
00100 
00101 /* ohms*um of channel width */
00102 #define Rpchannelstatic (61200)
00103 
00104 #define Rnchannelon     (8751)
00105 
00106 #define Rpchannelon     (20160)
00107 
00108 #ifndef Vdd
00109 #define Vdd             5
00110 #endif
00111 /* Threshold voltages (as a proportion of Vdd)
00112    If you don't know them, set all values to 0.5 */
00113 
00114 #define VTHNAND       0.561
00115 #define VTHFA1        0.452
00116 #define VTHFA2        0.304
00117 #define VTHFA3        0.420
00118 #define VTHFA4        0.413
00119 #define VTHFA5        0.405
00120 #define VTHFA6        0.452
00121 #define VSINV         0.452   
00122 #define VTHINV100x60  0.438   /* inverter with p=100,n=60 */
00123 #define VTHINV360x240 0.420   /* inverter with p=360, n=240 */
00124 #define VTHNAND60x90  0.561   /* nand with p=60 and three n=90 */
00125 #define VTHNOR12x4x1  0.503   /* nor with p=12, n=4, 1 input */
00126 #define VTHNOR12x4x2  0.452   /* nor with p=12, n=4, 2 inputs */
00127 #define VTHNOR12x4x3  0.417   /* nor with p=12, n=4, 3 inputs */
00128 #define VTHNOR12x4x4  0.390   /* nor with p=12, n=4, 4 inputs */
00129 #define VTHOUTDRINV    0.437
00130 #define VTHOUTDRNOR   0.379
00131 #define VTHOUTDRNAND  0.63
00132 #define VTHOUTDRIVE   0.425
00133 #define VTHCOMPINV    0.437
00134 #define VTHMUXNAND    0.548
00135 #define VTHMUXDRV1    0.406
00136 #define VTHMUXDRV2    0.334
00137 #define VTHMUXDRV3    0.478
00138 #define VTHEVALINV    0.452
00139 #define VTHSENSEEXTDRV  0.438
00140 
00141 #define VTHNAND60x120 0.522
00142 
00143 /* transistor widths in um (as described in tech report, appendix 1) */
00144 
00145 #define Wdecdrivep      (360.0)
00146 #define Wdecdriven      (240.0)
00147 #define Wdec3to8n     120.0
00148 #define Wdec3to8p     60.0
00149 #define WdecNORn       2.4
00150 #define WdecNORp      12.0
00151 #define Wdecinvn      20.0
00152 #define Wdecinvp      40.0 
00153 #define Wworddrivemax 100.0
00154 #define Wmemcella       (2.4)
00155 #define Wmemcellbscale  2               /* means 2x bigger than Wmemcella */
00156 #define Wbitpreequ      (80.0)
00157 #define Wbitmuxn        (10.0)
00158 #define WsenseQ1to4     (4.0)
00159 #define Wcompinvp1      (10.0)
00160 #define Wcompinvn1      (6.0)
00161 #define Wcompinvp2      (20.0)
00162 #define Wcompinvn2      (12.0)
00163 #define Wcompinvp3      (40.0)
00164 #define Wcompinvn3      (24.0)
00165 #define Wevalinvp       (80.0)
00166 #define Wevalinvn       (40.0)
00167 
00168 #define Wfadriven    (50.0)
00169 #define Wfadrivep    (100.0)
00170 #define Wfadrive2n    (200.0)
00171 #define Wfadrive2p    (400.0)
00172 #define Wfadecdrive1n    (5.0)
00173 #define Wfadecdrive1p    (10.0)
00174 #define Wfadecdrive2n    (20.0)
00175 #define Wfadecdrive2p    (40.0)
00176 #define Wfadecdriven    (50.0)
00177 #define Wfadecdrivep    (100.0)
00178 #define Wfaprechn       (6.0)
00179 #define Wfaprechp       (10.0)
00180 #define Wdummyn         (10.0)
00181 #define Wdummyinvn      (60.0)
00182 #define Wdummyinvp      (80.0)
00183 #define Wfainvn         (10.0)
00184 #define Wfainvp         (20.0)
00185 #define Waddrnandn      (50.0)
00186 #define Waddrnandp      (50.0)
00187 #define Wfanandn        (20.0)
00188 #define Wfanandp        (30.0)
00189 #define Wfanorn         (5.0)
00190 #define Wfanorp         (10.0)
00191 #define Wdecnandn       (10.0)
00192 #define Wdecnandp       (30.0)
00193 
00194 #define Wcompn          (10.0)
00195 #define Wcompp          (30.0)
00196 #define Wmuxdrv12n      (60.0)
00197 #define Wmuxdrv12p      (100.0)
00198 #define WmuxdrvNANDn    (60.0)
00199 #define WmuxdrvNANDp    (80.0)
00200 #define WmuxdrvNORn     (40.0)
00201 #define WmuxdrvNORp     (100.0)
00202 #define Wmuxdrv3n       (80.0)
00203 #define Wmuxdrv3p       (200.0)
00204 #define Woutdrvseln     (24.0)
00205 #define Woutdrvselp     (40.0)
00206 #define Woutdrvnandn    (10.0)
00207 #define Woutdrvnandp    (30.0)
00208 #define Woutdrvnorn     (5.0)
00209 #define Woutdrvnorp     (20.0)
00210 #define Woutdrivern     (48.0)
00211 #define Woutdriverp     (80.0)
00212 
00213 #define Wsenseextdrv1p (80.0)
00214 #define Wsenseextdrv1n (40.0)
00215 #define Wsenseextdrv2p (240.0)
00216 #define Wsenseextdrv2n (160.0)
00217 
00218 /* other stuff (from tech report, appendix 1) */
00219 
00220 #define krise           (0.4e-9)
00221 #define tsensedata      (5.8e-10)
00222 // #define psensedata      (0.025e-9)
00223 #define psensedata      (0.02e-9)
00224 #define tsensescale     0.02e-10
00225 #define tsensetag       (2.6e-10)
00226 // #define psensetag       (0.01e-9)
00227 #define psensetag       (0.016e-9)
00228 #define tfalldata       (7e-10)
00229 #define tfalltag        (7e-10)
00230 #define Vbitpre         (3.3)
00231 #define Vt              (1.09)
00232 #define Vbitsense       (0.10)
00233 
00234 /* bit width of RAM cell in um */
00235 #define BitWidth        (8.0)
00236 
00237 /* bit height of RAM cell in um */
00238 #define BitHeight       (16.0)
00239 
00240 #define Cout            (0.5e-12)
00241 
00242 #define Widthptondiff 4.0
00243 #define Widthtrack    3.2
00244 #define Widthcontact  1.6
00245 #define Wpoly         0.8
00246 #define ptocontact    0.4
00247 #define stitch_ramv   6.0 
00248 #define BitHeight16x2 33.6
00249 #define stitch_ramh   12.0
00250 #define BitWidth16x2  192.8
00251 #define WidthNOR1     11.6
00252 #define WidthNOR2     13.6
00253 #define WidthNOR3     20.8
00254 #define WidthNOR4     28.8
00255 #define WidthNOR5     34.4
00256 #define WidthNOR6     41.6
00257 #define Predec_height1    140.8
00258 #define Predec_width1     270.4
00259 #define Predec_height2    140.8
00260 #define Predec_width2     539.2
00261 #define Predec_height3    281.6    
00262 #define Predec_width3     584.0
00263 #define Predec_height4    281.6
00264 #define Predec_width4     628.8
00265 #define Predec_height5    422.4
00266 #define Predec_width5     673.6
00267 #define Predec_height6    422.4
00268 #define Predec_width6     718.4
00269 #define Wwrite            1.2
00270 #define SenseampHeight    152.0
00271 #define OutdriveHeight    200.0
00272 #define FAOutdriveHeight  229.2
00273 #define FArowWidth        382.8
00274 #define CAM2x2Height_1p   48.8
00275 #define CAM2x2Width_1p    44.8
00276 #define CAM2x2Height_2p   80.8    
00277 #define CAM2x2Width_2p    76.8
00278 #define DatainvHeight     25.6
00279 #define Wbitdropv         30.0
00280 #define decNandWidth      34.4
00281 #define FArowNANDWidth    71.2
00282 #define FArowNOR_INVWidth 28.0  
00283 
00284 #define FAHeightIncrPer_first_rw_or_w_port 16.0
00285 #define FAHeightIncrPer_later_rw_or_w_port 16.0
00286 #define FAHeightIncrPer_first_r_port       12.0
00287 #define FAHeightIncrPer_later_r_port       12.0
00288 #define FAWidthIncrPer_first_rw_or_w_port  16.0 
00289 #define FAWidthIncrPer_later_rw_or_w_port  9.6
00290 #define FAWidthIncrPer_first_r_port        12.0
00291 #define FAWidthIncrPer_later_r_port        9.6
00292 
00293 #define tracks_precharge_p    12
00294 #define tracks_precharge_nx2   5 
00295 #define tracks_outdrvselinv_p  3
00296 #define tracks_outdrvfanand_p  6  
00297 
00298 
00299 /*===================================================================*/
00300 
00301 /*
00302  * The following are things you probably wouldn't want to change.  
00303  */
00304 
00305 
00306 #define TRUE 1
00307 #define FALSE 0
00308 #ifndef NULL
00309 #define NULL 0
00310 #endif
00311 #define OK 1
00312 #define ERROR 0
00313 #define BIGNUM 1e30
00314 #define DIVIDE(a,b) ((b)==0)? 0:(a)/(b)
00315 #define MAX(a,b) (((a)>(b))?(a):(b))
00316 
00317 #define WAVE_PIPE 3
00318 #define MAX_COL_MUX 16
00319 
00320 /* Used to communicate with the horowitz model */
00321 
00322 #define RISE 1
00323 #define FALL 0
00324 #define NCH  1
00325 #define PCH  0
00326 
00327 
00328 /* Used to pass values around the program */
00329 
00330 typedef struct _fu_memory_param_t {
00331         int csize;
00332         int nsets;
00333         int assoc;
00334         int bsize;
00335         int nsbank;
00336         int nwport;
00337         int nrwport;
00338         int nrport;
00339         int nserport;
00340         char fully_assoc;
00341         double fudgefactor;
00342         double tsize;
00343         double opvolt;
00344         double sCeff;
00345 } fu_memory_param_t;
00346 
00347 typedef struct _fu_memory_pif_t {
00348         double access_time,cycle_time;
00349         double senseext_scale;
00350         double total_power;
00351         int best_Ndwl,best_Ndbl;
00352         double max_power, max_access_time;
00353         int best_Nspd;
00354         int best_Ntwl,best_Ntbl;
00355         int best_Ntspd;
00356         int best_muxover;
00357         double total_routing_power;
00358         double total_power_without_routing, total_power_allbanks;
00359         double subbank_address_routing_delay,subbank_address_routing_power;
00360         double decoder_delay_data,decoder_delay_tag;
00361         double decoder_power_data,decoder_power_tag;
00362         double dec_data_driver,dec_data_3to8,dec_data_inv;
00363         double dec_tag_driver,dec_tag_3to8,dec_tag_inv;
00364         double wordline_delay_data,wordline_delay_tag;
00365         double wordline_power_data,wordline_power_tag;
00366         double bitline_delay_data,bitline_delay_tag;
00367         double bitline_power_data,bitline_power_tag;
00368         double sense_amp_delay_data,sense_amp_delay_tag;
00369         double sense_amp_power_data,sense_amp_power_tag;
00370         double total_out_driver_delay_data;
00371         double total_out_driver_power_data;
00372         double compare_part_delay;
00373         double drive_mux_delay;
00374         double selb_delay;
00375         double compare_part_power;
00376         double drive_mux_power;
00377         double selb_power;
00378         double data_output_delay;
00379         double data_output_power;
00380         double drive_valid_delay;
00381         double drive_valid_power;
00382         double precharge_delay;
00383         int data_nor_inputs;
00384         int tag_nor_inputs;
00385 } fu_memory_pif_t;
00386 
00387 typedef struct _fu_memory_aif_t {
00388         fu_area_t dataarray_area,datapredecode_area;
00389         fu_area_t datacolmuxpredecode_area,datacolmuxpostdecode_area;
00390         fu_area_t datawritesig_area;
00391         fu_area_t tagarray_area,tagpredecode_area;
00392         fu_area_t tagcolmuxpredecode_area,tagcolmuxpostdecode_area;
00393         fu_area_t tagoutdrvdecode_area;
00394         fu_area_t tagoutdrvsig_area;
00395         double totalarea;
00396         double total_dataarea;
00397         double total_tagarea;
00398         double max_efficiency, efficiency;
00399         double max_aspect_ratio_total, aspect_ratio_total;
00400 } fu_memory_aif_t;
00401 
00402 extern double Cwordmetal;
00403 extern double Cbitmetal;
00404 extern double Rwordmetal;
00405 extern double Rbitmetal;
00406 extern double FACwordmetal;
00407 extern double FACbitmetal;
00408 extern double FARwordmetal;
00409 extern double FARbitmetal;
00410 
00411 extern int muxover;
00412 
00413 double gatecap(                 /* returns gate capacitance in Farads */
00414         double width,           /* gate width in um (length is Leff) */
00415         double wirelength);     /* poly wire length going to gate in lambda */
00416 
00417 double gatecappass(             /* returns gate capacitance in Farads */
00418         double width,           /* gate width in um (length is Leff) */
00419         double wirelength);     /* poly wire length going to gate in lambda */
00420 
00421 double draincap(                /* returns drain cap in Farads */
00422         double width,           /* um */
00423         int nchannel,           /* whether n or p-channel (boolean) */
00424         int stack);                     /* number of transistors in series that are on */
00425 
00426 double transresswitch(  /* returns resistance in ohms */
00427         double width,           /* um */
00428         int nchannel,           /* whether n or p-channel (boolean) */
00429         int stack);                     /* number of transistors in series */
00430 
00431 double transreson(      /* returns resistance in ohms */
00432         double width,   /* um */
00433         int nchannel,   /* whether n or p-channel (boolean) */
00434         int stack);             /* number of transistors in series */
00435 
00436 double restowidth(      /* returns width in um */
00437         double res,             /* resistance in ohms */
00438         int nchannel);  /* whether N-channel or P-channel */
00439 
00440 double horowitz(
00441         double inputramptime,   /* input rise time */
00442         double tf,                              /* time constant of gate */
00443         double vs1, double vs2, /* threshold voltages */
00444         int rise);                              /* whether INPUT rise or fall (boolean) */
00445 
00446 void subbank_routing_length(
00447         int C, int B, int A, char fullyassoc,
00448         int Ndbl, int Nspd, int Ndwl, int Ntbl, int Ntwl, int Ntspd,
00449         int nsbank, int *subbank_v, int *subbank_h);
00450 
00451 
00452 
00453 
00454 
00455 
00456 extern double area_all_datasubarrays;
00457 extern double area_all_tagsubarrays;
00458 extern double area_all_dataramcells;
00459 extern double area_all_tagramcells;
00460 extern double faarea_all_subarrays ;
00461 
00462 extern double aspect_ratio_data;
00463 extern double aspect_ratio_tag;
00464 extern double aspect_ratio_subbank;
00465 extern double aspect_ratio_total;
00466 
00467 double estimate_area(
00468         fu_area_t module_area, 
00469         double tscaling_factor);
00470 
00471 void estimate_time(
00472         fu_memory_pif_t *result,
00473         fu_memory_aif_t *arearesult,
00474         fu_area_t *arearesult_subbanked,
00475         fu_memory_param_t *parameters);
00476 
00477 fu_area_t inverter_area(
00478         double Widthp, 
00479         double Widthn);
00480 
00481 /* returns area of subarray */
00482 fu_area_t subarraymem_area(
00483         int C, int B, int A, 
00484         int Ndbl, int Ndwl, int Nspd, 
00485         int nrwport, int nrport, int nwport, int nserport, 
00486         double techscaling_factor);
00487 
00488 /* returns area of post decode */ 
00489 fu_area_t decodemem_row(
00490         int C, int B, int A,
00491         int Ndbl, int Nspd, int Ndwl, 
00492         int nrwport, int nrport, int nwport);
00493 
00494 /*returns the area of predecode */
00495 fu_area_t predecode_area(
00496         int noof_rows, 
00497         int nrwport, int nrport, int nwport);
00498 
00499 /* gives the height of the colmux */
00500 fu_area_t colmux(
00501         int Ndbl, int Nspd, 
00502         int nrwport, int nrport, int nwport, int nserport); 
00503 
00504 fu_area_t precharge(
00505         int Ndbl, int Nspd, 
00506         int nrwport, int nrport, int nwport, int nserport);
00507 
00508 void area_subbanked(
00509         int baddr, int b0, 
00510         int nrwport, int nrport, int nwport, 
00511         int Ndbl, int Ndwl, int Nspd, 
00512         int Ntbl, int Ntwl, int Ntspd, 
00513         int nsbank, fu_memory_param_t *parameters, 
00514         fu_area_t *result_subbanked, fu_memory_aif_t *result);
00515 
00516 int organizational_parameters_valid(
00517         int B, int A, int C, 
00518         int Ndwl, int Ndbl, int Nspd, 
00519         int Ntwl, int Ntbl, int Ntspd, char assoc);
00520 
00521 #endif /* ECACTI_H */
00522 

Generated on Fri Oct 22 2010 11:02:19 for SST by  doxygen 1.7.1