Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
uvahotspot
GitHub Repository: uvahotspot/HotSpot
Path: blob/master/wire.h
612 views
1
#ifndef __WIRE_H
2
#define __WIRE_H
3
4
#include "flp.h"
5
#include "math.h"
6
7
/*
8
* a simple wire-delay model based on
9
*
10
* 1) Equations 1-3 of the following paper:
11
* R. H. J. M. Otten and R. K. Brayton, "Planning for
12
* performance," in DAC '98: Proceedings of the 35th annual
13
* conference on Design automation, pp. 122--127, 1998.
14
*
15
* and
16
*
17
* 2) Equations 30-33 of the following paper:
18
* K. Banerjee and A. Mehrotra, "Global (interconnect)
19
* warming," IEEE Circuits and Devices Magazine, vol. 17,
20
* pp. 16--32, September 2001. The lcrit and sopt values
21
* for the global metal layers defined below are taken from
22
* Table 4 of this paper.
23
*
24
* The resistance and capacitance values of wires per unit
25
* length defined below (WIRE_R*, WIRE_C*) are taken from
26
* Table 2 of the following paper:
27
*
28
* V. Agarwal, S. W. Keckler, and D. Burger, "The effect
29
* of technology scaling on microarchitectural structures,"
30
* Tech. Rep. TR-00-02, University of Texas at Austin Computer
31
* Sciences, May 2001.
32
*/
33
34
/* we are modeling a 130 nm wire */
35
#define TECHNODE130
36
37
/* metal layer */
38
#define WIRE_GLOBAL 0
39
#define WIRE_INTER 1
40
41
/*
42
* constants dependent on the swing assumptions of the
43
* repeaters inserted. usually, a 50% swing is assumed.
44
* in such a case, a = 0.4, b = 0.7
45
*/
46
#define WIRE_A 0.4
47
#define WIRE_B 0.7
48
49
/*
50
* *_G are values for global metal while *_I are
51
* for intermediate metal layers respectively.
52
* The units used are listed below:
53
* WIRE_R_* - mohm/u
54
* WIRE_C_* - fF/u
55
* WIRE_LCRIT_* - mm
56
* WIRE_SOPT_* - dimensionless
57
*/
58
#if defined(TECHNODE180)
59
#define WIRE_R_G 36.0
60
#define WIRE_C_G 0.350
61
#define WIRE_R_I 107.0
62
#define WIRE_C_I 0.333
63
#define WIRE_LCRIT_G 3.0
64
#define WIRE_SOPT_G 179.0
65
#elif defined(TECHNODE130)
66
#define WIRE_R_G 61.0
67
#define WIRE_C_G 0.359
68
#define WIRE_R_I 188.0
69
#define WIRE_C_I 0.336
70
#define WIRE_LCRIT_G 2.4
71
#define WIRE_SOPT_G 146.0
72
#elif defined(TECHNODE100)
73
#define WIRE_R_G 103.0
74
#define WIRE_C_G 0.361
75
#define WIRE_R_I 316.0
76
#define WIRE_C_I 0.332
77
#define WIRE_LCRIT_G 2.12
78
#define WIRE_SOPT_G 96.0
79
#elif defined(TECHNODE70)
80
#define WIRE_R_G 164.0
81
#define WIRE_C_G 0.360
82
#define WIRE_R_I 500.0
83
#define WIRE_C_I 0.331
84
#define WIRE_LCRIT_G 1.2
85
#define WIRE_SOPT_G 82.0
86
#elif defined(TECHNODE50)
87
#define WIRE_R_G 321.0
88
#define WIRE_C_G 0.358
89
#define WIRE_R_I 1020.0
90
#define WIRE_C_I 0.341
91
#define WIRE_LCRIT_G 0.99
92
#define WIRE_SOPT_G 48.0
93
#endif
94
95
/*
96
* lcrit and sopt values for intermediate layer
97
* are derived from the values for global layer.
98
* lcrit * sqrt(wire_r * wire_c) is a constant
99
* for a given layer. So is the expression
100
* sopt * sqrt(wire_r / wire_c) (Equation 2 and
101
* Theorem 2 from Brayton et. al). Using this
102
* for the global layer, one can find the constants
103
* for the intermediate layer and combining this
104
* with the wire_r and wire_c values for the
105
* intermediate layer, its lcrit and sopt values
106
* can be calculated.
107
*/
108
#define WIRE_LCRIT_I (WIRE_LCRIT_G * \
109
sqrt((WIRE_R_G / WIRE_R_I) * (WIRE_C_G / WIRE_C_I)))
110
#define WIRE_SOPT_I (WIRE_SOPT_G * \
111
sqrt((WIRE_R_G / WIRE_R_I) / (WIRE_C_G / WIRE_C_I)))
112
113
/*
114
* delay (in secs) per meter of a wire using
115
* Equation 2 and Theorem 2 of Brayton et al.
116
* the following expression is derived by
117
* setting cp = co in the delay equation and
118
* substituting for sqrt(ro*co) in the same
119
* from Equation 2. The 1.0e-9 is added to take
120
* care of the units
121
*/
122
#define WIRE_DELAY_G (WIRE_LCRIT_G * WIRE_R_G * WIRE_C_G * 1.0e-9 * \
123
(2.0 * WIRE_A + sqrt (2.0 * WIRE_A * WIRE_B)))
124
#define WIRE_DELAY_I (WIRE_LCRIT_I * WIRE_R_I * WIRE_C_I * 1.0e-9 * \
125
(2.0 * WIRE_A + sqrt (2.0 * WIRE_A * WIRE_B)))
126
127
/* function for wire-length to wire-delay conversion */
128
double wire_length2delay(double length, int layer);
129
130
#endif
131
132