Initial version of donated sources by Avertec, 3.4p5.
[tas-yagle.git] / distrib / sources / tas / sim / sim_ic.c
1 /*****************************************************************************/
2 /* */
3 /* Chaine de CAO & VLSI AVERTEC */
4 /* */
5 /* Produit : SIM Version 2.00 */
6 /* Fichier : sim_obj.c */
7 /* */
8 /* (c) copyright 2000 AVERTEC */
9 /* Tous droits reserves */
10 /* */
11 /* Auteur(s) : Grégoire AVOT */
12 /* */
13 /*****************************************************************************/
14
15 #include SIM_H
16 #include "sim.h"
17
18 sim_ic* sim_ic_get_newic( sim_model *model, char *name, char locate )
19 {
20 sim_ic *ic;
21
22 ic = sim_ic_get( model, name, locate );
23 if( ic )
24 sim_ic_clear( model, name, locate );
25
26 ic = sim_ic_alloc();
27 ic->NEXT = model->LIC ;
28 model->LIC = ic;
29
30 switch( locate ) {
31 case SIM_IC_LOCON :
32 ic->WHERE.LOCON_NAME = namealloc(name);
33 ic->LOCATE = SIM_IC_LOCON;
34 break;
35 case SIM_IC_SIGNAL :
36 ic->WHERE.SIGNAL_NAME = namealloc(name);
37 ic->LOCATE = SIM_IC_SIGNAL;
38 break;
39 }
40
41 ic->TYPE = SIM_IC_NOIC;
42
43 return ic;
44 }
45
46 void sim_ic_set_voltage( sim_model *model, char *name, char locate, SIM_FLOAT voltage )
47 {
48 sim_ic *ic;
49
50 sim_node_clean(model, name);
51
52 ic = sim_ic_get_newic( model, name, locate );
53
54 ic->TYPE = SIM_IC_VOLTAGE;
55 ic->UIC.VOLTAGE.VOLTAGE = voltage;
56 ic->NODENAME = NULL;
57 ic->VSS=sim_parameter_get_vss(model, 'i');
58 ic->VDD=sim_parameter_get_alim(model, 'i');
59 }
60
61 sim_ic *sim_ic_set_level( sim_model *model, char *name, char locate, char level )
62 {
63 sim_ic *ic;
64
65 sim_node_clean(model, name);
66
67 ic = sim_ic_get_newic( model, name, locate );
68
69 ic->TYPE = SIM_IC_LEVEL;
70 ic->UIC.LEVEL.LEVEL = level;
71 ic->NODENAME = NULL;
72 ic->VSS=sim_parameter_get_vss(model, 'i');
73 ic->VDD=sim_parameter_get_alim(model, 'i');
74 return ic;
75 }
76
77 sim_ic *sim_ic_set_nodelist (sim_ic *ic, chain_list *nodelist)
78 {
79 if (!ic) return NULL;
80 ic->NODENAME = dupchainlst(nodelist);
81 return ic;
82 }
83
84 sim_ic* sim_ic_get( sim_model *model, char *name, char locate )
85 {
86 sim_ic *ic;
87
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 ) )
91 return ic;
92 return NULL;
93 }
94
95 char sim_ic_get_type( sim_ic *ic )
96 {
97 if( !ic )
98 return SIM_IC_NOIC;
99 return ic->TYPE;
100 }
101
102 chain_list *sim_ic_get_nodelist ( sim_ic *ic )
103 {
104 if( !ic )
105 return NULL;
106 return ic->NODENAME;
107 }
108
109 char sim_ic_get_level( sim_ic *ic )
110 {
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;
114 }
115
116 SIM_FLOAT sim_ic_get_voltage( sim_ic *ic )
117 {
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;
121 }
122
123 char sim_ic_get_locate( sim_ic *ic )
124 {
125 return( ic->LOCATE );
126 }
127
128 char* sim_ic_get_name( sim_ic *ic )
129 {
130 if( !ic ) return NULL;
131
132 switch( ic->LOCATE ) {
133 case SIM_IC_SIGNAL:
134 return ic->WHERE.SIGNAL_NAME;
135 break;
136 case SIM_IC_LOCON:
137 return ic->WHERE.LOCON_NAME;
138 break;
139 }
140 return NULL;
141 }
142
143 sim_ic* sim_ic_scan( sim_model *model, sim_ic *ic )
144 {
145 if( !ic ) return model->LIC;
146 return ic->NEXT;
147 }
148
149 void sim_ic_clean( sim_model *model )
150 {
151 sim_ic *ic, *nextic;
152 for( ic = model->LIC ; ic ; ic = nextic ) {
153 nextic = ic->NEXT;
154 sim_ic_free( ic );
155 }
156 model->LIC = NULL;
157 }
158
159 void sim_ic_clear( sim_model *model, char *name, char locate )
160 {
161 sim_ic *scan, *prev;
162
163 prev = NULL;
164
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 ) )
168 break;
169 prev = scan ;
170 }
171
172 if (!scan) return;
173
174 if (prev)
175 prev->NEXT= scan->NEXT ;
176 else
177 model->LIC = scan->NEXT ;
178
179 sim_ic_free( scan );
180 }
181
182 void sim_ic_free( sim_ic *ic )
183 {
184 if (ic->NODENAME != NULL)
185 freechain (ic->NODENAME);
186 mbkfree( ic );
187 }
188
189 sim_ic* sim_ic_alloc( void )
190 {
191 sim_ic *ic;
192 ic = (sim_ic*)mbkalloc( sizeof( sim_ic ) );
193 return ic;
194 }
195
196 SIM_FLOAT sim_ic_get_vdd( sim_ic *ic )
197 {
198 return ic->VDD;
199 }
200
201 SIM_FLOAT sim_ic_get_vss( sim_ic *ic )
202 {
203 return ic->VSS;
204 }
205