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