Initial version of donated sources by Avertec, 3.4p5.
[tas-yagle.git] / distrib / sources / tas / trc / trc_awe.h
1 /****************************************************************************/
2 /* */
3 /* Chaine de CAO & VLSI Alliance */
4 /* */
5 /* Produit : TRC Version 1.01 */
6 /* Fichier : trc101.h */
7 /* */
8 /* (c) copyright 1997-1998 Laboratoire LIP6 equipe ASIM */
9 /* Tous droits reserves */
10 /* Support : e-mail alliance-support@asim.lip6.fr */
11 /* */
12 /* Auteur(s) : Gregoire AVOT */
13 /* */
14 /****************************************************************************/
15
16 extern int AWECACHE ;
17 // Lorsque cette variable est à 1, le cache est actif.
18
19 extern char RCX_AWESTRAIGHT;
20 extern char RCX_STEPTANH;
21 extern char RCX_USING_AWEMATRIX;
22 extern char RCX_AWE_ONE_PNODE;
23 extern char *RCX_PLOT_AWE;
24 extern char AWE_FAST_MODE ;
25
26 #define RCX_USING_AWEMATRIX_IFNEED 'i'
27 #define RCX_USING_AWEMATRIX_NEVER 'n'
28 #define RCX_USING_AWEMATRIX_ALWAYS 'a'
29 #define RCX_USING_AWEMATRIX_FORCE 'f'
30
31 typedef struct {
32 RCXFLOAT extcapa ;
33 rcx_slope *slope ;
34 char type ;
35 RCXFLOAT coefctc ;
36 char reset ;
37 }
38 awetreetrip ;
39
40 typedef struct {
41 RCXFLOAT k ;
42 RCXFLOAT extcapa ;
43 int ordre ;
44 }
45 aweinfmmt;
46
47 extern losig_list *AWE_DEBUG_NET ;
48 extern locon_list *AWE_DEBUG_DRIVER ;
49 extern locon_list *AWE_DEBUG_RECEIVER ;
50
51 /* Ordre d'évalutation par défaut pour AWE */
52 #define AWE_MAX_ORDER 3
53 #define AWE_MAX_MOMENT 5
54
55 /* ptype dans les lonodes */
56 #define AWENODE 0x30000000
57
58 /* ptype dans les losig */
59 #define AWEINFO 0x30000001
60 #define AWEUPMAXINFO 0x30000002
61 #define AWEUPMININFO 0x30000003
62 #define AWEDWMAXINFO 0x30000004
63 #define AWEDWMININFO 0x30000005
64
65 /* Information ajoutée dans les losig, accessible par le ptype AWEINFO */
66
67 typedef struct sawefiltre {
68 RCXFLOAT POLE[AWE_MAX_ORDER] ;
69 RCXFLOAT RESIDU[AWE_MAX_ORDER] ;
70 int ORDER;
71 } awefiltre;
72
73 typedef struct aweinfo {
74 struct aweinfo *NEXT;
75 locon_list *LOCON_DRIVER;
76 long NODE_DRIVER;
77 locon_list *LOCON_LOAD;
78 long NODE_LOAD;
79 RCXFLOAT K;
80 unsigned char FLAG;
81 union {
82 RCXFLOAT MOMENT[AWE_MAX_MOMENT];
83 awefiltre FILTER;
84 } DATA;
85 RCXFLOAT EXTCAPA;
86 } aweinfo_list;
87
88 typedef struct {
89 aweinfo_list *HEAD ;
90 ht *HT ;
91 int NB ;
92 } awecache ;
93
94 typedef struct {
95 double F;
96 double VMAX;
97 double VT;
98 double A;
99 double TR;
100 double RLIN;
101 double VSAT;
102 double TSAT;
103 double P1;
104 double P2;
105 double C1;
106 double C2;
107 double R;
108 double RL;
109 double V10;
110 double V20;
111 } awe_tanh_data;
112
113 /* Valeur pour le champ FLAG de la structure aweinfo */
114 #define AWE_FLAGVALID ((unsigned char)(0x80))
115 #define AWE_FLAGERROR ((unsigned char)(0x40))
116
117 //FLAGVALID :
118 #define AWE_FLAGNODELAY ((unsigned char)(0x03))
119 #define AWE_FLAGFILTER ((unsigned char)(0x02))
120 #define AWE_FLAGMOMENT ((unsigned char)(0x01))
121
122 //FLAGERROR :
123 #define AWE_FLAGALLORDERFAILED ((unsigned char)(0x01))
124
125 #define AWE_MOMENT ( AWE_FLAGVALID | AWE_FLAGMOMENT )
126 #define AWE_FILTER ( AWE_FLAGVALID | AWE_FLAGFILTER )
127 #define AWE_NODELAY ( AWE_FLAGVALID | AWE_FLAGNODELAY )
128 #define AWE_ERROR ( AWE_FLAGERROR )
129
130 #define AWESIZEINFO 16
131
132 /* Information ajoutée dans les noeuds des réseaux RC */
133
134 typedef struct sawetabnode {
135 RCXFLOAT CAPA ;
136 RCXFLOAT SUMMOMENTCAPA;
137 RCXFLOAT MOMENT[ AWE_MAX_MOMENT ];
138 } awetabnode ;
139
140 typedef union uawetabnode_list {
141 awetabnode TABNODE;
142 union uawetabnode_list *NEXT;
143 } awetabnode_list ;
144
145 typedef struct {
146 aweinfo_list *AWE ;
147 mbk_laplace *LAPLACE ;
148 float VMAX ;
149 } awefilter ;
150
151 /* ptype temporaire dans les wires pour la fonction rcx_is_multiple_pnode() */
152 #define AWESUMRESI 0x5243581F
153
154
155 #define AWESIZETABNODE 200 // Taille d'un bloc alloué
156
157 // Mémoire pour le calcul des moments. Allocation par bloc, sans libération
158 // (pas de free)
159 awetabnode* aweallocnodes( void );
160 void aweunallocnodes( awetabnode* );
161 void awecleannodes( losig_list*, lonode_list* );
162 void awebuildnodes( losig_list *losig,
163 lonode_list *node,
164 RCXFLOAT extcapa,
165 rcx_slope *slopemiller,
166 char type,
167 RCXFLOAT coefctc,
168 char reset
169 );
170 void build_awe_moment_without_loop( losig_list *losig,
171 locon_list *driver,
172 RCXFLOAT extcapa,
173 rcx_slope *slopemiller,
174 char type,
175 RCXFLOAT coefctc
176 );
177 void build_awe_moment_with_loop( losig_list *losig,
178 locon_list *driver,
179 RCXFLOAT extcapa,
180 rcx_slope *slopemiller,
181 char type,
182 RCXFLOAT coefctc
183 );
184
185 // Calcul des moments.
186 void awemoment( losig_list*,
187 lonode_list*,
188 int,
189 RCXFLOAT,
190 RCXFLOAT
191 );
192 RCXFLOAT awedownstream( losig_list *, lonode_list*, lowire_list*, int );
193 RCXFLOAT awemaxmoment( losig_list*, lonode_list* );
194
195 // Mémorisation des moments ou des coéfficients du filtre. Allocation par bloc, sans libération.
196 aweinfo_list* aweaddnodeinfo( losig_list*,
197 locon_list*,
198 long ,
199 locon_list*,
200 long,
201 RCXFLOAT*,
202 RCXFLOAT,
203 RCXFLOAT
204 );
205 void awefreenodeinfo( losig_list* );
206 void awebuildinfo( losig_list*, locon_list*, long, RCXFLOAT, RCXFLOAT );
207 chain_list* getaweinfo( losig_list *losig,
208 locon_list *load,
209 locon_list *driver,
210 RCXFLOAT extcapa,
211 rcx_slope *slopemiller,
212 char type,
213 RCXFLOAT coefctc
214 );
215 aweinfo_list* awegetnewinfo( void );
216 aweinfo_list* awegetheapinfo( void );
217 void awefreeinfolist( chain_list *head );
218 void aweallocinfo( void );
219 void awesaveaweinfo( losig_list *losig, long type );
220 void awefreeinfo( aweinfo_list *awe );
221 void aweselectaweinfo( losig_list *losig, long type );
222
223 // Transformation des moments en filtre.
224 void awemomentfiltre( aweinfo_list* );
225
226 // Calcul des délais et des fronts.
227 RCXFLOAT awevoltage_straight( aweinfo_list *awe,
228 RCXFLOAT t,
229 RCXFLOAT vmax,
230 RCXFLOAT a,
231 RCXFLOAT b
232 );
233 RCXFLOAT aweinstant_straight( aweinfo_list *awe,
234 RCXFLOAT vf,
235 RCXFLOAT vmax,
236 RCXFLOAT a,
237 RCXFLOAT b
238 );
239 RCXFLOAT awedelay( aweinfo_list*, RCXFLOAT, RCXFLOAT, RCXFLOAT, RCXFLOAT, RCXFLOAT, RCXFLOAT, RCXFLOAT, RCXFLOAT, RCXFLOAT, mbk_pwl* );
240 RCXFLOAT aweslope( aweinfo_list *awe, RCXFLOAT vmax, mbk_pwl **pwlout, rcx_slope *slope, char type, double coefctc ) ;
241
242 // Transformation tangente hyperbolique en droite.
243 void awe_tanh_to_straight( RCXFLOAT, RCXFLOAT, RCXFLOAT, RCXFLOAT*, RCXFLOAT* );
244
245 mbk_pwl* awe_tanh_to_pwl( RCXFLOAT inputslope, RCXFLOAT vmax, RCXFLOAT vt, RCXFLOAT vsat, RCXFLOAT rl, RCXFLOAT r, RCXFLOAT c1, RCXFLOAT c2 );
246 char awe_tanh( awe_tanh_data *data, double t, double *v );
247 double awe_tanh_tmax( awe_tanh_data *data );
248 RCXFLOAT awevoltage_pwl( aweinfo_list *awe, RCXFLOAT t, mbk_laplace *laplace );
249 RCXFLOAT aweinstant_pwl( aweinfo_list *awe, RCXFLOAT vf, RCXFLOAT vmax, mbk_laplace *laplace, int *status );
250 mbk_laplace* awe_pwl_to_laplace( mbk_pwl*, aweinfo_list* );
251 RCXFLOAT awe_pi_get_v20( RCXFLOAT tsat, RCXFLOAT inputslope, RCXFLOAT vmax, RCXFLOAT vt, RCXFLOAT r, RCXFLOAT c2 );
252
253 #define U(t) ((t)>=0.0?1.0:0.0)
254 #define INVTH( F, VT, VMAX, VTH ) ((F)*atanh(((VTH)-(VT))/((VMAX)-(VT))))
255
256 extern int getawedelay( lofig_list*, losig_list*, locon_list*, locon_list*, rcx_slope*, RCXFLOAT, RCXFLOAT, RCXFLOAT, RCXFLOAT*, RCXFLOAT*, RCXFLOAT*, RCXFLOAT*, mbk_pwl**, mbk_pwl** );
257 void trc_awecleancache( losig_list *ptsig );
258 extern awelist* getawedelaylist( lofig_list *lofig, losig_list *losig, locon_list *locon_emt, rcx_slope *slopemiller, RCXFLOAT extcapa );
259 extern void freeawedelaylist( awelist *headlist );
260 awelist *addawelist( awelist *head, locon_list *locon, RCXFLOAT dmax, RCXFLOAT dmin, RCXFLOAT fmax, RCXFLOAT fmin );
261 void awe_tanh_point_measure( RCXFLOAT vt, RCXFLOAT vmax, RCXFLOAT f, RCXFLOAT *t1, RCXFLOAT *v1, RCXFLOAT *t2, RCXFLOAT *v2 );
262
263 int awe_up_forcreatetriangle( losig_list *losig, lonode_list *lonode, lowire_list *lowire, void *userdata );
264 int awe_packup_forcreatetriangle( losig_list *losig, lonode_list *lonode, rcx_triangle *tr, void *userdata );
265 int awe_dw_forcleantriangle( losig_list *losig, lonode_list *lonode, chain_list *chwire, ht *htpack, void *userdata );
266 void awe_create_triangle( losig_list *losig, lonode_list *driver );
267 void awe_clean_triangle( losig_list *losig, lonode_list *driver );
268
269 int awe_dw_forcleannodes( losig_list *losig, lonode_list *lonode, chain_list *chwire, ht *htpack, void *userdata );
270
271 int awe_dw_formaxmoment( losig_list *losig, lonode_list *lonode, chain_list *chwire, ht *htpack, RCXFLOAT *ptmax );
272
273 int rcx_imp_clean( losig_list *losig, lonode_list *lonode, lowire_list *lowire, void *data );
274 int rcx_imp_prop( losig_list *losig, lonode_list *lonode, lowire_list *lowire, void *data );
275 int rcx_is_multiple_pnode( losig_list *losig, locon_list *driver );
276 void awe_error( int, int );
277 void awevoltage_pwl_plot( aweinfo_list *awe,
278 RCXFLOAT tmax,
279 mbk_pwl *lines,
280 mbk_laplace *laplace,
281 float t_unit,
282 float t_vth,
283 float vmax,
284 char *filename
285 );
286 char awe_get_time_for_pwl( awefilter *filter, float v, float *t );
287 RCXFLOAT awevoltage_fast( aweinfo_list *awe, double f );
288
289
290 unsigned long int rcx_cache_release_awe( awecache *head );
291 unsigned long int rcx_add_cache_awe( losig_list *losig, char transition, char type, char iscrosstalk );
292 awecache* rcx_get_cache_awe( losig_list *losig, char transition, char type, char iscrosstalk );
293 unsigned long int rcx_awe_cache_update_ht( awecache *awetop, aweinfo_list *head );
294 void rcx_awe_cache_add_ht( ht *ht, aweinfo_list *aweinfo );
295 long rcx_awe_cache_fn( int isnew, chain_list *head, aweinfo_list *awe );
296