mirror of https://github.com/YosysHQ/yosys.git
Merge pull request #3389 from uwsampl/support-parameter-default-values-in-json-frontend-and-verilog-backend
Support parameter default values in JSON frontend and Verilog backend
This commit is contained in:
commit
9b9e7b5ae3
|
|
@ -95,7 +95,8 @@ bool VERILOG_BACKEND::id_is_verilog_escaped(const std::string &str) {
|
||||||
|
|
||||||
PRIVATE_NAMESPACE_BEGIN
|
PRIVATE_NAMESPACE_BEGIN
|
||||||
|
|
||||||
bool verbose, norename, noattr, attr2comment, noexpr, nodec, nohex, nostr, extmem, defparam, decimal, siminit, systemverilog, simple_lhs, noparallelcase;
|
bool verbose, norename, noattr, attr2comment, noexpr, nodec, nohex, nostr, extmem, defparam, decimal, siminit, systemverilog, simple_lhs,
|
||||||
|
noparallelcase, default_params;
|
||||||
int auto_name_counter, auto_name_offset, auto_name_digits, extmem_counter;
|
int auto_name_counter, auto_name_offset, auto_name_digits, extmem_counter;
|
||||||
dict<RTLIL::IdString, int> auto_name_map;
|
dict<RTLIL::IdString, int> auto_name_map;
|
||||||
std::set<RTLIL::IdString> reg_wires;
|
std::set<RTLIL::IdString> reg_wires;
|
||||||
|
|
@ -421,6 +422,13 @@ void dump_attributes(std::ostream &f, std::string indent, dict<RTLIL::IdString,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void dump_parameter(std::ostream &f, std::string indent, RTLIL::IdString id_string, RTLIL::Const parameter)
|
||||||
|
{
|
||||||
|
f << stringf("%sparameter %s = ", indent.c_str(), id(id_string).c_str());
|
||||||
|
dump_const(f, parameter);
|
||||||
|
f << ";\n";
|
||||||
|
}
|
||||||
|
|
||||||
void dump_wire(std::ostream &f, std::string indent, RTLIL::Wire *wire)
|
void dump_wire(std::ostream &f, std::string indent, RTLIL::Wire *wire)
|
||||||
{
|
{
|
||||||
dump_attributes(f, indent, wire->attributes, "\n", /*modattr=*/false, /*regattr=*/reg_wires.count(wire->name));
|
dump_attributes(f, indent, wire->attributes, "\n", /*modattr=*/false, /*regattr=*/reg_wires.count(wire->name));
|
||||||
|
|
@ -2438,6 +2446,10 @@ void dump_module(std::ostream &f, std::string indent, RTLIL::Module *module)
|
||||||
f << indent + " " << "reg " << id(initial_id) << " = 0;\n";
|
f << indent + " " << "reg " << id(initial_id) << " = 0;\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (default_params)
|
||||||
|
for (auto p : module->parameter_default_values)
|
||||||
|
dump_parameter(f, indent + " ", p.first, p.second);
|
||||||
|
|
||||||
// first dump input / output according to their order in module->ports
|
// first dump input / output according to their order in module->ports
|
||||||
for (auto port : module->ports)
|
for (auto port : module->ports)
|
||||||
dump_wire(f, indent + " ", module->wire(port));
|
dump_wire(f, indent + " ", module->wire(port));
|
||||||
|
|
@ -2545,6 +2557,10 @@ struct VerilogBackend : public Backend {
|
||||||
log(" use 'defparam' statements instead of the Verilog-2001 syntax for\n");
|
log(" use 'defparam' statements instead of the Verilog-2001 syntax for\n");
|
||||||
log(" cell parameters.\n");
|
log(" cell parameters.\n");
|
||||||
log("\n");
|
log("\n");
|
||||||
|
log(" -default_params\n");
|
||||||
|
log(" emit module parameter declarations from\n");
|
||||||
|
log(" parameter_default_values.\n");
|
||||||
|
log("\n");
|
||||||
log(" -blackboxes\n");
|
log(" -blackboxes\n");
|
||||||
log(" usually modules with the 'blackbox' attribute are ignored. with\n");
|
log(" usually modules with the 'blackbox' attribute are ignored. with\n");
|
||||||
log(" this option set only the modules with the 'blackbox' attribute\n");
|
log(" this option set only the modules with the 'blackbox' attribute\n");
|
||||||
|
|
@ -2582,6 +2598,7 @@ struct VerilogBackend : public Backend {
|
||||||
siminit = false;
|
siminit = false;
|
||||||
simple_lhs = false;
|
simple_lhs = false;
|
||||||
noparallelcase = false;
|
noparallelcase = false;
|
||||||
|
default_params = false;
|
||||||
auto_prefix = "";
|
auto_prefix = "";
|
||||||
|
|
||||||
bool blackboxes = false;
|
bool blackboxes = false;
|
||||||
|
|
@ -2642,6 +2659,10 @@ struct VerilogBackend : public Backend {
|
||||||
defparam = true;
|
defparam = true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (arg == "-defaultparams") {
|
||||||
|
default_params = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (arg == "-decimal") {
|
if (arg == "-decimal") {
|
||||||
decimal = true;
|
decimal = true;
|
||||||
continue;
|
continue;
|
||||||
|
|
|
||||||
|
|
@ -302,6 +302,9 @@ void json_import(Design *design, string &modname, JsonNode *node)
|
||||||
if (node->data_dict.count("attributes"))
|
if (node->data_dict.count("attributes"))
|
||||||
json_parse_attr_param(module->attributes, node->data_dict.at("attributes"));
|
json_parse_attr_param(module->attributes, node->data_dict.at("attributes"));
|
||||||
|
|
||||||
|
if (node->data_dict.count("parameter_default_values"))
|
||||||
|
json_parse_attr_param(module->parameter_default_values, node->data_dict.at("parameter_default_values"));
|
||||||
|
|
||||||
dict<int, SigBit> signal_bits;
|
dict<int, SigBit> signal_bits;
|
||||||
|
|
||||||
if (node->data_dict.count("ports"))
|
if (node->data_dict.count("ports"))
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
module json_param_defaults #(
|
||||||
|
parameter WIDTH = 8,
|
||||||
|
parameter SIGNED = 1
|
||||||
|
) (
|
||||||
|
input [WIDTH-1:0] a,
|
||||||
|
output [WIDTH-1:0] y
|
||||||
|
);
|
||||||
|
wire [WIDTH-1:0] y_int = a << SIGNED;
|
||||||
|
assign y = y_int;
|
||||||
|
endmodule
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
! mkdir -p temp
|
||||||
|
read_verilog -sv json_param_defaults.v
|
||||||
|
write_json temp/json_param_defaults.json
|
||||||
|
design -reset
|
||||||
|
read_json temp/json_param_defaults.json
|
||||||
|
write_verilog -noattr -defaultparams temp/json_param_defaults.v
|
||||||
|
! grep -qF "parameter WIDTH = 32'd8" temp/json_param_defaults.v
|
||||||
|
! grep -qF "parameter SIGNED = 32'd1" temp/json_param_defaults.v
|
||||||
Loading…
Reference in New Issue