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 : Search.c |
33 | |
34 | Author : Jacomme Ludovic |
35 | |
36 | Date : 28.03.95 |
37 | |
38 \------------------------------------------------------------*/
39
40 /*------------------------------------------------------------\
41 | |
42 | Include Files |
43 | |
44 \------------------------------------------------------------*/
45
46 # include <stdio.h>
47 # include <string.h>
48 # include <Xm/Xm.h>
49 # include <Xm/PushBG.h>
50 # include <Xm/CascadeBG.h>
51
52 # include "mut.h"
53 # include "mph.h"
54 # include "rds.h"
55 # include "rpr.h"
56 # include "rfm.h"
57 # include "GSB.h"
58 # include "GRM.h"
59 # include "GMX.h"
60 # include "GTB.h"
61 # include "GMV.h"
62 # include "GME.h"
63
64 # include "GME_search.h"
65 # include "GME_panel.h"
66 # include "GME_edit.h"
67 # include "GME_message.h"
68 # include "GME_dialog.h"
69
70 /*------------------------------------------------------------\
71 | |
72 | Constants |
73 | |
74 \------------------------------------------------------------*/
75 /*------------------------------------------------------------\
76 | |
77 | Types |
78 | |
79 \------------------------------------------------------------*/
80 /*------------------------------------------------------------\
81 | |
82 | Variables |
83 | |
84 \------------------------------------------------------------*/
85
86 char GraalSearchAbort;
87 int GraalSearchNumber;
88 char *GraalSearchString;
89
90 /*------------------------------------------------------------\
91 | |
92 | Functions |
93 | |
94 \------------------------------------------------------------*/
95 /*------------------------------------------------------------\
96 | |
97 | GraalEditInitializeSearch |
98 | |
99 \------------------------------------------------------------*/
100
GraalEditInitializeSearch(Name)101 void GraalEditInitializeSearch( Name )
102
103 char *Name;
104 {
105 char *Star;
106
107 rdsbegin();
108
109 Star = strrchr( Name, '*' );
110
111 if ( Star != (char *)NULL )
112 {
113 GraalSearchNumber = (int)(Star - Name);
114 }
115 else
116 {
117 GraalSearchNumber = 0;
118 }
119
120 GraalSearchString = Name;
121
122 rdsend();
123 }
124
125 /*------------------------------------------------------------\
126 | |
127 | GraalEditSearchCompare |
128 | |
129 \------------------------------------------------------------*/
130
GraalEditSearchCompare(Name)131 int GraalEditSearchCompare( Name )
132
133 char *Name;
134 {
135 if ( Name != (char *)NULL )
136 {
137 if ( GraalSearchNumber )
138 {
139 return( ! strncmp( GraalSearchString, Name, GraalSearchNumber ) );
140 }
141 else
142 {
143 return( Name == GraalSearchString );
144 }
145 }
146
147 return( 0 );
148 }
149
150 /*------------------------------------------------------------\
151 | |
152 | GraalEditSearchConnector |
153 | |
154 \------------------------------------------------------------*/
155
GraalEditSearchConnector(ConnectorName)156 void GraalEditSearchConnector( ConnectorName )
157
158 char *ConnectorName;
159 {
160 graalconrec *ScanCon;
161 graalsearch *Search;
162 rdsrec_list *Rec;
163 long X1;
164 long Y1;
165
166 rdsbegin();
167
168 GraalEditInitializeSearch( ConnectorName );
169
170 for ( ScanCon = GraalHeadConRec;
171 ScanCon != (graalconrec *)NULL;
172 ScanCon = ScanCon->NEXT )
173 {
174 Rec = ScanCon->RECTANGLE;
175
176 if ( ( ! IsGraalDeleted( Rec ) ) &&
177 ( GraalEditSearchCompare( Rec->NAME ) ) )
178 {
179 GraalAddSearch( Rec );
180 }
181 }
182
183 if ( GraalHeadSearch == (graalsearch *)NULL )
184 {
185 GraalWarningMessage( GraalMainWindow, "No connector found !" );
186 }
187 else
188 {
189 for ( Search = GraalHeadSearch;
190 Search != (graalsearch *)NULL;
191 Search = Search->NEXT )
192 {
193 Rec = Search->RECTANGLE;
194
195 X1 = ( Rec->X + ( Rec->DX >> 1 ) ) / GRAAL_RDS_LAMBDA;
196 Y1 = ( Rec->Y + ( Rec->DY >> 1 ) ) / GRAAL_RDS_LAMBDA;
197
198 GraalZoomCenter( X1, Y1 );
199
200 if ( Search->NEXT != (graalsearch *)NULL )
201 {
202 GraalSearchAbort = GRAAL_FALSE;
203
204 GraalEnterPanel( &GraalEditSearchViewPanel );
205 GraalLimitedLoop( GraalEditSearchViewPanel.PANEL );
206
207 if ( GraalSearchAbort ) break;
208 }
209 }
210
211 GraalDelSearch();
212
213 GraalExitPanel( &GraalEditSearchViewPanel );
214 }
215
216 rdsend();
217 }
218
219 /*------------------------------------------------------------\
220 | |
221 | GraalEditSearchInstance |
222 | |
223 \------------------------------------------------------------*/
224
GraalEditSearchInstance(InstanceName)225 void GraalEditSearchInstance( InstanceName )
226
227 char *InstanceName;
228 {
229 graalsearch *Search;
230 rdsins_list *Instance;
231 rdsrec_list *Rec;
232 long X1;
233 long Y1;
234
235 if ( GraalFigureMbk == (phfig_list *)NULL ) return;
236
237 rdsbegin();
238
239 GraalEditInitializeSearch( InstanceName );
240
241 for ( Instance = GraalFigureRds->INSTANCE;
242 Instance != (rdsins_list *)NULL;
243 Instance = Instance->NEXT )
244 {
245 if ( ( ! IsGraalDeleted( Instance->LAYERTAB[ RDS_ABOX ] ) ) &&
246 ( GraalEditSearchCompare( Instance->INSNAME ) ) )
247 {
248 GraalAddSearch( Instance->LAYERTAB[ RDS_ABOX ] );
249 }
250 }
251
252 if ( GraalHeadSearch == (graalsearch *)NULL )
253 {
254 GraalWarningMessage( GraalMainWindow, "No instance found !" );
255 }
256 else
257 {
258 for ( Search = GraalHeadSearch;
259 Search != (graalsearch *)NULL;
260 Search = Search->NEXT )
261 {
262 Rec = Search->RECTANGLE;
263
264 X1 = ( Rec->X + ( Rec->DX >> 1 ) ) / GRAAL_RDS_LAMBDA;
265 Y1 = ( Rec->Y + ( Rec->DY >> 1 ) ) / GRAAL_RDS_LAMBDA;
266
267 GraalZoomCenter( X1, Y1 );
268
269 if ( Search->NEXT != (graalsearch *)NULL )
270 {
271 GraalSearchAbort = GRAAL_FALSE;
272
273 GraalEnterPanel( &GraalEditSearchViewPanel );
274 GraalLimitedLoop( GraalEditSearchViewPanel.PANEL );
275
276 if ( GraalSearchAbort ) break;
277 }
278 }
279
280 GraalDelSearch();
281
282 GraalExitPanel( &GraalEditSearchViewPanel );
283 }
284
285 rdsend();
286 }
287
288 /*------------------------------------------------------------\
289 | |
290 | GraalEditSearchSegment |
291 | |
292 \------------------------------------------------------------*/
293
GraalEditSearchSegment(SegmentName)294 void GraalEditSearchSegment( SegmentName )
295
296 char *SegmentName;
297 {
298 graalsearch *Search;
299 rdsins_list *Instance;
300 rdsrec_list *Rec;
301 char Layer;
302 long X1;
303 long Y1;
304
305 if ( GraalFigureMbk == (phfig_list *)NULL ) return;
306
307 rdsbegin();
308
309 GraalEditInitializeSearch( SegmentName );
310
311 for ( Layer = 0; Layer < RDS_MAX_LAYER; Layer++ )
312 {
313 for ( Rec = GraalFigureRds->LAYERTAB[ (int)Layer ];
314 Rec != (rdsrec_list *)NULL;
315 Rec = Rec->NEXT )
316 {
317 if ( ( ! IsGraalDeleted( Rec ) ) &&
318 ( IsRdsSegment( Rec ) ) &&
319 ( GraalEditSearchCompare( Rec->NAME ) ) )
320 {
321 GraalAddSearch( Rec );
322 }
323 }
324 }
325
326 for ( Instance = GraalFigureRds->INSTANCE;
327 Instance != (rdsins_list *)NULL;
328 Instance = Instance->NEXT )
329 {
330 if ( IsGraalDeleted( Instance->LAYERTAB[ RDS_ABOX ] ) )
331
332 continue;
333
334 for ( Layer = 0; Layer < RDS_MAX_LAYER; Layer++ )
335 {
336 for ( Rec = Instance->LAYERTAB[ (int)Layer ];
337 Rec != (rdsrec_list *)NULL;
338 Rec = Rec->NEXT )
339 {
340 if ( ( IsRdsSegment( Rec ) ) &&
341 ( GraalEditSearchCompare( Rec->NAME ) ) )
342 {
343 GraalAddSearch( Rec );
344 }
345 }
346 }
347 }
348
349 if ( GraalHeadSearch == (graalsearch *)NULL )
350 {
351 GraalWarningMessage( GraalMainWindow, "No segment found !" );
352 }
353 else
354 {
355 for ( Search = GraalHeadSearch;
356 Search != (graalsearch *)NULL;
357 Search = Search->NEXT )
358 {
359 Rec = Search->RECTANGLE;
360
361 X1 = ( Rec->X + ( Rec->DX >> 1 ) ) / GRAAL_RDS_LAMBDA;
362 Y1 = ( Rec->Y + ( Rec->DY >> 1 ) ) / GRAAL_RDS_LAMBDA;
363
364 GraalZoomCenter( X1, Y1 );
365
366 if ( Search->NEXT != (graalsearch *)NULL )
367 {
368 GraalSearchAbort = GRAAL_FALSE;
369
370 GraalEnterPanel( &GraalEditSearchViewPanel );
371 GraalLimitedLoop( GraalEditSearchViewPanel.PANEL );
372
373 if ( GraalSearchAbort ) break;
374 }
375 }
376
377 GraalDelSearch();
378
379 GraalExitPanel( &GraalEditSearchViewPanel );
380 }
381
382 rdsend();
383 }
384
385 /*------------------------------------------------------------\
386 | |
387 | GraalEditSearchReference |
388 | |
389 \------------------------------------------------------------*/
390
GraalEditSearchReference(ReferenceName)391 void GraalEditSearchReference( ReferenceName )
392
393 char *ReferenceName;
394 {
395 graalsearch *Search;
396 rdsins_list *Instance;
397 rdsrec_list *Rec;
398 char Layer;
399 long X1;
400 long Y1;
401
402 if ( GraalFigureMbk == (phfig_list *)NULL ) return;
403
404 rdsbegin();
405
406 GraalEditInitializeSearch( ReferenceName );
407
408 for ( Layer = 0; Layer < RDS_MAX_LAYER; Layer++ )
409 {
410 for ( Rec = GraalFigureRds->LAYERTAB[ (int)Layer ];
411 Rec != (rdsrec_list *)NULL;
412 Rec = Rec->NEXT )
413 {
414 if ( ( ! IsGraalDeleted( Rec ) ) &&
415 ( IsRdsReference( Rec ) ) &&
416 ( GraalEditSearchCompare( Rec->NAME ) ) )
417 {
418 GraalAddSearch( Rec );
419 }
420 }
421 }
422
423 for ( Instance = GraalFigureRds->INSTANCE;
424 Instance != (rdsins_list *)NULL;
425 Instance = Instance->NEXT )
426 {
427 if ( IsGraalDeleted( Instance->LAYERTAB[ RDS_ABOX ] ) )
428
429 continue;
430
431 for ( Layer = 0; Layer < RDS_MAX_LAYER; Layer++ )
432 {
433 for ( Rec = Instance->LAYERTAB[ (int)Layer ];
434 Rec != (rdsrec_list *)NULL;
435 Rec = Rec->NEXT )
436 {
437 if ( ( IsRdsReference( Rec ) ) &&
438 ( GraalEditSearchCompare( Rec->NAME ) ) )
439 {
440 GraalAddSearch( Rec );
441 }
442 }
443 }
444 }
445
446 if ( GraalHeadSearch == (graalsearch *)NULL )
447 {
448 GraalWarningMessage( GraalMainWindow, "No reference found !" );
449 }
450 else
451 {
452 for ( Search = GraalHeadSearch;
453 Search != (graalsearch *)NULL;
454 Search = Search->NEXT )
455 {
456 Rec = Search->RECTANGLE;
457
458 X1 = ( Rec->X + ( Rec->DX >> 1 ) ) / GRAAL_RDS_LAMBDA;
459 Y1 = ( Rec->Y + ( Rec->DY >> 1 ) ) / GRAAL_RDS_LAMBDA;
460
461 GraalZoomCenter( X1, Y1 );
462
463 if ( Search->NEXT != (graalsearch *)NULL )
464 {
465 GraalSearchAbort = GRAAL_FALSE;
466
467 GraalEnterPanel( &GraalEditSearchViewPanel );
468 GraalLimitedLoop( GraalEditSearchViewPanel.PANEL );
469
470 if ( GraalSearchAbort ) break;
471 }
472 }
473
474 GraalDelSearch();
475
476 GraalExitPanel( &GraalEditSearchViewPanel );
477 }
478
479 rdsend();
480 }
481
482 /*------------------------------------------------------------\
483 | |
484 | GraalEditSearchVia |
485 | |
486 \------------------------------------------------------------*/
487
GraalEditSearchVia(ViaName)488 void GraalEditSearchVia( ViaName )
489
490 char *ViaName;
491 {
492 graalsearch *Search;
493 rdsins_list *Instance;
494 rdsrec_list *Rec;
495 char Layer;
496 long X1;
497 long Y1;
498
499 if ( GraalFigureMbk == (phfig_list *)NULL ) return;
500
501 rdsbegin();
502
503 GraalEditInitializeSearch( ViaName );
504
505 for ( Layer = 0; Layer < RDS_MAX_LAYER; Layer++ )
506 {
507 for ( Rec = GraalFigureRds->LAYERTAB[ (int)Layer ];
508 Rec != (rdsrec_list *)NULL;
509 Rec = Rec->NEXT )
510 {
511 if ( ( ! IsGraalDeleted( Rec ) ) &&
512 ( IsRdsVia( Rec ) ) &&
513 ( GraalEditSearchCompare( Rec->NAME ) ) )
514 {
515 GraalAddSearch( Rec );
516 }
517 }
518 }
519
520 for ( Instance = GraalFigureRds->INSTANCE;
521 Instance != (rdsins_list *)NULL;
522 Instance = Instance->NEXT )
523 {
524 if ( IsGraalDeleted( Instance->LAYERTAB[ RDS_ABOX ] ) )
525
526 continue;
527
528 for ( Layer = 0; Layer < RDS_MAX_LAYER; Layer++ )
529 {
530 for ( Rec = Instance->LAYERTAB[ (int)Layer ];
531 Rec != (rdsrec_list *)NULL;
532 Rec = Rec->NEXT )
533 {
534 if ( ( IsRdsVia( Rec ) ) &&
535 ( GraalEditSearchCompare( Rec->NAME ) ) )
536 {
537 GraalAddSearch( Rec );
538 }
539 }
540 }
541 }
542
543 if ( GraalHeadSearch == (graalsearch *)NULL )
544 {
545 GraalWarningMessage( GraalMainWindow, "No via found !" );
546 }
547 else
548 {
549 for ( Search = GraalHeadSearch;
550 Search != (graalsearch *)NULL;
551 Search = Search->NEXT )
552 {
553 Rec = Search->RECTANGLE;
554
555 X1 = ( Rec->X + ( Rec->DX >> 1 ) ) / GRAAL_RDS_LAMBDA;
556 Y1 = ( Rec->Y + ( Rec->DY >> 1 ) ) / GRAAL_RDS_LAMBDA;
557
558 GraalZoomCenter( X1, Y1 );
559
560 if ( Search->NEXT != (graalsearch *)NULL )
561 {
562 GraalSearchAbort = GRAAL_FALSE;
563
564 GraalEnterPanel( &GraalEditSearchViewPanel );
565 GraalLimitedLoop( GraalEditSearchViewPanel.PANEL );
566
567 if ( GraalSearchAbort ) break;
568 }
569 }
570
571 GraalDelSearch();
572
573 GraalExitPanel( &GraalEditSearchViewPanel );
574 }
575
576 rdsend();
577 }
578
579