1 /****************************************************************************/
3 /* Chaine de CAO & VLSI AVERTEC */
5 /* Produit : STM Version 1.00 */
6 /* Fichier : stm_solver.c */
8 /* (c) copyright 2000 AVERTEC */
9 /* Tous droits reserves */
11 /* Auteur(s) : Grégoire Avot */
13 /****************************************************************************/
15 /****************************************************************************/
17 /****************************************************************************/
25 /******************************************************************************\
27 \******************************************************************************/
30 /******************************************************************************\
31 Insert a current in table
32 \******************************************************************************/
34 void stm_modiv_setis( timing_iv
*iv
, int ne
, int ns
, float is
)
36 iv
->IS
[ ne
+ ( ns
* iv
->NVE
) ] = is
;
39 /******************************************************************************\
40 Get a current in table
41 \******************************************************************************/
43 float stm_modiv_getis( timing_iv
*iv
, int ne
, int ns
)
45 return iv
->IS
[ ne
+ ( ns
* iv
->NVE
) ];
48 /******************************************************************************\
50 \******************************************************************************/
52 timing_iv
* stm_modiv_create( int nve
,
56 char (*fnct
)( void *data
, float ve
, float vs
, float* ),
66 iv
= stm_modiv_alloc( nve
, nvs
);
68 for( ne
=0 ; ne
<nve
; ne
++ )
69 iv
->VE
[ne
] = ((float)ne
) * vemax
/ ((float)(nve
-1));
71 for( ns
=0 ; ns
<nvs
; ns
++ )
72 iv
->VS
[ns
] = ((float)ns
) * vsmax
/ ((float)(nvs
-1));
75 for( ne
=0 ; ne
<nve
; ne
++ ) {
76 for( ns
=0 ; ns
<nvs
; ns
++ ) {
77 r
= fnct( data
, iv
->VE
[ne
], iv
->VS
[ns
] , &is
) ;
83 stm_modiv_destroy( iv
);
86 stm_modiv_setis( iv
, ne
, ns
, is
);
94 /******************************************************************************\
96 \******************************************************************************/
98 timing_iv
* stm_modiv_duplicate( timing_iv
*orig
)
104 iv
= stm_modiv_alloc( orig
->NVE
, orig
->NVS
);
106 for( ne
=0 ; ne
<orig
->NVE
; ne
++ )
107 iv
->VE
[ne
] = orig
->VE
[ne
];
109 for( ns
=0 ; ns
<orig
->NVS
; ns
++ )
110 iv
->VS
[ns
] = orig
->VS
[ns
];
112 for( ne
=0 ; ne
<orig
->NVE
; ne
++ ) {
113 for( ns
=0 ; ns
<orig
->NVS
; ns
++ ) {
114 stm_modiv_setis( iv
, ne
, ns
, stm_modiv_getis( orig
, ne
, ns
) );
118 iv
->IV_CONF
.PCONF0
= orig
->IV_CONF
.PCONF0
;
119 iv
->IV_CONF
.PCONF1
= orig
->IV_CONF
.PCONF1
;
120 iv
->IV_CONF
.IRAP
= orig
->IV_CONF
.IRAP
;
121 iv
->IV_CONF
.CI
= orig
->IV_CONF
.CI
;
122 iv
->IV_INPUT
.VI
= orig
->IV_INPUT
.VI
;
123 iv
->IV_INPUT
.VF
= orig
->IV_INPUT
.VF
;
124 iv
->IV_INPUT
.VTH
= orig
->IV_INPUT
.VTH
;
125 iv
->IV_INIT
.VI
= orig
->IV_INIT
.VI
;
129 /******************************************************************************\
131 \******************************************************************************/
133 timing_iv
* stm_modiv_alloc( int nve
, int nvs
)
139 iv
= (timing_iv
*)mbkalloc( sizeof( timing_iv
) );
144 iv
->VE
= (float*)mbkalloc( sizeof( float ) * nve
);
145 iv
->VS
= (float*)mbkalloc( sizeof( float ) * nvs
);
146 iv
->IS
= (float*)mbkalloc( sizeof( float ) * nve
* nve
);
148 iv
->IV_CONF
.PCONF0
= 0.0;
149 iv
->IV_CONF
.PCONF1
= 0.0;
150 iv
->IV_CONF
.IRAP
= 0.0;
151 iv
->IV_CONF
.CI
= 0.0;
152 iv
->IV_INPUT
.VI
= 0.0;
153 iv
->IV_INPUT
.VF
= 0.0;
154 iv
->IV_INPUT
.VTH
= 0.0;
156 for( ne
=0 ; ne
<nve
; ne
++ )
159 for( ns
=0 ; ns
<nvs
; ns
++ )
162 for( ne
=0 ; ne
<nve
; ne
++ ) {
163 for( ns
=0 ; ns
<nvs
; ns
++ ) {
164 stm_modiv_setis( iv
, ne
, ns
, 0.0 );
171 /******************************************************************************\
173 \******************************************************************************/
175 void stm_modiv_destroy( timing_iv
*iv
)
183 /******************************************************************************\
184 Parameter to evaluate conflict capacitance
185 \******************************************************************************/
187 void stm_modiv_set_cf( timing_iv
*iv
,
195 iv
->IV_CONF
.PCONF0
= p0
;
196 iv
->IV_CONF
.PCONF1
= p1
;
197 iv
->IV_CONF
.IRAP
= irap
;
200 /******************************************************************************\
201 Parameter to evaluate input slope
202 \******************************************************************************/
204 void stm_modiv_set_in( timing_iv
*iv
,
211 iv
->IV_INPUT
.VI
= vi
;
212 iv
->IV_INPUT
.VF
= vf
;
213 iv
->IV_INPUT
.VTH
= vth
;
214 iv
->IV_INPUT
.VT
= vt
;
217 float stm_modiv_in_vi( timing_iv
*iv
)
219 return iv
->IV_INPUT
.VI
;
222 float stm_modiv_in_vf( timing_iv
*iv
)
224 return iv
->IV_INPUT
.VF
;
227 float stm_modiv_in_vth( timing_iv
*iv
)
229 return iv
->IV_INPUT
.VTH
;
232 float stm_modiv_in_vt( timing_iv
*iv
)
234 return iv
->IV_INPUT
.VT
;
237 /******************************************************************************\
238 Parameter to evaluate initial state
239 \******************************************************************************/
241 void stm_modiv_set_ti( timing_iv
*iv
, float vi
)
246 float stm_modiv_ti_vi( timing_iv
*iv
)
248 return iv
->IV_INIT
.VI
;