1 /*------------------------------------------------------------\
2 | |
3 | This file is part of the Alliance CAD System Copyright |
4 | (C) Laboratoire LIP6 - D�partement ASIM Universite P&M Curie|
5 | |
6 | Home page : http://www-asim.lip6.fr/alliance/ |
7 | E-mail : mailto:alliance-users@asim.lip6.fr |
8 | |
9 | This progam is free software; you can redistribute it |
10 | and/or modify it under the terms of the GNU General Public |
11 | License as published by the Free Software Foundation; |
12 | either version 2 of the License, or (at your option) any |
13 | later version. |
14 | |
15 | Alliance VLSI CAD System is distributed in the hope that |
16 | it will be useful, but WITHOUT ANY WARRANTY; |
17 | without even the implied warranty of MERCHANTABILITY or |
18 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General |
19 | Public License for more details. |
20 | |
21 | You should have received a copy of the GNU General Public |
22 | License along with the GNU C Library; see the file COPYING. |
23 | If not, write to the Free Software Foundation, Inc., |
24 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
25 | |
26 \------------------------------------------------------------*/
27
28 /*------------------------------------------------------------\
29 | |
30 | File : Peek.c |
31 | |
32 | Author : Jacomme Ludovic |
33 | |
34 | Date : 28.03.95 |
35 | |
36 \------------------------------------------------------------*/
37 /*------------------------------------------------------------\
38 | |
39 | Include Files |
40 | |
41 \------------------------------------------------------------*/
42
43 # include <stdio.h>
44 # include "mut.h"
45 # include "mph.h"
46 # include "rds.h"
47 # include "rpr.h"
48 # include "rfm.h"
49 # include "GRM.h"
50 # include "GSB.h"
51 # include "GRM_peek.h"
52 # include "GRM_window.h"
53
54 /*------------------------------------------------------------\
55 | |
56 | Variables |
57 | |
58 \------------------------------------------------------------*/
59
60 graalpeek *GraalHeadPeek = (graalpeek *)0;
61
62 /*------------------------------------------------------------\
63 | |
64 | Functions |
65 | |
66 \------------------------------------------------------------*/
67 /*------------------------------------------------------------\
68 | |
69 | Alloc Functions |
70 | |
71 \------------------------------------------------------------*/
72 /*------------------------------------------------------------\
73 | |
74 | GraalAllocPeek |
75 | |
76 \------------------------------------------------------------*/
77
GraalAllocPeek()78 graalpeek *GraalAllocPeek()
79 {
80 return((graalpeek *)rdsalloc(sizeof(graalpeek), 1));
81 }
82
83 /*------------------------------------------------------------\
84 | |
85 | Free Functions |
86 | |
87 \------------------------------------------------------------*/
88 /*------------------------------------------------------------\
89 | |
90 | GraalFreePeek |
91 | |
92 \------------------------------------------------------------*/
93
GraalFreePeek(FreePeek)94 void GraalFreePeek( FreePeek )
95
96 graalpeek *FreePeek;
97 {
98 rdsfree((char *)FreePeek, sizeof(graalpeek));
99 }
100
101 /*------------------------------------------------------------\
102 | |
103 | GraalAddPeek |
104 | |
105 \------------------------------------------------------------*/
106
GraalAddPeek(Rectangle)107 void GraalAddPeek( Rectangle )
108
109 rdsrec_list *Rectangle;
110 {
111 graalpeek *Peek;
112
113 rdsbegin();
114
115 Peek = GraalAllocPeek();
116
117 Peek->RECTANGLE = Rectangle;
118 Peek->NEXT = GraalHeadPeek;
119 GraalHeadPeek = Peek;
120
121 SetGraalPeek( Rectangle );
122
123 rdsend();
124 }
125
126 /*------------------------------------------------------------\
127 | |
128 | GraalDelPeek |
129 | |
130 \------------------------------------------------------------*/
131
GraalDelPeek()132 void GraalDelPeek()
133
134 {
135 graalpeek *Peek;
136 rdsins_list *Instance;
137 rdsrec_list *ScanRec;
138 rdsrec_list *DelRec;
139 rdsrec_list **Previous;
140 char Layer;
141
142 rdsbegin();
143
144 while ( GraalHeadPeek != (graalpeek *)0 )
145 {
146 Peek = GraalHeadPeek;
147 ScanRec = Peek->RECTANGLE;
148
149 ClearGraalPeek( ScanRec );
150
151 Instance = (rdsins_list *)GRAAL_PREVIOUS( ScanRec );
152
153 for ( Layer = 0; Layer < RDS_ABOX; Layer++ )
154 {
155 Previous = &Instance->LAYERTAB[ (int)Layer ];
156 ScanRec = *Previous;
157
158 while( ScanRec != (rdsrec_list *)0 )
159 {
160 DelRec = ScanRec;
161 ScanRec = ScanRec->NEXT;
162
163 if ( IsGraalPeek( DelRec ) )
164 {
165 *Previous = ScanRec;
166
167 GraalEraseRectangle( DelRec );
168
169 freerdsrec( DelRec, GRAAL_SIZE );
170 }
171 else
172 {
173 Previous = &DelRec->NEXT;
174 }
175 }
176 }
177
178 GraalHeadPeek = GraalHeadPeek->NEXT;
179
180 GraalFreePeek( Peek );
181 }
182
183 rdsend();
184 }
185
186 /*------------------------------------------------------------\
187 | |
188 | Graal Peek Instance |
189 | |
190 \------------------------------------------------------------*/
191
GraalPeekInstance(Rectangle,LambdaX1,LambdaY1,LambdaX2,LambdaY2)192 void GraalPeekInstance( Rectangle, LambdaX1, LambdaY1, LambdaX2, LambdaY2 )
193
194 rdsrec_list *Rectangle;
195 long LambdaX1;
196 long LambdaY1;
197 long LambdaX2;
198 long LambdaY2;
199 {
200 phfig_list *ModelMbk;
201 phfig_list *FigureMbk;
202
203 phins_list *InstanceMbk;
204 phins_list *SourceMbk;
205 phins_list **PreviousMbk;
206
207 rdsfig_list *FigureRds;
208 rdsins_list *TargetRds;
209 rdsrec_list *ScanRec;
210 rdsrec_list *DelRec;
211 void *Pointer;
212 void *Delete;
213 long X1;
214 long Y1;
215 long X2;
216 long Y2;
217 long Xab1;
218 long Yab1;
219 long Xab2;
220 long Yab2;
221 long XabMin;
222 long YabMin;
223 long XabMax;
224 long YabMax;
225 long Swap;
226 char Layer;
227
228 rdsbegin();
229
230 XabMin = LambdaX1 - GRAAL_PEEK_BOUND;
231 YabMin = LambdaY1 - GRAAL_PEEK_BOUND;
232 XabMax = LambdaX2 + GRAAL_PEEK_BOUND;
233 YabMax = LambdaY2 + GRAAL_PEEK_BOUND;
234
235 FigureRds = addrdsfig( "_ludo_", GRAAL_SIZE );
236 FigureMbk = addphfig( "_ludo_" );
237 SourceMbk = (phins_list *)GRAAL_MBK( Rectangle );
238 TargetRds = (rdsins_list *)GRAAL_PREVIOUS( Rectangle );
239
240 InstanceMbk = addphins( FigureMbk,
241 SourceMbk->FIGNAME, SourceMbk->INSNAME,
242 SourceMbk->TRANSF,
243 SourceMbk->XINS, SourceMbk->YINS );
244 do
245 {
246 Pointer = (void *)
247
248 Graalflattenphfig( FigureMbk, FigureMbk->PHINS->INSNAME, YES );
249
250 if ( Pointer == (void *)0 ) break;
251
252 Pointer = (void *)FigureMbk->PHSEG;
253 FigureMbk->PHSEG = (phseg_list *)0;
254
255 while( Pointer != (void *)0 )
256 {
257 Delete = Pointer;
258 Pointer = ((phseg_list *)Pointer)->NEXT;
259
260 segmbkrds( FigureRds, (phseg_list *)Delete, 1 );
261 mbkfree( Delete );
262 }
263
264 Pointer = (void *)FigureMbk->PHREF;
265 FigureMbk->PHREF = (phref_list *)0;
266
267 while( Pointer != (void *)0 )
268 {
269 Delete = Pointer;
270 Pointer = ((phref_list *)Pointer)->NEXT;
271
272 refmbkrds( FigureRds, (phref_list *)Delete );
273 mbkfree( Delete );
274 }
275
276 Pointer = (void *)FigureMbk->PHVIA;
277 FigureMbk->PHVIA = (phvia_list *)0;
278
279 while( Pointer != (void *)0 )
280 {
281 Delete = Pointer;
282 Pointer = ((phvia_list *)Pointer)->NEXT;
283
284 viambkrds( FigureRds, (phvia_list *)Delete, 1 );
285 mbkfree( Delete );
286 }
287
288 for ( Layer = 0; Layer < RDS_MAX_LAYER; Layer++ )
289 {
290 ScanRec = FigureRds->LAYERTAB[ (int)Layer ];
291
292 while ( ScanRec != (rdsrec_list *)0 )
293 {
294 DelRec = ScanRec;
295 ScanRec = ScanRec->NEXT;
296
297 X1 = DelRec->X;
298 Y1 = DelRec->Y;
299 X2 = DelRec->DX + X1;
300 Y2 = DelRec->DY + Y1;
301
302 if ( ( X1 < LambdaX2 ) &&
303 ( Y1 < LambdaY2 ) &&
304 ( X2 > LambdaX1 ) &&
305 ( Y2 > LambdaY1 ) )
306 {
307 SetGraalPeek( DelRec );
308 ClearRdsFigRec( DelRec );
309
310 DelRec->NEXT = TargetRds->LAYERTAB[ (int)Layer ];
311 TargetRds->LAYERTAB[ (int)Layer ] = DelRec;
312
313 GRAAL_MBK( DelRec ) = (void *)SourceMbk;
314 GRAAL_PREVIOUS( DelRec ) = (rdsrec_list **)TargetRds;
315
316 if ( X1 < LambdaX1 ) { X1 = LambdaX1; }
317 if ( Y1 < LambdaY1 ) { Y1 = LambdaY1; }
318 if ( X2 > LambdaX2 ) { X2 = LambdaX2; }
319 if ( Y2 > LambdaY2 ) { Y2 = LambdaY2; }
320
321 DelRec->X = X1;
322 DelRec->Y = Y1;
323 DelRec->DX = X2 - X1;
324 DelRec->DY = Y2 - Y1;
325
326 GraalInsertRectangle( DelRec );
327 }
328 else
329 {
330 freerdsrec( DelRec, GRAAL_SIZE );
331 }
332 }
333
334 FigureRds->LAYERTAB[ (int)Layer ] = (rdsrec_list *)0;
335 }
336
337 InstanceMbk = FigureMbk->PHINS;
338 PreviousMbk = &FigureMbk->PHINS;
339
340 while( InstanceMbk != (phins_list *)0 )
341 {
342 ModelMbk = Graalgetphfig( InstanceMbk->FIGNAME, 'P' );
343
344 if ( ModelMbk != (phfig_list *)0 )
345 {
346 xyflat
347 ( &Xab1 , &Yab1,
348 ModelMbk->XAB1 , ModelMbk->YAB1,
349 InstanceMbk->XINS , InstanceMbk->YINS,
350 ModelMbk->XAB1 , ModelMbk->YAB1,
351 ModelMbk->XAB2 , ModelMbk->YAB2,
352 InstanceMbk->TRANSF
353 );
354
355 xyflat
356 ( &Xab2 , &Yab2,
357 ModelMbk->XAB2 , ModelMbk->YAB2,
358 InstanceMbk->XINS , InstanceMbk->YINS,
359 ModelMbk->XAB1 , ModelMbk->YAB1,
360 ModelMbk->XAB2 , ModelMbk->YAB2,
361 InstanceMbk->TRANSF
362 );
363
364 Xab1 = RfmRoundLow( (long)( Xab1 * GRAAL_RDS_LAMBDA / GRAAL_SCALE_X ) );
365 Yab1 = RfmRoundLow( (long)( Yab1 * GRAAL_RDS_LAMBDA / GRAAL_SCALE_X ) );
366 Xab2 = RfmRoundHigh( (long)( Xab2 * GRAAL_RDS_LAMBDA / GRAAL_SCALE_X ) );
367 Yab2 = RfmRoundHigh( (long)( Yab2 * GRAAL_RDS_LAMBDA / GRAAL_SCALE_X ) );
368
369 if ( Xab1 > Xab2 ) { Swap = Xab1; Xab1 = Xab2; Xab2 = Swap; }
370 if ( Yab1 > Yab2 ) { Swap = Yab1; Yab1 = Yab2; Yab2 = Swap; }
371
372 if ( ( Xab1 < XabMax ) &&
373 ( Yab1 < YabMax ) &&
374 ( Xab2 > XabMin ) &&
375 ( Yab2 > YabMin ) )
376 {
377 PreviousMbk = &InstanceMbk->NEXT;
378 InstanceMbk = InstanceMbk->NEXT;
379
380 continue;
381 }
382 }
383
384 *PreviousMbk = InstanceMbk->NEXT;
385 Delete = (void *)InstanceMbk;
386 InstanceMbk = InstanceMbk->NEXT;
387
388 mbkfree( Delete );
389 }
390 }
391 while( FigureMbk->PHINS != (phins_list *)0 );
392
393 delphfig( "_ludo_" );
394 delrdsfig( "_ludo_" );
395
396 rdsend();
397 }
398
399 /*------------------------------------------------------------\
400 | |
401 | Graal Real Flat Instance |
402 | |
403 \------------------------------------------------------------*/
404
GraalRealFlatInstance(Rectangle)405 char GraalRealFlatInstance( Rectangle )
406
407 rdsrec_list *Rectangle;
408 {
409 phfig_list *FigureMbk;
410 phins_list *SourceMbk;
411
412 void *Pointer;
413 void *Previous;
414 void *SavePointer;
415
416 rdsbegin();
417
418 FigureMbk = addphfig( "_ludo_" );
419 SourceMbk = (phins_list *)GRAAL_MBK( Rectangle );
420
421 /*InstanceMbk =*/ addphins( FigureMbk,
422 SourceMbk->FIGNAME, SourceMbk->INSNAME,
423 SourceMbk->TRANSF,
424 SourceMbk->XINS, SourceMbk->YINS );
425 Pointer = (void *)
426
427 Graalflattenphfig( FigureMbk, FigureMbk->PHINS->INSNAME, YES );
428
429 if ( Pointer == (void *)0 )
430 {
431 delphfig( "_ludo_" );
432
433 rdsend();
434 return( GRAAL_FALSE );
435 }
436
437 SavePointer = (void *)(GraalFigureMbk->PHSEG);
438 GraalFigureMbk->PHSEG = FigureMbk->PHSEG;
439 Previous = (void *)(&(GraalFigureMbk->PHSEG));
440
441 for ( Pointer = (void *)(FigureMbk->PHSEG);
442 Pointer != (void *)0;
443 Pointer = (void *)(((phseg_list *)Pointer)->NEXT))
444 {
445 ((phseg_list *)Pointer)->USER = Previous;
446 Previous = (void *)(&((phseg_list *)Pointer)->NEXT);
447
448 GraalAddSegment( (phseg_list *)Pointer );
449 }
450
451 if ( SavePointer != (void *)0 )
452 {
453 *(phseg_list **)Previous = (phseg_list *)SavePointer;
454 ((phseg_list *)SavePointer)->USER = Previous;
455 }
456
457 FigureMbk->PHSEG = (phseg_list *)0;
458
459 SavePointer = (void *)(GraalFigureMbk->PHREF);
460 GraalFigureMbk->PHREF = FigureMbk->PHREF;
461 Previous = (void *)(&(GraalFigureMbk->PHREF));
462
463 for ( Pointer = (void *)(FigureMbk->PHREF);
464 Pointer != (void *)0;
465 Pointer = (void *)(((phref_list *)Pointer)->NEXT))
466 {
467 ((phref_list *)Pointer)->USER = Previous;
468 Previous = (void *)(&((phref_list *)Pointer)->NEXT);
469
470 GraalAddReference( (phref_list *)Pointer );
471 }
472
473 if ( SavePointer != (void *)0 )
474 {
475 *(phref_list **)Previous = (phref_list *)SavePointer;
476 ((phref_list *)SavePointer)->USER = Previous;
477 }
478
479 FigureMbk->PHREF = (phref_list *)0;
480
481 SavePointer = (void *)(GraalFigureMbk->PHVIA);
482 GraalFigureMbk->PHVIA = FigureMbk->PHVIA;
483 Previous = (void *)(&(GraalFigureMbk->PHVIA));
484
485 for ( Pointer = (void *)(GraalFigureMbk->PHVIA);
486 Pointer != (void *)0;
487 Pointer = (void *)(((phvia_list *)Pointer)->NEXT))
488 {
489 ((phvia_list *)Pointer)->USER = Previous;
490 Previous = (void *)(&((phvia_list *)Pointer)->NEXT);
491
492 GraalAddVia( (phvia_list *)Pointer );
493 }
494
495 if ( SavePointer != (void *)0 )
496 {
497 *(phvia_list **)Previous = (phvia_list *)SavePointer;
498 ((phvia_list *)SavePointer)->USER = Previous;
499 }
500
501 FigureMbk->PHVIA = (phvia_list *)0;
502
503 SavePointer = (void *)(GraalFigureMbk->PHINS);
504 GraalFigureMbk->PHINS = FigureMbk->PHINS;
505 Previous = (void *)(&(GraalFigureMbk->PHINS));
506
507 for ( Pointer = (void *)(FigureMbk->PHINS);
508 Pointer != (void *)0;
509 Pointer = (void *)(((phins_list *)Pointer)->NEXT))
510 {
511 ((phins_list *)Pointer)->USER = Previous;
512 Previous = (void *)(&((phins_list *)Pointer)->NEXT);
513
514 GraalAddInstance( (phins_list *)Pointer );
515 }
516
517 if ( SavePointer != (void *)0 )
518 {
519 *(phins_list **)Previous = (phins_list *)SavePointer;
520 ((phins_list *)SavePointer)->USER = Previous;
521 }
522
523 FigureMbk->PHINS = (phins_list *)0;
524
525 delphfig( "_ludo_" );
526
527 GraalDelUndo( &GraalHeadRedo );
528 GraalDelUndo( &GraalHeadUndo );
529
530 GraalDelInstance( (rdsins_list *)GRAAL_PREVIOUS( Rectangle ) );
531
532 rdsend();
533 return( GRAAL_TRUE );
534 }
535