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