1 /****************************************************************************/
3 /* Chaine de CAO & VLSI Alliance */
5 /* Produit : TRC Version 1.01 */
6 /* Fichier : trc101.h */
8 /* (c) copyright 1997-1998 Laboratoire LIP6 equipe ASIM */
9 /* Tous droits reserves */
10 /* Support : e-mail alliance-support@asim.lip6.fr */
12 /* Auteur(s) : Gregoire AVOT */
14 /****************************************************************************/
17 // Lorsque cette variable est à 1, le cache est actif.
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
;
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'
47 extern losig_list
*AWE_DEBUG_NET
;
48 extern locon_list
*AWE_DEBUG_DRIVER
;
49 extern locon_list
*AWE_DEBUG_RECEIVER
;
51 /* Ordre d'évalutation par défaut pour AWE */
52 #define AWE_MAX_ORDER 3
53 #define AWE_MAX_MOMENT 5
55 /* ptype dans les lonodes */
56 #define AWENODE 0x30000000
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
65 /* Information ajoutée dans les losig, accessible par le ptype AWEINFO */
67 typedef struct sawefiltre
{
68 RCXFLOAT POLE
[AWE_MAX_ORDER
] ;
69 RCXFLOAT RESIDU
[AWE_MAX_ORDER
] ;
73 typedef struct aweinfo
{
75 locon_list
*LOCON_DRIVER
;
77 locon_list
*LOCON_LOAD
;
82 RCXFLOAT MOMENT
[AWE_MAX_MOMENT
];
113 /* Valeur pour le champ FLAG de la structure aweinfo */
114 #define AWE_FLAGVALID ((unsigned char)(0x80))
115 #define AWE_FLAGERROR ((unsigned char)(0x40))
118 #define AWE_FLAGNODELAY ((unsigned char)(0x03))
119 #define AWE_FLAGFILTER ((unsigned char)(0x02))
120 #define AWE_FLAGMOMENT ((unsigned char)(0x01))
123 #define AWE_FLAGALLORDERFAILED ((unsigned char)(0x01))
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 )
130 #define AWESIZEINFO 16
132 /* Information ajoutée dans les noeuds des réseaux RC */
134 typedef struct sawetabnode
{
136 RCXFLOAT SUMMOMENTCAPA
;
137 RCXFLOAT MOMENT
[ AWE_MAX_MOMENT
];
140 typedef union uawetabnode_list
{
142 union uawetabnode_list
*NEXT
;
147 mbk_laplace
*LAPLACE
;
151 /* ptype temporaire dans les wires pour la fonction rcx_is_multiple_pnode() */
152 #define AWESUMRESI 0x5243581F
155 #define AWESIZETABNODE 200 // Taille d'un bloc alloué
157 // Mémoire pour le calcul des moments. Allocation par bloc, sans libération
159 awetabnode
* aweallocnodes( void );
160 void aweunallocnodes( awetabnode
* );
161 void awecleannodes( losig_list
*, lonode_list
* );
162 void awebuildnodes( losig_list
*losig
,
165 rcx_slope
*slopemiller
,
170 void build_awe_moment_without_loop( losig_list
*losig
,
173 rcx_slope
*slopemiller
,
177 void build_awe_moment_with_loop( losig_list
*losig
,
180 rcx_slope
*slopemiller
,
185 // Calcul des moments.
186 void awemoment( losig_list
*,
192 RCXFLOAT
awedownstream( losig_list
*, lonode_list
*, lowire_list
*, int );
193 RCXFLOAT
awemaxmoment( losig_list
*, lonode_list
* );
195 // Mémorisation des moments ou des coéfficients du filtre. Allocation par bloc, sans libération.
196 aweinfo_list
* aweaddnodeinfo( losig_list
*,
205 void awefreenodeinfo( losig_list
* );
206 void awebuildinfo( losig_list
*, locon_list
*, long, RCXFLOAT
, RCXFLOAT
);
207 chain_list
* getaweinfo( losig_list
*losig
,
211 rcx_slope
*slopemiller
,
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
);
223 // Transformation des moments en filtre.
224 void awemomentfiltre( aweinfo_list
* );
226 // Calcul des délais et des fronts.
227 RCXFLOAT
awevoltage_straight( aweinfo_list
*awe
,
233 RCXFLOAT
aweinstant_straight( aweinfo_list
*awe
,
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
) ;
242 // Transformation tangente hyperbolique en droite.
243 void awe_tanh_to_straight( RCXFLOAT
, RCXFLOAT
, RCXFLOAT
, RCXFLOAT
*, RCXFLOAT
* );
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
);
253 #define U(t) ((t)>=0.0?1.0:0.0)
254 #define INVTH( F, VT, VMAX, VTH ) ((F)*atanh(((VTH)-(VT))/((VMAX)-(VT))))
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
);
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
);
269 int awe_dw_forcleannodes( losig_list
*losig
, lonode_list
*lonode
, chain_list
*chwire
, ht
*htpack
, void *userdata
);
271 int awe_dw_formaxmoment( losig_list
*losig
, lonode_list
*lonode
, chain_list
*chwire
, ht
*htpack
, RCXFLOAT
*ptmax
);
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
,
280 mbk_laplace
*laplace
,
286 char awe_get_time_for_pwl( awefilter
*filter
, float v
, float *t
);
287 RCXFLOAT
awevoltage_fast( aweinfo_list
*awe
, double f
);
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
);