summaryrefslogtreecommitdiff
path: root/tests/xsthammer/generate.cc
diff options
context:
space:
mode:
Diffstat (limited to 'tests/xsthammer/generate.cc')
-rw-r--r--tests/xsthammer/generate.cc89
1 files changed, 78 insertions, 11 deletions
diff --git a/tests/xsthammer/generate.cc b/tests/xsthammer/generate.cc
index 9f236c34..b1ec9508 100644
--- a/tests/xsthammer/generate.cc
+++ b/tests/xsthammer/generate.cc
@@ -13,19 +13,47 @@ const char *arg_types[][2] = {
{ "{dir} signed [5:0] {name}", "{name}" } // 05
};
-const char *ops[] = {
+// See Table 5-1 (page 42) in IEEE Std 1364-2005
+// for a list of all Verilog oprators.
+
+const char *binary_ops[] = {
"+", // 00
"-", // 01
"*", // 02
- "&&", // 03
- "||", // 04
- "&", // 05
+// "/",
+// "%",
+// "**",
+ ">", // 03
+ ">=", // 04
+ "<", // 05
+ "<=", // 06
+ "&&", // 07
+ "||", // 08
+ "==", // 09
+ "!=", // 10
+ "===", // 11
+ "!==", // 12
+ "&", // 13
+ "|", // 14
+ "^", // 15
+ "^~", // 16
+ "<<", // 17
+ ">>", // 18
+ "<<<", // 19
+ ">>>", // 20
+};
+
+const char *unary_ops[] = {
+ "+", // 00
+ "-", // 01
+ "!", // 02
+ "~", // 03
+ "&", // 04
+ "~&", // 05
"|", // 06
- "^", // 07
- "<<", // 08
- ">>", // 09
- "<<<", // 10
- ">>>", // 11
+ "~|", // 07
+ "^", // 08
+ "~^", // 09
};
void strsubst(std::string &str, const std::string &match, const std::string &replace)
@@ -38,10 +66,13 @@ void strsubst(std::string &str, const std::string &match, const std::string &rep
int main()
{
mkdir("rtl", 0777);
+
+ // generate test cases for binary operators
+
for (int ai = 0; ai < sizeof(arg_types)/sizeof(arg_types[0]); ai++)
for (int bi = 0; bi < sizeof(arg_types)/sizeof(arg_types[0]); bi++)
for (int yi = 0; yi < sizeof(arg_types)/sizeof(arg_types[0]); yi++)
- for (int oi = 0; oi < sizeof(ops)/sizeof(ops[0]); oi++)
+ for (int oi = 0; oi < sizeof(binary_ops)/sizeof(binary_ops[0]); oi++)
{
std::string a_decl = arg_types[ai][0];
strsubst(a_decl, "{dir}", "input");
@@ -76,10 +107,46 @@ int main()
fprintf(f, "%s;\n", b_decl.c_str());
fprintf(f, "%s;\n", y_decl.c_str());
fprintf(f, "assign %s = %s %s %s;\n", y_ref.c_str(),
- a_ref.c_str(), ops[oi], b_ref.c_str());
+ a_ref.c_str(), binary_ops[oi], b_ref.c_str());
fprintf(f, "endmodule\n");
fclose(f);
}
+
+ // generate test cases for unary operators
+
+ for (int ai = 0; ai < sizeof(arg_types)/sizeof(arg_types[0]); ai++)
+ for (int yi = 0; yi < sizeof(arg_types)/sizeof(arg_types[0]); yi++)
+ for (int oi = 0; oi < sizeof(unary_ops)/sizeof(unary_ops[0]); oi++)
+ {
+ std::string a_decl = arg_types[ai][0];
+ strsubst(a_decl, "{dir}", "input");
+ strsubst(a_decl, "{name}", "a");
+
+ std::string y_decl = arg_types[yi][0];
+ strsubst(y_decl, "{dir}", "output");
+ strsubst(y_decl, "{name}", "y");
+
+ std::string a_ref = arg_types[ai][1];
+ strsubst(a_ref, "{dir}", "input");
+ strsubst(a_ref, "{name}", "a");
+
+ std::string y_ref = arg_types[yi][1];
+ strsubst(y_ref, "{dir}", "output");
+ strsubst(y_ref, "{name}", "y");
+
+ char buffer[1024];
+ snprintf(buffer, 1024, "rtl/unary_ops_%02d%02d%02d.v", ai, yi, oi);
+
+ FILE *f = fopen(buffer, "w");
+ fprintf(f, "module unary_ops_%02d%02d%02d(a, b, y);\n", ai, yi, oi);
+ fprintf(f, "%s;\n", a_decl.c_str());
+ fprintf(f, "%s;\n", y_decl.c_str());
+ fprintf(f, "assign %s = %s %s;\n", y_ref.c_str(),
+ unary_ops[oi], a_ref.c_str());
+ fprintf(f, "endmodule\n");
+ fclose(f);
+ }
+
return 0;
}