PageRenderTime 43ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/alliance-5.0/mbkvhdlg/src/mvl_scomp_y.y

#
Happy | 1722 lines | 1544 code | 178 blank | 0 comment | 0 complexity | 51f3f6d7b2de3e0ae6dd539aa91f6788 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.0

Large files files are truncated, but you can click here to view the full file

  1. /* ###--------------------------------------------------------------### */
  2. /* */
  3. /* file : mvl_scomp.yac */
  4. /* date : Sep 24 1993 */
  5. /* version : v4.06 */
  6. /* author : P. BAZARGAN, L.A. TABUSSE, VUONG H.N., D.HOMMAIS */
  7. /* content : yacc rules for structural VHDL */
  8. /* last modifie : Mar 7 1997 */
  9. /* */
  10. /* ###--------------------------------------------------------------### */
  11. %{
  12. #include <stdio.h>
  13. #include <string.h>
  14. #include "mut.h"
  15. #include "mlo.h"
  16. #include "mvl_stype.h"
  17. #include "mvl_syacc.h"
  18. #include "mvl_stdef.h"
  19. #include "gen_generic.h"
  20. static int MVL_GENFLG = 0 ; /* Indicates if generic */
  21. static int MVL_CONRNK = 0 ; /* rank of an implicit connexion*/
  22. static int MVL_SIGIDX = 1 ; /* structural's signal index */
  23. static int MVL_SIMFLG = 0 ; /* simple flag */
  24. static int MVL_CONCNT = 0 ; /* connector's count */
  25. static char *MVL_MODNAM ; /* current model name */
  26. static char *MVL_CHDNAM ; /* child's model name */
  27. static char *MVL_LOCNAM ; /* instance's name */
  28. static struct chain *MVL_NM1LST = NULL; /* 1-st name liste */
  29. static struct chain *MVL_NM2LST = NULL; /* 2-nd name liste */
  30. static struct lofig *MVL_CHDPNT = NULL; /* current child pointer */
  31. static struct lofig *MVL_CHDHED = NULL; /* childs list */
  32. static struct ptype *MVL_PTPPNT = NULL;
  33. static struct chain *MVL_GENLST = NULL;
  34. static struct logen *MVL_GENPNT = NULL;
  35. static struct logen MVL_LOGEN;
  36. static long base ;
  37. %}
  38. %union
  39. {
  40. long valu;
  41. char *text;
  42. char flag;
  43. mvl_name name;
  44. mvl_expr expr;
  45. };
  46. %token Ampersand
  47. %token Apostrophe
  48. %token LeftParen
  49. %token RightParen
  50. %token DoubleStar
  51. %token Star
  52. %token Plus
  53. %token Comma
  54. %token Minus
  55. %token VarAsgn
  56. %token Colon
  57. %token Semicolon
  58. %token _LESym
  59. %token Box
  60. %token _LTSym
  61. %token Arrow
  62. %token _EQSym
  63. %token _GESym
  64. %token _GTSym
  65. %token Bar
  66. %token _NESym
  67. %token Dot
  68. %token Slash
  69. %token <text> Identifier
  70. %token DecimalInt
  71. %token DecimalReal
  72. %token <text> AbstractLit
  73. %token BasedInt
  74. %token BasedReal
  75. %token <text> CharacterLit
  76. %token <text> StringLit
  77. %token <text> BitStringLit
  78. %token ABS
  79. %token ACCESS
  80. %token AFTER
  81. %token ALIAS
  82. %token ALL
  83. %token tok_AND
  84. %token ARCHITECTURE
  85. %token ARRAY
  86. %token ARG
  87. %token ASSERT
  88. %token ATTRIBUTE
  89. %token _BEGIN
  90. %token BIT
  91. %token BIT_VECTOR
  92. %token BLOCK
  93. %token BODY
  94. %token BUFFER
  95. %token BUS
  96. %token CASE
  97. %token CLOCK
  98. %token COMPONENT
  99. %token CONFIGURATION
  100. %token CONSTANT
  101. %token CONVERT
  102. %token DISCONNECT
  103. %token DOWNTO
  104. %token ELSE
  105. %token ELSIF
  106. %token _END
  107. %token ENTITY
  108. %token ERROR
  109. %token _EXIT
  110. %token _FILE
  111. %token FOR
  112. %token FUNCTION
  113. %token GENERATE
  114. %token GENERIC
  115. %token GUARDED
  116. %token IF
  117. %token _IN
  118. %token _INOUT
  119. %token INTEGER
  120. %token IS
  121. %token _LABEL
  122. %token LIBRARY
  123. %token _LINKAGE
  124. %token _LIST
  125. %token LOOP
  126. %token MAP
  127. %token MOD
  128. %token MUX_BIT
  129. %token MUX_VECTOR
  130. %token _NAND
  131. %token NATURAL
  132. %token NATURAL_VECTOR
  133. %token NEW
  134. %token _NEXT
  135. %token _NOR
  136. %token _NOT
  137. %token tok_NULL
  138. %token OF
  139. %token ON
  140. %token OPEN
  141. %token _OR
  142. %token OTHERS
  143. %token _OUT
  144. %token _PACKAGE
  145. %token PORT
  146. %token POSITIVE
  147. %token PROCEDURE
  148. %token PROCESS
  149. %token RANGE
  150. %token RECORD
  151. %token REG_BIT
  152. %token REG_VECTOR
  153. %token REGISTER
  154. %token REM
  155. %token REPORT
  156. %token RETURN
  157. %token SELECT
  158. %token SEVERITY
  159. %token SIGNAL
  160. %token _STABLE
  161. %token STRING
  162. %token SUBTYPE
  163. %token THEN
  164. %token TO
  165. %token TRANSPORT
  166. %token _TYPE
  167. %token UNITS
  168. %token UNTIL
  169. %token USE
  170. %token VARIABLE
  171. %token WAIT
  172. %token WARNING
  173. %token WHEN
  174. %token WHILE
  175. %token WITH
  176. %token WOR_BIT
  177. %token WOR_VECTOR
  178. %token _XOR
  179. %type <valu> .mode.
  180. %type <valu> .local_port_mode.
  181. %type <valu> type_mark
  182. %type <valu> .BUS.
  183. %type <text> .simple_name.
  184. %type <text> simple_name
  185. %type <text> a_label
  186. %type <name> formal_port_name
  187. %type <expr> actual_port_name
  188. %type <expr> expression
  189. %type <expr> relation
  190. %type <expr> simple_expression
  191. %type <expr> .sign.term..add_op__term..
  192. %type <expr> term
  193. %type <expr> factor
  194. %type <expr> primary
  195. %type <expr> aggregate
  196. %type <expr> type_convertion
  197. %type <name> .constraint.
  198. %type <name> constraint
  199. %type <name> range
  200. %type <valu> direction
  201. %type <valu> abstractlit
  202. %type <name> name
  203. %type <name> slice_name
  204. %type <name> indexed_name
  205. %type <text> formal_generic_name
  206. %type <text> generic_name
  207. %type <flag> .sign.
  208. %start design_file
  209. %%
  210. design_file
  211. : entity_declaration
  212. architecture_body
  213. {
  214. freelomodel (MVL_CHDHED);
  215. mvl_fretab (MVL_HSHTAB);
  216. }
  217. ;
  218. entity_declaration
  219. : ENTITY
  220. .simple_name.
  221. IS
  222. {
  223. MVL_HSHTAB = mvl_initab ();
  224. MVL_SIMFLG = 0 ; /* simple flag */
  225. MVL_NM1LST = NULL; /* 1-st name liste */
  226. MVL_NM2LST = NULL; /* 2-nd name liste */
  227. MVL_CHDPNT = NULL; /* current child pointer */
  228. MVL_CHDHED = NULL; /* childs list */
  229. MVL_MODNAM = $2;
  230. mvl_addtab (MVL_HSHTAB,MVL_MODNAM,MVL_MODNAM,MVL_MODDFN,
  231. MVL_ROTDFN);
  232. }
  233. .generic_clause.
  234. .port_clause.
  235. END_ERR
  236. .simple_name.
  237. Semicolon_ERR
  238. {
  239. if (($8 != NULL) && ($8 != $2))
  240. mvl_error (1, $8);
  241. mvl_addtab (MVL_HSHTAB,MVL_MODNAM,MVL_MODNAM,MVL_CCNDFN,
  242. MVL_CONCNT);
  243. MVL_CONCNT = 0;
  244. }
  245. | ENTITY
  246. error
  247. { mvl_error (2, NULL); }
  248. ;
  249. .generic_clause.
  250. : /*empty*/
  251. | generic_clause
  252. ;
  253. generic_clause
  254. : GENERIC
  255. { /* NULL means we're in the entity declaration */
  256. if (!MVL_CHDHED) {
  257. MVL_LOFPNT->USER=addptype(MVL_LOFPNT->USER,LOGEN,NULL);
  258. MVL_PTPPNT=MVL_LOFPNT->USER;
  259. } else {
  260. MVL_CHDPNT->USER=addptype(MVL_LOFPNT->USER,LOGEN,NULL);
  261. MVL_PTPPNT=MVL_CHDPNT->USER;
  262. }
  263. }
  264. LeftParen
  265. formal_generic_list
  266. RightParen_ERR
  267. Semicolon_ERR
  268. | GENERIC
  269. error
  270. Semicolon_ERR
  271. ;
  272. formal_generic_list
  273. : formal_generic_element
  274. ...formal_generic_element..
  275. ;
  276. ...formal_generic_element..
  277. : /*empty*/
  278. | ...formal_generic_element..
  279. Semicolon_ERR
  280. formal_generic_element
  281. ;
  282. formal_generic_element
  283. : CONSTANT
  284. identifier_list
  285. Colon
  286. type_mark
  287. .constraint.
  288. generic_VarAsgn__expression
  289. {
  290. struct chain *l;
  291. for (l=MVL_NM1LST;l;l=l->NEXT) {
  292. MVL_PTPPNT->DATA=duplogen(&MVL_LOGEN,
  293. MVL_PTPPNT->DATA,l->DATA);
  294. }
  295. switch ($4) {
  296. case MVL_ARGDFN:
  297. {
  298. logen_list *gen = (logen_list *)MVL_PTPPNT->DATA;
  299. gen->TYPE=GENTYPE_ARG;
  300. }
  301. break;
  302. case MVL_BITDFN:
  303. {
  304. logen_list *gen = (logen_list *)MVL_PTPPNT->DATA;
  305. gen->TYPE=GENTYPE_BIT;
  306. }
  307. break;
  308. }
  309. MVL_LOGEN.TYPE=GENTYPE_EMPTY;
  310. freechain (MVL_NM1LST);
  311. MVL_NM1LST = NULL;
  312. }
  313. | error
  314. ;
  315. generic_VarAsgn__expression
  316. : VarAsgn
  317. generic_expression
  318. ;
  319. .constraint.
  320. : /*empty*/
  321. {
  322. $$.LEFT = -1;
  323. $$.RIGHT = -1;
  324. $$.ERR_FLG = 0;
  325. }
  326. | constraint
  327. { $$ = $1; }
  328. ;
  329. constraint
  330. : LeftParen
  331. range
  332. RightParen_ERR
  333. { $$ = $2; }
  334. ;
  335. range
  336. : abstractlit
  337. direction
  338. abstractlit
  339. {
  340. $$.LEFT = $1;
  341. $$.RIGHT = $3;
  342. if ((($1 > $3) && ($2 == MVL_UPTDFN)) ||
  343. (($1 < $3) && ($2 == MVL_DWTDFN)))
  344. {
  345. mvl_error (32, NULL);
  346. $$.ERR_FLG = 1;
  347. }
  348. else
  349. $$.ERR_FLG = 0;
  350. }
  351. ;
  352. direction
  353. : TO
  354. { $$ = MVL_UPTDFN; }
  355. | DOWNTO
  356. { $$ = MVL_DWTDFN; }
  357. ;
  358. .port_clause.
  359. : /*empty*/
  360. | port_clause
  361. ;
  362. port_clause
  363. : PORT
  364. LeftParen
  365. formal_port_list
  366. RightParen_ERR
  367. Semicolon_ERR
  368. | PORT
  369. error
  370. Semicolon_ERR
  371. { mvl_error (3, NULL); }
  372. ;
  373. formal_port_list
  374. : formal_port_element
  375. ...formal_port_element..
  376. ;
  377. ...formal_port_element..
  378. : /*empty*/
  379. | ...formal_port_element..
  380. Semicolon_ERR
  381. formal_port_element
  382. ;
  383. formal_port_element
  384. : .SIGNAL.
  385. identifier_list
  386. Colon
  387. .mode.
  388. type_mark
  389. .constraint.
  390. .BUS.
  391. {
  392. struct locon *locon_pnt;
  393. struct losig *losig_pnt;
  394. long sig_width;
  395. long sig_conf;
  396. char *sig_name;
  397. struct chain *sig_list;
  398. long local_err;
  399. local_err = $6.ERR_FLG;
  400. if ( ($6.LEFT == -1) && (($5 == MVL_BTVDFN) ||
  401. ($5 == MVL_MXVDFN) ||
  402. ($5 == MVL_WRVDFN)))
  403. {
  404. mvl_error (33, NULL);
  405. }
  406. if ($6.LEFT <= $6.RIGHT)
  407. sig_width = $6.RIGHT - $6.LEFT + 1;
  408. else
  409. sig_width = $6.LEFT - $6.RIGHT + 1;
  410. sig_conf = $4 + $5 + $7;
  411. MVL_NM1LST = reverse (MVL_NM1LST);
  412. sig_list = MVL_NM1LST;
  413. while ((sig_list != NULL) && (local_err == 0))
  414. {
  415. sig_name = (char *)sig_list->DATA;
  416. if (mvl_chktab (MVL_HSHTAB,sig_name,MVL_MODNAM,
  417. MVL_SIGDFN) != 0)
  418. mvl_error (4, sig_name);
  419. else
  420. {
  421. switch (sig_conf)
  422. {
  423. case (MVL_ICNDFN + MVL_BITDFN + MVL_NORDFN) :
  424. case (MVL_ICNDFN + MVL_BTVDFN + MVL_NORDFN) :
  425. losig_pnt = mvl_addlosig (MVL_LOFPNT,MVL_SIGIDX,'E','0',
  426. sig_name,$6.LEFT,$6.RIGHT);
  427. locon_pnt = mvl_addlocon (MVL_LOFPNT,losig_pnt,'I',
  428. sig_name,$6.LEFT,$6.RIGHT);
  429. break;
  430. case (MVL_OCNDFN + MVL_BITDFN + MVL_NORDFN) :
  431. case (MVL_OCNDFN + MVL_BTVDFN + MVL_NORDFN) :
  432. losig_pnt = mvl_addlosig (MVL_LOFPNT,MVL_SIGIDX,'E','0',
  433. sig_name,$6.LEFT,$6.RIGHT);
  434. locon_pnt = mvl_addlocon (MVL_LOFPNT,losig_pnt,'O',
  435. sig_name,$6.LEFT,$6.RIGHT);
  436. break;
  437. case (MVL_OCNDFN + MVL_MUXDFN + MVL_BUSDFN) :
  438. case (MVL_OCNDFN + MVL_MXVDFN + MVL_BUSDFN) :
  439. losig_pnt = mvl_addlosig (MVL_LOFPNT,MVL_SIGIDX,'E','M',
  440. sig_name,$6.LEFT,$6.RIGHT);
  441. locon_pnt = mvl_addlocon (MVL_LOFPNT,losig_pnt,'Z',
  442. sig_name,$6.LEFT,$6.RIGHT);
  443. break;
  444. case (MVL_OCNDFN + MVL_WORDFN + MVL_BUSDFN) :
  445. case (MVL_OCNDFN + MVL_WRVDFN + MVL_BUSDFN) :
  446. losig_pnt = mvl_addlosig (MVL_LOFPNT,MVL_SIGIDX,'E','W',
  447. sig_name,$6.LEFT,$6.RIGHT);
  448. locon_pnt = mvl_addlocon (MVL_LOFPNT,losig_pnt,'Z',
  449. sig_name,$6.LEFT,$6.RIGHT);
  450. break;
  451. case (MVL_BCNDFN + MVL_BITDFN + MVL_NORDFN) :
  452. case (MVL_BCNDFN + MVL_BTVDFN + MVL_NORDFN) :
  453. losig_pnt = mvl_addlosig (MVL_LOFPNT,MVL_SIGIDX,'E','0',
  454. sig_name,$6.LEFT,$6.RIGHT);
  455. locon_pnt = mvl_addlocon (MVL_LOFPNT,losig_pnt,'B',
  456. sig_name,$6.LEFT,$6.RIGHT);
  457. break;
  458. case (MVL_BCNDFN + MVL_MUXDFN + MVL_BUSDFN) :
  459. case (MVL_BCNDFN + MVL_MXVDFN + MVL_BUSDFN) :
  460. losig_pnt = mvl_addlosig (MVL_LOFPNT,MVL_SIGIDX,'E','M',
  461. sig_name,$6.LEFT,$6.RIGHT);
  462. locon_pnt = mvl_addlocon (MVL_LOFPNT,losig_pnt,'T',
  463. sig_name,$6.LEFT,$6.RIGHT);
  464. break;
  465. case (MVL_BCNDFN + MVL_WORDFN + MVL_BUSDFN) :
  466. case (MVL_BCNDFN + MVL_WRVDFN + MVL_BUSDFN) :
  467. losig_pnt = mvl_addlosig (MVL_LOFPNT,MVL_SIGIDX,'E','W',
  468. sig_name,$6.LEFT,$6.RIGHT);
  469. locon_pnt = mvl_addlocon (MVL_LOFPNT,losig_pnt,'T',
  470. sig_name,$6.LEFT,$6.RIGHT);
  471. break;
  472. case (MVL_XCNDFN + MVL_BITDFN + MVL_NORDFN) :
  473. case (MVL_XCNDFN + MVL_BTVDFN + MVL_NORDFN) :
  474. losig_pnt = mvl_addlosig (MVL_LOFPNT,MVL_SIGIDX,'E','0',
  475. sig_name,$6.LEFT,$6.RIGHT);
  476. locon_pnt = mvl_addlocon (MVL_LOFPNT,losig_pnt,'X',
  477. sig_name,$6.LEFT,$6.RIGHT);
  478. break;
  479. default :
  480. mvl_error (5, sig_name);
  481. local_err = 1;
  482. break;
  483. }
  484. if (local_err == 0)
  485. {
  486. mvl_addtab (MVL_HSHTAB,sig_name,MVL_MODNAM,MVL_PNTDFN,
  487. (long)losig_pnt);
  488. mvl_addtab (MVL_HSHTAB,sig_name,MVL_MODNAM,MVL_SIGDFN,
  489. sig_conf);
  490. mvl_addtab (MVL_HSHTAB,sig_name,MVL_MODNAM,MVL_LFTDFN,
  491. $6.LEFT);
  492. mvl_addtab (MVL_HSHTAB,sig_name,MVL_MODNAM,MVL_RGTDFN,
  493. $6.RIGHT);
  494. MVL_CONCNT += sig_width;
  495. MVL_SIGIDX += sig_width;
  496. }
  497. }
  498. sig_list = sig_list->NEXT;
  499. }
  500. freechain (MVL_NM1LST);
  501. MVL_NM1LST = NULL;
  502. }
  503. | error
  504. {
  505. /* ###----------------------------------------------### */
  506. /* The following 3 lines reject tokens until the */
  507. /* sync. token ('Semicolon') is found */
  508. /* ###----------------------------------------------### */
  509. do
  510. yychar = yylex ();
  511. while ((yychar != Semicolon) && (yychar != 0));
  512. yyerrok;
  513. mvl_error (6, NULL);
  514. }
  515. ;
  516. architecture_body
  517. : ARCHITECTURE
  518. {
  519. if (!strcmp (IN_LO, "vbe"))
  520. YYACCEPT;
  521. }
  522. simple_name
  523. OF
  524. simple_name
  525. IS
  526. {
  527. if ($5 != MVL_MODNAM)
  528. mvl_error (1, $5);
  529. }
  530. architecture_declarative_part
  531. _BEGIN
  532. architecture_statement_part
  533. END_ERR
  534. .simple_name.
  535. Semicolon_ERR
  536. {
  537. if (($12 != NULL) && ($12 != $3))
  538. mvl_error (7, $12);
  539. }
  540. | ARCHITECTURE
  541. error
  542. { mvl_error (8, NULL); }
  543. ;
  544. architecture_declarative_part
  545. : ..block_declaration_item..
  546. ;
  547. ..block_declaration_item..
  548. : /*empty*/
  549. | ..block_declaration_item..
  550. block_declaration_item
  551. ;
  552. block_declaration_item
  553. : signal_declaration
  554. | component_declaration
  555. | error
  556. Semicolon_ERR
  557. { mvl_error (9, NULL); }
  558. ;
  559. signal_declaration
  560. : SIGNAL
  561. identifier_list
  562. Colon
  563. type_mark
  564. .constraint.
  565. .BUS.
  566. Semicolon_ERR
  567. {
  568. struct losig *losig_pnt;
  569. long sig_width;
  570. long sig_conf;
  571. char *sig_name;
  572. struct chain *sig_list;
  573. long local_err;
  574. local_err = $5.ERR_FLG;
  575. if (($5.LEFT==-1) && (($4==MVL_BTVDFN) || ($4==MVL_RGVDFN)))
  576. {
  577. mvl_error (33, NULL);
  578. }
  579. if ($5.LEFT <= $5.RIGHT)
  580. sig_width = $5.RIGHT - $5.LEFT + 1;
  581. else
  582. sig_width = $5.LEFT - $5.RIGHT + 1;
  583. sig_conf = $4 + $6;
  584. MVL_NM1LST = reverse (MVL_NM1LST);
  585. sig_list = MVL_NM1LST;
  586. while ((sig_list != NULL) && (local_err == 0))
  587. {
  588. sig_name = (char *)sig_list->DATA;
  589. if (mvl_chktab (MVL_HSHTAB,sig_name,MVL_MODNAM,
  590. MVL_SIGDFN) != 0)
  591. mvl_error (10, sig_name);
  592. else
  593. {
  594. switch (sig_conf)
  595. {
  596. case (MVL_BITDFN + MVL_NORDFN):
  597. case (MVL_BTVDFN + MVL_NORDFN):
  598. losig_pnt = mvl_addlosig(MVL_LOFPNT,MVL_SIGIDX,'I','0',
  599. sig_name,$5.LEFT,$5.RIGHT);
  600. break;
  601. case (MVL_MUXDFN + MVL_BUSDFN):
  602. case (MVL_MXVDFN + MVL_BUSDFN):
  603. losig_pnt = mvl_addlosig(MVL_LOFPNT,MVL_SIGIDX,'I','M',
  604. sig_name,$5.LEFT,$5.RIGHT);
  605. break;
  606. case (MVL_WORDFN + MVL_BUSDFN):
  607. case (MVL_WRVDFN + MVL_BUSDFN):
  608. losig_pnt = mvl_addlosig(MVL_LOFPNT,MVL_SIGIDX,'I','W',
  609. sig_name,$5.LEFT,$5.RIGHT);
  610. break;
  611. default:
  612. mvl_error (11, sig_name);
  613. local_err = 1;
  614. break;
  615. }
  616. if (local_err == 0)
  617. {
  618. mvl_addtab (MVL_HSHTAB,sig_name,MVL_MODNAM,MVL_PNTDFN,
  619. (long)losig_pnt);
  620. mvl_addtab (MVL_HSHTAB,sig_name,MVL_MODNAM,MVL_SIGDFN,
  621. sig_conf);
  622. mvl_addtab (MVL_HSHTAB,sig_name,MVL_MODNAM,MVL_LFTDFN,
  623. $5.LEFT);
  624. mvl_addtab (MVL_HSHTAB,sig_name,MVL_MODNAM,MVL_RGTDFN,
  625. $5.RIGHT);
  626. MVL_SIGIDX += sig_width;
  627. }
  628. }
  629. sig_list = sig_list->NEXT;
  630. }
  631. freechain (MVL_NM1LST);
  632. MVL_NM1LST = NULL;
  633. }
  634. ;
  635. component_declaration
  636. : COMPONENT
  637. Identifier
  638. {
  639. MVL_CHDNAM = $2;
  640. if (mvl_chktab (MVL_HSHTAB,MVL_CHDNAM,MVL_MODNAM,MVL_MODDFN) != 0)
  641. {
  642. mvl_error (12, MVL_CHDNAM);
  643. MVL_CHDPNT = NULL;
  644. }
  645. else
  646. {
  647. MVL_CHDHED = addlomodel (MVL_CHDHED,MVL_CHDNAM);
  648. MVL_CHDPNT = MVL_CHDHED;
  649. mvl_addtab (MVL_HSHTAB,MVL_CHDNAM,MVL_MODNAM,MVL_MODDFN,MVL_CHDDFN);
  650. }
  651. }
  652. .generic_clause.
  653. .PORT__local_port_list.
  654. END_ERR
  655. COMPONENT
  656. Semicolon_ERR
  657. {
  658. if (MVL_CHDPNT != NULL)
  659. {
  660. mvl_addtab (MVL_HSHTAB,$2,MVL_MODNAM,MVL_CCNDFN,MVL_CONCNT);
  661. MVL_LOFPNT->MODELCHAIN = addchain (MVL_LOFPNT->MODELCHAIN,$2);
  662. }
  663. MVL_CONCNT = 0;
  664. }
  665. ;
  666. .PORT__local_port_list.
  667. : /*empty*/
  668. | PORT
  669. LeftParen
  670. local_port_list
  671. RightParen_ERR
  672. Semicolon_ERR
  673. ;
  674. local_port_list
  675. : local_port_element
  676. ...local_port_element..
  677. ;
  678. ...local_port_element..
  679. : /*empty*/
  680. | ...local_port_element..
  681. Semicolon_ERR
  682. local_port_element
  683. ;
  684. local_port_element
  685. : .SIGNAL.
  686. identifier_list
  687. Colon
  688. .local_port_mode.
  689. type_mark
  690. .constraint.
  691. .BUS.
  692. {
  693. struct locon *locon_pnt;
  694. long sig_width;
  695. long sig_conf;
  696. char *sig_name;
  697. struct chain *sig_list;
  698. long local_err = 0;
  699. if (($6.ERR_FLG != 0) || (MVL_CHDPNT == NULL))
  700. local_err = 1;
  701. if (($6.LEFT == -1) && (($5 == MVL_BTVDFN) ||
  702. ($5 == MVL_MXVDFN) ||
  703. ($5 == MVL_WRVDFN)) )
  704. {
  705. mvl_error (33, NULL);
  706. }
  707. if ($6.LEFT <= $6.RIGHT)
  708. sig_width = $6.RIGHT - $6.LEFT + 1;
  709. else
  710. sig_width = $6.LEFT - $6.RIGHT + 1;
  711. sig_conf = $4 + $5 + $7;
  712. MVL_NM1LST = reverse (MVL_NM1LST);
  713. sig_list = MVL_NM1LST;
  714. while ((sig_list != NULL) && (local_err == 0))
  715. {
  716. sig_name = (char *)sig_list->DATA;
  717. if (mvl_chktab (MVL_HSHTAB,sig_name,MVL_CHDNAM,
  718. MVL_SIGDFN) != 0)
  719. mvl_error (4, sig_name);
  720. else
  721. {
  722. switch (sig_conf)
  723. {
  724. case (MVL_ICNDFN + MVL_BITDFN + MVL_NORDFN) :
  725. case (MVL_ICNDFN + MVL_BTVDFN + MVL_NORDFN) :
  726. locon_pnt = mvl_addlocon (MVL_CHDPNT,NULL,'I',
  727. sig_name,$6.LEFT,$6.RIGHT);
  728. break;
  729. case (MVL_OCNDFN + MVL_BITDFN + MVL_NORDFN) :
  730. case (MVL_OCNDFN + MVL_BTVDFN + MVL_NORDFN) :
  731. locon_pnt = mvl_addlocon (MVL_CHDPNT,NULL,'O',
  732. sig_name,$6.LEFT,$6.RIGHT);
  733. break;
  734. case (MVL_OCNDFN + MVL_MUXDFN + MVL_BUSDFN) :
  735. case (MVL_OCNDFN + MVL_MXVDFN + MVL_BUSDFN) :
  736. locon_pnt = mvl_addlocon (MVL_CHDPNT,NULL,'Z',
  737. sig_name,$6.LEFT,$6.RIGHT);
  738. break;
  739. case (MVL_OCNDFN + MVL_WORDFN + MVL_BUSDFN) :
  740. case (MVL_OCNDFN + MVL_WRVDFN + MVL_BUSDFN) :
  741. locon_pnt = mvl_addlocon (MVL_CHDPNT,NULL,'Z',
  742. sig_name,$6.LEFT,$6.RIGHT);
  743. break;
  744. case (MVL_BCNDFN + MVL_BITDFN + MVL_NORDFN) :
  745. case (MVL_BCNDFN + MVL_BTVDFN + MVL_NORDFN) :
  746. locon_pnt = mvl_addlocon (MVL_CHDPNT,NULL,'B',
  747. sig_name,$6.LEFT,$6.RIGHT);
  748. break;
  749. case (MVL_BCNDFN + MVL_MUXDFN + MVL_BUSDFN) :
  750. case (MVL_BCNDFN + MVL_MXVDFN + MVL_BUSDFN) :
  751. locon_pnt = mvl_addlocon (MVL_CHDPNT,NULL,'T',
  752. sig_name,$6.LEFT,$6.RIGHT);
  753. break;
  754. case (MVL_BCNDFN + MVL_WORDFN + MVL_BUSDFN) :
  755. case (MVL_BCNDFN + MVL_WRVDFN + MVL_BUSDFN) :
  756. locon_pnt = mvl_addlocon (MVL_CHDPNT,NULL,'T',
  757. sig_name,$6.LEFT,$6.RIGHT);
  758. break;
  759. case (MVL_XCNDFN + MVL_BITDFN + MVL_NORDFN) :
  760. case (MVL_XCNDFN + MVL_BTVDFN + MVL_NORDFN) :
  761. locon_pnt = mvl_addlocon (MVL_CHDPNT,NULL,'X',
  762. sig_name,$6.LEFT,$6.RIGHT);
  763. break;
  764. default :
  765. mvl_error (5, sig_name);
  766. local_err = 1;
  767. break;
  768. }
  769. if (local_err == 0)
  770. {
  771. mvl_addtab (MVL_HSHTAB,MVL_CONCNT,MVL_CHDNAM,MVL_PNTDFN,
  772. sig_name);
  773. mvl_addtab (MVL_HSHTAB,sig_name, MVL_CHDNAM,MVL_SIGDFN,
  774. sig_conf);
  775. mvl_addtab (MVL_HSHTAB,sig_name, MVL_CHDNAM,MVL_RNGDFN,
  776. MVL_CONCNT);
  777. mvl_addtab (MVL_HSHTAB,sig_name, MVL_CHDNAM,MVL_LFTDFN,
  778. $6.LEFT);
  779. mvl_addtab (MVL_HSHTAB,sig_name, MVL_CHDNAM,MVL_RGTDFN,
  780. $6.RIGHT);
  781. MVL_CONCNT += sig_width;
  782. }
  783. }
  784. sig_list = sig_list->NEXT;
  785. }
  786. freechain (MVL_NM1LST);
  787. MVL_NM1LST = NULL;
  788. }
  789. | error
  790. {
  791. /* ###----------------------------------------------### */
  792. /* The following 3 lines reject tokens until the */
  793. /* sync. token ('Semicolon') is found */
  794. /* ###----------------------------------------------### */
  795. do
  796. yychar = yylex ();
  797. while ((yychar != Semicolon) && (yychar != 0));
  798. yyerrok;
  799. mvl_error (6, NULL);
  800. }
  801. ;
  802. architecture_statement_part
  803. : ..concurrent_statement..
  804. ;
  805. ..concurrent_statement..
  806. : /*empty*/
  807. | ..concurrent_statement..
  808. concurrent_statement
  809. ;
  810. concurrent_statement
  811. : component_instantiation_statement
  812. | error
  813. Semicolon_ERR
  814. { mvl_error (18, NULL); }
  815. ;
  816. component_instantiation_statement
  817. : a_label
  818. simple_name
  819. {
  820. long con_count;
  821. long local_err = 0;
  822. MVL_CONRNK = 0;
  823. MVL_CHDNAM = $2;
  824. MVL_LOCNAM = $1;
  825. if (mvl_chktab (MVL_HSHTAB,$1,MVL_MODNAM,MVL_LBLDFN) != 0)
  826. {
  827. mvl_error (13, $1);
  828. local_err = 1;
  829. }
  830. if (mvl_chktab (MVL_HSHTAB,$2,MVL_MODNAM,
  831. MVL_MODDFN) != MVL_CHDDFN)
  832. {
  833. mvl_error (14, $2);
  834. local_err = 1;
  835. }
  836. if (local_err == 0)
  837. {
  838. mvl_addtab (MVL_HSHTAB,$1,MVL_MODNAM,MVL_LBLDFN,1);
  839. con_count = mvl_chktab (MVL_HSHTAB,$2,MVL_MODNAM,MVL_CCNDFN);
  840. MVL_NM1LST = NULL;
  841. while (con_count != 0)
  842. {
  843. MVL_NM1LST = addchain (MVL_NM1LST,NULL);
  844. con_count--;
  845. }
  846. MVL_CHDPNT = MVL_CHDHED;
  847. while (MVL_CHDPNT != NULL)
  848. {
  849. if (MVL_CHDPNT->NAME == $2)
  850. break;
  851. MVL_CHDPNT = MVL_CHDPNT->NEXT;
  852. }
  853. }
  854. else
  855. MVL_CHDPNT = NULL;
  856. }
  857. .generic_map_aspect.
  858. .port_map_aspect.
  859. Semicolon_ERR
  860. {
  861. struct loins *loins_pnt ;
  862. struct locon *locon_pnt ;
  863. struct chain *chain_pnt ;
  864. struct logen *genmod ;
  865. char *prt_name ;
  866. char tampon [256] ;
  867. long i = 0;
  868. if (MVL_CHDPNT != NULL)
  869. {
  870. MVL_NM1LST = reverse (MVL_NM1LST);
  871. chain_pnt = MVL_NM1LST;
  872. locon_pnt = MVL_CHDPNT->LOCON;
  873. while (chain_pnt != NULL)
  874. {
  875. if (chain_pnt->DATA == NULL)
  876. {
  877. MVL_SIGIDX++;
  878. sprintf(tampon,"%s:%s.%s",MVL_CHDNAM,$1,locon_pnt->NAME);
  879. chain_pnt->DATA = mvl_addlosig (MVL_LOFPNT,MVL_SIGIDX,
  880. 'I','0',tampon,-1,-1);
  881. }
  882. chain_pnt = chain_pnt->NEXT;
  883. locon_pnt = locon_pnt->NEXT;
  884. }
  885. if (MVL_ERRFLG == 0) {
  886. loins_pnt = addloins (MVL_LOFPNT, $1 , MVL_CHDPNT,
  887. MVL_NM1LST );
  888. if (MVL_CHDPNT->USER) {
  889. if (!MVL_PTPPNT)
  890. MVL_PTPPNT = addptype(NULL,LOGEN,NULL);
  891. loins_pnt->USER=MVL_PTPPNT;
  892. MVL_PTPPNT->DATA
  893. = chklogen(loins_pnt->USER->DATA,
  894. MVL_CHDPNT->USER->DATA,
  895. MVL_CHDNAM, loins_pnt->INSNAME);
  896. } else {
  897. if (MVL_PTPPNT) {
  898. fprintf(stderr,"No generic for model %s, NULLed !\n",
  899. MVL_CHDPNT->NAME);
  900. loins_pnt->USER=NULL;
  901. }
  902. }
  903. }
  904. }
  905. freechain (MVL_NM1LST);
  906. MVL_NM1LST = NULL;
  907. MVL_SIMFLG = MVL_UKNDFN;
  908. }
  909. ;
  910. /* ###--------------------------------------------------------------------### */
  911. /* # GENERIC MAP # */
  912. /* ###--------------------------------------------------------------------### */
  913. .generic_map_aspect.
  914. : /*empty*/
  915. {
  916. MVL_PTPPNT = NULL;
  917. }
  918. | generic_map_aspect
  919. ;
  920. generic_map_aspect
  921. : GENERIC
  922. MAP
  923. LeftParen
  924. generic_association_list
  925. RightParen_ERR
  926. {
  927. MVL_PTPPNT = addptype(NULL,LOGEN,MVL_GENPNT);
  928. MVL_GENPNT = NULL;
  929. }
  930. ;
  931. generic_association_list
  932. : generic_association_element
  933. ...generic_association_element..
  934. ;
  935. ...generic_association_element..
  936. : /*empty*/
  937. | ...generic_association_element..
  938. Comma
  939. generic_association_element
  940. ;
  941. generic_association_element
  942. : formal_generic_name
  943. Arrow
  944. actual_generic_name
  945. {
  946. MVL_GENPNT = duplogen(&MVL_LOGEN,MVL_GENPNT,$1);
  947. MVL_LOGEN.TYPE=GENTYPE_EMPTY;
  948. }
  949. | actual_generic_name
  950. {
  951. MVL_GENPNT = duplogen(&MVL_LOGEN,MVL_GENPNT,NULL);
  952. MVL_LOGEN.TYPE=GENTYPE_EMPTY;
  953. }
  954. | error
  955. ;
  956. formal_generic_name
  957. : simple_name
  958. ;
  959. actual_generic_name
  960. : generic_expression
  961. ;
  962. generic_expression
  963. : generic_relation
  964. ;
  965. generic_relation
  966. : generic_simple_expression
  967. ;
  968. generic_simple_expression
  969. : .sign.
  970. generic_term
  971. {
  972. if ($1)
  973. if (MVL_LOGEN.TYPE!=GENTYPE_VAL) {
  974. fputs("Don't know how to change Identifier sign\n",
  975. stderr);
  976. } else
  977. MVL_LOGEN.VALUE.VAL = -MVL_LOGEN.VALUE.VAL;
  978. }
  979. ...generic_term..
  980. ;
  981. .sign.
  982. : /*empty*/ { $$ = 0; }
  983. | Plus { $$ = 0; }
  984. | Minus { $$ = 1; }
  985. ;
  986. generic_term
  987. : generic_factor
  988. ;
  989. ...generic_term..
  990. : /*empty*/
  991. /* | ...generic_term..
  992. generic_adding_operator
  993. generic_term */
  994. ;
  995. generic_factor
  996. : generic_primary
  997. ;
  998. generic_primary
  999. : generic_name
  1000. {
  1001. MVL_LOGEN.VALUE.TEXT=namealloc($1);
  1002. MVL_LOGEN.TYPE=GENTYPE_TEXT;
  1003. }
  1004. | generic_literal
  1005. | generic_aggregate
  1006. {
  1007. MVL_LOGEN.VALUE.LIST = (logen_list *)reverse(MVL_GENLST->DATA);
  1008. MVL_LOGEN.TYPE = GENTYPE_LIST;
  1009. MVL_GENLST = delchain(MVL_GENLST, MVL_GENLST);
  1010. }
  1011. ;
  1012. generic_aggregate
  1013. : LeftParen
  1014. {
  1015. MVL_GENLST = addchain(MVL_GENLST, NULL);
  1016. }
  1017. generic_element_association
  1018. ...generic_element_association..
  1019. RightParen_ERR
  1020. ;
  1021. ...generic_element_association..
  1022. : /*empty*/
  1023. | ...generic_element_association..
  1024. Comma
  1025. generic_element_association
  1026. ;
  1027. generic_element_association
  1028. : .generic_choices.
  1029. generic_expression
  1030. {
  1031. MVL_GENLST->DATA = duplogen (&MVL_LOGEN,
  1032. ((logen_list *)MVL_GENLST->DATA), NULL);
  1033. MVL_LOGEN.TYPE = GENTYPE_EMPTY;
  1034. }
  1035. ;
  1036. .generic_choices.
  1037. : /*empty*/
  1038. ;
  1039. /*
  1040. generic_adding_operator
  1041. : Ampersand
  1042. ;
  1043. */
  1044. generic_name
  1045. : simple_name { $$ = $1; }
  1046. ;
  1047. generic_literal
  1048. : abstractlit
  1049. {
  1050. MVL_LOGEN.VALUE.VAL = $1;
  1051. if (base==16)
  1052. MVL_LOGEN.TYPE = GENTYPE_HEX ;
  1053. else
  1054. MVL_LOGEN.TYPE = GENTYPE_VAL ;
  1055. }
  1056. | StringLit
  1057. {
  1058. MVL_LOGEN.VALUE.TEXT = strdup($1);
  1059. MVL_LOGEN.TYPE = GENTYPE_TEXT;
  1060. }
  1061. | CharacterLit
  1062. {
  1063. MVL_LOGEN.VALUE.CHAR = $1[1];
  1064. MVL_LOGEN.TYPE = GENTYPE_BIT;
  1065. }
  1066. ;
  1067. /* ###--------------------------------------------------------------------### */
  1068. /* PORT MAP */
  1069. /* ###--------------------------------------------------------------------### */
  1070. .port_map_aspect.
  1071. : /*empty*/
  1072. | port_map_aspect
  1073. ;
  1074. port_map_aspect
  1075. : PORT
  1076. MAP
  1077. LeftParen
  1078. association_list
  1079. RightParen_ERR
  1080. ;
  1081. association_list
  1082. : association_element
  1083. ...association_element..
  1084. ;
  1085. ...association_element..
  1086. : /*empty*/
  1087. | ...association_element..
  1088. Comma
  1089. association_element
  1090. ;
  1091. association_element
  1092. : formal_port_name
  1093. Arrow
  1094. actual_port_name
  1095. {
  1096. long sig_width;
  1097. long con_pos;
  1098. struct chain *sig_list1;
  1099. struct chain *sig_list2;
  1100. long local_err = 0;
  1101. if (MVL_CHDPNT == NULL)
  1102. local_err = 1;
  1103. sig_list1 = MVL_NM1LST;
  1104. if (MVL_SIMFLG == MVL_IMPDFN)
  1105. sig_list1 = MVL_NM2LST;
  1106. MVL_SIMFLG = MVL_EXPDFN;
  1107. if ($1.LEFT <= $1.RIGHT)
  1108. sig_width = $1.RIGHT - $1.LEFT + 1;
  1109. else
  1110. sig_width = $1.LEFT - $1.RIGHT + 1;
  1111. if (local_err == 0)
  1112. {
  1113. if (sig_width != $3.WIDTH)
  1114. mvl_error (38, NULL);
  1115. else
  1116. {
  1117. if (MVL_ERRFLG == 0)
  1118. {
  1119. con_pos = mvl_chktab (MVL_HSHTAB, $1.NAME, MVL_CHDNAM,
  1120. MVL_RNGDFN);
  1121. while (con_pos != 0)
  1122. {
  1123. sig_list1 = sig_list1->NEXT;
  1124. con_pos--;
  1125. }
  1126. sig_list2 = $3.LIST;
  1127. while (sig_list2 != NULL)
  1128. {
  1129. if (sig_list1->DATA != NULL)
  1130. {
  1131. mvl_error (41, $1.NAME);
  1132. break;
  1133. }
  1134. sig_list1->DATA = sig_list2->DATA;
  1135. sig_list2 = sig_list2->NEXT;
  1136. sig_list1 = sig_list1->NEXT;
  1137. }
  1138. }
  1139. }
  1140. }
  1141. freechain ($3.LIST);
  1142. }
  1143. | actual_port_name
  1144. {
  1145. long sig_width ;
  1146. struct chain *sig_list1 ;
  1147. char *prt_name ;
  1148. long prt_width ;
  1149. long left_bnd ;
  1150. long right_bnd ;
  1151. long local_err = 0;
  1152. long i ;
  1153. if (MVL_CHDPNT == NULL)
  1154. local_err = 1;
  1155. if (MVL_SIMFLG == MVL_UKNDFN)
  1156. {
  1157. MVL_SIMFLG = MVL_IMPDFN;
  1158. MVL_NM2LST = MVL_NM1LST;
  1159. }
  1160. if (MVL_SIMFLG != MVL_IMPDFN)
  1161. {
  1162. mvl_error (15, NULL);
  1163. local_err = 1;
  1164. }
  1165. prt_name = (char *) mvl_chktab (MVL_HSHTAB,MVL_CONRNK,
  1166. MVL_CHDNAM,MVL_PNTDFN);
  1167. if (prt_name == NULL)
  1168. {
  1169. local_err = 1;
  1170. mvl_error (76, MVL_LOCNAM);
  1171. }
  1172. right_bnd = mvl_chktab (MVL_HSHTAB,prt_name,MVL_CHDNAM,
  1173. MVL_LFTDFN);
  1174. left_bnd = mvl_chktab (MVL_HSHTAB,prt_name,MVL_CHDNAM,
  1175. MVL_RGTDFN);
  1176. if (left_bnd <= right_bnd)
  1177. prt_width = right_bnd - left_bnd + 1;
  1178. else
  1179. prt_width = left_bnd - right_bnd + 1;
  1180. if (local_err == 0)
  1181. {
  1182. if (prt_width != $1.WIDTH)
  1183. {
  1184. mvl_error (38, NULL);
  1185. for (i=0 ; i<prt_width ; i++)
  1186. MVL_NM2LST = MVL_NM2LST->NEXT;
  1187. }
  1188. else
  1189. {
  1190. sig_list1 = $1.LIST;
  1191. while (sig_list1 != NULL)
  1192. {
  1193. MVL_NM2LST->DATA = sig_list1->DATA;
  1194. sig_list1 = sig_list1->NEXT;
  1195. MVL_NM2LST = MVL_NM2LST->NEXT;
  1196. }
  1197. }
  1198. MVL_CONRNK += prt_width;
  1199. }
  1200. freechain ($1.LIST);
  1201. }
  1202. | error
  1203. {
  1204. /* ###----------------------------------------------### */
  1205. /* The following 3 lines reject tokens until the */
  1206. /* sync. token ('Comma') is found */
  1207. /* ###----------------------------------------------### */
  1208. do
  1209. yychar = yylex ();
  1210. while ((yychar != Comma) && (yychar != 0));
  1211. yyerrok;
  1212. MVL_CONRNK++;
  1213. mvl_error (31, NULL);
  1214. }
  1215. ;
  1216. formal_port_name
  1217. : name
  1218. {
  1219. if (MVL_CHDPNT != NULL)
  1220. {
  1221. if (mvl_chktab(MVL_HSHTAB,$1.NAME,MVL_CHDNAM,MVL_SIGDFN) != 0)
  1222. {
  1223. $$.LEFT = mvl_chktab (MVL_HSHTAB,$1.NAME,MVL_CHDNAM,
  1224. MVL_LFTDFN);
  1225. $$.RIGHT = mvl_chktab (MVL_HSHTAB,$1.NAME,MVL_CHDNAM,
  1226. MVL_RGTDFN);
  1227. }
  1228. else
  1229. {
  1230. mvl_error (16, $1.NAME);
  1231. $$ = $1;
  1232. }
  1233. }
  1234. else
  1235. $$ = $1;
  1236. }
  1237. ;
  1238. actual_port_name
  1239. : expression
  1240. { $$ = $1; }
  1241. ;
  1242. name
  1243. : simple_name
  1244. {
  1245. $$.NAME = $1;
  1246. $$.LEFT = -1;
  1247. $$.RIGHT = -1;
  1248. }
  1249. | indexed_name
  1250. { $$ = $1; }
  1251. | slice_name
  1252. { $$ = $1; }
  1253. ;
  1254. indexed_name
  1255. : simple_name
  1256. LeftParen
  1257. abstractlit
  1258. RightParen_ERR
  1259. {
  1260. $$.NAME = $1;
  1261. $$.LEFT = $3;
  1262. $$.RIGHT = $3;
  1263. }
  1264. ;
  1265. slice_name
  1266. : simple_name
  1267. constraint
  1268. {
  1269. $$.NAME = $1;
  1270. $$.LEFT = $2.LEFT;
  1271. $$.RIGHT = $2.RIGHT;
  1272. }
  1273. ;
  1274. expression
  1275. : relation
  1276. { $$ = $1; }
  1277. ;
  1278. relation
  1279. : simple_expression
  1280. { $$ = $1; }
  1281. ;
  1282. simple_expression
  1283. : .sign.term..add_op__term..
  1284. { $$ = $1; }
  1285. ;
  1286. .sign.term..add_op__term..
  1287. : term
  1288. { $$ = $1; }
  1289. | .sign.term..add_op__term..
  1290. Ampersand
  1291. term
  1292. {
  1293. struct chain *list1;
  1294. list1 = $1.LIST;
  1295. while (list1->NEXT != NULL)
  1296. list1 = list1->NEXT;
  1297. list1->NEXT = $3.LIST;
  1298. $$.LIST = $1.LIST;
  1299. $$.WIDTH = $1.WIDTH + $3.WIDTH;
  1300. }
  1301. ;
  1302. term
  1303. : factor
  1304. { $$ = $1; }
  1305. ;
  1306. factor
  1307. : primary
  1308. { $$ = $1; }
  1309. ;
  1310. primary
  1311. : aggregate
  1312. { $$ = $1; }
  1313. | type_convertion
  1314. { $$ = $1; }
  1315. | name
  1316. {
  1317. mvl_expr expr;
  1318. struct losig *losig_pnt;
  1319. long i;
  1320. long left;
  1321. long right;
  1322. long left_bnd;
  1323. long right_bnd;
  1324. long sig_width;
  1325. long rev_flg;
  1326. long in_bound;
  1327. long out_bound;
  1328. if (mvl_chktab (MVL_HSHTAB,$1.NAME,MVL_MODNAM,MVL_SIGDFN) != 0)
  1329. {
  1330. left_bnd = mvl_chktab (MVL_HSHTAB,$1.NAME,MVL_MODNAM,
  1331. MVL_LFTDFN);
  1332. right_bnd = mvl_chktab (MVL_HSHTAB,$1.NAME,MVL_MODNAM,
  1333. MVL_RGTDFN);
  1334. if ($1.LEFT == -1)
  1335. {
  1336. left = left_bnd;
  1337. right = right_bnd;
  1338. }
  1339. else
  1340. {
  1341. left = $1.LEFT;
  1342. right = $1.RIGHT;
  1343. }
  1344. if (left_bnd <= right_bnd)
  1345. {
  1346. sig_width = right_bnd - left_bnd + 1;
  1347. if (left <= right)
  1348. {
  1349. expr.WIDTH = right - left + 1;
  1350. rev_flg = 0;
  1351. in_bound = right_bnd - right;
  1352. out_bound = right_bnd - left;
  1353. if ((left < left_bnd) || (right > right_bnd))
  1354. mvl_error (36, $1.NAME);
  1355. }
  1356. else
  1357. {
  1358. expr.WIDTH = left - right + 1;
  1359. rev_flg = 1;
  1360. in_bound = right_bnd - left;
  1361. out_bound = right_bnd - right;
  1362. if ((left > right_bnd) || (right < left_bnd))
  1363. mvl_error (36, $1.NAME);
  1364. }
  1365. }
  1366. else
  1367. {
  1368. sig_width = left_bnd - right_bnd + 1;
  1369. if (left <= right)
  1370. {
  1371. expr.WIDTH = right - left + 1;
  1372. rev_flg = 1;
  1373. in_bound = left - right_bnd;
  1374. out_bound = right - right_bnd;
  1375. if ((left < right_bnd) || (right > left_bnd))
  1376. mvl_error (36, $1.NAME);
  1377. }
  1378. else
  1379. {
  1380. expr.WIDTH = left - right + 1;
  1381. rev_flg = 0;
  1382. in_bound = right - right_bnd;
  1383. out_bound = left - right_bnd;
  1384. if ((left > left_bnd) || (right < right_bnd))
  1385. mvl_error (36, $1.NAME);
  1386. }
  1387. }
  1388. losig_pnt = (struct losig *)
  1389. mvl_chktab (MVL_HSHTAB,$1.NAME,MVL_MODNAM,
  1390. MVL_PNTDFN);
  1391. expr.LIST = NULL;
  1392. for (i=0 ; i<sig_width ; i++)
  1393. {
  1394. if (i >= in_bound)
  1395. expr.LIST = addchain (expr.LIST,losig_pnt);
  1396. if (i >= out_bound)
  1397. break;
  1398. losig_pnt = losig_pnt->NEXT;
  1399. }
  1400. if (rev_flg == 1)
  1401. expr.LIST = reverse (expr.LIST);
  1402. }
  1403. else
  1404. {
  1405. mvl_error (17, $1.NAME);
  1406. expr.WIDTH = 1;
  1407. expr.LIST = addchain (NULL,NULL);
  1408. }
  1409. $$ = expr;
  1410. }
  1411. ;
  1412. aggregate
  1413. : LeftParen
  1414. expression
  1415. RightParen_ERR
  1416. { $$ = $2; }
  1417. ;
  1418. type_convertion
  1419. : CONVERT
  1420. LeftParen
  1421. expression
  1422. RightParen_ERR
  1423. { $$ = $3; }
  1424. ;
  1425. .SIGNAL.
  1426. : /*empty*/
  1427. | SIGNAL
  1428. ;
  1429. .local_port_mode.
  1430. : /*empty*/
  1431. { $$ = MVL_ICNDFN; }
  1432. | _IN
  1433. { $$ = MVL_ICNDFN; }
  1434. | _OUT
  1435. { $$ = MVL_OCNDFN; }
  1436. | _INOUT
  1437. { $$ = MVL_BCNDFN; }
  1438. | _LINKAGE
  1439. {
  1440. mvl_warning (2, NULL);
  1441. $$ = MVL_XCNDFN;
  1442. }
  1443. ;
  1444. .mode.
  1445. : /*empty*/
  1446. { $$ = MVL_ICNDFN; }
  1447. | _IN
  1448. { $$ = MVL_ICNDFN; }
  1449. |

Large files files are truncated, but you can click here to view the full file