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 support : 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 | Tool : XSCH |
30 | |
31 | File : Tools.c |
32 | |
33 | Authors : Jacomme Ludovic |
34 | |
35 | Date : 01.06.96 |
36 | |
37 \------------------------------------------------------------*/
38 /*------------------------------------------------------------\
39 | |
40 | Include Files |
41 | |
42 \------------------------------------------------------------*/
43
44 # include <stdio.h>
45 # include <math.h>
46 # include <Xm/Xm.h>
47 # include <Xm/PushBG.h>
48
49 # include "mut.h"
50 # include "aut.h"
51 # include "mlo.h"
52 # include "scl.h"
53 # include "XSB.h"
54 # include "XTB.h"
55 # include "XMX.h"
56 # include "XSC.h"
57 # include "XMT.h"
58 # include "XMV.h"
59
60 # include "XMT_tools.h"
61 # include "XMT_message.h"
62 # include "XMX_event.h"
63
64 /*------------------------------------------------------------\
65 | |
66 | Constants |
67 | |
68 \------------------------------------------------------------*/
69 /*------------------------------------------------------------\
70 | |
71 | Types |
72 | |
73 \------------------------------------------------------------*/
74 /*------------------------------------------------------------\
75 | |
76 | Variables |
77 | |
78 \------------------------------------------------------------*/
79
80 xschhierarchy *XschHeadHierarchy = (xschhierarchy *)0;
81
82 char XschToolsFilter[ 10 ] = "*.";
83 char XschToolsExtention[ 10 ] = ".";
84
85 char XschToolsBuffer[ 128 ];
86 char XschToolsDirectoryBuffer[ 512 ];
87
88 static FILE *XschXfigFile = (FILE *)0;
89 static int XschXfigColor = 0;
90 static int XschXfigDepth = 0;
91 static long XschXfigDy = 0;
92
93 /*------------------------------------------------------------\
94 | |
95 | Functions |
96 | |
97 \------------------------------------------------------------*/
98 /*------------------------------------------------------------\
99 | |
100 | XschAllocHierarchy |
101 | |
102 \------------------------------------------------------------*/
103
XschAllocHierarchy()104 xschhierarchy *XschAllocHierarchy ()
105
106 {
107 return ( (xschhierarchy *)autallocheap( sizeof ( xschhierarchy ) ));
108 }
109
110 /*------------------------------------------------------------\
111 | |
112 | XschFreeHierarchy |
113 | |
114 \------------------------------------------------------------*/
115
XschFreeHierarchy(FreeHierarchy)116 void XschFreeHierarchy ( FreeHierarchy )
117
118 xschhierarchy *FreeHierarchy;
119
120 {
121 autfreeheap( (char *)FreeHierarchy, sizeof(FreeHierarchy) );
122 }
123
124 /*------------------------------------------------------------\
125 | |
126 | XschAddHierarchy |
127 | |
128 \------------------------------------------------------------*/
129
XschAddHierarchy(Name)130 void XschAddHierarchy( Name )
131
132 char *Name;
133 {
134 xschhierarchy *XschHierarchy;
135
136 autbegin();
137
138 XschHierarchy = XschAllocHierarchy ();
139 XschHierarchy->NAME = Name;
140 XschHierarchy->X = XschUnitGridX;
141 XschHierarchy->Y = XschUnitGridY;
142 XschHierarchy->DX = XschUnitGridDx;
143 XschHierarchy->DY = XschUnitGridDy;
144 XschHierarchy->NEXT = XschHeadHierarchy;
145 XschHeadHierarchy = XschHierarchy;
146
147 autend();
148 }
149
150 /*------------------------------------------------------------\
151 | |
152 | XschDelHierarchy |
153 | |
154 \------------------------------------------------------------*/
155
XschDelHierarchy()156 char XschDelHierarchy()
157
158 {
159 xschhierarchy *XschHierarchy;
160
161 if ( XschHeadHierarchy != (xschhierarchy *) NULL )
162 {
163 autbegin();
164
165 XschHierarchy = XschHeadHierarchy;
166 XschHeadHierarchy = XschHeadHierarchy->NEXT;
167 XschFreeHierarchy( XschHierarchy );
168
169 autend();
170 return( XSCH_TRUE );
171 }
172
173 return( XSCH_FALSE );
174 }
175
176 /*------------------------------------------------------------\
177 | |
178 | XschToolsHierarchyDown |
179 | |
180 \------------------------------------------------------------*/
181
XschToolsHierarchyDown()182 void XschToolsHierarchyDown()
183 {
184 xschobj_list *Obj;
185 schbox_list *SchBox;
186 loins_list *LoIns;
187 char *ModelName;
188
189 autbegin();
190
191 if ( XschHeadSelect != (xschselect_list *)0 )
192 {
193 Obj = XschHeadSelect->OBJECT;
194 XschDelSelect();
195
196 XschDisplayObject( Obj );
197
198 if ( IsXschSchBox( Obj ) )
199 {
200 SchBox = (schbox_list *)Obj->USER;
201
202 if ( SchBox->SOURCE_TYPE == SCH_SOURCE_LOINS )
203 {
204 LoIns = (loins_list *)SchBox->SOURCE;
205 ModelName = LoIns->FIGNAME;
206
207 XschAddHierarchy( XschFigureSch->NAME );
208
209 XschFileOpen( ModelName, 1 );
210 }
211 }
212 }
213
214 autend();
215 }
216
217 /*------------------------------------------------------------\
218 | |
219 | XschToolsHierarchyUp |
220 | |
221 \------------------------------------------------------------*/
222
XschToolsHierarchyUp()223 void XschToolsHierarchyUp()
224 {
225 if ( XschHeadHierarchy == (xschhierarchy *)0 )
226 {
227 XschErrorMessage( XschMainWindow, "No previous model !" );
228 }
229 else
230 {
231 XschFileOpen( XschHeadHierarchy->NAME, 0 );
232
233 XschUnitGridX = XschHeadHierarchy->X;
234 XschUnitGridY = XschHeadHierarchy->Y;
235 XschUnitGridDx = XschHeadHierarchy->DX;
236 XschUnitGridDy = XschHeadHierarchy->DY;
237
238 XschComputeUnitGrid();
239 XschComputeAndDisplayMap();
240
241 XschZoomRefresh();
242 XschDelHierarchy();
243 }
244 }
245
246 /*------------------------------------------------------------\
247 | |
248 | XschToolsHierarchyReload |
249 | |
250 \------------------------------------------------------------*/
251
XschToolsHierarchyReload()252 void XschToolsHierarchyReload()
253 {
254 long SaveUnitGridX;
255 long SaveUnitGridY;
256 long SaveUnitGridDx;
257 long SaveUnitGridDy;
258
259 if ( XschFigureSch != (schfig_list *)NULL )
260 {
261 SaveUnitGridX = XschUnitGridX;
262 SaveUnitGridY = XschUnitGridY;
263 SaveUnitGridDx = XschUnitGridDx;
264 SaveUnitGridDy = XschUnitGridDy;
265
266 XschFileOpen( XschFigureSch->NAME, 0 );
267
268 XschUnitGridX = SaveUnitGridX;
269 XschUnitGridY = SaveUnitGridY;
270 XschUnitGridDx = SaveUnitGridDx;
271 XschUnitGridDy = SaveUnitGridDy;
272
273 XschComputeUnitGrid();
274 XschComputeAndDisplayMap();
275
276 XschZoomRefresh();
277 }
278 }
279
280 /*------------------------------------------------------------\
281 | |
282 | XschToolsDelAllHierarchy |
283 | |
284 \------------------------------------------------------------*/
285
XschToolsDelAllHierarchy()286 void XschToolsDelAllHierarchy()
287 {
288 while ( XschHeadHierarchy != (xschhierarchy *)0 )
289 {
290 XschDelHierarchy();
291 }
292 }
293
294 /*------------------------------------------------------------\
295 | |
296 | XschToolsSaveXfigLine |
297 | |
298 \------------------------------------------------------------*/
299
XschToolsSaveXfigLine(X1r,Y1r,X2r,Y2r)300 static void XschToolsSaveXfigLine( X1r, Y1r, X2r, Y2r )
301
302 long X1r;
303 long Y1r;
304 long X2r;
305 long Y2r;
306 {
307 fprintf( XschXfigFile,
308 "2 1 0 1 %d 0 %d 0 -1 0.000 0 0 -1 0 0 2\n", XschXfigColor, XschXfigDepth );
309 /* ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
310 * | | | | | | | | | | | | | | | + Number Points
311 * | | | | | | | | | | | | | | + Backward Arrow
312 * | | | | | | | | | | | | | + Forward Arrow
313 * | | | | | | | | | | | | + Radius
314 * | | | | | | | | | | | + Cap style
315 * | | | | | | | | | | + Join style
316 * | | | | | | | | | + Style Val
317 * | | | | | | | | + Area Fill
318 * | | | | | | | + Pen Style
319 * | | | | | | + Depth
320 * | | | | | + Fill Color
321 * | | | | + Pen Color
322 * | | | + Width
323 * | | + Line Style
324 * | + Poly Line
325 * + Poly Line
326 */
327
328 fprintf( XschXfigFile, " %ld %ld %ld %ld\n", X1r, XschXfigDy - Y1r,
329 X2r, XschXfigDy - Y2r );
330 }
331
332 /*------------------------------------------------------------\
333 | |
334 | XschToolsSaveXfigRectangle |
335 | |
336 \------------------------------------------------------------*/
337
XschToolsSaveXfigRectangle(X1r,Y1r,X2r,Y2r)338 static void XschToolsSaveXfigRectangle( X1r, Y1r, X2r, Y2r )
339
340 long X1r;
341 long Y1r;
342 long X2r;
343 long Y2r;
344 {
345 fprintf( XschXfigFile,
346 "2 2 0 1 %d 0 %d 0 -1 0.000 0 0 -1 0 0 5\n", XschXfigColor, XschXfigDepth );
347 /* ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
348 * | | | | | | | | | | | | | | | + Number Points
349 * | | | | | | | | | | | | | | + Backward Arrow
350 * | | | | | | | | | | | | | + Forward Arrow
351 * | | | | | | | | | | | | + Radius
352 * | | | | | | | | | | | + Cap style
353 * | | | | | | | | | | + Join style
354 * | | | | | | | | | + Style Val
355 * | | | | | | | | + Area Fill
356 * | | | | | | | + Pen Style
357 * | | | | | | + Depth
358 * | | | | | + Fill Color
359 * | | | | + Pen Color
360 * | | | + Width
361 * | | + Line Style
362 * | + Poly Line
363 * + Poly Line
364 */
365
366 fprintf( XschXfigFile, "%ld %ld %ld %ld %ld %ld %ld %ld %ld %ld\n",
367 X1r, XschXfigDy - Y1r,
368 X2r, XschXfigDy - Y1r,
369 X2r, XschXfigDy - Y2r,
370 X1r, XschXfigDy - Y2r,
371 X1r, XschXfigDy - Y1r );
372 }
373
374 /*------------------------------------------------------------\
375 | |
376 | XschToolsSaveXfigCircle |
377 | |
378 \------------------------------------------------------------*/
379
XschToolsSaveXfigCircle(X1r,Y1r,Dx,Dy)380 static void XschToolsSaveXfigCircle( X1r, Y1r, Dx, Dy )
381
382 long X1r;
383 long Y1r;
384 long Dx;
385 long Dy;
386 {
387 long Xc;
388 long Yc;
389 long Radx;
390 long Rady;
391
392 Xc = X1r + ( Dx / 2 );
393 Yc = Y1r + ( Dy / 2 );
394 Radx = Dx / 2;
395 Rady = Dy / 2;
396
397 fprintf( XschXfigFile,
398 "1 3 0 1 %d 0 %d 0 -1 0.000 1 0.000 %ld %ld %ld %ld %ld %ld %ld %ld\n",
399 /* ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
400 * | | | | | | | | | | | | | | | | | | | + end_y
401 * | | | | | | | | | | | | | | | | | | + end_x
402 * | | | | | | | | | | | | | | | | | + start_y
403 * | | | | | | | | | | | | | | | | + start_x
404 * | | | | | | | | | | | | | | | + rad_y
405 * | | | | | | | | | | | | | | + rad_x
406 * | | | | | | | | | | | | | + Cy
407 * | | | | | | | | | | | | + Cx
408 * | | | | | | | | | | | + Angle
409 * | | | | | | | | | | + Direction
410 * | | | | | | | | | + Style Val
411 * | | | | | | | | + Area Fill
412 * | | | | | | | + Pen Style
413 * | | | | | | + Depth
414 * | | | | | + Fill Color
415 * | | | | + Pen Color
416 * | | | + Width
417 * | | + Line Style
418 * | + Poly Line
419 * + Poly Line
420 */
421 XschXfigColor, XschXfigDepth, Xc, XschXfigDy - Yc, Radx, Rady,
422 Xc, XschXfigDy - Yc,
423 Xc + Radx, XschXfigDy - Yc );
424 }
425
426 /*------------------------------------------------------------\
427 | |
428 | XschToolsSaveXfigArc |
429 | |
430 \------------------------------------------------------------*/
431
432 # if 0
433 static void XschToolsSaveXfigArc( X1r, Y1r, Dx, Dy, AngleFrom, AngleTo )
434
435 long X1r;
436 long Y1r;
437 long Dx;
438 long Dy;
439 long AngleFrom;
440 long AngleTo;
441 {
442 long MiddleAngle;
443 long Xc;
444 long Yc;
445 long Width;
446 long Height;
447 long X1;
448 long Y1;
449 long X2;
450 long Y2;
451 long X3;
452 long Y3;
453 double Rad;
454
455 Width = Dx / 2;
456 Height = Dy / 2;
457 Xc = X1r + Width;
458 Yc = Y1r + Height;
459
460 Rad = ( (double) AngleFrom * M_PI ) / ( 64.0 * 180.0 );
461
462 X1 = Xc + (long)( (double)Width * cos( Rad ) );
463 Y1 = Yc + (long)( (double)Height * sin( Rad ) );
464
465 Rad = ( (double) ( AngleTo + AngleFrom ) * M_PI ) / ( 64.0 * 180.0 );
466
467 X3 = Xc + (long)( (double)Width * cos( Rad ) );
468 Y3 = Yc + (long)( (double)Height * sin( Rad ) );
469
470 Rad = ( (double)( AngleTo + ( AngleFrom / 2 ) ) * M_PI ) / ( 2.0 * 64.0 * 180.0 );
471
472 X2 = Xc + (long)( (double)Width * cos( Rad ) );
473 Y2 = Yc + (long)( (double)Height * sin( Rad ) );
474
475 fprintf( XschXfigFile,
476 "5 1 0 1 %d 0 %d 0 -1 0.000 0 1 0 0 %f %f %ld %ld %ld %ld %ld %ld\n",
477 /* ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
478 * | | | | | | | | | | | | | | | | + Second Third
479 * | | | | | | | | | | | | | | | + 1st Point
480 * | | | | | | | | | | | | | | + Center
481 * | | | | | | | | | | | | | + Backward Arrow
482 * | | | | | | | | | | | | + Forward Arrow
483 * | | | | | | | | | | | + Direction
484 * | | | | | | | | | | + Cap style
485 * | | | | | | | | | + Style Val
486 * | | | | | | | | + Area Fill
487 * | | | | | | | + Pen Style
488 * | | | | | | + Depth
489 * | | | | | + Fill Color
490 * | | | | + Pen Color
491 * | | | + Width
492 * | | + Line Style
493 * | + Arc
494 * + Arc
495 */
496 XschXfigColor, XschXfigDepth,
497 (float)Xc, (float)Yc, X1, Y1, X2, Y2, X3, Y3 );
498 }
499 # endif
500
XschToolsSaveXfigArc(X1r,Y1r,Dx,Dy,AngleFrom,AngleTo)501 static void XschToolsSaveXfigArc( X1r, Y1r, Dx, Dy, AngleFrom, AngleTo )
502
503 long X1r;
504 long Y1r;
505 long Dx;
506 long Dy;
507 long AngleFrom;
508 long AngleTo;
509 {
510 long Xc;
511 long Yc;
512 long Width;
513 long Height;
514 long X1;
515 long Y1;
516 long X2;
517 long Y2;
518 long X3;
519 long Y3;
520 double Rad;
521
522 Width = Dx / 2;
523 Height = Dy / 2;
524 Xc = X1r + Width;
525 Yc = Y1r + Height;
526
527 Rad = ( (double) AngleFrom * M_PI ) / ( 64.0 * 180.0 );
528
529 X1 = Xc + (long)( (double)Width * cos( Rad ) );
530 Y1 = Yc + (long)( (double)Height * sin( Rad ) );
531
532 Rad = ( (double) ( AngleFrom + AngleTo ) * M_PI ) / ( 64.0 * 180.0 );
533
534 X3 = Xc + (long)( (double)Width * cos( Rad ) );
535 Y3 = Yc + (long)( (double)Height * sin( Rad ) );
536
537 Rad = ( (double)( AngleFrom + ( AngleTo / 2 ) ) * M_PI ) / ( 2.0 * 64.0 * 180.0 );
538
539 X2 = Xc + (long)( (double)Width * cos( Rad ) );
540 Y2 = Yc + (long)( (double)Height * sin( Rad ) );
541
542 fprintf( XschXfigFile,
543 "3 4 0 1 %d 0 %d 0 -1 0.000 0 0 0 3\n", XschXfigColor, XschXfigDepth );
544 /* ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
545 * | | | | | | | | | | | | | |
546 * | | | | | | | | | | | | | |
547 * | | | | | | | | | | | | | + Number points
548 * | | | | | | | | | | | | + Backward Arrow
549 * | | | | | | | | | | | + Forward Arrow
550 * | | | | | | | | | | + Cap style
551 * | | | | | | | | | + Style Val
552 * | | | | | | | | + Area Fill
553 * | | | | | | | + Pen Style
554 * | | | | | | + Depth
555 * | | | | | + Fill Color
556 * | | | | + Pen Color
557 * | | | + Width
558 * | | + Line Style
559 * | + Arc
560 * + Arc
561 */
562
563 fprintf( XschXfigFile, " %ld %ld %ld %ld %ld %ld\n",
564 X1, XschXfigDy - Y1,
565 X2, XschXfigDy - Y2,
566 X3, XschXfigDy - Y3 );
567
568 fprintf( XschXfigFile, " 0.000 -1.000 0.000\n" );
569 }
570
571 /*------------------------------------------------------------\
572 | |
573 | XschToolsSaveXfigBuffer |
574 | |
575 \------------------------------------------------------------*/
576
XschToolsSaveXfigBuffer(X1r,Y1r,X2r,Y2r,Ycr,Obj)577 static void XschToolsSaveXfigBuffer( X1r, Y1r, X2r, Y2r, Ycr, Obj )
578
579 long X1r;
580 long Y1r;
581 long X2r;
582 long Y2r;
583 long Ycr;
584 xschobj_list *Obj;
585 {
586 /*
587 ** Fred Petrot (The King ) has initially written those lines !
588 ** Ludo Jacomme (The Slave) has modified them :-)
589 */
590 /*long gs;*/
591 long is_x;
592 long is_y;
593 long cs;
594 long x, y1;
595 long DeltaX;
596 long DeltaY;
597
598 DeltaX = X2r - X1r;
599 DeltaY = Y2r - Y1r;
600
601 if ( DeltaX <= 0 ) DeltaX = 1;
602 if ( DeltaY <= 0 ) DeltaY = 1;
603
604 /*gs = DeltaX;*/
605 is_x = ( 5 * DeltaX ) / 16;
606 is_y = ( 5 * DeltaY ) / 8;
607 cs = DeltaX / 8;
608
609 y1 = Ycr;
610 x = X1r + cs;
611
612 XschToolsSaveXfigLine( x, y1 - is_y/2, x, y1 + is_y/2);
613 XschToolsSaveXfigLine( x , y1 - is_y/2, x + is_x, y1);
614 XschToolsSaveXfigLine( x , y1 + is_y/2, x + is_x, y1);
615
616 if ( ( Obj->ARG1 ) == 0 )
617 {
618 /* input line : centered vertically */
619 XschToolsSaveXfigLine( x - cs, y1, x , y1 );
620 }
621 else
622 {
623 /* Input circle */
624 XschToolsSaveXfigCircle( x - cs, y1 - cs/2, cs, cs );
625 }
626
627 if ( ( Obj->ARG2 ) == 0 )
628 {
629 /* Output line : centered vertically */
630 XschToolsSaveXfigLine( x + is_x , y1, x + is_x + cs, y1 );
631 }
632 else
633 {
634 /* Output circle */
635 XschToolsSaveXfigCircle( x + is_x, y1 - cs/2, cs, cs );
636 }
637
638 XschToolsSaveXfigLine( x + is_x + cs, y1, X2r, y1 );
639 }
640
641
642 /*------------------------------------------------------------\
643 | |
644 | XschToolsSaveXfigTristate |
645 | |
646 \------------------------------------------------------------*/
647
XschToolsSaveXfigTristate(X1r,Y1r,X2r,Y2r,Ycr,Obj)648 static void XschToolsSaveXfigTristate( X1r, Y1r, X2r, Y2r, Ycr, Obj )
649
650 long X1r;
651 long Y1r;
652 long X2r;
653 long Y2r;
654 long Ycr;
655 xschobj_list *Obj;
656 {
657 /*
658 ** Fred Petrot (The King ) has initially written those lines !
659 ** Ludo Jacomme (The Slave) has modified them :-)
660 */
661 /*long gs;*/
662 long is_x;
663 long is_y;
664 long cs;
665 long csm;
666 long x, y1, y2,y0;
667 long DeltaX;
668 long DeltaY;
669
670 DeltaX = X2r - X1r;
671 DeltaY = Y2r - Y1r;
672
673 if ( DeltaX <= 0 ) DeltaX = 1;
674 if ( DeltaY <= 0 ) DeltaY = 1;
675
676 /*gs = DeltaX;*/
677 is_x = ( 5 * DeltaX ) / 16;
678 is_y = ( 5 * DeltaY ) / 16;
679 cs = DeltaX / 8;
680 csm = DeltaX / 10;
681
682 y1 = Ycr;
683 /*x1 = (X2r + X1r) / 2;*/
684 x = X1r + cs;
685
686 XschToolsSaveXfigLine( x, y1 - is_y/2, x, y1 + is_y/2);
687
688 XschToolsSaveXfigLine( x , y1 - is_y/2, x + is_x, y1);
689 XschToolsSaveXfigLine( x , y1 + is_y/2, x + is_x, y1);
690
691 y0 = Obj->Y + ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
692 y0 -= XschBoundYmin;
693
694 y2 = Obj->Y + ( SCP_BOX_CON_BASE_Y + SCP_BOX_CON_STEP_Y ) * XSCH_UNIT;
695 y2 -= XschBoundYmin;
696
697 if ( ( Obj->ARG1 & 1) == 0 )
698 {
699 /* data line : centered vertically */
700 XschToolsSaveXfigLine( x - cs, y1, x , y1 );
701 }
702 else
703 {
704 /* Data circle */
705 XschToolsSaveXfigCircle( x - cs, y1 - cs/2, cs, cs );
706 }
707
708 /* Data Line */
709
710 XschToolsSaveXfigLine( x - cs, y0, x - cs, y1 );
711
712 if ( ( Obj->ARG1 & 2) == 0 )
713 {
714 /* Command Line */
715 XschToolsSaveXfigLine( x - cs, y2, x + is_x/2, y2 );
716
717 XschToolsSaveXfigLine( x + is_x/2, y2, x + is_x/2, y1 - is_y/4 );
718 }
719 else
720 {
721 /* Command circle */
722 XschToolsSaveXfigCircle( x + is_x/2 - csm/2, y1 - is_y/2 - csm/4, csm, csm );
723
724 /* Command Line */
725 XschToolsSaveXfigLine( x - cs, y2, x + is_x/2, y2 );
726
727 XschToolsSaveXfigLine( x + is_x/2, y2, x + is_x/2, y2 + csm );
728 }
729
730 if ( ( Obj->ARG2 ) == 0 )
731 {
732 /* Output line : centered vertically */
733 XschToolsSaveXfigLine( x + is_x , y1, x + is_x + cs, y1 );
734 }
735 else
736 {
737 /* Output circle */
738 XschToolsSaveXfigCircle( x + is_x, y1 - cs/2, cs, cs );
739 }
740
741 XschToolsSaveXfigLine( x + is_x + cs, y1, X2r, y1 );
742 }
743
744 /*------------------------------------------------------------\
745 | |
746 | XschToolsSaveXfigConstant |
747 | |
748 \------------------------------------------------------------*/
749
XschToolsSaveXfigConstant(X1r,Y1r,X2r,Y2r,Ycr,Obj)750 static void XschToolsSaveXfigConstant( X1r, Y1r, X2r, Y2r, Ycr, Obj )
751
752 long X1r;
753 long Y1r;
754 long X2r;
755 long Y2r;
756 long Ycr;
757 xschobj_list *Obj;
758 {
759 long cs;
760 long x, yc, y1,y2,y3;
761 long DeltaX;
762 /*long DeltaY;*/
763 int i;
764 int n;
765
766 n = Obj->ARG1;
767
768 DeltaX = X2r - X1r;
769 /* DeltaY = Y2r - Y1r;*/
770
771 if ( DeltaX <= 0 ) DeltaX = 1;
772 /* if ( DeltaY <= 0 ) DeltaY = 1;*/
773
774 cs = DeltaX / 8;
775 x = X1r + cs;
776
777 y1 = Obj->Y + ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
778 y1 -= XschBoundYmin;
779
780 for ( i = 0; i < n; i++ )
781 {
782 yc = y1;
783
784 if (( Obj->ARG2 & (1 << i)) == 0)
785 {
786 y2 = yc - cs;
787 y3 = y2 - cs;
788
789 XschToolsSaveXfigLine(
790 x, yc, x, y2 );
791
792 XschToolsSaveXfigLine( x - cs, y2, x + cs, y2 );
793
794 XschToolsSaveXfigLine( x - cs, y2, x, y3 );
795
796 XschToolsSaveXfigLine( x + cs, y2, x, y3 );
797 }
798 else
799 {
800 y2 = yc + cs;
801 y3 = y2 + cs;
802
803 XschToolsSaveXfigLine(
804 x, yc, x, y2 );
805
806 XschToolsSaveXfigLine(
807 x, y2, x - cs, y3 );
808
809 XschToolsSaveXfigLine(
810 x, y2, x + cs, y3 );
811 }
812
813 XschToolsSaveXfigLine( x, yc, X2r, yc );
814
815 y1 += ( SCP_BOX_CON_STEP_Y * XSCH_UNIT );
816 }
817 }
818
819 /*------------------------------------------------------------\
820 | |
821 | XschToolsSaveXfigTransistor |
822 | |
823 \------------------------------------------------------------*/
824
XschToolsSaveXfigTransistor(X1r,Y1r,X2r,Y2r,Ycr,Obj)825 static void XschToolsSaveXfigTransistor( X1r, Y1r, X2r, Y2r, Ycr, Obj )
826
827 long X1r;
828 long Y1r;
829 long X2r;
830 long Y2r;
831 long Ycr;
832 xschobj_list *Obj;
833 {
834 /*
835 ** Fred Petrot (The King ) has initially written those lines !
836 ** Ludo Jacomme (The Slave) has modified them :-)
837 */
838 long cs;
839 long x, x1, y1, y2,y0;
840 long DeltaX;
841 /*long DeltaY;*/
842
843 DeltaX = X2r - X1r;
844 /*DeltaY = Y2r - Y1r;*/
845
846 if ( DeltaX <= 0 ) DeltaX = 1;
847 /*if ( DeltaY <= 0 ) DeltaY = 1;*/
848
849 cs = DeltaX / 8;
850
851 y0 = Obj->Y + ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
852 y0 -= XschBoundYmin;
853
854 y2 = Obj->Y + ( SCP_BOX_CON_BASE_Y + SCP_BOX_CON_STEP_Y ) * XSCH_UNIT;
855 y2 -= XschBoundYmin;
856
857 y1 = Ycr;
858 /*
859 x1 = X2r - cs;
860 */
861 x1 = X1r + 3 * cs;
862 x = X1r;
863
864 XschToolsSaveXfigLine( x, y0, x, y0 - cs );
865
866 XschToolsSaveXfigLine( x, y0 - cs, x1 - cs, y0 - cs );
867
868 XschToolsSaveXfigLine( x1 - cs, y0 - cs, x1 - cs, y2 + cs );
869
870 XschToolsSaveXfigLine( x1 - cs, y2 + cs, x, y2 + cs );
871
872 XschToolsSaveXfigLine( x, y2 + cs, x, y2 );
873
874 XschToolsSaveXfigLine( x1, y0 - cs, x1, y2 + cs );
875
876 if ( ( Obj->ARG1 ) == 0 )
877 {
878 /* Output line : centered vertically */
879 XschToolsSaveXfigLine( x1, y1, x1 + cs, y1 );
880 }
881 else
882 {
883 /* Output circle */
884 XschToolsSaveXfigCircle( x1, y1 - cs/2, cs, cs );
885 }
886
887 XschToolsSaveXfigLine( x1 + cs, y1, X2r, y1 );
888 }
889
890 /*------------------------------------------------------------\
891 | |
892 | XschToolsSaveXfigAnd |
893 | |
894 \------------------------------------------------------------*/
895
XschToolsSaveXfigAnd(X1r,Y1r,X2r,Y2r,Ycr,Obj)896 static void XschToolsSaveXfigAnd( X1r, Y1r, X2r, Y2r, Ycr, Obj )
897
898 long X1r;
899 long Y1r;
900 long X2r;
901 long Y2r;
902 long Ycr;
903 xschobj_list *Obj;
904 {
905 /*
906 ** Fred Petrot (The King ) has initially written those lines !
907 ** Ludo Jacomme (The Slave) has modified them :-)
908 */
909 long gs_y;
910 long gs_x;
911 long cs;
912 int i;
913 int n;
914 long x, y;
915 long yc;
916 long y1;
917 long DeltaX;
918 long DeltaY;
919
920 DeltaX = X2r - X1r;
921 DeltaY = Y2r - Y1r;
922
923 if ( DeltaX <= 0 ) DeltaX = 1;
924 if ( DeltaY <= 0 ) DeltaY = 1;
925
926 gs_y = ( 7 * DeltaY ) / 8;
927 gs_x = ( 6 * DeltaX ) / 8;
928 cs = DeltaX / 8;
929
930 yc = Ycr;
931 y = Ycr - gs_y/2;
932 x = X1r + cs;
933 n = Obj->ARG1;
934
935 /* And shape alone */
936
937 XschToolsSaveXfigLine( x, y, x + gs_x/2, y );
938
939 XschToolsSaveXfigLine( x , y + gs_y, x + gs_x/2, y + gs_y );
940
941 XschToolsSaveXfigArc( x, y, gs_x, gs_y, 90 * 64, -180 * 64);
942
943 if ( Obj->ARG3 == 0 )
944 {
945 /* Output line : centered vertically */
946 XschToolsSaveXfigLine( x + gs_x, yc, x + gs_x + cs, yc );
947 }
948 else
949 {
950 /* Output circle (for a NAND) */
951 XschToolsSaveXfigCircle( x + gs_x, yc - cs/2, cs, cs );
952 }
953
954 /* Input lines */
955 XschToolsSaveXfigLine( x, y, x, y + gs_y);
956
957 y1 = Obj->Y + ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
958 y1 -= XschBoundYmin;
959
960 /* Circle for inversion */
961 for (i = 0; i < n; i++)
962 {
963 yc = y1;
964
965 if (( Obj->ARG2 & (1 << i)) == 0)
966 {
967 XschToolsSaveXfigLine( x - cs, yc, x, yc );
968 }
969 else
970 {
971 XschToolsSaveXfigCircle( x - cs, yc - cs/2, cs, cs );
972 }
973
974 y1 += ( SCP_BOX_CON_STEP_Y * XSCH_UNIT );
975 }
976 }
977
978 /*------------------------------------------------------------\
979 | |
980 | XschToolsSaveXfigRegister |
981 | |
982 \------------------------------------------------------------*/
983
XschToolsSaveXfigRegister(X1r,Y1r,X2r,Y2r,Ycr,Obj)984 static void XschToolsSaveXfigRegister( X1r, Y1r, X2r, Y2r, Ycr, Obj )
985
986 long X1r;
987 long Y1r;
988 long X2r;
989 long Y2r;
990 long Ycr;
991 xschobj_list *Obj;
992 {
993 /*
994 ** Fred Petrot (The King ) has initially written those lines !
995 ** Ludo Jacomme (The Slave) has modified them :-)
996 */
997 long gs_y;
998 long gs_x;
999 long cs;
1000 long es_x;
1001 long es_y;
1002 int i;
1003 int ni;
1004 long x, y;
1005 long yc;
1006 long xc;
1007 long y1;
1008 long DeltaX;
1009 long DeltaY;
1010
1011 DeltaX = X2r - X1r;
1012 DeltaY = Y2r - Y1r;
1013
1014 if ( DeltaX <= 0 ) DeltaX = 1;
1015 if ( DeltaY <= 0 ) DeltaY = 1;
1016
1017 gs_y = ( 7 * DeltaY ) / 8;
1018 gs_x = ( 6 * DeltaX ) / 8;
1019 cs = DeltaX / 8;
1020
1021 es_y = DeltaX / 4;
1022 es_x = DeltaX / 8;
1023
1024 yc = Ycr;
1025 y = Ycr - gs_y/2;
1026 x = X1r + cs;
1027 xc = (X2r + X1r) /2;
1028 ni = Obj->ARG1;
1029
1030 /* shape alone */
1031
1032 XschToolsSaveXfigRectangle( x, y, x + gs_x, y + gs_y );
1033
1034 /*
1035 ** Rising/Falling Edge
1036 */
1037 if ( ( Obj->ARG5 == 1 ) ||
1038 ( Obj->ARG5 == 2 ) )
1039 {
1040 XschToolsSaveXfigLine( xc, yc - es_y, xc, yc + es_y );
1041
1042 /*
1043 ** Rising
1044 */
1045 if ( Obj->ARG5 == 1 )
1046 {
1047 XschToolsSaveXfigLine( xc, yc + es_y, xc - es_x, yc + es_y );
1048
1049 XschToolsSaveXfigLine( xc, yc - es_y, xc + es_x, yc - es_y );
1050 }
1051 else
1052 /*
1053 ** Falling
1054 */
1055 {
1056 XschToolsSaveXfigLine( xc, yc - es_y, xc - es_x, yc - es_y );
1057
1058 XschToolsSaveXfigLine( xc, yc + es_y, xc + es_x, yc + es_y );
1059 }
1060 }
1061
1062 if ( Obj->ARG4 == 0 )
1063 {
1064 /* Output line : centered vertically */
1065 XschToolsSaveXfigLine( x + gs_x, yc, x + gs_x + cs, yc );
1066 }
1067 else
1068 {
1069 /* Output circle */
1070 XschToolsSaveXfigCircle( x + gs_x, yc - cs/2, cs, cs );
1071 }
1072
1073
1074 /* Input lines */
1075 /* Circle for inversion */
1076
1077 y1 = Obj->Y + ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
1078 y1 -= XschBoundYmin;
1079
1080 for (i = 0; i < ni; i++)
1081 {
1082 yc = y1;
1083
1084 if (( Obj->ARG2 & (1 << i)) == 0)
1085 {
1086 XschToolsSaveXfigLine( x - cs, yc, x, yc );
1087 }
1088 else
1089 {
1090 XschToolsSaveXfigCircle( x - cs, yc - cs/2, cs, cs );
1091 }
1092
1093 /* Clock */
1094
1095 if (( Obj->ARG3 & (1 << i)) != 0)
1096 {
1097 XschToolsSaveXfigLine( x, yc - cs/2, x + cs, yc );
1098
1099 XschToolsSaveXfigLine( x + cs, yc, x, yc + cs/2 );
1100 }
1101
1102 y1 += ( SCP_BOX_CON_STEP_Y * XSCH_UNIT );
1103 }
1104 }
1105
1106 /*------------------------------------------------------------\
1107 | |
1108 | XschToolsSaveXfigOr |
1109 | |
1110 \------------------------------------------------------------*/
1111
XschToolsSaveXfigOr(X1r,Y1r,X2r,Y2r,Ycr,Obj)1112 static void XschToolsSaveXfigOr( X1r, Y1r, X2r, Y2r, Ycr, Obj )
1113
1114 long X1r;
1115 long Y1r;
1116 long X2r;
1117 long Y2r;
1118 long Ycr;
1119 xschobj_list *Obj;
1120 {
1121 /*
1122 ** Fred Petrot (The King ) has initially written those lines !
1123 ** Ludo Jacomme (The Slave) has modified them :-)
1124 */
1125 long gs_y;
1126 long gs_x;
1127 long cs;
1128 long Radius;
1129 int i;
1130 int n;
1131 long x, y;
1132 long yc;
1133 long y1;
1134 long DeltaX;
1135 long DeltaY;
1136
1137 DeltaX = X2r - X1r;
1138 DeltaY = Y2r - Y1r;
1139
1140 if ( DeltaX <= 0 ) DeltaX = 1;
1141 if ( DeltaY <= 0 ) DeltaY = 1;
1142
1143 gs_y = ( 7 * DeltaY ) / 8;
1144 gs_x = ( 6 * DeltaX ) / 8;
1145 cs = DeltaX / 8;
1146
1147 yc = Ycr;
1148 y = Ycr - gs_y/2;
1149 x = X1r + cs;
1150 n = Obj->ARG1;
1151
1152 /* Or shape alone */
1153
1154 XschToolsSaveXfigLine( x, y, x + gs_x/2, y );
1155
1156 XschToolsSaveXfigLine( x , y + gs_y, x + gs_x/2, y + gs_y );
1157
1158 XschToolsSaveXfigArc( x, y, gs_x, gs_y, 90 * 64, -180 * 64);
1159
1160 Radius = (float)(gs_y) * 0.707106781185;
1161
1162 XschToolsSaveXfigArc(
1163 x - (Radius * 5 / 3), yc - Radius,
1164 Radius * 2, Radius * 2, 45 * 64, -90 * 64);
1165
1166 if ( Obj->ARG3 == 0 )
1167 {
1168 /* Output line : centered vertically */
1169 XschToolsSaveXfigLine( x + gs_x, yc, x + gs_x + cs, yc );
1170 }
1171 else
1172 {
1173 /* Output circle */
1174 XschToolsSaveXfigCircle( x + gs_x, yc - cs/2, cs, cs );
1175 }
1176
1177 /* Input lines */
1178
1179 y1 = Obj->Y + ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
1180 y1 -= XschBoundYmin;
1181
1182 /* Circle for inversion */
1183 for (i = 0; i < n; i++)
1184 {
1185 yc = y1;
1186
1187 if (( Obj->ARG2 & (1 << i)) == 0)
1188 {
1189 XschToolsSaveXfigLine( x - cs, yc, x, yc );
1190 }
1191 else
1192 {
1193 XschToolsSaveXfigCircle( x - cs, yc - cs/2, cs, cs );
1194 }
1195
1196 y1 += ( SCP_BOX_CON_STEP_Y * XSCH_UNIT );
1197 }
1198 }
1199
1200 /*------------------------------------------------------------\
1201 | |
1202 | XschToolsSaveXfigXor |
1203 | |
1204 \------------------------------------------------------------*/
1205
XschToolsSaveXfigXor(X1r,Y1r,X2r,Y2r,Ycr,Obj)1206 static void XschToolsSaveXfigXor( X1r, Y1r, X2r, Y2r, Ycr, Obj )
1207
1208 long X1r;
1209 long Y1r;
1210 long X2r;
1211 long Y2r;
1212 long Ycr;
1213 xschobj_list *Obj;
1214 {
1215 /*
1216 ** Fred Petrot (The King ) has initially written those lines !
1217 ** Ludo Jacomme (The Slave) has modified them :-)
1218 */
1219 long gs_y;
1220 long gs_x;
1221 long cs;
1222 long Radius;
1223 int i;
1224 int n;
1225 long x, y;
1226 long yc;
1227 long y1;
1228 long DeltaX;
1229 long DeltaY;
1230
1231 DeltaX = X2r - X1r;
1232 DeltaY = Y2r - Y1r;
1233
1234 if ( DeltaX <= 0 ) DeltaX = 1;
1235 if ( DeltaY <= 0 ) DeltaY = 1;
1236
1237 gs_y = ( 7 * DeltaY ) / 8;
1238 gs_x = ( 6 * DeltaX ) / 8;
1239 cs = DeltaX / 8;
1240
1241 yc = Ycr;
1242 y = Ycr - gs_y/2;
1243 x = X1r + cs;
1244 n = Obj->ARG1;
1245
1246 /* Xor shape alone */
1247
1248 XschToolsSaveXfigLine( x + gs_x/4, y, x + gs_x/2, y );
1249
1250 XschToolsSaveXfigLine( x + gs_x/4, y + gs_y, x + gs_x/2, y + gs_y );
1251
1252 XschToolsSaveXfigArc( x, y, gs_x, gs_y, 90 * 64, -180 * 64);
1253
1254 Radius = (float)(gs_y) * 0.707106781185; /* sqrt(2) */
1255
1256 XschToolsSaveXfigArc( x - (Radius * 5 / 3), yc - Radius,
1257 Radius * 2, Radius * 2, 45 * 64, -90 * 64);
1258
1259 XschToolsSaveXfigArc( x - (Radius * 4 / 3), yc - Radius,
1260 Radius * 2, Radius * 2, 45 * 64, -90 * 64);
1261
1262 if ( Obj->ARG3 == 0 )
1263 {
1264 /* Output line : centered vertically */
1265 XschToolsSaveXfigLine( x + gs_x, yc, x + gs_x + cs, yc );
1266 }
1267 else
1268 {
1269 /* Output circle */
1270 XschToolsSaveXfigCircle( x + gs_x, yc - cs/2, cs, cs );
1271 }
1272
1273 /* Input lines */
1274
1275 y1 = Obj->Y + ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
1276 y1 -= XschBoundYmin;
1277
1278 /* Circle for inversion */
1279 for (i = 0; i < n; i++)
1280 {
1281 yc = y1;
1282
1283 if (( Obj->ARG2 & (1 << i)) == 0)
1284 {
1285 XschToolsSaveXfigLine( x - cs, yc, x, yc );
1286 }
1287 else
1288 {
1289 XschToolsSaveXfigCircle( x - cs, yc - cs/2, cs, cs );
1290 }
1291
1292 y1 += ( SCP_BOX_CON_STEP_Y * XSCH_UNIT );
1293 }
1294 }
1295
1296 /*------------------------------------------------------------\
1297 | |
1298 | XschToolsSaveXfigAndOr |
1299 | |
1300 \------------------------------------------------------------*/
1301
XschToolsSaveXfigAndOr(X1r,Y1r,X2r,Y2r,Ycr,Obj)1302 static void XschToolsSaveXfigAndOr( X1r, Y1r, X2r, Y2r, Ycr, Obj )
1303
1304 long X1r;
1305 long Y1r;
1306 long X2r;
1307 long Y2r;
1308 long Ycr;
1309 xschobj_list *Obj;
1310 {
1311 long gs_y;
1312 long gs_x;
1313 long cs;
1314 int i;
1315 int n;
1316 int na;
1317 long gos_y;
1318 long gos_x;
1319 long gas_y;
1320 long gas_x;
1321 long Radius;
1322
1323 long x, y;
1324 long yc;
1325 long y1;
1326 long DeltaX;
1327 long DeltaY;
1328
1329 DeltaX = X2r - X1r;
1330 DeltaY = Y2r - Y1r;
1331
1332 if ( DeltaX <= 0 ) DeltaX = 1;
1333 if ( DeltaY <= 0 ) DeltaY = 1;
1334
1335 n = Obj->ARG1;
1336
1337 gs_y = ( 7 * DeltaY ) / 8;
1338 gs_x = ( 6 * DeltaX ) / 8;
1339 cs = DeltaX / 8;
1340
1341 yc = Ycr;
1342 y = Ycr - gs_y/2;
1343 x = X1r + cs;
1344
1345 if ( Obj->ARG3 == 0 )
1346 {
1347 /* Output line : centered vertically */
1348 XschToolsSaveXfigLine( x + gs_x, yc, x + gs_x + cs, yc );
1349 }
1350 else
1351 {
1352 /* Output circle */
1353 XschToolsSaveXfigCircle( x + gs_x, yc - cs/2, cs, cs );
1354 }
1355
1356 /*
1357 ** Input connectors
1358 */
1359 y1 = Obj->Y + ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
1360 y1 -= XschBoundYmin;
1361
1362 /* Circle for inversion */
1363 for (i = 0; i < n; i++)
1364 {
1365 yc = y1;
1366
1367 if (( Obj->ARG2 & (1 << i)) == 0)
1368 {
1369 XschToolsSaveXfigLine( x - cs, yc, x, yc );
1370 }
1371 else
1372 {
1373 XschToolsSaveXfigCircle( x - cs, yc - cs/2, cs, cs );
1374 }
1375
1376 y1 += ( SCP_BOX_CON_STEP_Y * XSCH_UNIT );
1377 }
1378 /*
1379 ** ToolsSaveXfig Input And gates
1380 */
1381 na = n / 2;
1382
1383 if ( n & 1 ) gas_y = 7 * DeltaY / ( 8 * ( na + 1 ) );
1384 else gas_y = 7 * DeltaY / ( 8 * na );
1385
1386 gas_x = gs_x / 3;
1387
1388 y1 = Obj->Y + Obj->DY - ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
1389 y1 -= XschBoundYmin;
1390 y1 -= SCP_BOX_CON_STEP_Y * XSCH_UNIT / 2;
1391
1392 for ( i = 0; i < na; i++ )
1393 {
1394 yc = y1;
1395
1396 XschToolsSaveXfigLine( x, yc - gas_y /2, x, yc + gas_y/2);
1397
1398 /* And Shape */
1399
1400 XschToolsSaveXfigLine(
1401 x, yc - gas_y/2, x + gas_x/2, yc - gas_y/2 );
1402
1403 XschToolsSaveXfigLine(
1404 x , yc + gas_y/2,
1405 x + gas_x/2, yc + gas_y/2 );
1406
1407 XschToolsSaveXfigArc( x, yc - gas_y/2, gas_x, gas_y -1, 90 * 64, -180 * 64);
1408
1409 y1 -= 2 * ( SCP_BOX_CON_STEP_Y * XSCH_UNIT );
1410 }
1411
1412 if ( n & 1 )
1413 {
1414 y1 = y1 + ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
1415 yc = y1;
1416
1417 XschToolsSaveXfigLine( x , yc, x + gas_x, yc );
1418
1419
1420 }
1421 /*
1422 ** ToolsSaveXfig Output Or gate
1423 */
1424 /* Or shape alone */
1425 gos_y = 2 * DeltaY / 3;
1426 gos_x = ( 2 * gs_x ) / 3;
1427 yc = Ycr;
1428 y = yc + gos_y /2;
1429 x = x + gas_x;
1430
1431 XschToolsSaveXfigLine(
1432 x, y, x + gos_x/2, y );
1433
1434 XschToolsSaveXfigLine(
1435 x , y - gos_y,
1436 x + gos_x/2, y - gos_y );
1437
1438 XschToolsSaveXfigArc( x, y - gos_y, gos_x, gos_y, 90 * 64, -180 * 64);
1439
1440 Radius = (float)(gos_y) * 0.707106781185;
1441
1442 XschToolsSaveXfigArc( x - (Radius * 5 / 3), yc - Radius,
1443 Radius * 2, Radius * 2, 45 * 64, -90 * 64);
1444 }
1445
1446 /*------------------------------------------------------------\
1447 | |
1448 | XschToolsSaveXfigMux |
1449 | |
1450 \------------------------------------------------------------*/
1451
XschToolsSaveXfigMux(X1r,Y1r,X2r,Y2r,Ycr,Obj)1452 static void XschToolsSaveXfigMux( X1r, Y1r, X2r, Y2r, Ycr, Obj )
1453
1454 long X1r;
1455 long Y1r;
1456 long X2r;
1457 long Y2r;
1458 long Ycr;
1459 xschobj_list *Obj;
1460 {
1461 long gs_x;
1462 long ms_x;
1463 long ms_y;
1464 long cs;
1465 int i;
1466 int ni;
1467 int ns;
1468
1469 long x;
1470 long yc;
1471 long y1;
1472 long y2;
1473 long y3;
1474 long x3;
1475 long DeltaX;
1476 /*long DeltaY;*/
1477
1478 DeltaX = X2r - X1r;
1479 /* DeltaY = Y2r - Y1r;*/
1480
1481 if ( DeltaX <= 0 ) DeltaX = 1;
1482 /* if ( DeltaY <= 0 ) DeltaY = 1;*/
1483
1484 ns = Obj->ARG1;
1485 ni = Obj->ARG2;
1486
1487 /*gs_y = ( 7 * DeltaY ) / 8;*/
1488 gs_x = ( 6 * DeltaX ) / 8;
1489 cs = DeltaX / 8;
1490
1491 yc = Ycr;
1492 x = X1r + cs;
1493
1494 /*
1495 ** ToolsSaveXfig Mux Rectangle
1496 */
1497 ms_x = gs_x / 2;
1498
1499 y1 = Obj->Y + (2 * SCP_BOX_CON_BASE_Y + (ni - 1) * SCP_BOX_CON_STEP_Y) * XSCH_UNIT;
1500 y1 -= XschBoundYmin;
1501
1502 y2 = y1;
1503 ms_y = y2 - Y1r;
1504
1505 XschToolsSaveXfigRectangle( x, y2, x + ms_x, y2 - ms_y );
1506
1507 XschToolsSaveXfigLine( x, y2, x + ms_x, y2 - ms_y / 2 );
1508
1509 XschToolsSaveXfigLine( x + ms_x, y2 - ms_y/2, x, y2 - ms_y );
1510
1511 if ( Obj->ARG4 == 0 )
1512 {
1513 /* Output line : centered vertically */
1514 XschToolsSaveXfigLine( x + ms_x, y2 - ms_y/2, x + ms_x + cs, y2 - ms_y/2 );
1515 }
1516 else
1517 {
1518 /* Output circle */
1519 XschToolsSaveXfigCircle( x + ms_x, y2 - ms_y/2 - cs/2, cs, cs );
1520 }
1521
1522 y3 = y2 - ms_y/2;
1523
1524 XschToolsSaveXfigLine( x + ms_x + cs, y3, x + gs_x + cs, y3 );
1525
1526 XschToolsSaveXfigLine( x + gs_x + cs, y3, x + gs_x + cs, yc );
1527 /*
1528 ** Input connectors
1529 */
1530 y1 = Obj->Y + ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
1531 y1 -= XschBoundYmin;
1532
1533 /* Circle for inversion */
1534 for (i = 0; i < ni; i++)
1535 {
1536 y3 = y1;
1537
1538 if (( Obj->ARG3 & (1 << i)) == 0)
1539 {
1540 XschToolsSaveXfigLine( x - cs, y3, x, y3 );
1541 }
1542 else
1543 {
1544 XschToolsSaveXfigCircle( x - cs, y3 - cs/2, cs, cs );
1545 }
1546
1547 y1 += ( SCP_BOX_CON_STEP_Y * XSCH_UNIT );
1548 }
1549
1550 x3 = x;
1551 /*
1552 ** Select connectors
1553 */
1554 for (i = 0; i < ns; i++)
1555 {
1556 y3 = y1;
1557
1558 x3 += ms_x / ( ns + 1 );
1559
1560 XschToolsSaveXfigLine( x - cs, y3, x3, y3 );
1561
1562 XschToolsSaveXfigLine( x3, y3, x3, y2 );
1563
1564 y1 += ( SCP_BOX_CON_STEP_Y * XSCH_UNIT );
1565 }
1566 }
1567
1568
1569 /*------------------------------------------------------------\
1570 | |
1571 | XschToolsSaveXfigOrAnd |
1572 | |
1573 \------------------------------------------------------------*/
1574
XschToolsSaveXfigOrAnd(X1r,Y1r,X2r,Y2r,Ycr,Obj)1575 static void XschToolsSaveXfigOrAnd( X1r, Y1r, X2r, Y2r, Ycr, Obj )
1576
1577 long X1r;
1578 long Y1r;
1579 long X2r;
1580 long Y2r;
1581 long Ycr;
1582 xschobj_list *Obj;
1583 {
1584 /*long gs_y;*/
1585 long gs_x;
1586 long cs;
1587 int i;
1588 int n;
1589 int no;
1590 long gos_y;
1591 long gos_x;
1592 long gas_y;
1593 long gas_x;
1594 long Radius;
1595
1596 long x /*, y*/;
1597 long yc;
1598 long y1;
1599 long DeltaX;
1600 long DeltaY;
1601
1602 DeltaX = X2r - X1r;
1603 DeltaY = Y2r - Y1r;
1604
1605 if ( DeltaX <= 0 ) DeltaX = 1;
1606 if ( DeltaY <= 0 ) DeltaY = 1;
1607
1608 n = Obj->ARG1;
1609
1610 /*gs_y = ( 7 * DeltaY ) / 8;*/
1611 gs_x = ( 6 * DeltaX ) / 8;
1612 cs = DeltaX / 8;
1613
1614 yc = Ycr;
1615 /*y = Ycr - gs_y/2;*/
1616 x = X1r + cs;
1617
1618 if ( Obj->ARG3 == 0 )
1619 {
1620 /* Output line : centered vertically */
1621 XschToolsSaveXfigLine( x + gs_x, yc, x + gs_x + cs, yc );
1622 }
1623 else
1624 {
1625 /* Output circle */
1626 XschToolsSaveXfigCircle( x + gs_x, yc - cs/2, cs, cs );
1627 }
1628
1629 /*
1630 ** Input connectors
1631 */
1632 y1 = Obj->Y + ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
1633 y1 -= XschBoundYmin;
1634
1635 /* Circle for inversion */
1636 for (i = 0; i < n; i++)
1637 {
1638 yc = y1;
1639
1640 if (( Obj->ARG2 & (1 << i)) == 0)
1641 {
1642 XschToolsSaveXfigLine( x - cs, yc, x, yc );
1643 }
1644 else
1645 {
1646 XschToolsSaveXfigCircle( x - cs, yc - cs/2, cs, cs );
1647 }
1648
1649 y1 += ( SCP_BOX_CON_STEP_Y * XSCH_UNIT );
1650 }
1651 /*
1652 ** ToolsSaveXfig Input Or gates
1653 */
1654 no = n / 2;
1655
1656 if ( n & 1 ) gos_y = 7 * DeltaY / ( 8 * ( no + 1 ) );
1657 else gos_y = 7 * DeltaY / ( 8 * no );
1658
1659 gos_x = gs_x / 3;
1660
1661 y1 = Obj->Y + Obj->DY - ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
1662 y1 -= XschBoundYmin;
1663 y1 -= SCP_BOX_CON_STEP_Y * XSCH_UNIT / 2;
1664
1665 for ( i = 0; i < no; i++ )
1666 {
1667 yc = y1;
1668
1669 /* Or shape alone */
1670 XschToolsSaveXfigLine( x , yc + gos_y/2, x + gos_x/2, yc + gos_y/2 );
1671
1672 XschToolsSaveXfigLine( x , yc - gos_y/2, x + gos_x/2, yc - gos_y/2 );
1673
1674 XschToolsSaveXfigArc( x, yc - gos_y/2, gos_x, gos_y-1, 90 * 64, -180 * 64);
1675
1676 Radius = (float)(gos_y) * 0.707106781185;
1677
1678 XschToolsSaveXfigArc( x - (Radius * 5 / 3), yc - Radius,
1679 Radius * 2, Radius * 2, 45 * 64, -90 * 64);
1680
1681
1682 y1 -= 2 * ( SCP_BOX_CON_STEP_Y * XSCH_UNIT );
1683 }
1684
1685 if ( n & 1 )
1686 {
1687 y1 = y1 + ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
1688 yc = y1;
1689
1690 XschToolsSaveXfigLine( x , yc, x + gos_x, yc );
1691
1692 }
1693
1694 /* ToolsSaveXfig output And Gate */
1695 gas_y = 2 * DeltaY / 3;
1696 gas_x = ( 2 * gs_x ) / 3;
1697 yc = Ycr;
1698 /*y = yc + gas_y /2;*/
1699 x = x + gos_x;
1700
1701 XschToolsSaveXfigLine( x, yc - gas_y /2, x, yc + gas_y/2);
1702
1703
1704 XschToolsSaveXfigLine( x, yc - gas_y/2, x + gas_x/2, yc - gas_y/2 );
1705
1706 XschToolsSaveXfigLine( x , yc + gas_y/2, x + gas_x/2, yc + gas_y/2 );
1707
1708 XschToolsSaveXfigArc( x, yc - gas_y/2, gas_x, gas_y -1, 90 * 64, -180 * 64);
1709 }
1710
1711 /*------------------------------------------------------------\
1712 | |
1713 | XschToolsSaveXfigPentagon |
1714 | |
1715 \------------------------------------------------------------*/
1716
XschToolsSaveXfigPentagon(X1,Y1,X2,Y2,Obj)1717 void XschToolsSaveXfigPentagon( X1, Y1, X2, Y2, Obj )
1718
1719 long X1;
1720 long Y1;
1721 long X2;
1722 long Y2;
1723 xschobj_list *Obj;
1724 {
1725 long StepX;
1726 long StepY;
1727
1728 StepY = ( Y2 - Y1 ) >> 1;
1729 StepX = StepY >> 1;
1730
1731 if ( StepY <= 0 ) StepY = 1;
1732 if ( StepX <= 0 ) StepX = 1;
1733
1734 fprintf( XschXfigFile,
1735 "2 3 0 1 %d 0 %d 0 -1 0.000 0 0 -1 0 0 7\n", XschXfigColor, XschXfigDepth );
1736 /* ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
1737 * | | | | | | | | | | | | | | | + Number Points
1738 * | | | | | | | | | | | | | | + Backward Arrow
1739 * | | | | | | | | | | | | | + Forward Arrow
1740 * | | | | | | | | | | | | + Radius
1741 * | | | | | | | | | | | + Cap style
1742 * | | | | | | | | | | + Join style
1743 * | | | | | | | | | + Style Val
1744 * | | | | | | | | + Area Fill
1745 * | | | | | | | + Pen Style
1746 * | | | | | | + Depth
1747 * | | | | | + Fill Color
1748 * | | | | + Pen Color
1749 * | | | + Width
1750 * | | + Line Style
1751 * | + Poly Line
1752 * + Poly Line
1753 */
1754
1755 fprintf( XschXfigFile, " %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld\n",
1756 X1 , XschXfigDy - Y1,
1757 X1 , XschXfigDy - Y2,
1758 X1 , XschXfigDy - Y2,
1759 X2 - StepX, XschXfigDy - Y2,
1760 X2 , XschXfigDy - ( Y1 + StepY ),
1761 X2 - StepX, XschXfigDy - Y1,
1762 X1 , XschXfigDy - Y1 );
1763 }
1764
1765 /*------------------------------------------------------------\
1766 | |
1767 | XschToolsSaveXfigString |
1768 | |
1769 \------------------------------------------------------------*/
1770
XschToolsSaveXfigString(X1,Y1,Text,Justified)1771 void XschToolsSaveXfigString( X1, Y1, Text, Justified )
1772
1773 long X1;
1774 long Y1;
1775 char *Text;
1776 int Justified;
1777 {
1778 fprintf( XschXfigFile,
1779 "4 %d %d %d 0 0 0.0 0.0 0 0.0 0.0 %ld %ld %s\\001\n",
1780 /* ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
1781 * | | | | | | | | | | | | | + String
1782 * | | | | | | | | | | | | + Y
1783 * | | | | | | | | | | | + X
1784 * | | | | | | | | | | + Length
1785 * | | | | | | | | | + Height
1786 * | | | | | | | | + Font flags
1787 * | | | | | | | + Font Angle
1788 * | | | | | | + Font size
1789 * | | | | | + Font
1790 * | | | | + Pen Style
1791 * | | | + Depth
1792 * | | + Pen Color
1793 * | + Justified
1794 * + String
1795 */
1796 Justified, XschXfigColor, XschXfigDepth, X1, XschXfigDy - Y1, Text );
1797 }
1798
1799 /*------------------------------------------------------------\
1800 | |
1801 | XschToolsSaveXfigObject |
1802 | |
1803 \------------------------------------------------------------*/
1804
XschToolsSaveXfigObject(Obj)1805 void XschToolsSaveXfigObject( Obj )
1806
1807 xschobj_list *Obj;
1808 {
1809 long X1r;
1810 long X2r;
1811 long Y1r;
1812 long Y2r;
1813 long Ycr;
1814 long DeltaX;
1815 long DeltaY;
1816 short ObjType;
1817
1818 if ( IsXschLineLeft( Obj ) )
1819 {
1820 X1r = Obj->X + Obj->DX;
1821 X2r = Obj->X;
1822 }
1823 else
1824 {
1825 X1r = Obj->X;
1826 X2r = Obj->X + Obj->DX;
1827 }
1828
1829 if ( IsXschLineDown( Obj ) )
1830 {
1831 Y1r = Obj->Y + Obj->DY;
1832 Y2r = Obj->Y;
1833 }
1834 else
1835 {
1836 Y1r = Obj->Y;
1837 Y2r = Obj->Y + Obj->DY;
1838 }
1839
1840 X1r -= XschBoundXmin;
1841 X2r -= XschBoundXmin;
1842 Y1r -= XschBoundYmin;
1843 Y2r -= XschBoundYmin;
1844
1845 Ycr = (float)( ( Y2r + Y1r) >> 1 );
1846 X1r = (float)( X1r );
1847 Y1r = (float)( Y1r );
1848 X2r = (float)( X2r );
1849 Y2r = (float)( Y2r );
1850
1851 DeltaX = X2r - X1r;
1852 DeltaY = Y2r - Y1r;
1853
1854 if ( DeltaX <= 0 ) DeltaX = 1;
1855 if ( DeltaY <= 0 ) DeltaY = 1;
1856
1857 ObjType = GetXschObjectType( Obj );
1858
1859 if ( ( ObjType >= XSCH_OBJECT_BUFFER ) &&
1860 ( ObjType <= XSCH_OBJECT_MUX ) )
1861 {
1862 if ( ( DeltaX < 5 ) ||
1863 ( DeltaY < 5 ) ) ObjType = XSCH_OBJECT_RECTANGLE;
1864 }
1865
1866 if ( ObjType >= XSCH_OBJECT_CROSS_BOX )
1867 {
1868 fprintf( XschXfigFile, "6 %ld %ld %ld %ld\n",
1869 X1r, XschXfigDy - Y1r,
1870 X2r, XschXfigDy - Y2r );
1871 }
1872
1873 switch ( ObjType )
1874 {
1875 case XSCH_OBJECT_LINE :
1876
1877 XschToolsSaveXfigLine( X1r, Y1r, X2r, Y2r );
1878
1879 break;
1880
1881 case XSCH_OBJECT_PENTAGON :
1882
1883 XschToolsSaveXfigPentagon( X1r, Y1r, X2r, Y2r, Obj );
1884
1885 break;
1886
1887 case XSCH_OBJECT_RECTANGLE :
1888
1889 XschToolsSaveXfigRectangle( X1r, Y1r, X2r, Y2r );
1890
1891 break;
1892
1893 case XSCH_OBJECT_CROSS_BOX :
1894
1895 XschToolsSaveXfigRectangle( X1r, Y1r, X2r, Y2r );
1896 XschToolsSaveXfigLine( X1r, Y1r, X2r, Y2r );
1897 XschToolsSaveXfigLine( X1r, Y2r, X2r, Y1r );
1898
1899 break;
1900
1901 case XSCH_OBJECT_BUFFER :
1902
1903 XschToolsSaveXfigBuffer( X1r, Y1r, X2r, Y2r, Ycr, Obj );
1904
1905 break;
1906
1907 case XSCH_OBJECT_AND :
1908
1909 XschToolsSaveXfigAnd( X1r, Y1r, X2r, Y2r, Ycr, Obj );
1910
1911 break;
1912
1913 case XSCH_OBJECT_OR :
1914
1915 XschToolsSaveXfigOr( X1r, Y1r, X2r, Y2r, Ycr, Obj );
1916
1917 break;
1918
1919 case XSCH_OBJECT_XOR :
1920
1921 XschToolsSaveXfigXor( X1r, Y1r, X2r, Y2r, Ycr, Obj );
1922
1923 break;
1924
1925 case XSCH_OBJECT_TRISTATE :
1926
1927 XschToolsSaveXfigTristate( X1r, Y1r, X2r, Y2r, Ycr, Obj );
1928
1929 break;
1930
1931 case XSCH_OBJECT_REGISTER :
1932
1933 XschToolsSaveXfigRegister( X1r, Y1r, X2r, Y2r, Ycr, Obj );
1934
1935 break;
1936
1937 case XSCH_OBJECT_TRANSISTOR :
1938
1939 XschToolsSaveXfigTransistor( X1r, Y1r, X2r, Y2r, Ycr, Obj );
1940
1941 break;
1942
1943 case XSCH_OBJECT_CONSTANT :
1944
1945 XschToolsSaveXfigConstant( X1r, Y1r, X2r, Y2r, Ycr, Obj );
1946
1947 break;
1948
1949 case XSCH_OBJECT_ANDOR :
1950
1951 XschToolsSaveXfigAndOr( X1r, Y1r, X2r, Y2r, Ycr, Obj );
1952
1953 break;
1954
1955 case XSCH_OBJECT_ORAND :
1956
1957 XschToolsSaveXfigOrAnd( X1r, Y1r, X2r, Y2r, Ycr, Obj );
1958
1959 break;
1960
1961 case XSCH_OBJECT_MUX :
1962
1963 XschToolsSaveXfigMux( X1r, Y1r, X2r, Y2r, Ycr, Obj );
1964
1965 break;
1966 }
1967
1968 if ( Obj->NAME != (char *)0 )
1969 {
1970 if ( ( ( IsXschSchCon( Obj ) ) &&
1971 ( ( ( IsXschSchConExt( Obj ) ) &&
1972 ( XSCH_ACTIVE_NAME_TABLE[ XSCH_CONNECTOR_NAME ] ) ) ||
1973 ( ( ! IsXschSchConExt( Obj ) ) &&
1974 ( XSCH_ACTIVE_NAME_TABLE[ XSCH_INS_CON_NAME ] ) ) ) ) ||
1975 ( ( IsXschSchBox( Obj ) &&
1976 XSCH_ACTIVE_NAME_TABLE[ XSCH_INSTANCE_NAME ] ) ) ||
1977 ( ( IsXschSchNet( Obj ) &&
1978 XSCH_ACTIVE_NAME_TABLE[ XSCH_NET_NAME ] ) ) )
1979 {
1980 if ( Obj->TYPE == XSCH_OBJECT_TEXT_RIGHT )
1981 {
1982 /* Left */
1983 XschToolsSaveXfigString( X1r, Y1r, Obj->NAME, 0 );
1984 }
1985 else
1986 if ( Obj->TYPE == XSCH_OBJECT_TEXT_LEFT )
1987 {
1988 /* Right */
1989 XschToolsSaveXfigString( X2r, Y1r, Obj->NAME, 2 );
1990 }
1991 else
1992 {
1993 /* Center */
1994 XschToolsSaveXfigString( ( X2r + X1r ) >> 1, Y1r, Obj->NAME, 1 );
1995 }
1996 }
1997 }
1998
1999 if ( ObjType >= XSCH_OBJECT_CROSS_BOX )
2000 {
2001 fprintf( XschXfigFile, "-6\n" );
2002 }
2003 }
2004
2005 /*------------------------------------------------------------\
2006 | |
2007 | XschToolsSaveXfig |
2008 | |
2009 \------------------------------------------------------------*/
2010
XschToolsSaveXfig(FileName)2011 void XschToolsSaveXfig( FileName )
2012
2013 char *FileName;
2014 {
2015 xschobj_list *Obj;
2016 int Layer;
2017
2018
2019 FileName = autbasename( FileName, "fig" );
2020
2021 XschXfigFile = mbkfopen( FileName, "fig", "w" );
2022
2023 if ( XschXfigFile == (FILE *)0 )
2024 {
2025 XschErrorMessage( XschMainWindow, "Unable to save fig file !" );
2026
2027 return;
2028 }
2029
2030 XschSetMouseCursor( XschGraphicWindow, XSCH_WATCH_CURSOR );
2031
2032 XschXfigDy = XschBoundYmax - XschBoundYmin;
2033 /*
2034 ** Xfig header file
2035 */
2036 fprintf( XschXfigFile,
2037 "#FIG 3.2\nLandscape\nCenter\nMetric\nA4\n100.00\nSingle\n-2\n1200 2\n" );
2038
2039 for ( Layer = 0; Layer < XSCH_MAX_LAYER; Layer++ )
2040 {
2041 fprintf( XschXfigFile, "0 %d #%06lx\n", Layer + 32, (unsigned long)XSCH_LAYER_XFIG_COLOR[ Layer ] );
2042 }
2043
2044 for ( Layer = 0; Layer < XSCH_MAX_LAYER; Layer++ )
2045 {
2046 if ( XSCH_ACTIVE_LAYER_TABLE[ Layer ] == 0 ) continue;
2047
2048 XschXfigDepth = Layer;
2049 XschXfigColor = 32 + Layer;
2050
2051 if ( ( XschXfigColor == 0 ) || ( XschXfigColor == 8 ) ) XschXfigColor++;
2052
2053 for ( Obj = XschFigure->OBJECT[ Layer ];
2054 Obj != (xschobj_list *)NULL;
2055 Obj = Obj->NEXT )
2056 {
2057 if ( XSCH_ACTIVE_LAYER_TABLE[ Obj->LAYER ] == 0 ) continue;
2058
2059 XschToolsSaveXfigObject( Obj );
2060
2061 }
2062 }
2063
2064 fclose( XschXfigFile );
2065
2066 XschSetMouseCursor( XschGraphicWindow, XSCH_NORMAL_CURSOR );
2067 }
2068