diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/yosys.cc | 47 | 
1 files changed, 39 insertions, 8 deletions
diff --git a/kernel/yosys.cc b/kernel/yosys.cc index 94d6d675f..f95c0127b 100644 --- a/kernel/yosys.cc +++ b/kernel/yosys.cc @@ -1254,24 +1254,55 @@ struct HistoryPass : public Pass {  #endif  struct ScriptCmdPass : public Pass { -	ScriptCmdPass() : Pass("script", "execute commands from script file") { } +	ScriptCmdPass() : Pass("script", "execute commands from file or wire") { }  	void help() YS_OVERRIDE { +		//   |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|  		log("\n");  		log("    script <filename> [<from_label>:<to_label>]\n"); +		log("    script -scriptwire [selection]\n");  		log("\n"); -		log("This command executes the yosys commands in the specified file.\n"); +		log("This command executes the yosys commands in the specified file (default\n"); +		log("behaviour), or commands embedded in the constant text value connected to the\n"); +		log("selected wires.\n");  		log("\n"); -		log("The 2nd argument can be used to only execute the section of the\n"); -		log("file between the specified labels. An empty from label is synonymous\n"); -		log("for the beginning of the file and an empty to label is synonymous\n"); -		log("for the end of the file.\n"); +		log("In the default (file) case, the 2nd argument can be used to only execute the\n"); +		log("section of the file between the specified labels. An empty from label is\n"); +		log("synonymous with the beginning of the file and an empty to label is synonymous\n"); +		log("with the end of the file.\n");  		log("\n");  		log("If only one label is specified (without ':') then only the block\n");  		log("marked with that label (until the next label) is executed.\n");  		log("\n");  	} -	void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE { -		if (args.size() < 2) +	void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE +	{ +		bool scriptwire = false; + +		size_t argidx; +		for (argidx = 1; argidx < args.size(); argidx++) { +			if (args[argidx] == "-scriptwire") { +				scriptwire = true; +				continue; +			} +			break; +		} +		if (scriptwire) { +			extra_args(args, argidx, design); + +			for (auto mod : design->selected_modules()) +				for (auto &c : mod->connections()) { +					if (!c.first.is_wire()) +						continue; +					auto w = c.first.as_wire(); +					if (!mod->selected(w)) +						continue; +					if (!c.second.is_fully_const()) +						log_error("RHS of selected wire %s.%s is not constant.\n", log_id(mod), log_id(w)); +					auto v = c.second.as_const(); +					Pass::call_on_module(design, mod, v.decode_string()); +				} +		} +		else if (args.size() < 2)  			log_cmd_error("Missing script file.\n");  		else if (args.size() == 2)  			run_frontend(args[1], "script", design);  | 
