Skip to content

Commit

Permalink
Parse more Verilog datatypes
Browse files Browse the repository at this point in the history
  • Loading branch information
nickg committed Dec 19, 2024
1 parent 017f950 commit 1bd7243
Show file tree
Hide file tree
Showing 11 changed files with 142 additions and 23 deletions.
14 changes: 14 additions & 0 deletions src/lexer.l
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ static int parse_ex_id(char *str);
static int parse_bit_string(const char *str);
static int parse_string(const char *str);
static int parse_decimal_literal(const char *str);
static int parse_verilog_real(const char *str);
static int parse_based_literal(const char *str);
static int resolve_ir1045(void);
static void warn_lrm(vhdl_standard_t std, const char *fmt, ...);
Expand Down Expand Up @@ -129,6 +130,7 @@ PSL_COMMENT {PRAGMA}(?i:psl)[ \t]+
PSL_CONT ^{SPACE}*({PSL_COMMENT}|"--")
UTF8_MB [\x80-\xff][\x80-\xbf]{1,3}
VLOG_NUMBER {INTEGER}?\'[bhd]{HEX}
VLOG_REAL {INTEGER}\.{INTEGER}
UDP_LEVEL [01xX?bB]
UDP_EDGE [rRfFpPnN*]
UDP_INDICATOR "("{UDP_LEVEL}{UDP_LEVEL}")"
Expand Down Expand Up @@ -674,6 +676,9 @@ BEFORE ?i:before
<VLOG>"longint" { return tLONGINT; }
<VLOG>"int" { return tSVINT; }
<VLOG>"integer" { return tINTEGER; }
<VLOG>"real" { return tSVREAL; }
<VLOG>"shortreal" { return tSHORTREAL; }
<VLOG>"realtime" { return tREALTIME; }
<VLOG>"time" { return tTIME; }
<VLOG>"typedef" { return tTYPEDEF; }
<VLOG>"bit" { return tBIT; }
Expand All @@ -696,6 +701,7 @@ BEFORE ?i:before
<VLOG>{INTEGER} { yylval.str = xstrdup(yytext); return tUNSIGNED; }
<VLOG>{VLOG_STRING} { return escape_verilog_string(yytext); }
<VLOG>{VLOG_NUMBER} { yylval.str = xstrdup(yytext); return tNUMBER; }
<VLOG>{VLOG_REAL} { return parse_verilog_real(yytext); };

<INITIAL,PSL>{DECIMAL} { return parse_decimal_literal(yytext); }
<INITIAL,PSL>{BASED} { return parse_based_literal(yytext); }
Expand Down Expand Up @@ -1064,6 +1070,14 @@ static int parse_bit_string(const char *str)
TOKEN(tBITSTRING);
}

static int parse_verilog_real(const char *str)
{
// unsigned_number [ . unsigned_number ] exp [ sign ] unsigned_number

yylval.real = strtod(str, NULL);
return tREAL;
}

static int report_unterminated_string(const char *str)
{
diag_t *d = diag_new(DIAG_ERROR, &yylloc);
Expand Down
3 changes: 2 additions & 1 deletion src/scan.c
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,8 @@ const char *token_str(token_t tok)
"enum", "tagged", "abort", "sync_abort", "async_abort", "before",
"before!", "before_", "before!_", "|->", "|=>", "next", "inf",
"repeat", "do", "endpoint", "<<", ">>", "<<<", ">>>", "task",
"endtask", "endfunction", "`begin_keywords", "`end_keywords"
"endtask", "endfunction", "`begin_keywords", "`end_keywords", "real",
"shortreal", "realtime",
};

if (tok >= 200 && tok - 200 < ARRAY_LEN(token_strs))
Expand Down
3 changes: 3 additions & 0 deletions src/scan.h
Original file line number Diff line number Diff line change
Expand Up @@ -416,5 +416,8 @@ bool is_scanned_as_psl(void);
#define tENDFUNCTION 516
#define tBEGINKEYWORDS 517
#define tENDKEYWORDS 518
#define tSVREAL 519
#define tSHORTREAL 520
#define tREALTIME 521

#endif // _SCAN_H
31 changes: 31 additions & 0 deletions src/vlog/vlog-dump.c
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,12 @@ static void vlog_dump_var_decl(vlog_node_t v, int indent)
vlog_dump(vlog_type(v), indent);
print_syntax(" %s", istr(vlog_ident(v)));
vlog_dump_dimensions(v, indent);

if (vlog_has_value(v)) {
print_syntax(" = ");
vlog_dump(vlog_value(v), indent);
}

print_syntax(";\n");
}

Expand Down Expand Up @@ -347,6 +353,11 @@ static void vlog_dump_number(vlog_node_t v)
print_syntax("%s", tb_get(tb));
}

static void vlog_dump_real(vlog_node_t v)
{
print_syntax("%g", vlog_dval(v));
}

static void vlog_dump_binary(vlog_node_t v)
{
vlog_dump_paren(vlog_left(v), 0);
Expand Down Expand Up @@ -458,6 +469,11 @@ static void vlog_dump_data_type(vlog_node_t v, int indent)
{
switch (vlog_subkind(v)) {
case DT_LOGIC: print_syntax("#logic"); break;
case DT_REAL: print_syntax("#real"); break;
case DT_REALTIME: print_syntax("#realtime"); break;
case DT_SHORTREAL: print_syntax("#shortreal"); break;
case DT_INTEGER: print_syntax("#integer"); break;
default: should_not_reach_here();
}

vlog_dump_dimensions(v, indent);
Expand Down Expand Up @@ -496,6 +512,15 @@ static void vlog_dump_repeat(vlog_node_t v, int indent)
vlog_dump_stmt_or_null(v, indent);
}

static void vlog_dump_cond_expr(vlog_node_t v, int indent)
{
vlog_dump(vlog_value(v), 0);
print_syntax(" ? ");
vlog_dump(vlog_left(v), 0);
print_syntax(" : ");
vlog_dump(vlog_right(v), 0);
}

void vlog_dump(vlog_node_t v, int indent)
{
switch (vlog_kind(v)) {
Expand Down Expand Up @@ -556,6 +581,9 @@ void vlog_dump(vlog_node_t v, int indent)
case V_NUMBER:
vlog_dump_number(v);
break;
case V_REAL:
vlog_dump_real(v);
break;
case V_IF:
vlog_dump_if(v, indent);
break;
Expand Down Expand Up @@ -600,6 +628,9 @@ void vlog_dump(vlog_node_t v, int indent)
case V_REPEAT:
vlog_dump_repeat(v, indent);
break;
case V_COND_EXPR:
vlog_dump_cond_expr(v, indent);
break;
default:
print_syntax("\n");
fflush(stdout);
Expand Down
14 changes: 14 additions & 0 deletions src/vlog/vlog-node.c
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,9 @@ static const imask_t has_map[V_LAST_NODE_KIND] = {

// V_COND_EXPR
(I_VALUE | I_LEFT | I_RIGHT),

// V_REAL
(I_DVAL),
};

static const char *kind_text_map[V_LAST_NODE_KIND] = {
Expand All @@ -183,6 +186,7 @@ static const char *kind_text_map[V_LAST_NODE_KIND] = {
"V_UNION_DECL", "V_STRUCT_DECL", "V_EVENT_CONTROL", "V_EMPTY",
"V_REPEAT", "V_WHILE", "V_DO_WHILE", "V_TASK_DECL",
"V_FUNC_DECL", "V_WAIT", "V_PARAM_DECL", "V_COND_EXPR",
"V_REAL",
};

static const change_allowed_t change_allowed[] = {
Expand Down Expand Up @@ -533,6 +537,16 @@ void vlog_set_right(vlog_node_t v, vlog_node_t e)
object_write_barrier(&(v->object), &(e->object));
}

double vlog_dval(vlog_node_t v)
{
return lookup_item(&vlog_object, v, I_DVAL)->dval;
}

void vlog_set_dval(vlog_node_t v, double d)
{
lookup_item(&vlog_object, v, I_DVAL)->dval = d;
}

void vlog_visit(vlog_node_t v, vlog_visit_fn_t fn, void *context)
{
vlog_visit_only(v, fn, context, V_LAST_NODE_KIND);
Expand Down
6 changes: 6 additions & 0 deletions src/vlog/vlog-node.h
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ typedef enum {
V_WAIT,
V_PARAM_DECL,
V_COND_EXPR,
V_REAL,

V_LAST_NODE_KIND
} vlog_kind_t;
Expand All @@ -107,6 +108,8 @@ typedef enum {
DT_LONGINT,
DT_TIME,
DT_BIT,
DT_SHORTREAL,
DT_REALTIME,
} data_type_t;

typedef enum {
Expand Down Expand Up @@ -259,6 +262,9 @@ void vlog_set_number(vlog_node_t v, number_t n);
data_type_t vlog_datatype(vlog_node_t v);
void vlog_set_datatype(vlog_node_t v, data_type_t dt);

double vlog_dval(vlog_node_t v);
void vlog_set_dval(vlog_node_t v, double d);

typedef void (*vlog_visit_fn_t)(vlog_node_t v, void *context);

void vlog_visit(vlog_node_t v, vlog_visit_fn_t fn, void *context);
Expand Down
Loading

0 comments on commit 1bd7243

Please sign in to comment.