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