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    :                   Grid.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 
49 # include "mut.h"
50 # include "mph.h"
51 # include "rds.h"
52 # include "rpr.h"
53 # include "GSB.h"
54 # include "GRM.h"
55 # include "GMX.h"
56 
57 # include "GMX_grid.h"
58 
59 /*------------------------------------------------------------\
60 |                                                             |
61 |                           Constants                         |
62 |                                                             |
63 \------------------------------------------------------------*/
64 /*------------------------------------------------------------\
65 |                                                             |
66 |                            Types                            |
67 |                                                             |
68 \------------------------------------------------------------*/
69 /*------------------------------------------------------------\
70 |                                                             |
71 |                          Variables                          |
72 |                                                             |
73 \------------------------------------------------------------*/
74 /*------------------------------------------------------------\
75 |                                                             |
76 |                         Lambda Grid                         |
77 |                                                             |
78 \------------------------------------------------------------*/
79 
80   float      GraalLambdaGridStep;
81 
82   long       GraalLambdaGridX;
83   long       GraalLambdaGridY;
84   long       GraalLambdaGridDx;
85   long       GraalLambdaGridDy;
86 
87   long       GraalPixelGridX;
88   long       GraalPixelGridY;
89 
90 /*------------------------------------------------------------\
91 |                                                             |
92 |                      User Lambda Grid                       |
93 |                                                             |
94 \------------------------------------------------------------*/
95 
96   long       GraalLambdaUserGridDx;
97   long       GraalLambdaUserGridDy;
98   char       GraalLambdaUserGrid;
99 
100 /*------------------------------------------------------------\
101 |                                                             |
102 |                           Functions                         |
103 |                                                             |
104 \------------------------------------------------------------*/
105 /*------------------------------------------------------------\
106 |                                                             |
107 |                GraalInitializeLambdaGrid                    |
108 |                                                             |
109 \------------------------------------------------------------*/
110 
GraalInitializeLambdaGrid()111 void GraalInitializeLambdaGrid()
112 
113 {
114   rdsbegin();
115 
116   GraalLambdaGridX      = GRAAL_DEFAULT_GRID_X;
117   GraalLambdaGridY      = GRAAL_DEFAULT_GRID_Y;
118   GraalLambdaGridDx     = GRAAL_DEFAULT_GRID_DX;
119   GraalLambdaGridDy     = GRAAL_DEFAULT_GRID_DY;
120   GraalLambdaUserGridDx = 4;
121   GraalLambdaUserGridDy = 4;
122   GraalLambdaUserGrid   = GRAAL_FALSE;
123 
124   GraalComputeLambdaGrid();
125 
126   rdsend();
127 }
128 
129 /*------------------------------------------------------------\
130 |                                                             |
131 |                 GraalComputeLambdaGrid                      |
132 |                                                             |
133 \------------------------------------------------------------*/
134 
GraalComputeLambdaGrid()135 void GraalComputeLambdaGrid()
136 
137 {
138   float StepX;
139   float StepY;
140 
141   rdsbegin();
142 
143   StepX = (float)(GraalGraphicDx) / (float)(GraalLambdaGridDx);
144   StepY = (float)(GraalGraphicDy) / (float)(GraalLambdaGridDy);
145 
146   if ( StepX < StepY )
147   {
148     GraalLambdaGridStep = StepX;
149     GraalLambdaGridDy   = 1 + ( GraalGraphicDy / StepX );
150   }
151   else
152   {
153     GraalLambdaGridStep = StepY;
154     GraalLambdaGridDx   = 1 + ( GraalGraphicDx / StepY );
155   }
156 
157   GraalPixelGridX = (float)(GraalLambdaGridX) * GraalLambdaGridStep;
158   GraalPixelGridY = (float)(GraalLambdaGridY) * GraalLambdaGridStep;
159 
160   rdsend();
161 }
162 
163 /*------------------------------------------------------------\
164 |                                                             |
165 |                  GraalResizeLambdaGrid                      |
166 |                                                             |
167 \------------------------------------------------------------*/
168 
GraalResizeLambdaGrid()169 void GraalResizeLambdaGrid()
170 
171 {
172   rdsbegin();
173 
174   GraalLambdaGridDx = 1 + ( GraalGraphicDx / GraalLambdaGridStep );
175   GraalLambdaGridDy = 1 + ( GraalGraphicDy / GraalLambdaGridStep );
176 
177   rdsend();
178 }
179 
180 /*------------------------------------------------------------\
181 |                                                             |
182 |                     GraalDisplayLambdaGrid                  |
183 |                                                             |
184 \------------------------------------------------------------*/
185 
GraalDisplayLambdaGrid(GraphicX1,GraphicY1,GraphicX2,GraphicY2)186 char GraalDisplayLambdaGrid( GraphicX1, GraphicY1, GraphicX2, GraphicY2 )
187 
188    Dimension GraphicX1;
189    Dimension GraphicY1;
190    Dimension GraphicX2;
191    Dimension GraphicY2;
192 {
193   long      X;
194   long      Y;
195   long      MaxGridX;
196   long      MaxGridY;
197   long      PixelX;
198   long      PixelY;
199   long      Xmin;
200   long      Ymin;
201   char      UserGrid;
202   char      LambdaGrid;
203   float     Check;
204 
205   rdsbegin();
206 
207   if ( GraalLambdaGridStep < GRAAL_LOWER_GRID_STEP )
208   {
209     LambdaGrid = 0;
210   }
211   else
212   {
213     LambdaGrid = 1;
214   }
215 
216   if ( GraalLambdaUserGrid == 1  )
217   {
218     if ( GraalLambdaUserGridDx > GraalLambdaUserGridDy )
219     {
220       Check = ( GRAAL_LOWER_GRID_STEP / GraalLambdaUserGridDx );
221     }
222     else
223     {
224       Check = ( GRAAL_LOWER_GRID_STEP / GraalLambdaUserGridDy );
225     }
226 
227     if ( GraalLambdaGridStep < Check ) UserGrid = 0;
228     else                               UserGrid = 1;
229   }
230   else
231   {
232     UserGrid = 0;
233   }
234 
235   if ( ( UserGrid   == 0 ) &&
236        ( LambdaGrid == 0 ) )
237   {
238     rdsend();
239     return( GRAAL_FALSE );
240   }
241 
242   MaxGridX = GraalLambdaGridX + GraalLambdaGridDx;
243   MaxGridY = GraalLambdaGridY + GraalLambdaGridDy;
244 
245   if ( LambdaGrid )
246   {
247     for ( X = GraalLambdaGridX; X < MaxGridX; X = X + 1 )
248     {
249       PixelX = ((float)(X) * GraalLambdaGridStep);
250       PixelX = PixelX - GraalPixelGridX;
251 
252       if ( ( PixelX <= GraphicX2 ) &&
253            ( PixelX >= GraphicX1 ) )
254 
255       for ( Y = GraalLambdaGridY; Y < MaxGridY; Y = Y + 1 )
256       {
257         PixelY = ((float)(Y) * GraalLambdaGridStep);
258         PixelY = PixelY - GraalPixelGridY;
259         PixelY = GraalGraphicDy - PixelY;
260 
261         if ( ( PixelY <= GraphicY2 ) &&
262              ( PixelY >= GraphicY1 ) )
263         {
264           XDrawPoint( GraalGraphicDisplay,
265                       XtWindow( GraalGraphicWindow ),
266                       GraalGridGC,
267                       PixelX, PixelY );
268         }
269       }
270     }
271   }
272 
273   if ( UserGrid )
274   {
275     Xmin  = ( GraalLambdaGridX / GraalLambdaUserGridDx ) * GraalLambdaUserGridDx;
276     Ymin  = ( GraalLambdaGridY / GraalLambdaUserGridDy ) * GraalLambdaUserGridDy;
277 
278     for ( X = Xmin; X < MaxGridX ; X = X + GraalLambdaUserGridDx )
279     {
280       PixelX = ((float)(X) * GraalLambdaGridStep);
281       PixelX = PixelX - GraalPixelGridX;
282 
283       if ( ( PixelX <= GraphicX2 ) &&
284            ( PixelX >= GraphicX1 ) )
285 
286       for ( Y = Ymin; Y < MaxGridY; Y = Y + GraalLambdaUserGridDy )
287       {
288         PixelY = ((float)(Y) * GraalLambdaGridStep);
289         PixelY = PixelY - GraalPixelGridY;
290         PixelY = GraalGraphicDy - PixelY;
291 
292         if ( ( PixelY <= GraphicY2 ) &&
293              ( PixelY >= GraphicY1 ) )
294         {
295           XDrawLine( GraalGraphicDisplay,
296                      XtWindow( GraalGraphicWindow ),
297                      GraalGridGC,
298                      PixelX - 2, PixelY,
299                      PixelX + 2, PixelY );
300 
301           XDrawLine( GraalGraphicDisplay,
302                      XtWindow( GraalGraphicWindow ),
303                      GraalGridGC,
304                      PixelX, PixelY + 2,
305                      PixelX, PixelY - 2 );
306         }
307       }
308     }
309   }
310 
311   rdsend();
312   return( GRAAL_TRUE );
313 }
314