PageRenderTime 55ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

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

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