1 /*------------------------------------------------------------\
2 |                                                             |
3 | Tool    :                     RDS                           |
4 |                                                             |
5 | File    :                  rdsalloc.c                       |
6 |                                                             |
7 | Authors :                Jacomme Ludovic                    |
8 |                                                             |
9 | Date    :                   27.06.95                        |
10 |                                                             |
11 \------------------------------------------------------------*/
12 /*------------------------------------------------------------\
13 |                                                             |
14 |                         Include Files                       |
15 |                                                             |
16 \------------------------------------------------------------*/
17 
18 # include <stdio.h>
19 # include <stdlib.h>
20 # include <memory.h>
21 # include <string.h>
22 
23 # include <mut.h>
24 # include "rds.h"
25 
26 # include "rdsalloc.h"
27 # include "rdserror.h"
28 
29 /*------------------------------------------------------------\
30 |                                                             |
31 |                           Constants                         |
32 |                                                             |
33 \------------------------------------------------------------*/
34 /*------------------------------------------------------------\
35 |                                                             |
36 |                            Types                            |
37 |                                                             |
38 \------------------------------------------------------------*/
39 /*------------------------------------------------------------\
40 |                                                             |
41 |                          Variables                          |
42 |                                                             |
43 \------------------------------------------------------------*/
44 /*------------------------------------------------------------\
45 |                                                             |
46 |                           Head List                         |
47 |                                                             |
48 \------------------------------------------------------------*/
49 
50   rdsfig_list *HEAD_RDSFIG = (rdsfig_list *)NULL;
51 
52 /*------------------------------------------------------------\
53 |                                                             |
54 |                            Name                             |
55 |                                                             |
56 \------------------------------------------------------------*/
57 
58   char *RDS_ALL_LAYER_NAME[ RDS_ALL_LAYER ] =
59 
60      {
61        "RDS_NWELL",
62        "RDS_PWELL",
63        "RDS_NIMP",
64        "RDS_PIMP",
65        "RDS_ACTIV",
66        "RDS_NDIF",
67        "RDS_PDIF",
68        "RDS_NTIE",
69        "RDS_PTIE",
70        "RDS_POLY",
71        "RDS_GATE",
72        "RDS_VPOLY",
73        "RDS_TPOLY",
74        "RDS_POLY2",
75        "RDS_CONT",
76        "RDS_TPOLY2",
77        "RDS_TCONT",
78        "RDS_CONT2",
79        "RDS_ALU1",
80        "RDS_VALU1",
81        "RDS_TALU1",
82        "RDS_VIA1",
83        "RDS_TVIA1",
84        "RDS_ALU2",
85        "RDS_VALU2",
86        "RDS_TALU2",
87        "RDS_VIA2",
88        "RDS_TVIA2",
89        "RDS_ALU3",
90        "RDS_VALU3",
91        "RDS_TALU3",
92        "RDS_VIA3",
93        "RDS_TVIA3",
94        "RDS_ALU4",
95        "RDS_VALU4",
96        "RDS_TALU4",
97        "RDS_VIA4",
98        "RDS_TVIA4",
99        "RDS_ALU5",
100        "RDS_VALU5",
101        "RDS_TALU5",
102        "RDS_VIA5",
103        "RDS_TVIA5",
104        "RDS_ALU6",
105        "RDS_VALU6",
106        "RDS_TALU6",
107        "RDS_VIA6",
108        "RDS_TVIA6",
109        "RDS_ALU7",
110        "RDS_VALU7",
111        "RDS_TALU7",
112        "RDS_VIA7",
113        "RDS_TVIA7",
114        "RDS_ALU8",
115        "RDS_VALU8",
116        "RDS_TALU8",
117        "RDS_VIA8",
118        "RDS_TVIA8",
119        "RDS_ALU9",
120        "RDS_CPAS",
121        "RDS_REF",
122        "RDS_USER0",
123        "RDS_USER1",
124        "RDS_USER2",
125        "RDS_USER3",
126        "RDS_USER4",
127        "RDS_USER5",
128        "RDS_USER6",
129        "RDS_USER7",
130        "RDS_USER8",
131        "RDS_USER9",
132        "RDS_ABOX"
133      };
134 
135   char *RDS_TRANSF_NAME [ RDS_MAX_TRANSF ] =
136 
137      {
138        "NOSYM",
139        "ROT_P",
140        "SYMXY",
141        "ROT_M",
142        "SYM_X",
143        "SY_RM",
144        "SYM_Y",
145        "SY_RP"
146      };
147 
148   char **RDS_LAYER_NAME = RDS_ALL_LAYER_NAME;
149 
150 /*------------------------------------------------------------\
151 |                                                             |
152 |                          Dynamic Layers                     |
153 |                                                             |
154 \------------------------------------------------------------*/
155 
156   unsigned char RDS_DYNAMIC_LAYER[ RDS_ALL_LAYER ] =
157 
158     {
159       RDS_LAYER_NWELL,
160       RDS_LAYER_PWELL,
161       RDS_LAYER_NIMP ,
162       RDS_LAYER_PIMP ,
163       RDS_LAYER_ACTIV,
164       RDS_LAYER_NDIF ,
165       RDS_LAYER_PDIF ,
166       RDS_LAYER_NTIE ,
167       RDS_LAYER_PTIE ,
168       RDS_LAYER_POLY ,
169       RDS_LAYER_GATE ,
170       RDS_LAYER_VPOLY,
171       RDS_LAYER_TPOLY,
172       RDS_LAYER_POLY2,
173       RDS_LAYER_CONT ,
174       RDS_LAYER_TPOLY2,
175       RDS_LAYER_TCONT,
176       RDS_LAYER_CONT2,
177       RDS_LAYER_ALU1 ,
178       RDS_LAYER_VALU1,
179       RDS_LAYER_TALU1,
180       RDS_LAYER_VIA1 ,
181       RDS_LAYER_TVIA1,
182       RDS_LAYER_ALU2 ,
183       RDS_LAYER_VALU2,
184       RDS_LAYER_TALU2,
185       RDS_LAYER_VIA2 ,
186       RDS_LAYER_TVIA2,
187       RDS_LAYER_ALU3 ,
188       RDS_LAYER_VALU3,
189       RDS_LAYER_TALU3,
190       RDS_LAYER_VIA3 ,
191       RDS_LAYER_TVIA3,
192       RDS_LAYER_ALU4 ,
193       RDS_LAYER_VALU4,
194       RDS_LAYER_TALU4,
195       RDS_LAYER_VIA4 ,
196       RDS_LAYER_TVIA4,
197       RDS_LAYER_ALU5 ,
198       RDS_LAYER_VALU5,
199       RDS_LAYER_TALU5,
200       RDS_LAYER_VIA5 ,
201       RDS_LAYER_TVIA5,
202       RDS_LAYER_ALU6 ,
203       RDS_LAYER_VALU6,
204       RDS_LAYER_TALU6,
205       RDS_LAYER_VIA6 ,
206       RDS_LAYER_TVIA6,
207       RDS_LAYER_ALU7 ,
208       RDS_LAYER_VALU7,
209       RDS_LAYER_TALU7,
210       RDS_LAYER_VIA7 ,
211       RDS_LAYER_TVIA7,
212       RDS_LAYER_ALU8 ,
213       RDS_LAYER_VALU8,
214       RDS_LAYER_TALU8,
215       RDS_LAYER_VIA8 ,
216       RDS_LAYER_TVIA8,
217       RDS_LAYER_ALU9 ,
218       RDS_LAYER_CPAS ,
219       RDS_LAYER_REF  ,
220       RDS_LAYER_USER0,
221       RDS_LAYER_USER1,
222       RDS_LAYER_USER2,
223       RDS_LAYER_USER3,
224       RDS_LAYER_USER4,
225       RDS_LAYER_USER5,
226       RDS_LAYER_USER6,
227       RDS_LAYER_USER7,
228       RDS_LAYER_USER8,
229       RDS_LAYER_USER9,
230       RDS_LAYER_ABOX
231     };
232 
233   unsigned char *RDS_STATIC_LAYER = RDS_DYNAMIC_LAYER;
234   unsigned char  RDS_MAX_LAYER = RDS_ALL_LAYER;
235 
236 /*------------------------------------------------------------\
237 |                                                             |
238 |                         Alloc Heap                          |
239 |                                                             |
240 \------------------------------------------------------------*/
241 
242          char  *RdsHeapHeadArray[ 256 ];
243   static char   InitRdsHeapHeadArray = 1;
244 
245 /*------------------------------------------------------------\
246 |                                                             |
247 |                          Functions                          |
248 |                                                             |
249 \------------------------------------------------------------*/
250 /*------------------------------------------------------------\
251 |                                                             |
252 |                       Alloc Functions                       |
253 |                                                             |
254 \------------------------------------------------------------*/
255 /*------------------------------------------------------------\
256 |                                                             |
257 |                          Rds Alloc                          |
258 |                                                             |
259 \------------------------------------------------------------*/
260 
rdsalloc(Size,Heap)261 char *rdsalloc( Size, Heap )
262 
263       unsigned long Size;
264       char          Heap;
265 {
266   long          Counter;
267   unsigned long Index;
268   char         *Pointer;
269   char        **Prev;
270   char         *Scan;
271 
272   if ( InitRdsHeapHeadArray == 1 )
273   {
274     InitRdsHeapHeadArray = 0;
275 
276     for ( Counter = 0; Counter < 256 ; Counter++ )
277     {
278       RdsHeapHeadArray[ Counter ] = (char *)NULL;
279     }
280   }
281 
282   Index = ( Size + 3 ) >> 2;
283 
284   if ( ( Heap    == RDS_ALLOC_BLOCK ) ||
285        ( Index   >  255             ) )
286   {
287     if ( !( Pointer = malloc( Size ) ) )
288     {
289       rdserror( RDS_ALLOC_ERROR, (char *)NULL );
290     }
291 
292     bzero( Pointer, Size );
293 
294     return( Pointer );
295   }
296 
297   Size = Index << 2;
298 
299   if ( RdsHeapHeadArray[ Index ] == (char *)NULL )
300   {
301     if ( !( Pointer = malloc( Size << RDS_ALLOC_SHIFT ) ) )
302     {
303       rdserror( RDS_ALLOC_ERROR, (char *)NULL );
304     }
305 
306     Scan = (char *)(Pointer + Size);
307 
308     Prev = &RdsHeapHeadArray[ Index ];
309 
310     for ( Counter = 1; Counter < RDS_ALLOC_SIZE; Counter++ )
311     {
312       *Prev = Scan; Prev = (char **)Scan; Scan = (char *)(Scan + Size);
313     }
314 
315     *Prev = (char *)NULL;
316 
317     RdsHeapHeadArray[ Index ] = (char *)(Pointer + Size);
318 
319     bzero( Pointer, Size );
320 
321     return( Pointer );
322   }
323 
324   Pointer = RdsHeapHeadArray[ Index ];
325 
326   RdsHeapHeadArray[ Index ] = *((char **)RdsHeapHeadArray[ Index ]);
327 
328   bzero( Pointer, Size );
329 
330   return( Pointer );
331 }
332 
333 /*------------------------------------------------------------\
334 |                                                             |
335 |                        Rds Alloc Figure                     |
336 |                                                             |
337 \------------------------------------------------------------*/
338 
allocrdsfig()339 rdsfig_list *allocrdsfig()
340 {
341   rdsfig_list *Figure;
342   void        *Pointer;
343 
344   Figure  = (rdsfig_list *)rdsallocblock( sizeof( rdsfig_list) );
345   Pointer = (void *)rdsallocblock( sizeof(rdsrec_list *) * RDS_MAX_LAYER );
346   Figure->LAYERTAB = (rdsrec_list **)Pointer;
347   Pointer = (void *)rdsallocblock( sizeof(rdsrec_list *) * RDS_MAX_LAYER );
348   Figure->BBOXTAB  = (rdsrec_list **)Pointer;
349   Pointer = (void *)rdsallocblock( sizeof( char ) * RDS_MAX_LAYER );
350   Figure->FLAGTAB  = (char *)Pointer;
351 
352   return( Figure );
353 }
354 
355 /*------------------------------------------------------------\
356 |                                                             |
357 |                       Rds Alloc Instance                    |
358 |                                                             |
359 \------------------------------------------------------------*/
360 
allocrdsins()361 rdsins_list *allocrdsins()
362 {
363   rdsins_list *Instance;
364   void        *Pointer;
365 
366   Instance = (rdsins_list *)rdsallocblock( sizeof( rdsins_list ) );
367   Pointer = (void *)rdsallocblock( sizeof(rdsrec_list *) * RDS_MAX_LAYER );
368   Instance->LAYERTAB = (rdsrec_list **)Pointer;
369   Pointer = (void *)rdsallocblock( sizeof(rdsrec_list *) * RDS_MAX_LAYER );
370   Instance->COURONNE = (rdsrec_list **)Pointer;
371 
372   return( Instance );
373 }
374 
375 /*------------------------------------------------------------\
376 |                                                             |
377 |                     Rds Alloc Rectangle                     |
378 |                                                             |
379 \------------------------------------------------------------*/
380 
allocrdsrec(Size)381 rdsrec_list *allocrdsrec( Size )
382 
383    unsigned long Size;
384 {
385   return( (rdsrec_list *)( rdsallocheap( sizeof( rdsrec_list ) + Size ) ) );
386 }
387