From 6d826d52f94447969a1681838d2e2016bddd2b72 Mon Sep 17 00:00:00 2001 From: damc Date: Wed, 20 Jul 2022 12:35:56 +0200 Subject: [PATCH 01/62] ppTests Descriptive names. --- sv-parser-pp/src/preprocess.rs | 47 +++++++++++++++++----------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 2e5e739..2774cfe 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -861,7 +861,7 @@ mod tests { } #[test] - fn test1() { + fn ifdef_undefined() { let (ret, _) = preprocess( get_testcase("test1.sv"), &HashMap::new(), @@ -891,7 +891,7 @@ endmodule } #[test] - fn test1_predefine() { + fn ifdef_predefined() { let mut defines = HashMap::new(); defines.insert(String::from("behavioral"), None); let (ret, _) = preprocess( @@ -916,7 +916,7 @@ endmodule } #[test] - fn test2() { + fn include_origin() { let include_paths = [get_testcase("")]; let (ret, _) = preprocess( get_testcase("test2.sv"), @@ -956,7 +956,7 @@ endmodule } #[test] - fn test2_ignore_include() { + fn ignore_include() { let include_paths = [get_testcase("")]; let (ret, _) = preprocess( get_testcase("test2.sv"), @@ -976,7 +976,7 @@ endmodule } #[test] - fn test3() { + fn macro_parameters_defaultvalue() { let (ret, _) = preprocess( get_testcase("test3.sv"), &HashMap::new(), @@ -1001,7 +1001,7 @@ module a (); } #[test] - fn test4() { + fn macro_parameters_multiline() { let (ret, _) = preprocess( get_testcase("test4.sv"), &HashMap::new(), @@ -1034,7 +1034,7 @@ endmodule } #[test] - fn test5() { + fn macro_parameters_dependent() { let (ret, _) = preprocess( get_testcase("test5.sv"), &HashMap::new(), @@ -1060,7 +1060,7 @@ endmodule } #[test] - fn test6() { + fn macro_string_literal() { let (ret, _) = preprocess( get_testcase("test6.sv"), &HashMap::new(), @@ -1083,7 +1083,7 @@ endmodule } #[test] - fn test7() { + fn macro_direct_recursion() { let ret = preprocess( get_testcase("test7.sv"), &HashMap::new(), @@ -1095,7 +1095,7 @@ endmodule } #[test] - fn test8() { + fn macro_indirect_recursion() { let ret = preprocess( get_testcase("test8.sv"), &HashMap::new(), @@ -1107,7 +1107,7 @@ endmodule } #[test] - fn test9() { + fn include_sameline_include() { let include_paths = [get_testcase("")]; let ret = preprocess( get_testcase("test9.sv"), @@ -1120,7 +1120,7 @@ endmodule } #[test] - fn test10() { + fn include_sameline_keyword() { let include_paths = [get_testcase("")]; let ret = preprocess( get_testcase("test10.sv"), @@ -1133,7 +1133,8 @@ endmodule } #[test] - fn test11() { + #[allow(non_snake_case)] + fn macro_LINE() { let (ret, _) = preprocess( get_testcase("test11.sv"), &HashMap::new(), @@ -1155,7 +1156,7 @@ endmodule } #[test] - fn test12() { + fn escaped_identifier() { let (ret, _) = preprocess( get_testcase("test12.sv"), &HashMap::new(), @@ -1174,7 +1175,7 @@ endmodule } #[test] - fn test13() { + fn macro_with_comment() { let (ret, _) = preprocess( get_testcase("test13.sv"), &HashMap::new(), @@ -1193,7 +1194,7 @@ endinterface } #[test] - fn test14() { + fn ifdef_nested() { let (ret, _) = preprocess( get_testcase("test14.sv"), &HashMap::new(), @@ -1214,7 +1215,7 @@ endmodule } #[test] - fn test15() { + fn macro_usage_sameline() { let (ret, _) = preprocess( get_testcase("test15.sv"), &HashMap::new(), @@ -1234,7 +1235,7 @@ endmodule } #[test] - fn test16() { + fn macro_backslash() { let (ret, _) = preprocess( get_testcase("test16.sv"), &HashMap::new(), @@ -1260,7 +1261,7 @@ endmodule } #[test] - fn test17() { + fn macro_multiline() { let (ret, _) = preprocess( get_testcase("test17.sv"), &HashMap::new(), @@ -1284,7 +1285,7 @@ initial begin } #[test] - fn test18() { + fn ifndef_undefined() { let (ret, _) = preprocess( get_testcase("test18.sv"), &HashMap::new(), @@ -1305,7 +1306,7 @@ endmodule } #[test] - fn test19() { + fn whitespace_include_with_comment() { let include_paths = [get_testcase("")]; let (ret, _) = preprocess( get_testcase("test19.sv"), @@ -1345,7 +1346,7 @@ endmodule } #[test] - fn test20() { + fn whitespace_include() { let include_paths = [get_testcase("")]; let (ret, _) = preprocess( get_testcase("test20.sv"), @@ -1388,7 +1389,7 @@ endmodule // Check that preprocess() doesn't introduce extra whitespace within and // around compiler directives. #[test] - fn test21() { + fn whitespace_directives() { let include_paths = [get_testcase("")]; let (ret, _) = preprocess( get_testcase("test21.sv"), From 1a77bbb75b3c3418d1b76190f237e0714ad8af7c Mon Sep 17 00:00:00 2001 From: damc Date: Wed, 20 Jul 2022 12:48:16 +0200 Subject: [PATCH 02/62] ppTests Rename get_testcase -> testcase_path --- sv-parser-pp/src/preprocess.rs | 82 +++++++++++++++++----------------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 2774cfe..e52fac4 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -852,7 +852,7 @@ mod tests { use super::*; use std::env; - fn get_testcase(s: &str) -> String { + fn testfile_path(s: &str) -> String { format!( "{}/testcases/{}", env::var("CARGO_MANIFEST_DIR").unwrap(), @@ -863,7 +863,7 @@ mod tests { #[test] fn ifdef_undefined() { let (ret, _) = preprocess( - get_testcase("test1.sv"), + testfile_path("test1.sv"), &HashMap::new(), &[] as &[String], false, @@ -883,7 +883,7 @@ endmodule ); assert_eq!( ret.origin(10).unwrap().0, - &PathBuf::from(get_testcase("test1.sv")) + &PathBuf::from(testfile_path("test1.sv")) ); assert_eq!(ret.origin(10).unwrap().1, 10); assert_eq!(ret.origin(50).unwrap().1, 98); @@ -895,7 +895,7 @@ endmodule let mut defines = HashMap::new(); defines.insert(String::from("behavioral"), None); let (ret, _) = preprocess( - get_testcase("test1.sv"), + testfile_path("test1.sv"), &defines, &[] as &[String], false, @@ -917,9 +917,9 @@ endmodule #[test] fn include_origin() { - let include_paths = [get_testcase("")]; + let include_paths = [testfile_path("")]; let (ret, _) = preprocess( - get_testcase("test2.sv"), + testfile_path("test2.sv"), &HashMap::new(), &include_paths, false, @@ -940,26 +940,26 @@ endmodule ); assert_eq!( ret.origin(10).unwrap().0, - &PathBuf::from(get_testcase("test2.sv")) + &PathBuf::from(testfile_path("test2.sv")) ); assert_eq!(ret.origin(10).unwrap().1, 10); assert_eq!( ret.origin(50).unwrap().0, - &PathBuf::from(get_testcase("test2.svh")) + &PathBuf::from(testfile_path("test2.svh")) ); assert_eq!(ret.origin(50).unwrap().1, 73); assert_eq!( ret.origin(70).unwrap().0, - &PathBuf::from(get_testcase("test2.sv")) + &PathBuf::from(testfile_path("test2.sv")) ); assert_eq!(ret.origin(70).unwrap().1, 50); } #[test] fn ignore_include() { - let include_paths = [get_testcase("")]; + let include_paths = [testfile_path("")]; let (ret, _) = preprocess( - get_testcase("test2.sv"), + testfile_path("test2.sv"), &HashMap::new(), &include_paths, false, @@ -978,7 +978,7 @@ endmodule #[test] fn macro_parameters_defaultvalue() { let (ret, _) = preprocess( - get_testcase("test3.sv"), + testfile_path("test3.sv"), &HashMap::new(), &[] as &[String], false, @@ -1003,7 +1003,7 @@ module a (); #[test] fn macro_parameters_multiline() { let (ret, _) = preprocess( - get_testcase("test4.sv"), + testfile_path("test4.sv"), &HashMap::new(), &[] as &[String], false, @@ -1036,7 +1036,7 @@ endmodule #[test] fn macro_parameters_dependent() { let (ret, _) = preprocess( - get_testcase("test5.sv"), + testfile_path("test5.sv"), &HashMap::new(), &[] as &[String], false, @@ -1062,7 +1062,7 @@ endmodule #[test] fn macro_string_literal() { let (ret, _) = preprocess( - get_testcase("test6.sv"), + testfile_path("test6.sv"), &HashMap::new(), &[] as &[String], false, @@ -1085,7 +1085,7 @@ endmodule #[test] fn macro_direct_recursion() { let ret = preprocess( - get_testcase("test7.sv"), + testfile_path("test7.sv"), &HashMap::new(), &[] as &[String], false, @@ -1097,7 +1097,7 @@ endmodule #[test] fn macro_indirect_recursion() { let ret = preprocess( - get_testcase("test8.sv"), + testfile_path("test8.sv"), &HashMap::new(), &[] as &[String], false, @@ -1108,9 +1108,9 @@ endmodule #[test] fn include_sameline_include() { - let include_paths = [get_testcase("")]; + let include_paths = [testfile_path("")]; let ret = preprocess( - get_testcase("test9.sv"), + testfile_path("test9.sv"), &HashMap::new(), &include_paths, false, @@ -1121,9 +1121,9 @@ endmodule #[test] fn include_sameline_keyword() { - let include_paths = [get_testcase("")]; + let include_paths = [testfile_path("")]; let ret = preprocess( - get_testcase("test10.sv"), + testfile_path("test10.sv"), &HashMap::new(), &include_paths, false, @@ -1136,7 +1136,7 @@ endmodule #[allow(non_snake_case)] fn macro_LINE() { let (ret, _) = preprocess( - get_testcase("test11.sv"), + testfile_path("test11.sv"), &HashMap::new(), &[] as &[String], false, @@ -1158,7 +1158,7 @@ endmodule #[test] fn escaped_identifier() { let (ret, _) = preprocess( - get_testcase("test12.sv"), + testfile_path("test12.sv"), &HashMap::new(), &[] as &[String], false, @@ -1177,7 +1177,7 @@ endmodule #[test] fn macro_with_comment() { let (ret, _) = preprocess( - get_testcase("test13.sv"), + testfile_path("test13.sv"), &HashMap::new(), &[] as &[String], false, @@ -1196,7 +1196,7 @@ endinterface #[test] fn ifdef_nested() { let (ret, _) = preprocess( - get_testcase("test14.sv"), + testfile_path("test14.sv"), &HashMap::new(), &[] as &[String], false, @@ -1217,7 +1217,7 @@ endmodule #[test] fn macro_usage_sameline() { let (ret, _) = preprocess( - get_testcase("test15.sv"), + testfile_path("test15.sv"), &HashMap::new(), &[] as &[String], false, @@ -1237,7 +1237,7 @@ endmodule #[test] fn macro_backslash() { let (ret, _) = preprocess( - get_testcase("test16.sv"), + testfile_path("test16.sv"), &HashMap::new(), &[] as &[String], false, @@ -1263,7 +1263,7 @@ endmodule #[test] fn macro_multiline() { let (ret, _) = preprocess( - get_testcase("test17.sv"), + testfile_path("test17.sv"), &HashMap::new(), &[] as &[String], false, @@ -1287,7 +1287,7 @@ initial begin #[test] fn ifndef_undefined() { let (ret, _) = preprocess( - get_testcase("test18.sv"), + testfile_path("test18.sv"), &HashMap::new(), &[] as &[String], false, @@ -1307,9 +1307,9 @@ endmodule #[test] fn whitespace_include_with_comment() { - let include_paths = [get_testcase("")]; + let include_paths = [testfile_path("")]; let (ret, _) = preprocess( - get_testcase("test19.sv"), + testfile_path("test19.sv"), &HashMap::new(), &include_paths, false, @@ -1330,26 +1330,26 @@ endmodule ); assert_eq!( ret.origin(10).unwrap().0, - &PathBuf::from(get_testcase("test19.sv")) + &PathBuf::from(testfile_path("test19.sv")) ); assert_eq!(ret.origin(10).unwrap().1, 10); assert_eq!( ret.origin(50).unwrap().0, - &PathBuf::from(get_testcase("test2.svh")) + &PathBuf::from(testfile_path("test2.svh")) ); assert_eq!(ret.origin(50).unwrap().1, 73); assert_eq!( ret.origin(70).unwrap().0, - &PathBuf::from(get_testcase("test19.sv")) + &PathBuf::from(testfile_path("test19.sv")) ); assert_eq!(ret.origin(70).unwrap().1, 50); } #[test] fn whitespace_include() { - let include_paths = [get_testcase("")]; + let include_paths = [testfile_path("")]; let (ret, _) = preprocess( - get_testcase("test20.sv"), + testfile_path("test20.sv"), &HashMap::new(), &include_paths, false, @@ -1371,17 +1371,17 @@ endmodule ); assert_eq!( ret.origin(10).unwrap().0, - &PathBuf::from(get_testcase("test20.sv")) + &PathBuf::from(testfile_path("test20.sv")) ); assert_eq!(ret.origin(10).unwrap().1, 10); assert_eq!( ret.origin(60).unwrap().0, - &PathBuf::from(get_testcase("test2.svh")) + &PathBuf::from(testfile_path("test2.svh")) ); assert_eq!(ret.origin(60).unwrap().1, 74); assert_eq!( ret.origin(80).unwrap().0, - &PathBuf::from(get_testcase("test20.sv")) + &PathBuf::from(testfile_path("test20.sv")) ); assert_eq!(ret.origin(80).unwrap().1, 60); } @@ -1390,9 +1390,9 @@ endmodule // around compiler directives. #[test] fn whitespace_directives() { - let include_paths = [get_testcase("")]; + let include_paths = [testfile_path("")]; let (ret, _) = preprocess( - get_testcase("test21.sv"), + testfile_path("test21.sv"), &HashMap::new(), &include_paths, false, From 9a254105c6d8f8132ea4fd2635d10366a42577d9 Mon Sep 17 00:00:00 2001 From: damc Date: Wed, 20 Jul 2022 13:28:58 +0200 Subject: [PATCH 03/62] ppTest Move expected pp output to separate files. --- sv-parser-pp/src/preprocess.rs | 195 +++--------------- .../testcases/expected/escaped_identifier | 3 + sv-parser-pp/testcases/expected/ifdef_nested | 5 + .../testcases/expected/ifdef_predefined | 7 + .../testcases/expected/ifdef_undefined | 7 + .../testcases/expected/ifndef_undefined | 5 + .../testcases/expected/ignore_include | 3 + .../testcases/expected/include_origin | 8 + sv-parser-pp/testcases/expected/macro_LINE | 6 + .../testcases/expected/macro_backslash | 10 + .../testcases/expected/macro_multiline | 8 + .../expected/macro_parameters_defaultvalue | 9 + .../expected/macro_parameters_dependent | 10 + .../expected/macro_parameters_multiline | 17 ++ .../testcases/expected/macro_string_literal | 7 + .../testcases/expected/macro_usage_sameline | 4 + .../testcases/expected/macro_with_comment | 3 + .../testcases/expected/whitespace_directives | 17 ++ .../testcases/expected/whitespace_include | 9 + .../expected/whitespace_include_with_comment | 8 + 20 files changed, 176 insertions(+), 165 deletions(-) create mode 100644 sv-parser-pp/testcases/expected/escaped_identifier create mode 100644 sv-parser-pp/testcases/expected/ifdef_nested create mode 100644 sv-parser-pp/testcases/expected/ifdef_predefined create mode 100644 sv-parser-pp/testcases/expected/ifdef_undefined create mode 100644 sv-parser-pp/testcases/expected/ifndef_undefined create mode 100644 sv-parser-pp/testcases/expected/ignore_include create mode 100644 sv-parser-pp/testcases/expected/include_origin create mode 100644 sv-parser-pp/testcases/expected/macro_LINE create mode 100644 sv-parser-pp/testcases/expected/macro_backslash create mode 100644 sv-parser-pp/testcases/expected/macro_multiline create mode 100644 sv-parser-pp/testcases/expected/macro_parameters_defaultvalue create mode 100644 sv-parser-pp/testcases/expected/macro_parameters_dependent create mode 100644 sv-parser-pp/testcases/expected/macro_parameters_multiline create mode 100644 sv-parser-pp/testcases/expected/macro_string_literal create mode 100644 sv-parser-pp/testcases/expected/macro_usage_sameline create mode 100644 sv-parser-pp/testcases/expected/macro_with_comment create mode 100644 sv-parser-pp/testcases/expected/whitespace_directives create mode 100644 sv-parser-pp/testcases/expected/whitespace_include create mode 100644 sv-parser-pp/testcases/expected/whitespace_include_with_comment diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index e52fac4..0d36ca5 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -860,6 +860,17 @@ mod tests { ) } + fn testfile_contents(s: &str) -> String { + let path: String = testfile_path(s); + + let file = File::open(path).unwrap(); + let mut buf_reader = BufReader::new(file); + let mut contents = String::new(); + buf_reader.read_to_string(&mut contents).unwrap(); + + contents + } + #[test] fn ifdef_undefined() { let (ret, _) = preprocess( @@ -872,14 +883,7 @@ mod tests { .unwrap(); assert_eq!( ret.text(), - r##"module and_op (a, b, c); -output a; -input b, c; - -and a1 (a,b,c); - -endmodule -"## + testfile_contents("expected/ifdef_undefined") ); assert_eq!( ret.origin(10).unwrap().0, @@ -904,14 +908,7 @@ endmodule .unwrap(); assert_eq!( ret.text(), - r##"module and_op (a, b, c); -output a; -input b, c; - -wire a = b & c; - -endmodule -"## + testfile_contents("expected/ifdef_predefined") ) } @@ -928,15 +925,7 @@ endmodule .unwrap(); assert_eq!( ret.text(), - r##"module and_op (a, b, c); -output a; -input b, c; - -and a1 (a,b,c); - - -endmodule -"## + testfile_contents("expected/include_origin") ); assert_eq!( ret.origin(10).unwrap().0, @@ -968,10 +957,7 @@ endmodule .unwrap(); assert_eq!( ret.text(), - r##"module and_op (a, b, c); - -endmodule -"## + testfile_contents("expected/ignore_include") ); } @@ -987,16 +973,7 @@ endmodule .unwrap(); assert_eq!( ret.text(), - r##"`define connect(NAME, INDEX = 0) \ - assign NAME``_``INDEX``__x = NAME[INDEX].x; \ - assign NAME``_``INDEX``__y = NAME[INDEX].y; - -module a (); - - assign a_0__x = a[0].x; - assign a_0__y = a[0].y; assign a_1__x = a[1].x; - assign a_1__y = a[1].y; endmodule -"## + testfile_contents("expected/macro_parameters_defaultvalue") ); } @@ -1012,24 +989,7 @@ module a (); .unwrap(); assert_eq!( ret.text(), - r##"`define disp(clk, exp, msg) \ - always @(posedge clk) begin \ - if (!(exp)) begin \ - $display msg; \ - end \ - end \ - -module a (); - -always @(posedge clk) begin - if (!(!(a[i].b && c[i]))) begin - $display ("xxx(()[]]{}}}", a[i].b, c[i]); - end - end - ; - -endmodule -"## + testfile_contents("expected/macro_parameters_multiline") ); } @@ -1045,17 +1005,7 @@ endmodule .unwrap(); assert_eq!( ret.text(), - r##"module a; -`define HI Hello -`define LO "`HI, world" -`define H(x) "Hello, x" -initial begin -$display("`HI, world"); -$display("`HI, world" ); -$display("Hello, x" ); -end -endmodule -"## + testfile_contents("expected/macro_parameters_dependent") ); } @@ -1071,14 +1021,7 @@ endmodule .unwrap(); assert_eq!( ret.text(), - r##"`define msg(x,y) `"x: `\`"y`\`"`" - -module a; -initial begin -$display("left side: \"right side\"" ); -end -endmodule -"## + testfile_contents("expected/macro_string_literal") ); } @@ -1145,13 +1088,7 @@ endmodule .unwrap(); assert_eq!( ret.text(), - r##"module a; -initial begin - if (3 == 0) begin - end -end -endmodule -"## + testfile_contents("expected/macro_LINE") ); } @@ -1167,10 +1104,7 @@ endmodule .unwrap(); assert_eq!( ret.text(), - r##"module a; -reg \`~!-_=+\|[]{};:'"",./<>? ; -endmodule -"## + testfile_contents("expected/escaped_identifier") ); } @@ -1186,10 +1120,7 @@ endmodule .unwrap(); assert_eq!( ret.text(), - r##"`define NAME 42 // Comment -interface foo #(WIDTH = 42 ) (); -endinterface -"## + testfile_contents("expected/macro_with_comment") ); } @@ -1205,12 +1136,7 @@ endinterface .unwrap(); assert_eq!( ret.text(), - r##"module A; -wire a = 1'b0; - - -endmodule -"## + testfile_contents("expected/ifdef_nested") ); } @@ -1226,11 +1152,7 @@ endmodule .unwrap(); assert_eq!( ret.text(), - r##"`define MOD_INST u_mysubmod -module mymod; -mysubmod u_mysubmod() ; -endmodule -"## + testfile_contents("expected/macro_usage_sameline") ); } @@ -1246,17 +1168,7 @@ endmodule .unwrap(); assert_eq!( ret.text(), - r##"module a; -`define HELLO0 "HELLO" -`define \HELLO1 "HELLO" -initial begin -$display("HELLO" ); -$display("HELLO" ); -$display("HELLO" ); -$display("HELLO" ); -end -endmodule -"## + testfile_contents("expected/macro_backslash") ); } @@ -1272,15 +1184,7 @@ endmodule .unwrap(); assert_eq!( ret.text(), - r##"`define A \ - initial begin // comment \ - end - -module test(); - -initial begin - end endmodule -"## + testfile_contents("expected/macro_multiline") ); } @@ -1296,12 +1200,7 @@ initial begin .unwrap(); assert_eq!( ret.text(), - r##"// pragma translate_off -module A; -endmodule -// pragma translate_on - -"## + testfile_contents("expected/ifndef_undefined") ); } @@ -1318,15 +1217,7 @@ endmodule .unwrap(); assert_eq!( ret.text(), - r##"module and_op (a, b, c); -output a; -input b, c; - -and a1 (a,b,c); - - // comment -endmodule -"## + testfile_contents("expected/whitespace_include_with_comment") ); assert_eq!( ret.origin(10).unwrap().0, @@ -1358,16 +1249,7 @@ endmodule .unwrap(); assert_eq!( ret.text(), - r##"module and_op (a, b, c); - // a - output a; -input b, c; - -and a1 (a,b,c); - - -endmodule -"## + testfile_contents("expected/whitespace_include") ); assert_eq!( ret.origin(10).unwrap().0, @@ -1401,24 +1283,7 @@ endmodule .unwrap(); assert_eq!( ret.text(), - r##"//top -`resetall -`timescale 10 us / 100 ns -`default_nettype wire -//first -`default_nettype none//middle -//last -`unconnected_drive pull0 -`unconnected_drive pull1 -`nounconnected_drive -`celldefine -`endcelldefine -`pragma foo -`pragma foo bar -`line 5 "foo" 0 -`begin_keywords "1800-2017" -`end_keywords -"## + testfile_contents("expected/whitespace_directives") ); } } diff --git a/sv-parser-pp/testcases/expected/escaped_identifier b/sv-parser-pp/testcases/expected/escaped_identifier new file mode 100644 index 0000000..871f152 --- /dev/null +++ b/sv-parser-pp/testcases/expected/escaped_identifier @@ -0,0 +1,3 @@ +module a; +reg \`~!-_=+\|[]{};:'"",./<>? ; +endmodule diff --git a/sv-parser-pp/testcases/expected/ifdef_nested b/sv-parser-pp/testcases/expected/ifdef_nested new file mode 100644 index 0000000..3e0aa16 --- /dev/null +++ b/sv-parser-pp/testcases/expected/ifdef_nested @@ -0,0 +1,5 @@ +module A; +wire a = 1'b0; + + +endmodule diff --git a/sv-parser-pp/testcases/expected/ifdef_predefined b/sv-parser-pp/testcases/expected/ifdef_predefined new file mode 100644 index 0000000..449fefb --- /dev/null +++ b/sv-parser-pp/testcases/expected/ifdef_predefined @@ -0,0 +1,7 @@ +module and_op (a, b, c); +output a; +input b, c; + +wire a = b & c; + +endmodule diff --git a/sv-parser-pp/testcases/expected/ifdef_undefined b/sv-parser-pp/testcases/expected/ifdef_undefined new file mode 100644 index 0000000..deed77b --- /dev/null +++ b/sv-parser-pp/testcases/expected/ifdef_undefined @@ -0,0 +1,7 @@ +module and_op (a, b, c); +output a; +input b, c; + +and a1 (a,b,c); + +endmodule diff --git a/sv-parser-pp/testcases/expected/ifndef_undefined b/sv-parser-pp/testcases/expected/ifndef_undefined new file mode 100644 index 0000000..a87d075 --- /dev/null +++ b/sv-parser-pp/testcases/expected/ifndef_undefined @@ -0,0 +1,5 @@ +// pragma translate_off +module A; +endmodule +// pragma translate_on + diff --git a/sv-parser-pp/testcases/expected/ignore_include b/sv-parser-pp/testcases/expected/ignore_include new file mode 100644 index 0000000..d35eb08 --- /dev/null +++ b/sv-parser-pp/testcases/expected/ignore_include @@ -0,0 +1,3 @@ +module and_op (a, b, c); + +endmodule diff --git a/sv-parser-pp/testcases/expected/include_origin b/sv-parser-pp/testcases/expected/include_origin new file mode 100644 index 0000000..9707d04 --- /dev/null +++ b/sv-parser-pp/testcases/expected/include_origin @@ -0,0 +1,8 @@ +module and_op (a, b, c); +output a; +input b, c; + +and a1 (a,b,c); + + +endmodule diff --git a/sv-parser-pp/testcases/expected/macro_LINE b/sv-parser-pp/testcases/expected/macro_LINE new file mode 100644 index 0000000..c741818 --- /dev/null +++ b/sv-parser-pp/testcases/expected/macro_LINE @@ -0,0 +1,6 @@ +module a; +initial begin + if (3 == 0) begin + end +end +endmodule diff --git a/sv-parser-pp/testcases/expected/macro_backslash b/sv-parser-pp/testcases/expected/macro_backslash new file mode 100644 index 0000000..26406be --- /dev/null +++ b/sv-parser-pp/testcases/expected/macro_backslash @@ -0,0 +1,10 @@ +module a; +`define HELLO0 "HELLO" +`define \HELLO1 "HELLO" +initial begin +$display("HELLO" ); +$display("HELLO" ); +$display("HELLO" ); +$display("HELLO" ); +end +endmodule diff --git a/sv-parser-pp/testcases/expected/macro_multiline b/sv-parser-pp/testcases/expected/macro_multiline new file mode 100644 index 0000000..ef5f745 --- /dev/null +++ b/sv-parser-pp/testcases/expected/macro_multiline @@ -0,0 +1,8 @@ +`define A \ + initial begin // comment \ + end + +module test(); + +initial begin + end endmodule diff --git a/sv-parser-pp/testcases/expected/macro_parameters_defaultvalue b/sv-parser-pp/testcases/expected/macro_parameters_defaultvalue new file mode 100644 index 0000000..7cc0596 --- /dev/null +++ b/sv-parser-pp/testcases/expected/macro_parameters_defaultvalue @@ -0,0 +1,9 @@ +`define connect(NAME, INDEX = 0) \ + assign NAME``_``INDEX``__x = NAME[INDEX].x; \ + assign NAME``_``INDEX``__y = NAME[INDEX].y; + +module a (); + + assign a_0__x = a[0].x; + assign a_0__y = a[0].y; assign a_1__x = a[1].x; + assign a_1__y = a[1].y; endmodule diff --git a/sv-parser-pp/testcases/expected/macro_parameters_dependent b/sv-parser-pp/testcases/expected/macro_parameters_dependent new file mode 100644 index 0000000..88fa5b2 --- /dev/null +++ b/sv-parser-pp/testcases/expected/macro_parameters_dependent @@ -0,0 +1,10 @@ +module a; +`define HI Hello +`define LO "`HI, world" +`define H(x) "Hello, x" +initial begin +$display("`HI, world"); +$display("`HI, world" ); +$display("Hello, x" ); +end +endmodule diff --git a/sv-parser-pp/testcases/expected/macro_parameters_multiline b/sv-parser-pp/testcases/expected/macro_parameters_multiline new file mode 100644 index 0000000..c4839c4 --- /dev/null +++ b/sv-parser-pp/testcases/expected/macro_parameters_multiline @@ -0,0 +1,17 @@ +`define disp(clk, exp, msg) \ + always @(posedge clk) begin \ + if (!(exp)) begin \ + $display msg; \ + end \ + end \ + +module a (); + +always @(posedge clk) begin + if (!(!(a[i].b && c[i]))) begin + $display ("xxx(()[]]{}}}", a[i].b, c[i]); + end + end + ; + +endmodule diff --git a/sv-parser-pp/testcases/expected/macro_string_literal b/sv-parser-pp/testcases/expected/macro_string_literal new file mode 100644 index 0000000..55e81bc --- /dev/null +++ b/sv-parser-pp/testcases/expected/macro_string_literal @@ -0,0 +1,7 @@ +`define msg(x,y) `"x: `\`"y`\`"`" + +module a; +initial begin +$display("left side: \"right side\"" ); +end +endmodule diff --git a/sv-parser-pp/testcases/expected/macro_usage_sameline b/sv-parser-pp/testcases/expected/macro_usage_sameline new file mode 100644 index 0000000..c5f5078 --- /dev/null +++ b/sv-parser-pp/testcases/expected/macro_usage_sameline @@ -0,0 +1,4 @@ +`define MOD_INST u_mysubmod +module mymod; +mysubmod u_mysubmod() ; +endmodule diff --git a/sv-parser-pp/testcases/expected/macro_with_comment b/sv-parser-pp/testcases/expected/macro_with_comment new file mode 100644 index 0000000..141f2f3 --- /dev/null +++ b/sv-parser-pp/testcases/expected/macro_with_comment @@ -0,0 +1,3 @@ +`define NAME 42 // Comment +interface foo #(WIDTH = 42 ) (); +endinterface diff --git a/sv-parser-pp/testcases/expected/whitespace_directives b/sv-parser-pp/testcases/expected/whitespace_directives new file mode 100644 index 0000000..390e540 --- /dev/null +++ b/sv-parser-pp/testcases/expected/whitespace_directives @@ -0,0 +1,17 @@ +//top +`resetall +`timescale 10 us / 100 ns +`default_nettype wire +//first +`default_nettype none//middle +//last +`unconnected_drive pull0 +`unconnected_drive pull1 +`nounconnected_drive +`celldefine +`endcelldefine +`pragma foo +`pragma foo bar +`line 5 "foo" 0 +`begin_keywords "1800-2017" +`end_keywords diff --git a/sv-parser-pp/testcases/expected/whitespace_include b/sv-parser-pp/testcases/expected/whitespace_include new file mode 100644 index 0000000..3549925 --- /dev/null +++ b/sv-parser-pp/testcases/expected/whitespace_include @@ -0,0 +1,9 @@ +module and_op (a, b, c); + // a + output a; +input b, c; + +and a1 (a,b,c); + + +endmodule diff --git a/sv-parser-pp/testcases/expected/whitespace_include_with_comment b/sv-parser-pp/testcases/expected/whitespace_include_with_comment new file mode 100644 index 0000000..3f7265d --- /dev/null +++ b/sv-parser-pp/testcases/expected/whitespace_include_with_comment @@ -0,0 +1,8 @@ +module and_op (a, b, c); +output a; +input b, c; + +and a1 (a,b,c); + + // comment +endmodule From 93f305c448d2b789f3da085e9d4f3ee29c2dd572 Mon Sep 17 00:00:00 2001 From: damc Date: Thu, 21 Jul 2022 10:52:43 +0200 Subject: [PATCH 04/62] ppTests Add tests from LRM, but don't run them yet. --- .../IEEE18002017_macro_argument_expansion.sv | 10 ++++++++ .../IEEE18002017_macro_delimit_tokens.sv | 7 ++++++ .../IEEE18002017_macro_mix_quotes.sv | 10 ++++++++ .../IEEE18002017_macro_noexpand_string | 13 ++++++++++ .../IEEE18002017_macro_with_defaults.sv | 25 +++++++++++++++++++ .../IEEE18002017_macro_without_defaults.sv | 15 +++++++++++ .../IEEE18002017_macro_argument_expansion.sv | 10 ++++++++ .../IEEE18002017_macro_delimit_tokens.sv | 7 ++++++ .../expected/IEEE18002017_macro_mix_quotes.sv | 10 ++++++++ .../IEEE18002017_macro_noexpand_string.sv | 13 ++++++++++ .../IEEE18002017_macro_with_defaults.sv | 25 +++++++++++++++++++ .../IEEE18002017_macro_without_defaults.sv | 15 +++++++++++ 12 files changed, 160 insertions(+) create mode 100644 sv-parser-pp/testcases/IEEE18002017_macro_argument_expansion.sv create mode 100644 sv-parser-pp/testcases/IEEE18002017_macro_delimit_tokens.sv create mode 100644 sv-parser-pp/testcases/IEEE18002017_macro_mix_quotes.sv create mode 100644 sv-parser-pp/testcases/IEEE18002017_macro_noexpand_string create mode 100644 sv-parser-pp/testcases/IEEE18002017_macro_with_defaults.sv create mode 100644 sv-parser-pp/testcases/IEEE18002017_macro_without_defaults.sv create mode 100644 sv-parser-pp/testcases/expected/IEEE18002017_macro_argument_expansion.sv create mode 100644 sv-parser-pp/testcases/expected/IEEE18002017_macro_delimit_tokens.sv create mode 100644 sv-parser-pp/testcases/expected/IEEE18002017_macro_mix_quotes.sv create mode 100644 sv-parser-pp/testcases/expected/IEEE18002017_macro_noexpand_string.sv create mode 100644 sv-parser-pp/testcases/expected/IEEE18002017_macro_with_defaults.sv create mode 100644 sv-parser-pp/testcases/expected/IEEE18002017_macro_without_defaults.sv diff --git a/sv-parser-pp/testcases/IEEE18002017_macro_argument_expansion.sv b/sv-parser-pp/testcases/IEEE18002017_macro_argument_expansion.sv new file mode 100644 index 0000000..9c1f62c --- /dev/null +++ b/sv-parser-pp/testcases/IEEE18002017_macro_argument_expansion.sv @@ -0,0 +1,10 @@ +/* IEEE1800-2017 Clause 22.5.1 page 679 +*/ + +`define max(a,b)((a) > (b) ? (a) : (b)) +`define TOP(a,b) a + b + +module m; +assign n = `max(p+q, r+s) ; +assign z = `TOP( `TOP(b,1), `TOP(42,a) ); +endmodule diff --git a/sv-parser-pp/testcases/IEEE18002017_macro_delimit_tokens.sv b/sv-parser-pp/testcases/IEEE18002017_macro_delimit_tokens.sv new file mode 100644 index 0000000..9c60efb --- /dev/null +++ b/sv-parser-pp/testcases/IEEE18002017_macro_delimit_tokens.sv @@ -0,0 +1,7 @@ +/* IEEE1800-2017 Clause 22.5.1 page 680 +*/ + +`define append(f) f``_master + +module `append(clock); +endmodule diff --git a/sv-parser-pp/testcases/IEEE18002017_macro_mix_quotes.sv b/sv-parser-pp/testcases/IEEE18002017_macro_mix_quotes.sv new file mode 100644 index 0000000..0f6e6a0 --- /dev/null +++ b/sv-parser-pp/testcases/IEEE18002017_macro_mix_quotes.sv @@ -0,0 +1,10 @@ +/* IEEE1800-2017 Clause 22.5.1 page 680 +*/ + +`define msg(x,y) `"x: `\`"y`\`"`" + +module a; +initial begin +$display(`msg(left side,right side)); +end +endmodule diff --git a/sv-parser-pp/testcases/IEEE18002017_macro_noexpand_string b/sv-parser-pp/testcases/IEEE18002017_macro_noexpand_string new file mode 100644 index 0000000..bcc6ee3 --- /dev/null +++ b/sv-parser-pp/testcases/IEEE18002017_macro_noexpand_string @@ -0,0 +1,13 @@ +/* IEEE1800-2017 Clause 22.5.1 page 679 +*/ + +module main; +`define HI Hello +`define LO "`HI, world" +`define H(x) "Hello, x" +initial begin + $display("`HI, world"); + $display(`LO); + $display(`H(world)); +end +endmodule diff --git a/sv-parser-pp/testcases/IEEE18002017_macro_with_defaults.sv b/sv-parser-pp/testcases/IEEE18002017_macro_with_defaults.sv new file mode 100644 index 0000000..2a9b2a3 --- /dev/null +++ b/sv-parser-pp/testcases/IEEE18002017_macro_with_defaults.sv @@ -0,0 +1,25 @@ +/* IEEE1800-2017 Clause 22.5.1 page 678 +* NOTE: Illegal cases are not included in this testcase. +* NOTE: Use of EMPTY is suggested on page 679 +*/ + +`define MACRO1(a=5,b="B",c) $display(a,,b,,c); +`define MACRO2(a=5, b, c="C") $display(a,,b,,c); +`define MACRO3(a=5, b=0, c="C") $display(a,,b,,c); + +`define EMPTY + +module m; +initial begin + `MACRO1 ( , 2, 3 ) + `MACRO1 ( 1 , , 3 ) + `MACRO1 ( , 2, ) + `MACRO2 (1, , 3) + `MACRO2 (, 2, ) + `MACRO2 (, 2) + `MACRO3 ( 1 ) + `MACRO3 ( ) + + `MACRO3 (`EMPTY,`EMPTY,`EMPTY) +end +endmodule diff --git a/sv-parser-pp/testcases/IEEE18002017_macro_without_defaults.sv b/sv-parser-pp/testcases/IEEE18002017_macro_without_defaults.sv new file mode 100644 index 0000000..ac42b01 --- /dev/null +++ b/sv-parser-pp/testcases/IEEE18002017_macro_without_defaults.sv @@ -0,0 +1,15 @@ +/* IEEE1800-2017 Clause 22.5.1 page 677 +* NOTE: Illegal cases are not included in this testcase. +*/ + +`define D(x,y) initial $display("start", x , y, "end"); + +module m; +initial begin + `D( "msg1" , "msg2" ) + `D( " msg1", ) + `D(, "msg2 ") + `D(,) + `D( , ) +end +endmodule diff --git a/sv-parser-pp/testcases/expected/IEEE18002017_macro_argument_expansion.sv b/sv-parser-pp/testcases/expected/IEEE18002017_macro_argument_expansion.sv new file mode 100644 index 0000000..2688806 --- /dev/null +++ b/sv-parser-pp/testcases/expected/IEEE18002017_macro_argument_expansion.sv @@ -0,0 +1,10 @@ +/* IEEE1800-2017 Clause 22.5.1 page 679 +*/ + +`define max(a,b)((a) > (b) ? (a) : (b)) +`define TOP(a,b) a + b + +module m; +assign n = ((p+q) > (r+s) ? (p+q) : (r+s)) ; +assign z = b + 1 + 42 + a; +endmodule diff --git a/sv-parser-pp/testcases/expected/IEEE18002017_macro_delimit_tokens.sv b/sv-parser-pp/testcases/expected/IEEE18002017_macro_delimit_tokens.sv new file mode 100644 index 0000000..abdd98c --- /dev/null +++ b/sv-parser-pp/testcases/expected/IEEE18002017_macro_delimit_tokens.sv @@ -0,0 +1,7 @@ +/* IEEE1800-2017 Clause 22.5.1 page 680 +*/ + +`define append(f) f``_master + +module clock_master; +endmodule diff --git a/sv-parser-pp/testcases/expected/IEEE18002017_macro_mix_quotes.sv b/sv-parser-pp/testcases/expected/IEEE18002017_macro_mix_quotes.sv new file mode 100644 index 0000000..6c7dd6d --- /dev/null +++ b/sv-parser-pp/testcases/expected/IEEE18002017_macro_mix_quotes.sv @@ -0,0 +1,10 @@ +/* IEEE1800-2017 Clause 22.5.1 page 680 +*/ + +`define msg(x,y) `"x: `\`"y`\`"`" + +module a; +initial begin +$display("left side: \"right side\""); +end +endmodule diff --git a/sv-parser-pp/testcases/expected/IEEE18002017_macro_noexpand_string.sv b/sv-parser-pp/testcases/expected/IEEE18002017_macro_noexpand_string.sv new file mode 100644 index 0000000..27ec41d --- /dev/null +++ b/sv-parser-pp/testcases/expected/IEEE18002017_macro_noexpand_string.sv @@ -0,0 +1,13 @@ +/* IEEE1800-2017 Clause 22.5.1 page 679 +*/ + +module main; +`define HI Hello +`define LO "`HI, world" +`define H(x) "Hello, x" +initial begin + $display("`HI, world"); + $display("`HI, world"); + $display("Hello, x"); +end +endmodule diff --git a/sv-parser-pp/testcases/expected/IEEE18002017_macro_with_defaults.sv b/sv-parser-pp/testcases/expected/IEEE18002017_macro_with_defaults.sv new file mode 100644 index 0000000..3090454 --- /dev/null +++ b/sv-parser-pp/testcases/expected/IEEE18002017_macro_with_defaults.sv @@ -0,0 +1,25 @@ +/* IEEE1800-2017 Clause 22.5.1 page 678 +* NOTE: Illegal cases are not included in this testcase. +* NOTE: Use of EMPTY is suggested on page 679 +*/ + +`define MACRO1(a=5,b="B",c) $display(a,,b,,c); +`define MACRO2(a=5, b, c="C") $display(a,,b,,c); +`define MACRO3(a=5, b=0, c="C") $display(a,,b,,c); + +`define EMPTY + +module m; +initial begin + $display(5,,2,,3); + $display(1,,"B",,3); + $display(5,,2,,); + $display(1,,,,3); + $display(5,,2,,"C"); + $display(5,,2,,"C"); + $display(1,,0,,"C"); + $display(5,,0,,"C"); + + $display(,,,,); +end +endmodule diff --git a/sv-parser-pp/testcases/expected/IEEE18002017_macro_without_defaults.sv b/sv-parser-pp/testcases/expected/IEEE18002017_macro_without_defaults.sv new file mode 100644 index 0000000..87c3ea3 --- /dev/null +++ b/sv-parser-pp/testcases/expected/IEEE18002017_macro_without_defaults.sv @@ -0,0 +1,15 @@ +/* IEEE1800-2017 Clause 22.5.1 page 677 +* NOTE: Illegal cases are not included in this testcase. +*/ + +`define D(x,y) initial $display("start", x , y, "end"); + +module m; +initial begin + $display("start", "msg1" , "msg2", "end"); + $display("start", " msg1" , , "end"); + $display("start", , "msg2 ", "end"); + $display("start", , , "end"); + $display("start", , , "end"); +end +endmodule From bed9b08f937e20b3a9ae159b74bf38282b3e8f10 Mon Sep 17 00:00:00 2001 From: damc Date: Thu, 21 Jul 2022 10:56:54 +0200 Subject: [PATCH 05/62] ppTests mv escaped_identifier --- sv-parser-pp/src/preprocess.rs | 4 ++-- sv-parser-pp/testcases/{test12.sv => escaped_identifier.sv} | 0 .../expected/{escaped_identifier => escaped_identifier.sv} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename sv-parser-pp/testcases/{test12.sv => escaped_identifier.sv} (100%) rename sv-parser-pp/testcases/expected/{escaped_identifier => escaped_identifier.sv} (100%) diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 0d36ca5..344feef 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -1095,7 +1095,7 @@ mod tests { #[test] fn escaped_identifier() { let (ret, _) = preprocess( - testfile_path("test12.sv"), + testfile_path("escaped_identifier.sv"), &HashMap::new(), &[] as &[String], false, @@ -1104,7 +1104,7 @@ mod tests { .unwrap(); assert_eq!( ret.text(), - testfile_contents("expected/escaped_identifier") + testfile_contents("expected/escaped_identifier.sv") ); } diff --git a/sv-parser-pp/testcases/test12.sv b/sv-parser-pp/testcases/escaped_identifier.sv similarity index 100% rename from sv-parser-pp/testcases/test12.sv rename to sv-parser-pp/testcases/escaped_identifier.sv diff --git a/sv-parser-pp/testcases/expected/escaped_identifier b/sv-parser-pp/testcases/expected/escaped_identifier.sv similarity index 100% rename from sv-parser-pp/testcases/expected/escaped_identifier rename to sv-parser-pp/testcases/expected/escaped_identifier.sv From c16de493ab253c0415505789afed1b217c7cffad Mon Sep 17 00:00:00 2001 From: damc Date: Thu, 21 Jul 2022 10:58:34 +0200 Subject: [PATCH 06/62] ppTests mv ifdef_nested --- sv-parser-pp/src/preprocess.rs | 4 ++-- .../testcases/expected/{ifdef_nested => ifdef_nested.sv} | 0 sv-parser-pp/testcases/{test14.sv => ifdef_nested.sv} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename sv-parser-pp/testcases/expected/{ifdef_nested => ifdef_nested.sv} (100%) rename sv-parser-pp/testcases/{test14.sv => ifdef_nested.sv} (100%) diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 344feef..889ee7e 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -1127,7 +1127,7 @@ mod tests { #[test] fn ifdef_nested() { let (ret, _) = preprocess( - testfile_path("test14.sv"), + testfile_path("ifdef_nested.sv"), &HashMap::new(), &[] as &[String], false, @@ -1136,7 +1136,7 @@ mod tests { .unwrap(); assert_eq!( ret.text(), - testfile_contents("expected/ifdef_nested") + testfile_contents("expected/ifdef_nested.sv") ); } diff --git a/sv-parser-pp/testcases/expected/ifdef_nested b/sv-parser-pp/testcases/expected/ifdef_nested.sv similarity index 100% rename from sv-parser-pp/testcases/expected/ifdef_nested rename to sv-parser-pp/testcases/expected/ifdef_nested.sv diff --git a/sv-parser-pp/testcases/test14.sv b/sv-parser-pp/testcases/ifdef_nested.sv similarity index 100% rename from sv-parser-pp/testcases/test14.sv rename to sv-parser-pp/testcases/ifdef_nested.sv From c64a151583568d728138bcf79c1b401a1e8df93e Mon Sep 17 00:00:00 2001 From: damc Date: Thu, 21 Jul 2022 12:09:21 +0200 Subject: [PATCH 07/62] ppTests ifdef_undefined,ifdef_predefined --- sv-parser-pp/src/preprocess.rs | 10 +++++----- .../expected/{ifdef_predefined => ifdef_predefined.sv} | 0 .../expected/{ifdef_undefined => ifdef_undefined.sv} | 0 .../testcases/{test1.sv => ifdef_predefined.sv} | 0 sv-parser-pp/testcases/ifdef_undefined.sv | 10 ++++++++++ 5 files changed, 15 insertions(+), 5 deletions(-) rename sv-parser-pp/testcases/expected/{ifdef_predefined => ifdef_predefined.sv} (100%) rename sv-parser-pp/testcases/expected/{ifdef_undefined => ifdef_undefined.sv} (100%) rename sv-parser-pp/testcases/{test1.sv => ifdef_predefined.sv} (100%) create mode 100644 sv-parser-pp/testcases/ifdef_undefined.sv diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 889ee7e..572127a 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -874,7 +874,7 @@ mod tests { #[test] fn ifdef_undefined() { let (ret, _) = preprocess( - testfile_path("test1.sv"), + testfile_path("ifdef_undefined.sv"), &HashMap::new(), &[] as &[String], false, @@ -883,11 +883,11 @@ mod tests { .unwrap(); assert_eq!( ret.text(), - testfile_contents("expected/ifdef_undefined") + testfile_contents("expected/ifdef_undefined.sv") ); assert_eq!( ret.origin(10).unwrap().0, - &PathBuf::from(testfile_path("test1.sv")) + &PathBuf::from(testfile_path("ifdef_undefined.sv")) ); assert_eq!(ret.origin(10).unwrap().1, 10); assert_eq!(ret.origin(50).unwrap().1, 98); @@ -899,7 +899,7 @@ mod tests { let mut defines = HashMap::new(); defines.insert(String::from("behavioral"), None); let (ret, _) = preprocess( - testfile_path("test1.sv"), + testfile_path("ifdef_predefined.sv"), &defines, &[] as &[String], false, @@ -908,7 +908,7 @@ mod tests { .unwrap(); assert_eq!( ret.text(), - testfile_contents("expected/ifdef_predefined") + testfile_contents("expected/ifdef_predefined.sv") ) } diff --git a/sv-parser-pp/testcases/expected/ifdef_predefined b/sv-parser-pp/testcases/expected/ifdef_predefined.sv similarity index 100% rename from sv-parser-pp/testcases/expected/ifdef_predefined rename to sv-parser-pp/testcases/expected/ifdef_predefined.sv diff --git a/sv-parser-pp/testcases/expected/ifdef_undefined b/sv-parser-pp/testcases/expected/ifdef_undefined.sv similarity index 100% rename from sv-parser-pp/testcases/expected/ifdef_undefined rename to sv-parser-pp/testcases/expected/ifdef_undefined.sv diff --git a/sv-parser-pp/testcases/test1.sv b/sv-parser-pp/testcases/ifdef_predefined.sv similarity index 100% rename from sv-parser-pp/testcases/test1.sv rename to sv-parser-pp/testcases/ifdef_predefined.sv diff --git a/sv-parser-pp/testcases/ifdef_undefined.sv b/sv-parser-pp/testcases/ifdef_undefined.sv new file mode 100644 index 0000000..51567d5 --- /dev/null +++ b/sv-parser-pp/testcases/ifdef_undefined.sv @@ -0,0 +1,10 @@ +module and_op (a, b, c); +output a; +input b, c; + +`ifdef behavioral + wire a = b & c; +`else + and a1 (a,b,c); +`endif +endmodule From c78276b906e7edc2b5c67ecf39bb4d2c0f56f3db Mon Sep 17 00:00:00 2001 From: damc Date: Thu, 21 Jul 2022 12:15:52 +0200 Subject: [PATCH 08/62] ppTests include_origin,include_ignore --- sv-parser-pp/src/preprocess.rs | 14 +++++++------- .../{ignore_include => include_include.sv} | 0 .../expected/{include_origin => include_origin.sv} | 0 .../testcases/{test2.sv => include_ignore.sv} | 0 sv-parser-pp/testcases/include_origin.sv | 3 +++ 5 files changed, 10 insertions(+), 7 deletions(-) rename sv-parser-pp/testcases/expected/{ignore_include => include_include.sv} (100%) rename sv-parser-pp/testcases/expected/{include_origin => include_origin.sv} (100%) rename sv-parser-pp/testcases/{test2.sv => include_ignore.sv} (100%) create mode 100644 sv-parser-pp/testcases/include_origin.sv diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 572127a..8564242 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -916,7 +916,7 @@ mod tests { fn include_origin() { let include_paths = [testfile_path("")]; let (ret, _) = preprocess( - testfile_path("test2.sv"), + testfile_path("include_origin.sv"), &HashMap::new(), &include_paths, false, @@ -925,11 +925,11 @@ mod tests { .unwrap(); assert_eq!( ret.text(), - testfile_contents("expected/include_origin") + testfile_contents("expected/include_origin.sv") ); assert_eq!( ret.origin(10).unwrap().0, - &PathBuf::from(testfile_path("test2.sv")) + &PathBuf::from(testfile_path("include_origin.sv")) ); assert_eq!(ret.origin(10).unwrap().1, 10); assert_eq!( @@ -939,16 +939,16 @@ mod tests { assert_eq!(ret.origin(50).unwrap().1, 73); assert_eq!( ret.origin(70).unwrap().0, - &PathBuf::from(testfile_path("test2.sv")) + &PathBuf::from(testfile_path("include_origin.sv")) ); assert_eq!(ret.origin(70).unwrap().1, 50); } #[test] - fn ignore_include() { + fn include_ignore() { let include_paths = [testfile_path("")]; let (ret, _) = preprocess( - testfile_path("test2.sv"), + testfile_path("include_ignore.sv"), &HashMap::new(), &include_paths, false, @@ -957,7 +957,7 @@ mod tests { .unwrap(); assert_eq!( ret.text(), - testfile_contents("expected/ignore_include") + testfile_contents("expected/include_ignore.sv") ); } diff --git a/sv-parser-pp/testcases/expected/ignore_include b/sv-parser-pp/testcases/expected/include_include.sv similarity index 100% rename from sv-parser-pp/testcases/expected/ignore_include rename to sv-parser-pp/testcases/expected/include_include.sv diff --git a/sv-parser-pp/testcases/expected/include_origin b/sv-parser-pp/testcases/expected/include_origin.sv similarity index 100% rename from sv-parser-pp/testcases/expected/include_origin rename to sv-parser-pp/testcases/expected/include_origin.sv diff --git a/sv-parser-pp/testcases/test2.sv b/sv-parser-pp/testcases/include_ignore.sv similarity index 100% rename from sv-parser-pp/testcases/test2.sv rename to sv-parser-pp/testcases/include_ignore.sv diff --git a/sv-parser-pp/testcases/include_origin.sv b/sv-parser-pp/testcases/include_origin.sv new file mode 100644 index 0000000..873c201 --- /dev/null +++ b/sv-parser-pp/testcases/include_origin.sv @@ -0,0 +1,3 @@ +module and_op (a, b, c); +`include "test2.svh" +endmodule From a3d4898ec20309bdc6892d47645089128e8408bd Mon Sep 17 00:00:00 2001 From: damc Date: Thu, 21 Jul 2022 12:19:05 +0200 Subject: [PATCH 09/62] ppTests mv ifndef_undefined --- sv-parser-pp/src/preprocess.rs | 4 ++-- .../expected/{ifndef_undefined => ifndef_undefined.sv} | 0 sv-parser-pp/testcases/{test18.sv => ifndef_undefined.sv} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename sv-parser-pp/testcases/expected/{ifndef_undefined => ifndef_undefined.sv} (100%) rename sv-parser-pp/testcases/{test18.sv => ifndef_undefined.sv} (100%) diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 8564242..7ee2248 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -1191,7 +1191,7 @@ mod tests { #[test] fn ifndef_undefined() { let (ret, _) = preprocess( - testfile_path("test18.sv"), + testfile_path("ifndef_undefined.sv"), &HashMap::new(), &[] as &[String], false, @@ -1200,7 +1200,7 @@ mod tests { .unwrap(); assert_eq!( ret.text(), - testfile_contents("expected/ifndef_undefined") + testfile_contents("expected/ifndef_undefined.sv") ); } diff --git a/sv-parser-pp/testcases/expected/ifndef_undefined b/sv-parser-pp/testcases/expected/ifndef_undefined.sv similarity index 100% rename from sv-parser-pp/testcases/expected/ifndef_undefined rename to sv-parser-pp/testcases/expected/ifndef_undefined.sv diff --git a/sv-parser-pp/testcases/test18.sv b/sv-parser-pp/testcases/ifndef_undefined.sv similarity index 100% rename from sv-parser-pp/testcases/test18.sv rename to sv-parser-pp/testcases/ifndef_undefined.sv From 12d43f837380f4cc993e058baf4e97b594e63fb2 Mon Sep 17 00:00:00 2001 From: damc Date: Thu, 21 Jul 2022 12:20:28 +0200 Subject: [PATCH 10/62] ppTests mv macro_LINE --- sv-parser-pp/src/preprocess.rs | 4 ++-- sv-parser-pp/testcases/expected/{macro_LINE => macro_LINE.sv} | 0 sv-parser-pp/testcases/{test11.sv => macro_LINE.sv} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename sv-parser-pp/testcases/expected/{macro_LINE => macro_LINE.sv} (100%) rename sv-parser-pp/testcases/{test11.sv => macro_LINE.sv} (100%) diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 7ee2248..1b142e3 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -1079,7 +1079,7 @@ mod tests { #[allow(non_snake_case)] fn macro_LINE() { let (ret, _) = preprocess( - testfile_path("test11.sv"), + testfile_path("macro_LINE.sv"), &HashMap::new(), &[] as &[String], false, @@ -1088,7 +1088,7 @@ mod tests { .unwrap(); assert_eq!( ret.text(), - testfile_contents("expected/macro_LINE") + testfile_contents("expected/macro_LINE.sv") ); } diff --git a/sv-parser-pp/testcases/expected/macro_LINE b/sv-parser-pp/testcases/expected/macro_LINE.sv similarity index 100% rename from sv-parser-pp/testcases/expected/macro_LINE rename to sv-parser-pp/testcases/expected/macro_LINE.sv diff --git a/sv-parser-pp/testcases/test11.sv b/sv-parser-pp/testcases/macro_LINE.sv similarity index 100% rename from sv-parser-pp/testcases/test11.sv rename to sv-parser-pp/testcases/macro_LINE.sv From 493fa215946279a4eabf7d21c225dfa67cb8108a Mon Sep 17 00:00:00 2001 From: damc Date: Thu, 21 Jul 2022 12:31:44 +0200 Subject: [PATCH 11/62] ppTests mv whitespace_directives --- sv-parser-pp/src/preprocess.rs | 4 ++-- .../{whitespace_directives => whitespace_directives.sv} | 0 .../testcases/{test21.sv => whitespace_directives.sv} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename sv-parser-pp/testcases/expected/{whitespace_directives => whitespace_directives.sv} (100%) rename sv-parser-pp/testcases/{test21.sv => whitespace_directives.sv} (100%) diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 1b142e3..955f38f 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -1274,7 +1274,7 @@ mod tests { fn whitespace_directives() { let include_paths = [testfile_path("")]; let (ret, _) = preprocess( - testfile_path("test21.sv"), + testfile_path("whitespace_directives.sv"), &HashMap::new(), &include_paths, false, @@ -1283,7 +1283,7 @@ mod tests { .unwrap(); assert_eq!( ret.text(), - testfile_contents("expected/whitespace_directives") + testfile_contents("expected/whitespace_directives.sv") ); } } diff --git a/sv-parser-pp/testcases/expected/whitespace_directives b/sv-parser-pp/testcases/expected/whitespace_directives.sv similarity index 100% rename from sv-parser-pp/testcases/expected/whitespace_directives rename to sv-parser-pp/testcases/expected/whitespace_directives.sv diff --git a/sv-parser-pp/testcases/test21.sv b/sv-parser-pp/testcases/whitespace_directives.sv similarity index 100% rename from sv-parser-pp/testcases/test21.sv rename to sv-parser-pp/testcases/whitespace_directives.sv From b9f90114dafab2f321b5dc6b6d0259802d26ef65 Mon Sep 17 00:00:00 2001 From: damc Date: Thu, 21 Jul 2022 12:33:57 +0200 Subject: [PATCH 12/62] ppTests mv macro_parameters_multiline --- sv-parser-pp/src/preprocess.rs | 4 ++-- ...cro_parameters_multiline => macro_parameters_multiline.sv} | 0 .../testcases/{test4.sv => macro_parameters_multiline.sv} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename sv-parser-pp/testcases/expected/{macro_parameters_multiline => macro_parameters_multiline.sv} (100%) rename sv-parser-pp/testcases/{test4.sv => macro_parameters_multiline.sv} (100%) diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 955f38f..978355e 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -980,7 +980,7 @@ mod tests { #[test] fn macro_parameters_multiline() { let (ret, _) = preprocess( - testfile_path("test4.sv"), + testfile_path("macro_parameters_multiline.sv"), &HashMap::new(), &[] as &[String], false, @@ -989,7 +989,7 @@ mod tests { .unwrap(); assert_eq!( ret.text(), - testfile_contents("expected/macro_parameters_multiline") + testfile_contents("expected/macro_parameters_multiline.sv") ); } diff --git a/sv-parser-pp/testcases/expected/macro_parameters_multiline b/sv-parser-pp/testcases/expected/macro_parameters_multiline.sv similarity index 100% rename from sv-parser-pp/testcases/expected/macro_parameters_multiline rename to sv-parser-pp/testcases/expected/macro_parameters_multiline.sv diff --git a/sv-parser-pp/testcases/test4.sv b/sv-parser-pp/testcases/macro_parameters_multiline.sv similarity index 100% rename from sv-parser-pp/testcases/test4.sv rename to sv-parser-pp/testcases/macro_parameters_multiline.sv From 60e46303c50596f5482a396fbca4d098c41ffd6c Mon Sep 17 00:00:00 2001 From: damc Date: Thu, 21 Jul 2022 12:36:35 +0200 Subject: [PATCH 13/62] ppTests mv macro_parameters_defaultvalue --- sv-parser-pp/src/preprocess.rs | 4 ++-- ...rameters_defaultvalue => macro_parameters_defaultvalue.sv} | 0 .../testcases/{test3.sv => macro_parameters_defaultvalue.sv} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename sv-parser-pp/testcases/expected/{macro_parameters_defaultvalue => macro_parameters_defaultvalue.sv} (100%) rename sv-parser-pp/testcases/{test3.sv => macro_parameters_defaultvalue.sv} (100%) diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 978355e..c697715 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -964,7 +964,7 @@ mod tests { #[test] fn macro_parameters_defaultvalue() { let (ret, _) = preprocess( - testfile_path("test3.sv"), + testfile_path("macro_parameters_defaultvalue.sv"), &HashMap::new(), &[] as &[String], false, @@ -973,7 +973,7 @@ mod tests { .unwrap(); assert_eq!( ret.text(), - testfile_contents("expected/macro_parameters_defaultvalue") + testfile_contents("expected/macro_parameters_defaultvalue.sv") ); } diff --git a/sv-parser-pp/testcases/expected/macro_parameters_defaultvalue b/sv-parser-pp/testcases/expected/macro_parameters_defaultvalue.sv similarity index 100% rename from sv-parser-pp/testcases/expected/macro_parameters_defaultvalue rename to sv-parser-pp/testcases/expected/macro_parameters_defaultvalue.sv diff --git a/sv-parser-pp/testcases/test3.sv b/sv-parser-pp/testcases/macro_parameters_defaultvalue.sv similarity index 100% rename from sv-parser-pp/testcases/test3.sv rename to sv-parser-pp/testcases/macro_parameters_defaultvalue.sv From e84429600f63fce092445a187f563b7abf4e45cc Mon Sep 17 00:00:00 2001 From: damc Date: Thu, 21 Jul 2022 12:38:41 +0200 Subject: [PATCH 14/62] ppTests mv macro_recursion_direct --- sv-parser-pp/src/preprocess.rs | 4 ++-- .../testcases/{test7.sv => macro_recursion_direct.sv} | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename sv-parser-pp/testcases/{test7.sv => macro_recursion_direct.sv} (100%) diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index c697715..df850a3 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -1026,9 +1026,9 @@ mod tests { } #[test] - fn macro_direct_recursion() { + fn macro_recursion_direct() { let ret = preprocess( - testfile_path("test7.sv"), + testfile_path("macro_recursion_direct.sv"), &HashMap::new(), &[] as &[String], false, diff --git a/sv-parser-pp/testcases/test7.sv b/sv-parser-pp/testcases/macro_recursion_direct.sv similarity index 100% rename from sv-parser-pp/testcases/test7.sv rename to sv-parser-pp/testcases/macro_recursion_direct.sv From c375b4658f55b3fdb60e1a8633801149adc53411 Mon Sep 17 00:00:00 2001 From: damc Date: Thu, 21 Jul 2022 12:39:32 +0200 Subject: [PATCH 15/62] ppTests mv macro_recursion_indirect --- sv-parser-pp/src/preprocess.rs | 4 ++-- .../testcases/{test8.sv => macro_recursion_indirect.sv} | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename sv-parser-pp/testcases/{test8.sv => macro_recursion_indirect.sv} (100%) diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index df850a3..b1aae53 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -1038,9 +1038,9 @@ mod tests { } #[test] - fn macro_indirect_recursion() { + fn macro_recursion_indirect() { let ret = preprocess( - testfile_path("test8.sv"), + testfile_path("macro_recursion_indirect.sv"), &HashMap::new(), &[] as &[String], false, diff --git a/sv-parser-pp/testcases/test8.sv b/sv-parser-pp/testcases/macro_recursion_indirect.sv similarity index 100% rename from sv-parser-pp/testcases/test8.sv rename to sv-parser-pp/testcases/macro_recursion_indirect.sv From 25783f05896e59f0f4a9f4f4473ee0b4c7764443 Mon Sep 17 00:00:00 2001 From: damc Date: Thu, 21 Jul 2022 12:41:13 +0200 Subject: [PATCH 16/62] ppTests mv include_sameline_include --- sv-parser-pp/src/preprocess.rs | 2 +- .../testcases/{test9.sv => include_sameline_include.sv} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename sv-parser-pp/testcases/{test9.sv => include_sameline_include.sv} (100%) diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index b1aae53..30252c4 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -1053,7 +1053,7 @@ mod tests { fn include_sameline_include() { let include_paths = [testfile_path("")]; let ret = preprocess( - testfile_path("test9.sv"), + testfile_path("include_sameline_include.sv"), &HashMap::new(), &include_paths, false, diff --git a/sv-parser-pp/testcases/test9.sv b/sv-parser-pp/testcases/include_sameline_include.sv similarity index 100% rename from sv-parser-pp/testcases/test9.sv rename to sv-parser-pp/testcases/include_sameline_include.sv From 2635d271935c2a318653f8d093a0d0237d863f8b Mon Sep 17 00:00:00 2001 From: damc Date: Thu, 21 Jul 2022 12:42:14 +0200 Subject: [PATCH 17/62] ppTests mv include_sameline_keyword --- sv-parser-pp/src/preprocess.rs | 2 +- .../testcases/{test10.sv => include_sameline_keyword.sv} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename sv-parser-pp/testcases/{test10.sv => include_sameline_keyword.sv} (100%) diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 30252c4..f9f32c1 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -1066,7 +1066,7 @@ mod tests { fn include_sameline_keyword() { let include_paths = [testfile_path("")]; let ret = preprocess( - testfile_path("test10.sv"), + testfile_path("include_sameline_keyword.sv"), &HashMap::new(), &include_paths, false, diff --git a/sv-parser-pp/testcases/test10.sv b/sv-parser-pp/testcases/include_sameline_keyword.sv similarity index 100% rename from sv-parser-pp/testcases/test10.sv rename to sv-parser-pp/testcases/include_sameline_keyword.sv From dca16d22b81cf6cb06fcfd64d563e3347d6d26df Mon Sep 17 00:00:00 2001 From: damc Date: Thu, 21 Jul 2022 12:51:16 +0200 Subject: [PATCH 18/62] ppTests mv include_sameline_comment --- sv-parser-pp/src/preprocess.rs | 10 +++++----- ...nclude_with_comment => include_sameline_comment.sv} | 0 .../{test19.sv => include_sameline_comment.sv} | 0 3 files changed, 5 insertions(+), 5 deletions(-) rename sv-parser-pp/testcases/expected/{whitespace_include_with_comment => include_sameline_comment.sv} (100%) rename sv-parser-pp/testcases/{test19.sv => include_sameline_comment.sv} (100%) diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index f9f32c1..14e11bc 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -1205,10 +1205,10 @@ mod tests { } #[test] - fn whitespace_include_with_comment() { + fn include_sameline_comment() { let include_paths = [testfile_path("")]; let (ret, _) = preprocess( - testfile_path("test19.sv"), + testfile_path("include_sameline_comment.sv"), &HashMap::new(), &include_paths, false, @@ -1217,11 +1217,11 @@ mod tests { .unwrap(); assert_eq!( ret.text(), - testfile_contents("expected/whitespace_include_with_comment") + testfile_contents("expected/include_sameline_comment.sv") ); assert_eq!( ret.origin(10).unwrap().0, - &PathBuf::from(testfile_path("test19.sv")) + &PathBuf::from(testfile_path("include_sameline_comment.sv")) ); assert_eq!(ret.origin(10).unwrap().1, 10); assert_eq!( @@ -1231,7 +1231,7 @@ mod tests { assert_eq!(ret.origin(50).unwrap().1, 73); assert_eq!( ret.origin(70).unwrap().0, - &PathBuf::from(testfile_path("test19.sv")) + &PathBuf::from(testfile_path("include_sameline_comment.sv")) ); assert_eq!(ret.origin(70).unwrap().1, 50); } diff --git a/sv-parser-pp/testcases/expected/whitespace_include_with_comment b/sv-parser-pp/testcases/expected/include_sameline_comment.sv similarity index 100% rename from sv-parser-pp/testcases/expected/whitespace_include_with_comment rename to sv-parser-pp/testcases/expected/include_sameline_comment.sv diff --git a/sv-parser-pp/testcases/test19.sv b/sv-parser-pp/testcases/include_sameline_comment.sv similarity index 100% rename from sv-parser-pp/testcases/test19.sv rename to sv-parser-pp/testcases/include_sameline_comment.sv From e4b2fdbc49be2477c0ec7f35678594366e621c31 Mon Sep 17 00:00:00 2001 From: damc Date: Thu, 21 Jul 2022 12:57:56 +0200 Subject: [PATCH 19/62] ppTests mv include_basic --- sv-parser-pp/src/preprocess.rs | 10 +++++----- .../expected/{whitespace_include => include_basic.sv} | 0 sv-parser-pp/testcases/{test20.sv => include_basic.sv} | 0 3 files changed, 5 insertions(+), 5 deletions(-) rename sv-parser-pp/testcases/expected/{whitespace_include => include_basic.sv} (100%) rename sv-parser-pp/testcases/{test20.sv => include_basic.sv} (100%) diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 14e11bc..132a0a5 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -1237,10 +1237,10 @@ mod tests { } #[test] - fn whitespace_include() { + fn include_basic() { let include_paths = [testfile_path("")]; let (ret, _) = preprocess( - testfile_path("test20.sv"), + testfile_path("include_basic.sv"), &HashMap::new(), &include_paths, false, @@ -1249,11 +1249,11 @@ mod tests { .unwrap(); assert_eq!( ret.text(), - testfile_contents("expected/whitespace_include") + testfile_contents("expected/include_basic.sv") ); assert_eq!( ret.origin(10).unwrap().0, - &PathBuf::from(testfile_path("test20.sv")) + &PathBuf::from(testfile_path("include_basic.sv")) ); assert_eq!(ret.origin(10).unwrap().1, 10); assert_eq!( @@ -1263,7 +1263,7 @@ mod tests { assert_eq!(ret.origin(60).unwrap().1, 74); assert_eq!( ret.origin(80).unwrap().0, - &PathBuf::from(testfile_path("test20.sv")) + &PathBuf::from(testfile_path("include_basic.sv")) ); assert_eq!(ret.origin(80).unwrap().1, 60); } diff --git a/sv-parser-pp/testcases/expected/whitespace_include b/sv-parser-pp/testcases/expected/include_basic.sv similarity index 100% rename from sv-parser-pp/testcases/expected/whitespace_include rename to sv-parser-pp/testcases/expected/include_basic.sv diff --git a/sv-parser-pp/testcases/test20.sv b/sv-parser-pp/testcases/include_basic.sv similarity index 100% rename from sv-parser-pp/testcases/test20.sv rename to sv-parser-pp/testcases/include_basic.sv From 81e3d1ea1121466b874f0f169684c7f86e414dcd Mon Sep 17 00:00:00 2001 From: damc Date: Thu, 21 Jul 2022 13:02:42 +0200 Subject: [PATCH 20/62] ppTests mv macro_multiline_comment --- sv-parser-pp/src/preprocess.rs | 6 +++--- .../{macro_multiline => macro_multiline_comment.sv} | 6 ++++-- .../testcases/{test17.sv => macro_multiline_comment.sv} | 0 3 files changed, 7 insertions(+), 5 deletions(-) rename sv-parser-pp/testcases/expected/{macro_multiline => macro_multiline_comment.sv} (67%) rename sv-parser-pp/testcases/{test17.sv => macro_multiline_comment.sv} (100%) diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 132a0a5..4a1c898 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -1173,9 +1173,9 @@ mod tests { } #[test] - fn macro_multiline() { + fn macro_multiline_comment() { let (ret, _) = preprocess( - testfile_path("test17.sv"), + testfile_path("macro_multiline_comment.sv"), &HashMap::new(), &[] as &[String], false, @@ -1184,7 +1184,7 @@ mod tests { .unwrap(); assert_eq!( ret.text(), - testfile_contents("expected/macro_multiline") + testfile_contents("expected/macro_multiline_comment.sv") ); } diff --git a/sv-parser-pp/testcases/expected/macro_multiline b/sv-parser-pp/testcases/expected/macro_multiline_comment.sv similarity index 67% rename from sv-parser-pp/testcases/expected/macro_multiline rename to sv-parser-pp/testcases/expected/macro_multiline_comment.sv index ef5f745..85ed300 100644 --- a/sv-parser-pp/testcases/expected/macro_multiline +++ b/sv-parser-pp/testcases/expected/macro_multiline_comment.sv @@ -4,5 +4,7 @@ module test(); -initial begin - end endmodule +initial begin + end + +endmodule diff --git a/sv-parser-pp/testcases/test17.sv b/sv-parser-pp/testcases/macro_multiline_comment.sv similarity index 100% rename from sv-parser-pp/testcases/test17.sv rename to sv-parser-pp/testcases/macro_multiline_comment.sv From 637e970b130072ccec02fbc9f165882e02c11167 Mon Sep 17 00:00:00 2001 From: damc Date: Thu, 21 Jul 2022 13:07:29 +0200 Subject: [PATCH 21/62] ppTests mv macro_basic --- sv-parser-pp/src/preprocess.rs | 6 +++--- .../expected/{macro_usage_sameline => macro_basic.sv} | 0 sv-parser-pp/testcases/{test15.sv => macro_basic.sv} | 0 3 files changed, 3 insertions(+), 3 deletions(-) rename sv-parser-pp/testcases/expected/{macro_usage_sameline => macro_basic.sv} (100%) rename sv-parser-pp/testcases/{test15.sv => macro_basic.sv} (100%) diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 4a1c898..d53047c 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -1141,9 +1141,9 @@ mod tests { } #[test] - fn macro_usage_sameline() { + fn macro_basic() { let (ret, _) = preprocess( - testfile_path("test15.sv"), + testfile_path("macro_basic.sv"), &HashMap::new(), &[] as &[String], false, @@ -1152,7 +1152,7 @@ mod tests { .unwrap(); assert_eq!( ret.text(), - testfile_contents("expected/macro_usage_sameline") + testfile_contents("expected/macro_basic.sv") ); } diff --git a/sv-parser-pp/testcases/expected/macro_usage_sameline b/sv-parser-pp/testcases/expected/macro_basic.sv similarity index 100% rename from sv-parser-pp/testcases/expected/macro_usage_sameline rename to sv-parser-pp/testcases/expected/macro_basic.sv diff --git a/sv-parser-pp/testcases/test15.sv b/sv-parser-pp/testcases/macro_basic.sv similarity index 100% rename from sv-parser-pp/testcases/test15.sv rename to sv-parser-pp/testcases/macro_basic.sv From d40374b509619a79ce610a6b5ebb8a1415472ff5 Mon Sep 17 00:00:00 2001 From: damc Date: Thu, 21 Jul 2022 13:08:57 +0200 Subject: [PATCH 22/62] ppTests mv IEEE18002017_macro_noexpand_string --- sv-parser-pp/src/preprocess.rs | 7 ++++--- sv-parser-pp/testcases/test5.sv | 10 ---------- 2 files changed, 4 insertions(+), 13 deletions(-) delete mode 100644 sv-parser-pp/testcases/test5.sv diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index d53047c..09d89cf 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -994,9 +994,10 @@ mod tests { } #[test] - fn macro_parameters_dependent() { + #[allow(non_snake_case)] + fn IEEE18002017_macro_noexpand_string() { let (ret, _) = preprocess( - testfile_path("test5.sv"), + testfile_path("IEEE18002017_macro_noexpand_string.sv"), &HashMap::new(), &[] as &[String], false, @@ -1005,7 +1006,7 @@ mod tests { .unwrap(); assert_eq!( ret.text(), - testfile_contents("expected/macro_parameters_dependent") + testfile_contents("expected/IEEE18002017_macro_noexpand_string.sv") ); } diff --git a/sv-parser-pp/testcases/test5.sv b/sv-parser-pp/testcases/test5.sv deleted file mode 100644 index 662575d..0000000 --- a/sv-parser-pp/testcases/test5.sv +++ /dev/null @@ -1,10 +0,0 @@ -module a; -`define HI Hello -`define LO "`HI, world" -`define H(x) "Hello, x" -initial begin -$display("`HI, world"); -$display(`LO); -$display(`H(world)); -end -endmodule From f4554b062c6a0c2a3a26bc68a94dc5318d2bcde1 Mon Sep 17 00:00:00 2001 From: damc Date: Thu, 21 Jul 2022 13:10:18 +0200 Subject: [PATCH 23/62] ppTests mv IEEE18002017_macro_mix_quotes --- sv-parser-pp/src/preprocess.rs | 7 ++++--- sv-parser-pp/testcases/test6.sv | 7 ------- 2 files changed, 4 insertions(+), 10 deletions(-) delete mode 100644 sv-parser-pp/testcases/test6.sv diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 09d89cf..c36dea3 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -1011,9 +1011,10 @@ mod tests { } #[test] - fn macro_string_literal() { + #[allow(non_snake_case)] + fn IEEE18002017_macro_mix_quotes() { let (ret, _) = preprocess( - testfile_path("test6.sv"), + testfile_path("IEEE18002017_macro_mix_quotes.sv"), &HashMap::new(), &[] as &[String], false, @@ -1022,7 +1023,7 @@ mod tests { .unwrap(); assert_eq!( ret.text(), - testfile_contents("expected/macro_string_literal") + testfile_contents("expected/IEEE18002017_macro_mix_quotes.sv") ); } diff --git a/sv-parser-pp/testcases/test6.sv b/sv-parser-pp/testcases/test6.sv deleted file mode 100644 index 752c735..0000000 --- a/sv-parser-pp/testcases/test6.sv +++ /dev/null @@ -1,7 +0,0 @@ -`define msg(x,y) `"x: `\`"y`\`"`" - -module a; -initial begin -$display(`msg(left side,right side)); -end -endmodule From 6f752c4cda9e5f2d231062ffb3c08f40d5a2f29c Mon Sep 17 00:00:00 2001 From: damc Date: Thu, 21 Jul 2022 13:11:00 +0200 Subject: [PATCH 24/62] ppTests rm missed expected --- .../testcases/expected/macro_parameters_dependent | 10 ---------- sv-parser-pp/testcases/expected/macro_string_literal | 7 ------- 2 files changed, 17 deletions(-) delete mode 100644 sv-parser-pp/testcases/expected/macro_parameters_dependent delete mode 100644 sv-parser-pp/testcases/expected/macro_string_literal diff --git a/sv-parser-pp/testcases/expected/macro_parameters_dependent b/sv-parser-pp/testcases/expected/macro_parameters_dependent deleted file mode 100644 index 88fa5b2..0000000 --- a/sv-parser-pp/testcases/expected/macro_parameters_dependent +++ /dev/null @@ -1,10 +0,0 @@ -module a; -`define HI Hello -`define LO "`HI, world" -`define H(x) "Hello, x" -initial begin -$display("`HI, world"); -$display("`HI, world" ); -$display("Hello, x" ); -end -endmodule diff --git a/sv-parser-pp/testcases/expected/macro_string_literal b/sv-parser-pp/testcases/expected/macro_string_literal deleted file mode 100644 index 55e81bc..0000000 --- a/sv-parser-pp/testcases/expected/macro_string_literal +++ /dev/null @@ -1,7 +0,0 @@ -`define msg(x,y) `"x: `\`"y`\`"`" - -module a; -initial begin -$display("left side: \"right side\"" ); -end -endmodule From 3e8db79d51229bdf56db4d3f8bed872dcdfbc1eb Mon Sep 17 00:00:00 2001 From: damc Date: Thu, 21 Jul 2022 13:14:24 +0200 Subject: [PATCH 25/62] ppTests mv macro_comment --- sv-parser-pp/src/preprocess.rs | 6 +++--- sv-parser-pp/testcases/expected/macro_comment.sv | 2 ++ sv-parser-pp/testcases/expected/macro_with_comment | 3 --- sv-parser-pp/testcases/macro_comment.sv | 2 ++ sv-parser-pp/testcases/test13.sv | 3 --- 5 files changed, 7 insertions(+), 9 deletions(-) create mode 100644 sv-parser-pp/testcases/expected/macro_comment.sv delete mode 100644 sv-parser-pp/testcases/expected/macro_with_comment create mode 100644 sv-parser-pp/testcases/macro_comment.sv delete mode 100644 sv-parser-pp/testcases/test13.sv diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index c36dea3..9bfcaa6 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -1111,9 +1111,9 @@ mod tests { } #[test] - fn macro_with_comment() { + fn macro_comment() { let (ret, _) = preprocess( - testfile_path("test13.sv"), + testfile_path("macro_comment.sv"), &HashMap::new(), &[] as &[String], false, @@ -1122,7 +1122,7 @@ mod tests { .unwrap(); assert_eq!( ret.text(), - testfile_contents("expected/macro_with_comment") + testfile_contents("expected/macro_comment.sv") ); } diff --git a/sv-parser-pp/testcases/expected/macro_comment.sv b/sv-parser-pp/testcases/expected/macro_comment.sv new file mode 100644 index 0000000..836e665 --- /dev/null +++ b/sv-parser-pp/testcases/expected/macro_comment.sv @@ -0,0 +1,2 @@ +`define A 42 // Comment +interface i #(p = 42) (); endinterface diff --git a/sv-parser-pp/testcases/expected/macro_with_comment b/sv-parser-pp/testcases/expected/macro_with_comment deleted file mode 100644 index 141f2f3..0000000 --- a/sv-parser-pp/testcases/expected/macro_with_comment +++ /dev/null @@ -1,3 +0,0 @@ -`define NAME 42 // Comment -interface foo #(WIDTH = 42 ) (); -endinterface diff --git a/sv-parser-pp/testcases/macro_comment.sv b/sv-parser-pp/testcases/macro_comment.sv new file mode 100644 index 0000000..2adacc4 --- /dev/null +++ b/sv-parser-pp/testcases/macro_comment.sv @@ -0,0 +1,2 @@ +`define A 42 // Comment +interface i #(p = `A) (); endinterface diff --git a/sv-parser-pp/testcases/test13.sv b/sv-parser-pp/testcases/test13.sv deleted file mode 100644 index cda8549..0000000 --- a/sv-parser-pp/testcases/test13.sv +++ /dev/null @@ -1,3 +0,0 @@ -`define NAME 42 // Comment -interface foo #(WIDTH = `NAME) (); -endinterface From e966beb51e29758182e9e16c5c75f352bc42e49f Mon Sep 17 00:00:00 2001 From: damc Date: Thu, 21 Jul 2022 13:18:22 +0200 Subject: [PATCH 26/62] ppTests mv macro_identifier --- sv-parser-pp/src/preprocess.rs | 6 +++--- sv-parser-pp/testcases/expected/macro_backslash | 10 ---------- sv-parser-pp/testcases/expected/macro_identifier.sv | 10 ++++++++++ sv-parser-pp/testcases/macro_identifier.sv | 10 ++++++++++ sv-parser-pp/testcases/test16.sv | 10 ---------- 5 files changed, 23 insertions(+), 23 deletions(-) delete mode 100644 sv-parser-pp/testcases/expected/macro_backslash create mode 100644 sv-parser-pp/testcases/expected/macro_identifier.sv create mode 100644 sv-parser-pp/testcases/macro_identifier.sv delete mode 100644 sv-parser-pp/testcases/test16.sv diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 9bfcaa6..7024cce 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -1159,9 +1159,9 @@ mod tests { } #[test] - fn macro_backslash() { + fn macro_identifier() { let (ret, _) = preprocess( - testfile_path("test16.sv"), + testfile_path("macro_identifier.sv"), &HashMap::new(), &[] as &[String], false, @@ -1170,7 +1170,7 @@ mod tests { .unwrap(); assert_eq!( ret.text(), - testfile_contents("expected/macro_backslash") + testfile_contents("expected/macro_identifier.sv") ); } diff --git a/sv-parser-pp/testcases/expected/macro_backslash b/sv-parser-pp/testcases/expected/macro_backslash deleted file mode 100644 index 26406be..0000000 --- a/sv-parser-pp/testcases/expected/macro_backslash +++ /dev/null @@ -1,10 +0,0 @@ -module a; -`define HELLO0 "HELLO" -`define \HELLO1 "HELLO" -initial begin -$display("HELLO" ); -$display("HELLO" ); -$display("HELLO" ); -$display("HELLO" ); -end -endmodule diff --git a/sv-parser-pp/testcases/expected/macro_identifier.sv b/sv-parser-pp/testcases/expected/macro_identifier.sv new file mode 100644 index 0000000..71e4b1e --- /dev/null +++ b/sv-parser-pp/testcases/expected/macro_identifier.sv @@ -0,0 +1,10 @@ +module a; +`define A "aaa" +`define \B "bbb" +initial begin +$display("aaa"); +$display("aaa"); +$display("bbb"); +$display("bbb"); +end +endmodule diff --git a/sv-parser-pp/testcases/macro_identifier.sv b/sv-parser-pp/testcases/macro_identifier.sv new file mode 100644 index 0000000..36065de --- /dev/null +++ b/sv-parser-pp/testcases/macro_identifier.sv @@ -0,0 +1,10 @@ +module a; +`define A "aaa" +`define \B "bbb" +initial begin +$display(`A); +$display(`\A ); +$display(`B); +$display(`\B ); +end +endmodule diff --git a/sv-parser-pp/testcases/test16.sv b/sv-parser-pp/testcases/test16.sv deleted file mode 100644 index 5c1230e..0000000 --- a/sv-parser-pp/testcases/test16.sv +++ /dev/null @@ -1,10 +0,0 @@ -module a; -`define HELLO0 "HELLO" -`define \HELLO1 "HELLO" -initial begin -$display(`HELLO0); -$display(`\HELLO0 ); -$display(`HELLO1); -$display(`\HELLO1 ); -end -endmodule From 812014ea1615f2d1cce06ed69bd083abb5cc762d Mon Sep 17 00:00:00 2001 From: damc Date: Thu, 21 Jul 2022 13:19:23 +0200 Subject: [PATCH 27/62] ppTests Add two quotes from LRM in split_text(). --- sv-parser-pp/src/preprocess.rs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 7024cce..0a34220 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -676,12 +676,23 @@ fn get_str(node: RefNode, s: &str) -> String { fn split_text(s: &str) -> Vec { let mut is_string = false; let mut is_ident = false; - let mut is_backquote_prev = false; - let mut is_comment = false; let mut is_ident_prev; let mut x = String::from(""); let mut ret = vec![]; + // IEEE1800-2017 Clause 22.5.1, page 676 + // If a one-line comment (that is, a comment specified with the + // characters //) is included in the text, then the comment shall not + // become part of the substituted text. + let mut is_comment = false; + + // IEEE1800-2017 Clause 22.5.1, page 680 + // An `" overrides the usual lexical meaning of " and indicates that the + // expansion shall include the quotation mark, substitution of actual + // arguments, and expansions of embedded macros. + // This allows string literals to be constructed from macro arguments. + let mut is_backquote_prev = false; + let mut iter = s.chars().peekable(); while let Some(c) = iter.next() { is_ident_prev = is_ident; From daa55135bc24e2fa1ff06fb4695c26586371ecdc Mon Sep 17 00:00:00 2001 From: damc Date: Thu, 21 Jul 2022 13:34:23 +0200 Subject: [PATCH 28/62] ppTests MESSY Rearrange tests alphabetically. - This should be the last messy commit. - Renamed and re-arranged tests are now easier to navigate. - Six test failing for different reasons. --- sv-parser-pp/src/preprocess.rs | 526 ++++++++++++++++----------------- 1 file changed, 263 insertions(+), 263 deletions(-) diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 0a34220..5afd447 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -882,6 +882,90 @@ mod tests { contents } + #[test] + fn escaped_identifier() { + let (ret, _) = preprocess( + testfile_path("escaped_identifier.sv"), + &HashMap::new(), + &[] as &[String], + false, + false, + ) + .unwrap(); + assert_eq!( + ret.text(), + testfile_contents("expected/escaped_identifier.sv") + ); + } + + #[test] + #[allow(non_snake_case)] + fn IEEE18002017_macro_mix_quotes() { + let (ret, _) = preprocess( + testfile_path("IEEE18002017_macro_mix_quotes.sv"), + &HashMap::new(), + &[] as &[String], + false, + false, + ) + .unwrap(); + assert_eq!( + ret.text(), + testfile_contents("expected/IEEE18002017_macro_mix_quotes.sv") + ); + } + + #[test] + #[allow(non_snake_case)] + fn IEEE18002017_macro_noexpand_string() { + let (ret, _) = preprocess( + testfile_path("IEEE18002017_macro_noexpand_string.sv"), + &HashMap::new(), + &[] as &[String], + false, + false, + ) + .unwrap(); + assert_eq!( + ret.text(), + testfile_contents("expected/IEEE18002017_macro_noexpand_string.sv") + ); + } + + #[test] + fn ifdef_nested() { + let (ret, _) = preprocess( + testfile_path("ifdef_nested.sv"), + &HashMap::new(), + &[] as &[String], + false, + false, + ) + .unwrap(); + assert_eq!( + ret.text(), + testfile_contents("expected/ifdef_nested.sv") + ); + } + + #[test] + fn ifdef_predefined() { + let mut defines = HashMap::new(); + defines.insert(String::from("behavioral"), None); + let (ret, _) = preprocess( + testfile_path("ifdef_predefined.sv"), + &defines, + &[] as &[String], + false, + false, + ) + .unwrap(); + assert_eq!( + ret.text(), + testfile_contents("expected/ifdef_predefined.sv") + ) + } + #[test] fn ifdef_undefined() { let (ret, _) = preprocess( @@ -906,12 +990,10 @@ mod tests { } #[test] - fn ifdef_predefined() { - let mut defines = HashMap::new(); - defines.insert(String::from("behavioral"), None); + fn ifndef_undefined() { let (ret, _) = preprocess( - testfile_path("ifdef_predefined.sv"), - &defines, + testfile_path("ifndef_undefined.sv"), + &HashMap::new(), &[] as &[String], false, false, @@ -919,8 +1001,57 @@ mod tests { .unwrap(); assert_eq!( ret.text(), - testfile_contents("expected/ifdef_predefined.sv") + testfile_contents("expected/ifndef_undefined.sv") + ); + } + + #[test] + fn include_basic() { + let include_paths = [testfile_path("")]; + let (ret, _) = preprocess( + testfile_path("include_basic.sv"), + &HashMap::new(), + &include_paths, + false, + false, ) + .unwrap(); + assert_eq!( + ret.text(), + testfile_contents("expected/include_basic.sv") + ); + assert_eq!( + ret.origin(10).unwrap().0, + &PathBuf::from(testfile_path("include_basic.sv")) + ); + assert_eq!(ret.origin(10).unwrap().1, 10); + assert_eq!( + ret.origin(60).unwrap().0, + &PathBuf::from(testfile_path("test2.svh")) + ); + assert_eq!(ret.origin(60).unwrap().1, 74); + assert_eq!( + ret.origin(80).unwrap().0, + &PathBuf::from(testfile_path("include_basic.sv")) + ); + assert_eq!(ret.origin(80).unwrap().1, 60); + } + + #[test] + fn include_ignore() { + let include_paths = [testfile_path("")]; + let (ret, _) = preprocess( + testfile_path("include_ignore.sv"), + &HashMap::new(), + &include_paths, + false, + true, + ) + .unwrap(); + assert_eq!( + ret.text(), + testfile_contents("expected/include_ignore.sv") + ); } #[test] @@ -956,19 +1087,141 @@ mod tests { } #[test] - fn include_ignore() { + fn include_sameline_comment() { let include_paths = [testfile_path("")]; let (ret, _) = preprocess( - testfile_path("include_ignore.sv"), + testfile_path("include_sameline_comment.sv"), &HashMap::new(), &include_paths, false, - true, + false, ) .unwrap(); assert_eq!( ret.text(), - testfile_contents("expected/include_ignore.sv") + testfile_contents("expected/include_sameline_comment.sv") + ); + assert_eq!( + ret.origin(10).unwrap().0, + &PathBuf::from(testfile_path("include_sameline_comment.sv")) + ); + assert_eq!(ret.origin(10).unwrap().1, 10); + assert_eq!( + ret.origin(50).unwrap().0, + &PathBuf::from(testfile_path("test2.svh")) + ); + assert_eq!(ret.origin(50).unwrap().1, 73); + assert_eq!( + ret.origin(70).unwrap().0, + &PathBuf::from(testfile_path("include_sameline_comment.sv")) + ); + assert_eq!(ret.origin(70).unwrap().1, 50); + } + + #[test] + fn include_sameline_include() { + let include_paths = [testfile_path("")]; + let ret = preprocess( + testfile_path("include_sameline_include.sv"), + &HashMap::new(), + &include_paths, + false, + false, + ); + assert_eq!(format!("{:?}", ret), "Err(IncludeLine)"); + } + + #[test] + fn include_sameline_keyword() { + let include_paths = [testfile_path("")]; + let ret = preprocess( + testfile_path("include_sameline_keyword.sv"), + &HashMap::new(), + &include_paths, + false, + false, + ); + assert_eq!(format!("{:?}", ret), "Err(IncludeLine)"); + } + + #[test] + fn macro_basic() { + let (ret, _) = preprocess( + testfile_path("macro_basic.sv"), + &HashMap::new(), + &[] as &[String], + false, + false, + ) + .unwrap(); + assert_eq!( + ret.text(), + testfile_contents("expected/macro_basic.sv") + ); + } + + #[test] + fn macro_comment() { + let (ret, _) = preprocess( + testfile_path("macro_comment.sv"), + &HashMap::new(), + &[] as &[String], + false, + false, + ) + .unwrap(); + assert_eq!( + ret.text(), + testfile_contents("expected/macro_comment.sv") + ); + } + + #[test] + fn macro_identifier() { + let (ret, _) = preprocess( + testfile_path("macro_identifier.sv"), + &HashMap::new(), + &[] as &[String], + false, + false, + ) + .unwrap(); + assert_eq!( + ret.text(), + testfile_contents("expected/macro_identifier.sv") + ); + } + + #[test] + #[allow(non_snake_case)] + fn macro_LINE() { + let (ret, _) = preprocess( + testfile_path("macro_LINE.sv"), + &HashMap::new(), + &[] as &[String], + false, + false, + ) + .unwrap(); + assert_eq!( + ret.text(), + testfile_contents("expected/macro_LINE.sv") + ); + } + + #[test] + fn macro_multiline_comment() { + let (ret, _) = preprocess( + testfile_path("macro_multiline_comment.sv"), + &HashMap::new(), + &[] as &[String], + false, + false, + ) + .unwrap(); + assert_eq!( + ret.text(), + testfile_contents("expected/macro_multiline_comment.sv") ); } @@ -1004,40 +1257,6 @@ mod tests { ); } - #[test] - #[allow(non_snake_case)] - fn IEEE18002017_macro_noexpand_string() { - let (ret, _) = preprocess( - testfile_path("IEEE18002017_macro_noexpand_string.sv"), - &HashMap::new(), - &[] as &[String], - false, - false, - ) - .unwrap(); - assert_eq!( - ret.text(), - testfile_contents("expected/IEEE18002017_macro_noexpand_string.sv") - ); - } - - #[test] - #[allow(non_snake_case)] - fn IEEE18002017_macro_mix_quotes() { - let (ret, _) = preprocess( - testfile_path("IEEE18002017_macro_mix_quotes.sv"), - &HashMap::new(), - &[] as &[String], - false, - false, - ) - .unwrap(); - assert_eq!( - ret.text(), - testfile_contents("expected/IEEE18002017_macro_mix_quotes.sv") - ); - } - #[test] fn macro_recursion_direct() { let ret = preprocess( @@ -1062,225 +1281,6 @@ mod tests { assert_eq!(format!("{:?}", ret), "Err(ExceedRecursiveLimit)"); } - #[test] - fn include_sameline_include() { - let include_paths = [testfile_path("")]; - let ret = preprocess( - testfile_path("include_sameline_include.sv"), - &HashMap::new(), - &include_paths, - false, - false, - ); - assert_eq!(format!("{:?}", ret), "Err(IncludeLine)"); - } - - #[test] - fn include_sameline_keyword() { - let include_paths = [testfile_path("")]; - let ret = preprocess( - testfile_path("include_sameline_keyword.sv"), - &HashMap::new(), - &include_paths, - false, - false, - ); - assert_eq!(format!("{:?}", ret), "Err(IncludeLine)"); - } - - #[test] - #[allow(non_snake_case)] - fn macro_LINE() { - let (ret, _) = preprocess( - testfile_path("macro_LINE.sv"), - &HashMap::new(), - &[] as &[String], - false, - false, - ) - .unwrap(); - assert_eq!( - ret.text(), - testfile_contents("expected/macro_LINE.sv") - ); - } - - #[test] - fn escaped_identifier() { - let (ret, _) = preprocess( - testfile_path("escaped_identifier.sv"), - &HashMap::new(), - &[] as &[String], - false, - false, - ) - .unwrap(); - assert_eq!( - ret.text(), - testfile_contents("expected/escaped_identifier.sv") - ); - } - - #[test] - fn macro_comment() { - let (ret, _) = preprocess( - testfile_path("macro_comment.sv"), - &HashMap::new(), - &[] as &[String], - false, - false, - ) - .unwrap(); - assert_eq!( - ret.text(), - testfile_contents("expected/macro_comment.sv") - ); - } - - #[test] - fn ifdef_nested() { - let (ret, _) = preprocess( - testfile_path("ifdef_nested.sv"), - &HashMap::new(), - &[] as &[String], - false, - false, - ) - .unwrap(); - assert_eq!( - ret.text(), - testfile_contents("expected/ifdef_nested.sv") - ); - } - - #[test] - fn macro_basic() { - let (ret, _) = preprocess( - testfile_path("macro_basic.sv"), - &HashMap::new(), - &[] as &[String], - false, - false, - ) - .unwrap(); - assert_eq!( - ret.text(), - testfile_contents("expected/macro_basic.sv") - ); - } - - #[test] - fn macro_identifier() { - let (ret, _) = preprocess( - testfile_path("macro_identifier.sv"), - &HashMap::new(), - &[] as &[String], - false, - false, - ) - .unwrap(); - assert_eq!( - ret.text(), - testfile_contents("expected/macro_identifier.sv") - ); - } - - #[test] - fn macro_multiline_comment() { - let (ret, _) = preprocess( - testfile_path("macro_multiline_comment.sv"), - &HashMap::new(), - &[] as &[String], - false, - false, - ) - .unwrap(); - assert_eq!( - ret.text(), - testfile_contents("expected/macro_multiline_comment.sv") - ); - } - - #[test] - fn ifndef_undefined() { - let (ret, _) = preprocess( - testfile_path("ifndef_undefined.sv"), - &HashMap::new(), - &[] as &[String], - false, - false, - ) - .unwrap(); - assert_eq!( - ret.text(), - testfile_contents("expected/ifndef_undefined.sv") - ); - } - - #[test] - fn include_sameline_comment() { - let include_paths = [testfile_path("")]; - let (ret, _) = preprocess( - testfile_path("include_sameline_comment.sv"), - &HashMap::new(), - &include_paths, - false, - false, - ) - .unwrap(); - assert_eq!( - ret.text(), - testfile_contents("expected/include_sameline_comment.sv") - ); - assert_eq!( - ret.origin(10).unwrap().0, - &PathBuf::from(testfile_path("include_sameline_comment.sv")) - ); - assert_eq!(ret.origin(10).unwrap().1, 10); - assert_eq!( - ret.origin(50).unwrap().0, - &PathBuf::from(testfile_path("test2.svh")) - ); - assert_eq!(ret.origin(50).unwrap().1, 73); - assert_eq!( - ret.origin(70).unwrap().0, - &PathBuf::from(testfile_path("include_sameline_comment.sv")) - ); - assert_eq!(ret.origin(70).unwrap().1, 50); - } - - #[test] - fn include_basic() { - let include_paths = [testfile_path("")]; - let (ret, _) = preprocess( - testfile_path("include_basic.sv"), - &HashMap::new(), - &include_paths, - false, - false, - ) - .unwrap(); - assert_eq!( - ret.text(), - testfile_contents("expected/include_basic.sv") - ); - assert_eq!( - ret.origin(10).unwrap().0, - &PathBuf::from(testfile_path("include_basic.sv")) - ); - assert_eq!(ret.origin(10).unwrap().1, 10); - assert_eq!( - ret.origin(60).unwrap().0, - &PathBuf::from(testfile_path("test2.svh")) - ); - assert_eq!(ret.origin(60).unwrap().1, 74); - assert_eq!( - ret.origin(80).unwrap().0, - &PathBuf::from(testfile_path("include_basic.sv")) - ); - assert_eq!(ret.origin(80).unwrap().1, 60); - } - // Check that preprocess() doesn't introduce extra whitespace within and // around compiler directives. #[test] From c5ba2b457b6f1e49e20bcc216be604a0cbe69d23 Mon Sep 17 00:00:00 2001 From: damc Date: Thu, 21 Jul 2022 13:35:18 +0200 Subject: [PATCH 29/62] ppTests Fix bad filename. --- ...acro_noexpand_string => IEEE18002017_macro_noexpand_string.sv} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sv-parser-pp/testcases/{IEEE18002017_macro_noexpand_string => IEEE18002017_macro_noexpand_string.sv} (100%) diff --git a/sv-parser-pp/testcases/IEEE18002017_macro_noexpand_string b/sv-parser-pp/testcases/IEEE18002017_macro_noexpand_string.sv similarity index 100% rename from sv-parser-pp/testcases/IEEE18002017_macro_noexpand_string rename to sv-parser-pp/testcases/IEEE18002017_macro_noexpand_string.sv From d1e6f6e6af2d87e26f6e7161b69a233c0296df99 Mon Sep 17 00:00:00 2001 From: damc Date: Thu, 21 Jul 2022 13:42:27 +0200 Subject: [PATCH 30/62] ppTests Fix bad filename. --- .../testcases/expected/{include_include.sv => include_ignore.sv} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sv-parser-pp/testcases/expected/{include_include.sv => include_ignore.sv} (100%) diff --git a/sv-parser-pp/testcases/expected/include_include.sv b/sv-parser-pp/testcases/expected/include_ignore.sv similarity index 100% rename from sv-parser-pp/testcases/expected/include_include.sv rename to sv-parser-pp/testcases/expected/include_ignore.sv From f927aee299d22d42b6433d34b599ee8617699e52 Mon Sep 17 00:00:00 2001 From: damc Date: Thu, 21 Jul 2022 13:45:42 +0200 Subject: [PATCH 31/62] ppTests Add missing IEEE18002017_* tests. --- sv-parser-pp/src/preprocess.rs | 68 ++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 5afd447..9922488 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -898,6 +898,40 @@ mod tests { ); } + #[test] + #[allow(non_snake_case)] + fn IEEE18002017_macro_argument_expansion() { + let (ret, _) = preprocess( + testfile_path("IEEE18002017_macro_argument_expansion.sv"), + &HashMap::new(), + &[] as &[String], + false, + false, + ) + .unwrap(); + assert_eq!( + ret.text(), + testfile_contents("expected/IEEE18002017_macro_argument_expansion.sv") + ); + } + + #[test] + #[allow(non_snake_case)] + fn IEEE18002017_macro_delimit_tokens() { + let (ret, _) = preprocess( + testfile_path("IEEE18002017_macro_delimit_tokens.sv"), + &HashMap::new(), + &[] as &[String], + false, + false, + ) + .unwrap(); + assert_eq!( + ret.text(), + testfile_contents("expected/IEEE18002017_macro_delimit_tokens.sv") + ); + } + #[test] #[allow(non_snake_case)] fn IEEE18002017_macro_mix_quotes() { @@ -932,6 +966,40 @@ mod tests { ); } + #[test] + #[allow(non_snake_case)] + fn IEEE18002017_macro_with_defaults() { + let (ret, _) = preprocess( + testfile_path("IEEE18002017_macro_with_defaults.sv"), + &HashMap::new(), + &[] as &[String], + false, + false, + ) + .unwrap(); + assert_eq!( + ret.text(), + testfile_contents("expected/IEEE18002017_macro_with_defaults.sv") + ); + } + + #[test] + #[allow(non_snake_case)] + fn IEEE18002017_macro_without_defaults() { + let (ret, _) = preprocess( + testfile_path("IEEE18002017_macro_without_defaults.sv"), + &HashMap::new(), + &[] as &[String], + false, + false, + ) + .unwrap(); + assert_eq!( + ret.text(), + testfile_contents("expected/IEEE18002017_macro_without_defaults.sv") + ); + } + #[test] fn ifdef_nested() { let (ret, _) = preprocess( From bd1fc19ee8dbe1d98743a0c9261ebbc32b33c96b Mon Sep 17 00:00:00 2001 From: damc Date: Thu, 21 Jul 2022 13:51:51 +0200 Subject: [PATCH 32/62] ppTests Rename test2.svh -> included.svh - 19 pass, 9 fail due to whitespace. - All failures are suspected bugs. --- sv-parser-pp/src/preprocess.rs | 12 ++++++------ sv-parser-pp/testcases/include_basic.sv | 2 +- sv-parser-pp/testcases/include_ignore.sv | 2 +- sv-parser-pp/testcases/include_origin.sv | 2 +- sv-parser-pp/testcases/include_sameline_comment.sv | 2 +- sv-parser-pp/testcases/include_sameline_include.sv | 2 +- sv-parser-pp/testcases/include_sameline_keyword.sv | 2 +- sv-parser-pp/testcases/{test2.svh => included.svh} | 0 8 files changed, 12 insertions(+), 12 deletions(-) rename sv-parser-pp/testcases/{test2.svh => included.svh} (100%) diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 9922488..cafa971 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -1095,14 +1095,14 @@ mod tests { assert_eq!(ret.origin(10).unwrap().1, 10); assert_eq!( ret.origin(60).unwrap().0, - &PathBuf::from(testfile_path("test2.svh")) + &PathBuf::from(testfile_path("included.svh")) ); assert_eq!(ret.origin(60).unwrap().1, 74); assert_eq!( ret.origin(80).unwrap().0, &PathBuf::from(testfile_path("include_basic.sv")) ); - assert_eq!(ret.origin(80).unwrap().1, 60); + assert_eq!(ret.origin(80).unwrap().1, 63); } #[test] @@ -1144,14 +1144,14 @@ mod tests { assert_eq!(ret.origin(10).unwrap().1, 10); assert_eq!( ret.origin(50).unwrap().0, - &PathBuf::from(testfile_path("test2.svh")) + &PathBuf::from(testfile_path("included.svh")) ); assert_eq!(ret.origin(50).unwrap().1, 73); assert_eq!( ret.origin(70).unwrap().0, &PathBuf::from(testfile_path("include_origin.sv")) ); - assert_eq!(ret.origin(70).unwrap().1, 50); + assert_eq!(ret.origin(70).unwrap().1, 53); } #[test] @@ -1176,14 +1176,14 @@ mod tests { assert_eq!(ret.origin(10).unwrap().1, 10); assert_eq!( ret.origin(50).unwrap().0, - &PathBuf::from(testfile_path("test2.svh")) + &PathBuf::from(testfile_path("included.svh")) ); assert_eq!(ret.origin(50).unwrap().1, 73); assert_eq!( ret.origin(70).unwrap().0, &PathBuf::from(testfile_path("include_sameline_comment.sv")) ); - assert_eq!(ret.origin(70).unwrap().1, 50); + assert_eq!(ret.origin(70).unwrap().1, 53); } #[test] diff --git a/sv-parser-pp/testcases/include_basic.sv b/sv-parser-pp/testcases/include_basic.sv index 63fe552..76fe96f 100644 --- a/sv-parser-pp/testcases/include_basic.sv +++ b/sv-parser-pp/testcases/include_basic.sv @@ -1,4 +1,4 @@ module and_op (a, b, c); // a - `include "test2.svh" + `include "included.svh" endmodule diff --git a/sv-parser-pp/testcases/include_ignore.sv b/sv-parser-pp/testcases/include_ignore.sv index 873c201..1c757dd 100644 --- a/sv-parser-pp/testcases/include_ignore.sv +++ b/sv-parser-pp/testcases/include_ignore.sv @@ -1,3 +1,3 @@ module and_op (a, b, c); -`include "test2.svh" +`include "included.svh" endmodule diff --git a/sv-parser-pp/testcases/include_origin.sv b/sv-parser-pp/testcases/include_origin.sv index 873c201..1c757dd 100644 --- a/sv-parser-pp/testcases/include_origin.sv +++ b/sv-parser-pp/testcases/include_origin.sv @@ -1,3 +1,3 @@ module and_op (a, b, c); -`include "test2.svh" +`include "included.svh" endmodule diff --git a/sv-parser-pp/testcases/include_sameline_comment.sv b/sv-parser-pp/testcases/include_sameline_comment.sv index bb10a1f..1f17750 100644 --- a/sv-parser-pp/testcases/include_sameline_comment.sv +++ b/sv-parser-pp/testcases/include_sameline_comment.sv @@ -1,3 +1,3 @@ module and_op (a, b, c); -`include "test2.svh" // comment +`include "included.svh" // comment endmodule diff --git a/sv-parser-pp/testcases/include_sameline_include.sv b/sv-parser-pp/testcases/include_sameline_include.sv index ad10dda..64b02fb 100644 --- a/sv-parser-pp/testcases/include_sameline_include.sv +++ b/sv-parser-pp/testcases/include_sameline_include.sv @@ -1,3 +1,3 @@ module and_op (a, b, c); -`include "test2.svh" `include "test2.svh" +`include "included.svh" `include "included.svh" endmodule diff --git a/sv-parser-pp/testcases/include_sameline_keyword.sv b/sv-parser-pp/testcases/include_sameline_keyword.sv index 8c2a37c..acd0ae3 100644 --- a/sv-parser-pp/testcases/include_sameline_keyword.sv +++ b/sv-parser-pp/testcases/include_sameline_keyword.sv @@ -1,2 +1,2 @@ module and_op (a, b, c); -`include "test2.svh" endmodule +`include "included.svh" endmodule diff --git a/sv-parser-pp/testcases/test2.svh b/sv-parser-pp/testcases/included.svh similarity index 100% rename from sv-parser-pp/testcases/test2.svh rename to sv-parser-pp/testcases/included.svh From 1be39f0ce94d88a156efd324e5d77e1328a302a9 Mon Sep 17 00:00:00 2001 From: damc Date: Thu, 21 Jul 2022 18:39:21 +0200 Subject: [PATCH 33/62] ppTests Fold markers around tests. --- sv-parser-pp/src/preprocess.rs | 108 ++++++++++++++++----------------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index cafa971..77b4faf 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -883,7 +883,7 @@ mod tests { } #[test] - fn escaped_identifier() { + fn escaped_identifier() { // {{{ let (ret, _) = preprocess( testfile_path("escaped_identifier.sv"), &HashMap::new(), @@ -896,11 +896,11 @@ mod tests { ret.text(), testfile_contents("expected/escaped_identifier.sv") ); - } + } // }}} #[test] #[allow(non_snake_case)] - fn IEEE18002017_macro_argument_expansion() { + fn IEEE18002017_macro_argument_expansion() { // {{{ let (ret, _) = preprocess( testfile_path("IEEE18002017_macro_argument_expansion.sv"), &HashMap::new(), @@ -913,11 +913,11 @@ mod tests { ret.text(), testfile_contents("expected/IEEE18002017_macro_argument_expansion.sv") ); - } + } // }}} #[test] #[allow(non_snake_case)] - fn IEEE18002017_macro_delimit_tokens() { + fn IEEE18002017_macro_delimit_tokens() { // {{{ let (ret, _) = preprocess( testfile_path("IEEE18002017_macro_delimit_tokens.sv"), &HashMap::new(), @@ -930,11 +930,11 @@ mod tests { ret.text(), testfile_contents("expected/IEEE18002017_macro_delimit_tokens.sv") ); - } + } // }}} #[test] #[allow(non_snake_case)] - fn IEEE18002017_macro_mix_quotes() { + fn IEEE18002017_macro_mix_quotes() { // {{{ let (ret, _) = preprocess( testfile_path("IEEE18002017_macro_mix_quotes.sv"), &HashMap::new(), @@ -947,11 +947,11 @@ mod tests { ret.text(), testfile_contents("expected/IEEE18002017_macro_mix_quotes.sv") ); - } + } // }}} #[test] #[allow(non_snake_case)] - fn IEEE18002017_macro_noexpand_string() { + fn IEEE18002017_macro_noexpand_string() { // {{{ let (ret, _) = preprocess( testfile_path("IEEE18002017_macro_noexpand_string.sv"), &HashMap::new(), @@ -964,11 +964,11 @@ mod tests { ret.text(), testfile_contents("expected/IEEE18002017_macro_noexpand_string.sv") ); - } + } // }}} #[test] #[allow(non_snake_case)] - fn IEEE18002017_macro_with_defaults() { + fn IEEE18002017_macro_with_defaults() { // {{{ let (ret, _) = preprocess( testfile_path("IEEE18002017_macro_with_defaults.sv"), &HashMap::new(), @@ -981,11 +981,11 @@ mod tests { ret.text(), testfile_contents("expected/IEEE18002017_macro_with_defaults.sv") ); - } + } // }}} #[test] #[allow(non_snake_case)] - fn IEEE18002017_macro_without_defaults() { + fn IEEE18002017_macro_without_defaults() { // {{{ let (ret, _) = preprocess( testfile_path("IEEE18002017_macro_without_defaults.sv"), &HashMap::new(), @@ -998,10 +998,10 @@ mod tests { ret.text(), testfile_contents("expected/IEEE18002017_macro_without_defaults.sv") ); - } + } // }}} #[test] - fn ifdef_nested() { + fn ifdef_nested() { // {{{ let (ret, _) = preprocess( testfile_path("ifdef_nested.sv"), &HashMap::new(), @@ -1014,10 +1014,10 @@ mod tests { ret.text(), testfile_contents("expected/ifdef_nested.sv") ); - } + } // }}} #[test] - fn ifdef_predefined() { + fn ifdef_predefined() { // {{{ let mut defines = HashMap::new(); defines.insert(String::from("behavioral"), None); let (ret, _) = preprocess( @@ -1032,10 +1032,10 @@ mod tests { ret.text(), testfile_contents("expected/ifdef_predefined.sv") ) - } + } // }}} #[test] - fn ifdef_undefined() { + fn ifdef_undefined() { // {{{ let (ret, _) = preprocess( testfile_path("ifdef_undefined.sv"), &HashMap::new(), @@ -1055,10 +1055,10 @@ mod tests { assert_eq!(ret.origin(10).unwrap().1, 10); assert_eq!(ret.origin(50).unwrap().1, 98); assert_eq!(ret.origin(70).unwrap().1, 124); - } + } // }}} #[test] - fn ifndef_undefined() { + fn ifndef_undefined() { // {{{ let (ret, _) = preprocess( testfile_path("ifndef_undefined.sv"), &HashMap::new(), @@ -1071,10 +1071,10 @@ mod tests { ret.text(), testfile_contents("expected/ifndef_undefined.sv") ); - } + } // }}} #[test] - fn include_basic() { + fn include_basic() { // {{{ let include_paths = [testfile_path("")]; let (ret, _) = preprocess( testfile_path("include_basic.sv"), @@ -1103,10 +1103,10 @@ mod tests { &PathBuf::from(testfile_path("include_basic.sv")) ); assert_eq!(ret.origin(80).unwrap().1, 63); - } + } // }}} #[test] - fn include_ignore() { + fn include_ignore() { // {{{ let include_paths = [testfile_path("")]; let (ret, _) = preprocess( testfile_path("include_ignore.sv"), @@ -1120,10 +1120,10 @@ mod tests { ret.text(), testfile_contents("expected/include_ignore.sv") ); - } + } // }}} #[test] - fn include_origin() { + fn include_origin() { // {{{ let include_paths = [testfile_path("")]; let (ret, _) = preprocess( testfile_path("include_origin.sv"), @@ -1152,10 +1152,10 @@ mod tests { &PathBuf::from(testfile_path("include_origin.sv")) ); assert_eq!(ret.origin(70).unwrap().1, 53); - } + } // }}} #[test] - fn include_sameline_comment() { + fn include_sameline_comment() { // {{{ let include_paths = [testfile_path("")]; let (ret, _) = preprocess( testfile_path("include_sameline_comment.sv"), @@ -1184,10 +1184,10 @@ mod tests { &PathBuf::from(testfile_path("include_sameline_comment.sv")) ); assert_eq!(ret.origin(70).unwrap().1, 53); - } + } // }}} #[test] - fn include_sameline_include() { + fn include_sameline_include() { // {{{ let include_paths = [testfile_path("")]; let ret = preprocess( testfile_path("include_sameline_include.sv"), @@ -1197,10 +1197,10 @@ mod tests { false, ); assert_eq!(format!("{:?}", ret), "Err(IncludeLine)"); - } + } // }}} #[test] - fn include_sameline_keyword() { + fn include_sameline_keyword() { // {{{ let include_paths = [testfile_path("")]; let ret = preprocess( testfile_path("include_sameline_keyword.sv"), @@ -1210,10 +1210,10 @@ mod tests { false, ); assert_eq!(format!("{:?}", ret), "Err(IncludeLine)"); - } + } // }}} #[test] - fn macro_basic() { + fn macro_basic() { // {{{ let (ret, _) = preprocess( testfile_path("macro_basic.sv"), &HashMap::new(), @@ -1226,10 +1226,10 @@ mod tests { ret.text(), testfile_contents("expected/macro_basic.sv") ); - } + } // }}} #[test] - fn macro_comment() { + fn macro_comment() { // {{{ let (ret, _) = preprocess( testfile_path("macro_comment.sv"), &HashMap::new(), @@ -1242,10 +1242,10 @@ mod tests { ret.text(), testfile_contents("expected/macro_comment.sv") ); - } + } // }}} #[test] - fn macro_identifier() { + fn macro_identifier() { // {{{ let (ret, _) = preprocess( testfile_path("macro_identifier.sv"), &HashMap::new(), @@ -1258,11 +1258,11 @@ mod tests { ret.text(), testfile_contents("expected/macro_identifier.sv") ); - } + } // }}} #[test] #[allow(non_snake_case)] - fn macro_LINE() { + fn macro_LINE() { // {{{ let (ret, _) = preprocess( testfile_path("macro_LINE.sv"), &HashMap::new(), @@ -1275,10 +1275,10 @@ mod tests { ret.text(), testfile_contents("expected/macro_LINE.sv") ); - } + } // }}} #[test] - fn macro_multiline_comment() { + fn macro_multiline_comment() { // {{{ let (ret, _) = preprocess( testfile_path("macro_multiline_comment.sv"), &HashMap::new(), @@ -1291,10 +1291,10 @@ mod tests { ret.text(), testfile_contents("expected/macro_multiline_comment.sv") ); - } + } // }}} #[test] - fn macro_parameters_defaultvalue() { + fn macro_parameters_defaultvalue() { // {{{ let (ret, _) = preprocess( testfile_path("macro_parameters_defaultvalue.sv"), &HashMap::new(), @@ -1307,10 +1307,10 @@ mod tests { ret.text(), testfile_contents("expected/macro_parameters_defaultvalue.sv") ); - } + } // }}} #[test] - fn macro_parameters_multiline() { + fn macro_parameters_multiline() { // {{{ let (ret, _) = preprocess( testfile_path("macro_parameters_multiline.sv"), &HashMap::new(), @@ -1323,10 +1323,10 @@ mod tests { ret.text(), testfile_contents("expected/macro_parameters_multiline.sv") ); - } + } // }}} #[test] - fn macro_recursion_direct() { + fn macro_recursion_direct() { // {{{ let ret = preprocess( testfile_path("macro_recursion_direct.sv"), &HashMap::new(), @@ -1335,10 +1335,10 @@ mod tests { false, ); assert_eq!(format!("{:?}", ret), "Err(ExceedRecursiveLimit)"); - } + } // }}} #[test] - fn macro_recursion_indirect() { + fn macro_recursion_indirect() { // {{{ let ret = preprocess( testfile_path("macro_recursion_indirect.sv"), &HashMap::new(), @@ -1347,12 +1347,12 @@ mod tests { false, ); assert_eq!(format!("{:?}", ret), "Err(ExceedRecursiveLimit)"); - } + } // }}} // Check that preprocess() doesn't introduce extra whitespace within and // around compiler directives. #[test] - fn whitespace_directives() { + fn whitespace_directives() { // {{{ let include_paths = [testfile_path("")]; let (ret, _) = preprocess( testfile_path("whitespace_directives.sv"), @@ -1366,5 +1366,5 @@ mod tests { ret.text(), testfile_contents("expected/whitespace_directives.sv") ); - } + } // }}} } From 28cbd8aaf485d5e1808ae1faeff378831d9b47b6 Mon Sep 17 00:00:00 2001 From: damc Date: Thu, 21 Jul 2022 21:39:21 +0200 Subject: [PATCH 34/62] ppTests Extend non-IEEE tests around macros. --- .../testcases/expected/macro_arguments.sv | 23 +++++++++++++++++++ .../testcases/expected/macro_basic.sv | 8 ++++--- .../testcases/expected/macro_comment.sv | 18 +++++++++++++-- .../testcases/expected/macro_delimiters.sv | 17 ++++++++++++++ .../testcases/expected/macro_identifier.sv | 14 +++++------ .../expected/macro_multiline_comment.sv | 23 +++++++++++++------ .../expected/macro_parameters_defaultvalue.sv | 9 -------- .../expected/macro_parameters_multiline.sv | 17 -------------- sv-parser-pp/testcases/macro_arguments.sv | 23 +++++++++++++++++++ sv-parser-pp/testcases/macro_basic.sv | 8 ++++--- sv-parser-pp/testcases/macro_comment.sv | 18 +++++++++++++-- sv-parser-pp/testcases/macro_delimiters.sv | 13 +++++++++++ sv-parser-pp/testcases/macro_identifier.sv | 14 +++++------ .../testcases/macro_multiline_comment.sv | 17 ++++++++++---- .../macro_parameters_defaultvalue.sv | 10 -------- .../testcases/macro_parameters_multiline.sv | 16 ------------- 16 files changed, 160 insertions(+), 88 deletions(-) create mode 100644 sv-parser-pp/testcases/expected/macro_arguments.sv create mode 100644 sv-parser-pp/testcases/expected/macro_delimiters.sv delete mode 100644 sv-parser-pp/testcases/expected/macro_parameters_defaultvalue.sv delete mode 100644 sv-parser-pp/testcases/expected/macro_parameters_multiline.sv create mode 100644 sv-parser-pp/testcases/macro_arguments.sv create mode 100644 sv-parser-pp/testcases/macro_delimiters.sv delete mode 100644 sv-parser-pp/testcases/macro_parameters_defaultvalue.sv delete mode 100644 sv-parser-pp/testcases/macro_parameters_multiline.sv diff --git a/sv-parser-pp/testcases/expected/macro_arguments.sv b/sv-parser-pp/testcases/expected/macro_arguments.sv new file mode 100644 index 0000000..0637660 --- /dev/null +++ b/sv-parser-pp/testcases/expected/macro_arguments.sv @@ -0,0 +1,23 @@ +// Macro with parameters with usage spread over multiple lines. +// Final line of macro is line14. +// Argument value `clk` is equal to its name. +// Argument value of exp contains matching brackets and parentheses. +// Bracketed value of msg is required to avoid being parsed as a parameterized +// macro instead of argumnts to $display. +// NOTE: Trailing whitespace is not exercised here, i.e. continuations +// immediately follow non-whitespace. +`define disp(clk, exp, msg)\ + always @(posedge clk)\ + if (exp) begin\ + $display msg;\ + end\ + +module M (); + + always @(posedge clk) + if (!(a[i].b && c[i])) begin + $display ("xxx(()[]]{}}}", a[i].b, c[i]); + end +; // NOTE: Semi-colon is unnecessary. + +endmodule diff --git a/sv-parser-pp/testcases/expected/macro_basic.sv b/sv-parser-pp/testcases/expected/macro_basic.sv index c5f5078..6ff2696 100644 --- a/sv-parser-pp/testcases/expected/macro_basic.sv +++ b/sv-parser-pp/testcases/expected/macro_basic.sv @@ -1,4 +1,6 @@ -`define MOD_INST u_mysubmod -module mymod; -mysubmod u_mysubmod() ; +`define A aaa +module M; +aaa#() a0 (.*); // No trailing whitespace. +aaa #() a1 (.*); // Trailing 1 space. +aaa #() a2 (.*); // Trailing 2 spaces. endmodule diff --git a/sv-parser-pp/testcases/expected/macro_comment.sv b/sv-parser-pp/testcases/expected/macro_comment.sv index 836e665..a9759dd 100644 --- a/sv-parser-pp/testcases/expected/macro_comment.sv +++ b/sv-parser-pp/testcases/expected/macro_comment.sv @@ -1,2 +1,16 @@ -`define A 42 // Comment -interface i #(p = 42) (); endinterface +/* IEEE1800-2017 Clause 22.5.1, page 676 +If a one-line comment (that is, a comment specified with the characters //) is +included in the text, then the comment shall not become part of the substituted +text. +*/ + +// A has no comment +// B has a comment after 1 space +// C has a comment after 3 spaces +`define A 11 +`define B 22 // Comment not included in macro, but whitespace before `//` is. +`define C 33 // Comment not included in macro, but whitespace before `//` is. + +interface A #(p=11) (); endinterface +interface B #(p=22 ) (); endinterface +interface C #(p=33 ) (); endinterface diff --git a/sv-parser-pp/testcases/expected/macro_delimiters.sv b/sv-parser-pp/testcases/expected/macro_delimiters.sv new file mode 100644 index 0000000..d3abef6 --- /dev/null +++ b/sv-parser-pp/testcases/expected/macro_delimiters.sv @@ -0,0 +1,17 @@ +// Multi-line macro defined with 2 trailing spaces before initial continuation. +// First line has no trailing space, second has trailing space, third is end. +// Macro contains 2-space indent, so indented usage gets extra. +// Delimiters (``) used before and after arguments. +`define connect(NAME, INDEX = 0) \ + assign NAME``_``INDEX``__x = NAME[INDEX].x;\ + assign NAME``_``INDEX``__y = NAME[INDEX].y; \ + assign NAME``_``INDEX``__z = NAME[INDEX].z; + +module M (); + assign a_0__x = a[0].x; + assign a_0__y = a[0].y; + assign a_0__z = a[0].z; + assign a_1__x = a[1].x; + assign a_1__y = a[1].y; + assign a_1__z = a[1].z; +endmodule diff --git a/sv-parser-pp/testcases/expected/macro_identifier.sv b/sv-parser-pp/testcases/expected/macro_identifier.sv index 71e4b1e..3812a08 100644 --- a/sv-parser-pp/testcases/expected/macro_identifier.sv +++ b/sv-parser-pp/testcases/expected/macro_identifier.sv @@ -1,10 +1,10 @@ -module a; `define A "aaa" `define \B "bbb" -initial begin -$display("aaa"); -$display("aaa"); -$display("bbb"); -$display("bbb"); -end +module M; + initial begin + $display("aaa"); + $display("aaa" ); + $display("bbb"); + $display("bbb" ); + end endmodule diff --git a/sv-parser-pp/testcases/expected/macro_multiline_comment.sv b/sv-parser-pp/testcases/expected/macro_multiline_comment.sv index 85ed300..989e21b 100644 --- a/sv-parser-pp/testcases/expected/macro_multiline_comment.sv +++ b/sv-parser-pp/testcases/expected/macro_multiline_comment.sv @@ -1,10 +1,19 @@ +// Leading whitespace on 4 lines. +// initial \ Space before line continuation. +// begin\ No space before line continuation. +// $display(); // comment \ Continuation at end of comment. +// end +// NOTE: Trailing whitespace on lines ending `initial ` and `$display(); `. + `define A \ - initial begin // comment \ - end - -module test(); - -initial begin - end + initial \ + begin\ + $display(); // comment \ + end +module M; + initial + begin + $display(); + end endmodule diff --git a/sv-parser-pp/testcases/expected/macro_parameters_defaultvalue.sv b/sv-parser-pp/testcases/expected/macro_parameters_defaultvalue.sv deleted file mode 100644 index 7cc0596..0000000 --- a/sv-parser-pp/testcases/expected/macro_parameters_defaultvalue.sv +++ /dev/null @@ -1,9 +0,0 @@ -`define connect(NAME, INDEX = 0) \ - assign NAME``_``INDEX``__x = NAME[INDEX].x; \ - assign NAME``_``INDEX``__y = NAME[INDEX].y; - -module a (); - - assign a_0__x = a[0].x; - assign a_0__y = a[0].y; assign a_1__x = a[1].x; - assign a_1__y = a[1].y; endmodule diff --git a/sv-parser-pp/testcases/expected/macro_parameters_multiline.sv b/sv-parser-pp/testcases/expected/macro_parameters_multiline.sv deleted file mode 100644 index c4839c4..0000000 --- a/sv-parser-pp/testcases/expected/macro_parameters_multiline.sv +++ /dev/null @@ -1,17 +0,0 @@ -`define disp(clk, exp, msg) \ - always @(posedge clk) begin \ - if (!(exp)) begin \ - $display msg; \ - end \ - end \ - -module a (); - -always @(posedge clk) begin - if (!(!(a[i].b && c[i]))) begin - $display ("xxx(()[]]{}}}", a[i].b, c[i]); - end - end - ; - -endmodule diff --git a/sv-parser-pp/testcases/macro_arguments.sv b/sv-parser-pp/testcases/macro_arguments.sv new file mode 100644 index 0000000..fae8300 --- /dev/null +++ b/sv-parser-pp/testcases/macro_arguments.sv @@ -0,0 +1,23 @@ +// Macro with parameters with usage spread over multiple lines. +// Final line of macro is line14. +// Argument value `clk` is equal to its name. +// Argument value of exp contains matching brackets and parentheses. +// Bracketed value of msg is required to avoid being parsed as a parameterized +// macro instead of argumnts to $display. +// NOTE: Trailing whitespace is not exercised here, i.e. continuations +// immediately follow non-whitespace. +`define disp(clk, exp, msg)\ + always @(posedge clk)\ + if (exp) begin\ + $display msg;\ + end\ + +module M (); + +`disp( + clk, + !(a[i].b && c[i]), + ("xxx(()[]]{}}}", a[i].b, c[i]) +); // NOTE: Semi-colon is unnecessary. + +endmodule diff --git a/sv-parser-pp/testcases/macro_basic.sv b/sv-parser-pp/testcases/macro_basic.sv index 083382a..17c60ca 100644 --- a/sv-parser-pp/testcases/macro_basic.sv +++ b/sv-parser-pp/testcases/macro_basic.sv @@ -1,4 +1,6 @@ -`define MOD_INST u_mysubmod -module mymod; -mysubmod `MOD_INST (); +`define A aaa +module M; +`A#() a0 (.*); // No trailing whitespace. +`A #() a1 (.*); // Trailing 1 space. +`A #() a2 (.*); // Trailing 2 spaces. endmodule diff --git a/sv-parser-pp/testcases/macro_comment.sv b/sv-parser-pp/testcases/macro_comment.sv index 2adacc4..af7dafa 100644 --- a/sv-parser-pp/testcases/macro_comment.sv +++ b/sv-parser-pp/testcases/macro_comment.sv @@ -1,2 +1,16 @@ -`define A 42 // Comment -interface i #(p = `A) (); endinterface +/* IEEE1800-2017 Clause 22.5.1, page 676 +If a one-line comment (that is, a comment specified with the characters //) is +included in the text, then the comment shall not become part of the substituted +text. +*/ + +// A has no comment +// B has a comment after 1 space +// C has a comment after 3 spaces +`define A 11 +`define B 22 // Comment not included in macro, but whitespace before `//` is. +`define C 33 // Comment not included in macro, but whitespace before `//` is. + +interface A #(p=`A) (); endinterface +interface B #(p=`B) (); endinterface +interface C #(p=`C) (); endinterface diff --git a/sv-parser-pp/testcases/macro_delimiters.sv b/sv-parser-pp/testcases/macro_delimiters.sv new file mode 100644 index 0000000..8779224 --- /dev/null +++ b/sv-parser-pp/testcases/macro_delimiters.sv @@ -0,0 +1,13 @@ +// Multi-line macro defined with 2 trailing spaces before initial continuation. +// First line has no trailing space, second has trailing space, third is end. +// Macro contains 2-space indent, so indented usage gets extra. +// Delimiters (``) used before and after arguments. +`define connect(NAME, INDEX = 0) \ + assign NAME``_``INDEX``__x = NAME[INDEX].x;\ + assign NAME``_``INDEX``__y = NAME[INDEX].y; \ + assign NAME``_``INDEX``__z = NAME[INDEX].z; + +module M (); + `connect(a) + `connect(a, 1) +endmodule diff --git a/sv-parser-pp/testcases/macro_identifier.sv b/sv-parser-pp/testcases/macro_identifier.sv index 36065de..321f611 100644 --- a/sv-parser-pp/testcases/macro_identifier.sv +++ b/sv-parser-pp/testcases/macro_identifier.sv @@ -1,10 +1,10 @@ -module a; `define A "aaa" `define \B "bbb" -initial begin -$display(`A); -$display(`\A ); -$display(`B); -$display(`\B ); -end +module M; + initial begin + $display(`A); + $display(`\A ); + $display(`B); + $display(`\B ); + end endmodule diff --git a/sv-parser-pp/testcases/macro_multiline_comment.sv b/sv-parser-pp/testcases/macro_multiline_comment.sv index 258b0b4..d5488cb 100644 --- a/sv-parser-pp/testcases/macro_multiline_comment.sv +++ b/sv-parser-pp/testcases/macro_multiline_comment.sv @@ -1,9 +1,16 @@ +// Leading whitespace on 4 lines. +// initial \ Space before line continuation. +// begin\ No space before line continuation. +// $display(); // comment \ Continuation at end of comment. +// end +// NOTE: Trailing whitespace on lines ending `initial ` and `$display(); `. + `define A \ - initial begin // comment \ - end - -module test(); + initial \ + begin\ + $display(); // comment \ + end +module M; `A - endmodule diff --git a/sv-parser-pp/testcases/macro_parameters_defaultvalue.sv b/sv-parser-pp/testcases/macro_parameters_defaultvalue.sv deleted file mode 100644 index f28b184..0000000 --- a/sv-parser-pp/testcases/macro_parameters_defaultvalue.sv +++ /dev/null @@ -1,10 +0,0 @@ -`define connect(NAME, INDEX = 0) \ - assign NAME``_``INDEX``__x = NAME[INDEX].x; \ - assign NAME``_``INDEX``__y = NAME[INDEX].y; - -module a (); - - `connect(a) - `connect(a, 1) - -endmodule diff --git a/sv-parser-pp/testcases/macro_parameters_multiline.sv b/sv-parser-pp/testcases/macro_parameters_multiline.sv deleted file mode 100644 index 7466db6..0000000 --- a/sv-parser-pp/testcases/macro_parameters_multiline.sv +++ /dev/null @@ -1,16 +0,0 @@ -`define disp(clk, exp, msg) \ - always @(posedge clk) begin \ - if (!(exp)) begin \ - $display msg; \ - end \ - end \ - -module a (); - -`disp( - clk, - !(a[i].b && c[i]), - ("xxx(()[]]{}}}", a[i].b, c[i]) -); - -endmodule From d1e7f32d0500089e37bd93a234cab992d3e1c64c Mon Sep 17 00:00:00 2001 From: damc Date: Thu, 21 Jul 2022 21:40:11 +0200 Subject: [PATCH 35/62] ppTests Comment-only explain replacements. --- sv-parser-pp/src/preprocess.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 77b4faf..c8a1fe3 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -816,12 +816,12 @@ fn resolve_text_macro_usage, U: AsRef>( } else { replaced.push_str( &text - .replace("``", "") - .replace("`\\`\"", "\\\"") - .replace("`\"", "\"") - .replace("\\\n", "\n") - .replace("\\\r\n", "\r\n") - .replace("\\\r", "\r"), + .replace("``", "") // Argument substitution. + .replace("`\\`\"", "\\\"") // Escaped backslash. + .replace("`\"", "\"") // Escaped quote. + .replace("\\\n", "\n") // Line continuation (Unix). + .replace("\\\r\n", "\r\n") // Line continuation (Windows). + .replace("\\\r", "\r"), // Line continuation (old Mac). ); } } From 026e6061368e44f0ad5f163135757867da367553 Mon Sep 17 00:00:00 2001 From: damc Date: Thu, 21 Jul 2022 22:24:19 +0200 Subject: [PATCH 36/62] ppTests Fix IEEE18002017_macro_without_defaults --- .../testcases/IEEE18002017_macro_without_defaults.sv | 2 -- .../expected/IEEE18002017_macro_without_defaults.sv | 12 +++++------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/sv-parser-pp/testcases/IEEE18002017_macro_without_defaults.sv b/sv-parser-pp/testcases/IEEE18002017_macro_without_defaults.sv index ac42b01..bf21d4a 100644 --- a/sv-parser-pp/testcases/IEEE18002017_macro_without_defaults.sv +++ b/sv-parser-pp/testcases/IEEE18002017_macro_without_defaults.sv @@ -5,11 +5,9 @@ `define D(x,y) initial $display("start", x , y, "end"); module m; -initial begin `D( "msg1" , "msg2" ) `D( " msg1", ) `D(, "msg2 ") `D(,) `D( , ) -end endmodule diff --git a/sv-parser-pp/testcases/expected/IEEE18002017_macro_without_defaults.sv b/sv-parser-pp/testcases/expected/IEEE18002017_macro_without_defaults.sv index 87c3ea3..489a121 100644 --- a/sv-parser-pp/testcases/expected/IEEE18002017_macro_without_defaults.sv +++ b/sv-parser-pp/testcases/expected/IEEE18002017_macro_without_defaults.sv @@ -5,11 +5,9 @@ `define D(x,y) initial $display("start", x , y, "end"); module m; -initial begin - $display("start", "msg1" , "msg2", "end"); - $display("start", " msg1" , , "end"); - $display("start", , "msg2 ", "end"); - $display("start", , , "end"); - $display("start", , , "end"); -end + initial $display("start", "msg1" , "msg2", "end"); + initial $display("start", " msg1" , , "end"); + initial $display("start", , "msg2 ", "end"); + initial $display("start", , , "end"); + initial $display("start", , , "end"); endmodule From 4f1b566e2beb5bf65b71e62dd5e929a562d4ffc2 Mon Sep 17 00:00:00 2001 From: damc Date: Thu, 21 Jul 2022 22:26:13 +0200 Subject: [PATCH 37/62] ppTests Use rearrange tests alphabetically after renames. --- sv-parser-pp/src/preprocess.rs | 64 +++++++++++++++++----------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index c8a1fe3..1077346 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -1212,6 +1212,22 @@ mod tests { assert_eq!(format!("{:?}", ret), "Err(IncludeLine)"); } // }}} + #[test] + fn macro_arguments() { // {{{ + let (ret, _) = preprocess( + testfile_path("macro_arguments.sv"), + &HashMap::new(), + &[] as &[String], + false, + false, + ) + .unwrap(); + assert_eq!( + ret.text(), + testfile_contents("expected/macro_arguments.sv") + ); + } // }}} + #[test] fn macro_basic() { // {{{ let (ret, _) = preprocess( @@ -1244,6 +1260,22 @@ mod tests { ); } // }}} + #[test] + fn macro_delimiters() { // {{{ + let (ret, _) = preprocess( + testfile_path("macro_delimiters.sv"), + &HashMap::new(), + &[] as &[String], + false, + false, + ) + .unwrap(); + assert_eq!( + ret.text(), + testfile_contents("expected/macro_delimiters.sv") + ); + } // }}} + #[test] fn macro_identifier() { // {{{ let (ret, _) = preprocess( @@ -1293,38 +1325,6 @@ mod tests { ); } // }}} - #[test] - fn macro_parameters_defaultvalue() { // {{{ - let (ret, _) = preprocess( - testfile_path("macro_parameters_defaultvalue.sv"), - &HashMap::new(), - &[] as &[String], - false, - false, - ) - .unwrap(); - assert_eq!( - ret.text(), - testfile_contents("expected/macro_parameters_defaultvalue.sv") - ); - } // }}} - - #[test] - fn macro_parameters_multiline() { // {{{ - let (ret, _) = preprocess( - testfile_path("macro_parameters_multiline.sv"), - &HashMap::new(), - &[] as &[String], - false, - false, - ) - .unwrap(); - assert_eq!( - ret.text(), - testfile_contents("expected/macro_parameters_multiline.sv") - ); - } // }}} - #[test] fn macro_recursion_direct() { // {{{ let ret = preprocess( From 7236f516024531bd427b72c44bc0f775228cd150 Mon Sep 17 00:00:00 2001 From: damc Date: Thu, 21 Jul 2022 22:36:19 +0200 Subject: [PATCH 38/62] ppTests Correct whitespace in macro expansion. - Append the attached WhiteSpace on the end of TextMacroUsage. That append replaces/corrects "separator is required". - Ignore leading whitespace as suggested by the BNF in Syntax 22-2. That SM change replaces/correct "remove leading whitespace". - All tests now pass as expected. --- sv-parser-pp/src/preprocess.rs | 61 +++++++++++++++++++++++++++++++--- 1 file changed, 57 insertions(+), 4 deletions(-) diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 1077346..c2f5398 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -260,6 +260,7 @@ pub fn preprocess_str, U: AsRef, V: BuildHasher>( } _ => (), } + match n { NodeEvent::Enter(RefNode::SourceDescriptionNotDirective(x)) => { let locate: Locate = x.try_into().unwrap(); @@ -614,6 +615,40 @@ pub fn preprocess_str, U: AsRef, V: BuildHasher>( ret.push(&text, origin); defines = new_defines; } + + // Push the trailing whitespace attached to either + // TextMacroIdentifier or Option>. + let (ref _symbol, ref id, ref args) = x.nodes; + match args { + Some(p) => { + // Arguments given to macro in parentheses. + let (ref _opening, ref _args, ref closing) = p.nodes; + for x in closing { + match x { + RefNode::WhiteSpace(x) => { + let locate: Locate = x.try_into().unwrap(); + let range = Range::new(locate.offset, locate.offset + locate.len); + ret.push(locate.str(&s), Some((path.as_ref(), range))); + } + _ => { + } + } + } + } + None => { + // No arguments given to macro. + for x in id { + match x { + RefNode::WhiteSpace(x) => { + let locate: Locate = x.try_into().unwrap(); + let range = Range::new(locate.offset, locate.offset + locate.len); + ret.push(locate.str(&s), Some((path.as_ref(), range))); + } + _ => {} + } + } + } + } } NodeEvent::Enter(RefNode::PositionCompilerDirective(x)) => { skip_nodes.push(x.into()); @@ -693,8 +728,30 @@ fn split_text(s: &str) -> Vec { // This allows string literals to be constructed from macro arguments. let mut is_backquote_prev = false; + let mut is_leading_whitespace = true; + let mut is_backslash_prev = false; + let mut iter = s.chars().peekable(); while let Some(c) = iter.next() { + + // IEEE1800-2017 Clause 22.5.1, page 676, Syntax 22-2. + // Ignore whitespace immediately after text_macro_name. + if is_leading_whitespace { + if c != '\\' && !c.is_ascii_whitespace() { + // Non-whitespace character, move onto main loop. + is_leading_whitespace = false; + } else if is_backslash_prev && c == '\n' { + // Drop the \n from leading continuation, then move onto main loop. + is_leading_whitespace = false; + continue; + } else { + // Still in leading whitespace or possible continuation. + // Detect possible continuation, then try next character. + is_backslash_prev = c == '\\'; + continue; + } + } + is_ident_prev = is_ident; is_ident = c.is_ascii_alphanumeric() | (c == '_'); @@ -830,10 +887,6 @@ fn resolve_text_macro_usage, U: AsRef>( replaced.push_str(&paren); } - // separator is required - replaced.push_str(" "); - // remove leading whitespace - replaced = String::from(replaced.trim_start()); let (replaced, new_defines) = preprocess_str( &replaced, path.as_ref(), From 2e77dbc38a23cfc5b3730595db9e3abeeb5253a0 Mon Sep 17 00:00:00 2001 From: damc Date: Mon, 25 Jul 2022 21:59:40 +0200 Subject: [PATCH 39/62] ppTests Extend macro_LINE to catch more unusual behaviour seen in the wild. --- sv-parser-pp/testcases/expected/macro_LINE.sv | 23 ++++++++++--- sv-parser-pp/testcases/macro_LINE.sv | 34 ++++++++++++++++--- 2 files changed, 47 insertions(+), 10 deletions(-) diff --git a/sv-parser-pp/testcases/expected/macro_LINE.sv b/sv-parser-pp/testcases/expected/macro_LINE.sv index c741818..46752cd 100644 --- a/sv-parser-pp/testcases/expected/macro_LINE.sv +++ b/sv-parser-pp/testcases/expected/macro_LINE.sv @@ -1,6 +1,19 @@ -module a; -initial begin - if (3 == 0) begin - end -end +// __LINE__ = `__LINE__ + +// This block SHOULD be emitted from the preprocessor. + + +// Emitted instead. + + +// The following define should have no effect. +`define __LINE__ -2 + +// The following undef should have no effect. +module M; + initial + if (26 == 28) // Should be "26 == 28". + $display("PASS"); + else if (28 == 28) // Should be "28 == 28". + $display("FAIL"); endmodule diff --git a/sv-parser-pp/testcases/macro_LINE.sv b/sv-parser-pp/testcases/macro_LINE.sv index 911ec70..76de077 100644 --- a/sv-parser-pp/testcases/macro_LINE.sv +++ b/sv-parser-pp/testcases/macro_LINE.sv @@ -1,6 +1,30 @@ -module a; -initial begin - if (`__LINE__ == 0) begin - end -end +// __LINE__ = `__LINE__ + +`ifdef __LINE__ +// This block SHOULD be emitted from the preprocessor. +`elsif UNDEFINED +// NOT emitted. +`endif + +`ifndef __LINE__ +// This block should NOT be emitted from the preprocessor. +// However, following (conditional) definition should make it through the +// preprocessor parsing stage without error. +`define __LINE__ -1 +`elsif UNDEFINED +// Emitted instead. +`endif + +// The following define should have no effect. +`define __LINE__ -2 + +// The following undef should have no effect. +`undef __LINE__ + +module M; + initial + if (`__LINE__ == 28) // Should be "26 == 28". + $display("PASS"); + else if (`__LINE__ == 28) // Should be "28 == 28". + $display("FAIL"); endmodule From f85809f55a0609d19a951564a10726945e667c75 Mon Sep 17 00:00:00 2001 From: damc Date: Mon, 25 Jul 2022 22:08:03 +0200 Subject: [PATCH 40/62] ppTests macro_FILE --- sv-parser-pp/src/preprocess.rs | 17 +++++++++++++ sv-parser-pp/testcases/expected/macro_FILE.sv | 13 ++++++++++ sv-parser-pp/testcases/macro_FILE.sv | 24 +++++++++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 sv-parser-pp/testcases/expected/macro_FILE.sv create mode 100644 sv-parser-pp/testcases/macro_FILE.sv diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index c2f5398..3b44cb2 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -1362,6 +1362,23 @@ mod tests { ); } // }}} + #[test] + #[allow(non_snake_case)] + fn macro_FILE() { // {{{ + let (ret, _) = preprocess( + testfile_path("macro_FILE.sv"), + &HashMap::new(), + &[] as &[String], + false, + false, + ) + .unwrap(); + assert_eq!( + ret.text(), + testfile_contents("expected/macro_FILE.sv") + ); + } // }}} + #[test] fn macro_multiline_comment() { // {{{ let (ret, _) = preprocess( diff --git a/sv-parser-pp/testcases/expected/macro_FILE.sv b/sv-parser-pp/testcases/expected/macro_FILE.sv new file mode 100644 index 0000000..402c6d1 --- /dev/null +++ b/sv-parser-pp/testcases/expected/macro_FILE.sv @@ -0,0 +1,13 @@ +// __FILE__ = `__FILE__ + +// This block SHOULD be emitted from the preprocessor. + + +// Emitted instead. + + +// The following define should have no effect. +`define __FILE__ "FOO" + +// The following undef should have no effect. +// NOTE: Comparison against expected value are destined to fail in testcase. diff --git a/sv-parser-pp/testcases/macro_FILE.sv b/sv-parser-pp/testcases/macro_FILE.sv new file mode 100644 index 0000000..2ae8404 --- /dev/null +++ b/sv-parser-pp/testcases/macro_FILE.sv @@ -0,0 +1,24 @@ +// __FILE__ = `__FILE__ + +`ifdef __FILE__ +// This block SHOULD be emitted from the preprocessor. +`elsif UNDEFINED +// NOT emitted. +`endif + +`ifndef __FILE__ +// This block should NOT be emitted from the preprocessor. +// However, following (conditional) definition should make it through the +// preprocessor parsing stage without error. +`define __FILE__ "(null)" +`elsif UNDEFINED +// Emitted instead. +`endif + +// The following define should have no effect. +`define __FILE__ "FOO" + +// The following undef should have no effect. +`undef __FILE__ + +// NOTE: Comparison against expected value are destined to fail in testcase. From 963e17a5ea727ab16858bc86d99f0308fa2e6870 Mon Sep 17 00:00:00 2001 From: damc Date: Mon, 25 Jul 2022 22:21:28 +0200 Subject: [PATCH 41/62] ppTests Allow `define __FILE__ and `define __LINE__ to parse. - Redefinitions are silently ignored. - ifdef/ifndef will always treat them as defined. - Enables compatibility with code from a silicon vendor I can think of. - NOTE: Whitespace bugs around endif/undef are observable in testcases. --- sv-parser-parser/src/keywords.rs | 2 - sv-parser-pp/src/preprocess.rs | 93 ++++++++++++++++++-------------- 2 files changed, 53 insertions(+), 42 deletions(-) diff --git a/sv-parser-parser/src/keywords.rs b/sv-parser-parser/src/keywords.rs index 36285c9..52442fe 100644 --- a/sv-parser-parser/src/keywords.rs +++ b/sv-parser-parser/src/keywords.rs @@ -1446,8 +1446,6 @@ pub(crate) const KEYWORDS_1800_2017: &[&str] = &[ ]; pub(crate) const KEYWORDS_DIRECTIVE: &[&str] = &[ - "__FILE__", - "__LINE__", "begin_keywords", "celldefine", "default_nettype", diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 3b44cb2..5cc368c 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -399,7 +399,7 @@ pub fn preprocess_str, U: AsRef, V: BuildHasher>( let ifid = identifier(ifid.into(), &s).unwrap(); let mut hit = false; - if defines.contains_key(&ifid) { + if defines.contains_key(&ifid) || is_predefined_text_macro(&ifid) { hit = true; } else { skip_nodes.push(ifbody.into()); @@ -413,7 +413,7 @@ pub fn preprocess_str, U: AsRef, V: BuildHasher>( let elsifid = identifier(elsifid.into(), &s).unwrap(); if hit { skip_nodes.push(elsifbody.into()); - } else if defines.contains_key(&elsifid) { + } else if defines.contains_key(&elsifid) || is_predefined_text_macro(&ifid) { hit = true; } else { skip_nodes.push(elsifbody.into()); @@ -447,7 +447,7 @@ pub fn preprocess_str, U: AsRef, V: BuildHasher>( let ifid = identifier(ifid.into(), &s).unwrap(); let mut hit = false; - if !defines.contains_key(&ifid) { + if !defines.contains_key(&ifid) && !is_predefined_text_macro(&ifid) { hit = true; } else { skip_nodes.push(ifbody.into()); @@ -461,7 +461,7 @@ pub fn preprocess_str, U: AsRef, V: BuildHasher>( let elsifid = identifier(elsifid.into(), &s).unwrap(); if hit { skip_nodes.push(elsifbody.into()); - } else if defines.contains_key(&elsifid) { + } else if defines.contains_key(&elsifid) || is_predefined_text_macro(&ifid) { hit = true; } else { skip_nodes.push(elsifbody.into()); @@ -484,47 +484,49 @@ pub fn preprocess_str, U: AsRef, V: BuildHasher>( let (ref name, ref args) = proto.nodes; let id = identifier(name.into(), &s).unwrap(); - let mut define_args = Vec::new(); - if let Some(args) = args { - let (_, ref args, _) = args.nodes; - let (ref args,) = args.nodes; - for arg in args.contents() { - let (ref arg, ref default) = arg.nodes; - let (ref arg, _) = arg.nodes; - let arg = String::from(arg.str(&s)); + if !is_predefined_text_macro(id.as_str()) { + let mut define_args = Vec::new(); + if let Some(args) = args { + let (_, ref args, _) = args.nodes; + let (ref args,) = args.nodes; + for arg in args.contents() { + let (ref arg, ref default) = arg.nodes; + let (ref arg, _) = arg.nodes; + let arg = String::from(arg.str(&s)); - let default = if let Some((_, x)) = default { - let x: Locate = x.try_into().unwrap(); - let x = String::from(x.str(&s)); - Some(x) - } else { - None - }; + let default = if let Some((_, x)) = default { + let x: Locate = x.try_into().unwrap(); + let x = String::from(x.str(&s)); + Some(x) + } else { + None + }; - define_args.push((arg, default)); + define_args.push((arg, default)); + } } + + let define_text = if let Some(text) = text { + let text: Locate = text.try_into().unwrap(); + let range = Range::new(text.offset, text.offset + text.len); + let text = String::from(text.str(&s)); + Some(DefineText { + text, + origin: Some((PathBuf::from(path.as_ref()), range)), + }) + } else { + None + }; + + let define = Define { + identifier: id.clone(), + arguments: define_args, + text: define_text, + }; + + defines.insert(id, Some(define)); } - let define_text = if let Some(text) = text { - let text: Locate = text.try_into().unwrap(); - let range = Range::new(text.offset, text.offset + text.len); - let text = String::from(text.str(&s)); - Some(DefineText { - text, - origin: Some((PathBuf::from(path.as_ref()), range)), - }) - } else { - None - }; - - let define = Define { - identifier: id.clone(), - arguments: define_args, - text: define_text, - }; - - defines.insert(id, Some(define)); - // Keep TextMacroDefinition after preprocess let locate: Locate = x.try_into().unwrap(); let range = Range::new(locate.offset, locate.offset + locate.len); @@ -708,6 +710,17 @@ fn get_str(node: RefNode, s: &str) -> String { ret } +fn is_predefined_text_macro(s: &str) -> bool { + match s { + "__LINE__" | "__FILE__" => { + true + } + _ => { + false + } + } +} + fn split_text(s: &str) -> Vec { let mut is_string = false; let mut is_ident = false; From 565d15ccc556327e2a26794496318836cc16c81e Mon Sep 17 00:00:00 2001 From: damc Date: Tue, 26 Jul 2022 09:54:41 +0200 Subject: [PATCH 42/62] ppTests mv macro_FILE into alphabetical position. --- sv-parser-pp/src/preprocess.rs | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 5cc368c..448bc72 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -1342,6 +1342,23 @@ mod tests { ); } // }}} + #[test] + #[allow(non_snake_case)] + fn macro_FILE() { // {{{ + let (ret, _) = preprocess( + testfile_path("macro_FILE.sv"), + &HashMap::new(), + &[] as &[String], + false, + false, + ) + .unwrap(); + assert_eq!( + ret.text(), + testfile_contents("expected/macro_FILE.sv") + ); + } // }}} + #[test] fn macro_identifier() { // {{{ let (ret, _) = preprocess( @@ -1375,23 +1392,6 @@ mod tests { ); } // }}} - #[test] - #[allow(non_snake_case)] - fn macro_FILE() { // {{{ - let (ret, _) = preprocess( - testfile_path("macro_FILE.sv"), - &HashMap::new(), - &[] as &[String], - false, - false, - ) - .unwrap(); - assert_eq!( - ret.text(), - testfile_contents("expected/macro_FILE.sv") - ); - } // }}} - #[test] fn macro_multiline_comment() { // {{{ let (ret, _) = preprocess( From 4d647bf72d4bfbd48ed2c0f0497735496b30642d Mon Sep 17 00:00:00 2001 From: damc Date: Tue, 26 Jul 2022 10:28:23 +0200 Subject: [PATCH 43/62] ppTests IEEE1800-2017_keyword_* --- sv-parser-pp/src/preprocess.rs | 51 +++++++++++++++++++ .../IEEE18002017_keywords_if2_13642005.sv | 8 +++ .../IEEE18002017_keywords_m2_13642001.sv | 8 +++ .../IEEE18002017_keywords_m2_18002005.sv | 8 +++ .../IEEE18002017_keywords_if2_13642005.sv | 8 +++ .../IEEE18002017_keywords_m2_13642001.sv | 8 +++ .../IEEE18002017_keywords_m2_18002005.sv | 8 +++ 7 files changed, 99 insertions(+) create mode 100644 sv-parser-pp/testcases/IEEE18002017_keywords_if2_13642005.sv create mode 100644 sv-parser-pp/testcases/IEEE18002017_keywords_m2_13642001.sv create mode 100644 sv-parser-pp/testcases/IEEE18002017_keywords_m2_18002005.sv create mode 100644 sv-parser-pp/testcases/expected/IEEE18002017_keywords_if2_13642005.sv create mode 100644 sv-parser-pp/testcases/expected/IEEE18002017_keywords_m2_13642001.sv create mode 100644 sv-parser-pp/testcases/expected/IEEE18002017_keywords_m2_18002005.sv diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 448bc72..a802d47 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -964,6 +964,57 @@ mod tests { ); } // }}} + #[test] + #[allow(non_snake_case)] + fn IEEE18002017_keywords_if2_13642005() { // {{{ + let (ret, _) = preprocess( + testfile_path("IEEE18002017_keywords_if2_13642005.sv"), + &HashMap::new(), + &[] as &[String], + false, + false, + ) + .unwrap(); + assert_eq!( + ret.text(), + testfile_contents("expected/IEEE18002017_keywords_if2_13642005.sv") + ); + } // }}} + + #[test] + #[allow(non_snake_case)] + fn IEEE18002017_keywords_m2_13642001() { // {{{ + let (ret, _) = preprocess( + testfile_path("IEEE18002017_keywords_m2_13642001.sv"), + &HashMap::new(), + &[] as &[String], + false, + false, + ) + .unwrap(); + assert_eq!( + ret.text(), + testfile_contents("expected/IEEE18002017_keywords_m2_13642001.sv") + ); + } // }}} + + #[test] + #[allow(non_snake_case)] + fn IEEE18002017_keywords_m2_18002005() { // {{{ + let (ret, _) = preprocess( + testfile_path("IEEE18002017_keywords_m2_18002005.sv"), + &HashMap::new(), + &[] as &[String], + false, + false, + ) + .unwrap(); + assert_eq!( + ret.text(), + testfile_contents("expected/IEEE18002017_keywords_m2_18002005.sv") + ); + } // }}} + #[test] #[allow(non_snake_case)] fn IEEE18002017_macro_argument_expansion() { // {{{ diff --git a/sv-parser-pp/testcases/IEEE18002017_keywords_if2_13642005.sv b/sv-parser-pp/testcases/IEEE18002017_keywords_if2_13642005.sv new file mode 100644 index 0000000..3caed7e --- /dev/null +++ b/sv-parser-pp/testcases/IEEE18002017_keywords_if2_13642005.sv @@ -0,0 +1,8 @@ + +`begin_keywords "1364-2005" // use IEEE Std 1364-2005 Verilog keywords +interface if2 (); // ERROR: "interface" is not a keyword in 1364-2005 + // This interface should pass the preprocessor, but not the main parser + // because the identifiers `interface` and `endinterface` are not reserved + // keywords in IEEE1364-2005. +endinterface // ERROR: "endinterface" is not a keyword in 1364-2005 +`end_keywords diff --git a/sv-parser-pp/testcases/IEEE18002017_keywords_m2_13642001.sv b/sv-parser-pp/testcases/IEEE18002017_keywords_m2_13642001.sv new file mode 100644 index 0000000..da6af52 --- /dev/null +++ b/sv-parser-pp/testcases/IEEE18002017_keywords_m2_13642001.sv @@ -0,0 +1,8 @@ + +`begin_keywords "1364-2001" +module m2 (); + // "logic" is NOT a reserved keyword in IEEE1364-2001. + // This module should pass both the preprocessor, AND the main parser. + reg [63:0] logic; +endmodule +`end_keywords diff --git a/sv-parser-pp/testcases/IEEE18002017_keywords_m2_18002005.sv b/sv-parser-pp/testcases/IEEE18002017_keywords_m2_18002005.sv new file mode 100644 index 0000000..f201bf1 --- /dev/null +++ b/sv-parser-pp/testcases/IEEE18002017_keywords_m2_18002005.sv @@ -0,0 +1,8 @@ + +`begin_keywords "1800-2005" +module m2 (); + // "logic" IS a reserved keyword in IEEE1800-2005. + // This module should pass both the preprocessor, but NOT the main parser. + reg [63:0] logic; +endmodule +`end_keywords diff --git a/sv-parser-pp/testcases/expected/IEEE18002017_keywords_if2_13642005.sv b/sv-parser-pp/testcases/expected/IEEE18002017_keywords_if2_13642005.sv new file mode 100644 index 0000000..3caed7e --- /dev/null +++ b/sv-parser-pp/testcases/expected/IEEE18002017_keywords_if2_13642005.sv @@ -0,0 +1,8 @@ + +`begin_keywords "1364-2005" // use IEEE Std 1364-2005 Verilog keywords +interface if2 (); // ERROR: "interface" is not a keyword in 1364-2005 + // This interface should pass the preprocessor, but not the main parser + // because the identifiers `interface` and `endinterface` are not reserved + // keywords in IEEE1364-2005. +endinterface // ERROR: "endinterface" is not a keyword in 1364-2005 +`end_keywords diff --git a/sv-parser-pp/testcases/expected/IEEE18002017_keywords_m2_13642001.sv b/sv-parser-pp/testcases/expected/IEEE18002017_keywords_m2_13642001.sv new file mode 100644 index 0000000..da6af52 --- /dev/null +++ b/sv-parser-pp/testcases/expected/IEEE18002017_keywords_m2_13642001.sv @@ -0,0 +1,8 @@ + +`begin_keywords "1364-2001" +module m2 (); + // "logic" is NOT a reserved keyword in IEEE1364-2001. + // This module should pass both the preprocessor, AND the main parser. + reg [63:0] logic; +endmodule +`end_keywords diff --git a/sv-parser-pp/testcases/expected/IEEE18002017_keywords_m2_18002005.sv b/sv-parser-pp/testcases/expected/IEEE18002017_keywords_m2_18002005.sv new file mode 100644 index 0000000..f201bf1 --- /dev/null +++ b/sv-parser-pp/testcases/expected/IEEE18002017_keywords_m2_18002005.sv @@ -0,0 +1,8 @@ + +`begin_keywords "1800-2005" +module m2 (); + // "logic" IS a reserved keyword in IEEE1800-2005. + // This module should pass both the preprocessor, but NOT the main parser. + reg [63:0] logic; +endmodule +`end_keywords From fc26dbf3416d80ea7418da784b0ef618aa2d6b04 Mon Sep 17 00:00:00 2001 From: damc Date: Tue, 26 Jul 2022 11:20:39 +0200 Subject: [PATCH 44/62] ppTests rm whitespace_directives - Replacing with more thorough tests. --- sv-parser-pp/src/preprocess.rs | 19 ------------------- .../expected/whitespace_directives.sv | 17 ----------------- .../testcases/whitespace_directives.sv | 17 ----------------- 3 files changed, 53 deletions(-) delete mode 100644 sv-parser-pp/testcases/expected/whitespace_directives.sv delete mode 100644 sv-parser-pp/testcases/whitespace_directives.sv diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index a802d47..1c37adb 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -1482,23 +1482,4 @@ mod tests { ); assert_eq!(format!("{:?}", ret), "Err(ExceedRecursiveLimit)"); } // }}} - - // Check that preprocess() doesn't introduce extra whitespace within and - // around compiler directives. - #[test] - fn whitespace_directives() { // {{{ - let include_paths = [testfile_path("")]; - let (ret, _) = preprocess( - testfile_path("whitespace_directives.sv"), - &HashMap::new(), - &include_paths, - false, - false, - ) - .unwrap(); - assert_eq!( - ret.text(), - testfile_contents("expected/whitespace_directives.sv") - ); - } // }}} } diff --git a/sv-parser-pp/testcases/expected/whitespace_directives.sv b/sv-parser-pp/testcases/expected/whitespace_directives.sv deleted file mode 100644 index 390e540..0000000 --- a/sv-parser-pp/testcases/expected/whitespace_directives.sv +++ /dev/null @@ -1,17 +0,0 @@ -//top -`resetall -`timescale 10 us / 100 ns -`default_nettype wire -//first -`default_nettype none//middle -//last -`unconnected_drive pull0 -`unconnected_drive pull1 -`nounconnected_drive -`celldefine -`endcelldefine -`pragma foo -`pragma foo bar -`line 5 "foo" 0 -`begin_keywords "1800-2017" -`end_keywords diff --git a/sv-parser-pp/testcases/whitespace_directives.sv b/sv-parser-pp/testcases/whitespace_directives.sv deleted file mode 100644 index 390e540..0000000 --- a/sv-parser-pp/testcases/whitespace_directives.sv +++ /dev/null @@ -1,17 +0,0 @@ -//top -`resetall -`timescale 10 us / 100 ns -`default_nettype wire -//first -`default_nettype none//middle -//last -`unconnected_drive pull0 -`unconnected_drive pull1 -`nounconnected_drive -`celldefine -`endcelldefine -`pragma foo -`pragma foo bar -`line 5 "foo" 0 -`begin_keywords "1800-2017" -`end_keywords From 15c38aaa0cd7967c8629fc1c1b975b51e9bbea58 Mon Sep 17 00:00:00 2001 From: damc Date: Tue, 26 Jul 2022 11:21:25 +0200 Subject: [PATCH 45/62] ppTests keywords --- sv-parser-pp/src/preprocess.rs | 17 ++++++++++ sv-parser-pp/testcases/keywords.sv | 50 ++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 sv-parser-pp/testcases/keywords.sv diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 1c37adb..4db5ba6 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -1329,6 +1329,23 @@ mod tests { assert_eq!(format!("{:?}", ret), "Err(IncludeLine)"); } // }}} + #[test] + fn keywords() { // {{{ + let include_paths = [testfile_path("")]; + let (ret, _) = preprocess( + testfile_path("keywords.sv"), + &HashMap::new(), + &include_paths, + false, + false, + ) + .unwrap(); + assert_eq!( + ret.text(), + testfile_contents("keywords.sv") + ); + } // }}} + #[test] fn macro_arguments() { // {{{ let (ret, _) = preprocess( diff --git a/sv-parser-pp/testcases/keywords.sv b/sv-parser-pp/testcases/keywords.sv new file mode 100644 index 0000000..f053565 --- /dev/null +++ b/sv-parser-pp/testcases/keywords.sv @@ -0,0 +1,50 @@ +// IEEE1800-2017 Clause 22.14 +// A pair of directives, `begin_keywords and `end_keywords, can be used to +// specify what identifiers are reserved as keywords within a block of source +// code, based on a specific version of IEEE Std 1364 or IEEE Std 1800. +// The `begin_keywords and `end_keywords directives only specify the set of +// identifiers that are reserved as keywords. The directives do not affect the +// semantics, tokens, and other aspects of the SystemVerilog language. +// The `begin_keywords and `end_keywords directives can only be specified +// outside a design element. The `begin_keywords directive affects all source +// code that follows the directive, even across source code file boundaries, +// until the matching `end_keywords directive or the end of the compilation +// unit. The results of these directives are not affected by the `resetall +// directive. +`begin_keywords "1800-2017" +`end_keywords +`begin_keywords "1800-2012" +`end_keywords +`begin_keywords "1800-2009" +`end_keywords +`begin_keywords "1800-2005" +`end_keywords +`begin_keywords "1364-2005" +`end_keywords +`begin_keywords "1364-2001" +`end_keywords +`begin_keywords "1364-2001-noconfig" +`end_keywords +`begin_keywords "1364-1995" +`end_keywords +// The `begin_keywords `end_keywords directive pair can be nested. Each nested +// pair is stacked so that when an `end_keywords directive is encountered, the +// implementation returns to using the version_ specifier that was in effect +// prior to the matching `begin_keywords directive. +`begin_keywords "1800-2017" +`begin_keywords "1800-2012" +`begin_keywords "1800-2009" +`begin_keywords "1800-2005" +`begin_keywords "1364-2005" +`begin_keywords "1364-2001" +`begin_keywords "1364-2001-noconfig" +`begin_keywords "1364-1995" +`end_keywords +`end_keywords +`end_keywords +`end_keywords +`end_keywords +`end_keywords +`end_keywords +`end_keywords +// This file should be emitted from the preprocessor unchanged. From dc36b4b11f707567a96bf3c370cd81c42b81235b Mon Sep 17 00:00:00 2001 From: damc Date: Tue, 26 Jul 2022 11:24:04 +0200 Subject: [PATCH 46/62] ppTests timescale --- sv-parser-pp/src/preprocess.rs | 17 +++++++++++++++++ sv-parser-pp/testcases/timescale.sv | 17 +++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 sv-parser-pp/testcases/timescale.sv diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 4db5ba6..8fea4d6 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -1499,4 +1499,21 @@ mod tests { ); assert_eq!(format!("{:?}", ret), "Err(ExceedRecursiveLimit)"); } // }}} + + #[test] + fn timescale() { // {{{ + let include_paths = [testfile_path("")]; + let (ret, _) = preprocess( + testfile_path("timescale.sv"), + &HashMap::new(), + &include_paths, + false, + false, + ) + .unwrap(); + assert_eq!( + ret.text(), + testfile_contents("timescale.sv") + ); + } // }}} } diff --git a/sv-parser-pp/testcases/timescale.sv b/sv-parser-pp/testcases/timescale.sv new file mode 100644 index 0000000..89822f5 --- /dev/null +++ b/sv-parser-pp/testcases/timescale.sv @@ -0,0 +1,17 @@ +// IEEE1800-2017 Clause 22.7 +// This directive specifies the time unit and time precision of the design +// elements that follow it. The time unit is the unit of measurement for time +// values such as the simulation time and delay values. +// The `timescale compiler directive specifies the default unit of measurement +// for time and delay values and the degree of accuracy for delays in all +// design elements that follow this directive, and that do not have timeunit +// and timeprecision constructs specified within the design element, until +// another `timescale compiler directive is read. +// The integers in these arguments specify an order of magnitude for the size +// of the value; the valid integers are 1, 10, and 100. +// The character strings represent units of measurement; the valid character +// strings are s, ms, us, ns, ps, and fs. +`timescale 1 s / 10 ms +`timescale 10 us / 100 ns +`timescale 100 ps / 100 fs +// This file should be emitted from the preprocessor unchanged. From 466301c9c921a36f43e3831a8fcb10a1784959fb Mon Sep 17 00:00:00 2001 From: damc Date: Tue, 26 Jul 2022 11:24:39 +0200 Subject: [PATCH 47/62] ppTests celldefine --- sv-parser-pp/src/preprocess.rs | 17 +++++++++++++++++ sv-parser-pp/testcases/celldefine.sv | 13 +++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 sv-parser-pp/testcases/celldefine.sv diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 8fea4d6..de326d1 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -1117,6 +1117,23 @@ mod tests { ); } // }}} + #[test] + fn celldefine() { // {{{ + let include_paths = [testfile_path("")]; + let (ret, _) = preprocess( + testfile_path("celldefine.sv"), + &HashMap::new(), + &include_paths, + false, + false, + ) + .unwrap(); + assert_eq!( + ret.text(), + testfile_contents("celldefine.sv") + ); + } // }}} + #[test] fn ifdef_nested() { // {{{ let (ret, _) = preprocess( diff --git a/sv-parser-pp/testcases/celldefine.sv b/sv-parser-pp/testcases/celldefine.sv new file mode 100644 index 0000000..779f8f7 --- /dev/null +++ b/sv-parser-pp/testcases/celldefine.sv @@ -0,0 +1,13 @@ +// IEEE1800-2017 Clause 22.10 +// The directives `celldefine and `endcelldefine tag modules as cell modules. +// Cells are used by certain PLI routines and may be useful for applications +// such as delay calculations. It is advisable to pair each `celldefine with an +// `endcelldefine, but it is not required. The latest occurrence of either +// directive in the source controls whether modules are tagged as cell modules. +// More than one of these pairs may appear in a single source description. +// These directives may appear anywhere in the source description, but it is +// recommended that the directives be specified outside any design elements. +// The `resetall directive includes the effects of a `endcelldefine directive. +`celldefine +`endcelldefine +// This file should be emitted from the preprocessor unchanged. From 5c96bcb7e6e3b6261df9c187f0950ec6325ee55d Mon Sep 17 00:00:00 2001 From: damc Date: Tue, 26 Jul 2022 11:25:09 +0200 Subject: [PATCH 48/62] ppTests default_nettype --- sv-parser-pp/src/preprocess.rs | 17 +++++++++++++++++ sv-parser-pp/testcases/default_nettype.sv | 22 ++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 sv-parser-pp/testcases/default_nettype.sv diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index de326d1..e0a6c99 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -1134,6 +1134,23 @@ mod tests { ); } // }}} + #[test] + fn default_nettype() { // {{{ + let include_paths = [testfile_path("")]; + let (ret, _) = preprocess( + testfile_path("default_nettype.sv"), + &HashMap::new(), + &include_paths, + false, + false, + ) + .unwrap(); + assert_eq!( + ret.text(), + testfile_contents("default_nettype.sv") + ); + } // }}} + #[test] fn ifdef_nested() { // {{{ let (ret, _) = preprocess( diff --git a/sv-parser-pp/testcases/default_nettype.sv b/sv-parser-pp/testcases/default_nettype.sv new file mode 100644 index 0000000..11b23f0 --- /dev/null +++ b/sv-parser-pp/testcases/default_nettype.sv @@ -0,0 +1,22 @@ +// IEEE1800-2017 Clause 22.8 +// The directive `default_nettype controls the net type created for implicit +// net declarations. It can be used only outside design elements. Multiple +// `default_nettype directives are allowed. The latest occurrence of this +// directive in the source controls the type of nets that will be implicitly +// declared. +// When no `default_nettype directive is present or if the `resetall directive +// is specified, implicit nets are of type wire. When the `default_nettype is +// set to none, all nets shall be explicitly declared. If a net is not +// explicitly declared, an error is generated. +`default_nettype wire // Comment immmediately after keyword+space +`default_nettype tri +`default_nettype tri0 +`default_nettype tri1 +`default_nettype wand +`default_nettype triand +`default_nettype wor +`default_nettype trior +`default_nettype trireg +`default_nettype uwire +`default_nettype none// Comment immmediately after keyword +// This file should be emitted from the preprocessor unchanged. From 3641284d685ef669a924594bb8f4ad914f4fc834 Mon Sep 17 00:00:00 2001 From: damc Date: Tue, 26 Jul 2022 11:25:59 +0200 Subject: [PATCH 49/62] ppTests unconnected_drive --- sv-parser-pp/src/preprocess.rs | 17 +++++++++++++++++ sv-parser-pp/testcases/unconnected_drive.sv | 13 +++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 sv-parser-pp/testcases/unconnected_drive.sv diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index e0a6c99..92f4b5c 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -1550,4 +1550,21 @@ mod tests { testfile_contents("timescale.sv") ); } // }}} + + #[test] + fn unconnected_drive() { // {{{ + let include_paths = [testfile_path("")]; + let (ret, _) = preprocess( + testfile_path("unconnected_drive.sv"), + &HashMap::new(), + &include_paths, + false, + false, + ) + .unwrap(); + assert_eq!( + ret.text(), + testfile_contents("unconnected_drive.sv") + ); + } // }}} } diff --git a/sv-parser-pp/testcases/unconnected_drive.sv b/sv-parser-pp/testcases/unconnected_drive.sv new file mode 100644 index 0000000..e48f549 --- /dev/null +++ b/sv-parser-pp/testcases/unconnected_drive.sv @@ -0,0 +1,13 @@ +// IEEE1800-2017 Clause 22.9 +// The directive `unconnected_drive takes one of two arguments - pull1 or +// pull 0. When pull1 is specified, unconnected ports are pulled down. It is +// advisable to pair each `unconnected_drive with a +// `nounconnected_drive, but it is not required. The latest occurrence of +// either directive in the source controls what happens to unconnected ports. +// These directives shall be specified outside the design element declarations. +// The `resetall directive includes the effects of a `nounconnected +// directive. +`unconnected_drive pull0 +`unconnected_drive pull1 +`nounconnected_drive +// This file should be emitted from the preprocessor unchanged. From c56c6a965b35f010f54d697375bfa45d8c4a1299 Mon Sep 17 00:00:00 2001 From: damc Date: Tue, 26 Jul 2022 11:42:17 +0200 Subject: [PATCH 50/62] ppTests pragma --- sv-parser-pp/src/preprocess.rs | 17 ++++++++++++ sv-parser-pp/testcases/pragma.sv | 46 ++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 sv-parser-pp/testcases/pragma.sv diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 92f4b5c..1760b97 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -1534,6 +1534,23 @@ mod tests { assert_eq!(format!("{:?}", ret), "Err(ExceedRecursiveLimit)"); } // }}} + #[test] + fn pragma() { // {{{ + let include_paths = [testfile_path("")]; + let (ret, _) = preprocess( + testfile_path("pragma.sv"), + &HashMap::new(), + &include_paths, + false, + false, + ) + .unwrap(); + assert_eq!( + ret.text(), + testfile_contents("pragma.sv") + ); + } // }}} + #[test] fn timescale() { // {{{ let include_paths = [testfile_path("")]; diff --git a/sv-parser-pp/testcases/pragma.sv b/sv-parser-pp/testcases/pragma.sv new file mode 100644 index 0000000..7fc9e9c --- /dev/null +++ b/sv-parser-pp/testcases/pragma.sv @@ -0,0 +1,46 @@ +// IEEE1800-2017 Clause 22.11 +// The `pragma directive is a structured specification that alters +// interpretation of the SystemVerilog source. The specification introduced by +// this directive is referred to as a pragma. The effect of pragmas other than +// those specified in this standard is implementation-specific. +`pragma foo +`pragma foo bar +`pragma foo bar,baz +`pragma foo bar, baz +// The reset and resetall pragmas shall restore the default values and state of +// pragma_keywords associated with the affected pragmas. These default values +// shall be the values that the tool defines before any SystemVerilog text has +// been processed. The reset pragma shall reset the state for all pragma_names +// that appear as pragma_keywords in the directive. The resetall pragma shall +// reset the state of all pragma_names recognized by the implementation. +`pragma reset bar +`pragma reset bar,baz +`pragma reset bar, baz + +// Protected envelopes specify a region of text that shall be transformed prior +// to analysis by the source language processor. These regions of text are +// structured to provide the source language processor with the specification +// of the cryptographic algorithm, key, envelope attributes, and textual design +// data. +// The following example shows the use of the protect pragma to specify +// encryption of design data. The encryption method is a simple substitution +// cipher where each alphabetic character is replaced with the 13th character +// in alphabetic sequence, commonly referred to as "rot13." Nonalphabetic +// characters are not substituted. The following design data contain an +// encryption envelope that specifies the desired protection. +module secret (a, b); + input a; + output b; +`pragma protect encoding=(enctype="raw") +`pragma protect data_method="x-caesar", data_keyname="rot13", begin +`pragma protect runtime_license=(library="lic.so",feature="runSecret",entry="chk", match=42) + logic b; + initial begin + b = 0; + end + always begin + #5 b = a; + end +`pragma protect end +endmodule +// This file should be emitted from the preprocessor unchanged. From 3c693d0d68a25213985e0a3a3c8817326d650001 Mon Sep 17 00:00:00 2001 From: damc Date: Tue, 26 Jul 2022 11:48:36 +0200 Subject: [PATCH 51/62] ppTests resetall --- sv-parser-pp/src/preprocess.rs | 17 +++++++++++++++++ sv-parser-pp/testcases/resetall.sv | 16 ++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 sv-parser-pp/testcases/resetall.sv diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 1760b97..805db4a 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -1551,6 +1551,23 @@ mod tests { ); } // }}} + #[test] + fn resetall() { // {{{ + let include_paths = [testfile_path("")]; + let (ret, _) = preprocess( + testfile_path("resetall.sv"), + &HashMap::new(), + &include_paths, + false, + false, + ) + .unwrap(); + assert_eq!( + ret.text(), + testfile_contents("resetall.sv") + ); + } // }}} + #[test] fn timescale() { // {{{ let include_paths = [testfile_path("")]; diff --git a/sv-parser-pp/testcases/resetall.sv b/sv-parser-pp/testcases/resetall.sv new file mode 100644 index 0000000..b81eb90 --- /dev/null +++ b/sv-parser-pp/testcases/resetall.sv @@ -0,0 +1,16 @@ +// IEEE1800-2017 Clause 22.3 +// When `resetall compiler directive is encountered during compilation, all +// compiler directives are set to the default values. This is useful for +// ensuring that only directives that are desired in compiling a particular +// source file are active. +// The recommended usage is to place `resetall at the beginning of each source +// text file, followed immediately by the directives desired in the file. +// It shall be illegal for the `resetall directive to be specified within +// a design element. +// Not all compiler directives have a default value (e.g., `define and +// `include). Directives that do not have a default are not affected by +// `resetall. +`resetall // Comment +`resetall// Comment +`resetall +// This file should be emitted from the preprocessor unchanged. From bf6e5688aa50ddc8b3a6fc588e4358b99766c041 Mon Sep 17 00:00:00 2001 From: damc Date: Tue, 26 Jul 2022 12:03:09 +0200 Subject: [PATCH 52/62] ppTests line --- sv-parser-pp/src/preprocess.rs | 17 +++++++++++++++++ sv-parser-pp/testcases/line.sv | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 sv-parser-pp/testcases/line.sv diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 805db4a..caa686e 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -1380,6 +1380,23 @@ mod tests { ); } // }}} + #[test] + fn line() { // {{{ + let include_paths = [testfile_path("")]; + let (ret, _) = preprocess( + testfile_path("line.sv"), + &HashMap::new(), + &include_paths, + false, + false, + ) + .unwrap(); + assert_eq!( + ret.text(), + testfile_contents("line.sv") + ); + } // }}} + #[test] fn macro_arguments() { // {{{ let (ret, _) = preprocess( diff --git a/sv-parser-pp/testcases/line.sv b/sv-parser-pp/testcases/line.sv new file mode 100644 index 0000000..120e380 --- /dev/null +++ b/sv-parser-pp/testcases/line.sv @@ -0,0 +1,34 @@ +// IEEE1800-2017 Clause 22.12 +// The `line compiler directive can be used to specify the original source code +// line number and file name. +// This allows the location in the original file to be maintained if another +// process modifies the source. After the new line number and file name are +// specified, the compiler can correctly refer to the original source location. +// However, a tool is not required to produce `line directives. These +// directives are not intended to be inserted manually into the code, although +// they can be. +// The compiler shall maintain the current line number and file name of the +// file being compiled. The `line directive shall set the line number and file +// name of the following line to those specified in the directive. +// The directive can be specified anywhere within the SystemVerilog source +// description. However, only white space may appear on the same line as the +// `line directive. Comments are not allowed on the same line as a `line +// directive. All parameters in the `line directive are required. The results +// of this directive are not affected by the `resetall directive. +// +// The number parameter shall be a positive integer that specifies the new line +// number of the following text line. The filename parameter shall be a string +// literal that is treated as the new name of the file. The filename can also +// be a full or relative path name. The level parameter shall be 0, 1, or 2. +// The value 1 indicates that the following line is the first line after an +// include file has been entered. The value 2 indicates that the following +// line is the first line after an include file has been exited. The value +// 0 indicates any other line. + +`line 3 "orig.v" 2 +// This line is line 3 of orig.v after exiting include file + +`line 999 "foo.sv" 2 +`line 888 "foo.sv" 1 +`line 777 "foo.sv" 0 +// This file should be emitted from the preprocessor unchanged. From ae43678b9efe5453db537b812166b6561ca2a4ea Mon Sep 17 00:00:00 2001 From: damc Date: Tue, 26 Jul 2022 12:57:50 +0200 Subject: [PATCH 53/62] ppTests undef --- sv-parser-pp/src/preprocess.rs | 17 ++++++++++++++ sv-parser-pp/testcases/expected/undef.sv | 20 +++++++++++++++++ sv-parser-pp/testcases/undef.sv | 28 ++++++++++++++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 sv-parser-pp/testcases/expected/undef.sv create mode 100644 sv-parser-pp/testcases/undef.sv diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index caa686e..d79061c 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -1618,4 +1618,21 @@ mod tests { testfile_contents("unconnected_drive.sv") ); } // }}} + + #[test] + fn undef() { // {{{ + let include_paths = [testfile_path("")]; + let (ret, _) = preprocess( + testfile_path("undef.sv"), + &HashMap::new(), + &include_paths, + false, + false, + ) + .unwrap(); + assert_eq!( + ret.text(), + testfile_contents("expected/undef.sv") + ); + } // }}} } diff --git a/sv-parser-pp/testcases/expected/undef.sv b/sv-parser-pp/testcases/expected/undef.sv new file mode 100644 index 0000000..e0e4eff --- /dev/null +++ b/sv-parser-pp/testcases/expected/undef.sv @@ -0,0 +1,20 @@ +// IEEE1800-2017 Clause 22.5.2 +// The directive `undef shall undefine the specified text macro if previously +// defined by a `define compiler directive within the compilation unit. An +// attempt to undefine a text macro that was not previously defined using a +// `define compiler directive can issue a warning. +`undef FOO +`undef FOO// Comment +`undef FOO // Comment + +`define FOO foo +// AAA +// This block SHOULD be emitted from the preprocessor. + + + +`undef FOO + +// BBB +// This block SHOULD be emitted from the preprocessor. + diff --git a/sv-parser-pp/testcases/undef.sv b/sv-parser-pp/testcases/undef.sv new file mode 100644 index 0000000..76d3731 --- /dev/null +++ b/sv-parser-pp/testcases/undef.sv @@ -0,0 +1,28 @@ +// IEEE1800-2017 Clause 22.5.2 +// The directive `undef shall undefine the specified text macro if previously +// defined by a `define compiler directive within the compilation unit. An +// attempt to undefine a text macro that was not previously defined using a +// `define compiler directive can issue a warning. +`undef FOO +`undef FOO// Comment +`undef FOO // Comment + +`define FOO foo +`ifdef FOO +// AAA +// This block SHOULD be emitted from the preprocessor. +`endif +`ifndef FOO +// AAA +// This block should NOT be emitted from the preprocessor. +`endif + +`undef FOO +`ifdef FOO +// BBB +// This block should NOT be emitted from the preprocessor. +`endif +`ifndef FOO +// BBB +// This block SHOULD be emitted from the preprocessor. +`endif From 543915011bd473f18761f517f9499ee01ce876a9 Mon Sep 17 00:00:00 2001 From: damc Date: Tue, 26 Jul 2022 13:06:16 +0200 Subject: [PATCH 54/62] ppTests undefineall --- .../testcases/expected/undefineall.sv | 29 ++++++++++++ sv-parser-pp/testcases/undefineall.sv | 45 +++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 sv-parser-pp/testcases/expected/undefineall.sv create mode 100644 sv-parser-pp/testcases/undefineall.sv diff --git a/sv-parser-pp/testcases/expected/undefineall.sv b/sv-parser-pp/testcases/expected/undefineall.sv new file mode 100644 index 0000000..c711d39 --- /dev/null +++ b/sv-parser-pp/testcases/expected/undefineall.sv @@ -0,0 +1,29 @@ +// IEEE1800-2017 Clause 22.5.2 +// The directive `undef shall undefine the specified text macro if previously +// defined by a `define compiler directive within the compilation unit. An +// attempt to undefine a text macro that was not previously defined using a +// `define compiler directive can issue a warning. +`undef FOO +`undef FOO// Comment +`undef FOO // Comment + +`define FOO foo +`define BAR bar +// AAA +// This block SHOULD be emitted from the preprocessor. + + +// BBB +// This block SHOULD be emitted from the preprocessor. + + + +`undefineall + +// CCC +// This block SHOULD be emitted from the preprocessor. + + +// DDD +// This block SHOULD be emitted from the preprocessor. + diff --git a/sv-parser-pp/testcases/undefineall.sv b/sv-parser-pp/testcases/undefineall.sv new file mode 100644 index 0000000..734fb4a --- /dev/null +++ b/sv-parser-pp/testcases/undefineall.sv @@ -0,0 +1,45 @@ +// IEEE1800-2017 Clause 22.5.3 +// The directive `undefineall directive shall undefine all text macros +// previously defined by `define compiler directives within the compilation +// unit. This directive takes no argument and may appear anywhere in the source +// description. +`undefineall +`undefineall// Comment +`undefineall // Comment + +`define FOO foo +`define BAR bar +`ifdef FOO +// AAA +// This block SHOULD be emitted from the preprocessor. +`endif +`ifndef FOO +// AAA +// This block should NOT be emitted from the preprocessor. +`endif +`ifdef BAR +// BBB +// This block SHOULD be emitted from the preprocessor. +`endif +`ifndef BAR +// BBB +// This block should NOT be emitted from the preprocessor. +`endif + +`undefineall +`ifdef FOO +// CCC +// This block should NOT be emitted from the preprocessor. +`endif +`ifndef FOO +// CCC +// This block SHOULD be emitted from the preprocessor. +`endif +`ifdef BAR +// DDD +// This block should NOT be emitted from the preprocessor. +`endif +`ifndef BAR +// DDD +// This block SHOULD be emitted from the preprocessor. +`endif From ab4845a964330fda1046eba0272f6efd28366c78 Mon Sep 17 00:00:00 2001 From: damc Date: Tue, 26 Jul 2022 13:10:52 +0200 Subject: [PATCH 55/62] ppTests Avoid removal of `undef and `undefineall directives. - Similarly to how `define is left in-place, `undef and `undefine are also left in-place. - Corresponding fixes to macro_LINE and macro_FILE. - These directives were not in any testcases before this branch. --- sv-parser-pp/src/preprocess.rs | 22 ++++++++++++++----- sv-parser-pp/testcases/expected/macro_FILE.sv | 2 ++ sv-parser-pp/testcases/expected/macro_LINE.sv | 2 ++ 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index d79061c..2793f1f 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -379,18 +379,28 @@ pub fn preprocess_str, U: AsRef, V: BuildHasher>( skip_whitespace = false; } NodeEvent::Enter(RefNode::UndefineCompilerDirective(x)) => { - skip_nodes.push(x.into()); - skip = true; - let (_, _, ref name) = x.nodes; let id = identifier((&name.nodes.0).into(), &s).unwrap(); defines.remove(&id); + + let locate: Locate = x.try_into().unwrap(); + let range = Range::new(locate.offset, locate.offset + locate.len); + ret.push(locate.str(&s), Some((path.as_ref(), range))); + skip_whitespace = true; + } + NodeEvent::Leave(RefNode::UndefineCompilerDirective(_)) => { + skip_whitespace = false; } NodeEvent::Enter(RefNode::UndefineallCompilerDirective(x)) => { - skip_nodes.push(x.into()); - skip = true; - defines.clear(); + + let locate: Locate = x.try_into().unwrap(); + let range = Range::new(locate.offset, locate.offset + locate.len); + ret.push(locate.str(&s), Some((path.as_ref(), range))); + skip_whitespace = true; + } + NodeEvent::Leave(RefNode::UndefineallCompilerDirective(_)) => { + skip_whitespace = false; } NodeEvent::Enter(RefNode::IfdefDirective(x)) => { let (_, ref keyword, ref ifid, ref ifbody, ref elsif, ref elsebody, _, _) = x.nodes; diff --git a/sv-parser-pp/testcases/expected/macro_FILE.sv b/sv-parser-pp/testcases/expected/macro_FILE.sv index 402c6d1..6edf5c2 100644 --- a/sv-parser-pp/testcases/expected/macro_FILE.sv +++ b/sv-parser-pp/testcases/expected/macro_FILE.sv @@ -10,4 +10,6 @@ `define __FILE__ "FOO" // The following undef should have no effect. +`undef __FILE__ + // NOTE: Comparison against expected value are destined to fail in testcase. diff --git a/sv-parser-pp/testcases/expected/macro_LINE.sv b/sv-parser-pp/testcases/expected/macro_LINE.sv index 46752cd..58ec595 100644 --- a/sv-parser-pp/testcases/expected/macro_LINE.sv +++ b/sv-parser-pp/testcases/expected/macro_LINE.sv @@ -10,6 +10,8 @@ `define __LINE__ -2 // The following undef should have no effect. +`undef __LINE__ + module M; initial if (26 == 28) // Should be "26 == 28". From edf66849ea1cfd9290182f8f071cf2e8aa2d64f9 Mon Sep 17 00:00:00 2001 From: damc Date: Tue, 26 Jul 2022 13:30:33 +0200 Subject: [PATCH 56/62] ppTests Add missing undefineall test. --- sv-parser-pp/src/preprocess.rs | 17 +++++++++++++++++ sv-parser-pp/testcases/expected/undefineall.sv | 16 ++++++++-------- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 2793f1f..adc4303 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -1645,4 +1645,21 @@ mod tests { testfile_contents("expected/undef.sv") ); } // }}} + + #[test] + fn undefineall() { // {{{ + let include_paths = [testfile_path("")]; + let (ret, _) = preprocess( + testfile_path("undefineall.sv"), + &HashMap::new(), + &include_paths, + false, + false, + ) + .unwrap(); + assert_eq!( + ret.text(), + testfile_contents("expected/undefineall.sv") + ); + } // }}} } diff --git a/sv-parser-pp/testcases/expected/undefineall.sv b/sv-parser-pp/testcases/expected/undefineall.sv index c711d39..9e5be19 100644 --- a/sv-parser-pp/testcases/expected/undefineall.sv +++ b/sv-parser-pp/testcases/expected/undefineall.sv @@ -1,11 +1,11 @@ -// IEEE1800-2017 Clause 22.5.2 -// The directive `undef shall undefine the specified text macro if previously -// defined by a `define compiler directive within the compilation unit. An -// attempt to undefine a text macro that was not previously defined using a -// `define compiler directive can issue a warning. -`undef FOO -`undef FOO// Comment -`undef FOO // Comment +// IEEE1800-2017 Clause 22.5.3 +// The directive `undefineall directive shall undefine all text macros +// previously defined by `define compiler directives within the compilation +// unit. This directive takes no argument and may appear anywhere in the source +// description. +`undefineall +`undefineall// Comment +`undefineall // Comment `define FOO foo `define BAR bar From ddf33de79dc938e60d22e13b0c5a87f0545b73d9 Mon Sep 17 00:00:00 2001 From: damc Date: Tue, 26 Jul 2022 16:46:13 +0200 Subject: [PATCH 57/62] ppTests Explain and rename include_basic,include_origin -> include_withindent,include_noindent --- sv-parser-pp/src/preprocess.rs | 116 +++++++++++------- ...{include_origin.sv => include_noindent.sv} | 0 ...include_basic.sv => include_withindent.sv} | 0 ...{include_origin.sv => include_noindent.sv} | 0 ...include_basic.sv => include_withindent.sv} | 0 5 files changed, 72 insertions(+), 44 deletions(-) rename sv-parser-pp/testcases/expected/{include_origin.sv => include_noindent.sv} (100%) rename sv-parser-pp/testcases/expected/{include_basic.sv => include_withindent.sv} (100%) rename sv-parser-pp/testcases/{include_origin.sv => include_noindent.sv} (100%) rename sv-parser-pp/testcases/{include_basic.sv => include_withindent.sv} (100%) diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index adc4303..c8d3626 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -1234,38 +1234,6 @@ mod tests { ); } // }}} - #[test] - fn include_basic() { // {{{ - let include_paths = [testfile_path("")]; - let (ret, _) = preprocess( - testfile_path("include_basic.sv"), - &HashMap::new(), - &include_paths, - false, - false, - ) - .unwrap(); - assert_eq!( - ret.text(), - testfile_contents("expected/include_basic.sv") - ); - assert_eq!( - ret.origin(10).unwrap().0, - &PathBuf::from(testfile_path("include_basic.sv")) - ); - assert_eq!(ret.origin(10).unwrap().1, 10); - assert_eq!( - ret.origin(60).unwrap().0, - &PathBuf::from(testfile_path("included.svh")) - ); - assert_eq!(ret.origin(60).unwrap().1, 74); - assert_eq!( - ret.origin(80).unwrap().0, - &PathBuf::from(testfile_path("include_basic.sv")) - ); - assert_eq!(ret.origin(80).unwrap().1, 63); - } // }}} - #[test] fn include_ignore() { // {{{ let include_paths = [testfile_path("")]; @@ -1284,35 +1252,49 @@ mod tests { } // }}} #[test] - fn include_origin() { // {{{ + fn include_noindent() { // {{{ let include_paths = [testfile_path("")]; let (ret, _) = preprocess( - testfile_path("include_origin.sv"), + testfile_path("include_noindent.sv"), &HashMap::new(), &include_paths, false, false, ) .unwrap(); + assert_eq!( ret.text(), - testfile_contents("expected/include_origin.sv") + testfile_contents("expected/include_noindent.sv") ); + + // 11th char of returned text is '_' in the module identifier + // "and_op", and originates from the parent file. + // Characters are zero-indexed. + let n = 10; assert_eq!( - ret.origin(10).unwrap().0, - &PathBuf::from(testfile_path("include_origin.sv")) + ret.origin(n).unwrap(), + (&PathBuf::from(testfile_path("include_noindent.sv")), n) ); - assert_eq!(ret.origin(10).unwrap().1, 10); + assert_eq!(ret.text().chars().nth(n).unwrap(), '_'); + + // 51st char of returned text is 'd' in the primitive identifier + // "and", and originates from the child file at character index 72. + let n = 50; assert_eq!( - ret.origin(50).unwrap().0, - &PathBuf::from(testfile_path("included.svh")) + ret.origin(n).unwrap(), + (&PathBuf::from(testfile_path("included.svh")), 73) ); - assert_eq!(ret.origin(50).unwrap().1, 73); + assert_eq!(ret.text().chars().nth(n).unwrap(), 'd'); + + // 71st char of returned text is 'o' in the keword "endmodule", and + // originates from the parent file. + let n = 70; assert_eq!( - ret.origin(70).unwrap().0, - &PathBuf::from(testfile_path("include_origin.sv")) + ret.origin(n).unwrap(), + (&PathBuf::from(testfile_path("include_noindent.sv")), 53) ); - assert_eq!(ret.origin(70).unwrap().1, 53); + assert_eq!(ret.text().chars().nth(n).unwrap(), 'o'); } // }}} #[test] @@ -1373,6 +1355,52 @@ mod tests { assert_eq!(format!("{:?}", ret), "Err(IncludeLine)"); } // }}} + #[test] + fn include_withindent() { // {{{ + let include_paths = [testfile_path("")]; + let (ret, _) = preprocess( + testfile_path("include_withindent.sv"), + &HashMap::new(), + &include_paths, + false, + false, + ) + .unwrap(); + + assert_eq!( + ret.text(), + testfile_contents("expected/include_withindent.sv") + ); + + // 11th char of returned text is '_' in the module identifier + // "and_op", and originates from the parent file. + // Characters are zero-indexed. + let n = 10; + assert_eq!( + ret.origin(n).unwrap(), + (&PathBuf::from(testfile_path("include_withindent.sv")), n) + ); + assert_eq!(ret.text().chars().nth(n).unwrap(), '_'); + + // 59th char of returned text is 'n' in the primitive identifier + // "and", and originates from the child file at character index 72. + let n = 58; + assert_eq!( + ret.origin(n).unwrap(), + (&PathBuf::from(testfile_path("included.svh")), 72) + ); + assert_eq!(ret.text().chars().nth(n).unwrap(), 'n'); + + // 80th char of returned text is 'o' in the keyword "endmodule", and + // originates from the parent file. + let n = 79; + assert_eq!( + ret.origin(n).unwrap(), + (&PathBuf::from(testfile_path("include_withindent.sv")), 62) + ); + assert_eq!(ret.text().chars().nth(n).unwrap(), 'o'); + } // }}} + #[test] fn keywords() { // {{{ let include_paths = [testfile_path("")]; diff --git a/sv-parser-pp/testcases/expected/include_origin.sv b/sv-parser-pp/testcases/expected/include_noindent.sv similarity index 100% rename from sv-parser-pp/testcases/expected/include_origin.sv rename to sv-parser-pp/testcases/expected/include_noindent.sv diff --git a/sv-parser-pp/testcases/expected/include_basic.sv b/sv-parser-pp/testcases/expected/include_withindent.sv similarity index 100% rename from sv-parser-pp/testcases/expected/include_basic.sv rename to sv-parser-pp/testcases/expected/include_withindent.sv diff --git a/sv-parser-pp/testcases/include_origin.sv b/sv-parser-pp/testcases/include_noindent.sv similarity index 100% rename from sv-parser-pp/testcases/include_origin.sv rename to sv-parser-pp/testcases/include_noindent.sv diff --git a/sv-parser-pp/testcases/include_basic.sv b/sv-parser-pp/testcases/include_withindent.sv similarity index 100% rename from sv-parser-pp/testcases/include_basic.sv rename to sv-parser-pp/testcases/include_withindent.sv From 2b9ed7831880051c685e7e76c33d796c39e8e320 Mon Sep 17 00:00:00 2001 From: damc Date: Tue, 26 Jul 2022 17:25:42 +0200 Subject: [PATCH 58/62] ppTests Comment-only explain include implementation. --- sv-parser-pp/src/preprocess.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index c8d3626..48928d6 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -549,6 +549,9 @@ pub fn preprocess_str, U: AsRef, V: BuildHasher>( let locate: Locate = x.try_into().unwrap(); last_include_line = Some(locate.line); + // IEEE1800-2017 Clause 22.4, page 675 + // Only white space or a comment may appear on the same line as + // the `include compiler directive. if let Some(last_item_line) = last_item_line { if last_item_line == locate.line { return Err(Error::IncludeLine); @@ -593,6 +596,20 @@ pub fn preprocess_str, U: AsRef, V: BuildHasher>( } } }; + + // IEEE1800-2017 Clause 22.4, page 675 + // The filename can be enclosed in either quotes or angle brackets, + // which affects how a tool searches for the file, as follows: + // - When the filename is enclosed in double quotes ("filename"), for + // a relative path the compiler’s current working directory, and + // optionally user-specified locations are searched. + // - When the filename is enclosed in angle brackets (), then + // only an implementationdependent location containing files defined + // by the language standard is searched. Relative path names are + // interpreted relative to that location + // + // In this implementation, filenames enclosed in angle brackets are + // treated equivalently to those enclosed in double quotes. if path.is_relative() && !path.exists() { for include_path in include_paths { let new_path = include_path.as_ref().join(&path); @@ -602,6 +619,7 @@ pub fn preprocess_str, U: AsRef, V: BuildHasher>( } } } + let (include, new_defines) = preprocess(path, &defines, include_paths, strip_comments, false).map_err( |x| Error::Include { From de098895d74bbb72299b2214c41e7c275a2b1559 Mon Sep 17 00:00:00 2001 From: damc Date: Tue, 26 Jul 2022 18:14:10 +0200 Subject: [PATCH 59/62] ppTests Simplify tests with `preprocess_usualargs()`. 1. It's much less visual noise. 2. Preparation for change to `preprocess()` and `preprocess_str()` arguments. --- sv-parser-pp/src/preprocess.rs | 371 +++++---------------------------- 1 file changed, 53 insertions(+), 318 deletions(-) diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 48928d6..aa2fbcb 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -139,7 +139,7 @@ pub fn preprocess, U: AsRef, V: BuildHasher>( include_paths, ignore_include, strip_comments, - 0, + 0, // resolve_depth ) } @@ -976,16 +976,21 @@ mod tests { contents } + // Most tests are called with the same arguments, so this is a convenience. + fn preprocess_usualargs(s: &str) -> Result<(PreprocessedText, Defines), Error> { + let include_paths = [testfile_path("")]; + preprocess( + testfile_path(s), // path + &HashMap::new(), // pre_defines + &include_paths, // include_paths + false, // strip_comments + false, // ignore_include + ) + } + #[test] fn escaped_identifier() { // {{{ - let (ret, _) = preprocess( - testfile_path("escaped_identifier.sv"), - &HashMap::new(), - &[] as &[String], - false, - false, - ) - .unwrap(); + let (ret, _) = preprocess_usualargs("escaped_identifier.sv").unwrap(); assert_eq!( ret.text(), testfile_contents("expected/escaped_identifier.sv") @@ -995,14 +1000,7 @@ mod tests { #[test] #[allow(non_snake_case)] fn IEEE18002017_keywords_if2_13642005() { // {{{ - let (ret, _) = preprocess( - testfile_path("IEEE18002017_keywords_if2_13642005.sv"), - &HashMap::new(), - &[] as &[String], - false, - false, - ) - .unwrap(); + let (ret, _) = preprocess_usualargs("IEEE18002017_keywords_if2_13642005.sv").unwrap(); assert_eq!( ret.text(), testfile_contents("expected/IEEE18002017_keywords_if2_13642005.sv") @@ -1012,14 +1010,7 @@ mod tests { #[test] #[allow(non_snake_case)] fn IEEE18002017_keywords_m2_13642001() { // {{{ - let (ret, _) = preprocess( - testfile_path("IEEE18002017_keywords_m2_13642001.sv"), - &HashMap::new(), - &[] as &[String], - false, - false, - ) - .unwrap(); + let (ret, _) = preprocess_usualargs("IEEE18002017_keywords_m2_13642001.sv").unwrap(); assert_eq!( ret.text(), testfile_contents("expected/IEEE18002017_keywords_m2_13642001.sv") @@ -1029,14 +1020,7 @@ mod tests { #[test] #[allow(non_snake_case)] fn IEEE18002017_keywords_m2_18002005() { // {{{ - let (ret, _) = preprocess( - testfile_path("IEEE18002017_keywords_m2_18002005.sv"), - &HashMap::new(), - &[] as &[String], - false, - false, - ) - .unwrap(); + let (ret, _) = preprocess_usualargs("IEEE18002017_keywords_m2_18002005.sv").unwrap(); assert_eq!( ret.text(), testfile_contents("expected/IEEE18002017_keywords_m2_18002005.sv") @@ -1046,14 +1030,7 @@ mod tests { #[test] #[allow(non_snake_case)] fn IEEE18002017_macro_argument_expansion() { // {{{ - let (ret, _) = preprocess( - testfile_path("IEEE18002017_macro_argument_expansion.sv"), - &HashMap::new(), - &[] as &[String], - false, - false, - ) - .unwrap(); + let (ret, _) = preprocess_usualargs("IEEE18002017_macro_argument_expansion.sv").unwrap(); assert_eq!( ret.text(), testfile_contents("expected/IEEE18002017_macro_argument_expansion.sv") @@ -1063,14 +1040,7 @@ mod tests { #[test] #[allow(non_snake_case)] fn IEEE18002017_macro_delimit_tokens() { // {{{ - let (ret, _) = preprocess( - testfile_path("IEEE18002017_macro_delimit_tokens.sv"), - &HashMap::new(), - &[] as &[String], - false, - false, - ) - .unwrap(); + let (ret, _) = preprocess_usualargs("IEEE18002017_macro_delimit_tokens.sv").unwrap(); assert_eq!( ret.text(), testfile_contents("expected/IEEE18002017_macro_delimit_tokens.sv") @@ -1080,14 +1050,7 @@ mod tests { #[test] #[allow(non_snake_case)] fn IEEE18002017_macro_mix_quotes() { // {{{ - let (ret, _) = preprocess( - testfile_path("IEEE18002017_macro_mix_quotes.sv"), - &HashMap::new(), - &[] as &[String], - false, - false, - ) - .unwrap(); + let (ret, _) = preprocess_usualargs("IEEE18002017_macro_mix_quotes.sv").unwrap(); assert_eq!( ret.text(), testfile_contents("expected/IEEE18002017_macro_mix_quotes.sv") @@ -1097,14 +1060,7 @@ mod tests { #[test] #[allow(non_snake_case)] fn IEEE18002017_macro_noexpand_string() { // {{{ - let (ret, _) = preprocess( - testfile_path("IEEE18002017_macro_noexpand_string.sv"), - &HashMap::new(), - &[] as &[String], - false, - false, - ) - .unwrap(); + let (ret, _) = preprocess_usualargs("IEEE18002017_macro_noexpand_string.sv").unwrap(); assert_eq!( ret.text(), testfile_contents("expected/IEEE18002017_macro_noexpand_string.sv") @@ -1114,14 +1070,7 @@ mod tests { #[test] #[allow(non_snake_case)] fn IEEE18002017_macro_with_defaults() { // {{{ - let (ret, _) = preprocess( - testfile_path("IEEE18002017_macro_with_defaults.sv"), - &HashMap::new(), - &[] as &[String], - false, - false, - ) - .unwrap(); + let (ret, _) = preprocess_usualargs("IEEE18002017_macro_with_defaults.sv").unwrap(); assert_eq!( ret.text(), testfile_contents("expected/IEEE18002017_macro_with_defaults.sv") @@ -1131,14 +1080,7 @@ mod tests { #[test] #[allow(non_snake_case)] fn IEEE18002017_macro_without_defaults() { // {{{ - let (ret, _) = preprocess( - testfile_path("IEEE18002017_macro_without_defaults.sv"), - &HashMap::new(), - &[] as &[String], - false, - false, - ) - .unwrap(); + let (ret, _) = preprocess_usualargs("IEEE18002017_macro_without_defaults.sv").unwrap(); assert_eq!( ret.text(), testfile_contents("expected/IEEE18002017_macro_without_defaults.sv") @@ -1147,15 +1089,7 @@ mod tests { #[test] fn celldefine() { // {{{ - let include_paths = [testfile_path("")]; - let (ret, _) = preprocess( - testfile_path("celldefine.sv"), - &HashMap::new(), - &include_paths, - false, - false, - ) - .unwrap(); + let (ret, _) = preprocess_usualargs("celldefine.sv").unwrap(); assert_eq!( ret.text(), testfile_contents("celldefine.sv") @@ -1164,15 +1098,7 @@ mod tests { #[test] fn default_nettype() { // {{{ - let include_paths = [testfile_path("")]; - let (ret, _) = preprocess( - testfile_path("default_nettype.sv"), - &HashMap::new(), - &include_paths, - false, - false, - ) - .unwrap(); + let (ret, _) = preprocess_usualargs("default_nettype.sv").unwrap(); assert_eq!( ret.text(), testfile_contents("default_nettype.sv") @@ -1181,14 +1107,7 @@ mod tests { #[test] fn ifdef_nested() { // {{{ - let (ret, _) = preprocess( - testfile_path("ifdef_nested.sv"), - &HashMap::new(), - &[] as &[String], - false, - false, - ) - .unwrap(); + let (ret, _) = preprocess_usualargs("ifdef_nested.sv").unwrap(); assert_eq!( ret.text(), testfile_contents("expected/ifdef_nested.sv") @@ -1205,6 +1124,7 @@ mod tests { &[] as &[String], false, false, + 0, ) .unwrap(); assert_eq!( @@ -1215,14 +1135,7 @@ mod tests { #[test] fn ifdef_undefined() { // {{{ - let (ret, _) = preprocess( - testfile_path("ifdef_undefined.sv"), - &HashMap::new(), - &[] as &[String], - false, - false, - ) - .unwrap(); + let (ret, _) = preprocess_usualargs("ifdef_undefined.sv").unwrap(); assert_eq!( ret.text(), testfile_contents("expected/ifdef_undefined.sv") @@ -1238,14 +1151,7 @@ mod tests { #[test] fn ifndef_undefined() { // {{{ - let (ret, _) = preprocess( - testfile_path("ifndef_undefined.sv"), - &HashMap::new(), - &[] as &[String], - false, - false, - ) - .unwrap(); + let (ret, _) = preprocess_usualargs("ifndef_undefined.sv").unwrap(); assert_eq!( ret.text(), testfile_contents("expected/ifndef_undefined.sv") @@ -1261,6 +1167,7 @@ mod tests { &include_paths, false, true, + 0, ) .unwrap(); assert_eq!( @@ -1271,16 +1178,7 @@ mod tests { #[test] fn include_noindent() { // {{{ - let include_paths = [testfile_path("")]; - let (ret, _) = preprocess( - testfile_path("include_noindent.sv"), - &HashMap::new(), - &include_paths, - false, - false, - ) - .unwrap(); - + let (ret, _) = preprocess_usualargs("include_noindent.sv").unwrap(); assert_eq!( ret.text(), testfile_contents("expected/include_noindent.sv") @@ -1317,15 +1215,7 @@ mod tests { #[test] fn include_sameline_comment() { // {{{ - let include_paths = [testfile_path("")]; - let (ret, _) = preprocess( - testfile_path("include_sameline_comment.sv"), - &HashMap::new(), - &include_paths, - false, - false, - ) - .unwrap(); + let (ret, _) = preprocess_usualargs("include_sameline_comment.sv").unwrap(); assert_eq!( ret.text(), testfile_contents("expected/include_sameline_comment.sv") @@ -1349,42 +1239,19 @@ mod tests { #[test] fn include_sameline_include() { // {{{ - let include_paths = [testfile_path("")]; - let ret = preprocess( - testfile_path("include_sameline_include.sv"), - &HashMap::new(), - &include_paths, - false, - false, - ); + let ret = preprocess_usualargs("include_sameline_include.sv"); assert_eq!(format!("{:?}", ret), "Err(IncludeLine)"); } // }}} #[test] fn include_sameline_keyword() { // {{{ - let include_paths = [testfile_path("")]; - let ret = preprocess( - testfile_path("include_sameline_keyword.sv"), - &HashMap::new(), - &include_paths, - false, - false, - ); + let ret = preprocess_usualargs("include_sameline_keyword.sv"); assert_eq!(format!("{:?}", ret), "Err(IncludeLine)"); } // }}} #[test] fn include_withindent() { // {{{ - let include_paths = [testfile_path("")]; - let (ret, _) = preprocess( - testfile_path("include_withindent.sv"), - &HashMap::new(), - &include_paths, - false, - false, - ) - .unwrap(); - + let (ret, _) = preprocess_usualargs("include_withindent.sv").unwrap(); assert_eq!( ret.text(), testfile_contents("expected/include_withindent.sv") @@ -1421,15 +1288,7 @@ mod tests { #[test] fn keywords() { // {{{ - let include_paths = [testfile_path("")]; - let (ret, _) = preprocess( - testfile_path("keywords.sv"), - &HashMap::new(), - &include_paths, - false, - false, - ) - .unwrap(); + let (ret, _) = preprocess_usualargs("keywords.sv").unwrap(); assert_eq!( ret.text(), testfile_contents("keywords.sv") @@ -1438,15 +1297,7 @@ mod tests { #[test] fn line() { // {{{ - let include_paths = [testfile_path("")]; - let (ret, _) = preprocess( - testfile_path("line.sv"), - &HashMap::new(), - &include_paths, - false, - false, - ) - .unwrap(); + let (ret, _) = preprocess_usualargs("line.sv").unwrap(); assert_eq!( ret.text(), testfile_contents("line.sv") @@ -1455,14 +1306,7 @@ mod tests { #[test] fn macro_arguments() { // {{{ - let (ret, _) = preprocess( - testfile_path("macro_arguments.sv"), - &HashMap::new(), - &[] as &[String], - false, - false, - ) - .unwrap(); + let (ret, _) = preprocess_usualargs("macro_arguments.sv").unwrap(); assert_eq!( ret.text(), testfile_contents("expected/macro_arguments.sv") @@ -1471,14 +1315,7 @@ mod tests { #[test] fn macro_basic() { // {{{ - let (ret, _) = preprocess( - testfile_path("macro_basic.sv"), - &HashMap::new(), - &[] as &[String], - false, - false, - ) - .unwrap(); + let (ret, _) = preprocess_usualargs("macro_basic.sv").unwrap(); assert_eq!( ret.text(), testfile_contents("expected/macro_basic.sv") @@ -1487,14 +1324,7 @@ mod tests { #[test] fn macro_comment() { // {{{ - let (ret, _) = preprocess( - testfile_path("macro_comment.sv"), - &HashMap::new(), - &[] as &[String], - false, - false, - ) - .unwrap(); + let (ret, _) = preprocess_usualargs("macro_comment.sv").unwrap(); assert_eq!( ret.text(), testfile_contents("expected/macro_comment.sv") @@ -1503,14 +1333,7 @@ mod tests { #[test] fn macro_delimiters() { // {{{ - let (ret, _) = preprocess( - testfile_path("macro_delimiters.sv"), - &HashMap::new(), - &[] as &[String], - false, - false, - ) - .unwrap(); + let (ret, _) = preprocess_usualargs("macro_delimiters.sv").unwrap(); assert_eq!( ret.text(), testfile_contents("expected/macro_delimiters.sv") @@ -1520,14 +1343,7 @@ mod tests { #[test] #[allow(non_snake_case)] fn macro_FILE() { // {{{ - let (ret, _) = preprocess( - testfile_path("macro_FILE.sv"), - &HashMap::new(), - &[] as &[String], - false, - false, - ) - .unwrap(); + let (ret, _) = preprocess_usualargs("macro_FILE.sv").unwrap(); assert_eq!( ret.text(), testfile_contents("expected/macro_FILE.sv") @@ -1536,14 +1352,7 @@ mod tests { #[test] fn macro_identifier() { // {{{ - let (ret, _) = preprocess( - testfile_path("macro_identifier.sv"), - &HashMap::new(), - &[] as &[String], - false, - false, - ) - .unwrap(); + let (ret, _) = preprocess_usualargs("macro_identifier.sv").unwrap(); assert_eq!( ret.text(), testfile_contents("expected/macro_identifier.sv") @@ -1553,14 +1362,7 @@ mod tests { #[test] #[allow(non_snake_case)] fn macro_LINE() { // {{{ - let (ret, _) = preprocess( - testfile_path("macro_LINE.sv"), - &HashMap::new(), - &[] as &[String], - false, - false, - ) - .unwrap(); + let (ret, _) = preprocess_usualargs("macro_LINE.sv").unwrap(); assert_eq!( ret.text(), testfile_contents("expected/macro_LINE.sv") @@ -1569,14 +1371,7 @@ mod tests { #[test] fn macro_multiline_comment() { // {{{ - let (ret, _) = preprocess( - testfile_path("macro_multiline_comment.sv"), - &HashMap::new(), - &[] as &[String], - false, - false, - ) - .unwrap(); + let (ret, _) = preprocess_usualargs("macro_multiline_comment.sv").unwrap(); assert_eq!( ret.text(), testfile_contents("expected/macro_multiline_comment.sv") @@ -1585,39 +1380,19 @@ mod tests { #[test] fn macro_recursion_direct() { // {{{ - let ret = preprocess( - testfile_path("macro_recursion_direct.sv"), - &HashMap::new(), - &[] as &[String], - false, - false, - ); + let ret = preprocess_usualargs("macro_recursion_direct.sv"); assert_eq!(format!("{:?}", ret), "Err(ExceedRecursiveLimit)"); } // }}} #[test] fn macro_recursion_indirect() { // {{{ - let ret = preprocess( - testfile_path("macro_recursion_indirect.sv"), - &HashMap::new(), - &[] as &[String], - false, - false, - ); + let ret = preprocess_usualargs("macro_recursion_indirect.sv"); assert_eq!(format!("{:?}", ret), "Err(ExceedRecursiveLimit)"); } // }}} #[test] fn pragma() { // {{{ - let include_paths = [testfile_path("")]; - let (ret, _) = preprocess( - testfile_path("pragma.sv"), - &HashMap::new(), - &include_paths, - false, - false, - ) - .unwrap(); + let (ret, _) = preprocess_usualargs("pragma.sv").unwrap(); assert_eq!( ret.text(), testfile_contents("pragma.sv") @@ -1626,15 +1401,7 @@ mod tests { #[test] fn resetall() { // {{{ - let include_paths = [testfile_path("")]; - let (ret, _) = preprocess( - testfile_path("resetall.sv"), - &HashMap::new(), - &include_paths, - false, - false, - ) - .unwrap(); + let (ret, _) = preprocess_usualargs("resetall.sv").unwrap(); assert_eq!( ret.text(), testfile_contents("resetall.sv") @@ -1643,15 +1410,7 @@ mod tests { #[test] fn timescale() { // {{{ - let include_paths = [testfile_path("")]; - let (ret, _) = preprocess( - testfile_path("timescale.sv"), - &HashMap::new(), - &include_paths, - false, - false, - ) - .unwrap(); + let (ret, _) = preprocess_usualargs("timescale.sv").unwrap(); assert_eq!( ret.text(), testfile_contents("timescale.sv") @@ -1660,15 +1419,7 @@ mod tests { #[test] fn unconnected_drive() { // {{{ - let include_paths = [testfile_path("")]; - let (ret, _) = preprocess( - testfile_path("unconnected_drive.sv"), - &HashMap::new(), - &include_paths, - false, - false, - ) - .unwrap(); + let (ret, _) = preprocess_usualargs("unconnected_drive.sv").unwrap(); assert_eq!( ret.text(), testfile_contents("unconnected_drive.sv") @@ -1677,15 +1428,7 @@ mod tests { #[test] fn undef() { // {{{ - let include_paths = [testfile_path("")]; - let (ret, _) = preprocess( - testfile_path("undef.sv"), - &HashMap::new(), - &include_paths, - false, - false, - ) - .unwrap(); + let (ret, _) = preprocess_usualargs("undef.sv").unwrap(); assert_eq!( ret.text(), testfile_contents("expected/undef.sv") @@ -1694,15 +1437,7 @@ mod tests { #[test] fn undefineall() { // {{{ - let include_paths = [testfile_path("")]; - let (ret, _) = preprocess( - testfile_path("undefineall.sv"), - &HashMap::new(), - &include_paths, - false, - false, - ) - .unwrap(); + let (ret, _) = preprocess_usualargs("undefineall.sv").unwrap(); assert_eq!( ret.text(), testfile_contents("expected/undefineall.sv") From 3755299139877ab99403c27b669035f2fe07642e Mon Sep 17 00:00:00 2001 From: damc Date: Tue, 26 Jul 2022 18:20:22 +0200 Subject: [PATCH 60/62] ppTests include_recursive - Ignored by default. - Causes stack overflow. --- sv-parser-pp/src/preprocess.rs | 7 +++++++ sv-parser-pp/testcases/include_recursive.svh | 3 +++ 2 files changed, 10 insertions(+) create mode 100644 sv-parser-pp/testcases/include_recursive.svh diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index aa2fbcb..5347da7 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -1213,6 +1213,13 @@ mod tests { assert_eq!(ret.text().chars().nth(n).unwrap(), 'o'); } // }}} + #[test] + #[ignore] + fn include_recursive() { // {{{ + let ret = preprocess_usualargs("include_recursive.svh"); + assert_eq!(format!("{:?}", ret), "Err(ExceedRecursiveLimit)"); + } // }}} + #[test] fn include_sameline_comment() { // {{{ let (ret, _) = preprocess_usualargs("include_sameline_comment.sv").unwrap(); diff --git a/sv-parser-pp/testcases/include_recursive.svh b/sv-parser-pp/testcases/include_recursive.svh new file mode 100644 index 0000000..d84de3e --- /dev/null +++ b/sv-parser-pp/testcases/include_recursive.svh @@ -0,0 +1,3 @@ +// foo +`include "include_recursive.svh" +// bar From 8e461d0de672969d37d9239582b4453de0548280 Mon Sep 17 00:00:00 2001 From: damc Date: Tue, 26 Jul 2022 20:21:59 +0200 Subject: [PATCH 61/62] ppTests Protect against infinite include recursion. - New argument `include_depth` on `preprocess_str()`. - Existing function `preprocess()` is now a wrapper for private function `preprocess_inner()` which uses `include_depth`. - Commented arguments on all uses of `preprocess()` and `preprocess_str()`. - Test `include_recursive` is fixed and not ignored. - Without recursion limit, stack overflow occurs which crashes svls. --- sv-parser-pp/src/preprocess.rs | 63 ++++++++++++++++++++++++++++------ sv-parser/examples/parse_sv.rs | 8 ++++- sv-parser/src/lib.rs | 26 ++++++++++---- 3 files changed, 79 insertions(+), 18 deletions(-) diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 5347da7..2fe42b7 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -124,6 +124,25 @@ pub fn preprocess, U: AsRef, V: BuildHasher>( strip_comments: bool, ignore_include: bool, ) -> Result<(PreprocessedText, Defines), Error> { + preprocess_inner( + path, + pre_defines, + include_paths, + strip_comments, + ignore_include, + 0, // include_depth + ) +} + +fn preprocess_inner, U: AsRef, V: BuildHasher>( + path: T, + pre_defines: &Defines, + include_paths: &[U], + strip_comments: bool, + ignore_include: bool, + include_depth: usize, +) -> Result<(PreprocessedText, Defines), Error> { + let f = File::open(path.as_ref()).map_err(|x| Error::File { source: x, path: PathBuf::from(path.as_ref()), @@ -140,6 +159,7 @@ pub fn preprocess, U: AsRef, V: BuildHasher>( ignore_include, strip_comments, 0, // resolve_depth + include_depth, ) } @@ -179,7 +199,19 @@ pub fn preprocess_str, U: AsRef, V: BuildHasher>( ignore_include: bool, strip_comments: bool, resolve_depth: usize, + include_depth: usize, ) -> Result<(PreprocessedText, Defines), Error> { + + // IEEE1800-2017 Clause 22.4, page 675 + // A file included in the source using the `include compiler directive + // may contain other `include compiler directives. + // The number of nesting levels for include files shall be finite. + // Implementations may limit the maximum number of levels to which + // include files can be nested, but the limit shall be at least 15. + if include_depth > RECURSIVE_LIMIT { + return Err(Error::ExceedRecursiveLimit); + } + let mut skip = false; let mut skip_whitespace = false; let mut skip_nodes = SkipNodes::new(); @@ -537,7 +569,7 @@ pub fn preprocess_str, U: AsRef, V: BuildHasher>( defines.insert(id, Some(define)); } - // Keep TextMacroDefinition after preprocess + // Keep TextMacroDefinition after preprocess_inner(). let locate: Locate = x.try_into().unwrap(); let range = Range::new(locate.offset, locate.offset + locate.len); ret.push(locate.str(&s), Some((path.as_ref(), range))); @@ -621,7 +653,13 @@ pub fn preprocess_str, U: AsRef, V: BuildHasher>( } let (include, new_defines) = - preprocess(path, &defines, include_paths, strip_comments, false).map_err( + preprocess_inner( + path, + &defines, + include_paths, + strip_comments, + false, // ignore_include + include_depth + 1).map_err( |x| Error::Include { source: Box::new(x), }, @@ -936,6 +974,7 @@ fn resolve_text_macro_usage, U: AsRef>( false, strip_comments, resolve_depth, + 0, // include_depth )?; Ok(Some(( String::from(replaced.text()), @@ -982,7 +1021,7 @@ mod tests { preprocess( testfile_path(s), // path &HashMap::new(), // pre_defines - &include_paths, // include_paths + &include_paths, // include_paths false, // strip_comments false, // ignore_include ) @@ -1122,9 +1161,8 @@ mod tests { testfile_path("ifdef_predefined.sv"), &defines, &[] as &[String], - false, - false, - 0, + false, // strip_comments + false, // ignore_include ) .unwrap(); assert_eq!( @@ -1165,9 +1203,8 @@ mod tests { testfile_path("include_ignore.sv"), &HashMap::new(), &include_paths, - false, - true, - 0, + false, // strip_comments + true, // ignore_include ) .unwrap(); assert_eq!( @@ -1214,10 +1251,14 @@ mod tests { } // }}} #[test] - #[ignore] fn include_recursive() { // {{{ let ret = preprocess_usualargs("include_recursive.svh"); - assert_eq!(format!("{:?}", ret), "Err(ExceedRecursiveLimit)"); + let expected = format!( + "Err({}ExceedRecursiveLimit{})", + "Include { source: ".repeat(RECURSIVE_LIMIT+1), + " }".repeat(RECURSIVE_LIMIT+1), + ); + assert_eq!(format!("{:?}", ret), expected); } // }}} #[test] diff --git a/sv-parser/examples/parse_sv.rs b/sv-parser/examples/parse_sv.rs index c37d866..c140ace 100644 --- a/sv-parser/examples/parse_sv.rs +++ b/sv-parser/examples/parse_sv.rs @@ -62,7 +62,13 @@ fn main() { let mut exit = 0; for path in &opt.files { if opt.pp { - match preprocess(&path, &defines, &opt.includes, false, false) { + match preprocess( + &path, + &defines, + &opt.includes, + false, // strip_comments + false, // ignore_include + ) { Ok((preprocessed_text, new_defines)) => { println!("{}", preprocessed_text.text()); defines = new_defines; diff --git a/sv-parser/src/lib.rs b/sv-parser/src/lib.rs index 40b1c47..e8cf2ba 100644 --- a/sv-parser/src/lib.rs +++ b/sv-parser/src/lib.rs @@ -131,7 +131,13 @@ pub fn parse_sv, U: AsRef, V: BuildHasher>( ignore_include: bool, allow_incomplete: bool, ) -> Result<(SyntaxTree, Defines), Error> { - let (text, defines) = preprocess(path, pre_defines, include_paths, false, ignore_include)?; + let (text, defines) = preprocess( + path, + pre_defines, + include_paths, + false, // strip_comments + ignore_include, + )?; parse_sv_pp(text, defines, allow_incomplete) } @@ -188,8 +194,9 @@ pub fn parse_sv_str, U: AsRef, V: BuildHasher>( pre_defines, include_paths, ignore_include, - false, - 0, + false, // strip_comments + 0, // resolve_depth + 0, // include_depth )?; parse_sv_pp(text, defines, allow_incomplete) } @@ -201,7 +208,13 @@ pub fn parse_lib, U: AsRef, V: BuildHasher>( ignore_include: bool, allow_incomplete: bool, ) -> Result<(SyntaxTree, Defines), Error> { - let (text, defines) = preprocess(path, pre_defines, include_paths, false, ignore_include)?; + let (text, defines) = preprocess( + path, + pre_defines, + include_paths, + false, // strip_comments + ignore_include, + )?; parse_lib_pp(text, defines, allow_incomplete) } @@ -219,8 +232,9 @@ pub fn parse_lib_str, U: AsRef, V: BuildHasher>( pre_defines, include_paths, ignore_include, - false, - 0, + false, // strip_comments + 0, // resolve_depth + 0, // include_depth )?; parse_lib_pp(text, defines, allow_incomplete) } From da6157952ed842fb109a9e4b658c4fdeb7443674 Mon Sep 17 00:00:00 2001 From: damc Date: Tue, 26 Jul 2022 22:00:46 +0200 Subject: [PATCH 62/62] ppTests include_quoted_(a|b|c|d) - Illustration of https://github.com/dalance/svlint/issues/77 - That's the same as https://github.com/dalance/sv-parser/issues/48 - A,B show what doesn't work, vaguely defined on page 680. - C,D show what does work, using example on page 680. --- sv-parser-pp/src/preprocess.rs | 30 +++++++++++++++++++ .../testcases/expected/include_quoted_c.sv | 9 ++++++ .../testcases/expected/include_quoted_d.sv | 8 +++++ sv-parser-pp/testcases/include_quoted_a.sv | 5 ++++ sv-parser-pp/testcases/include_quoted_b.sv | 5 ++++ sv-parser-pp/testcases/include_quoted_c.sv | 5 ++++ sv-parser-pp/testcases/include_quoted_d.sv | 4 +++ 7 files changed, 66 insertions(+) create mode 100644 sv-parser-pp/testcases/expected/include_quoted_c.sv create mode 100644 sv-parser-pp/testcases/expected/include_quoted_d.sv create mode 100644 sv-parser-pp/testcases/include_quoted_a.sv create mode 100644 sv-parser-pp/testcases/include_quoted_b.sv create mode 100644 sv-parser-pp/testcases/include_quoted_c.sv create mode 100644 sv-parser-pp/testcases/include_quoted_d.sv diff --git a/sv-parser-pp/src/preprocess.rs b/sv-parser-pp/src/preprocess.rs index 2fe42b7..0093903 100644 --- a/sv-parser-pp/src/preprocess.rs +++ b/sv-parser-pp/src/preprocess.rs @@ -1250,6 +1250,36 @@ mod tests { assert_eq!(ret.text().chars().nth(n).unwrap(), 'o'); } // }}} + #[test] + fn include_quoted_a() { // {{{ + let ret = preprocess_usualargs("include_quoted_a.sv"); + assert_eq!(format!("{:?}", ret), "Err(Include { source: File { source: Os { code: 2, kind: NotFound, message: \"No such file or directory\" }, path: \"`PATH\" } })"); + } // }}} + + #[test] + fn include_quoted_b() { // {{{ + let ret = preprocess_usualargs("include_quoted_b.sv"); + assert_eq!(format!("{:?}", ret), "Err(Include { source: File { source: Os { code: 2, kind: NotFound, message: \"No such file or directory\" }, path: \"`PATH\" } })"); + } // }}} + + #[test] + fn include_quoted_c() { // {{{ + let (ret, _) = preprocess_usualargs("include_quoted_c.sv").unwrap(); + assert_eq!( + ret.text(), + testfile_contents("expected/include_quoted_c.sv") + ); + } // }}} + + #[test] + fn include_quoted_d() { // {{{ + let (ret, _) = preprocess_usualargs("include_quoted_d.sv").unwrap(); + assert_eq!( + ret.text(), + testfile_contents("expected/include_quoted_d.sv") + ); + } // }}} + #[test] fn include_recursive() { // {{{ let ret = preprocess_usualargs("include_recursive.svh"); diff --git a/sv-parser-pp/testcases/expected/include_quoted_c.sv b/sv-parser-pp/testcases/expected/include_quoted_c.sv new file mode 100644 index 0000000..b663ef9 --- /dev/null +++ b/sv-parser-pp/testcases/expected/include_quoted_c.sv @@ -0,0 +1,9 @@ +// Based on last example of IEEE1800-2017 Clause 22.5.1, page 680. +`define APPEND_SVH(path) `"path.svh`" +module and_op (a, b, c); +output a; +input b, c; + +and a1 (a,b,c); + +endmodule diff --git a/sv-parser-pp/testcases/expected/include_quoted_d.sv b/sv-parser-pp/testcases/expected/include_quoted_d.sv new file mode 100644 index 0000000..68a6a95 --- /dev/null +++ b/sv-parser-pp/testcases/expected/include_quoted_d.sv @@ -0,0 +1,8 @@ +`define PATH "included.svh" +module and_op (a, b, c); +output a; +input b, c; + +and a1 (a,b,c); + +endmodule diff --git a/sv-parser-pp/testcases/include_quoted_a.sv b/sv-parser-pp/testcases/include_quoted_a.sv new file mode 100644 index 0000000..8fd3b7b --- /dev/null +++ b/sv-parser-pp/testcases/include_quoted_a.sv @@ -0,0 +1,5 @@ +`define PATH included.svh +`define QUOTE(path) `"path`" +module and_op (a, b, c); +`include `QUOTE(`PATH) +endmodule diff --git a/sv-parser-pp/testcases/include_quoted_b.sv b/sv-parser-pp/testcases/include_quoted_b.sv new file mode 100644 index 0000000..e4168a0 --- /dev/null +++ b/sv-parser-pp/testcases/include_quoted_b.sv @@ -0,0 +1,5 @@ +`define PATH included.svh +`define QUOTED_PATH `"`PATH`" +module and_op (a, b, c); +`include `QUOTED_PATH +endmodule diff --git a/sv-parser-pp/testcases/include_quoted_c.sv b/sv-parser-pp/testcases/include_quoted_c.sv new file mode 100644 index 0000000..36393c4 --- /dev/null +++ b/sv-parser-pp/testcases/include_quoted_c.sv @@ -0,0 +1,5 @@ +// Based on last example of IEEE1800-2017 Clause 22.5.1, page 680. +`define APPEND_SVH(path) `"path.svh`" +module and_op (a, b, c); +`include `APPEND_SVH(included) +endmodule diff --git a/sv-parser-pp/testcases/include_quoted_d.sv b/sv-parser-pp/testcases/include_quoted_d.sv new file mode 100644 index 0000000..8e5eb97 --- /dev/null +++ b/sv-parser-pp/testcases/include_quoted_d.sv @@ -0,0 +1,4 @@ +`define PATH "included.svh" +module and_op (a, b, c); +`include `PATH +endmodule