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