20PyObject *convert(
const T &t)
22 PyErr_SetString(PyExc_NotImplementedError,
"failed to convert C++ object to PyObject");
26PyObject *convert<std::string>(
const std::string &
s);
28PyObject *convert<etiss::int32>(
const etiss::int32 &
s);
31T convert(PyObject *,
bool &ok)
37template <
typename T1,
typename T2,
typename T3>
38PyObject *convert(
const std::tuple<T1, T2, T3> &a234)
40 PyObject *list = PyList_New(0);
41 PyObject *o = convert(std::get<0>(a234));
47 PyList_Append(list, o);
49 o = convert(std::get<1>(a234));
55 PyList_Append(list, o);
57 o = convert(std::get<2>(a234));
63 PyList_Append(list, o);
69PyObject *convert(
const std::set<T> &set)
71 PyObject *list = PyList_New(0);
72 for (
auto iter = set.begin(); iter != set.end(); iter++)
74 PyObject *e = convert(*iter);
82 if (PyList_Append(list, convert(*iter)) != 0)
94PyObject *convert(
const std::list<T> &set)
96 PyObject *list = PyList_New(0);
97 for (
auto iter = set.begin(); iter != set.end(); iter++)
99 PyObject *e = convert(*iter);
107 if (PyList_Append(list, convert(*iter)) != 0)
118template <
typename K,
typename V>
119PyObject *convert(
const std::map<K, V> &set)
121 PyObject *dict = PyDict_New();
122 for (
auto iter = set.begin(); iter != set.end(); iter++)
124 PyObject *k = convert(iter->first);
132 PyObject *
v = convert(iter->second);
141 if (PyDict_SetItem(dict, k,
v) != 0)
165PyObject *convert<std::string>(
const std::string &
s)
167 return PyString_FromString(
s.c_str());
170PyObject *convert<etiss::int32>(
const etiss::int32 &
s)
172 return PyInt_FromSsize_t(
s);
176std::string convert<std::string>(PyObject *o,
bool &ok)
178 char *
str = PyString_AsString(o);
181 return std::string(str);
195template <std::set<std::string> (*list)()>
196static PyObject *pyetiss_listX(PyObject *self, PyObject *args)
198 return convert(list());
200template <std::list<std::string> (*list)()>
201static PyObject *pyetiss_listX(PyObject *self, PyObject *args)
203 return convert(list());
206static PyObject *pyetiss_loadLibrary(PyObject *self, PyObject *args)
211 if (!PyArg_ParseTuple(args,
"ss", &name, &path))
229static PyObject *pyetiss_cfg_get(PyObject *self, PyObject *args)
234 if (!PyArg_ParseTuple(args,
"ss", &name, &def))
236 return convert(
etiss::cfg().get<std::string>(std::string(name), std::string(def)));
238static PyObject *pyetiss_cfg_set(PyObject *self, PyObject *args)
243 if (!PyArg_ParseTuple(args,
"ss", &name, &def))
245 return convert(
etiss::cfg().get<std::string>(std::string(name), std::string(def)));
247static PyObject *pyetiss_cfg_all(PyObject *self, PyObject *args)
251static PyObject *pyetiss_cfg_help(PyObject *self, PyObject *args)
256static PyObject *pyetiss_returnCodes(PyObject *self, PyObject *args)
258 std::map<etiss::int32, const char *> m = etiss::RETURNCODE::getErrorMessages();
259 std::map<etiss::int32, std::string> ret;
260 for (
auto iter = m.begin(); iter != m.end(); iter++)
262 ret[iter->first] = std::string(etiss::RETURNCODE::getErrorNames()[iter->first]) +
": " + iter->second;
271static PyMethodDef ETISSMethods[] = {
273 {
"listCPUArchs", pyetiss_listX<etiss::listCPUArchs>, METH_VARARGS,
"List available cpu architectures." },
274 {
"listJITs", pyetiss_listX<etiss::listJITs>, METH_VARARGS,
"List compilers." },
275 {
"listPlugins", pyetiss_listX<etiss::listPlugins>, METH_VARARGS,
"List plugins." },
276 {
"listCPUs", pyetiss_listX<etiss::CPUCore::list>, METH_VARARGS,
"List plugins." },
277 {
"listLibraries", pyetiss_listX<etiss::listLibraries>, METH_VARARGS,
"List loaded libraries." },
278 {
"loadLibrary", pyetiss_loadLibrary, METH_VARARGS,
"Try to open a shared library." },
279 {
"cfgGet", pyetiss_cfg_get, METH_VARARGS,
"Get the string value of an option" },
280 {
"cfgSet", pyetiss_cfg_set, METH_VARARGS,
"Set the string value of an option" },
281 {
"cfg", pyetiss_cfg_all, METH_VARARGS,
"Get all options in a list" },
282 {
"cfgHelp", pyetiss_cfg_help, METH_VARARGS,
"Get all announced option info in a dictionary" },
283 {
"RETURNCODES", pyetiss_returnCodes, METH_VARARGS,
"Get global return codes" },
299 static bool done =
false;
303 Py_InitModule3(
"etiss", ETISSMethods,
"ETISS python bindings");
310PyThreadState *etiss_main_pyThreadState = 0;
322void run(std::function<
void(
void)> func)
324 PyGILState_STATE gstate = PyGILState_Ensure();
326 PyGILState_Release(gstate);
329void runEXT(std::function<
void(
void)> func)
331 Py_BEGIN_ALLOW_THREADS func();
337 run([&
s]() { PyRun_SimpleString(
s); });
343 runString(
"print('ETISS functions are provided the the module \\'etiss\\'.')");
344 runString(
"import code;\ncode.interact(\"ETISS Python Console\")");
350 if (
etiss::cfg().get<bool>(
"pyinitialize",
true))
353 if (
etiss::cfg().get<bool>(
"pyinittheads",
true))
355 if (PyEval_ThreadsInitialized() == 0)
357 PyEval_InitThreads();
358 PyEval_ReleaseLock();
368 PyEval_AcquireLock();
370 PyRun_SimpleString(
"print('ETISS: INFO: ETISS has been build with python support.')\n");
372 PyEval_ReleaseLock();
378 if (
etiss::cfg().get<bool>(
"pyfinalize",
true))
385std::string
evalForString(
const char *stmt,
bool *ok =
nullptr)
389 PyObject *result = 0;
393 PyObject *
main = PyImport_AddModule(
"__main__");
398 PyObject *globalDictionary = PyModule_GetDict(
main);
399 if (globalDictionary == 0)
403 PyObject *localDictionary = PyDict_New();
404 if (localDictionary == 0)
408 result = PyRun_String(stmt, Py_file_input, globalDictionary, localDictionary);
413 std::string ret = convert<std::string>(result, ok ? *ok : lok);
442void run(std::function<
void(
void)> func) {}
Header file of the ETISS library.
__device__ __2f16 float bool s
contains defines to configure ETISS.
bool loadLibrary(std::string path, std::string name)
Load a library.
int main(int argc, const char *argv[])
std::string evalForString(const char *stmt, bool *ok=nullptr)
void runString(std::string s)
void run(std::function< void(void)> func)
void runEXT(std::function< void(void)> func)
Verbosity & verbosity()
Get log level reference.
void log(Verbosity level, std::string msg)
write log message at the given level.