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 : Map.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 <Xm/Xm.h>
48 # include <Xm/Form.h>
49 # include <Xm/Frame.h>
50 # include <Xm/PushB.h>
51 # include <Xm/DrawingA.h>
52
53 # include "mut.h"
54 # include "mph.h"
55 # include "rds.h"
56 # include "rpr.h"
57 # include "GSB.h"
58 # include "GRM.h"
59 # include "GTB.h"
60 # include "GMX.h"
61 # include "GMV.h"
62
63 # include "GMV_map.h"
64
65 /*------------------------------------------------------------\
66 | |
67 | Constants |
68 | |
69 \------------------------------------------------------------*/
70 /*------------------------------------------------------------\
71 | |
72 | Types |
73 | |
74 \------------------------------------------------------------*/
75 /*------------------------------------------------------------\
76 | |
77 | Variables |
78 | |
79 \------------------------------------------------------------*/
80
81 GraalPanelItem GraalViewMapPanel =
82
83 {
84 "Map",
85 1,
86 0,
87 GRAAL_VIEW_MAP_X,
88 GRAAL_VIEW_MAP_Y,
89 190,
90 200,
91 1,
92 1,
93 (Widget)NULL,
94 (Widget)NULL,
95 (Widget)NULL,
96 (Widget)NULL,
97 0,
98 (GraalPanelButtonItem *)NULL
99 };
100
101 int GraalViewMapDefaultValues[ 5 ] =
102
103 {
104 GRAAL_VIEW_MAP_X,
105 GRAAL_VIEW_MAP_Y,
106 190, 200, 0
107 };
108
109 /*------------------------------------------------------------\
110 | |
111 | Graphic Map Window |
112 | |
113 \------------------------------------------------------------*/
114
115 Widget GraalMapWindow;
116 Widget GraalMapButtonCompute;
117 Widget GraalMapButtonClose;
118
119 Dimension GraalMapDx = 0;
120 Dimension GraalMapDy = 0;
121
122 static char GraalFirstEnterMap = GRAAL_TRUE;
123 static char GraalFirstExpose = GRAAL_TRUE;
124
125 /*------------------------------------------------------------\
126 | |
127 | Lambda Map |
128 | |
129 \------------------------------------------------------------*/
130
131 float GraalLambdaMapStep;
132
133 long GraalLambdaMapX;
134 long GraalLambdaMapY;
135 long GraalLambdaMapDx;
136 long GraalLambdaMapDy;
137
138 long GraalBoundMapX;
139 long GraalBoundMapY;
140 long GraalBoundMapDx;
141 long GraalBoundMapDy;
142
143 long GraalPixelMapX;
144 long GraalPixelMapY;
145
146 /*------------------------------------------------------------\
147 | |
148 | Expose |
149 | |
150 \------------------------------------------------------------*/
151 /*------------------------------------------------------------\
152 | |
153 | Translation |
154 | |
155 \------------------------------------------------------------*/
156
157 static String GraalMapEventTranslation =
158
159 "<Btn1Up>: CallbackMapEvent( 0 )\n\
160 <Btn2Up>: CallbackMapEvent( 1 )\n\
161 <Btn3Up>: CallbackMapEvent( 2 )";
162
163 /*------------------------------------------------------------\
164 | |
165 | Functions |
166 | |
167 \------------------------------------------------------------*/
168 /*------------------------------------------------------------\
169 | |
170 | Event Callback |
171 | |
172 \------------------------------------------------------------*/
173 /*------------------------------------------------------------\
174 | |
175 | CallbackCloseMap |
176 | |
177 \------------------------------------------------------------*/
178
CallbackCloseMap(MyWidget,ClientData,CallData)179 void CallbackCloseMap( MyWidget, ClientData, CallData )
180
181 Widget MyWidget;
182 caddr_t ClientData;
183 caddr_t CallData;
184 {
185 rdsbegin();
186
187 GraalExitPanel( &GraalViewMapPanel );
188
189 rdsend();
190 }
191
192 /*------------------------------------------------------------\
193 | |
194 | CallbackMapCompute |
195 | |
196 \------------------------------------------------------------*/
197
CallbackMapCompute(MyWidget,ClientData,CallData)198 void CallbackMapCompute( MyWidget, ClientData, CallData )
199
200 Widget MyWidget;
201 caddr_t ClientData;
202 caddr_t CallData;
203 {
204 rdsbegin();
205
206 GraalComputeAndDisplayMap();
207
208 rdsend();
209 }
210
211 /*------------------------------------------------------------\
212 | |
213 | CallbackMapEvent |
214 | |
215 \------------------------------------------------------------*/
216
CallbackMapEvent(MyWidget,Event,Args,Argc)217 void CallbackMapEvent ( MyWidget, Event, Args, Argc )
218
219 Widget MyWidget;
220 XButtonEvent *Event;
221 String *Args;
222 int *Argc;
223 {
224 char MouseEvent;
225 long X;
226 long Y;
227
228 rdsbegin();
229
230 MouseEvent = Args[ 0 ][ 0 ] - '0';
231
232 X = Event->x;
233 Y = GraalMapDy - Event->y;
234
235 X = X + GraalPixelMapX;
236 Y = Y + GraalPixelMapY;
237
238 if ( X < 0 )
239 {
240 X = ((float)(X) / GraalLambdaMapStep) - 0.5 ;
241 }
242 else
243 {
244 X = ((float)(X) / GraalLambdaMapStep) + 0.5 ;
245 }
246
247 if ( Y < 0 )
248 {
249 Y = ((float)(Y) / GraalLambdaMapStep) - 0.5 ;
250 }
251 else
252 {
253 Y = ((float)(Y) / GraalLambdaMapStep) + 0.5 ;
254 }
255
256 switch ( MouseEvent )
257 {
258 case GRAAL_B1UP :
259 case GRAAL_B2UP :
260 case GRAAL_B3UP :
261
262 GraalZoomCenter( X, Y );
263
264 break;
265 }
266
267 rdsend();
268 }
269
270 /*------------------------------------------------------------\
271 | |
272 | CallbackMapResize |
273 | |
274 \------------------------------------------------------------*/
275
CallbackMapResize(MyWidget,ClientData,CallData)276 void CallbackMapResize( MyWidget, ClientData, CallData )
277
278 Widget MyWidget;
279 XtPointer ClientData;
280 XmDrawingAreaCallbackStruct *CallData;
281 {
282 if ( ! GraalFirstExpose )
283 {
284 rdsbegin();
285
286 GraalSetMouseCursor( GraalGraphicWindow, GRAAL_WATCH_CURSOR );
287 GraalResizeMapWindow();
288 GraalSetMouseCursor( GraalGraphicWindow, GRAAL_NORMAL_CURSOR );
289
290 rdsend();
291 }
292 }
293
294 /*------------------------------------------------------------\
295 | |
296 | CallbackMapExpose |
297 | |
298 \------------------------------------------------------------*/
299
CallbackMapExpose(MyWidget,ClientData,CallData)300 void CallbackMapExpose( MyWidget, ClientData, CallData )
301
302 Widget MyWidget;
303 XtPointer ClientData;
304 XmDrawingAreaCallbackStruct *CallData;
305 {
306 rdsbegin();
307
308 if ( GraalFirstExpose )
309 {
310 GraalFirstExpose = GRAAL_FALSE;
311
312 GraalInitializeMapWindow();
313 }
314
315 GraalRefreshMapWindow();
316
317 rdsend();
318 }
319
320 /*------------------------------------------------------------\
321 | |
322 | Initialize Functions |
323 | |
324 \------------------------------------------------------------*/
325 /*------------------------------------------------------------\
326 | |
327 | GraalsnitializeMapWindow |
328 | |
329 \------------------------------------------------------------*/
330
GraalInitializeMapWindow()331 void GraalInitializeMapWindow()
332
333 {
334 rdsbegin();
335
336 XtVaGetValues( GraalMapWindow,
337 XmNwidth , &GraalMapDx,
338 XmNheight, &GraalMapDy,
339 NULL
340 );
341
342 GraalInitializeLambdaMap();
343
344 rdsend();
345 }
346
347 /*------------------------------------------------------------\
348 | |
349 | Graphic Window Functions |
350 | |
351 \------------------------------------------------------------*/
352 /*------------------------------------------------------------\
353 | |
354 | GraalRefreshMapWindow |
355 | |
356 \------------------------------------------------------------*/
357
GraalRefreshMapWindow()358 void GraalRefreshMapWindow()
359 {
360 rdsbegin();
361
362 GraalClearMapWindow();
363 GraalDisplayLambdaMap();
364
365 rdsend();
366 }
367
368 /*------------------------------------------------------------\
369 | |
370 | GraalClearMapWindow |
371 | |
372 \------------------------------------------------------------*/
373
GraalClearMapWindow()374 void GraalClearMapWindow()
375
376 {
377 XFillRectangle( XtDisplay( GraalMapWindow ),
378 XtWindow( GraalMapWindow ),
379 GraalBackgroundGC,
380 0, 0, GraalMapDx, GraalMapDy );
381 }
382
383 /*------------------------------------------------------------\
384 | |
385 | GraalResizeMapWindow |
386 | |
387 \------------------------------------------------------------*/
388
GraalResizeMapWindow()389 void GraalResizeMapWindow()
390
391 {
392 rdsbegin();
393
394 XtVaGetValues( GraalMapWindow,
395 XmNwidth, &GraalMapDx,
396 XmNheight, &GraalMapDy,
397 NULL
398 );
399
400 GraalComputeAndDisplayMap();
401
402 rdsend();
403 }
404
405 /*------------------------------------------------------------\
406 | |
407 | GraalInitializeMapEvent |
408 | |
409 \------------------------------------------------------------*/
410
GraalInitializeMapEvent()411 void GraalInitializeMapEvent()
412
413 {
414 XtActionsRec NewActions;
415
416 rdsbegin();
417
418 XtVaSetValues( GraalMapWindow,
419 XmNtranslations,
420 XtParseTranslationTable( GraalMapEventTranslation ),
421 NULL
422 );
423
424 NewActions.string = "CallbackMapEvent";
425 NewActions.proc = CallbackMapEvent;
426
427 XtAppAddActions( GraalApplication, &NewActions, 1 );
428
429 XtAddCallback( GraalMapWindow,
430 XmNresizeCallback,
431 CallbackMapResize, NULL );
432
433 XtAddCallback( GraalMapWindow,
434 XmNexposeCallback,
435 CallbackMapExpose, NULL );
436
437 rdsend();
438 }
439
440 /*------------------------------------------------------------\
441 | |
442 | Lambda Map Functions |
443 | |
444 \------------------------------------------------------------*/
445 /*------------------------------------------------------------\
446 | |
447 | GraalInitializeLambdaMap |
448 | |
449 \------------------------------------------------------------*/
450
GraalInitializeLambdaMap()451 void GraalInitializeLambdaMap()
452
453 {
454 rdsbegin();
455
456 if ( ! GraalComputeBound() )
457 {
458 GraalBoundMapX = GRAAL_DEFAULT_MAP_X;
459 GraalBoundMapY = GRAAL_DEFAULT_MAP_Y;
460 GraalBoundMapDx = GRAAL_DEFAULT_MAP_DX;
461 GraalBoundMapDy = GRAAL_DEFAULT_MAP_DY;
462 }
463 else
464 {
465 GraalBoundMapX = GraalBoundXmin / GRAAL_RDS_LAMBDA;
466 GraalBoundMapY = GraalBoundYmin / GRAAL_RDS_LAMBDA;
467 GraalBoundMapDx = GraalBoundXmax / GRAAL_RDS_LAMBDA;
468 GraalBoundMapDy = GraalBoundYmax / GRAAL_RDS_LAMBDA;
469 GraalBoundMapDx = GraalBoundMapDx - GraalBoundMapX;
470 GraalBoundMapDy = GraalBoundMapDy - GraalBoundMapY;
471 }
472
473 GraalLambdaMapX = GraalBoundMapX - 2;
474 GraalLambdaMapY = GraalBoundMapY - 2;
475 GraalLambdaMapDx = GraalBoundMapDx + 4;
476 GraalLambdaMapDy = GraalBoundMapDy + 4;
477
478 GraalComputeLambdaMap();
479
480 rdsend();
481 }
482
483 /*------------------------------------------------------------\
484 | |
485 | GraalComputeLambdaMap |
486 | |
487 \------------------------------------------------------------*/
488
GraalComputeLambdaMap()489 void GraalComputeLambdaMap()
490
491 {
492 long Delta;
493 float StepX;
494 float StepY;
495
496 rdsbegin();
497
498 StepX = (float)(GraalMapDx) / (float)(GraalLambdaMapDx);
499 StepY = (float)(GraalMapDy) / (float)(GraalLambdaMapDy);
500
501 if ( StepX < StepY )
502 {
503 GraalLambdaMapStep = StepX;
504 Delta = GraalLambdaMapDy;
505 GraalLambdaMapDy = 1 + ( GraalMapDy / StepX );
506 Delta = ( GraalLambdaMapDy - Delta ) >> 1;
507 GraalLambdaMapY = GraalLambdaMapY - Delta;
508 }
509 else
510 {
511 GraalLambdaMapStep = StepY;
512 Delta = GraalLambdaMapDx;
513 GraalLambdaMapDx = 1 + ( GraalMapDx / StepY );
514 Delta = ( GraalLambdaMapDx - Delta ) >> 1;
515 GraalLambdaMapX = GraalLambdaMapX - Delta;
516 }
517
518 GraalPixelMapX = (float)(GraalLambdaMapX) * GraalLambdaMapStep;
519 GraalPixelMapY = (float)(GraalLambdaMapY) * GraalLambdaMapStep;
520
521 rdsend();
522 }
523
524 /*------------------------------------------------------------\
525 | |
526 | GraalDisplayLambdaMap |
527 | |
528 \------------------------------------------------------------*/
529
GraalDisplayLambdaMap()530 void GraalDisplayLambdaMap()
531 {
532 long X1;
533 long Y1;
534 long X2;
535 long Y2;
536
537 rdsbegin();
538
539 X1 = (float)( GraalBoundMapX ) * GraalLambdaMapStep;
540 Y1 = (float)( GraalBoundMapY ) * GraalLambdaMapStep;
541 X2 = (float)( GraalBoundMapX + GraalBoundMapDx ) * GraalLambdaMapStep;
542 Y2 = (float)( GraalBoundMapY + GraalBoundMapDy ) * GraalLambdaMapStep;
543
544 X1 = X1 - GraalPixelMapX;
545 X2 = X2 - GraalPixelMapX;
546 Y1 = Y1 - GraalPixelMapY;
547 Y2 = Y2 - GraalPixelMapY;
548
549 XDrawRectangle( XtDisplay( GraalMapWindow ),
550 XtWindow( GraalMapWindow ),
551 GraalLargeTextGC,
552 X1, GraalMapDy - Y2,
553 X2 - X1, Y2 - Y1 );
554
555 X1 = GraalLambdaGridX + ( GraalLambdaGridDx >> 1 );
556 Y1 = GraalLambdaGridY + ( GraalLambdaGridDy >> 1 );
557 X1 = (float)( X1 ) * GraalLambdaMapStep;
558 Y1 = (float)( Y1 ) * GraalLambdaMapStep;
559
560 X1 = X1 - GraalPixelMapX;
561 Y1 = Y1 - GraalPixelMapY;
562 Y1 = GraalMapDy - Y1;
563
564 if ( ( X1 > 0 ) &&
565 ( Y1 > 0 ) &&
566 ( X1 < GraalMapDx ) &&
567 ( Y1 < GraalMapDy ) )
568 {
569 XDrawLine( XtDisplay( GraalMapWindow ),
570 XtWindow( GraalMapWindow ),
571 GraalLargeTextGC,
572 X1 - 2, Y1,
573 X1 + 2, Y1 );
574
575 XDrawLine( XtDisplay( GraalMapWindow ),
576 XtWindow( GraalMapWindow ),
577 GraalLargeTextGC,
578 X1, Y1 - 2,
579 X1, Y1 + 2 );
580 }
581
582 rdsend();
583 }
584
585 /*------------------------------------------------------------\
586 | |
587 | GraalBuildPanelMap |
588 | |
589 \------------------------------------------------------------*/
590
GraalBuildPanelMap()591 void GraalBuildPanelMap()
592 {
593 Arg Args[3];
594
595 rdsbegin();
596
597 XtSetArg( Args[0], XmNshadowType , XmSHADOW_ETCHED_IN );
598 XtSetArg( Args[1], XmNdeleteResponse, XmDO_NOTHING );
599 XtSetArg( Args[2], XmNtitle , GraalViewMapPanel.TITLE );
600
601 GraalViewMapPanel.PANEL =
602
603 XmCreateFormDialog( GraalMainWindow, "GraalViewMapPanel", Args, 3);
604
605 XtAddCallback( GraalViewMapPanel.PANEL, XmNdestroyCallback,
606 GraalDestroyDialogCallback, NULL );
607
608 GraalViewMapPanel.PANEL_FORM =
609
610 XtVaCreateManagedWidget( "GraalViewMapPanelForm",
611 xmFormWidgetClass,
612 GraalViewMapPanel.PANEL,
613 XmNtopAttachment , XmATTACH_FORM,
614 XmNbottomAttachment , XmATTACH_FORM,
615 XmNleftAttachment , XmATTACH_FORM,
616 XmNrightAttachment , XmATTACH_FORM,
617 XmNfractionBase , 100,
618 NULL
619 );
620
621 GraalViewMapPanel.FRAME =
622
623 XtVaCreateManagedWidget( "GraalViewMapFrame",
624 xmFrameWidgetClass,
625 GraalViewMapPanel.PANEL_FORM,
626 XmNtopAttachment , XmATTACH_FORM,
627 XmNbottomAttachment , XmATTACH_FORM,
628 XmNleftAttachment , XmATTACH_FORM,
629 XmNrightAttachment , XmATTACH_FORM,
630 NULL
631 );
632
633 GraalViewMapPanel.FORM =
634
635 XtVaCreateManagedWidget( "GraalViewMapForm",
636 xmFormWidgetClass,
637 GraalViewMapPanel.FRAME,
638 XmNtopAttachment , XmATTACH_FORM,
639 XmNbottomAttachment , XmATTACH_FORM,
640 XmNleftAttachment , XmATTACH_FORM,
641 XmNrightAttachment , XmATTACH_FORM,
642 XmNfractionBase , 100,
643 NULL
644 );
645
646 GraalMapButtonCompute =
647
648 XtVaCreateManagedWidget( "Compute",
649 xmPushButtonWidgetClass,
650 GraalViewMapPanel.FORM,
651 XmNleftAttachment , XmATTACH_POSITION,
652 XmNleftPosition , 1,
653 XmNrightAttachment , XmATTACH_POSITION,
654 XmNrightPosition , 44,
655 XmNtopAttachment , XmATTACH_POSITION,
656 XmNtopPosition , 89,
657 XmNbottomAttachment , XmATTACH_POSITION,
658 XmNbottomPosition , 99,
659 NULL
660 );
661 GraalMapButtonClose =
662
663 XtVaCreateManagedWidget( "Close",
664 xmPushButtonWidgetClass,
665 GraalViewMapPanel.FORM,
666 XmNleftAttachment , XmATTACH_POSITION,
667 XmNleftPosition , 45,
668 XmNrightAttachment , XmATTACH_POSITION,
669 XmNrightPosition , 99,
670 XmNtopAttachment , XmATTACH_POSITION,
671 XmNtopPosition , 89,
672 XmNbottomAttachment , XmATTACH_POSITION,
673 XmNbottomPosition , 99,
674 NULL
675 );
676
677 GraalMapWindow =
678
679 XtVaCreateManagedWidget( "GraalMapWindow",
680 xmDrawingAreaWidgetClass,
681 GraalViewMapPanel.FORM,
682 XmNleftAttachment , XmATTACH_POSITION,
683 XmNleftPosition , 1,
684 XmNrightAttachment , XmATTACH_POSITION,
685 XmNrightPosition , 99,
686 XmNtopAttachment , XmATTACH_POSITION,
687 XmNtopPosition , 1,
688 XmNbottomAttachment , XmATTACH_POSITION,
689 XmNbottomPosition , 88,
690 XmNbackground , 1,
691 XmNforeground , 0,
692 NULL
693 );
694
695 XtAddCallback( GraalMapButtonCompute,
696 XmNactivateCallback,
697 CallbackMapCompute, NULL );
698
699 XtAddCallback( GraalMapButtonClose,
700 XmNactivateCallback,
701 CallbackCloseMap, NULL );
702
703 XtVaSetValues( GraalViewMapPanel.PANEL,
704 XmNheight, GraalViewMapPanel.HEIGHT,
705 XmNwidth , GraalViewMapPanel.WIDTH,
706 XmNx , GraalViewMapPanel.X,
707 XmNy , GraalViewMapPanel.Y,
708 NULL );
709
710 rdsend();
711 }
712
713 /*------------------------------------------------------------\
714 | |
715 | GraalEnterMapPanel |
716 | |
717 \------------------------------------------------------------*/
718
GraalEnterMapPanel()719 void GraalEnterMapPanel()
720
721 {
722 rdsbegin();
723
724 GraalFirstEnterMap = GRAAL_FALSE;
725
726 GraalEnterPanel( &GraalViewMapPanel );
727
728 rdsend();
729 }
730
731 /*------------------------------------------------------------\
732 | |
733 | GraalComputeAndDisplayMap |
734 | |
735 \------------------------------------------------------------*/
736
GraalComputeAndDisplayMap()737 void GraalComputeAndDisplayMap()
738
739 {
740
741 if ( ! GraalFirstEnterMap )
742 {
743 rdsbegin();
744
745 GraalInitializeLambdaMap();
746 GraalClearMapWindow();
747 GraalDisplayLambdaMap();
748
749 rdsend();
750 }
751 }
752