Initial version of donated sources by Avertec, 3.4p5.
[tas-yagle.git] / distrib / sources / tas / stm / stm_energy_table.c
1 /****************************************************************************/
2 /* */
3 /* Chaine de CAO & VLSI AVERTEC */
4 /* */
5 /* Produit : STM Version 1.00 */
6 /* Fichier : stm_energy_table.c */
7 /* */
8 /* (c) copyright 2000 AVERTEC */
9 /* Tous droits reserves */
10 /* */
11 /* Auteur(s) : Caroline BLED */
12 /* */
13 /****************************************************************************/
14
15 /****************************************************************************/
16 /* includes */
17 /****************************************************************************/
18
19 #include "stm.h"
20
21 /****************************************************************************/
22 /* functions */
23 /****************************************************************************/
24
25 void stm_energy_table_destroy (timing_table *table)
26 {
27 stm_modtbl_destroy (table);
28 }
29
30 timing_table *stm_energy_table_duplicate (timing_table *table)
31 {
32 return (stm_modtbl_duplicate (table));
33 }
34
35 float stm_energy_table_eval (timing_table *etable, float load, float slew)
36 {
37 float energy;
38
39 if (!etable) {
40 return 0;
41 }
42
43 if (etable->SET2D) {
44 if (etable->XTYPE == STM_LOAD && etable->YTYPE == STM_INPUT_SLEW)
45 energy = stm_modtbl_interpol2Dbilinear (etable, load, slew);
46 if (etable->XTYPE == STM_INPUT_SLEW && etable->YTYPE == STM_LOAD)
47 energy = stm_modtbl_interpol2Dbilinear (etable, slew, load);
48 }
49 else
50 if (etable->SET1D) {
51 if (etable->XTYPE == STM_LOAD)
52 energy = stm_modtbl_interpol1Dlinear (etable, load);
53 if (etable->XTYPE == STM_INPUT_SLEW)
54 energy = stm_modtbl_interpol1Dlinear (etable, slew);
55 }
56 if (!stm_modtbl_isnull (etable->CST))
57 energy = etable->CST;
58
59 return energy;
60 }
61
62
63 void stm_energy_table_morph2_energy_fparams (timing_model *model, double *s_axis, int ns, double *l_axis, int nl, double slew, double load, double ci0)
64 {
65 if (model) {
66 if (ns && nl)
67 stm_energy_table_morph2_energy2D_fparams (model, s_axis, ns, l_axis, nl, ci0);
68 else if (!ns && nl)
69 stm_energy_table_morph2_energy1Dslewfix_fparams (model, l_axis, nl, slew, ci0);
70 else if (ns && !nl)
71 stm_energy_table_morph2_energy1Dloadfix_fparams (model, s_axis, ns, load + ci0);
72 }
73 }
74
75 void stm_energy_table_morph2_energy2D_fparams (timing_model *model, double *s_axis, int ns, double *l_axis, int nl, double ci0)
76 {
77 timing_table *tbl;
78
79 tbl = stm_energy_table_create_energy2D_fparams (model->ENERGYMODEL.EPARAMS, s_axis, ns, l_axis, nl, ci0, model->VDD);
80 if (tbl) {
81 stm_energy_destroy (model);
82 model->ENERGYTYPE = STM_ENERGY_TABLE;
83 model->ENERGYMODEL.ETABLE = tbl;
84 }
85 }
86
87 void stm_energy_table_morph2_energy1Dslewfix_fparams (timing_model *model, double *l_axis, int nl, double slew, double ci0)
88 {
89 timing_table *tbl;
90
91 tbl = stm_energy_table_create_energy1Dslewfix_fparams (model->ENERGYMODEL.EPARAMS, l_axis, nl, slew, ci0, model->VDD);
92 if (tbl)
93 {
94 stm_energy_destroy (model);
95 model->ENERGYTYPE = STM_ENERGY_TABLE;
96 model->ENERGYMODEL.ETABLE = tbl;
97 }
98 }
99
100 void stm_energy_table_morph2_energy1Dloadfix_fparams (timing_model *model, double *s_axis, int ns, double load)
101 {
102 timing_table *tbl;
103
104 tbl = stm_energy_table_create_energy1Dloadfix_fparams (model->ENERGYMODEL.EPARAMS, s_axis, ns, load, model->VDD);
105 if (tbl)
106 {
107 stm_energy_destroy (model);
108 model->ENERGYTYPE = STM_ENERGY_TABLE;
109 model->ENERGYMODEL.ETABLE = tbl;
110 }
111
112
113 }
114
115 timing_table *stm_energy_table_create_energy2D_fparams (energyparams *eparams, double *s_axis, int ns, double *l_axis, int nl, double ci0, float vdd)
116 {
117 int x, y;
118 timing_table *tbl;
119
120 tbl = stm_modtbl_create (ns, nl, STM_INPUT_SLEW, STM_LOAD);
121
122 /* axis */
123 if (nl)
124 for (x = 0; x < ns; x++)
125 stm_modtbl_setXrangeval (tbl, x, s_axis[x]);
126 if (ns)
127 for (y = 0; y < nl; y++)
128 stm_modtbl_setYrangeval (tbl, y, l_axis[y]);
129
130 /* values */
131 if (nl && ns)
132 for (x = 0; x < ns; x++)
133 for (y = 0; y < nl; y++)
134 stm_modtbl_set2Dval (tbl, x, y, stm_energy_params_eval (eparams, l_axis[y] + ci0, s_axis[x], vdd));
135
136 return tbl;
137 }
138
139
140 timing_table *stm_energy_table_create_energy1Dslewfix_fparams (energyparams *eparams, double *l_axis, int nl, double slew, double ci0, float vdd)
141 {
142 int x;
143 timing_table *tbl;
144
145 tbl = stm_modtbl_create (nl, 0, STM_LOAD, STM_NOTYPE);
146
147 /* axis */
148 if (nl)
149 for (x = 0; x < nl; x++)
150 stm_modtbl_setXrangeval (tbl, x, l_axis[x]);
151
152 /* values */
153 if (nl)
154 for (x = 0; x < nl; x++)
155 stm_modtbl_set1Dval (tbl, x, stm_energy_params_eval (eparams, l_axis[x] + ci0, slew, vdd));
156
157 return tbl;
158 }
159
160 timing_table *stm_energy_table_create_energy1Dloadfix_fparams (energyparams *eparams, double *s_axis, int ns, double load, float vdd)
161 {
162 int x;
163 timing_table *tbl;
164
165 tbl = stm_modtbl_create (ns, 0, STM_INPUT_SLEW, STM_NOTYPE);
166
167 /* axis */
168 if (ns)
169 for (x = 0; x < ns; x++)
170 stm_modtbl_setXrangeval (tbl, x, s_axis[x]);
171
172 /* values */
173 if (ns)
174 for (x = 0; x < ns; x++)
175 stm_modtbl_set1Dval (tbl, x, stm_energy_params_eval (eparams, load, s_axis[x], vdd));
176
177 return tbl;
178 }