diff --git a/ivtest/gold/sdf_header-iverilog-stderr.gold b/ivtest/gold/sdf_header-iverilog-stderr.gold new file mode 100644 index 000000000..e69de29bb diff --git a/ivtest/gold/sdf_header-iverilog-stdout.gold b/ivtest/gold/sdf_header-iverilog-stdout.gold new file mode 100644 index 000000000..e69de29bb diff --git a/ivtest/gold/sdf_header-vvp-stderr.gold b/ivtest/gold/sdf_header-vvp-stderr.gold new file mode 100644 index 000000000..e69de29bb diff --git a/ivtest/gold/sdf_header-vvp-stdout.gold b/ivtest/gold/sdf_header-vvp-stdout.gold new file mode 100644 index 000000000..0b6de0b8e --- /dev/null +++ b/ivtest/gold/sdf_header-vvp-stdout.gold @@ -0,0 +1,11 @@ +ivltests/sdf_header.sdf:2:SDF INFO: Version: 3.0 +ivltests/sdf_header.sdf:3:SDF INFO: Design: test +ivltests/sdf_header.sdf:4:SDF INFO: Date: Wed Mar 8 12:34:56 2023 +ivltests/sdf_header.sdf:5:SDF INFO: Vendor: No Vendor +ivltests/sdf_header.sdf:6:SDF INFO: Program: Human +ivltests/sdf_header.sdf:7:SDF INFO: Program Version: 1.0.0 +ivltests/sdf_header.sdf:8:SDF INFO: Divider: "/" +ivltests/sdf_header.sdf:9:SDF INFO: Voltage: 5.000000 +ivltests/sdf_header.sdf:10:SDF INFO: Process: best=0.65:nom=1.0:worst=1.8 +ivltests/sdf_header.sdf:11:SDF INFO: Temperature: 25.000000 +ivltests/sdf_header.sdf:12:SDF INFO: Timescale: 1ps diff --git a/ivtest/ivltests/sdf_header.sdf b/ivtest/ivltests/sdf_header.sdf new file mode 100644 index 000000000..bbde907af --- /dev/null +++ b/ivtest/ivltests/sdf_header.sdf @@ -0,0 +1,19 @@ +(DELAYFILE + (SDFVERSION "3.0") + (DESIGN "test") + (DATE "Wed Mar 8 12:34:56 2023") + (VENDOR "No Vendor") + (PROGRAM "Human") + (VERSION "1.0.0") + (DIVIDER /) + (VOLTAGE 5.5:5.0:4.5) + (PROCESS "best=0.65:nom=1.0:worst=1.8") + (TEMPERATURE -25.0:25.0:85.0) + (TIMESCALE 1 ps) + + // Do nothing + (CELL + (CELLTYPE "top") + (INSTANCE ) + ) +) diff --git a/ivtest/ivltests/sdf_header.v b/ivtest/ivltests/sdf_header.v new file mode 100644 index 000000000..84e4745f4 --- /dev/null +++ b/ivtest/ivltests/sdf_header.v @@ -0,0 +1,10 @@ +`timescale 1ns/1ps + +module top; + + initial begin + $sdf_annotate("ivltests/sdf_header.sdf", top); + end + +endmodule + diff --git a/ivtest/regress-vvp.list b/ivtest/regress-vvp.list index b1cc5750d..2dd09bb7a 100644 --- a/ivtest/regress-vvp.list +++ b/ivtest/regress-vvp.list @@ -35,3 +35,4 @@ struct_packed_write_read vvp_tests/struct_packed_write_read.json struct_packed_write_read2 vvp_tests/struct_packed_write_read2.json sv_foreach9 vvp_tests/sv_foreach9.json sv_foreach10 vvp_tests/sv_foreach10.json +sdf_header vvp_tests/sdf_header.json diff --git a/ivtest/vvp_tests/sdf_header.json b/ivtest/vvp_tests/sdf_header.json new file mode 100644 index 000000000..0a0698951 --- /dev/null +++ b/ivtest/vvp_tests/sdf_header.json @@ -0,0 +1,7 @@ +{ + "type" : "normal", + "source" : "sdf_header.v", + "gold" : "sdf_header", + "iverilog-args" : [ "-gspecify" ], + "vvp-args-extended" : [ "-sdf-verbose" ] +} diff --git a/vpi/sdf_parse.y b/vpi/sdf_parse.y index c735a06c6..50d4935d2 100644 --- a/vpi/sdf_parse.y +++ b/vpi/sdf_parse.y @@ -108,8 +108,10 @@ sdf_header_item sdfversion : '(' K_SDFVERSION QSTRING ')' - { free($3); - } + { if (sdf_flag_inform) vpi_printf("%s:%d:SDF INFO: Version: %s\n", + sdf_parse_path, @2.first_line, $3); + free($3); + } ; design_name @@ -153,14 +155,33 @@ program_version ; hierarchy_divider - : '(' K_DIVIDER '.' ')' { sdf_use_hchar = '.'; } - | '(' K_DIVIDER '/' ')' { sdf_use_hchar = '/'; } - | '(' K_DIVIDER HCHAR ')' { /* sdf_use_hchar no-change */; } + : '(' K_DIVIDER '.' ')' + { sdf_use_hchar = '.'; + if (sdf_flag_inform) vpi_printf("%s:%d:SDF INFO: Divider: \"%c\"\n", sdf_parse_path, @1.first_line, sdf_use_hchar); + } + | '(' K_DIVIDER '/' ')' + { sdf_use_hchar = '/'; + if (sdf_flag_inform) vpi_printf("%s:%d:SDF INFO: Divider: \"%c\"\n", sdf_parse_path, @1.first_line, sdf_use_hchar); + } + | '(' K_DIVIDER HCHAR ')' + { /* sdf_use_hchar no-change */ + if (sdf_flag_inform) vpi_printf("%s:%d:SDF INFO: Divider: \"%c\"\n", sdf_parse_path, @1.first_line, sdf_use_hchar); + } ; voltage : '(' K_VOLTAGE rtriple ')' + { /* The value must be defined. */ + if (! $3.defined) { + vpi_printf("%s:%d: SDF ERROR: Chosen value not defined.\n", sdf_parse_path, @1.first_line); + } + else if (sdf_flag_inform) vpi_printf("%s:%d:SDF INFO: Voltage: %f\n", + sdf_parse_path, @2.first_line, $3.value); + } | '(' K_VOLTAGE signed_real_number ')' + { if (sdf_flag_inform) vpi_printf("%s:%d:SDF INFO: Voltage: %f\n", + sdf_parse_path, @2.first_line, $3); + } ; process @@ -173,17 +194,27 @@ process temperature : '(' K_TEMPERATURE rtriple ')' + { /* The value must be defined. */ + if (! $3.defined) { + vpi_printf("%s:%d: SDF ERROR: Chosen value not defined.\n", sdf_parse_path, @1.first_line); + } + else if (sdf_flag_inform) vpi_printf("%s:%d:SDF INFO: Temperature: %f\n", + sdf_parse_path, @2.first_line, $3.value); + } | '(' K_TEMPERATURE signed_real_number ')' + { if (sdf_flag_inform) vpi_printf("%s:%d:SDF INFO: Temperature: %f\n", + sdf_parse_path, @2.first_line, $3); + } ; time_scale : '(' K_TIMESCALE REAL_NUMBER IDENTIFIER ')' - { if (sdf_flag_inform) vpi_printf("%s:%d:SDF INFO: TIMESCALE : %f%s\n", + { if (sdf_flag_inform) vpi_printf("%s:%d:SDF INFO: Timescale: %f%s\n", sdf_parse_path, @2.first_line, $3, $4); free($4); } | '(' K_TIMESCALE INTEGER IDENTIFIER ')' - { if (sdf_flag_inform) vpi_printf("%s:%d:SDF INFO: TIMESCALE : %lu%s\n", + { if (sdf_flag_inform) vpi_printf("%s:%d:SDF INFO: Timescale: %lu%s\n", sdf_parse_path, @2.first_line, $3, $4); free($4); }