1 #define KERNEL
2 #include <iostream>
3 #include <freehdl/kernel-error.hh>
4 #include <freehdl/std-vhdl-types.hh>
5 #include <freehdl/kernel-stack-trace.hh>
6 #include <freehdl/kernel-kernel-class.hh>
7 #include <freehdl/kernel-fhdl-stream.hh>
8
9
10 void
error(int errnum,const char * str)11 error(int errnum, const char *str)
12 {
13 static buffer_stream sbuffer;
14
15 // Print stack trace
16 trace_source(sbuffer, true, kernel.executable_name);
17 kernel_error_stream << sbuffer.str();
18
19 kernel_error_stream << "Runtime error " << errnum << ".\n";
20 if (str != NULL && *str != '\0')
21 kernel_error_stream << str << "\n";
22
23 exit (1);
24 }
25
26 // Prints string on the screen and stops program execution
27 void
error(int errnum,type_info_interface * info,void * valuep)28 error(int errnum, type_info_interface *info, void *valuep)
29 {
30 static buffer_stream sbuffer;
31
32 // Print stack trace
33 trace_source(sbuffer, true, kernel.executable_name);
34 kernel_error_stream << sbuffer.str();
35
36 switch (errnum) {
37 case ERROR_SCALAR_OUT_OF_BOUNDS:
38 {
39 buffer_stream s;
40 s.clean();
41 info->print(s, valuep, VHDL_PRINT_MODE);
42 kernel_error_stream << " scalar value " << s.str() << " out of bounds.";
43 break;
44 }
45 default:
46 kernel_error_stream << " unknown error.";
47 break;
48 }
49 kernel_error_stream << "\n";
50 exit(1);
51 }
52
53
54 void
error(const char * str)55 error(const char *str) {
56 static buffer_stream sbuffer;
57
58 // Print stack trace
59 trace_source(sbuffer, true, kernel.executable_name);
60 kernel_error_stream << sbuffer.str();
61 kernel_error_stream << str << "\n";
62
63 exit(1);
64 }
65
66
67 // Prints string on the screen and stops program execution
68 void
error(const int errnum)69 error(const int errnum)
70 {
71 const char *errstr;
72
73 switch (errnum) {
74 case ERROR_INTEGER_OVERFLOW:
75 errstr = "Integer overflow";
76 break;
77 case ERROR_FLOATING_POINT_OVERFLOW:
78 errstr = "Floating point overflow";
79 break;
80 case ERROR_ENUM_OVERFLOW:
81 errstr = "Enumeration overflow";
82 break;
83 case ERROR_PHYSICAL_OVERFLOW:
84 errstr = "Physical overflow";
85 break;
86 case ERROR_ARRAY_INDEX:
87 errstr = "Illegal array index";
88 break;
89 case ERROR_INCOMPATIBLE_ARRAYS:
90 errstr = "Incompatible arrays";
91 break;
92 case ERROR_UNKNOWN_COMPONENT:
93 errstr = "Unkown component";
94 break;
95 case ERROR_DUBLICATE_INSTANCE_NAME:
96 errstr = "Dublicate instance name";
97 break;
98 case ERROR_ARRAY_INDEX_OUT_OF_BOUNDS:
99 errstr = "Array index out of bounds";
100 break;
101 case ERROR_SCALAR_OUT_OF_BOUNDS:
102 errstr = "Scalar out of bounds";
103 break;
104 case ERROR_ARRAY_LENGTH_MISMATCH:
105 errstr = "Array length mismatch";
106 break;
107 case ERROR_ARRAY_BOUNDS_MISMATCH:
108 errstr = "Array bounds mismatch";
109 break;
110 case ERROR_FILE_IO:
111 errstr = "File IO";
112 break;
113 case ERROR_TEXTIO:
114 errstr = "TextIO";
115 break;
116 case ERROR_NO_SOCKETS:
117 errstr = "Sorry, the system does not have sockets support";
118 break;
119 default:
120 errstr = "Unkown runtime error";
121 break;
122 }
123
124 // Output error string
125 error(errstr);
126 }
127
128
129 void
debug(const char * str,const char * file,const int line)130 debug(const char *str, const char *file, const int line) {
131 kernel_error_stream << "Debug info from " << file << " at line " << line << ": " << str << "\n";
132 }
133
134 #ifdef DEBUG
135 void
execute_assert(bool expr,string str,char * file,int line)136 void execute_assert(bool expr, string str, char *file, int line) {
137 {
138 kernel_error_stream << "In file " << file << ":" << line << endl;
139 if (expr)
140 error(str);
141 }
142 #endif
143
144
145