/alliance-5.0/xsch/src/XMX_view.c

https://github.com/clothbot/Alliance-VLSI-CAD-System · C · 1943 lines · 1346 code · 316 blank · 281 comment · 122 complexity · 5ecd0df74dc2442572288d6a4d4ebd0d MD5 · raw file

  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. | 675 Mass Ave, Cambridge, MA 02139, USA. |
  25. | |
  26. \------------------------------------------------------------*/
  27. /*------------------------------------------------------------\
  28. | |
  29. | Tool : XSCH |
  30. | |
  31. | File : View.c |
  32. | |
  33. | Authors : Jacomme Ludovic |
  34. | |
  35. | Date : 01.06.96 |
  36. | |
  37. \------------------------------------------------------------*/
  38. /*------------------------------------------------------------\
  39. | |
  40. | Include Files |
  41. | |
  42. \------------------------------------------------------------*/
  43. # include <stdio.h>
  44. # include <math.h>
  45. # include <signal.h>
  46. # include <Xm/Xm.h>
  47. # include "mut.h"
  48. # include "aut.h"
  49. # include "mlo.h"
  50. # include "scl.h"
  51. # include "XSB.h"
  52. # include "XSC.h"
  53. # include "XMX.h"
  54. # include "XMX_view.h"
  55. /*------------------------------------------------------------\
  56. | |
  57. | Constants |
  58. | |
  59. \------------------------------------------------------------*/
  60. /*------------------------------------------------------------\
  61. | |
  62. | Types |
  63. | |
  64. \------------------------------------------------------------*/
  65. /*------------------------------------------------------------\
  66. | |
  67. | Variables |
  68. | |
  69. \------------------------------------------------------------*/
  70. static long XschGraphicX1;
  71. static long XschGraphicX2;
  72. static long XschGraphicY1;
  73. static long XschGraphicY2;
  74. static XFontStruct *XschTextFont;
  75. static GC XschTextGC;
  76. static GC XschDrawGC;
  77. static xschview_list *XschHeadView = (xschview_list *)NULL;
  78. /*------------------------------------------------------------\
  79. | |
  80. | Functions |
  81. | |
  82. \------------------------------------------------------------*/
  83. /*------------------------------------------------------------\
  84. | |
  85. | Alloc Functions |
  86. | |
  87. \------------------------------------------------------------*/
  88. /*------------------------------------------------------------\
  89. | |
  90. | XschAllocView |
  91. | |
  92. \------------------------------------------------------------*/
  93. xschview_list *XschAllocView()
  94. {
  95. return( (xschview_list *)autallocheap( sizeof( xschview_list ) ) );
  96. }
  97. /*------------------------------------------------------------\
  98. | |
  99. | Free Functions |
  100. | |
  101. \------------------------------------------------------------*/
  102. /*------------------------------------------------------------\
  103. | |
  104. | XschFreeView |
  105. | |
  106. \------------------------------------------------------------*/
  107. void XschFreeView( FreeView )
  108. xschview_list *FreeView;
  109. {
  110. autfreeheap( (char *)FreeView, sizeof( xschview_list ) );
  111. }
  112. /*------------------------------------------------------------\
  113. | |
  114. | XschAddViewLater |
  115. | |
  116. \------------------------------------------------------------*/
  117. void XschAddViewLater( Obj )
  118. xschobj_list *Obj;
  119. {
  120. xschview_list *View;
  121. autbegin();
  122. View = XschAllocView();
  123. View->OBJECT = Obj;
  124. View->NEXT = XschHeadView;
  125. XschHeadView = View;
  126. autend();
  127. }
  128. /*------------------------------------------------------------\
  129. | |
  130. | XschDelView |
  131. | |
  132. \------------------------------------------------------------*/
  133. void XschDelView()
  134. {
  135. xschview_list *DelView;
  136. xschview_list *View;
  137. autbegin();
  138. View = XschHeadView;
  139. XschHeadView = (xschview_list *)NULL;
  140. while( View != (xschview_list *)NULL )
  141. {
  142. DelView = View;
  143. View = View->NEXT;
  144. XschFreeView( DelView );
  145. }
  146. autend();
  147. }
  148. /*------------------------------------------------------------\
  149. | |
  150. | XschFlushEventDisplay |
  151. | |
  152. \------------------------------------------------------------*/
  153. void XschFlushEventDisplay()
  154. {
  155. XEvent Event;
  156. autbegin();
  157. while ( XCheckTypedEvent( XschGraphicDisplay, KeyPress, &Event ) );
  158. autend();
  159. }
  160. /*------------------------------------------------------------\
  161. | |
  162. | XschComputePentagon |
  163. | |
  164. \------------------------------------------------------------*/
  165. char XschComputePentagon( X1, Y1, X2, Y2, Points )
  166. long X1;
  167. long Y1;
  168. long X2;
  169. long Y2;
  170. XPoint *Points;
  171. {
  172. long StepX;
  173. long StepY;
  174. StepY = ( Y2 - Y1 ) >> 1;
  175. StepX = StepY >> 1;
  176. if ( StepY <= 0 ) StepY = 1;
  177. if ( StepX <= 0 ) StepX = 1;
  178. Points[ 0 ].x = X1;
  179. Points[ 0 ].y = Y1;
  180. Points[ 1 ].x = X1;
  181. Points[ 1 ].y = Y2;
  182. Points[ 2 ].x = X1;
  183. Points[ 2 ].y = Y2;
  184. Points[ 3 ].x = X2 - StepX;
  185. Points[ 3 ].y = Y2;
  186. Points[ 4 ].x = X2;
  187. Points[ 4 ].y = Y1 + StepY;
  188. Points[ 5 ].x = X2 - StepX;
  189. Points[ 5 ].y = Y1;
  190. Points[ 6 ].x = X1;
  191. Points[ 6 ].y = Y1;
  192. return( XSCH_TRUE );
  193. }
  194. /*------------------------------------------------------------\
  195. | |
  196. | XschDisplayArrow |
  197. | |
  198. \------------------------------------------------------------*/
  199. char XschComputeArrow( X1, Y1, X2, Y2, Points )
  200. long X1;
  201. long Y1;
  202. long X2;
  203. long Y2;
  204. XPoint *Points;
  205. {
  206. float LineX;
  207. float LineY;
  208. float HalfX;
  209. float HalfY;
  210. float CrossX;
  211. float CrossY;
  212. float Norm;
  213. LineX = (float)( X2 - X1 );
  214. LineY = (float)( Y2 - Y1 );
  215. if ( ( LineX != 0.0 ) ||
  216. ( LineY != 0.0 ) )
  217. {
  218. Norm = sqrt( ( LineX * LineX ) + ( LineY * LineY ) );
  219. Norm = Norm / XschUnitGridStep;
  220. LineX = LineX / Norm;
  221. LineY = LineY / Norm;
  222. HalfX = LineX / 2;
  223. HalfY = LineY / 2;
  224. CrossX = - HalfY;
  225. CrossY = HalfX;
  226. Points[ 0 ].x = X1 + LineX;
  227. Points[ 0 ].y = Y1 + LineY;
  228. Points[ 1 ].x = Points[ 0 ].x + LineX + HalfX + CrossX;
  229. Points[ 1 ].y = Points[ 0 ].y + LineY + HalfY + CrossY;
  230. Points[ 2 ].x = Points[ 0 ].x + LineX + HalfX - CrossX;
  231. Points[ 2 ].y = Points[ 0 ].y + LineY + HalfY - CrossY;
  232. return( XSCH_TRUE );
  233. }
  234. return( XSCH_FALSE );
  235. }
  236. /*------------------------------------------------------------\
  237. | |
  238. | XschDrawTristate |
  239. | |
  240. \------------------------------------------------------------*/
  241. static void XschDrawTristate( X1r, Y1r, X2r, Y2r, Ycr, Obj )
  242. long X1r;
  243. long Y1r;
  244. long X2r;
  245. long Y2r;
  246. long Ycr;
  247. xschobj_list *Obj;
  248. {
  249. /*
  250. ** Fred Petrot (The King ) has initially written those lines !
  251. ** Ludo Jacomme (The Slave) has modified them :-)
  252. */
  253. long gs;
  254. long is_x;
  255. long is_y;
  256. long cs;
  257. long csm;
  258. long x, x1, y1, y2,y0;
  259. long DeltaX;
  260. long DeltaY;
  261. DeltaX = X2r - X1r;
  262. DeltaY = Y2r - Y1r;
  263. if ( DeltaX <= 0 ) DeltaX = 1;
  264. if ( DeltaY <= 0 ) DeltaY = 1;
  265. # if 0
  266. XDrawRectangle( XschGraphicDisplay,
  267. XschGraphicPixmap,
  268. XschDrawGC,
  269. X1r, XschGraphicDy - Y2r,
  270. DeltaX, DeltaY );
  271. # endif
  272. gs = DeltaX;
  273. is_x = ( 5 * DeltaX ) / 16;
  274. is_y = ( 5 * DeltaY ) / 16;
  275. cs = DeltaX / 8;
  276. csm = DeltaX / 10;
  277. y1 = XschGraphicDy - Ycr;
  278. x1 = (X2r + X1r) / 2;
  279. x = X1r + cs;
  280. XDrawLine( XschGraphicDisplay,
  281. XschGraphicPixmap,
  282. XschDrawGC,
  283. x, y1 - is_y/2,
  284. x, y1 + is_y/2);
  285. XDrawLine(XschGraphicDisplay, XschGraphicPixmap, XschDrawGC,
  286. x , y1 - is_y/2,
  287. x + is_x, y1);
  288. XDrawLine(XschGraphicDisplay, XschGraphicPixmap, XschDrawGC,
  289. x , y1 + is_y/2,
  290. x + is_x, y1);
  291. y0 = Obj->Y + ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
  292. y0 = (float)( y0 ) * XschUnitGridStep;
  293. y0 = ( y0 / XSCH_UNIT ) - XschPixelGridY;
  294. y0 = XschGraphicDy - y0;
  295. y2 = Obj->Y + ( SCP_BOX_CON_BASE_Y + SCP_BOX_CON_STEP_Y ) * XSCH_UNIT;
  296. y2 = (float)( y2 ) * XschUnitGridStep;
  297. y2 = ( y2 / XSCH_UNIT ) - XschPixelGridY;
  298. y2 = XschGraphicDy - y2;
  299. if ( ( Obj->ARG1 & 1) == 0 )
  300. {
  301. /* data line : centered vertically */
  302. XDrawLine( XschGraphicDisplay, XschGraphicPixmap, XschDrawGC,
  303. x - cs, y1,
  304. x , y1 );
  305. }
  306. else
  307. {
  308. /* Data circle */
  309. XDrawArc( XschGraphicDisplay, XschGraphicPixmap, XschDrawGC,
  310. x - cs, y1 - cs/2, cs, cs, 0, 23040 );
  311. }
  312. /* Data Line */
  313. XDrawLine( XschGraphicDisplay, XschGraphicPixmap, XschDrawGC,
  314. x - cs, y0, x - cs, y1 );
  315. if ( ( Obj->ARG1 & 2) == 0 )
  316. {
  317. /* Command Line */
  318. XDrawLine(XschGraphicDisplay, XschGraphicPixmap, XschDrawGC,
  319. x - cs, y2, x + is_x/2, y2 );
  320. XDrawLine(XschGraphicDisplay, XschGraphicPixmap, XschDrawGC,
  321. x + is_x/2, y2, x + is_x/2, y1 - is_y/4 );
  322. }
  323. else
  324. {
  325. /* Command circle */
  326. XFillArc( XschGraphicDisplay, XschGraphicPixmap, XschDrawGC,
  327. x + is_x/2 - csm/2, y1 - is_y/2 - csm/4, csm, csm, 0, 23040 );
  328. /* Command Line */
  329. XDrawLine(XschGraphicDisplay, XschGraphicPixmap, XschDrawGC,
  330. x - cs, y2, x + is_x/2, y2 );
  331. XDrawLine(XschGraphicDisplay, XschGraphicPixmap, XschDrawGC,
  332. x + is_x/2, y2, x + is_x/2, y2 + csm );
  333. }
  334. if ( ( Obj->ARG2 ) == 0 )
  335. {
  336. /* Output line : centered vertically */
  337. XDrawLine( XschGraphicDisplay, XschGraphicPixmap, XschDrawGC,
  338. x + is_x , y1,
  339. x + is_x + cs, y1 );
  340. }
  341. else
  342. {
  343. /* Output circle */
  344. XDrawArc( XschGraphicDisplay, XschGraphicPixmap, XschDrawGC,
  345. x + is_x, y1 - cs/2, cs, cs, 0, 23040 );
  346. }
  347. XDrawLine( XschGraphicDisplay, XschGraphicPixmap, XschDrawGC,
  348. x + is_x + cs, y1,
  349. X2r, y1 );
  350. }
  351. /*------------------------------------------------------------\
  352. | |
  353. | XschDrawConstant |
  354. | |
  355. \------------------------------------------------------------*/
  356. static void XschDrawConstant( X1r, Y1r, X2r, Y2r, Ycr, Obj )
  357. long X1r;
  358. long Y1r;
  359. long X2r;
  360. long Y2r;
  361. long Ycr;
  362. xschobj_list *Obj;
  363. {
  364. long is_x;
  365. long is_y;
  366. long cs;
  367. long x, yc, y1,y2,y3;
  368. long DeltaX;
  369. long DeltaY;
  370. int i;
  371. int n;
  372. n = Obj->ARG1;
  373. DeltaX = X2r - X1r;
  374. DeltaY = Y2r - Y1r;
  375. if ( DeltaX <= 0 ) DeltaX = 1;
  376. if ( DeltaY <= 0 ) DeltaY = 1;
  377. # if 0
  378. XDrawRectangle( XschGraphicDisplay,
  379. XschGraphicPixmap,
  380. XschDrawGC,
  381. X1r, XschGraphicDy - Y2r,
  382. DeltaX, DeltaY );
  383. # endif
  384. cs = DeltaX / 8;
  385. x = X1r + cs;
  386. y1 = Obj->Y + ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
  387. for ( i = 0; i < n; i++ )
  388. {
  389. yc = (float)( y1 ) * XschUnitGridStep;
  390. yc = ( yc / XSCH_UNIT ) - XschPixelGridY;
  391. yc = XschGraphicDy - yc;
  392. if (( Obj->ARG2 & (1 << i)) == 0)
  393. {
  394. y2 = yc + cs;
  395. y3 = y2 + cs;
  396. XDrawLine( XschGraphicDisplay,
  397. XschGraphicPixmap,
  398. XschDrawGC,
  399. x, yc, x, y2 );
  400. XDrawLine( XschGraphicDisplay,
  401. XschGraphicPixmap,
  402. XschDrawGC,
  403. x - cs, y2, x + cs, y2 );
  404. XDrawLine( XschGraphicDisplay,
  405. XschGraphicPixmap,
  406. XschDrawGC,
  407. x - cs, y2, x, y3 );
  408. XDrawLine( XschGraphicDisplay,
  409. XschGraphicPixmap,
  410. XschDrawGC,
  411. x + cs, y2, x, y3 );
  412. }
  413. else
  414. {
  415. y2 = yc - cs;
  416. y3 = y2 - cs;
  417. XDrawLine( XschGraphicDisplay,
  418. XschGraphicPixmap,
  419. XschDrawGC,
  420. x, yc, x, y2 );
  421. XDrawLine( XschGraphicDisplay,
  422. XschGraphicPixmap,
  423. XschDrawGC,
  424. x, y2, x - cs, y3 );
  425. XDrawLine( XschGraphicDisplay,
  426. XschGraphicPixmap,
  427. XschDrawGC,
  428. x, y2, x + cs, y3 );
  429. }
  430. XDrawLine( XschGraphicDisplay, XschGraphicPixmap, XschDrawGC,
  431. x, yc, X2r, yc );
  432. y1 += ( SCP_BOX_CON_STEP_Y * XSCH_UNIT );
  433. }
  434. # if 0
  435. y1 = XschGraphicDy - Ycr;
  436. if ( ! Obj->ARG2 ) /* constant zero */
  437. {
  438. y2 = y1 + cs;
  439. y3 = y2 + cs;
  440. XDrawLine( XschGraphicDisplay,
  441. XschGraphicPixmap,
  442. XschDrawGC,
  443. x, y1, x, y2 );
  444. XDrawLine( XschGraphicDisplay,
  445. XschGraphicPixmap,
  446. XschDrawGC,
  447. x - cs, y2, x + cs, y2 );
  448. XDrawLine( XschGraphicDisplay,
  449. XschGraphicPixmap,
  450. XschDrawGC,
  451. x - cs, y2, x, y3 );
  452. XDrawLine( XschGraphicDisplay,
  453. XschGraphicPixmap,
  454. XschDrawGC,
  455. x + cs, y2, x, y3 );
  456. }
  457. else /* constant one */
  458. {
  459. y2 = y1 - cs;
  460. y3 = y2 - cs;
  461. XDrawLine( XschGraphicDisplay,
  462. XschGraphicPixmap,
  463. XschDrawGC,
  464. x, y1, x, y2 );
  465. XDrawLine( XschGraphicDisplay,
  466. XschGraphicPixmap,
  467. XschDrawGC,
  468. x, y2, x - cs, y3 );
  469. XDrawLine( XschGraphicDisplay,
  470. XschGraphicPixmap,
  471. XschDrawGC,
  472. x, y2, x + cs, y3 );
  473. }
  474. # endif
  475. }
  476. /*------------------------------------------------------------\
  477. | |
  478. | XschDrawBuffer |
  479. | |
  480. \------------------------------------------------------------*/
  481. static void XschDrawBuffer( X1r, Y1r, X2r, Y2r, Ycr, Obj )
  482. long X1r;
  483. long Y1r;
  484. long X2r;
  485. long Y2r;
  486. long Ycr;
  487. xschobj_list *Obj;
  488. {
  489. /*
  490. ** Fred Petrot (The King ) has initially written those lines !
  491. ** Ludo Jacomme (The Slave) has modified them :-)
  492. */
  493. long gs;
  494. long is_x;
  495. long is_y;
  496. long cs;
  497. long x, y1;
  498. long DeltaX;
  499. long DeltaY;
  500. DeltaX = X2r - X1r;
  501. DeltaY = Y2r - Y1r;
  502. if ( DeltaX <= 0 ) DeltaX = 1;
  503. if ( DeltaY <= 0 ) DeltaY = 1;
  504. # if 0
  505. XDrawRectangle( XschGraphicDisplay,
  506. XschGraphicPixmap,
  507. XschDrawGC,
  508. X1r, XschGraphicDy - Y2r,
  509. DeltaX, DeltaY );
  510. # endif
  511. gs = DeltaX;
  512. is_x = ( 5 * DeltaX ) / 16;
  513. is_y = ( 5 * DeltaY ) / 8;
  514. cs = DeltaX / 8;
  515. y1 = XschGraphicDy - Ycr;
  516. x = X1r + cs;
  517. XDrawLine( XschGraphicDisplay,
  518. XschGraphicPixmap,
  519. XschDrawGC,
  520. x, y1 - is_y/2,
  521. x, y1 + is_y/2);
  522. XDrawLine(XschGraphicDisplay, XschGraphicPixmap, XschDrawGC,
  523. x , y1 - is_y/2,
  524. x + is_x, y1);
  525. XDrawLine(XschGraphicDisplay, XschGraphicPixmap, XschDrawGC,
  526. x , y1 + is_y/2,
  527. x + is_x, y1);
  528. if ( ( Obj->ARG1 ) == 0 )
  529. {
  530. /* input line : centered vertically */
  531. XDrawLine( XschGraphicDisplay, XschGraphicPixmap, XschDrawGC,
  532. x - cs, y1,
  533. x , y1 );
  534. }
  535. else
  536. {
  537. /* Input circle */
  538. XDrawArc( XschGraphicDisplay, XschGraphicPixmap, XschDrawGC,
  539. x - cs, y1 - cs/2, cs, cs, 0, 23040 );
  540. }
  541. if ( ( Obj->ARG2 ) == 0 )
  542. {
  543. /* Output line : centered vertically */
  544. XDrawLine( XschGraphicDisplay, XschGraphicPixmap, XschDrawGC,
  545. x + is_x , y1,
  546. x + is_x + cs, y1 );
  547. }
  548. else
  549. {
  550. /* Output circle */
  551. XDrawArc( XschGraphicDisplay, XschGraphicPixmap, XschDrawGC,
  552. x + is_x, y1 - cs/2, cs, cs, 0, 23040 );
  553. }
  554. XDrawLine( XschGraphicDisplay, XschGraphicPixmap, XschDrawGC,
  555. x + is_x + cs, y1,
  556. X2r, y1 );
  557. }
  558. /*------------------------------------------------------------\
  559. | |
  560. | XschDrawTransistor |
  561. | |
  562. \------------------------------------------------------------*/
  563. static void XschDrawTransistor( X1r, Y1r, X2r, Y2r, Ycr, Obj )
  564. long X1r;
  565. long Y1r;
  566. long X2r;
  567. long Y2r;
  568. long Ycr;
  569. xschobj_list *Obj;
  570. {
  571. /*
  572. ** Fred Petrot (The King ) has initially written those lines !
  573. ** Ludo Jacomme (The Slave) has modified them :-)
  574. */
  575. long gs;
  576. long is_x;
  577. long is_y;
  578. long cs;
  579. long csm;
  580. long x, x1, y1, y2,y0;
  581. long DeltaX;
  582. long DeltaY;
  583. DeltaX = X2r - X1r;
  584. DeltaY = Y2r - Y1r;
  585. if ( DeltaX <= 0 ) DeltaX = 1;
  586. if ( DeltaY <= 0 ) DeltaY = 1;
  587. gs = DeltaX;
  588. is_x = ( 5 * DeltaX ) / 16;
  589. is_y = ( 5 * DeltaY ) / 16;
  590. cs = DeltaX / 8;
  591. y0 = Obj->Y + ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
  592. y0 = (float)( y0 ) * XschUnitGridStep;
  593. y0 = ( y0 / XSCH_UNIT ) - XschPixelGridY;
  594. y0 = XschGraphicDy - y0;
  595. y2 = Obj->Y + ( SCP_BOX_CON_BASE_Y + SCP_BOX_CON_STEP_Y ) * XSCH_UNIT;
  596. y2 = (float)( y2 ) * XschUnitGridStep;
  597. y2 = ( y2 / XSCH_UNIT ) - XschPixelGridY;
  598. y2 = XschGraphicDy - y2;
  599. y1 = XschGraphicDy - Ycr;
  600. /*
  601. x1 = X2r - cs;
  602. */
  603. x1 = X1r + 3 * cs;
  604. x = X1r;
  605. XDrawLine( XschGraphicDisplay,
  606. XschGraphicPixmap,
  607. XschDrawGC,
  608. x, y0, x, y0 - cs );
  609. XDrawLine( XschGraphicDisplay,
  610. XschGraphicPixmap,
  611. XschDrawGC,
  612. x, y0 - cs, x1 - cs, y0 - cs );
  613. XDrawLine( XschGraphicDisplay,
  614. XschGraphicPixmap,
  615. XschDrawGC,
  616. x1 - cs, y0 - cs, x1 - cs, y2 + cs );
  617. XDrawLine( XschGraphicDisplay,
  618. XschGraphicPixmap,
  619. XschDrawGC,
  620. x1 - cs, y2 + cs, x, y2 + cs );
  621. XDrawLine( XschGraphicDisplay,
  622. XschGraphicPixmap,
  623. XschDrawGC,
  624. x, y2 + cs, x, y2 );
  625. XDrawLine( XschGraphicDisplay,
  626. XschGraphicPixmap,
  627. XschDrawGC,
  628. x1, y0 - cs, x1, y2 + cs );
  629. if ( ( Obj->ARG1 ) == 1 ) /* This is TRANSN */
  630. {
  631. /* Output line : centered vertically */
  632. XDrawLine( XschGraphicDisplay, XschGraphicPixmap, XschDrawGC,
  633. x1, y1, x1 + cs, y1 );
  634. }
  635. else
  636. {
  637. /* Output circle */
  638. XDrawArc( XschGraphicDisplay, XschGraphicPixmap, XschDrawGC,
  639. x1, y1 - cs/2, cs, cs, 0, 23040 );
  640. }
  641. XDrawLine( XschGraphicDisplay,
  642. XschGraphicPixmap,
  643. XschDrawGC,
  644. x1 + cs, y1, X2r, y1 );
  645. }
  646. /*------------------------------------------------------------\
  647. | |
  648. | XschDrawAnd |
  649. | |
  650. \------------------------------------------------------------*/
  651. static void XschDrawAnd( X1r, Y1r, X2r, Y2r, Ycr, Obj )
  652. long X1r;
  653. long Y1r;
  654. long X2r;
  655. long Y2r;
  656. long Ycr;
  657. xschobj_list *Obj;
  658. {
  659. /*
  660. ** Fred Petrot (The King ) has initially written those lines !
  661. ** Ludo Jacomme (The Slave) has modified them :-)
  662. */
  663. long gs_y;
  664. long gs_x;
  665. long cs;
  666. int i;
  667. int n;
  668. long x, y;
  669. long yc;
  670. long y1;
  671. long DeltaX;
  672. long DeltaY;
  673. DeltaX = X2r - X1r;
  674. DeltaY = Y2r - Y1r;
  675. if ( DeltaX <= 0 ) DeltaX = 1;
  676. if ( DeltaY <= 0 ) DeltaY = 1;
  677. # if 0
  678. XDrawRectangle( XschGraphicDisplay,
  679. XschGraphicPixmap,
  680. XschDrawGC,
  681. X1r, XschGraphicDy - Y2r,
  682. DeltaX, DeltaY );
  683. # endif
  684. gs_y = ( 7 * DeltaY ) / 8;
  685. gs_x = ( 6 * DeltaX ) / 8;
  686. cs = DeltaX / 8;
  687. yc = XschGraphicDy - Ycr;
  688. y = XschGraphicDy - Ycr - gs_y/2;
  689. x = X1r + cs;
  690. n = Obj->ARG1;
  691. /* And shape alone */
  692. XDrawLine( XschGraphicDisplay,
  693. XschGraphicPixmap,
  694. XschDrawGC,
  695. x, y, x + gs_x/2, y );
  696. XDrawLine( XschGraphicDisplay,
  697. XschGraphicPixmap,
  698. XschDrawGC,
  699. x , y + gs_y,
  700. x + gs_x/2, y + gs_y );
  701. XDrawArc( XschGraphicDisplay,
  702. XschGraphicPixmap,
  703. XschDrawGC,
  704. x, y, gs_x, gs_y, 90 * 64, -180 * 64);
  705. if ( Obj->ARG3 == 0 )
  706. {
  707. /* Output line : centered vertically */
  708. XDrawLine( XschGraphicDisplay,
  709. XschGraphicPixmap,
  710. XschDrawGC,
  711. x + gs_x, yc, x + gs_x + cs, yc );
  712. }
  713. else
  714. {
  715. /* Output circle (for a NAND) */
  716. XDrawArc( XschGraphicDisplay,
  717. XschGraphicPixmap,
  718. XschDrawGC,
  719. x + gs_x, yc - cs/2, cs, cs, 0 * 64, 360 * 64);
  720. }
  721. /* Input lines */
  722. XDrawLine( XschGraphicDisplay,
  723. XschGraphicPixmap,
  724. XschDrawGC, x, y, x, y + gs_y);
  725. y1 = Obj->Y + ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
  726. /* Circle for inversion */
  727. for (i = 0; i < n; i++)
  728. {
  729. yc = (float)( y1 ) * XschUnitGridStep;
  730. yc = ( yc / XSCH_UNIT ) - XschPixelGridY;
  731. yc = XschGraphicDy - yc;
  732. if (( Obj->ARG2 & (1 << i)) == 0)
  733. {
  734. XDrawLine( XschGraphicDisplay,
  735. XschGraphicPixmap,
  736. XschDrawGC,
  737. x - cs, yc, x, yc );
  738. }
  739. else
  740. {
  741. XDrawArc( XschGraphicDisplay,
  742. XschGraphicPixmap,
  743. XschDrawGC,
  744. x - cs,
  745. yc - cs/2,
  746. cs, cs, 0 * 64, 360 * 64);
  747. }
  748. y1 += ( SCP_BOX_CON_STEP_Y * XSCH_UNIT );
  749. }
  750. }
  751. /*------------------------------------------------------------\
  752. | |
  753. | XschDrawRegister |
  754. | |
  755. \------------------------------------------------------------*/
  756. static void XschDrawRegister( X1r, Y1r, X2r, Y2r, Ycr, Obj )
  757. long X1r;
  758. long Y1r;
  759. long X2r;
  760. long Y2r;
  761. long Ycr;
  762. xschobj_list *Obj;
  763. {
  764. /*
  765. ** Fred Petrot (The King ) has initially written those lines !
  766. ** Ludo Jacomme (The Slave) has modified them :-)
  767. */
  768. long gs_y;
  769. long gs_x;
  770. long cs;
  771. long es_x;
  772. long es_y;
  773. int i;
  774. int ni;
  775. long x, y;
  776. long yc;
  777. long xc;
  778. long y1;
  779. long DeltaX;
  780. long DeltaY;
  781. DeltaX = X2r - X1r;
  782. DeltaY = Y2r - Y1r;
  783. if ( DeltaX <= 0 ) DeltaX = 1;
  784. if ( DeltaY <= 0 ) DeltaY = 1;
  785. # if 0
  786. XDrawRectangle( XschGraphicDisplay,
  787. XschGraphicPixmap,
  788. XschDrawGC,
  789. X1r, XschGraphicDy - Y2r,
  790. DeltaX, DeltaY );
  791. # endif
  792. gs_y = ( 7 * DeltaY ) / 8;
  793. gs_x = ( 6 * DeltaX ) / 8;
  794. cs = DeltaX / 8;
  795. es_y = DeltaX / 4;
  796. es_x = DeltaX / 8;
  797. yc = XschGraphicDy - Ycr;
  798. y = XschGraphicDy - Ycr - gs_y/2;
  799. x = X1r + cs;
  800. xc = (X2r + X1r) /2;
  801. ni = Obj->ARG1;
  802. /* shape alone */
  803. XDrawRectangle( XschGraphicDisplay,
  804. XschGraphicPixmap,
  805. XschDrawGC,
  806. x, y, gs_x, gs_y );
  807. /*
  808. ** Rising/Falling Edge
  809. */
  810. if ( ( Obj->ARG5 == 1 ) ||
  811. ( Obj->ARG5 == 2 ) )
  812. {
  813. XDrawLine( XschGraphicDisplay,
  814. XschGraphicPixmap,
  815. XschDrawGC,
  816. xc, yc - es_y, xc, yc + es_y );
  817. /*
  818. ** Rising
  819. */
  820. if ( Obj->ARG5 == 1 )
  821. {
  822. XDrawLine( XschGraphicDisplay,
  823. XschGraphicPixmap,
  824. XschDrawGC,
  825. xc, yc + es_y, xc - es_x, yc + es_y );
  826. XDrawLine( XschGraphicDisplay,
  827. XschGraphicPixmap,
  828. XschDrawGC,
  829. xc, yc - es_y, xc + es_x, yc - es_y );
  830. }
  831. else
  832. /*
  833. ** Falling
  834. */
  835. {
  836. XDrawLine( XschGraphicDisplay,
  837. XschGraphicPixmap,
  838. XschDrawGC,
  839. xc, yc - es_y, xc - es_x, yc - es_y );
  840. XDrawLine( XschGraphicDisplay,
  841. XschGraphicPixmap,
  842. XschDrawGC,
  843. xc, yc + es_y, xc + es_x, yc + es_y );
  844. }
  845. }
  846. if ( Obj->ARG4 == 0 )
  847. {
  848. /* Output line : centered vertically */
  849. XDrawLine( XschGraphicDisplay,
  850. XschGraphicPixmap,
  851. XschDrawGC,
  852. x + gs_x, yc, x + gs_x + cs, yc );
  853. }
  854. else
  855. {
  856. /* Output circle */
  857. XDrawArc( XschGraphicDisplay,
  858. XschGraphicPixmap,
  859. XschDrawGC,
  860. x + gs_x, yc - cs/2, cs, cs, 0 * 64, 360 * 64);
  861. }
  862. /* Input lines */
  863. /* Circle for inversion */
  864. y1 = Obj->Y + ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
  865. for (i = 0; i < ni; i++)
  866. {
  867. yc = (float)( y1 ) * XschUnitGridStep;
  868. yc = ( yc / XSCH_UNIT ) - XschPixelGridY;
  869. yc = XschGraphicDy - yc;
  870. if (( Obj->ARG2 & (1 << i)) == 0)
  871. {
  872. XDrawLine( XschGraphicDisplay,
  873. XschGraphicPixmap,
  874. XschDrawGC,
  875. x - cs, yc, x, yc );
  876. }
  877. else
  878. {
  879. XDrawArc( XschGraphicDisplay,
  880. XschGraphicPixmap,
  881. XschDrawGC,
  882. x - cs,
  883. yc - cs/2,
  884. cs, cs, 0 * 64, 360 * 64);
  885. }
  886. /* Clock */
  887. if (( Obj->ARG3 & (1 << i)) != 0)
  888. {
  889. XDrawLine( XschGraphicDisplay,
  890. XschGraphicPixmap,
  891. XschDrawGC,
  892. x, yc - cs/2, x + cs, yc );
  893. XDrawLine( XschGraphicDisplay,
  894. XschGraphicPixmap,
  895. XschDrawGC,
  896. x + cs, yc, x, yc + cs/2 );
  897. }
  898. y1 += ( SCP_BOX_CON_STEP_Y * XSCH_UNIT );
  899. }
  900. }
  901. /*------------------------------------------------------------\
  902. | |
  903. | XschDrawOr |
  904. | |
  905. \------------------------------------------------------------*/
  906. static void XschDrawOr( X1r, Y1r, X2r, Y2r, Ycr, Obj )
  907. long X1r;
  908. long Y1r;
  909. long X2r;
  910. long Y2r;
  911. long Ycr;
  912. xschobj_list *Obj;
  913. {
  914. /*
  915. ** Fred Petrot (The King ) has initially written those lines !
  916. ** Ludo Jacomme (The Slave) has modified them :-)
  917. */
  918. long gs_y;
  919. long gs_x;
  920. long cs;
  921. long Radius;
  922. int i;
  923. int n;
  924. long x, y;
  925. long yc;
  926. long y1;
  927. long DeltaX;
  928. long DeltaY;
  929. DeltaX = X2r - X1r;
  930. DeltaY = Y2r - Y1r;
  931. if ( DeltaX <= 0 ) DeltaX = 1;
  932. if ( DeltaY <= 0 ) DeltaY = 1;
  933. # if 0
  934. XDrawRectangle( XschGraphicDisplay,
  935. XschGraphicPixmap,
  936. XschDrawGC,
  937. X1r, XschGraphicDy - Y2r,
  938. DeltaX, DeltaY );
  939. # endif
  940. gs_y = ( 7 * DeltaY ) / 8;
  941. gs_x = ( 6 * DeltaX ) / 8;
  942. cs = DeltaX / 8;
  943. yc = XschGraphicDy - Ycr;
  944. y = XschGraphicDy - Ycr - gs_y/2;
  945. x = X1r + cs;
  946. n = Obj->ARG1;
  947. /* Or shape alone */
  948. XDrawLine( XschGraphicDisplay,
  949. XschGraphicPixmap,
  950. XschDrawGC,
  951. x, y, x + gs_x/2, y );
  952. XDrawLine( XschGraphicDisplay,
  953. XschGraphicPixmap,
  954. XschDrawGC,
  955. x , y + gs_y,
  956. x + gs_x/2, y + gs_y );
  957. XDrawArc( XschGraphicDisplay,
  958. XschGraphicPixmap,
  959. XschDrawGC,
  960. x, y, gs_x, gs_y, 90 * 64, -180 * 64);
  961. Radius = (float)(gs_y) * 0.707106781185;
  962. XDrawArc( XschGraphicDisplay,
  963. XschGraphicPixmap,
  964. XschDrawGC,
  965. x - (Radius * 5 / 3), yc - Radius,
  966. Radius * 2, Radius * 2, 45 * 64, -90 * 64);
  967. if ( Obj->ARG3 == 0 )
  968. {
  969. /* Output line : centered vertically */
  970. XDrawLine( XschGraphicDisplay,
  971. XschGraphicPixmap,
  972. XschDrawGC,
  973. x + gs_x, yc, x + gs_x + cs, yc );
  974. }
  975. else
  976. {
  977. /* Output circle */
  978. XDrawArc( XschGraphicDisplay,
  979. XschGraphicPixmap,
  980. XschDrawGC,
  981. x + gs_x, yc - cs/2, cs, cs, 0 * 64, 360 * 64);
  982. }
  983. /* Input lines */
  984. # if 0
  985. XDrawLine( XschGraphicDisplay,
  986. XschGraphicPixmap,
  987. XschDrawGC, x, y, x, y + gs_y);
  988. # endif
  989. y1 = Obj->Y + ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
  990. /* Circle for inversion */
  991. for (i = 0; i < n; i++)
  992. {
  993. yc = (float)( y1 ) * XschUnitGridStep;
  994. yc = ( yc / XSCH_UNIT ) - XschPixelGridY;
  995. yc = XschGraphicDy - yc;
  996. if (( Obj->ARG2 & (1 << i)) == 0)
  997. {
  998. XDrawLine( XschGraphicDisplay,
  999. XschGraphicPixmap,
  1000. XschDrawGC,
  1001. x - cs, yc, x, yc );
  1002. }
  1003. else
  1004. {
  1005. XDrawArc( XschGraphicDisplay,
  1006. XschGraphicPixmap,
  1007. XschDrawGC,
  1008. x - cs,
  1009. yc - cs/2,
  1010. cs, cs, 0 * 64, 360 * 64);
  1011. }
  1012. y1 += ( SCP_BOX_CON_STEP_Y * XSCH_UNIT );
  1013. }
  1014. }
  1015. /*------------------------------------------------------------\
  1016. | |
  1017. | XschDrawXor |
  1018. | |
  1019. \------------------------------------------------------------*/
  1020. static void XschDrawXor( X1r, Y1r, X2r, Y2r, Ycr, Obj )
  1021. long X1r;
  1022. long Y1r;
  1023. long X2r;
  1024. long Y2r;
  1025. long Ycr;
  1026. xschobj_list *Obj;
  1027. {
  1028. /*
  1029. ** Fred Petrot (The King ) has initially written those lines !
  1030. ** Ludo Jacomme (The Slave) has modified them :-)
  1031. */
  1032. long gs_y;
  1033. long gs_x;
  1034. long cs;
  1035. long Radius;
  1036. int i;
  1037. int n;
  1038. long x, y;
  1039. long yc;
  1040. long y1;
  1041. long DeltaX;
  1042. long DeltaY;
  1043. DeltaX = X2r - X1r;
  1044. DeltaY = Y2r - Y1r;
  1045. if ( DeltaX <= 0 ) DeltaX = 1;
  1046. if ( DeltaY <= 0 ) DeltaY = 1;
  1047. # if 0
  1048. XDrawRectangle( XschGraphicDisplay,
  1049. XschGraphicPixmap,
  1050. XschDrawGC,
  1051. X1r, XschGraphicDy - Y2r,
  1052. DeltaX, DeltaY );
  1053. # endif
  1054. gs_y = ( 7 * DeltaY ) / 8;
  1055. gs_x = ( 6 * DeltaX ) / 8;
  1056. cs = DeltaX / 8;
  1057. yc = XschGraphicDy - Ycr;
  1058. y = XschGraphicDy - Ycr - gs_y/2;
  1059. x = X1r + cs;
  1060. n = Obj->ARG1;
  1061. /* Xor shape alone */
  1062. XDrawLine( XschGraphicDisplay,
  1063. XschGraphicPixmap,
  1064. XschDrawGC,
  1065. x + gs_x/4, y, x + gs_x/2, y );
  1066. XDrawLine( XschGraphicDisplay,
  1067. XschGraphicPixmap,
  1068. XschDrawGC,
  1069. x + gs_x/4, y + gs_y,
  1070. x + gs_x/2, y + gs_y );
  1071. XDrawArc( XschGraphicDisplay,
  1072. XschGraphicPixmap,
  1073. XschDrawGC,
  1074. x, y, gs_x, gs_y, 90 * 64, -180 * 64);
  1075. Radius = (float)(gs_y) * 0.707106781185; /* sqrt(2) */
  1076. XDrawArc( XschGraphicDisplay,
  1077. XschGraphicPixmap,
  1078. XschDrawGC,
  1079. x - (Radius * 5 / 3), yc - Radius,
  1080. Radius * 2, Radius * 2, 45 * 64, -90 * 64);
  1081. XDrawArc( XschGraphicDisplay,
  1082. XschGraphicPixmap,
  1083. XschDrawGC,
  1084. x - (Radius * 4 / 3), yc - Radius,
  1085. Radius * 2, Radius * 2, 45 * 64, -90 * 64);
  1086. if ( Obj->ARG3 == 0 )
  1087. {
  1088. /* Output line : centered vertically */
  1089. XDrawLine( XschGraphicDisplay,
  1090. XschGraphicPixmap,
  1091. XschDrawGC,
  1092. x + gs_x, yc, x + gs_x + cs, yc );
  1093. }
  1094. else
  1095. {
  1096. /* Output circle */
  1097. XDrawArc( XschGraphicDisplay,
  1098. XschGraphicPixmap,
  1099. XschDrawGC,
  1100. x + gs_x, yc - cs/2, cs, cs, 0 * 64, 360 * 64);
  1101. }
  1102. /* Input lines */
  1103. # if 0
  1104. XDrawLine( XschGraphicDisplay,
  1105. XschGraphicPixmap,
  1106. XschDrawGC, x, y, x, y + gs_y);
  1107. # endif
  1108. y1 = Obj->Y + ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
  1109. /* Circle for inversion */
  1110. for (i = 0; i < n; i++)
  1111. {
  1112. yc = (float)( y1 ) * XschUnitGridStep;
  1113. yc = ( yc / XSCH_UNIT ) - XschPixelGridY;
  1114. yc = XschGraphicDy - yc;
  1115. if (( Obj->ARG2 & (1 << i)) == 0)
  1116. {
  1117. XDrawLine( XschGraphicDisplay,
  1118. XschGraphicPixmap,
  1119. XschDrawGC,
  1120. x - cs, yc, x, yc );
  1121. }
  1122. else
  1123. {
  1124. XDrawArc( XschGraphicDisplay,
  1125. XschGraphicPixmap,
  1126. XschDrawGC,
  1127. x - cs,
  1128. yc - cs/2,
  1129. cs, cs, 0 * 64, 360 * 64);
  1130. }
  1131. y1 += ( SCP_BOX_CON_STEP_Y * XSCH_UNIT );
  1132. }
  1133. }
  1134. /*------------------------------------------------------------\
  1135. | |
  1136. | XschDrawAndOr |
  1137. | |
  1138. \------------------------------------------------------------*/
  1139. static void XschDrawAndOr( X1r, Y1r, X2r, Y2r, Ycr, Obj )
  1140. long X1r;
  1141. long Y1r;
  1142. long X2r;
  1143. long Y2r;
  1144. long Ycr;
  1145. xschobj_list *Obj;
  1146. {
  1147. long gs_y;
  1148. long gs_x;
  1149. long cs;
  1150. int i;
  1151. int n;
  1152. int na;
  1153. long gos_y;
  1154. long gos_x;
  1155. long gas_y;
  1156. long gas_x;
  1157. long Radius;
  1158. long x, y;
  1159. long yc;
  1160. long y1;
  1161. long DeltaX;
  1162. long DeltaY;
  1163. DeltaX = X2r - X1r;
  1164. DeltaY = Y2r - Y1r;
  1165. if ( DeltaX <= 0 ) DeltaX = 1;
  1166. if ( DeltaY <= 0 ) DeltaY = 1;
  1167. # if 0
  1168. XDrawRectangle( XschGraphicDisplay,
  1169. XschGraphicPixmap,
  1170. XschDrawGC,
  1171. X1r, XschGraphicDy - Y2r,
  1172. DeltaX, DeltaY );
  1173. # endif
  1174. n = Obj->ARG1;
  1175. gs_y = ( 7 * DeltaY ) / 8;
  1176. gs_x = ( 6 * DeltaX ) / 8;
  1177. cs = DeltaX / 8;
  1178. yc = XschGraphicDy - Ycr;
  1179. y = XschGraphicDy - Ycr - gs_y/2;
  1180. x = X1r + cs;
  1181. if ( Obj->ARG3 == 0 )
  1182. {
  1183. /* Output line : centered vertically */
  1184. XDrawLine( XschGraphicDisplay,
  1185. XschGraphicPixmap,
  1186. XschDrawGC,
  1187. x + gs_x, yc, x + gs_x + cs, yc );
  1188. }
  1189. else
  1190. {
  1191. /* Output circle */
  1192. XDrawArc( XschGraphicDisplay,
  1193. XschGraphicPixmap,
  1194. XschDrawGC,
  1195. x + gs_x, yc - cs/2, cs, cs, 0 * 64, 360 * 64);
  1196. }
  1197. /*
  1198. ** Input connectors
  1199. */
  1200. y1 = Obj->Y + ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
  1201. /* Circle for inversion */
  1202. for (i = 0; i < n; i++)
  1203. {
  1204. yc = (float)( y1 ) * XschUnitGridStep;
  1205. yc = ( yc / XSCH_UNIT ) - XschPixelGridY;
  1206. yc = XschGraphicDy - yc;
  1207. if (( Obj->ARG2 & (1 << i)) == 0)
  1208. {
  1209. XDrawLine( XschGraphicDisplay,
  1210. XschGraphicPixmap,
  1211. XschDrawGC,
  1212. x - cs, yc, x, yc );
  1213. }
  1214. else
  1215. {
  1216. XDrawArc( XschGraphicDisplay,
  1217. XschGraphicPixmap,
  1218. XschDrawGC,
  1219. x - cs,
  1220. yc - cs/2,
  1221. cs, cs, 0 * 64, 360 * 64);
  1222. }
  1223. y1 += ( SCP_BOX_CON_STEP_Y * XSCH_UNIT );
  1224. }
  1225. /*
  1226. ** Draw Input And gates
  1227. */
  1228. na = n / 2;
  1229. if ( n & 1 ) gas_y = 7 * DeltaY / ( 8 * ( na + 1 ) );
  1230. else gas_y = 7 * DeltaY / ( 8 * na );
  1231. gas_x = gs_x / 3;
  1232. y1 = Obj->Y + Obj->DY - ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
  1233. y1 -= SCP_BOX_CON_STEP_Y * XSCH_UNIT / 2;
  1234. for ( i = 0; i < na; i++ )
  1235. {
  1236. yc = (float)( y1 ) * XschUnitGridStep;
  1237. yc = ( yc / XSCH_UNIT ) - XschPixelGridY;
  1238. yc = XschGraphicDy - yc;
  1239. XDrawLine( XschGraphicDisplay,
  1240. XschGraphicPixmap,
  1241. XschDrawGC, x, yc - gas_y /2, x, yc + gas_y/2);
  1242. /* And Shape */
  1243. XDrawLine( XschGraphicDisplay,
  1244. XschGraphicPixmap,
  1245. XschDrawGC,
  1246. x, yc - gas_y/2, x + gas_x/2, yc - gas_y/2 );
  1247. XDrawLine( XschGraphicDisplay,
  1248. XschGraphicPixmap,
  1249. XschDrawGC,
  1250. x , yc + gas_y/2,
  1251. x + gas_x/2, yc + gas_y/2 );
  1252. XDrawArc( XschGraphicDisplay,
  1253. XschGraphicPixmap,
  1254. XschDrawGC,
  1255. x, yc - gas_y/2, gas_x, gas_y -1, 90 * 64, -180 * 64);
  1256. y1 -= 2 * ( SCP_BOX_CON_STEP_Y * XSCH_UNIT );
  1257. }
  1258. if ( n & 1 )
  1259. {
  1260. y1 = y1 + ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
  1261. yc = (float)( y1 ) * XschUnitGridStep;
  1262. yc = ( yc / XSCH_UNIT ) - XschPixelGridY;
  1263. yc = XschGraphicDy - yc;
  1264. XDrawLine( XschGraphicDisplay,
  1265. XschGraphicPixmap,
  1266. XschDrawGC,
  1267. x , yc, x + gas_x, yc );
  1268. }
  1269. /*
  1270. ** Draw Output Or gate
  1271. */
  1272. /* Or shape alone */
  1273. gos_y = 2 * DeltaY / 3;
  1274. gos_x = ( 2 * gs_x ) / 3;
  1275. yc = XschGraphicDy - Ycr;
  1276. y = yc + gos_y /2;
  1277. x = x + gas_x;
  1278. XDrawLine( XschGraphicDisplay,
  1279. XschGraphicPixmap,
  1280. XschDrawGC,
  1281. x, y, x + gos_x/2, y );
  1282. XDrawLine( XschGraphicDisplay,
  1283. XschGraphicPixmap,
  1284. XschDrawGC,
  1285. x , y - gos_y,
  1286. x + gos_x/2, y - gos_y );
  1287. XDrawArc( XschGraphicDisplay,
  1288. XschGraphicPixmap,
  1289. XschDrawGC,
  1290. x, y - gos_y, gos_x, gos_y, 90 * 64, -180 * 64);
  1291. Radius = (float)(gos_y) * 0.707106781185;
  1292. XDrawArc( XschGraphicDisplay,
  1293. XschGraphicPixmap,
  1294. XschDrawGC,
  1295. x - (Radius * 5 / 3), yc - Radius,
  1296. Radius * 2, Radius * 2, 45 * 64, -90 * 64);
  1297. }
  1298. /*------------------------------------------------------------\
  1299. | |
  1300. | XschDrawMux |
  1301. | |
  1302. \------------------------------------------------------------*/
  1303. static void XschDrawMux( X1r, Y1r, X2r, Y2r, Ycr, Obj )
  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 ms_x;
  1314. long ms_y;
  1315. long cs;
  1316. int i;
  1317. int ni;
  1318. int ns;
  1319. long x, y;
  1320. long yc;
  1321. long y1;
  1322. long y2;
  1323. long y3;
  1324. long x3;
  1325. long DeltaX;
  1326. long DeltaY;
  1327. DeltaX = X2r - X1r;
  1328. DeltaY = Y2r - Y1r;
  1329. if ( DeltaX <= 0 ) DeltaX = 1;
  1330. if ( DeltaY <= 0 ) DeltaY = 1;
  1331. ns = Obj->ARG1;
  1332. ni = Obj->ARG2;
  1333. # if 0
  1334. XDrawRectangle( XschGraphicDisplay,
  1335. XschGraphicPixmap,
  1336. XschDrawGC,
  1337. X1r, XschGraphicDy - Y2r,
  1338. DeltaX, DeltaY );
  1339. # endif
  1340. gs_y = ( 7 * DeltaY ) / 8;
  1341. gs_x = ( 6 * DeltaX ) / 8;
  1342. cs = DeltaX / 8;
  1343. yc = XschGraphicDy - Ycr;
  1344. x = X1r + cs;
  1345. /*
  1346. ** Draw Mux Rectangle
  1347. */
  1348. ms_x = gs_x / 2;
  1349. y1 = Obj->Y + (2 * SCP_BOX_CON_BASE_Y + (ni - 1) * SCP_BOX_CON_STEP_Y) * XSCH_UNIT;
  1350. y2 = (float)( y1 ) * XschUnitGridStep;
  1351. y2 = ( y2 / XSCH_UNIT ) - XschPixelGridY;
  1352. ms_y = y2 - Y1r;
  1353. y2 = XschGraphicDy - y2;
  1354. XDrawRectangle( XschGraphicDisplay,
  1355. XschGraphicPixmap,
  1356. XschDrawGC,
  1357. x, y2, ms_x, ms_y );
  1358. XDrawLine( XschGraphicDisplay,
  1359. XschGraphicPixmap,
  1360. XschDrawGC,
  1361. x, y2, x + ms_x, y2 + ms_y / 2 );
  1362. XDrawLine( XschGraphicDisplay,
  1363. XschGraphicPixmap,
  1364. XschDrawGC,
  1365. x + ms_x, y2 + ms_y/2, x, y2 + ms_y );
  1366. if ( Obj->ARG4 == 0 )
  1367. {
  1368. /* Output line : centered vertically */
  1369. XDrawLine( XschGraphicDisplay,
  1370. XschGraphicPixmap,
  1371. XschDrawGC,
  1372. x + ms_x, y2 + ms_y/2, x + ms_x + cs, y2 + ms_y/2 );
  1373. }
  1374. else
  1375. {
  1376. /* Output circle */
  1377. XDrawArc( XschGraphicDisplay,
  1378. XschGraphicPixmap,
  1379. XschDrawGC,
  1380. x + ms_x, y2 + ms_y/2 - cs/2, cs, cs, 0 * 64, 360 * 64);
  1381. }
  1382. y3 = y2 + ms_y/2;
  1383. XDrawLine( XschGraphicDisplay,
  1384. XschGraphicPixmap,
  1385. XschDrawGC,
  1386. x + ms_x + cs, y3, x + gs_x + cs, y3 );
  1387. XDrawLine( XschGraphicDisplay,
  1388. XschGraphicPixmap,
  1389. XschDrawGC,
  1390. x + gs_x + cs, y3, x + gs_x + cs, yc );
  1391. /*
  1392. ** Input connectors
  1393. */
  1394. y1 = Obj->Y + ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
  1395. /* Circle for inversion */
  1396. for (i = 0; i < ni; i++)
  1397. {
  1398. y3 = (float)( y1 ) * XschUnitGridStep;
  1399. y3 = ( y3 / XSCH_UNIT ) - XschPixelGridY;
  1400. y3 = XschGraphicDy - y3;
  1401. if (( Obj->ARG3 & (1 << i)) == 0)
  1402. {
  1403. XDrawLine( XschGraphicDisplay,
  1404. XschGraphicPixmap,
  1405. XschDrawGC,
  1406. x - cs, y3, x, y3 );
  1407. }
  1408. else
  1409. {
  1410. XDrawArc( XschGraphicDisplay,
  1411. XschGraphicPixmap,
  1412. XschDrawGC,
  1413. x - cs,
  1414. y3 - cs/2,
  1415. cs, cs, 0 * 64, 360 * 64);
  1416. }
  1417. y1 += ( SCP_BOX_CON_STEP_Y * XSCH_UNIT );
  1418. }
  1419. x3 = x;
  1420. /*
  1421. ** Select connectors
  1422. */
  1423. for (i = 0; i < ns; i++)
  1424. {
  1425. y3 = (float)( y1 ) * XschUnitGridStep;
  1426. y3 = ( y3 / XSCH_UNIT ) - XschPixelGridY;
  1427. y3 = XschGraphicDy - y3;
  1428. x3 += ms_x / ( ns + 1 );
  1429. XDrawLine( XschGraphicDisplay,
  1430. XschGraphicPixmap,
  1431. XschDrawGC,
  1432. x - cs, y3, x3, y3 );
  1433. XDrawLine( XschGraphicDisplay,
  1434. XschGraphicPixmap,
  1435. XschDrawGC,
  1436. x3, y3, x3, y2 );
  1437. y1 += ( SCP_BOX_CON_STEP_Y * XSCH_UNIT );
  1438. }
  1439. # if 0
  1440. /*
  1441. ** Draw Input And gates
  1442. */
  1443. na = n / 2;
  1444. if ( n & 1 ) gas_y = 7 * DeltaY / ( 8 * ( na + 1 ) );
  1445. else gas_y = 7 * DeltaY / ( 8 * na );
  1446. gas_x = gs_x / 3;
  1447. y1 = Obj->Y + Obj->DY - ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
  1448. y1 -= SCP_BOX_CON_STEP_Y * XSCH_UNIT / 2;
  1449. for ( i = 0; i < na; i++ )
  1450. {
  1451. yc = (float)( y1 ) * XschUnitGridStep;
  1452. yc = ( yc / XSCH_UNIT ) - XschPixelGridY;
  1453. yc = XschGraphicDy - yc;
  1454. XDrawLine( XschGraphicDisplay,
  1455. XschGraphicPixmap,
  1456. XschDrawGC, x, yc - gas_y /2, x, yc + gas_y/2);
  1457. /* And Shape */
  1458. XDrawLine( XschGraphicDisplay,
  1459. XschGraphicPixmap,
  1460. XschDrawGC,
  1461. x, yc - gas_y/2, x + gas_x/2, yc - gas_y/2 );
  1462. XDrawLine( XschGraphicDisplay,
  1463. XschGraphicPixmap,
  1464. XschDrawGC,
  1465. x , yc + gas_y/2,
  1466. x + gas_x/2, yc + gas_y/2 );
  1467. XDrawArc( XschGraphicDisplay,
  1468. XschGraphicPixmap,
  1469. XschDrawGC,
  1470. x, yc - gas_y/2, gas_x, gas_y -1, 90 * 64, -180 * 64);
  1471. y1 -= 2 * ( SCP_BOX_CON_STEP_Y * XSCH_UNIT );
  1472. }
  1473. if ( n & 1 )
  1474. {
  1475. y1 = y1 + ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
  1476. yc = (float)( y1 ) * XschUnitGridStep;
  1477. yc = ( yc / XSCH_UNIT ) - XschPixelGridY;
  1478. yc = XschGraphicDy - yc;
  1479. XDrawLine( XschGraphicDisplay,
  1480. XschGraphicPixmap,
  1481. XschDrawGC,
  1482. x , yc, x + gas_x, yc );
  1483. }
  1484. /*
  1485. ** Draw Output Or gate
  1486. */
  1487. /* Or shape alone */
  1488. gos_y = 2 * DeltaY / 3;
  1489. gos_x = ( 2 * gs_x ) / 3;
  1490. yc = XschGraphicDy - Ycr;
  1491. y = yc + gos_y /2;
  1492. x = x + gas_x;
  1493. XDrawLine( XschGraphicDisplay,
  1494. XschGraphicPixmap,
  1495. XschDrawGC,
  1496. x, y, x + gos_x/2, y );
  1497. XDrawLine( XschGraphicDisplay,
  1498. XschGraphicPixmap,
  1499. XschDrawGC,
  1500. x , y - gos_y,
  1501. x + gos_x/2, y - gos_y );
  1502. XDrawArc( XschGraphicDisplay,
  1503. XschGraphicPixmap,
  1504. XschDrawGC,
  1505. x, y - gos_y, gos_x, gos_y, 90 * 64, -180 * 64);
  1506. Radius = (float)(gos_y) * 0.707106781185;
  1507. XDrawArc( XschGraphicDisplay,
  1508. XschGraphicPixmap,
  1509. XschDrawGC,
  1510. x - (Radius * 5 / 3), yc - Radius,
  1511. Radius * 2, Radius * 2, 45 * 64, -90 * 64);
  1512. # endif
  1513. }
  1514. /*------------------------------------------------------------\
  1515. | |
  1516. | XschDrawOrAnd |
  1517. | |
  1518. \------------------------------------------------------------*/
  1519. static void XschDrawOrAnd( X1r, Y1r, X2r, Y2r, Ycr, Obj )
  1520. long X1r;
  1521. long Y1r;
  1522. long X2r;
  1523. long Y2r;
  1524. long Ycr;
  1525. xschobj_list *Obj;
  1526. {
  1527. long gs_y;
  1528. long gs_x;
  1529. long cs;
  1530. int i;
  1531. int n;
  1532. int no;
  1533. long gos_y;
  1534. long gos_x;
  1535. long gas_y;
  1536. long gas_x;
  1537. long Radius;
  1538. long x, y;
  1539. long yc;
  1540. long y1;
  1541. long DeltaX;
  1542. long DeltaY;
  1543. DeltaX = X2r - X1r;
  1544. DeltaY = Y2r - Y1r;
  1545. if ( DeltaX <= 0 ) DeltaX = 1;
  1546. if ( DeltaY <= 0 ) DeltaY = 1;
  1547. # if 0
  1548. XDrawRectangle( XschGraphicDisplay,
  1549. XschGraphicPixmap,
  1550. XschDrawGC,
  1551. X1r, XschGraphicDy - Y2r,
  1552. DeltaX, DeltaY );
  1553. # endif
  1554. n = Obj->ARG1;
  1555. gs_y = ( 7 * DeltaY ) / 8;
  1556. gs_x = ( 6 * DeltaX ) / 8;
  1557. cs = DeltaX / 8;
  1558. yc = XschGraphicDy - Ycr;
  1559. y = XschGraphicDy - Ycr - gs_y/2;
  1560. x = X1r + cs;
  1561. if ( Obj->ARG3 == 0 )
  1562. {
  1563. /* Output line : centered vertically */
  1564. XDrawLine( XschGraphicDisplay,
  1565. XschGraphicPixmap,
  1566. XschDrawGC,
  1567. x + gs_x, yc, x + gs_x + cs, yc );
  1568. }
  1569. else
  1570. {
  1571. /* Output circle */
  1572. XDrawArc( XschGraphicDisplay,
  1573. XschGraphicPixmap,
  1574. XschDrawGC,
  1575. x + gs_x, yc - cs/2, cs, cs, 0 * 64, 360 * 64);
  1576. }
  1577. /*
  1578. ** Input connectors
  1579. */
  1580. y1 = Obj->Y + ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
  1581. /* Circle for inversion */
  1582. for (i = 0; i < n; i++)
  1583. {
  1584. yc = (float)( y1 ) * XschUnitGridStep;
  1585. yc = ( yc / XSCH_UNIT ) - XschPixelGridY;
  1586. yc = XschGraphicDy - yc;
  1587. if (( Obj->ARG2 & (1 << i)) == 0)
  1588. {
  1589. XDrawLine( XschGraphicDisplay,
  1590. XschGraphicPixmap,
  1591. XschDrawGC,
  1592. x - cs, yc, x, yc );
  1593. }
  1594. else
  1595. {
  1596. XDrawArc( XschGraphicDisplay,
  1597. XschGraphicPixmap,
  1598. XschDrawGC,
  1599. x - cs,
  1600. yc - cs/2,
  1601. cs, cs, 0 * 64, 360 * 64);
  1602. }
  1603. y1 += ( SCP_BOX_CON_STEP_Y * XSCH_UNIT );
  1604. }
  1605. /*
  1606. ** Draw Input Or gates
  1607. */
  1608. no = n / 2;
  1609. if ( n & 1 ) gos_y = 7 * DeltaY / ( 8 * ( no + 1 ) );
  1610. else gos_y = 7 * DeltaY / ( 8 * no );
  1611. gos_x = gs_x / 3;
  1612. y1 = Obj->Y + Obj->DY - ( SCP_BOX_CON_BASE_Y * XSCH_UNIT );
  1613. y1 -= SCP_BOX_CON_STEP_Y * XSCH_UNIT / 2;
  1614. for ( i = 0; i < no; i++ )
  1615. {
  1616. yc = (float)( y1 ) * XschUnitGridStep;
  1617. yc = ( yc / XSCH_UNIT ) - XschPixelGridY;
  1618. yc = XschGraphicDy - yc;
  1619. /* Or shape alone */
  1620. XDrawLine( XschGraphicDisplay,
  1621. XschGraphicPixmap,
  1622. XschDrawGC,
  1623. x , yc + gos_y/2,
  1624. x + gos_x/2, yc + gos_y/2 );
  1625. XDrawLine( XschGraphicDisplay,
  1626. XschGraphicPixmap,
  1627. XschD