-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmodule.hh
69 lines (45 loc) · 1.33 KB
/
module.hh
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
#ifndef CIRCUIT____MODULE_HH
#define CIRCUIT____MODULE_HH
#include "vec.hh"
#ifdef GEN
class module;
class instantiation : public Vec<uint16_t> {
public:
instantiation(module &mod, v<uint16_t> a, v<uint16_t> b) : mod(mod), a(a), b(b) {}
virtual void run(std::ostream &s) const;;
module &mod;
v<uint16_t> a;
v<uint16_t> b;
};
class module {
virtual v<uint16_t> lambda(v<uint16_t> a, v<uint16_t> b) = 0;
public:
module(std::string name) : name(name) {}
void init(){
size_t len = sizeof(uint16_t) * bitsPerByte;
std::cout << "module " << name << "(input [" << len - 1 << ":0] a, input [" << len - 1 << ":0] b, output ["
<< len - 1 << ":0] r);\n";
v<uint16_t> v = lambda(VecArg<uint16_t>("a"), VecArg<uint16_t>("b"));
std::cout << "\n\tassign r = ";
v.run(std::cout);
std::cout << ";\n\n";
std::cout << "endmodule\n\n";
}
v<uint16_t> operator()(v<uint16_t> a, v<uint16_t> b) {
return *new instantiation(*this, a, b);
}
std::string name;
};
#else
class module {
virtual v<uint16_t> lambda(v<uint16_t> a, v<uint16_t> b) = 0;
public:
module(std::string) {}
v<uint16_t> operator() (v<uint16_t> a, v<uint16_t> b) {
return lambda(a, b);
}
void init() {
}
};
#endif
#endif // CIRCUIT____MODULE_HH