Initial version of donated sources by Avertec, 3.4p5.
[tas-yagle.git] / distrib / sources / tas / stm / stm_modscm_good_sign.c
1 /****************************************************************************/
2 /* */
3 /* Chaine de CAO & VLSI AVERTEC */
4 /* */
5 /* Produit : STM Version 1.00 */
6 /* Fichier : stm_modscm_good_sign.c */
7 /* */
8 /* (c) copyright 2000 AVERTEC */
9 /* Tous droits reserves */
10 /* */
11 /* Auteur(s) : Gilles Augustins */
12 /* */
13 /****************************************************************************/
14
15 /****************************************************************************/
16 /* includes */
17 /****************************************************************************/
18
19 #include "stm.h"
20
21 /****************************************************************************/
22 /* functions */
23 /****************************************************************************/
24 #ifdef NEWSIGN
25 float stm_modscm_good_signature (goodparams *params, char *s)
26 {
27 int i, j, index;
28 float sign=0;
29
30 if(params->L0){
31 for (i=0; i<STM_NB_LINK_0_PARAMS; i++)
32 sign+=params->L0[i]*(i+27);
33 }
34 /* links 1 to n - 1 */
35 if(params->LI){
36 sign+=params->LI[STM_NB_I_LINKS]*17;
37 for (i = 0; i < params->LI[STM_NB_I_LINKS]; i++) {
38 index = 1 + STM_NB_LINK_I_PARAMS * i;
39 for (j=0; j<STM_NB_LINK_I_PARAMS; j++)
40 sign+=params->LI[index + j]*(i+j+17);
41 }
42 }
43
44 /* link n */
45 if(params->LN){
46 for (i=0; i<STM_NB_LINK_N_PARAMS; i++)
47 sign+=params->LN[i]*(i+13);
48 }
49
50 /* dual part */
51 for (i=0; i<STM_NB_DUAL_PARAMS; i++)
52 sign+=params->DP[i]*(i+7);
53
54 return sign;
55 }
56 #else
57 void stm_modscm_good_signature (goodparams *params, char *s)
58 {
59 int i;
60 int index;
61 float precision = 0.01;
62
63 sprintf (s + strlen (s), "scmg_");
64
65 /* link 0 */
66 if(params->L0){
67 sprintf (s + strlen (s), "lo_");
68 sprintf (s + strlen (s), "%d_", mbk_float_approx_interval(params->L0[STM_CI_0], precision));
69 sprintf (s + strlen (s), "%.5g_", params->L0[STM_CF_0]);
70 sprintf (s + strlen (s), "%.5g_", params->L0[STM_K3_0]);
71 sprintf (s + strlen (s), "%.5g_", params->L0[STM_K4_0]);
72 sprintf (s + strlen (s), "%.5g_", params->L0[STM_K5_0]);
73 }
74 /* links 1 to n - 1 */
75 if(params->LI){
76 sprintf (s + strlen (s), "lp_");
77 sprintf (s + strlen (s), "%d_", (int)params->LI[STM_NB_I_LINKS]);
78 for (i = 0; i < params->LI[STM_NB_I_LINKS]; i++) {
79 index = 1 + STM_NB_LINK_I_PARAMS * i;
80 sprintf (s + strlen (s), "%d_", mbk_float_approx_interval(params->LI[index + STM_CI_I], precision));
81 sprintf (s + strlen (s), "%.5g_", params->LI[index + STM_CF_I]);
82 sprintf (s + strlen (s), "%d_", mbk_float_approx_interval(params->LI[index + STM_ACTI_I], precision));
83 sprintf (s + strlen (s), "%d_", mbk_float_approx_interval(params->LI[index + STM_BCTI_I], precision));
84 sprintf (s + strlen (s), "%.5g_", params->LI[index + STM_K3_I]);
85 sprintf (s + strlen (s), "%.5g_", params->LI[index + STM_K4_I]);
86 sprintf (s + strlen (s), "%.5g_", params->LI[index + STM_K5_I]);
87 }
88 }
89
90 /* link n */
91 if(params->LN){
92 sprintf (s + strlen (s), "ld_");
93 sprintf (s + strlen (s), "%d_", mbk_float_approx_interval(params->LN[STM_CI_N], precision));
94 sprintf (s + strlen (s), "%.5g_", params->LN[STM_CF_N]);
95 sprintf (s + strlen (s), "%d_", mbk_float_approx_interval(params->LN[STM_ACTI_N], precision));
96 sprintf (s + strlen (s), "%d_", mbk_float_approx_interval(params->LN[STM_BCTI_N], precision));
97 }
98 /* dual part */
99 sprintf (s + strlen (s), "d_");
100 sprintf (s + strlen (s), "%d_", mbk_float_approx_interval(params->DP[STM_PCONF0], precision));
101 sprintf (s + strlen (s), "%d_", mbk_float_approx_interval(params->DP[STM_PCONF1], precision));
102 sprintf (s + strlen (s), "%d_", mbk_float_approx_interval(params->DP[STM_CAPAI], precision));
103 sprintf (s + strlen (s), "%.5g_", params->DP[STM_IRAP]);
104 sprintf (s + strlen (s), "%.5g_", params->DP[STM_VDDIN]);
105 sprintf (s + strlen (s), "%.5g_", params->DP[STM_VT]);
106 sprintf (s + strlen (s), "%.5g_", params->DP[STM_THRESHOLD]);
107 sprintf (s + strlen (s), "%.5g_", params->DP[STM_IMAX]);
108 sprintf (s + strlen (s), "%.5g_", params->DP[STM_AN]);
109 sprintf (s + strlen (s), "%.5g_", params->DP[STM_BN]);
110 sprintf (s + strlen (s), "%.5g_", params->DP[STM_VDDMAX]);
111 sprintf (s + strlen (s), "%.5g_", params->DP[STM_RSAT]);
112 sprintf (s + strlen (s), "%.5g_", params->DP[STM_RLIN]);
113 sprintf (s + strlen (s), "%d_", mbk_float_approx_interval(params->DP[STM_DRC], precision));
114 sprintf (s + strlen (s), "%.5g_", params->DP[STM_RBR]);
115 sprintf (s + strlen (s), "%d_", mbk_float_approx_interval(params->DP[STM_CBR], precision));
116 sprintf (s + strlen (s), "%.5g", params->DP[STM_INPUT_THR]);
117 }
118 #endif
119 /****************************************************************************/
120
121 void stm_modscm_good_change_params (goodparams *params)
122 {
123 int i, j;
124 int index;
125 float precision = 0.01;
126
127 #ifdef NEWSIGN
128 /* link 0 */
129 if(params->L0){
130 for (i=0; i<STM_NB_LINK_0_PARAMS; i++)
131 params->L0[i] = mbk_rounddouble(params->L0[i], STM_NEWSIGN_ROUND_PRECISION);
132 }
133 /* links 1 to n - 1 */
134 if(params->LI){
135 for (i = 0; i < params->LI[STM_NB_I_LINKS]; i++) {
136 index = 1 + STM_NB_LINK_I_PARAMS * i;
137 for (j=0; j<STM_NB_LINK_I_PARAMS; j++)
138 params->LI[index + j] = mbk_rounddouble(params->LI[index + j], STM_NEWSIGN_ROUND_PRECISION);
139 }
140 }
141
142 /* link n */
143 if(params->LN){
144 for (i=0; i<STM_NB_LINK_N_PARAMS; i++)
145 params->LN[i] = mbk_rounddouble(params->LN[i], STM_NEWSIGN_ROUND_PRECISION);
146 }
147
148 /* dual part */
149 for (i=0; i<STM_NB_DUAL_PARAMS; i++)
150 params->DP[i] = mbk_rounddouble(params->DP[i], STM_NEWSIGN_ROUND_PRECISION);
151 #else
152 /* link 0 */
153 if(params->L0){
154 params->L0[STM_CI_0] = mbk_float_approx_middle(params->L0[STM_CI_0], precision);
155 }
156 /* links 1 to n - 1 */
157 if(params->LI){
158 params->LI[STM_NB_I_LINKS] = mbk_float_approx_middle(params->LI[STM_NB_I_LINKS], precision);
159 for (i = 0; i < params->LI[STM_NB_I_LINKS]; i++) {
160 index = 1 + STM_NB_LINK_I_PARAMS * i;
161 params->LI[index + STM_CI_I] = mbk_float_approx_middle(params->LI[index + STM_CI_I], precision);
162 params->LI[index + STM_ACTI_I] = mbk_float_approx_middle(params->LI[index + STM_ACTI_I], precision);
163 params->LI[index + STM_BCTI_I] = mbk_float_approx_middle(params->LI[index + STM_BCTI_I], precision);
164 }
165 }
166
167 /* link n */
168 if(params->LN){
169 params->LN[STM_CI_N] = mbk_float_approx_middle(params->LN[STM_CI_N], precision);
170 params->LN[STM_ACTI_N] = mbk_float_approx_middle(params->LN[STM_ACTI_N], precision);
171 params->LN[STM_BCTI_N] = mbk_float_approx_middle(params->LN[STM_BCTI_N], precision);
172 }
173 /* dual part */
174 params->DP[STM_PCONF0] = mbk_float_approx_middle(params->DP[STM_PCONF0], precision);
175 params->DP[STM_PCONF1] = mbk_float_approx_middle(params->DP[STM_PCONF1], precision);
176 params->DP[STM_CAPAI] = mbk_float_approx_middle(params->DP[STM_CAPAI], precision);
177 params->DP[STM_DRC] = mbk_float_approx_middle(params->DP[STM_DRC], precision);
178 params->DP[STM_CBR] = mbk_float_approx_middle(params->DP[STM_CBR], precision);
179 #endif
180 }
181
182 #ifdef NEWSIGN
183 int stm_modscm_good_same_params (goodparams *params0, goodparams *params1)
184 {
185 if ((params0->L0==NULL || params1->L0==NULL) && params0->L0!=params1->L0) return 0;
186 if (params0->L0!=NULL && memcmp(params0->L0, params1->L0, STM_NB_LINK_0_PARAMS * sizeof (float))!=0) return 0;
187 if ((params0->LI==NULL || params1->LI==NULL) && params0->LI!=params1->LI) return 0;
188 if (params0->LI!=NULL && params0->LI[STM_NB_I_LINKS]!=params1->LI[STM_NB_I_LINKS]) return 0;
189 if (params0->LI!=NULL && memcmp(params0->LI, params1->LI, (1 + params0->LI[STM_NB_I_LINKS] * STM_NB_LINK_I_PARAMS))!=0) return 0;
190 if ((params0->LN==NULL || params1->LN==NULL) && params0->LN!=params1->LN) return 0;
191 if (params0->LN!=NULL && memcmp(params0->LN, params1->LN, STM_NB_LINK_N_PARAMS * sizeof (float))!=0) return 0;
192 return memcmp(params0->DP, params1->DP, STM_NB_DUAL_PARAMS * sizeof (float))==0;
193 }
194 #endif
195