1 | /**CFile*********************************************************************** |
---|
2 | |
---|
3 | FileName [varVariable.c] |
---|
4 | |
---|
5 | PackageName [var] |
---|
6 | |
---|
7 | Synopsis [Routines to access the MV-variable data structure.] |
---|
8 | |
---|
9 | Description [] |
---|
10 | |
---|
11 | SeeAlso [] |
---|
12 | |
---|
13 | Author [Yuji Kukimoto] |
---|
14 | |
---|
15 | Copyright [Copyright (c) 1994-1996 The Regents of the Univ. of California. |
---|
16 | All rights reserved. |
---|
17 | |
---|
18 | Permission is hereby granted, without written agreement and without license |
---|
19 | or royalty fees, to use, copy, modify, and distribute this software and its |
---|
20 | documentation for any purpose, provided that the above copyright notice and |
---|
21 | the following two paragraphs appear in all copies of this software. |
---|
22 | |
---|
23 | IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR |
---|
24 | DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT |
---|
25 | OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF |
---|
26 | CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
---|
27 | |
---|
28 | THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, |
---|
29 | INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND |
---|
30 | FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN |
---|
31 | "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO PROVIDE |
---|
32 | MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.] |
---|
33 | |
---|
34 | ******************************************************************************/ |
---|
35 | |
---|
36 | #include "varInt.h" |
---|
37 | |
---|
38 | static char rcsid[] UNUSED = "$Id: varVariable.c,v 1.6 2009/01/18 01:58:09 fabio Exp $"; |
---|
39 | |
---|
40 | /*---------------------------------------------------------------------------*/ |
---|
41 | /* Constant declarations */ |
---|
42 | /*---------------------------------------------------------------------------*/ |
---|
43 | |
---|
44 | |
---|
45 | /*---------------------------------------------------------------------------*/ |
---|
46 | /* Stucture declarations */ |
---|
47 | /*---------------------------------------------------------------------------*/ |
---|
48 | |
---|
49 | |
---|
50 | /*---------------------------------------------------------------------------*/ |
---|
51 | /* Type declarations */ |
---|
52 | /*---------------------------------------------------------------------------*/ |
---|
53 | |
---|
54 | |
---|
55 | /*---------------------------------------------------------------------------*/ |
---|
56 | /* Variable declarations */ |
---|
57 | /*---------------------------------------------------------------------------*/ |
---|
58 | |
---|
59 | |
---|
60 | /*---------------------------------------------------------------------------*/ |
---|
61 | /* Macro declarations */ |
---|
62 | /*---------------------------------------------------------------------------*/ |
---|
63 | |
---|
64 | |
---|
65 | /**AutomaticStart*************************************************************/ |
---|
66 | |
---|
67 | /*---------------------------------------------------------------------------*/ |
---|
68 | /* Static function prototypes */ |
---|
69 | /*---------------------------------------------------------------------------*/ |
---|
70 | |
---|
71 | static int _VarVariableSetType(Var_Variable_t *var, int type); |
---|
72 | static int _VarVariableResetType(Var_Variable_t *var, int type); |
---|
73 | static char * _VarTypeDecode(int type); |
---|
74 | static array_t * _VarStringArrayDup(array_t *array); |
---|
75 | static void _VarStringArrayFree(array_t *array); |
---|
76 | |
---|
77 | /**AutomaticEnd***************************************************************/ |
---|
78 | |
---|
79 | |
---|
80 | /*---------------------------------------------------------------------------*/ |
---|
81 | /* Definition of exported functions */ |
---|
82 | /*---------------------------------------------------------------------------*/ |
---|
83 | |
---|
84 | /**Function******************************************************************** |
---|
85 | |
---|
86 | Synopsis [Adds range/symbolic value information to a variable.] |
---|
87 | |
---|
88 | Description [Adds range/symbolic value information to a variable. This |
---|
89 | function is typically called when a .mv construct is encountered for |
---|
90 | a variable which is already defined by either .inputs or .outputs. |
---|
91 | The arguments of this function are a pointer to a variable, the number |
---|
92 | of values the variable can take, and an array of symbolic value names |
---|
93 | stored as character strings. If the variable is an enumerative variable, |
---|
94 | then the last argument should be set to NIL(array_t). It is the user's |
---|
95 | responsibility to free the array and its strings since the function |
---|
96 | creates a copy of the strings internally. Returns 1 if success. |
---|
97 | Otherwise returns 0.] |
---|
98 | |
---|
99 | SideEffects [] |
---|
100 | |
---|
101 | SeeAlso [Var_VariableAlloc Var_VariableFree] |
---|
102 | |
---|
103 | ******************************************************************************/ |
---|
104 | |
---|
105 | boolean |
---|
106 | Var_VariableAddRangeInfo( |
---|
107 | Var_Variable_t * var, |
---|
108 | int numValues, |
---|
109 | array_t * symValArray) |
---|
110 | { |
---|
111 | int i; |
---|
112 | char *symValue; |
---|
113 | st_table *valueToIndex; |
---|
114 | |
---|
115 | if (var->indexToValue != NIL(array_t) || var->numValues != 2){ |
---|
116 | error_append("Error: The range of variable "); |
---|
117 | error_append(var->name); |
---|
118 | error_append(" has been already set.\n"); |
---|
119 | return 0; |
---|
120 | } |
---|
121 | |
---|
122 | if (symValArray != NIL(array_t)){ |
---|
123 | if (numValues != array_n(symValArray)){ |
---|
124 | error_append("Error: Mismatch of range and # of symbolic values.\n"); |
---|
125 | return 0; |
---|
126 | } |
---|
127 | valueToIndex = st_init_table(strcmp,st_strhash); |
---|
128 | var->indexToValue = _VarStringArrayDup(symValArray); |
---|
129 | for (i=0; i < numValues; i++) { |
---|
130 | symValue = array_fetch(char *,var->indexToValue,i); |
---|
131 | if (st_insert(valueToIndex,symValue,(char *)((long)i))) { |
---|
132 | error_append("Error: Invalid argument for Var_VariableAddRangeInfo().\n"); |
---|
133 | error_append("- Symbolic value "); |
---|
134 | error_append(symValue); |
---|
135 | error_append(" is redefined.\n"); |
---|
136 | st_free_table(valueToIndex); |
---|
137 | return 0; |
---|
138 | } |
---|
139 | } |
---|
140 | var->valueToIndex = valueToIndex; |
---|
141 | } |
---|
142 | var->numValues = numValues; |
---|
143 | return 1; |
---|
144 | } |
---|
145 | |
---|
146 | |
---|
147 | /**Function******************************************************************** |
---|
148 | |
---|
149 | Synopsis [Expands the range of a variable.] |
---|
150 | |
---|
151 | Description [Expands the range of a variable. Designed for the table |
---|
152 | determinization routine.] |
---|
153 | |
---|
154 | SideEffects [] |
---|
155 | |
---|
156 | SeeAlso [Var_VariableReduceRange] |
---|
157 | |
---|
158 | ******************************************************************************/ |
---|
159 | boolean |
---|
160 | Var_VariableExpandRange( |
---|
161 | Var_Variable_t *var, |
---|
162 | int numValues) |
---|
163 | { |
---|
164 | if (numValues <= var->numValues){ |
---|
165 | error_append("Error: A range can only be expanded.\n"); |
---|
166 | return 0; |
---|
167 | } |
---|
168 | if (var->indexToValue != NIL(array_t)){ |
---|
169 | int i; |
---|
170 | char *dummyName; |
---|
171 | |
---|
172 | for (i=var->numValues; i < numValues; i++){ |
---|
173 | /* put empty strings for expanded range */ |
---|
174 | dummyName = ALLOC(char,1); |
---|
175 | *dummyName = '\0'; |
---|
176 | array_insert_last(char *,var->indexToValue,dummyName); |
---|
177 | } |
---|
178 | } |
---|
179 | var->numValues = numValues; |
---|
180 | return 1; |
---|
181 | } |
---|
182 | |
---|
183 | /**Function******************************************************************** |
---|
184 | |
---|
185 | Synopsis [Reduces the range of a variable.] |
---|
186 | |
---|
187 | Description [Reduces the range of a variable. Designed for Abstraction. If |
---|
188 | numValues is greater than the current range of var, then |
---|
189 | Var_VariableExpandRange will be called and returned.] |
---|
190 | |
---|
191 | SideEffects [] |
---|
192 | |
---|
193 | SeeAlso [Var_VariableExpandRange] |
---|
194 | |
---|
195 | ******************************************************************************/ |
---|
196 | boolean |
---|
197 | Var_VariableReduceRange( |
---|
198 | Var_Variable_t *var, |
---|
199 | int numValues) |
---|
200 | { |
---|
201 | if(numValues > var->numValues){ |
---|
202 | return Var_VariableExpandRange(var,numValues); |
---|
203 | } |
---|
204 | else if (var->indexToValue != NIL(array_t)){ |
---|
205 | error_append("Error: Cannot reduce the range of a symbolic variable.\n"); |
---|
206 | return 0; |
---|
207 | } |
---|
208 | |
---|
209 | var->numValues = numValues; |
---|
210 | return 1; |
---|
211 | } |
---|
212 | |
---|
213 | /**Function******************************************************************** |
---|
214 | |
---|
215 | Synopsis [Allocates a new variable.] |
---|
216 | |
---|
217 | Description [Allocates a new variable. This function is typically |
---|
218 | invoked when a .inputs or a .outputs is encountered in the parser. |
---|
219 | The arguments of this function are a pointer to the hnode to which |
---|
220 | a new variable belongs to and a name of the variable. The name string |
---|
221 | is copied for internal use. The user is responsible for freeing |
---|
222 | the original string. The new variable is set to a binary variable |
---|
223 | without any symbolic value definition, i.e. it is defined as a binary |
---|
224 | enumerative variable. The user can update this range information |
---|
225 | by calling Var_VariableAddRangeInfo(). Returns a pointer to |
---|
226 | the variable if success. Otherwise, NIL(Var_Variable_t) is returned. ] |
---|
227 | |
---|
228 | SideEffects [] |
---|
229 | |
---|
230 | SeeAlso [Var_VariableAddRangeInfo Var_VariableFree] |
---|
231 | |
---|
232 | ******************************************************************************/ |
---|
233 | |
---|
234 | Var_Variable_t * |
---|
235 | Var_VariableAlloc( |
---|
236 | Hrc_Node_t *hnode, |
---|
237 | char *name) |
---|
238 | { |
---|
239 | Var_Variable_t *var; |
---|
240 | |
---|
241 | var = ALLOC(Var_Variable_t,1); |
---|
242 | var->name = util_strsav(name); |
---|
243 | var->hnode = hnode; |
---|
244 | if (hnode != NIL(Hrc_Node_t)){ |
---|
245 | if ( Hrc_NodeAddVariable(hnode,var) == 0 ){ |
---|
246 | Var_VariableFree(var); |
---|
247 | return NIL(Var_Variable_t); |
---|
248 | } |
---|
249 | } |
---|
250 | var->type = 0; |
---|
251 | /* assume that this is a Boolean variable w/o symbolic value definition */ |
---|
252 | var->numValues = 2; |
---|
253 | var->numFanoutTables = 0; |
---|
254 | var->indexToValue = NIL(array_t); |
---|
255 | var->valueToIndex = NIL(st_table); |
---|
256 | var->typeIdentifier = NIL(char); |
---|
257 | var->undef = NIL(void); |
---|
258 | return var; |
---|
259 | } |
---|
260 | |
---|
261 | /**Function******************************************************************** |
---|
262 | |
---|
263 | Synopsis [Frees a variable.] |
---|
264 | |
---|
265 | Description [] |
---|
266 | |
---|
267 | SideEffects [] |
---|
268 | |
---|
269 | SeeAlso [Var_VariableAlloc] |
---|
270 | |
---|
271 | ******************************************************************************/ |
---|
272 | void |
---|
273 | Var_VariableFree(Var_Variable_t *var) |
---|
274 | { |
---|
275 | if (var->hnode != NIL(Hrc_Node_t)){ |
---|
276 | Hrc_NodeDeleteVariable(var->hnode,var); |
---|
277 | } |
---|
278 | FREE(var->name); |
---|
279 | if (var->indexToValue != NIL(array_t)){ |
---|
280 | _VarStringArrayFree(var->indexToValue); |
---|
281 | } |
---|
282 | if (var->valueToIndex != NIL(st_table)){ |
---|
283 | st_free_table(var->valueToIndex); |
---|
284 | } |
---|
285 | if (var->typeIdentifier != NIL(char)){ |
---|
286 | FREE(var->typeIdentifier); |
---|
287 | } |
---|
288 | FREE(var); |
---|
289 | } |
---|
290 | |
---|
291 | /**Function******************************************************************** |
---|
292 | |
---|
293 | Synopsis [Duplicates a variable. ] |
---|
294 | |
---|
295 | Description [Duplicates a variable. The second argument hnode is a new hnode |
---|
296 | to which a duplicated variable belongs.] |
---|
297 | |
---|
298 | SideEffects [] |
---|
299 | |
---|
300 | SeeAlso [] |
---|
301 | |
---|
302 | ******************************************************************************/ |
---|
303 | Var_Variable_t * |
---|
304 | Var_VariableDup( |
---|
305 | Var_Variable_t *var, |
---|
306 | Hrc_Node_t *hnode) |
---|
307 | { |
---|
308 | Var_Variable_t *varDup; |
---|
309 | |
---|
310 | varDup = Var_VariableAlloc(hnode,var->name); |
---|
311 | varDup->type = var->type; |
---|
312 | varDup->hnode = hnode; |
---|
313 | varDup->numFanoutTables = var->numFanoutTables; |
---|
314 | if (Var_VariableAddRangeInfo(varDup,var->numValues,var->indexToValue) == 0){ |
---|
315 | return NIL(Var_Variable_t); |
---|
316 | } |
---|
317 | if (var->typeIdentifier != NIL(char)){ |
---|
318 | varDup->typeIdentifier = util_strsav(var->typeIdentifier); |
---|
319 | } |
---|
320 | return varDup; |
---|
321 | } |
---|
322 | |
---|
323 | /**Function******************************************************************** |
---|
324 | |
---|
325 | Synopsis [Returns a pointer to the name of a variable.] |
---|
326 | |
---|
327 | Description [] |
---|
328 | |
---|
329 | SideEffects [] |
---|
330 | |
---|
331 | SeeAlso [] |
---|
332 | |
---|
333 | ******************************************************************************/ |
---|
334 | char * |
---|
335 | Var_VariableReadName(Var_Variable_t *var) |
---|
336 | { |
---|
337 | return var->name; |
---|
338 | } |
---|
339 | |
---|
340 | /**Function******************************************************************** |
---|
341 | |
---|
342 | Synopsis [Returns 1 if a variable is a primary input. Otherwise returns 0.] |
---|
343 | |
---|
344 | Description [] |
---|
345 | |
---|
346 | SideEffects [] |
---|
347 | |
---|
348 | SeeAlso [Var_VariableSetPI] |
---|
349 | |
---|
350 | ******************************************************************************/ |
---|
351 | boolean |
---|
352 | Var_VariableTestIsPI(Var_Variable_t *var) |
---|
353 | { |
---|
354 | return (((var->type) & VarPI) ? 1:0); |
---|
355 | } |
---|
356 | |
---|
357 | /**Function******************************************************************** |
---|
358 | |
---|
359 | Synopsis [Returns 1 if a variable is a primary output. Otherwise returns 0.] |
---|
360 | |
---|
361 | Description [] |
---|
362 | |
---|
363 | SideEffects [] |
---|
364 | |
---|
365 | SeeAlso [Var_VariableSetPO] |
---|
366 | |
---|
367 | ******************************************************************************/ |
---|
368 | boolean |
---|
369 | Var_VariableTestIsPO(Var_Variable_t *var) |
---|
370 | { |
---|
371 | return (((var->type) & VarPO) ? 1:0); |
---|
372 | } |
---|
373 | |
---|
374 | /**Function******************************************************************** |
---|
375 | |
---|
376 | Synopsis [Returns 1 if a variable is a present state variable. Otherwise returns 0.] |
---|
377 | |
---|
378 | Description [] |
---|
379 | |
---|
380 | SideEffects [] |
---|
381 | |
---|
382 | SeeAlso [Var_VariableSetPS] |
---|
383 | |
---|
384 | ******************************************************************************/ |
---|
385 | boolean |
---|
386 | Var_VariableTestIsPS(Var_Variable_t *var) |
---|
387 | { |
---|
388 | return (((var->type) & VarPS) ? 1:0); |
---|
389 | } |
---|
390 | |
---|
391 | /**Function******************************************************************** |
---|
392 | |
---|
393 | Synopsis [Returns 1 if a variable is a next state variable. Otherwise returns 0.] |
---|
394 | |
---|
395 | Description [] |
---|
396 | |
---|
397 | SideEffects [] |
---|
398 | |
---|
399 | SeeAlso [Var_VariableSetNS] |
---|
400 | |
---|
401 | ******************************************************************************/ |
---|
402 | boolean |
---|
403 | Var_VariableTestIsNS(Var_Variable_t *var) |
---|
404 | { |
---|
405 | return (((var->type) & VarNS) ? 1:0); |
---|
406 | } |
---|
407 | |
---|
408 | /**Function******************************************************************** |
---|
409 | |
---|
410 | Synopsis [Returns 1 if a variable is a subcircuit input. Otherwise returns 0.] |
---|
411 | |
---|
412 | Description [] |
---|
413 | |
---|
414 | SideEffects [] |
---|
415 | |
---|
416 | SeeAlso [Var_VariableSetSI] |
---|
417 | |
---|
418 | ******************************************************************************/ |
---|
419 | boolean |
---|
420 | Var_VariableTestIsSI(Var_Variable_t *var) |
---|
421 | { |
---|
422 | return (((var->type) & VarSI) ? 1:0); |
---|
423 | } |
---|
424 | |
---|
425 | /**Function******************************************************************** |
---|
426 | |
---|
427 | Synopsis [Returns 1 if a variable is a subcircuit output. Otherwise returns 0.] |
---|
428 | |
---|
429 | Description [] |
---|
430 | |
---|
431 | SideEffects [] |
---|
432 | |
---|
433 | SeeAlso [Var_VariableSetSO] |
---|
434 | |
---|
435 | ******************************************************************************/ |
---|
436 | boolean |
---|
437 | Var_VariableTestIsSO(Var_Variable_t *var) |
---|
438 | { |
---|
439 | return (((var->type) & VarSO) ? 1:0); |
---|
440 | } |
---|
441 | |
---|
442 | /**Function******************************************************************** |
---|
443 | |
---|
444 | Synopsis [Returns 1 if the value type of a variable is symbolic and 0 |
---|
445 | otherwise.] |
---|
446 | |
---|
447 | Description [] |
---|
448 | |
---|
449 | SideEffects [] |
---|
450 | |
---|
451 | SeeAlso [Var_VariableTestIsEnumerative] |
---|
452 | |
---|
453 | ******************************************************************************/ |
---|
454 | boolean |
---|
455 | Var_VariableTestIsSymbolic(Var_Variable_t *var) |
---|
456 | { |
---|
457 | if (var->indexToValue != NIL(array_t)){ |
---|
458 | return 1; |
---|
459 | } |
---|
460 | return 0; |
---|
461 | } |
---|
462 | |
---|
463 | /**Function******************************************************************** |
---|
464 | |
---|
465 | Synopsis [Returns 1 if the value type of a variable is enumerative and 0 |
---|
466 | otherwise.] |
---|
467 | |
---|
468 | Description [] |
---|
469 | |
---|
470 | SideEffects [] |
---|
471 | |
---|
472 | SeeAlso [Var_VariableTestIsSymbolic] |
---|
473 | |
---|
474 | ******************************************************************************/ |
---|
475 | boolean |
---|
476 | Var_VariableTestIsEnumerative(Var_Variable_t *var) |
---|
477 | { |
---|
478 | if (var->indexToValue == NIL(array_t)){ |
---|
479 | return 1; |
---|
480 | } |
---|
481 | return 0; |
---|
482 | } |
---|
483 | |
---|
484 | /**Function******************************************************************** |
---|
485 | |
---|
486 | Synopsis [Returns 1 if a variable is enumerative *and* a value is |
---|
487 | in the range of the variable. Returns 0 otherwise.] |
---|
488 | |
---|
489 | Description [] |
---|
490 | |
---|
491 | SideEffects [] |
---|
492 | |
---|
493 | SeeAlso [] |
---|
494 | |
---|
495 | ******************************************************************************/ |
---|
496 | boolean |
---|
497 | Var_VariableTestIsValueInRange( |
---|
498 | Var_Variable_t *var, |
---|
499 | int value) |
---|
500 | { |
---|
501 | if (var->indexToValue != NIL(array_t)){ |
---|
502 | return 0; |
---|
503 | } |
---|
504 | if (value >= 0 && value < var->numValues){ |
---|
505 | return 1; |
---|
506 | } |
---|
507 | return 0; |
---|
508 | } |
---|
509 | |
---|
510 | /**Function******************************************************************** |
---|
511 | |
---|
512 | Synopsis [Returns the number of values a variable can take.] |
---|
513 | |
---|
514 | Description [] |
---|
515 | |
---|
516 | SideEffects [] |
---|
517 | |
---|
518 | SeeAlso [] |
---|
519 | |
---|
520 | ******************************************************************************/ |
---|
521 | int |
---|
522 | Var_VariableReadNumValues(Var_Variable_t *var) |
---|
523 | { |
---|
524 | return var->numValues; |
---|
525 | } |
---|
526 | |
---|
527 | /**Function******************************************************************** |
---|
528 | |
---|
529 | Synopsis [Returns the number of fanout tables.] |
---|
530 | |
---|
531 | Description [] |
---|
532 | |
---|
533 | SideEffects [] |
---|
534 | |
---|
535 | SeeAlso [] |
---|
536 | |
---|
537 | ******************************************************************************/ |
---|
538 | int |
---|
539 | Var_VariableReadNumFanoutTables(Var_Variable_t *var) |
---|
540 | { |
---|
541 | return var->numFanoutTables; |
---|
542 | } |
---|
543 | |
---|
544 | /**Function******************************************************************** |
---|
545 | |
---|
546 | Synopsis [Increments the number of fanout tables.] |
---|
547 | |
---|
548 | Description [] |
---|
549 | |
---|
550 | SideEffects [] |
---|
551 | |
---|
552 | SeeAlso [] |
---|
553 | |
---|
554 | ******************************************************************************/ |
---|
555 | void |
---|
556 | Var_VariableIncrementNumFanoutTables(Var_Variable_t *var) |
---|
557 | { |
---|
558 | (var->numFanoutTables)++; |
---|
559 | } |
---|
560 | |
---|
561 | /**Function******************************************************************** |
---|
562 | |
---|
563 | Synopsis [Resets the number of fanout tables.] |
---|
564 | |
---|
565 | Description [] |
---|
566 | |
---|
567 | SideEffects [] |
---|
568 | |
---|
569 | SeeAlso [] |
---|
570 | |
---|
571 | ******************************************************************************/ |
---|
572 | void |
---|
573 | Var_VariableResetNumFanoutTables( |
---|
574 | Var_Variable_t* var) |
---|
575 | { |
---|
576 | var->numFanoutTables = 0; |
---|
577 | } |
---|
578 | |
---|
579 | |
---|
580 | /**Function******************************************************************** |
---|
581 | |
---|
582 | Synopsis [Returns the name of the symbolic value associated with an integer index.] |
---|
583 | |
---|
584 | Description [] |
---|
585 | |
---|
586 | SideEffects [] |
---|
587 | |
---|
588 | SeeAlso [] |
---|
589 | |
---|
590 | ******************************************************************************/ |
---|
591 | char * |
---|
592 | Var_VariableReadSymbolicValueFromIndex( |
---|
593 | Var_Variable_t *var, |
---|
594 | int i) |
---|
595 | { |
---|
596 | assert(var->indexToValue != NIL(array_t)); |
---|
597 | return array_fetch(char *,var->indexToValue,i); |
---|
598 | } |
---|
599 | |
---|
600 | /**Function******************************************************************** |
---|
601 | |
---|
602 | Synopsis [Returns the integer index associated with the name of a symbolic value.] |
---|
603 | |
---|
604 | Description [Returns the integer index associated with a symbolic value. If |
---|
605 | a given symbolic name is not valid, the routine returns -1.] |
---|
606 | |
---|
607 | SideEffects [] |
---|
608 | |
---|
609 | SeeAlso [] |
---|
610 | |
---|
611 | ******************************************************************************/ |
---|
612 | int |
---|
613 | Var_VariableReadIndexFromSymbolicValue( |
---|
614 | Var_Variable_t *var, |
---|
615 | char *symbolicValue) |
---|
616 | { |
---|
617 | int isFound; |
---|
618 | int index; |
---|
619 | |
---|
620 | assert(var->valueToIndex != NIL(st_table)); |
---|
621 | isFound = st_lookup_int(var->valueToIndex,symbolicValue,&index); |
---|
622 | return( isFound ? index : -1); |
---|
623 | } |
---|
624 | |
---|
625 | /**Function******************************************************************** |
---|
626 | |
---|
627 | Synopsis [Returns the hnode to which a variable belongs.] |
---|
628 | |
---|
629 | Description [] |
---|
630 | |
---|
631 | SideEffects [] |
---|
632 | |
---|
633 | SeeAlso [] |
---|
634 | |
---|
635 | ******************************************************************************/ |
---|
636 | Hrc_Node_t * |
---|
637 | Var_VariableReadHnode(Var_Variable_t *var) |
---|
638 | { |
---|
639 | return var->hnode; |
---|
640 | } |
---|
641 | |
---|
642 | /**Function******************************************************************** |
---|
643 | |
---|
644 | Synopsis [Returns a pointer to the type identifier of a variable.] |
---|
645 | |
---|
646 | Description [Reads the type identifier for the variable. Type identifiers are |
---|
647 | defined in blif-mv using the .type statement. |
---|
648 | Example: .type color red white blue |
---|
649 | .mv flag_colors type=color] |
---|
650 | |
---|
651 | SideEffects [] |
---|
652 | |
---|
653 | SeeAlso [] |
---|
654 | |
---|
655 | ******************************************************************************/ |
---|
656 | char * |
---|
657 | Var_VariableReadTypeIdentifier(Var_Variable_t *var) |
---|
658 | { |
---|
659 | return var->typeIdentifier; |
---|
660 | } |
---|
661 | |
---|
662 | |
---|
663 | /**Function******************************************************************** |
---|
664 | |
---|
665 | Synopsis [Returns a pointer to the user field of a variable.] |
---|
666 | |
---|
667 | Description [] |
---|
668 | |
---|
669 | SideEffects [] |
---|
670 | |
---|
671 | SeeAlso [] |
---|
672 | |
---|
673 | ******************************************************************************/ |
---|
674 | void * |
---|
675 | Var_VariableReadUndef(Var_Variable_t *var) |
---|
676 | { |
---|
677 | return var->undef; |
---|
678 | } |
---|
679 | |
---|
680 | /**Function******************************************************************** |
---|
681 | |
---|
682 | Synopsis [Changes the name of a variable.] |
---|
683 | |
---|
684 | Description [Changes the name of a variable. Returns 1 if success, otherwise |
---|
685 | returns 0.] |
---|
686 | |
---|
687 | SideEffects [] |
---|
688 | |
---|
689 | SeeAlso [] |
---|
690 | |
---|
691 | ******************************************************************************/ |
---|
692 | boolean |
---|
693 | Var_VariableChangeName( |
---|
694 | Var_Variable_t *var, |
---|
695 | char *name) |
---|
696 | { |
---|
697 | if (var->hnode != NIL(Hrc_Node_t)){ |
---|
698 | if (Hrc_NodeDeleteVariable(var->hnode,var) == 0){ |
---|
699 | /* this variable should have been in the hnode */ |
---|
700 | return 0; |
---|
701 | } |
---|
702 | } |
---|
703 | FREE(var->name); |
---|
704 | var->name = util_strsav(name); |
---|
705 | if (var->hnode != NIL(Hrc_Node_t)){ |
---|
706 | if (Hrc_NodeAddVariable(var->hnode,var) == 0){ |
---|
707 | /* there is a node with the new name in the hnode already */ |
---|
708 | return 0; |
---|
709 | } |
---|
710 | } |
---|
711 | return 1; |
---|
712 | } |
---|
713 | |
---|
714 | /**Function******************************************************************** |
---|
715 | |
---|
716 | Synopsis [Sets the PI-field of a variable.] |
---|
717 | |
---|
718 | Description [Sets the PI-field of a variable. Returns 1 upon success. |
---|
719 | Returns 0 if the variable is |
---|
720 | already set as a PI. Returns -1 if a type error occurs. This function is used when |
---|
721 | a variable is defined in .inputs *and* the variable is already declared |
---|
722 | in .mv. ] |
---|
723 | |
---|
724 | SideEffects [] |
---|
725 | |
---|
726 | SeeAlso [Var_VariableTestIsPI] |
---|
727 | |
---|
728 | ******************************************************************************/ |
---|
729 | int |
---|
730 | Var_VariableSetPI(Var_Variable_t *var) |
---|
731 | { |
---|
732 | return _VarVariableSetType(var,VarPI); |
---|
733 | } |
---|
734 | |
---|
735 | /**Function******************************************************************** |
---|
736 | |
---|
737 | Synopsis [Sets the PO-field of a variable.] |
---|
738 | |
---|
739 | Description [Sets the PO-field of a variable. Returns 1 upon success. |
---|
740 | Returns 0 if the variable is |
---|
741 | already set as a PO. Returns -1 if a type error occurs. This function is used when |
---|
742 | a variable is defined in .outputs *and* the variable is already declared |
---|
743 | in .mv. ] |
---|
744 | |
---|
745 | SideEffects [] |
---|
746 | |
---|
747 | SeeAlso [Var_VariableTestIsPO] |
---|
748 | |
---|
749 | ******************************************************************************/ |
---|
750 | int |
---|
751 | Var_VariableSetPO(Var_Variable_t *var) |
---|
752 | { |
---|
753 | return _VarVariableSetType(var,VarPO); |
---|
754 | } |
---|
755 | |
---|
756 | /**Function******************************************************************** |
---|
757 | |
---|
758 | Synopsis [Sets the PS-field of a variable.] |
---|
759 | |
---|
760 | Description [Sets the PS-field of a variable. Returns 1 upon success. |
---|
761 | Returns 0 if the variable is |
---|
762 | already set as a PS. Returns -1 if a type error occurs. This function is used when |
---|
763 | a variable is defined in .latch *and* the variable is already declared |
---|
764 | in .mv. ] |
---|
765 | |
---|
766 | SideEffects [] |
---|
767 | |
---|
768 | SeeAlso [Var_VariableTestIsPS] |
---|
769 | |
---|
770 | ******************************************************************************/ |
---|
771 | int |
---|
772 | Var_VariableSetPS(Var_Variable_t *var) |
---|
773 | { |
---|
774 | return _VarVariableSetType(var,VarPS); |
---|
775 | } |
---|
776 | |
---|
777 | /**Function******************************************************************** |
---|
778 | |
---|
779 | Synopsis [Sets the NS-field of a variable.] |
---|
780 | |
---|
781 | Description [Sets the NS-field of a variable. Returns 1 upon success. |
---|
782 | Returns 0 if the variable is |
---|
783 | already set as an NS. Returns -1 if a type error occurs. This function is used when |
---|
784 | a variable is defined in .latch *and* the variable is already declared |
---|
785 | in .mv. ] |
---|
786 | |
---|
787 | SideEffects [] |
---|
788 | |
---|
789 | SeeAlso [Var_VariableTestIsNS] |
---|
790 | |
---|
791 | ******************************************************************************/ |
---|
792 | int |
---|
793 | Var_VariableSetNS(Var_Variable_t *var) |
---|
794 | { |
---|
795 | return _VarVariableSetType(var,VarNS); |
---|
796 | } |
---|
797 | |
---|
798 | /**Function******************************************************************** |
---|
799 | |
---|
800 | Synopsis [Sets the SI-field of a variable.] |
---|
801 | |
---|
802 | Description [Sets the SI-field of a variable. Returns 1 upon success. |
---|
803 | Returns 0 if the variable is |
---|
804 | already set as an SI. Returns -1 if a type error occurs.] |
---|
805 | |
---|
806 | SideEffects [] |
---|
807 | |
---|
808 | SeeAlso [Var_VariableTestIsSI] |
---|
809 | |
---|
810 | ******************************************************************************/ |
---|
811 | int |
---|
812 | Var_VariableSetSI(Var_Variable_t *var) |
---|
813 | { |
---|
814 | return _VarVariableSetType(var,VarSI); |
---|
815 | } |
---|
816 | |
---|
817 | /**Function******************************************************************** |
---|
818 | |
---|
819 | Synopsis [Sets the SO-field of a variable.] |
---|
820 | |
---|
821 | Description [Sets the SO-field of a variable. Returns 1 upon success. |
---|
822 | Returns 0 if the variable is |
---|
823 | already set as an SO. Returns -1 if a type error occurs.] |
---|
824 | |
---|
825 | SideEffects [] |
---|
826 | |
---|
827 | SeeAlso [Var_VariableTestIsSO] |
---|
828 | |
---|
829 | ******************************************************************************/ |
---|
830 | int |
---|
831 | Var_VariableSetSO(Var_Variable_t *var) |
---|
832 | { |
---|
833 | return _VarVariableSetType(var,VarSO); |
---|
834 | } |
---|
835 | |
---|
836 | /**Function******************************************************************** |
---|
837 | |
---|
838 | Synopsis [Resets the PI-field of a variable.] |
---|
839 | |
---|
840 | Description [Resets the PI-field of a variable. Returns 1 upon success. |
---|
841 | Returns 0 if the variable is not set to PI. |
---|
842 | ] |
---|
843 | |
---|
844 | SideEffects [] |
---|
845 | |
---|
846 | SeeAlso [Var_VariableTestIsPI] |
---|
847 | |
---|
848 | ******************************************************************************/ |
---|
849 | int |
---|
850 | Var_VariableResetPI(Var_Variable_t *var) |
---|
851 | { |
---|
852 | return _VarVariableResetType(var,VarPI); |
---|
853 | } |
---|
854 | |
---|
855 | /**Function******************************************************************** |
---|
856 | |
---|
857 | Synopsis [Resets the PO-field of a variable.] |
---|
858 | |
---|
859 | Description [Resets the PO-field of a variable. Returns 1 upon success. |
---|
860 | Returns 0 if the variable is not set to PO. |
---|
861 | ] |
---|
862 | |
---|
863 | SideEffects [] |
---|
864 | |
---|
865 | SeeAlso [Var_VariableTestIsPO] |
---|
866 | |
---|
867 | ******************************************************************************/ |
---|
868 | int |
---|
869 | Var_VariableResetPO(Var_Variable_t *var) |
---|
870 | { |
---|
871 | return _VarVariableResetType(var,VarPO); |
---|
872 | } |
---|
873 | |
---|
874 | /**Function******************************************************************** |
---|
875 | |
---|
876 | Synopsis [Resets the PS-field of a variable.] |
---|
877 | |
---|
878 | Description [Resets the PS-field of a variable. Returns 1 upon success. |
---|
879 | Returns 0 if the variable is not set to PS. |
---|
880 | ] |
---|
881 | |
---|
882 | SideEffects [] |
---|
883 | |
---|
884 | SeeAlso [Var_VariableTestIsPS] |
---|
885 | |
---|
886 | ******************************************************************************/ |
---|
887 | int |
---|
888 | Var_VariableResetPS(Var_Variable_t *var) |
---|
889 | { |
---|
890 | return _VarVariableResetType(var,VarPS); |
---|
891 | } |
---|
892 | |
---|
893 | /**Function******************************************************************** |
---|
894 | |
---|
895 | Synopsis [Resets the NS-field of a variable.] |
---|
896 | |
---|
897 | Description [Resets the NS-field of a variable. Returns 1 upon success. |
---|
898 | Returns 0 if the variable is not set to NS. |
---|
899 | ] |
---|
900 | |
---|
901 | SideEffects [] |
---|
902 | |
---|
903 | SeeAlso [Var_VariableTestIsNS] |
---|
904 | |
---|
905 | ******************************************************************************/ |
---|
906 | int |
---|
907 | Var_VariableResetNS(Var_Variable_t *var) |
---|
908 | { |
---|
909 | return _VarVariableResetType(var,VarNS); |
---|
910 | } |
---|
911 | |
---|
912 | /**Function******************************************************************** |
---|
913 | |
---|
914 | Synopsis [Resets the SI-field of a variable.] |
---|
915 | |
---|
916 | Description [Resets the SI-field of a variable. Returns 1 upon success. |
---|
917 | Returns 0 if the variable is not set to SI. |
---|
918 | ] |
---|
919 | |
---|
920 | SideEffects [] |
---|
921 | |
---|
922 | SeeAlso [Var_VariableTestIsSI] |
---|
923 | |
---|
924 | ******************************************************************************/ |
---|
925 | int |
---|
926 | Var_VariableResetSI(Var_Variable_t *var) |
---|
927 | { |
---|
928 | return _VarVariableResetType(var,VarSI); |
---|
929 | } |
---|
930 | |
---|
931 | /**Function******************************************************************** |
---|
932 | |
---|
933 | Synopsis [Resets the SO-field of a variable.] |
---|
934 | |
---|
935 | Description [Resets the SO-field of a variable. Returns 1 upon success. |
---|
936 | Returns 0 if the variable is not set to SO. |
---|
937 | ] |
---|
938 | |
---|
939 | SideEffects [] |
---|
940 | |
---|
941 | SeeAlso [Var_VariableTestIsSO] |
---|
942 | |
---|
943 | ******************************************************************************/ |
---|
944 | int |
---|
945 | Var_VariableResetSO(Var_Variable_t *var) |
---|
946 | { |
---|
947 | return _VarVariableResetType(var,VarSO); |
---|
948 | } |
---|
949 | |
---|
950 | /**Function******************************************************************** |
---|
951 | |
---|
952 | Synopsis [Resets all the types of a variable.] |
---|
953 | |
---|
954 | Description [Resets all the types of a variable.] |
---|
955 | |
---|
956 | SideEffects [] |
---|
957 | |
---|
958 | SeeAlso [] |
---|
959 | |
---|
960 | ******************************************************************************/ |
---|
961 | void |
---|
962 | Var_VariableResetAllTypes(Var_Variable_t *var) |
---|
963 | { |
---|
964 | var->type = 0; |
---|
965 | } |
---|
966 | |
---|
967 | |
---|
968 | /**Function******************************************************************** |
---|
969 | |
---|
970 | Synopsis [Sets the type identifier for the variable.] |
---|
971 | |
---|
972 | Description [Sets the type identifier for the variable. Type identifiers are |
---|
973 | defined in blif-mv using the .type statement. |
---|
974 | Example: .type color red white blue |
---|
975 | .mv flag_colors type=color] |
---|
976 | |
---|
977 | SideEffects [] |
---|
978 | |
---|
979 | SeeAlso [] |
---|
980 | |
---|
981 | ******************************************************************************/ |
---|
982 | void |
---|
983 | Var_VariableSetTypeIdentifier( |
---|
984 | Var_Variable_t *var, |
---|
985 | char *typeIdentifier) |
---|
986 | { |
---|
987 | if (var->typeIdentifier != NIL(char)){ |
---|
988 | FREE(var->typeIdentifier); |
---|
989 | } |
---|
990 | var->typeIdentifier = util_strsav(typeIdentifier); |
---|
991 | } |
---|
992 | |
---|
993 | /**Function******************************************************************** |
---|
994 | |
---|
995 | Synopsis [Given two variables, checks to see if the two variables refer |
---|
996 | to the identical signal once a hierarchy is flattened out. Returns 1 if |
---|
997 | they are identical. Otherwise returns 0. If the two variables do not |
---|
998 | belong to the same hierarchy manager, it also returns 0 with an error |
---|
999 | message sent to error_string.] |
---|
1000 | |
---|
1001 | Description [] |
---|
1002 | |
---|
1003 | SideEffects [] |
---|
1004 | |
---|
1005 | SeeAlso [] |
---|
1006 | |
---|
1007 | ******************************************************************************/ |
---|
1008 | boolean |
---|
1009 | Var_VariablesTestIdentical( |
---|
1010 | Var_Variable_t *var1, |
---|
1011 | Var_Variable_t *var2) |
---|
1012 | { |
---|
1013 | Hrc_Manager_t *hmgr1, *hmgr2; |
---|
1014 | Hrc_Node_t *hnode1, *hnode2, *rootNode; |
---|
1015 | Var_Variable_t *varCanonical1, *varCanonical2; |
---|
1016 | |
---|
1017 | hnode1 = Var_VariableReadHnode(var1); |
---|
1018 | hnode2 = Var_VariableReadHnode(var2); |
---|
1019 | hmgr1 = Hrc_NodeReadManager(hnode1); |
---|
1020 | hmgr2 = Hrc_NodeReadManager(hnode2); |
---|
1021 | |
---|
1022 | if (hmgr1 != hmgr2){ |
---|
1023 | error_append("Error: Variables "); |
---|
1024 | error_append(Var_VariableReadName(var1)); |
---|
1025 | error_append(" and "); |
---|
1026 | error_append(Var_VariableReadName(var2)); |
---|
1027 | error_append(" are not under the same manager.\n"); |
---|
1028 | return 0; |
---|
1029 | } |
---|
1030 | /* if two variables reside in the same hnode */ |
---|
1031 | if (hnode1 == hnode2){ |
---|
1032 | if (var1 == var2){ |
---|
1033 | return 1; |
---|
1034 | } |
---|
1035 | return 0; |
---|
1036 | } |
---|
1037 | |
---|
1038 | /* otherwise */ |
---|
1039 | rootNode = Hrc_ManagerReadRootNode(hmgr1); |
---|
1040 | |
---|
1041 | varCanonical1 = Hrc_VariableFindActualFromFormal(hnode1,var1,rootNode); |
---|
1042 | varCanonical2 = Hrc_VariableFindActualFromFormal(hnode2,var2,rootNode); |
---|
1043 | if (varCanonical1 == varCanonical2){ |
---|
1044 | return 1; |
---|
1045 | } |
---|
1046 | return 0; |
---|
1047 | } |
---|
1048 | |
---|
1049 | |
---|
1050 | /**Function******************************************************************** |
---|
1051 | |
---|
1052 | Synopsis [Checks to see if two variables are defined over the same domain.] |
---|
1053 | |
---|
1054 | Description [] |
---|
1055 | |
---|
1056 | SideEffects [] |
---|
1057 | |
---|
1058 | SeeAlso [] |
---|
1059 | |
---|
1060 | ******************************************************************************/ |
---|
1061 | boolean |
---|
1062 | Var_VariablesTestHaveSameDomain( |
---|
1063 | Var_Variable_t *var1, |
---|
1064 | Var_Variable_t *var2) |
---|
1065 | { |
---|
1066 | array_t *indexToValue1, *indexToValue2; |
---|
1067 | char *value1, *value2; |
---|
1068 | int i; |
---|
1069 | |
---|
1070 | if (var1->numValues != var2->numValues) |
---|
1071 | return 0; |
---|
1072 | indexToValue1 = var1->indexToValue; |
---|
1073 | indexToValue2 = var2->indexToValue; |
---|
1074 | if (indexToValue1 == NIL(array_t) || indexToValue2 == NIL(array_t)) |
---|
1075 | return 1; |
---|
1076 | for (i=0; i < array_n(indexToValue1); i++){ |
---|
1077 | value1 = array_fetch(char *,indexToValue1,i); |
---|
1078 | value2 = array_fetch(char *,indexToValue2,i); |
---|
1079 | if (strcmp(value1,value2)){ |
---|
1080 | return 0; |
---|
1081 | } |
---|
1082 | } |
---|
1083 | return 1; |
---|
1084 | } |
---|
1085 | |
---|
1086 | /**Function******************************************************************** |
---|
1087 | |
---|
1088 | Synopsis [Checks to see if there is no type violation. Returns 1 if |
---|
1089 | no violation exists. Otherwise returns 0.] |
---|
1090 | |
---|
1091 | Description [] |
---|
1092 | |
---|
1093 | SideEffects [] |
---|
1094 | |
---|
1095 | SeeAlso [] |
---|
1096 | |
---|
1097 | ******************************************************************************/ |
---|
1098 | boolean |
---|
1099 | Var_VariableTestTypeConsistency(Var_Variable_t *var) |
---|
1100 | { |
---|
1101 | /* checking PI/PO */ |
---|
1102 | if ((var->type & 03) == 03){ |
---|
1103 | error_append("Error: Variable "); |
---|
1104 | error_append(Var_VariableReadName(var)); |
---|
1105 | error_append(" is of type PI/PO.\n"); |
---|
1106 | return 0; |
---|
1107 | } |
---|
1108 | /* checking PI/PS */ |
---|
1109 | if ((var->type & 05) == 05){ |
---|
1110 | error_append("Error: Variable "); |
---|
1111 | error_append(Var_VariableReadName(var)); |
---|
1112 | error_append(" is of type PI/PS.\n"); |
---|
1113 | return 0; |
---|
1114 | } |
---|
1115 | /* checking PI/SO */ |
---|
1116 | if ((var->type & 041) == 041){ |
---|
1117 | error_append("Error: Variable "); |
---|
1118 | error_append(Var_VariableReadName(var)); |
---|
1119 | error_append(" is of type PI/SO.\n"); |
---|
1120 | return 0; |
---|
1121 | } |
---|
1122 | return 1; |
---|
1123 | } |
---|
1124 | |
---|
1125 | /**Function******************************************************************** |
---|
1126 | |
---|
1127 | Synopsis [Checks to see if two variables have the same type identifier] |
---|
1128 | |
---|
1129 | Description [Returns 1 if var1 and var2 have the same type identifier, |
---|
1130 | 0 otherwise.] |
---|
1131 | |
---|
1132 | SideEffects [] |
---|
1133 | |
---|
1134 | SeeAlso [] |
---|
1135 | |
---|
1136 | ******************************************************************************/ |
---|
1137 | boolean |
---|
1138 | Var_VariablesTestHaveSameTypeIdentifier( |
---|
1139 | Var_Variable_t *var1, |
---|
1140 | Var_Variable_t *var2) |
---|
1141 | { |
---|
1142 | if (var1->typeIdentifier == NIL(char) && var2->typeIdentifier == NIL(char)){ |
---|
1143 | return 1; |
---|
1144 | } |
---|
1145 | if (var1->typeIdentifier == NIL(char) || var2->typeIdentifier == NIL(char)){ |
---|
1146 | return 0; |
---|
1147 | } |
---|
1148 | if (strcmp(var1->typeIdentifier,var2->typeIdentifier) == 0 ){ |
---|
1149 | return 1; |
---|
1150 | } |
---|
1151 | return 0; |
---|
1152 | } |
---|
1153 | |
---|
1154 | |
---|
1155 | /*---------------------------------------------------------------------------*/ |
---|
1156 | /* Definition of internal functions */ |
---|
1157 | /*---------------------------------------------------------------------------*/ |
---|
1158 | |
---|
1159 | /*---------------------------------------------------------------------------*/ |
---|
1160 | /* Definition of static functions */ |
---|
1161 | /*---------------------------------------------------------------------------*/ |
---|
1162 | |
---|
1163 | /**Function******************************************************************** |
---|
1164 | |
---|
1165 | Synopsis [Sets the type field of a variable. Returns 0 if the variable is |
---|
1166 | already set as a given type. If the variable is newly set to the type, it |
---|
1167 | returns 1. If a type violation occurs after this setting, -1 is returned. |
---|
1168 | Type can be set either VarPI, VarPO, VarPS, VarNS, VarSI and VarSO.] |
---|
1169 | |
---|
1170 | Description [] |
---|
1171 | |
---|
1172 | SideEffects [] |
---|
1173 | |
---|
1174 | SeeAlso [] |
---|
1175 | |
---|
1176 | ******************************************************************************/ |
---|
1177 | static int |
---|
1178 | _VarVariableSetType(Var_Variable_t *var,int type) |
---|
1179 | { |
---|
1180 | /* |
---|
1181 | if (var->type & type){ |
---|
1182 | error_append("Warning: Variable "); |
---|
1183 | error_append(Var_VariableReadName(var)); |
---|
1184 | error_append(" is already set to "); |
---|
1185 | error_append(_VarTypeDecode(type)); |
---|
1186 | error_append(".\n"); |
---|
1187 | return 0; |
---|
1188 | } |
---|
1189 | */ |
---|
1190 | var->type |= type; |
---|
1191 | if (Var_VariableTestTypeConsistency(var) == 0){ |
---|
1192 | return -1; |
---|
1193 | } |
---|
1194 | return 1; |
---|
1195 | } |
---|
1196 | |
---|
1197 | /**Function******************************************************************** |
---|
1198 | |
---|
1199 | Synopsis [Resets the type field of a variable. Returns 0 if the variable is |
---|
1200 | not set as a given type, i.e. there is no need for resetting the type. |
---|
1201 | Otherwise, returns 1. |
---|
1202 | Type can be set either VarPI, VarPO, VarPS, VarNS, VarSI and VarSO.] |
---|
1203 | |
---|
1204 | Description [] |
---|
1205 | |
---|
1206 | SideEffects [] |
---|
1207 | |
---|
1208 | SeeAlso [] |
---|
1209 | |
---|
1210 | ******************************************************************************/ |
---|
1211 | static int |
---|
1212 | _VarVariableResetType(Var_Variable_t *var,int type) |
---|
1213 | { |
---|
1214 | /* |
---|
1215 | if (var->type & type){ |
---|
1216 | error_append("Warning: Variable "); |
---|
1217 | error_append(Var_VariableReadName(var)); |
---|
1218 | error_append(" is already set to "); |
---|
1219 | error_append(_VarTypeDecode(type)); |
---|
1220 | error_append(".\n"); |
---|
1221 | return 0; |
---|
1222 | } |
---|
1223 | */ |
---|
1224 | if ((var->type & type) == 0){ |
---|
1225 | return 0; |
---|
1226 | } |
---|
1227 | var->type &= ~type; |
---|
1228 | return 1; |
---|
1229 | } |
---|
1230 | |
---|
1231 | /**Function******************************************************************** |
---|
1232 | |
---|
1233 | Synopsis [Returns the character string corresponding to a type encoded |
---|
1234 | in an integer. Note that SI and SO are filtered out.] |
---|
1235 | |
---|
1236 | Description [] |
---|
1237 | |
---|
1238 | SideEffects [] |
---|
1239 | |
---|
1240 | SeeAlso [] |
---|
1241 | |
---|
1242 | ******************************************************************************/ |
---|
1243 | static char * |
---|
1244 | _VarTypeDecode(int type) |
---|
1245 | { |
---|
1246 | /* suppress information on SI/SO for simplicity */ |
---|
1247 | type &= 017; |
---|
1248 | switch(type){ |
---|
1249 | case 00: |
---|
1250 | return "Internal"; |
---|
1251 | case 01: |
---|
1252 | return "PI"; |
---|
1253 | case 02: |
---|
1254 | return "PO"; |
---|
1255 | case 03: |
---|
1256 | error_append("Error: Strange type PI/PO.\n"); |
---|
1257 | return "PI/PO"; |
---|
1258 | case 04: |
---|
1259 | return "PS"; |
---|
1260 | case 05: |
---|
1261 | error_append("Error: Strange type PI/PS.\n"); |
---|
1262 | return "PI/PS"; |
---|
1263 | case 06: |
---|
1264 | return "PO/PS"; |
---|
1265 | case 07: |
---|
1266 | error_append("Error: Strange type PI/PO/PS.\n"); |
---|
1267 | return "PI/PO/PS"; |
---|
1268 | case 010: |
---|
1269 | return "NS"; |
---|
1270 | case 011: |
---|
1271 | return "PI/NS"; |
---|
1272 | case 012: |
---|
1273 | return "PO/NS"; |
---|
1274 | case 013: |
---|
1275 | error_append("Error: Strange type PI/PO/NS.\n"); |
---|
1276 | return "PI/PO/NS"; |
---|
1277 | case 014: |
---|
1278 | return "PS/NS"; |
---|
1279 | case 015: |
---|
1280 | error_append("Error: Strange type PI/PS/NS.\n"); |
---|
1281 | return "PI/PS/NS"; |
---|
1282 | case 016: |
---|
1283 | return "PO/PS/NS"; |
---|
1284 | case 017: |
---|
1285 | error_append("Error: Strange type PI/PO/PS/NS.\n"); |
---|
1286 | return "PI/PO/PS/NS"; |
---|
1287 | default: |
---|
1288 | fail("Strange type in VarTypeDecode().\n"); |
---|
1289 | return NIL(char); /* not reached */ |
---|
1290 | } |
---|
1291 | } |
---|
1292 | |
---|
1293 | /**Function******************************************************************** |
---|
1294 | |
---|
1295 | Synopsis [Duplicates an array of strings.] |
---|
1296 | |
---|
1297 | Description [Duplicates an array of strings. Strings themselves are also |
---|
1298 | copied over to the new array.] |
---|
1299 | |
---|
1300 | SideEffects [] |
---|
1301 | |
---|
1302 | SeeAlso [] |
---|
1303 | |
---|
1304 | ******************************************************************************/ |
---|
1305 | static array_t * |
---|
1306 | _VarStringArrayDup(array_t *array) |
---|
1307 | { |
---|
1308 | int i; |
---|
1309 | char *symbol,*newSymbol; |
---|
1310 | array_t *newArray; |
---|
1311 | |
---|
1312 | newArray = array_alloc(char *,0); |
---|
1313 | for (i=0; i < array_n(array); i++) { |
---|
1314 | symbol = array_fetch(char *, array, i); |
---|
1315 | newSymbol = util_strsav(symbol); |
---|
1316 | array_insert_last(char *,newArray,newSymbol); |
---|
1317 | } |
---|
1318 | return newArray; |
---|
1319 | } |
---|
1320 | |
---|
1321 | /**Function******************************************************************** |
---|
1322 | |
---|
1323 | Synopsis [Frees an array of strings.] |
---|
1324 | |
---|
1325 | Description [Frees an array of strings. Strings themselves are also |
---|
1326 | freed.] |
---|
1327 | |
---|
1328 | SideEffects [] |
---|
1329 | |
---|
1330 | SeeAlso [] |
---|
1331 | |
---|
1332 | ******************************************************************************/ |
---|
1333 | static void |
---|
1334 | _VarStringArrayFree(array_t *array) |
---|
1335 | { |
---|
1336 | int i; |
---|
1337 | char *symbol; |
---|
1338 | |
---|
1339 | for (i=0; i < array_n(array); i++) { |
---|
1340 | symbol = array_fetch(char *, array, i); |
---|
1341 | FREE(symbol); |
---|
1342 | } |
---|
1343 | array_free(array); |
---|
1344 | } |
---|