diff options
| author | Clifford Wolf <clifford@clifford.at> | 2016-03-08 16:54:15 +0100 | 
|---|---|---|
| committer | Clifford Wolf <clifford@clifford.at> | 2016-03-08 16:54:15 +0100 | 
| commit | dcd4fb998435b13193a9816e54d4c6b9284d119b (patch) | |
| tree | 584977ca50ec77473301f327e0eaa54f068430a2 | |
| parent | e7ed653771ab3483f988f4adfca5c635c10c3480 (diff) | |
| download | yosys-dcd4fb998435b13193a9816e54d4c6b9284d119b.tar.gz yosys-dcd4fb998435b13193a9816e54d4c6b9284d119b.tar.bz2 yosys-dcd4fb998435b13193a9816e54d4c6b9284d119b.zip  | |
Added examples/cxx-api/evaldemo.cc
| -rw-r--r-- | examples/cxx-api/evaldemo.cc | 55 | 
1 files changed, 55 insertions, 0 deletions
diff --git a/examples/cxx-api/evaldemo.cc b/examples/cxx-api/evaldemo.cc new file mode 100644 index 000000000..e5cc8d8e7 --- /dev/null +++ b/examples/cxx-api/evaldemo.cc @@ -0,0 +1,55 @@ +/* A simple Yosys plugin. (Copy&paste from http://stackoverflow.com/questions/32093541/how-does-the-yosys-consteval-api-work) + +Usage example: + +$ cat > evaldemo.v <<EOT +module main(input [1:0] A, input [7:0] B, C, D, output [7:0] Y); +  assign Y = A == 0 ? B : A == 1 ? C : A == 2 ? D : 42; +endmodule +EOT + +$ yosys-config --build evaldemo.so evaldemo.cc +$ yosys -m evaldemo.so -p evaldemo evaldemo.v +*/ + +#include "kernel/yosys.h" +#include "kernel/consteval.h" + +USING_YOSYS_NAMESPACE +PRIVATE_NAMESPACE_BEGIN + +struct EvalDemoPass : public Pass +{ +	EvalDemoPass() : Pass("evaldemo") { } + +	virtual void execute(vector<string>, Design *design) +	{ +		Module *module = design->top_module(); + +		if (module == nullptr) +			log_error("No top module found!\n"); + +		Wire *wire_a = module->wire("\\A"); +		Wire *wire_y = module->wire("\\Y"); + +		if (wire_a == nullptr) +			log_error("No wire A found!\n"); + +		if (wire_y == nullptr) +			log_error("No wire Y found!\n"); + +		ConstEval ce(module); +		for (int v = 0; v < 4; v++) { +			ce.push(); +			ce.set(wire_a, Const(v, GetSize(wire_a))); +			SigSpec sig_y = wire_y, sig_undef; +			if (ce.eval(sig_y, sig_undef)) +				log("Eval results for A=%d: Y=%s\n", v, log_signal(sig_y)); +			else +				log("Eval failed for A=%d: Missing value for %s\n", v, log_signal(sig_undef)); +			ce.pop(); +		} +	} +} EvalDemoPass; + +PRIVATE_NAMESPACE_END  | 
