1 /*****************************************************************************/
3 /* Chaine de CAO & VLSI AVERTEC */
5 /* Produit : SIM Version 2.00 */
6 /* Fichier : sim_obj.c */
8 /* (c) copyright 2000 AVERTEC */
9 /* Tous droits reserves */
11 /* Auteur(s) : Grégoire AVOT */
13 /*****************************************************************************/
18 sim_ic
* sim_ic_get_newic( sim_model
*model
, char *name
, char locate
)
22 ic
= sim_ic_get( model
, name
, locate
);
24 sim_ic_clear( model
, name
, locate
);
27 ic
->NEXT
= model
->LIC
;
32 ic
->WHERE
.LOCON_NAME
= namealloc(name
);
33 ic
->LOCATE
= SIM_IC_LOCON
;
36 ic
->WHERE
.SIGNAL_NAME
= namealloc(name
);
37 ic
->LOCATE
= SIM_IC_SIGNAL
;
41 ic
->TYPE
= SIM_IC_NOIC
;
46 void sim_ic_set_voltage( sim_model
*model
, char *name
, char locate
, SIM_FLOAT voltage
)
50 sim_node_clean(model
, name
);
52 ic
= sim_ic_get_newic( model
, name
, locate
);
54 ic
->TYPE
= SIM_IC_VOLTAGE
;
55 ic
->UIC
.VOLTAGE
.VOLTAGE
= voltage
;
57 ic
->VSS
=sim_parameter_get_vss(model
, 'i');
58 ic
->VDD
=sim_parameter_get_alim(model
, 'i');
61 sim_ic
*sim_ic_set_level( sim_model
*model
, char *name
, char locate
, char level
)
65 sim_node_clean(model
, name
);
67 ic
= sim_ic_get_newic( model
, name
, locate
);
69 ic
->TYPE
= SIM_IC_LEVEL
;
70 ic
->UIC
.LEVEL
.LEVEL
= level
;
72 ic
->VSS
=sim_parameter_get_vss(model
, 'i');
73 ic
->VDD
=sim_parameter_get_alim(model
, 'i');
77 sim_ic
*sim_ic_set_nodelist (sim_ic
*ic
, chain_list
*nodelist
)
80 ic
->NODENAME
= dupchainlst(nodelist
);
84 sim_ic
* sim_ic_get( sim_model
*model
, char *name
, char locate
)
88 for( ic
= model
->LIC
; ic
; ic
= ic
->NEXT
)
89 if( ( sim_ic_get_locate( ic
) == locate
) &&
90 ( strcmp( sim_ic_get_name( ic
), name
) == 0 ) )
95 char sim_ic_get_type( sim_ic
*ic
)
102 chain_list
*sim_ic_get_nodelist ( sim_ic
*ic
)
109 char sim_ic_get_level( sim_ic
*ic
)
111 if( !ic
|| ic
->TYPE
!= SIM_IC_LEVEL
)
112 sim_error( "sim_ic_get_level() : not a valid ic\n" );
113 return ic
->UIC
.LEVEL
.LEVEL
;
116 SIM_FLOAT
sim_ic_get_voltage( sim_ic
*ic
)
118 if( !ic
|| ic
->TYPE
!= SIM_IC_VOLTAGE
)
119 sim_error( "sim_ic_get_level() : not a valid ic\n" );
120 return ic
->UIC
.VOLTAGE
.VOLTAGE
;
123 char sim_ic_get_locate( sim_ic
*ic
)
125 return( ic
->LOCATE
);
128 char* sim_ic_get_name( sim_ic
*ic
)
130 if( !ic
) return NULL
;
132 switch( ic
->LOCATE
) {
134 return ic
->WHERE
.SIGNAL_NAME
;
137 return ic
->WHERE
.LOCON_NAME
;
143 sim_ic
* sim_ic_scan( sim_model
*model
, sim_ic
*ic
)
145 if( !ic
) return model
->LIC
;
149 void sim_ic_clean( sim_model
*model
)
152 for( ic
= model
->LIC
; ic
; ic
= nextic
) {
159 void sim_ic_clear( sim_model
*model
, char *name
, char locate
)
165 for( scan
= model
->LIC
; scan
; scan
= scan
->NEXT
) {
166 if( ( sim_ic_get_locate( scan
) == locate
) &&
167 ( strcmp( sim_ic_get_name( scan
), name
) == 0 ) )
175 prev
->NEXT
= scan
->NEXT
;
177 model
->LIC
= scan
->NEXT
;
182 void sim_ic_free( sim_ic
*ic
)
184 if (ic
->NODENAME
!= NULL
)
185 freechain (ic
->NODENAME
);
189 sim_ic
* sim_ic_alloc( void )
192 ic
= (sim_ic
*)mbkalloc( sizeof( sim_ic
) );
196 SIM_FLOAT
sim_ic_get_vdd( sim_ic
*ic
)
201 SIM_FLOAT
sim_ic_get_vss( sim_ic
*ic
)