3
0
Fork 0
mirror of https://github.com/YosysHQ/yosys synced 2025-04-23 09:05:32 +00:00

Python Passes can now be added with the -m option or with the plugin command. There are still issues when run in shell mode, but they can be used just fine in a python script

This commit is contained in:
Benedikt Tutzer 2018-08-16 16:00:11 +02:00
parent bf7b73acfc
commit d79a2808cf
5 changed files with 160 additions and 2 deletions

View file

@ -34,6 +34,11 @@ namespace YOSYS_PYTHON {
Yosys::run_pass(command);
}
void log(std::string text)
{
Yosys::log(text.c_str());
}
struct IdString
{
Yosys::RTLIL::IdString* ref_obj;
@ -1388,7 +1393,7 @@ namespace YOSYS_PYTHON {
virtual void py_notify_connect_tuple(Module *module, boost::python::tuple sigsig){};
virtual void py_notify_connect_list(Module* module, boost::python::list sigsig_list){};
virtual void py_notify_blackout(Module*){};
};
};
struct MonitorWrap : Monitor, boost::python::wrapper<Monitor>
{
@ -1471,6 +1476,59 @@ namespace YOSYS_PYTHON {
}
};
struct PyPass : public Yosys::Pass
{
PyPass(std::string name, std::string short_help) : Yosys::Pass(name, short_help) { }
virtual void execute(vector<string> args, Yosys::RTLIL::Design* d) YS_OVERRIDE
{
boost::python::list py_args;
for(auto arg : args)
py_args.append(arg);
py_execute(py_args, new Design(d));
}
virtual void help() YS_OVERRIDE
{
py_help();
}
virtual void py_execute(boost::python::list args, Design* d){}
virtual void py_help(){}
};
struct PassWrap : PyPass, boost::python::wrapper<PyPass>
{
PassWrap(std::string name, std::string short_help) : PyPass(name, short_help) { }
void py_execute(boost::python::list args, Design* d)
{
if(boost::python::override py_execute = this->get_override("py_execute"))
py_execute(args, d);
else
PyPass::py_execute(args, d);
}
void default_py_execute(boost::python::list args, Design* d)
{
this->PyPass::py_execute(args, d);
}
void py_help()
{
if(boost::python::override py_help = this->get_override("py_help"))
py_help();
else
PyPass::py_help();
}
void default_py_help()
{
this->PyPass::py_help();
}
};
void Module::register_monitor(Monitor* const m)
{
Yosys::RTLIL::Module* cpp_module = this->get_cpp_obj();
@ -2778,6 +2836,11 @@ namespace YOSYS_PYTHON {
.def("py_notify_blackout", &Monitor::py_notify_blackout, &MonitorWrap::default_py_notify_blackout)
;
class_<PassWrap, boost::noncopyable>("Pass", init<std::string, std::string>())
.def("py_execute", &PyPass::py_execute, &PassWrap::default_py_execute)
.def("py_help", &PyPass::py_help, &PassWrap::default_py_help)
;
class_<Initializer>("Initializer");
scope().attr("_hidden") = new Initializer();
@ -3099,6 +3162,7 @@ namespace YOSYS_PYTHON {
def("const_neg", const_neg);
def("run",run);
def("log",log);
}

View file

@ -469,21 +469,40 @@ int GetSize(RTLIL::Wire *wire)
return wire->width;
}
bool already_setup = false;
void yosys_setup()
{
if(already_setup)
return;
already_setup = true;
// if there are already IdString objects then we have a global initialization order bug
IdString empty_id;
log_assert(empty_id.index_ == 0);
IdString::get_reference(empty_id.index_);
#ifdef WITH_PYTHON
Py_Initialize();
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append(\"./\")");
//PyRun_SimpleString("import libyosys");
//PyRun_SimpleString("sys.path.append(\"./plugins\")");
//PyRun_SimpleString(("sys.path.append(\""+proc_share_dirname()+"plugins\")").c_str());
#endif
Pass::init_register();
yosys_design = new RTLIL::Design;
yosys_celltypes.setup();
log_push();
}
bool already_shutdown = false;
void yosys_shutdown()
{
if(already_shutdown)
return;
already_shutdown = true;
log_pop();
delete yosys_design;
@ -511,9 +530,16 @@ void yosys_shutdown()
dlclose(it.second);
loaded_plugins.clear();
#ifdef WITH_PYTHON
loaded_python_plugins.clear();
#endif
loaded_plugin_aliases.clear();
#endif
#ifdef WITH_PYTHON
Py_Finalize();
#endif
IdString empty_id;
IdString::put_reference(empty_id.index_);
}

View file

@ -66,6 +66,8 @@
#include <stdio.h>
#include <limits.h>
#include <Python.h>
#ifndef _YOSYS_
# error It looks like you are trying to build Yosys without the config defines set. \
When building Yosys with a custom make system, make sure you set all the \
@ -317,6 +319,9 @@ extern std::vector<RTLIL::Design*> pushed_designs;
// from passes/cmds/pluginc.cc
extern std::map<std::string, void*> loaded_plugins;
#ifdef WITH_PYTHON
extern std::map<std::string, void*> loaded_python_plugins;
#endif
extern std::map<std::string, std::string> loaded_plugin_aliases;
void load_plugin(std::string filename, std::vector<std::string> aliases);