LexVHDL.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567
  1. // Scintilla source code edit control
  2. /** @file LexVHDL.cxx
  3. ** Lexer for VHDL
  4. ** Written by Phil Reid,
  5. ** Based on:
  6. ** - The Verilog Lexer by Avi Yegudin
  7. ** - The Fortran Lexer by Chuan-jian Shen
  8. ** - The C++ lexer by Neil Hodgson
  9. **/
  10. // Copyright 1998-2002 by Neil Hodgson <neilh@scintilla.org>
  11. // The License.txt file describes the conditions under which this software may be distributed.
  12. #include <stdlib.h>
  13. #include <string.h>
  14. #include <stdio.h>
  15. #include <stdarg.h>
  16. #include <assert.h>
  17. #include <ctype.h>
  18. #include "ILexer.h"
  19. #include "Scintilla.h"
  20. #include "SciLexer.h"
  21. #include "WordList.h"
  22. #include "LexAccessor.h"
  23. #include "Accessor.h"
  24. #include "StyleContext.h"
  25. #include "CharacterSet.h"
  26. #include "LexerModule.h"
  27. #ifdef SCI_NAMESPACE
  28. using namespace Scintilla;
  29. #endif
  30. static void ColouriseVHDLDoc(
  31. Sci_PositionU startPos,
  32. Sci_Position length,
  33. int initStyle,
  34. WordList *keywordlists[],
  35. Accessor &styler);
  36. /***************************************/
  37. static inline bool IsAWordChar(const int ch) {
  38. return (ch < 0x80) && (isalnum(ch) || ch == '.' || ch == '_' );
  39. }
  40. /***************************************/
  41. static inline bool IsAWordStart(const int ch) {
  42. return (ch < 0x80) && (isalnum(ch) || ch == '_');
  43. }
  44. /***************************************/
  45. static inline bool IsABlank(unsigned int ch) {
  46. return (ch == ' ') || (ch == 0x09) || (ch == 0x0b) ;
  47. }
  48. /***************************************/
  49. static void ColouriseVHDLDoc(
  50. Sci_PositionU startPos,
  51. Sci_Position length,
  52. int initStyle,
  53. WordList *keywordlists[],
  54. Accessor &styler)
  55. {
  56. WordList &Keywords = *keywordlists[0];
  57. WordList &Operators = *keywordlists[1];
  58. WordList &Attributes = *keywordlists[2];
  59. WordList &Functions = *keywordlists[3];
  60. WordList &Packages = *keywordlists[4];
  61. WordList &Types = *keywordlists[5];
  62. WordList &User = *keywordlists[6];
  63. StyleContext sc(startPos, length, initStyle, styler);
  64. bool isExtendedId = false; // true when parsing an extended identifier
  65. for (; sc.More(); sc.Forward())
  66. {
  67. // Determine if the current state should terminate.
  68. if (sc.state == SCE_VHDL_OPERATOR) {
  69. sc.SetState(SCE_VHDL_DEFAULT);
  70. } else if (sc.state == SCE_VHDL_NUMBER) {
  71. if (!IsAWordChar(sc.ch) && (sc.ch != '#')) {
  72. sc.SetState(SCE_VHDL_DEFAULT);
  73. }
  74. } else if (sc.state == SCE_VHDL_IDENTIFIER) {
  75. if (!isExtendedId && (!IsAWordChar(sc.ch) || (sc.ch == '.'))) {
  76. char s[100];
  77. sc.GetCurrentLowered(s, sizeof(s));
  78. if (Keywords.InList(s)) {
  79. sc.ChangeState(SCE_VHDL_KEYWORD);
  80. } else if (Operators.InList(s)) {
  81. sc.ChangeState(SCE_VHDL_STDOPERATOR);
  82. } else if (Attributes.InList(s)) {
  83. sc.ChangeState(SCE_VHDL_ATTRIBUTE);
  84. } else if (Functions.InList(s)) {
  85. sc.ChangeState(SCE_VHDL_STDFUNCTION);
  86. } else if (Packages.InList(s)) {
  87. sc.ChangeState(SCE_VHDL_STDPACKAGE);
  88. } else if (Types.InList(s)) {
  89. sc.ChangeState(SCE_VHDL_STDTYPE);
  90. } else if (User.InList(s)) {
  91. sc.ChangeState(SCE_VHDL_USERWORD);
  92. }
  93. sc.SetState(SCE_VHDL_DEFAULT);
  94. } else if (isExtendedId && ((sc.ch == '\\') || sc.atLineEnd)) {
  95. // extended identifiers are terminated by backslash, check for end of line in case we have invalid syntax
  96. isExtendedId = false;
  97. sc.ForwardSetState(SCE_VHDL_DEFAULT);
  98. }
  99. } else if (sc.state == SCE_VHDL_COMMENT || sc.state == SCE_VHDL_COMMENTLINEBANG) {
  100. if (sc.atLineEnd) {
  101. sc.SetState(SCE_VHDL_DEFAULT);
  102. }
  103. } else if (sc.state == SCE_VHDL_STRING) {
  104. if (sc.ch == '\\') {
  105. if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') {
  106. sc.Forward();
  107. }
  108. } else if (sc.ch == '\"') {
  109. sc.ForwardSetState(SCE_VHDL_DEFAULT);
  110. } else if (sc.atLineEnd) {
  111. sc.ChangeState(SCE_VHDL_STRINGEOL);
  112. sc.ForwardSetState(SCE_VHDL_DEFAULT);
  113. }
  114. } else if (sc.state == SCE_VHDL_BLOCK_COMMENT){
  115. if(sc.ch == '*' && sc.chNext == '/'){
  116. sc.Forward();
  117. sc.ForwardSetState(SCE_VHDL_DEFAULT);
  118. }
  119. }
  120. // Determine if a new state should be entered.
  121. if (sc.state == SCE_VHDL_DEFAULT) {
  122. if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) {
  123. sc.SetState(SCE_VHDL_NUMBER);
  124. } else if (IsAWordStart(sc.ch)) {
  125. sc.SetState(SCE_VHDL_IDENTIFIER);
  126. } else if (sc.Match('-', '-')) {
  127. if (sc.Match("--!")) // Nice to have a different comment style
  128. sc.SetState(SCE_VHDL_COMMENTLINEBANG);
  129. else
  130. sc.SetState(SCE_VHDL_COMMENT);
  131. } else if (sc.Match('/', '*')){
  132. sc.SetState(SCE_VHDL_BLOCK_COMMENT);
  133. } else if (sc.ch == '\"') {
  134. sc.SetState(SCE_VHDL_STRING);
  135. } else if (sc.ch == '\\') {
  136. isExtendedId = true;
  137. sc.SetState(SCE_VHDL_IDENTIFIER);
  138. } else if (isoperator(static_cast<char>(sc.ch))) {
  139. sc.SetState(SCE_VHDL_OPERATOR);
  140. }
  141. }
  142. }
  143. sc.Complete();
  144. }
  145. //=============================================================================
  146. static bool IsCommentLine(Sci_Position line, Accessor &styler) {
  147. Sci_Position pos = styler.LineStart(line);
  148. Sci_Position eol_pos = styler.LineStart(line + 1) - 1;
  149. for (Sci_Position i = pos; i < eol_pos; i++) {
  150. char ch = styler[i];
  151. char chNext = styler[i+1];
  152. if ((ch == '-') && (chNext == '-'))
  153. return true;
  154. else if (ch != ' ' && ch != '\t')
  155. return false;
  156. }
  157. return false;
  158. }
  159. static bool IsCommentBlockStart(Sci_Position line, Accessor &styler)
  160. {
  161. Sci_Position pos = styler.LineStart(line);
  162. Sci_Position eol_pos = styler.LineStart(line + 1) - 1;
  163. for (Sci_Position i = pos; i < eol_pos; i++) {
  164. char ch = styler[i];
  165. char chNext = styler[i+1];
  166. char style = styler.StyleAt(i);
  167. if ((style == SCE_VHDL_BLOCK_COMMENT) && (ch == '/') && (chNext == '*'))
  168. return true;
  169. }
  170. return false;
  171. }
  172. static bool IsCommentBlockEnd(Sci_Position line, Accessor &styler)
  173. {
  174. Sci_Position pos = styler.LineStart(line);
  175. Sci_Position eol_pos = styler.LineStart(line + 1) - 1;
  176. for (Sci_Position i = pos; i < eol_pos; i++) {
  177. char ch = styler[i];
  178. char chNext = styler[i+1];
  179. char style = styler.StyleAt(i);
  180. if ((style == SCE_VHDL_BLOCK_COMMENT) && (ch == '*') && (chNext == '/'))
  181. return true;
  182. }
  183. return false;
  184. }
  185. static bool IsCommentStyle(char style)
  186. {
  187. return style == SCE_VHDL_BLOCK_COMMENT || style == SCE_VHDL_COMMENT || style == SCE_VHDL_COMMENTLINEBANG;
  188. }
  189. //=============================================================================
  190. // Folding the code
  191. static void FoldNoBoxVHDLDoc(
  192. Sci_PositionU startPos,
  193. Sci_Position length,
  194. int,
  195. Accessor &styler)
  196. {
  197. // Decided it would be smarter to have the lexer have all keywords included. Therefore I
  198. // don't check if the style for the keywords that I use to adjust the levels.
  199. char words[] =
  200. "architecture begin block case component else elsif end entity generate loop package process record then "
  201. "procedure protected function when units";
  202. WordList keywords;
  203. keywords.Set(words);
  204. bool foldComment = styler.GetPropertyInt("fold.comment", 1) != 0;
  205. bool foldCompact = styler.GetPropertyInt("fold.compact", 1) != 0;
  206. bool foldAtElse = styler.GetPropertyInt("fold.at.else", 1) != 0;
  207. bool foldAtBegin = styler.GetPropertyInt("fold.at.Begin", 1) != 0;
  208. bool foldAtParenthese = styler.GetPropertyInt("fold.at.Parenthese", 1) != 0;
  209. //bool foldAtWhen = styler.GetPropertyInt("fold.at.When", 1) != 0; //< fold at when in case statements
  210. int visibleChars = 0;
  211. Sci_PositionU endPos = startPos + length;
  212. Sci_Position lineCurrent = styler.GetLine(startPos);
  213. int levelCurrent = SC_FOLDLEVELBASE;
  214. if(lineCurrent > 0)
  215. levelCurrent = styler.LevelAt(lineCurrent-1) >> 16;
  216. //int levelMinCurrent = levelCurrent;
  217. int levelMinCurrentElse = levelCurrent; //< Used for folding at 'else'
  218. int levelMinCurrentBegin = levelCurrent; //< Used for folding at 'begin'
  219. int levelNext = levelCurrent;
  220. /***************************************/
  221. Sci_Position lastStart = 0;
  222. char prevWord[32] = "";
  223. /***************************************/
  224. // Find prev word
  225. // The logic for going up or down a level depends on a the previous keyword
  226. // This code could be cleaned up.
  227. Sci_Position end = 0;
  228. Sci_PositionU j;
  229. for(j = startPos; j>0; j--)
  230. {
  231. char ch = styler.SafeGetCharAt(j);
  232. char chPrev = styler.SafeGetCharAt(j-1);
  233. int style = styler.StyleAt(j);
  234. int stylePrev = styler.StyleAt(j-1);
  235. if ((!IsCommentStyle(style)) && (stylePrev != SCE_VHDL_STRING))
  236. {
  237. if(IsAWordChar(chPrev) && !IsAWordChar(ch))
  238. {
  239. end = j-1;
  240. }
  241. }
  242. if ((!IsCommentStyle(style)) && (style != SCE_VHDL_STRING))
  243. {
  244. if(!IsAWordChar(chPrev) && IsAWordStart(ch) && (end != 0))
  245. {
  246. char s[32];
  247. Sci_PositionU k;
  248. for(k=0; (k<31 ) && (k<end-j+1 ); k++) {
  249. s[k] = static_cast<char>(tolower(styler[j+k]));
  250. }
  251. s[k] = '\0';
  252. if(keywords.InList(s)) {
  253. strcpy(prevWord, s);
  254. break;
  255. }
  256. }
  257. }
  258. }
  259. for(j=j+static_cast<Sci_PositionU>(strlen(prevWord)); j<endPos; j++)
  260. {
  261. char ch = styler.SafeGetCharAt(j);
  262. int style = styler.StyleAt(j);
  263. if ((!IsCommentStyle(style)) && (style != SCE_VHDL_STRING))
  264. {
  265. if((ch == ';') && (strcmp(prevWord, "end") == 0))
  266. {
  267. strcpy(prevWord, ";");
  268. }
  269. }
  270. }
  271. char chNext = styler[startPos];
  272. char chPrev = '\0';
  273. char chNextNonBlank;
  274. int styleNext = styler.StyleAt(startPos);
  275. //Platform::DebugPrintf("Line[%04d] Prev[%20s] ************************* Level[%x]\n", lineCurrent+1, prevWord, levelCurrent);
  276. /***************************************/
  277. for (Sci_PositionU i = startPos; i < endPos; i++)
  278. {
  279. char ch = chNext;
  280. chNext = styler.SafeGetCharAt(i + 1);
  281. chPrev = styler.SafeGetCharAt(i - 1);
  282. chNextNonBlank = chNext;
  283. Sci_PositionU j = i+1;
  284. while(IsABlank(chNextNonBlank) && j<endPos)
  285. {
  286. j ++ ;
  287. chNextNonBlank = styler.SafeGetCharAt(j);
  288. }
  289. int style = styleNext;
  290. styleNext = styler.StyleAt(i + 1);
  291. bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n');
  292. if (foldComment && atEOL)
  293. {
  294. if(IsCommentLine(lineCurrent, styler))
  295. {
  296. if(!IsCommentLine(lineCurrent-1, styler) && IsCommentLine(lineCurrent+1, styler))
  297. {
  298. levelNext++;
  299. }
  300. else if(IsCommentLine(lineCurrent-1, styler) && !IsCommentLine(lineCurrent+1, styler))
  301. {
  302. levelNext--;
  303. }
  304. }
  305. else
  306. {
  307. if (IsCommentBlockStart(lineCurrent, styler) && !IsCommentBlockEnd(lineCurrent, styler))
  308. {
  309. levelNext++;
  310. }
  311. else if (IsCommentBlockEnd(lineCurrent, styler) && !IsCommentBlockStart(lineCurrent, styler))
  312. {
  313. levelNext--;
  314. }
  315. }
  316. }
  317. if ((style == SCE_VHDL_OPERATOR) && foldAtParenthese)
  318. {
  319. if(ch == '(') {
  320. levelNext++;
  321. } else if (ch == ')') {
  322. levelNext--;
  323. }
  324. }
  325. if ((!IsCommentStyle(style)) && (style != SCE_VHDL_STRING))
  326. {
  327. if((ch == ';') && (strcmp(prevWord, "end") == 0))
  328. {
  329. strcpy(prevWord, ";");
  330. }
  331. if(!IsAWordChar(chPrev) && IsAWordStart(ch))
  332. {
  333. lastStart = i;
  334. }
  335. if(IsAWordChar(ch) && !IsAWordChar(chNext)) {
  336. char s[32];
  337. Sci_PositionU k;
  338. for(k=0; (k<31 ) && (k<i-lastStart+1 ); k++) {
  339. s[k] = static_cast<char>(tolower(styler[lastStart+k]));
  340. }
  341. s[k] = '\0';
  342. if(keywords.InList(s))
  343. {
  344. if (
  345. strcmp(s, "architecture") == 0 ||
  346. strcmp(s, "case") == 0 ||
  347. strcmp(s, "generate") == 0 ||
  348. strcmp(s, "block") == 0 ||
  349. strcmp(s, "loop") == 0 ||
  350. strcmp(s, "package") ==0 ||
  351. strcmp(s, "process") == 0 ||
  352. strcmp(s, "protected") == 0 ||
  353. strcmp(s, "record") == 0 ||
  354. strcmp(s, "then") == 0 ||
  355. strcmp(s, "units") == 0)
  356. {
  357. if (strcmp(prevWord, "end") != 0)
  358. {
  359. if (levelMinCurrentElse > levelNext) {
  360. levelMinCurrentElse = levelNext;
  361. }
  362. levelNext++;
  363. }
  364. } else if (
  365. strcmp(s, "component") == 0 ||
  366. strcmp(s, "entity") == 0 ||
  367. strcmp(s, "configuration") == 0 )
  368. {
  369. if (strcmp(prevWord, "end") != 0 && lastStart)
  370. { // check for instantiated unit by backward searching for the colon.
  371. Sci_PositionU pos = lastStart;
  372. char chAtPos, styleAtPos;
  373. do{// skip white spaces
  374. pos--;
  375. styleAtPos = styler.StyleAt(pos);
  376. chAtPos = styler.SafeGetCharAt(pos);
  377. }while(pos>0 &&
  378. (chAtPos == ' ' || chAtPos == '\t' ||
  379. chAtPos == '\n' || chAtPos == '\r' ||
  380. IsCommentStyle(styleAtPos)));
  381. // check for a colon (':') before the instantiated units "entity", "component" or "configuration". Don't fold thereafter.
  382. if (chAtPos != ':')
  383. {
  384. if (levelMinCurrentElse > levelNext) {
  385. levelMinCurrentElse = levelNext;
  386. }
  387. levelNext++;
  388. }
  389. }
  390. } else if (
  391. strcmp(s, "procedure") == 0 ||
  392. strcmp(s, "function") == 0)
  393. {
  394. if (strcmp(prevWord, "end") != 0) // check for "end procedure" etc.
  395. { // This code checks to see if the procedure / function is a definition within a "package"
  396. // rather than the actual code in the body.
  397. int BracketLevel = 0;
  398. for(Sci_Position pos=i+1; pos<styler.Length(); pos++)
  399. {
  400. int styleAtPos = styler.StyleAt(pos);
  401. char chAtPos = styler.SafeGetCharAt(pos);
  402. if(chAtPos == '(') BracketLevel++;
  403. if(chAtPos == ')') BracketLevel--;
  404. if(
  405. (BracketLevel == 0) &&
  406. (!IsCommentStyle(styleAtPos)) &&
  407. (styleAtPos != SCE_VHDL_STRING) &&
  408. !iswordchar(styler.SafeGetCharAt(pos-1)) &&
  409. (chAtPos|' ')=='i' && (styler.SafeGetCharAt(pos+1)|' ')=='s' &&
  410. !iswordchar(styler.SafeGetCharAt(pos+2)))
  411. {
  412. if (levelMinCurrentElse > levelNext) {
  413. levelMinCurrentElse = levelNext;
  414. }
  415. levelNext++;
  416. break;
  417. }
  418. if((BracketLevel == 0) && (chAtPos == ';'))
  419. {
  420. break;
  421. }
  422. }
  423. }
  424. } else if (strcmp(s, "end") == 0) {
  425. levelNext--;
  426. } else if(strcmp(s, "elsif") == 0) { // elsif is followed by then so folding occurs correctly
  427. levelNext--;
  428. } else if (strcmp(s, "else") == 0) {
  429. if(strcmp(prevWord, "when") != 0) // ignore a <= x when y else z;
  430. {
  431. levelMinCurrentElse = levelNext - 1; // VHDL else is all on its own so just dec. the min level
  432. }
  433. } else if(
  434. ((strcmp(s, "begin") == 0) && (strcmp(prevWord, "architecture") == 0)) ||
  435. ((strcmp(s, "begin") == 0) && (strcmp(prevWord, "function") == 0)) ||
  436. ((strcmp(s, "begin") == 0) && (strcmp(prevWord, "procedure") == 0)))
  437. {
  438. levelMinCurrentBegin = levelNext - 1;
  439. }
  440. //Platform::DebugPrintf("Line[%04d] Prev[%20s] Cur[%20s] Level[%x]\n", lineCurrent+1, prevWord, s, levelCurrent);
  441. strcpy(prevWord, s);
  442. }
  443. }
  444. }
  445. if (atEOL) {
  446. int levelUse = levelCurrent;
  447. if (foldAtElse && (levelMinCurrentElse < levelUse)) {
  448. levelUse = levelMinCurrentElse;
  449. }
  450. if (foldAtBegin && (levelMinCurrentBegin < levelUse)) {
  451. levelUse = levelMinCurrentBegin;
  452. }
  453. int lev = levelUse | levelNext << 16;
  454. if (visibleChars == 0 && foldCompact)
  455. lev |= SC_FOLDLEVELWHITEFLAG;
  456. if (levelUse < levelNext)
  457. lev |= SC_FOLDLEVELHEADERFLAG;
  458. if (lev != styler.LevelAt(lineCurrent)) {
  459. styler.SetLevel(lineCurrent, lev);
  460. }
  461. //Platform::DebugPrintf("Line[%04d] ---------------------------------------------------- Level[%x]\n", lineCurrent+1, levelCurrent);
  462. lineCurrent++;
  463. levelCurrent = levelNext;
  464. //levelMinCurrent = levelCurrent;
  465. levelMinCurrentElse = levelCurrent;
  466. levelMinCurrentBegin = levelCurrent;
  467. visibleChars = 0;
  468. }
  469. /***************************************/
  470. if (!isspacechar(ch)) visibleChars++;
  471. }
  472. /***************************************/
  473. // Platform::DebugPrintf("Line[%04d] ---------------------------------------------------- Level[%x]\n", lineCurrent+1, levelCurrent);
  474. }
  475. //=============================================================================
  476. static void FoldVHDLDoc(Sci_PositionU startPos, Sci_Position length, int initStyle, WordList *[],
  477. Accessor &styler) {
  478. FoldNoBoxVHDLDoc(startPos, length, initStyle, styler);
  479. }
  480. //=============================================================================
  481. static const char * const VHDLWordLists[] = {
  482. "Keywords",
  483. "Operators",
  484. "Attributes",
  485. "Standard Functions",
  486. "Standard Packages",
  487. "Standard Types",
  488. "User Words",
  489. 0,
  490. };
  491. LexerModule lmVHDL(SCLEX_VHDL, ColouriseVHDLDoc, "vhdl", FoldVHDLDoc, VHDLWordLists);
  492. // Keyword:
  493. // access after alias all architecture array assert attribute begin block body buffer bus case component
  494. // configuration constant disconnect downto else elsif end entity exit file for function generate generic
  495. // group guarded if impure in inertial inout is label library linkage literal loop map new next null of
  496. // on open others out package port postponed procedure process pure range record register reject report
  497. // return select severity shared signal subtype then to transport type unaffected units until use variable
  498. // wait when while with
  499. //
  500. // Operators:
  501. // abs and mod nand nor not or rem rol ror sla sll sra srl xnor xor
  502. //
  503. // Attributes:
  504. // left right low high ascending image value pos val succ pred leftof rightof base range reverse_range
  505. // length delayed stable quiet transaction event active last_event last_active last_value driving
  506. // driving_value simple_name path_name instance_name
  507. //
  508. // Std Functions:
  509. // now readline read writeline write endfile resolved to_bit to_bitvector to_stdulogic to_stdlogicvector
  510. // to_stdulogicvector to_x01 to_x01z to_UX01 rising_edge falling_edge is_x shift_left shift_right rotate_left
  511. // rotate_right resize to_integer to_unsigned to_signed std_match to_01
  512. //
  513. // Std Packages:
  514. // std ieee work standard textio std_logic_1164 std_logic_arith std_logic_misc std_logic_signed
  515. // std_logic_textio std_logic_unsigned numeric_bit numeric_std math_complex math_real vital_primitives
  516. // vital_timing
  517. //
  518. // Std Types:
  519. // boolean bit character severity_level integer real time delay_length natural positive string bit_vector
  520. // file_open_kind file_open_status line text side width std_ulogic std_ulogic_vector std_logic
  521. // std_logic_vector X01 X01Z UX01 UX01Z unsigned signed
  522. //