blob: 5820ebc0aaeb6252240a00ecd5f981a2f0644108 [file] [log] [blame]
#ifndef VPR_ERROR_H
#define VPR_ERROR_H
#include <cstdarg>
#include <string>
#include <unordered_set>
#include "vtr_error.h"
enum e_vpr_error {
VPR_ERROR_UNKNOWN = 0,
VPR_ERROR_ARCH,
VPR_ERROR_PACK,
VPR_ERROR_PLACE,
VPR_ERROR_ROUTE,
VPR_ERROR_TIMING,
VPR_ERROR_POWER,
VPR_ERROR_SDC,
VPR_ERROR_NET_F,
VPR_ERROR_PLACE_F,
VPR_ERROR_BLIF_F,
VPR_ERROR_IMPL_NETLIST_WRITER,
VPR_ERROR_NETLIST,
VPR_ERROR_ATOM_NETLIST,
VPR_ERROR_CLB_NETLIST,
VPR_ERROR_ANALYSIS,
VPR_ERROR_INTERRUPTED,
VPR_ERROR_DRAW,
VPR_ERROR_OTHER
};
typedef enum e_vpr_error t_vpr_error_type;
/* This structure is thrown back to highest level of VPR flow if an *
* internal VPR or user input error occurs. */
class VprError : public vtr::VtrError {
public:
VprError(t_vpr_error_type err_type,
std::string msg = "",
std::string file = "",
size_t linenum = -1)
: VtrError(msg, file, linenum)
, type_(err_type) {}
t_vpr_error_type type() const { return type_; }
private:
t_vpr_error_type type_;
};
// This function is used to save into the functions_to_demote set
// all the function names which contain VPR_THROW errors that are
// going to be demoted to be VTR_LOG_WARN
void map_error_activation_status(std::string function_name);
//VPR error reporting routines
//
//Note that we mark these functions with the C++11 attribute 'noreturn'
//as they will throw exceptions and not return normally. This can help
//reduce false-positive compiler warnings
[[noreturn]] void vpr_throw(enum e_vpr_error type, const char* psz_file_name, unsigned int line_num, const char* psz_message, ...);
[[noreturn]] void vvpr_throw(enum e_vpr_error type, const char* psz_file_name, unsigned int line_num, const char* psz_message, va_list args);
[[noreturn]] void vpr_throw_msg(enum e_vpr_error type, const char* psz_file_name, unsigned int line_num, std::string msg);
void vpr_throw_opt(enum e_vpr_error type, const char* psz_func_pretty_name, const char* psz_func_name, const char* psz_file_name, unsigned int line_num, const char* psz_message, ...);
//Figure out what macro to use to get the name of the current function
// We default to __func__ which is defined in C99
//
// g++ > 2.6 define __PRETTY_FUNC__ which includes class/namespace/overload
// information, so we prefer to use it if possible
#define VPR_THROW_FUNCTION __func__
#ifdef __GNUC__
# ifdef __GNUC_MINOR__
# if __GNUC__ >= 2 && __GNUC_MINOR__ > 6
# undef VPR_THROW_FUNCTION
# define VPR_THROW_FUNCTION __PRETTY_FUNCTION__
# endif
# endif
#endif
/*
* Unconditionally throws a VprError condition with automatically specified
* file and line number of the call site.
*
* It is preferred to use either VPR_FATAL_ERROR(), or VPR_ERROR() to capture
* the intention behind the throw.
*
* This macro is a wrapper around vpr_throw().
*/
#define VPR_THROW(type, ...) \
do { \
vpr_throw(type, __FILE__, __LINE__, __VA_ARGS__); \
} while (false)
/*
* VPR_FATAL_ERROR() is used to signal an *unconditional* fatal error which should
* stop the program.
*
* This macro is a wrapper around VPR_THOW()
*/
#define VPR_FATAL_ERROR(...) \
do { \
VPR_THROW(__VA_ARGS__); \
} while (false)
/*
* VPR_ERROR() is used to signal an error (potentially non-fatal) which by
* default stops the program, but may be suppressed (i.e. converted to a
* warning).
*
* This macro is a wrapper around vpr_throw_opt() which automatically
* specifies file and line number of call site.
*
*/
#define VPR_ERROR(type, ...) \
do { \
vpr_throw_opt(type, VPR_THROW_FUNCTION, __func__, __FILE__, __LINE__, __VA_ARGS__); \
} while (false)
#endif