diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/cellaigs.cc | 2 | ||||
| -rw-r--r-- | kernel/celltypes.h | 2 | ||||
| -rw-r--r-- | kernel/cost.h | 4 | ||||
| -rw-r--r-- | kernel/driver.cc | 20 | ||||
| -rw-r--r-- | kernel/log.cc | 7 | ||||
| -rw-r--r-- | kernel/log.h | 43 | ||||
| -rw-r--r-- | kernel/register.cc | 1 | ||||
| -rw-r--r-- | kernel/rtlil.cc | 113 | ||||
| -rw-r--r-- | kernel/rtlil.h | 33 | ||||
| -rw-r--r-- | kernel/yosys.cc | 52 | ||||
| -rw-r--r-- | kernel/yosys.h | 14 | 
11 files changed, 275 insertions, 16 deletions
diff --git a/kernel/cellaigs.cc b/kernel/cellaigs.cc index 5fd76afe5..26c625f89 100644 --- a/kernel/cellaigs.cc +++ b/kernel/cellaigs.cc @@ -453,7 +453,7 @@ Aig::Aig(Cell *cell)  		int B = mk.inport("\\B");  		int C = mk.inport("\\C");  		int D = mk.inport("\\D"); -		int Y = mk.nand_gate(mk.nor_gate(A, B), mk.nor_gate(C, D)); +		int Y = mk.nand_gate(mk.or_gate(A, B), mk.or_gate(C, D));  		mk.outport(Y, "\\Y");  		goto optimize;  	} diff --git a/kernel/celltypes.h b/kernel/celltypes.h index ae88f4aaf..0da78c313 100644 --- a/kernel/celltypes.h +++ b/kernel/celltypes.h @@ -464,7 +464,7 @@ struct CellTypes  		if (cell->type == "$_AOI4_")  			return eval_not(const_or(const_and(arg1, arg2, false, false, 1), const_and(arg3, arg4, false, false, 1), false, false, 1));  		if (cell->type == "$_OAI4_") -			return eval_not(const_and(const_or(arg1, arg2, false, false, 1), const_and(arg3, arg4, false, false, 1), false, false, 1)); +			return eval_not(const_and(const_or(arg1, arg2, false, false, 1), const_or(arg3, arg4, false, false, 1), false, false, 1));  		log_assert(arg4.bits.size() == 0);  		return eval(cell, arg1, arg2, arg3, errp); diff --git a/kernel/cost.h b/kernel/cost.h index e795b571b..41a09eb63 100644 --- a/kernel/cost.h +++ b/kernel/cost.h @@ -26,7 +26,7 @@ YOSYS_NAMESPACE_BEGIN  int get_cell_cost(RTLIL::Cell *cell, dict<RTLIL::IdString, int> *mod_cost_cache = nullptr); -int get_cell_cost(RTLIL::IdString type, const dict<RTLIL::IdString, RTLIL::Const> ¶meters = dict<RTLIL::IdString, RTLIL::Const>(), +inline int get_cell_cost(RTLIL::IdString type, const dict<RTLIL::IdString, RTLIL::Const> ¶meters = dict<RTLIL::IdString, RTLIL::Const>(),  		RTLIL::Design *design = nullptr, dict<RTLIL::IdString, int> *mod_cost_cache = nullptr)  {  	static dict<RTLIL::IdString, int> gate_cost = { @@ -76,7 +76,7 @@ int get_cell_cost(RTLIL::IdString type, const dict<RTLIL::IdString, RTLIL::Const  	return 1;  } -int get_cell_cost(RTLIL::Cell *cell, dict<RTLIL::IdString, int> *mod_cost_cache) +inline int get_cell_cost(RTLIL::Cell *cell, dict<RTLIL::IdString, int> *mod_cost_cache)  {  	return get_cell_cost(cell->type, cell->parameters, cell->module->design, mod_cost_cache);  } diff --git a/kernel/driver.cc b/kernel/driver.cc index a0bb7e60a..f273057dd 100644 --- a/kernel/driver.cc +++ b/kernel/driver.cc @@ -110,6 +110,10 @@ int main(int argc, char **argv)  	log_error_stderr = true;  	yosys_banner();  	yosys_setup(); +#ifdef WITH_PYTHON +	PyRun_SimpleString(("sys.path.append(\""+proc_self_dirname()+"\")").c_str()); +	PyRun_SimpleString(("sys.path.append(\""+proc_share_dirname()+"plugins\")").c_str()); +#endif  	if (argc == 2)  	{ @@ -291,6 +295,9 @@ int main(int argc, char **argv)  		printf("    -E <depsfile>\n");  		printf("        write a Makefile dependencies file with in- and output file names\n");  		printf("\n"); +		printf("    -g\n"); +		printf("        globally enable debug log messages\n"); +		printf("\n");  		printf("    -V\n");  		printf("        print version information and exit\n");  		printf("\n"); @@ -311,7 +318,7 @@ int main(int argc, char **argv)  	}  	int opt; -	while ((opt = getopt(argc, argv, "MXAQTVSm:f:Hh:b:o:p:l:L:qv:tds:c:W:w:e:D:P:E:")) != -1) +	while ((opt = getopt(argc, argv, "MXAQTVSgm:f:Hh:b:o:p:l:L:qv:tds:c:W:w:e:D:P:E:")) != -1)  	{  		switch (opt)  		{ @@ -336,6 +343,9 @@ int main(int argc, char **argv)  		case 'S':  			passes_commands.push_back("synth");  			break; +		case 'g': +			log_force_debug++; +			break;  		case 'm':  			plugin_filenames.push_back(optarg);  			break; @@ -469,6 +479,10 @@ int main(int argc, char **argv)  #endif  	yosys_setup(); +#ifdef WITH_PYTHON +	PyRun_SimpleString(("sys.path.append(\""+proc_self_dirname()+"\")").c_str()); +	PyRun_SimpleString(("sys.path.append(\""+proc_share_dirname()+"plugins\")").c_str()); +#endif  	log_error_atexit = yosys_atexit;  	for (auto &fn : plugin_filenames) @@ -515,13 +529,13 @@ int main(int argc, char **argv)  			log_error("Can't open dependencies file for writing: %s\n", strerror(errno));  		bool first = true;  		for (auto fn : yosys_output_files) { -			fprintf(f, "%s%s", first ? "" : " ", fn.c_str()); +			fprintf(f, "%s%s", first ? "" : " ", escape_filename_spaces(fn).c_str());  			first = false;  		}  		fprintf(f, ":");  		for (auto fn : yosys_input_files) {  			if (yosys_output_files.count(fn) == 0) -				fprintf(f, " %s", fn.c_str()); +				fprintf(f, " %s", escape_filename_spaces(fn).c_str());  		}  		fprintf(f, "\n");  	} diff --git a/kernel/log.cc b/kernel/log.cc index 400a549dd..9a9104e26 100644 --- a/kernel/log.cc +++ b/kernel/log.cc @@ -56,6 +56,10 @@ int log_verbose_level;  string log_last_error;  void (*log_error_atexit)() = NULL; +int log_make_debug = 0; +int log_force_debug = 0; +int log_debug_suppressed = 0; +  vector<int> header_count;  pool<RTLIL::IdString> log_id_cache;  vector<shared_str> string_buf; @@ -92,6 +96,9 @@ void logv(const char *format, va_list ap)  		format++;  	} +	if (log_make_debug && !ys_debug(1)) +		return; +  	std::string str = vstringf(format, ap);  	if (str.empty()) diff --git a/kernel/log.h b/kernel/log.h index 759939025..e6afae716 100644 --- a/kernel/log.h +++ b/kernel/log.h @@ -64,6 +64,10 @@ extern int log_verbose_level;  extern string log_last_error;  extern void (*log_error_atexit)(); +extern int log_make_debug; +extern int log_force_debug; +extern int log_debug_suppressed; +  void logv(const char *format, va_list ap);  void logv_header(RTLIL::Design *design, const char *format, va_list ap);  void logv_warning(const char *format, va_list ap); @@ -82,6 +86,45 @@ YS_NORETURN void log_error(const char *format, ...) YS_ATTRIBUTE(format(printf,  void log_file_error(const string &filename, int lineno, const char *format, ...) YS_ATTRIBUTE(format(printf, 3, 4), noreturn);  YS_NORETURN void log_cmd_error(const char *format, ...) YS_ATTRIBUTE(format(printf, 1, 2), noreturn); +#ifndef NDEBUG +static inline bool ys_debug(int n = 0) { if (log_force_debug) return true; log_debug_suppressed += n; return false; } +#  define log_debug(...) do { if (ys_debug(1)) log(__VA_ARGS__); } while (0) +#else +static inline bool ys_debug(int n = 0) { return false; } +#  define log_debug(_fmt, ...) do { } while (0) +#endif + +static inline void log_suppressed() { +	if (log_debug_suppressed && !log_make_debug) { +		log("<suppressed ~%d debug messages>\n", log_debug_suppressed); +		log_debug_suppressed = 0; +	} +} + +struct LogMakeDebugHdl { +	bool status = false; +	LogMakeDebugHdl(bool start_on = false) { +		if (start_on) +			on(); +	} +	~LogMakeDebugHdl() { +		off(); +	} +	void on() { +		if (status) return; +		status=true; +		log_make_debug++; +	} +	void off_silent() { +		if (!status) return; +		status=false; +		log_make_debug--; +	} +	void off() { +		off_silent(); +	} +}; +  void log_spacer();  void log_push();  void log_pop(); diff --git a/kernel/register.cc b/kernel/register.cc index 64956401f..71eb6b187 100644 --- a/kernel/register.cc +++ b/kernel/register.cc @@ -87,6 +87,7 @@ Pass::pre_post_exec_state_t Pass::pre_execute()  void Pass::post_execute(Pass::pre_post_exec_state_t state)  {  	IdString::checkpoint(); +	log_suppressed();  	int64_t time_ns = PerformanceTimer::query() - state.begin_ns;  	runtime_ns += time_ns; diff --git a/kernel/rtlil.cc b/kernel/rtlil.cc index 9ae20a317..dd6817873 100644 --- a/kernel/rtlil.cc +++ b/kernel/rtlil.cc @@ -76,6 +76,13 @@ RTLIL::Const::Const(const std::vector<bool> &bits)  		this->bits.push_back(b ? RTLIL::S1 : RTLIL::S0);  } +RTLIL::Const::Const(const RTLIL::Const &c) +{ +	flags = c.flags; +	for (auto b : c.bits) +		this->bits.push_back(b); +} +  bool RTLIL::Const::operator <(const RTLIL::Const &other) const  {  	if (bits.size() != other.bits.size()) @@ -207,9 +214,12 @@ bool RTLIL::Const::is_fully_undef() const  	return true;  } -void RTLIL::AttrObject::set_bool_attribute(RTLIL::IdString id) +void RTLIL::AttrObject::set_bool_attribute(RTLIL::IdString id, bool value)  { -	attributes[id] = RTLIL::Const(1); +	if (value) +		attributes[id] = RTLIL::Const(1); +	else if (attributes.count(id)) +		attributes.erase(id);  }  bool RTLIL::AttrObject::get_bool_attribute(RTLIL::IdString id) const @@ -360,6 +370,10 @@ RTLIL::Design::Design()  	refcount_modules_ = 0;  	selection_stack.push_back(RTLIL::Selection()); + +#ifdef WITH_PYTHON +	RTLIL::Design::get_all_designs()->insert(std::pair<unsigned int, RTLIL::Design*>(hashidx_, this)); +#endif  }  RTLIL::Design::~Design() @@ -370,8 +384,19 @@ RTLIL::Design::~Design()  		delete n;  	for (auto n : verilog_globals)  		delete n; +#ifdef WITH_PYTHON +	RTLIL::Design::get_all_designs()->erase(hashidx_); +#endif  } +#ifdef WITH_PYTHON +static std::map<unsigned int, RTLIL::Design*> all_designs; +std::map<unsigned int, RTLIL::Design*> *RTLIL::Design::get_all_designs(void) +{ +	return &all_designs; +} +#endif +  RTLIL::ObjRange<RTLIL::Module*> RTLIL::Design::modules()  {  	return RTLIL::ObjRange<RTLIL::Module*>(&modules_, &refcount_modules_); @@ -589,7 +614,7 @@ std::vector<RTLIL::Module*> RTLIL::Design::selected_modules() const  	std::vector<RTLIL::Module*> result;  	result.reserve(modules_.size());  	for (auto &it : modules_) -		if (selected_module(it.first) && !it.second->get_bool_attribute("\\blackbox")) +		if (selected_module(it.first) && !it.second->get_blackbox_attribute())  			result.push_back(it.second);  	return result;  } @@ -599,7 +624,7 @@ std::vector<RTLIL::Module*> RTLIL::Design::selected_whole_modules() const  	std::vector<RTLIL::Module*> result;  	result.reserve(modules_.size());  	for (auto &it : modules_) -		if (selected_whole_module(it.first) && !it.second->get_bool_attribute("\\blackbox")) +		if (selected_whole_module(it.first) && !it.second->get_blackbox_attribute())  			result.push_back(it.second);  	return result;  } @@ -609,7 +634,7 @@ std::vector<RTLIL::Module*> RTLIL::Design::selected_whole_modules_warn() const  	std::vector<RTLIL::Module*> result;  	result.reserve(modules_.size());  	for (auto &it : modules_) -		if (it.second->get_bool_attribute("\\blackbox")) +		if (it.second->get_blackbox_attribute())  			continue;  		else if (selected_whole_module(it.first))  			result.push_back(it.second); @@ -627,6 +652,10 @@ RTLIL::Module::Module()  	design = nullptr;  	refcount_wires_ = 0;  	refcount_cells_ = 0; + +#ifdef WITH_PYTHON +	RTLIL::Module::get_all_modules()->insert(std::pair<unsigned int, RTLIL::Module*>(hashidx_, this)); +#endif  }  RTLIL::Module::~Module() @@ -639,7 +668,18 @@ RTLIL::Module::~Module()  		delete it->second;  	for (auto it = processes.begin(); it != processes.end(); ++it)  		delete it->second; +#ifdef WITH_PYTHON +	RTLIL::Module::get_all_modules()->erase(hashidx_); +#endif +} + +#ifdef WITH_PYTHON +static std::map<unsigned int, RTLIL::Module*> all_modules; +std::map<unsigned int, RTLIL::Module*> *RTLIL::Module::get_all_modules(void) +{ +	return &all_modules;  } +#endif  void RTLIL::Module::makeblackbox()  { @@ -2226,7 +2266,26 @@ RTLIL::Wire::Wire()  	port_input = false;  	port_output = false;  	upto = false; + +#ifdef WITH_PYTHON +	RTLIL::Wire::get_all_wires()->insert(std::pair<unsigned int, RTLIL::Wire*>(hashidx_, this)); +#endif +} + +RTLIL::Wire::~Wire() +{ +#ifdef WITH_PYTHON +	RTLIL::Wire::get_all_wires()->erase(hashidx_); +#endif +} + +#ifdef WITH_PYTHON +static std::map<unsigned int, RTLIL::Wire*> all_wires; +std::map<unsigned int, RTLIL::Wire*> *RTLIL::Wire::get_all_wires(void) +{ +	return &all_wires;  } +#endif  RTLIL::Memory::Memory()  { @@ -2237,6 +2296,9 @@ RTLIL::Memory::Memory()  	width = 1;  	start_offset = 0;  	size = 0; +#ifdef WITH_PYTHON +	RTLIL::Memory::get_all_memorys()->insert(std::pair<unsigned int, RTLIL::Memory*>(hashidx_, this)); +#endif  }  RTLIL::Cell::Cell() : module(nullptr) @@ -2247,7 +2309,26 @@ RTLIL::Cell::Cell() : module(nullptr)  	// log("#memtrace# %p\n", this);  	memhasher(); + +#ifdef WITH_PYTHON +	RTLIL::Cell::get_all_cells()->insert(std::pair<unsigned int, RTLIL::Cell*>(hashidx_, this)); +#endif +} + +RTLIL::Cell::~Cell() +{ +#ifdef WITH_PYTHON +	RTLIL::Cell::get_all_cells()->erase(hashidx_); +#endif +} + +#ifdef WITH_PYTHON +static std::map<unsigned int, RTLIL::Cell*> all_cells; +std::map<unsigned int, RTLIL::Cell*> *RTLIL::Cell::get_all_cells(void) +{ +	return &all_cells;  } +#endif  bool RTLIL::Cell::hasPort(RTLIL::IdString portname) const  { @@ -2508,6 +2589,14 @@ RTLIL::SigChunk::SigChunk(RTLIL::SigBit bit)  	width = 1;  } +RTLIL::SigChunk::SigChunk(const RTLIL::SigChunk &sigchunk) : data(sigchunk.data) +{ +	wire = sigchunk.wire; +	data = sigchunk.data; +	width = sigchunk.width; +	offset = sigchunk.offset; +} +  RTLIL::SigChunk RTLIL::SigChunk::extract(int offset, int length) const  {  	RTLIL::SigChunk ret; @@ -3367,7 +3456,7 @@ bool RTLIL::SigSpec::operator ==(const RTLIL::SigSpec &other) const  	pack();  	other.pack(); -	if (chunks_.size() != chunks_.size()) +	if (chunks_.size() != other.chunks_.size())  		return false;  	updhash(); @@ -3892,5 +3981,15 @@ RTLIL::Process *RTLIL::Process::clone() const  	return new_proc;  } +#ifdef WITH_PYTHON +RTLIL::Memory::~Memory() +{ +	RTLIL::Memory::get_all_memorys()->erase(hashidx_); +} +static std::map<unsigned int, RTLIL::Memory*> all_memorys; +std::map<unsigned int, RTLIL::Memory*> *RTLIL::Memory::get_all_memorys(void) +{ +	return &all_memorys; +} +#endif  YOSYS_NAMESPACE_END - diff --git a/kernel/rtlil.h b/kernel/rtlil.h index fb045bc72..db5c33c73 100644 --- a/kernel/rtlil.h +++ b/kernel/rtlil.h @@ -517,6 +517,7 @@ struct RTLIL::Const  	Const(RTLIL::State bit, int width = 1);  	Const(const std::vector<RTLIL::State> &bits) : bits(bits) { flags = CONST_FLAG_NONE; }  	Const(const std::vector<bool> &bits); +	Const(const RTLIL::Const &c);  	bool operator <(const RTLIL::Const &other) const;  	bool operator ==(const RTLIL::Const &other) const; @@ -566,9 +567,13 @@ struct RTLIL::AttrObject  {  	dict<RTLIL::IdString, RTLIL::Const> attributes; -	void set_bool_attribute(RTLIL::IdString id); +	void set_bool_attribute(RTLIL::IdString id, bool value=true);  	bool get_bool_attribute(RTLIL::IdString id) const; +	bool get_blackbox_attribute(bool ignore_wb=false) const { +		return get_bool_attribute("\\blackbox") || (!ignore_wb && get_bool_attribute("\\whitebox")); +	} +  	void set_strpool_attribute(RTLIL::IdString id, const pool<string> &data);  	void add_strpool_attribute(RTLIL::IdString id, const pool<string> &data);  	pool<string> get_strpool_attribute(RTLIL::IdString id) const; @@ -591,6 +596,7 @@ struct RTLIL::SigChunk  	SigChunk(int val, int width = 32);  	SigChunk(RTLIL::State bit, int width = 1);  	SigChunk(RTLIL::SigBit bit); +	SigChunk(const RTLIL::SigChunk &sigchunk);  	RTLIL::SigChunk extract(int offset, int length) const; @@ -615,6 +621,7 @@ struct RTLIL::SigBit  	SigBit(const RTLIL::SigChunk &chunk);  	SigBit(const RTLIL::SigChunk &chunk, int index);  	SigBit(const RTLIL::SigSpec &sig); +	SigBit(const RTLIL::SigBit &sigbit);  	bool operator <(const RTLIL::SigBit &other) const;  	bool operator ==(const RTLIL::SigBit &other) const; @@ -936,9 +943,13 @@ struct RTLIL::Design  		}  	} +  	std::vector<RTLIL::Module*> selected_modules() const;  	std::vector<RTLIL::Module*> selected_whole_modules() const;  	std::vector<RTLIL::Module*> selected_whole_modules_warn() const; +#ifdef WITH_PYTHON +	static std::map<unsigned int, RTLIL::Design*> *get_all_designs(void); +#endif  };  struct RTLIL::Module : public RTLIL::AttrObject @@ -1195,6 +1206,10 @@ public:  	RTLIL::SigSpec Allconst  (RTLIL::IdString name, int width = 1, const std::string &src = "");  	RTLIL::SigSpec Allseq    (RTLIL::IdString name, int width = 1, const std::string &src = "");  	RTLIL::SigSpec Initstate (RTLIL::IdString name, const std::string &src = ""); + +#ifdef WITH_PYTHON +	static std::map<unsigned int, RTLIL::Module*> *get_all_modules(void); +#endif  };  struct RTLIL::Wire : public RTLIL::AttrObject @@ -1206,7 +1221,7 @@ protected:  	// use module->addWire() and module->remove() to create or destroy wires  	friend struct RTLIL::Module;  	Wire(); -	~Wire() { }; +	~Wire();  public:  	// do not simply copy wires @@ -1217,6 +1232,10 @@ public:  	RTLIL::IdString name;  	int width, start_offset, port_id;  	bool port_input, port_output, upto; + +#ifdef WITH_PYTHON +	static std::map<unsigned int, RTLIL::Wire*> *get_all_wires(void); +#endif  };  struct RTLIL::Memory : public RTLIL::AttrObject @@ -1228,6 +1247,10 @@ struct RTLIL::Memory : public RTLIL::AttrObject  	RTLIL::IdString name;  	int width, start_offset, size; +#ifdef WITH_PYTHON +	~Memory(); +	static std::map<unsigned int, RTLIL::Memory*> *get_all_memorys(void); +#endif  };  struct RTLIL::Cell : public RTLIL::AttrObject @@ -1239,6 +1262,7 @@ protected:  	// use module->addCell() and module->remove() to create or destroy cells  	friend struct RTLIL::Module;  	Cell(); +	~Cell();  public:  	// do not simply copy cells @@ -1279,6 +1303,10 @@ public:  	}  	template<typename T> void rewrite_sigspecs(T &functor); + +#ifdef WITH_PYTHON +	static std::map<unsigned int, RTLIL::Cell*> *get_all_cells(void); +#endif  };  struct RTLIL::CaseRule @@ -1339,6 +1367,7 @@ inline RTLIL::SigBit::SigBit(RTLIL::Wire *wire) : wire(wire), offset(0) { log_as  inline RTLIL::SigBit::SigBit(RTLIL::Wire *wire, int offset) : wire(wire), offset(offset) { log_assert(wire != nullptr); }  inline RTLIL::SigBit::SigBit(const RTLIL::SigChunk &chunk) : wire(chunk.wire) { log_assert(chunk.width == 1); if (wire) offset = chunk.offset; else data = chunk.data[0]; }  inline RTLIL::SigBit::SigBit(const RTLIL::SigChunk &chunk, int index) : wire(chunk.wire) { if (wire) offset = chunk.offset + index; else data = chunk.data[index]; } +inline RTLIL::SigBit::SigBit(const RTLIL::SigBit &sigbit) : wire(sigbit.wire), data(sigbit.data){if(wire) offset = sigbit.offset;}  inline bool RTLIL::SigBit::operator<(const RTLIL::SigBit &other) const {  	if (wire == other.wire) diff --git a/kernel/yosys.cc b/kernel/yosys.cc index 450e4e4cf..20d972150 100644 --- a/kernel/yosys.cc +++ b/kernel/yosys.cc @@ -57,6 +57,16 @@  #  include <sys/sysctl.h>  #endif +#ifdef WITH_PYTHON +#if PY_MAJOR_VERSION >= 3 +#   define INIT_MODULE PyInit_libyosys +    extern "C" PyObject* INIT_MODULE(); +#else +#   define INIT_MODULE initlibyosys +	extern "C" void INIT_MODULE(); +#endif +#endif +  #include <limits.h>  #include <errno.h> @@ -472,26 +482,61 @@ void remove_directory(std::string dirname)  #endif  } +std::string escape_filename_spaces(const std::string& filename) +{ +	std::string out; +	out.reserve(filename.size()); +	for (auto c : filename) +	{ +		if (c == ' ') +			out += "\\ "; +		else +			out.push_back(c); +	} +	return out; +} +  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 +		PyImport_AppendInittab((char*)"libyosys", INIT_MODULE); +		Py_Initialize(); +		PyRun_SimpleString("import sys"); +	#endif +  	Pass::init_register();  	yosys_design = new RTLIL::Design;  	yosys_celltypes.setup();  	log_push();  } +bool yosys_already_setup() +{ +	return already_setup; +} + +bool already_shutdown = false; +  void yosys_shutdown()  { +	if(already_shutdown) +		return; +	already_shutdown = true;  	log_pop();  	delete yosys_design; @@ -519,9 +564,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_);  } diff --git a/kernel/yosys.h b/kernel/yosys.h index c9f973318..82eb069ab 100644 --- a/kernel/yosys.h +++ b/kernel/yosys.h @@ -66,6 +66,10 @@  #include <stdio.h>  #include <limits.h> +#ifdef WITH_PYTHON +#include <Python.h> +#endif +  #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 \ @@ -115,6 +119,7 @@ extern const char *Tcl_GetStringResult(Tcl_Interp *interp);  #  define PATH_MAX 4096  #endif +#define YOSYS_NAMESPACE          Yosys  #define PRIVATE_NAMESPACE_BEGIN  namespace {  #define PRIVATE_NAMESPACE_END    }  #define YOSYS_NAMESPACE_BEGIN    namespace Yosys { @@ -252,6 +257,7 @@ std::string make_temp_dir(std::string template_str = "/tmp/yosys_XXXXXX");  bool check_file_exists(std::string filename, bool is_exec = false);  bool is_absolute_path(std::string filename);  void remove_directory(std::string dirname); +std::string escape_filename_spaces(const std::string& filename);  template<typename T> int GetSize(const T &obj) { return obj.size(); }  int GetSize(RTLIL::Wire *wire); @@ -276,6 +282,11 @@ namespace hashlib {  }  void yosys_setup(); + +#ifdef WITH_PYTHON +bool yosys_already_setup(); +#endif +  void yosys_shutdown();  #ifdef YOSYS_ENABLE_TCL @@ -317,6 +328,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);  | 
