-
Notifications
You must be signed in to change notification settings - Fork 0
/
foo.cpp
85 lines (69 loc) · 2 KB
/
foo.cpp
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
// This file is covered by the MIT License, see the LICENSE file for details
// Library which will hide foo_impl.sv via C++ compilation, etc.
// This just fills in the DPI functions imported in the foo.sv wrapper
// NB: this is just an example, ideally this would be automatically
// generated from foo_impl.sv
#include "Vfoo_impl.h"
#include "svdpi.h"
#ifdef MODELSIM
#include <map>
#include <string>
// ModelSim can't use the chandle in the always block
// TODO -- make this a vector instead (faster but leakier)
std::map<std::string, Vfoo_impl*> scopeMap;
#endif
extern "C" {
#ifdef MODELSIM
// TODO -- seems like this should just slow down other simulators, but XSim
// reports an exception from lookup_foo()
void* lookup_foo (const char* scope) {
Vfoo_impl* foo = scopeMap.at(std::string(scope));
return foo;
}
#endif
void* create_foo (const char* scope) {
assert(sizeof(WData) == sizeof(svBitVecVal));
Vfoo_impl* foo = new Vfoo_impl(scope);
#ifdef MODELSIM
scopeMap[std::string(scope)] = foo;
#endif
return foo;
}
void comb_update_foo (
void* fooPtr,
const svBitVecVal* a,
const svBitVecVal* long_in,
svBitVecVal* long_out,
svBitVecVal* x)
{
Vfoo_impl* foo = static_cast<Vfoo_impl*>(fooPtr);
memcpy(&foo->a, a, 2*sizeof(svBitVecVal));
memcpy(foo->long_in, long_in, 5*sizeof(svBitVecVal));
foo->eval();
memcpy(x, &foo->x, 2*sizeof(svBitVecVal));
memcpy(long_out, foo->long_out, 5*sizeof(svBitVecVal));
}
void seq_update_foo (
void* fooPtr,
unsigned char clk,
svBitVecVal* long_out,
svBitVecVal* x)
{
Vfoo_impl* foo = static_cast<Vfoo_impl*>(fooPtr);
foo->clk = clk;
foo->eval();
memcpy(x, &foo->x, 2*sizeof(svBitVecVal));
memcpy(long_out, foo->long_out, 5*sizeof(svBitVecVal));
}
void comb_ignore_foo (
void* fooPtr,
const svBitVecVal* a,
const svBitVecVal* long_in
)
{ }
void final_foo (void* fooPtr) {
Vfoo_impl* foo = static_cast<Vfoo_impl*>(fooPtr);
foo->final();
delete foo;
}
}