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 | Tool    :                   GRAAL                           |
31 |                                                             |
32 | File    :                  Druc.c                           |
33 |                                                             |
34 | Author  :              Jacomme Ludovic                      |
35 |                                                             |
36 | Date    :                  28.03.95                         |
37 |                                                             |
38 \------------------------------------------------------------*/
39 /*------------------------------------------------------------\
40 |                                                             |
41 |                         Include Files                       |
42 |                                                             |
43 \------------------------------------------------------------*/
44 
45 # include <stdio.h>
46 # include <Xm/Xm.h>
47 # include <Xm/PushBG.h>
48 
49 # include "mut.h"
50 # include "mph.h"
51 # include "rds.h"
52 # include "rfm.h"
53 # include "rpr.h"
54 # include "vrd.h"
55 # include "GTB.h"
56 # include "GSB.h"
57 # include "GMX.h"
58 # include "GRM.h"
59 # include "GMT.h"
60 # include "GMV.h"
61 # include "GME.h"
62 
63 # include "GMT_druc.h"
64 # include "GMT_panel.h"
65 # include "GMT_message.h"
66 # include "GRM_select.h"
67 
68 /*------------------------------------------------------------\
69 |                                                             |
70 |                           Constants                         |
71 |                                                             |
72 \------------------------------------------------------------*/
73 /*------------------------------------------------------------\
74 |                                                             |
75 |                            Types                            |
76 |                                                             |
77 \------------------------------------------------------------*/
78 /*------------------------------------------------------------\
79 |                                                             |
80 |                          Variables                          |
81 |                                                             |
82 \------------------------------------------------------------*/
83 
84   char GraalDrucErrorMessage[ GRAAL_DRUC_MESSAGE_SIZE ];
85 
86 /*------------------------------------------------------------\
87 |                                                             |
88 |                          Functions                          |
89 |                                                             |
90 \------------------------------------------------------------*/
91 /*------------------------------------------------------------\
92 |                                                             |
93 |                   GraalToolsDrucNoMoreError                 |
94 |                                                             |
95 \------------------------------------------------------------*/
96 
GraalDisplayDrucNoMoreError()97 void GraalDisplayDrucNoMoreError()
98 {
99   rdsbegin();
100 
101   sprintf( GraalDrucErrorMessage, "No more error\n" );
102   GraalDisplayDrucMessage( GraalDrucErrorMessage );
103 
104   rdsend();
105 }
106 
107 /*------------------------------------------------------------\
108 |                                                             |
109 |                      GraalToolsDrucError                    |
110 |                                                             |
111 \------------------------------------------------------------*/
112 
GraalDisplayDrucError(Rectangle)113 void GraalDisplayDrucError( Rectangle )
114 
115   rdsrec_list *Rectangle;
116 {
117   char *Comment;
118   long  Error;
119 
120   rdsbegin();
121 
122   Error   = MACRO_REGLE_NUM( Rectangle );
123   Comment = drucgeterror( Error );
124 
125   sprintf( GraalDrucErrorMessage, "Rule error %ld\n%s",
126            Error, Comment );
127 
128   GraalDisplayDrucMessage( GraalDrucErrorMessage );
129 
130   rdsend();
131 }
132 
133 /*------------------------------------------------------------\
134 |                                                             |
135 |                    GraalToolsDrucAbortError                 |
136 |                                                             |
137 \------------------------------------------------------------*/
138 
GraalToolsDrucAbortError()139 void GraalToolsDrucAbortError()
140 {
141   if ( GraalRectangleDruc != (rdsrec_list *)0 )
142   {
143     GraalDeleteRectangle( GraalRectangleDruc );
144     GraalDisplayRectangle( GraalRectangleDruc );
145   }
146 
147   GraalDelDrucFigure();
148   GraalExitPanel( &GraalToolsDrucPanel );
149 }
150 
151 /*------------------------------------------------------------\
152 |                                                             |
153 |                    GraalToolsDrucNextError                  |
154 |                                                             |
155 \------------------------------------------------------------*/
156 
GraalToolsDrucNextError()157 void GraalToolsDrucNextError()
158 {
159   rdsrec_list  *DrucRec;
160   rdsrec_list  *ScanRec;
161   char          Layer;
162   long          X1;
163   long          Y1;
164 
165 
166   if ( GraalFigureDruc != (rdsfig_list *)0 )
167   {
168     if ( GraalRectangleDruc != (rdsrec_list *)0 )
169     {
170       GraalDeleteRectangle( GraalRectangleDruc );
171       GraalDisplayRectangle( GraalRectangleDruc );
172       GraalDelDruc( GraalRectangleDruc );
173 
174       GraalRectangleDruc = (rdsrec_list *)0;
175     }
176 
177     DrucRec = (rdsrec_list *)0;
178 
179     if ( GraalCurrentDruc == (rdsrec_list *)0 )
180     {
181       for ( Layer = 0; Layer < RDS_MAX_LAYER; Layer++ )
182       {
183         for ( GraalCurrentDruc  = GraalFigureDruc->LAYERTAB[ (int)Layer ];
184               GraalCurrentDruc != (rdsrec_list *)0;
185               GraalCurrentDruc  = GraalCurrentDruc->NEXT )
186         {
187           DrucRec = GraalAddDruc( GraalCurrentDruc );
188           if ( DrucRec != (rdsrec_list *)0 ) break;
189         }
190 
191         if ( DrucRec != (rdsrec_list *)0 ) break;
192       }
193     }
194     else
195     {
196       ScanRec = GraalCurrentDruc->NEXT;
197 
198       while ( ScanRec != (rdsrec_list *)0 )
199       {
200         DrucRec = GraalAddDruc( ScanRec );
201         if ( DrucRec != (rdsrec_list *)0 ) break;
202 
203         ScanRec = ScanRec->NEXT;
204       }
205 
206       if ( ScanRec == (rdsrec_list *)0 )
207       {
208         for ( Layer = GetRdsLayer( GraalCurrentDruc ) + 1; Layer < RDS_MAX_LAYER; Layer++ )
209         {
210           for ( GraalCurrentDruc  = GraalFigureDruc->LAYERTAB[ (int)Layer ];
211                 GraalCurrentDruc != (rdsrec_list *)0;
212                 GraalCurrentDruc  = GraalCurrentDruc->NEXT )
213           {
214             DrucRec = GraalAddDruc( GraalCurrentDruc );
215             if ( DrucRec != (rdsrec_list *)0 ) break;
216           }
217 
218           if ( DrucRec != (rdsrec_list *)0 ) break;
219         }
220       }
221       else
222       {
223         GraalCurrentDruc = ScanRec;
224       }
225     }
226 
227     if ( GraalCurrentDruc == (rdsrec_list *)0 )
228     {
229       GraalDisplayDrucNoMoreError();
230 
231       for ( Layer = 0; Layer < RDS_MAX_LAYER; Layer++ )
232       {
233         for ( ScanRec  = GraalFigureDruc->LAYERTAB[ (int)Layer ];
234               ScanRec != (rdsrec_list *)0;
235               ScanRec  = ScanRec->NEXT )
236         {
237           ClearGraalDruc( ScanRec );
238         }
239       }
240     }
241     else
242     {
243       GraalRectangleDruc = DrucRec;
244       GraalDisplayDrucError( GraalCurrentDruc );
245 
246       X1 = ( DrucRec->X + ( DrucRec->DX >> 1 ) ) / GRAAL_RDS_LAMBDA;
247       Y1 = ( DrucRec->Y + ( DrucRec->DY >> 1 ) ) / GRAAL_RDS_LAMBDA;
248 
249       if ( ( X1 < GraalLambdaGridX                       ) ||
250            ( Y1 < GraalLambdaGridY                       ) ||
251            ( X1 > (GraalLambdaGridX + GraalLambdaGridDx) ) ||
252            ( Y1 > (GraalLambdaGridY + GraalLambdaGridDy) ) )
253       {
254         GraalZoomCenter( X1, Y1 );
255       }
256       else
257       {
258         GraalDisplayRectangle( DrucRec );
259       }
260 
261       GraalEnterPanel( &GraalToolsDrucPanel );
262     }
263   }
264   else
265   {
266     GraalExitPanel( &GraalToolsDrucPanel );
267   }
268 }
269 
270 /*------------------------------------------------------------\
271 |                                                             |
272 |                        GraalToolsDruc                       |
273 |                                                             |
274 \------------------------------------------------------------*/
275 
GraalToolsDruc(LambdaX1,LambdaY1,LambdaX2,LambdaY2)276 void GraalToolsDruc( LambdaX1, LambdaY1, LambdaX2, LambdaY2 )
277 
278    long LambdaX1;
279    long LambdaY1;
280    long LambdaX2;
281    long LambdaY2;
282 {
283   graalselect  *Select;
284   graalselect  *DelSelect;
285   graalselect **Previous;
286   rdsrec_list  *Rectangle;
287   rdsrec_list **PrevRectangle;
288   void         *Pointer;
289   char          Layer;
290   char          Error;
291 
292   rdsbegin();
293 
294   if ( GraalFigureDruc != (rdsfig_list *)0 )
295   {
296     GraalDelDrucFigure();
297   }
298 
299   GraalEditSelectFence( LambdaX1, LambdaY1, LambdaX2, LambdaY2 );
300 
301   Previous = &GraalHeadSelect;
302   Select   = GraalHeadSelect;
303 
304   while ( Select != (graalselect *)NULL )
305   {
306     if ( IsRdsFigure( Select->RECTANGLE   ) ||
307          IsRdsInstance( Select->RECTANGLE ) )
308     {
309       DelSelect = Select;
310       Select    = Select->NEXT;
311       *Previous = Select;
312 
313       GraalFreeSelect( DelSelect );
314     }
315     else
316     {
317       GraalAcceptRectangle( Select->RECTANGLE );
318 
319       Previous = &Select->NEXT;
320       Select   = Select->NEXT;
321     }
322   }
323 
324   if ( GraalHeadSelect == (graalselect *)NULL  )
325   {
326     GraalWarningMessage( GraalMainWindow, "No element found !" );
327   }
328   else
329   {
330     GraalFigureDruc = addrdsfig( "_patrick_", MACRO_PLUS_TAILLE );
331 
332     for ( Select  = GraalHeadSelect;
333           Select != (graalselect *)NULL;
334           Select  = Select->NEXT )
335     {
336       Rectangle = Select->RECTANGLE;
337       Pointer   = GRAAL_MBK( Rectangle );
338 
339       if ( IsRdsSegment( Rectangle ) )
340       {
341         segmbkrds( GraalFigureDruc, (phseg_list *)Pointer, 0 );
342       }
343       else
344       if ( IsRdsConnector( Rectangle ) )
345       {
346         conmbkrds( GraalFigureDruc, (phcon_list *)Pointer );
347       }
348       else
349       if ( IsRdsReference( Rectangle ) )
350       {
351         refmbkrds( GraalFigureDruc, (phref_list *)Pointer );
352       }
353       else
354       if ( IsRdsVia( Rectangle ) )
355       {
356         viambkrds( GraalFigureDruc, (phvia_list *)Pointer, 0 );
357       }
358     }
359 
360     GraalDelSelect();
361 
362     if ( ( GraalHeadEqui != (rdsrec_list *)NULL ) ||
363          ( GraalHeadPeek != (graalpeek   *)NULL ) )
364     {
365       GraalDelEqui();
366       GraalDelPeek();
367       GraalZoomRefresh();
368     }
369 
370     GraalFigureDruc = Graaldrucrdsfig( GraalFigureDruc );
371 
372     GraalDisplayToolsMessage();
373 
374     if ( GraalFigureDruc == (rdsfig_list *)NULL )
375     {
376       GraalErrorMessage( GraalMainWindow, "Unable to execute druc !" );
377     }
378     else
379     {
380       Error = GRAAL_FALSE;
381 
382       for ( Layer = 0; Layer < RDS_MAX_LAYER; Layer++ )
383       {
384         for ( Rectangle  = GraalFigureDruc->LAYERTAB[ (int)Layer ];
385               Rectangle != (rdsrec_list *)NULL;
386               Rectangle  = Rectangle->NEXT )
387         {
388           ClearGraalDruc( Rectangle ); Error = GRAAL_TRUE;
389         }
390       }
391 
392       if ( Error == GRAAL_FALSE )
393       {
394         GraalWarningMessage( GraalMainWindow, "No design error !" );
395         GraalDelDrucFigure();
396         GraalExitPanel( &GraalToolsDrucPanel );
397       }
398       else
399       {
400         PrevRectangle = &GraalFigureDruc->LAYERTAB[ RDS_USER0 ];
401 
402         for ( Layer = RDS_USER0; Layer <= RDS_USER8; Layer++ )
403         {
404           *PrevRectangle = GraalFigureDruc->LAYERTAB[ (int)Layer ];
405 
406           for ( Rectangle  = GraalFigureDruc->LAYERTAB[ (int)Layer ];
407                 Rectangle != (rdsrec_list *)0;
408                 Rectangle  = Rectangle->NEXT )
409           {
410             SetRdsLayer( Rectangle, RDS_USER0 );
411             PrevRectangle = &Rectangle->NEXT;
412           }
413 
414           GraalFigureDruc->LAYERTAB[ (int)Layer ] = (rdsrec_list *)0;
415         }
416 
417         *PrevRectangle = GraalFigureDruc->LAYERTAB[ RDS_USER9 ];
418         GraalFigureDruc->LAYERTAB[ RDS_USER9 ] = (rdsrec_list *)0;
419 
420         GraalCurrentDruc = (rdsrec_list *)0;
421         GraalToolsDrucNextError();
422       }
423     }
424   }
425 
426   rdsend();
427 }
428