summaryrefslogtreecommitdiff
path: root/tests/xsthammer/generate.cc
blob: 9f236c34abcc11e05198c67a01f83e5ba33c7618 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <sys/stat.h>
#include <sys/types.h>
#include <stdio.h>
#include <string>

const char *arg_types[][2] = {
	{ "{dir} [3:0] {name}", "{name}" },		// 00
	{ "{dir} [4:0] {name}", "{name}" },		// 01
	{ "{dir} [5:0] {name}", "{name}" },		// 02
	{ "{dir} signed [3:0] {name}", "{name}" },	// 03
	{ "{dir} signed [4:0] {name}", "{name}" },	// 04
	{ "{dir} signed [5:0] {name}", "{name}" }	// 05
};

const char *ops[] = {
	"+",	// 00
	"-",	// 01
	"*",	// 02
	"&&",	// 03
	"||",	// 04
	"&",	// 05
	"|",	// 06
	"^",	// 07
	"<<",	// 08
	">>",	// 09
	"<<<",	// 10
	">>>",	// 11
};

void strsubst(std::string &str, const std::string &match, const std::string &replace)
{
	size_t pos;
	while ((pos = str.find(match)) != std::string::npos)
		str.replace(pos, match.size(), replace);
}

int main()
{
	mkdir("rtl", 0777);
	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++)
	{
		std::string a_decl = arg_types[ai][0];
		strsubst(a_decl, "{dir}", "input");
		strsubst(a_decl, "{name}", "a");

		std::string b_decl = arg_types[bi][0];
		strsubst(b_decl, "{dir}", "input");
		strsubst(b_decl, "{name}", "b");

		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 b_ref = arg_types[bi][1];
		strsubst(b_ref, "{dir}", "input");
		strsubst(b_ref, "{name}", "b");

		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/binary_ops_%02d%02d%02d%02d.v", ai, bi, yi, oi);

		FILE *f = fopen(buffer, "w");
		fprintf(f, "module binary_ops_%02d%02d%02d%02d(a, b, y);\n", ai, bi, yi, oi);
		fprintf(f, "%s;\n", a_decl.c_str());
		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());
		fprintf(f, "endmodule\n");
		fclose(f);
	}
	return 0;
}