From b4967b3297d8583298cd72b8d40cb747b48d0e31 Mon Sep 17 00:00:00 2001 From: Daniel Hajjar Date: Tue, 30 Dec 2025 16:37:23 +0100 Subject: [PATCH] Add support for length attribute --- src/vhd2vl.l | 1 + src/vhd2vl.y | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/vhd2vl.l b/src/vhd2vl.l index aaac366..55d2703 100644 --- a/src/vhd2vl.l +++ b/src/vhd2vl.l @@ -88,6 +88,7 @@ int scan_int(char *s); "in" { return IN; } "inout" { return INOUT; } "is" { return IS; } +"length" { return LENGTH; } "library ".*\n { lineno++; } "loop" { return LOOP; } "map" { return MAP; } diff --git a/src/vhd2vl.y b/src/vhd2vl.y index 159c9b1..b32256e 100644 --- a/src/vhd2vl.y +++ b/src/vhd2vl.y @@ -889,7 +889,7 @@ slist *emit_io_list(slist *sl) %token FOR LOOP GENERATE %token AFTER AND OR NAND NOR XOR XNOR MOD RW_REM POW %token LASTVALUE EVENT POSEDGE NEGEDGE -%token STRING NAME RANGE NULLV OPEN +%token STRING NAME RANGE LENGTH NULLV OPEN %token CONVFUNC_1 CONVFUNC_2 BASED FLOAT LEFT %token SCIENTIFIC REAL %token ASSERT REPORT SEVERITY WARNING ERROR FAILURE NOTE @@ -2465,6 +2465,22 @@ expr : signal { /* two argument type conversion e.g. to_unsigned(x, 3) */ $$ = addnest($3); } + | NAME '\'' LENGTH { + /* lookup NAME and copy its length */ + sglist *sg = NULL; + if ((sg=lookup(io_list,$1))==NULL) { + sg=lookup(sig_list,$1); + } + if(sg) { + expdata *e=xmalloc(sizeof(expdata)); + e->op='t'; /* Terminal symbol */ + e->sl=addval(NULL,sg->range->sizeval); + $$ = e; + } else { + fprintf(stderr,"ERROR (line %d): undefined length \"%s'length\".\n", lineno, $1); + YYABORT; + } + } | '(' expr ')' { $$ = addnest($2); }