Reformat remaining files
Signed-off-by: David Shah <davey1576@gmail.com>
This commit is contained in:
parent
cbd0622fb8
commit
7f330af9f3
@ -1,11 +1,12 @@
|
||||
#include <boost/python.hpp>
|
||||
#include <Python.h>
|
||||
#include <boost/python.hpp>
|
||||
|
||||
namespace py = boost::python;
|
||||
|
||||
// Parses the value of the active python exception
|
||||
// NOTE SHOULD NOT BE CALLED IF NO EXCEPTION
|
||||
std::string parse_python_exception(){
|
||||
std::string parse_python_exception()
|
||||
{
|
||||
PyObject *type_ptr = NULL, *value_ptr = NULL, *traceback_ptr = NULL;
|
||||
// Fetch the exception info from the Python C API
|
||||
PyErr_Fetch(&type_ptr, &value_ptr, &traceback_ptr);
|
||||
@ -13,30 +14,31 @@ std::string parse_python_exception(){
|
||||
// Fallback error
|
||||
std::string ret("Unfetchable Python error");
|
||||
// If the fetch got a type pointer, parse the type into the exception string
|
||||
if(type_ptr != NULL){
|
||||
if (type_ptr != NULL) {
|
||||
py::handle<> h_type(type_ptr);
|
||||
py::str type_pstr(h_type);
|
||||
// Extract the string from the boost::python object
|
||||
py::extract<std::string> e_type_pstr(type_pstr);
|
||||
// If a valid string extraction is available, use it
|
||||
// If a valid string extraction is available, use it
|
||||
// otherwise use fallback
|
||||
if(e_type_pstr.check())
|
||||
if (e_type_pstr.check())
|
||||
ret = e_type_pstr();
|
||||
else
|
||||
ret = "Unknown exception type";
|
||||
}
|
||||
// Do the same for the exception value (the stringification of the exception)
|
||||
if(value_ptr != NULL){
|
||||
// Do the same for the exception value (the stringification of the
|
||||
// exception)
|
||||
if (value_ptr != NULL) {
|
||||
py::handle<> h_val(value_ptr);
|
||||
py::str a(h_val);
|
||||
py::extract<std::string> returned(a);
|
||||
if(returned.check())
|
||||
ret += ": " + returned();
|
||||
if (returned.check())
|
||||
ret += ": " + returned();
|
||||
else
|
||||
ret += std::string(": Unparseable Python error: ");
|
||||
}
|
||||
// Parse lines from the traceback using the Python traceback module
|
||||
if(traceback_ptr != NULL){
|
||||
if (traceback_ptr != NULL) {
|
||||
py::handle<> h_tb(traceback_ptr);
|
||||
// Load the traceback module and the format_tb function
|
||||
py::object tb(py::import("traceback"));
|
||||
@ -47,7 +49,7 @@ std::string parse_python_exception(){
|
||||
py::object tb_str(py::str("\n").join(tb_list));
|
||||
// Extract the string, check the extraction, and fallback in necessary
|
||||
py::extract<std::string> returned(tb_str);
|
||||
if(returned.check())
|
||||
if (returned.check())
|
||||
ret += ": " + returned();
|
||||
else
|
||||
ret += std::string(": Unparseable Python traceback");
|
||||
|
@ -20,7 +20,6 @@
|
||||
#ifndef LOG_H
|
||||
#define LOG_H
|
||||
|
||||
#include <ostream>
|
||||
#include <ostream>
|
||||
#include <set>
|
||||
#include <stdarg.h>
|
||||
|
@ -21,13 +21,12 @@
|
||||
#ifndef COMMON_PYCONTAINERS_H
|
||||
#define COMMON_PYCONTAINERS_H
|
||||
|
||||
#include <utility>
|
||||
#include <boost/python.hpp>
|
||||
#include <boost/python/suite/indexing/map_indexing_suite.hpp>
|
||||
#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
|
||||
#include <stdexcept>
|
||||
#include <type_traits>
|
||||
#include <boost/python.hpp>
|
||||
#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
|
||||
#include <boost/python/suite/indexing/map_indexing_suite.hpp>
|
||||
#include <boost/python/suite/indexing/map_indexing_suite.hpp>
|
||||
#include <utility>
|
||||
|
||||
using namespace boost::python;
|
||||
|
||||
@ -36,27 +35,30 @@ A wrapper for a Pythonised nextpnr Iterator. The actual class wrapped is a
|
||||
pair<Iterator, Iterator> containing (current, end)
|
||||
*/
|
||||
|
||||
template<typename T, typename P>
|
||||
struct iterator_wrapper {
|
||||
typedef decltype(*(std::declval<T>())) value_t;
|
||||
template <typename T, typename P> struct iterator_wrapper
|
||||
{
|
||||
typedef decltype(*(std::declval<T>())) value_t;
|
||||
|
||||
static value_t next(std::pair <T, T> &iter) {
|
||||
if (iter.first != iter.second) {
|
||||
value_t val = *iter.first;
|
||||
++iter.first;
|
||||
return val;
|
||||
} else {
|
||||
PyErr_SetString(PyExc_StopIteration, "End of range reached");
|
||||
boost::python::throw_error_already_set();
|
||||
// Should be unreachable, but prevent control may reach end of non-void
|
||||
throw std::runtime_error("unreachable");
|
||||
}
|
||||
}
|
||||
static value_t next(std::pair<T, T> &iter)
|
||||
{
|
||||
if (iter.first != iter.second) {
|
||||
value_t val = *iter.first;
|
||||
++iter.first;
|
||||
return val;
|
||||
} else {
|
||||
PyErr_SetString(PyExc_StopIteration, "End of range reached");
|
||||
boost::python::throw_error_already_set();
|
||||
// Should be unreachable, but prevent control may reach end of
|
||||
// non-void
|
||||
throw std::runtime_error("unreachable");
|
||||
}
|
||||
}
|
||||
|
||||
static void wrap(const char *python_name) {
|
||||
class_ < std::pair < T, T >> (python_name, no_init)
|
||||
.def("__next__", next, P());
|
||||
}
|
||||
static void wrap(const char *python_name)
|
||||
{
|
||||
class_<std::pair<T, T>>(python_name, no_init)
|
||||
.def("__next__", next, P());
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
@ -65,20 +67,22 @@ and end() which return iterator-like objects supporting ++, * and !=
|
||||
Full STL iterator semantics are not required, unlike the standard Boost wrappers
|
||||
*/
|
||||
|
||||
template<typename T, typename P = return_value_policy<return_by_value>>
|
||||
struct range_wrapper {
|
||||
typedef decltype(std::declval<T>().begin()) iterator_t;
|
||||
template <typename T, typename P = return_value_policy<return_by_value>>
|
||||
struct range_wrapper
|
||||
{
|
||||
typedef decltype(std::declval<T>().begin()) iterator_t;
|
||||
|
||||
static std::pair <iterator_t, iterator_t> iter(T &range) {
|
||||
return std::make_pair(range.begin(), range.end());
|
||||
}
|
||||
static std::pair<iterator_t, iterator_t> iter(T &range)
|
||||
{
|
||||
return std::make_pair(range.begin(), range.end());
|
||||
}
|
||||
|
||||
static void wrap(const char *range_name, const char *iter_name) {
|
||||
class_<T>(range_name, no_init)
|
||||
.def("__iter__", iter);
|
||||
iterator_wrapper<iterator_t, P>().wrap(iter_name);
|
||||
}
|
||||
typedef iterator_wrapper<iterator_t, P> iter_wrap;
|
||||
static void wrap(const char *range_name, const char *iter_name)
|
||||
{
|
||||
class_<T>(range_name, no_init).def("__iter__", iter);
|
||||
iterator_wrapper<iterator_t, P>().wrap(iter_name);
|
||||
}
|
||||
typedef iterator_wrapper<iterator_t, P> iter_wrap;
|
||||
};
|
||||
|
||||
#define WRAP_RANGE(t) range_wrapper<t##Range>().wrap(#t "Range", #t "Iterator")
|
||||
@ -88,42 +92,50 @@ Wrapper for a map, either an unordered_map, regular map or dict
|
||||
*/
|
||||
inline void KeyError() { PyErr_SetString(PyExc_KeyError, "Key not found"); }
|
||||
|
||||
template<typename T>
|
||||
struct map_wrapper {
|
||||
typedef typename std::remove_cv<typename std::remove_reference<typename T::key_type>::type>::type K;
|
||||
typedef typename T::mapped_type V;
|
||||
typedef typename T::value_type KV;
|
||||
template <typename T> struct map_wrapper
|
||||
{
|
||||
typedef typename std::remove_cv<
|
||||
typename std::remove_reference<typename T::key_type>::type>::type K;
|
||||
typedef typename T::mapped_type V;
|
||||
typedef typename T::value_type KV;
|
||||
|
||||
static V &get(T &x, K const &i) {
|
||||
if (x.find(i) != x.end()) return x.at(i);
|
||||
KeyError();
|
||||
std::terminate();
|
||||
}
|
||||
static V &get(T &x, K const &i)
|
||||
{
|
||||
if (x.find(i) != x.end())
|
||||
return x.at(i);
|
||||
KeyError();
|
||||
std::terminate();
|
||||
}
|
||||
|
||||
static void set(T &x, K const &i, V const &v) {
|
||||
x[i] = v;
|
||||
}
|
||||
static void set(T &x, K const &i, V const &v) { x[i] = v; }
|
||||
|
||||
static void del(T const &x, K const &i) {
|
||||
if (x.find(i) != x.end()) x.erase(i);
|
||||
else KeyError();
|
||||
std::terminate();
|
||||
}
|
||||
static void del(T const &x, K const &i)
|
||||
{
|
||||
if (x.find(i) != x.end())
|
||||
x.erase(i);
|
||||
else
|
||||
KeyError();
|
||||
std::terminate();
|
||||
}
|
||||
|
||||
static void wrap(const char *map_name, const char *kv_name, const char *iter_name) {
|
||||
class_<KV>(kv_name)
|
||||
.def_readonly("first", &KV::first)
|
||||
.def_readwrite("second", &KV::second);
|
||||
typedef range_wrapper<T, return_value_policy<copy_non_const_reference>> rw;
|
||||
typename rw::iter_wrap().wrap(iter_name);
|
||||
class_<T>(map_name, no_init)
|
||||
.def("__iter__", rw::iter)
|
||||
.def("__len__", &T::size)
|
||||
.def("__getitem__", get, return_internal_reference<>())
|
||||
.def("__setitem__", set, with_custodian_and_ward<1,2>());
|
||||
}
|
||||
static void wrap(const char *map_name, const char *kv_name,
|
||||
const char *iter_name)
|
||||
{
|
||||
class_<KV>(kv_name)
|
||||
.def_readonly("first", &KV::first)
|
||||
.def_readwrite("second", &KV::second);
|
||||
typedef range_wrapper<T, return_value_policy<copy_non_const_reference>>
|
||||
rw;
|
||||
typename rw::iter_wrap().wrap(iter_name);
|
||||
class_<T>(map_name, no_init)
|
||||
.def("__iter__", rw::iter)
|
||||
.def("__len__", &T::size)
|
||||
.def("__getitem__", get, return_internal_reference<>())
|
||||
.def("__setitem__", set, with_custodian_and_ward<1, 2>());
|
||||
}
|
||||
};
|
||||
|
||||
#define WRAP_MAP(t, name) map_wrapper<t>().wrap(#name, #name "KeyValue", #name "Iterator")
|
||||
#define WRAP_MAP(t, name) \
|
||||
map_wrapper<t>().wrap(#name, #name "KeyValue", #name "Iterator")
|
||||
|
||||
#endif
|
||||
|
@ -27,7 +27,4 @@ const vector<BelId> &Chip::getBels() const
|
||||
return ret;
|
||||
}
|
||||
|
||||
BelType Chip::getBelType(BelId bel) const
|
||||
{
|
||||
return BelType();
|
||||
}
|
||||
BelType Chip::getBelType(BelId bel) const { return BelType(); }
|
||||
|
@ -23,7 +23,6 @@
|
||||
#include "design.h"
|
||||
#include "jsonparse.h"
|
||||
#include "log.h"
|
||||
#include "log.h"
|
||||
#include "mainwindow.h"
|
||||
#include "place.h"
|
||||
#include "pybindings.h"
|
||||
|
Loading…
Reference in New Issue
Block a user