1 /****************************************************************************/
3 /* Chaine de CAO & VLSI AVERTEC */
5 /* Produit : STM Version 1.00 */
6 /* Fichier : stm_modscm_good_sign.c */
8 /* (c) copyright 2000 AVERTEC */
9 /* Tous droits reserves */
11 /* Auteur(s) : Gilles Augustins */
13 /****************************************************************************/
15 /****************************************************************************/
17 /****************************************************************************/
21 /****************************************************************************/
23 /****************************************************************************/
25 float stm_modscm_good_signature (goodparams
*params
, char *s
)
31 for (i
=0; i
<STM_NB_LINK_0_PARAMS
; i
++)
32 sign
+=params
->L0
[i
]*(i
+27);
34 /* links 1 to n - 1 */
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);
46 for (i
=0; i
<STM_NB_LINK_N_PARAMS
; i
++)
47 sign
+=params
->LN
[i
]*(i
+13);
51 for (i
=0; i
<STM_NB_DUAL_PARAMS
; i
++)
52 sign
+=params
->DP
[i
]*(i
+7);
57 void stm_modscm_good_signature (goodparams
*params
, char *s
)
61 float precision
= 0.01;
63 sprintf (s
+ strlen (s
), "scmg_");
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
]);
74 /* links 1 to n - 1 */
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
]);
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
));
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
]);
119 /****************************************************************************/
121 void stm_modscm_good_change_params (goodparams
*params
)
125 float precision
= 0.01;
130 for (i
=0; i
<STM_NB_LINK_0_PARAMS
; i
++)
131 params
->L0
[i
] = mbk_rounddouble(params
->L0
[i
], STM_NEWSIGN_ROUND_PRECISION
);
133 /* links 1 to n - 1 */
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
);
144 for (i
=0; i
<STM_NB_LINK_N_PARAMS
; i
++)
145 params
->LN
[i
] = mbk_rounddouble(params
->LN
[i
], STM_NEWSIGN_ROUND_PRECISION
);
149 for (i
=0; i
<STM_NB_DUAL_PARAMS
; i
++)
150 params
->DP
[i
] = mbk_rounddouble(params
->DP
[i
], STM_NEWSIGN_ROUND_PRECISION
);
154 params
->L0
[STM_CI_0
] = mbk_float_approx_middle(params
->L0
[STM_CI_0
], precision
);
156 /* links 1 to n - 1 */
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
);
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
);
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
);
183 int stm_modscm_good_same_params (goodparams
*params0
, goodparams
*params1
)
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;