mirror of https://github.com/YosysHQ/yosys.git
Merge pull request #2006 from jersey99/signed-in-rtlil-wire
Preserve 'signed'-ness of a verilog wire through RTLIL
This commit is contained in:
commit
3bffd09d64
|
@ -131,6 +131,8 @@ void ILANG_BACKEND::dump_wire(std::ostream &f, std::string indent, const RTLIL::
|
||||||
f << stringf("output %d ", wire->port_id);
|
f << stringf("output %d ", wire->port_id);
|
||||||
if (wire->port_input && wire->port_output)
|
if (wire->port_input && wire->port_output)
|
||||||
f << stringf("inout %d ", wire->port_id);
|
f << stringf("inout %d ", wire->port_id);
|
||||||
|
if (wire->is_signed)
|
||||||
|
f << stringf("signed ");
|
||||||
f << stringf("%s\n", wire->name.c_str());
|
f << stringf("%s\n", wire->name.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -160,6 +160,8 @@ struct JsonWriter
|
||||||
f << stringf(" \"offset\": %d,\n", w->start_offset);
|
f << stringf(" \"offset\": %d,\n", w->start_offset);
|
||||||
if (w->upto)
|
if (w->upto)
|
||||||
f << stringf(" \"upto\": 1,\n");
|
f << stringf(" \"upto\": 1,\n");
|
||||||
|
if (w->is_signed)
|
||||||
|
f << stringf(" \"signed\": %d,\n", w->is_signed);
|
||||||
f << stringf(" \"bits\": %s\n", get_bits(w).c_str());
|
f << stringf(" \"bits\": %s\n", get_bits(w).c_str());
|
||||||
f << stringf(" }");
|
f << stringf(" }");
|
||||||
first = false;
|
first = false;
|
||||||
|
@ -227,6 +229,8 @@ struct JsonWriter
|
||||||
f << stringf(" \"offset\": %d,\n", w->start_offset);
|
f << stringf(" \"offset\": %d,\n", w->start_offset);
|
||||||
if (w->upto)
|
if (w->upto)
|
||||||
f << stringf(" \"upto\": 1,\n");
|
f << stringf(" \"upto\": 1,\n");
|
||||||
|
if (w->is_signed)
|
||||||
|
f << stringf(" \"signed\": %d,\n", w->is_signed);
|
||||||
f << stringf(" \"attributes\": {");
|
f << stringf(" \"attributes\": {");
|
||||||
write_parameters(w->attributes);
|
write_parameters(w->attributes);
|
||||||
f << stringf("\n }\n");
|
f << stringf("\n }\n");
|
||||||
|
|
|
@ -1065,6 +1065,7 @@ RTLIL::SigSpec AstNode::genRTLIL(int width_hint, bool sign_hint)
|
||||||
wire->port_input = is_input;
|
wire->port_input = is_input;
|
||||||
wire->port_output = is_output;
|
wire->port_output = is_output;
|
||||||
wire->upto = range_swapped;
|
wire->upto = range_swapped;
|
||||||
|
wire->is_signed = is_signed;
|
||||||
|
|
||||||
for (auto &attr : attributes) {
|
for (auto &attr : attributes) {
|
||||||
if (attr.second->type != AST_CONSTANT)
|
if (attr.second->type != AST_CONSTANT)
|
||||||
|
|
|
@ -192,6 +192,9 @@ wire_options:
|
||||||
wire_options TOK_UPTO {
|
wire_options TOK_UPTO {
|
||||||
current_wire->upto = true;
|
current_wire->upto = true;
|
||||||
} |
|
} |
|
||||||
|
wire_options TOK_SIGNED {
|
||||||
|
current_wire->is_signed = true;
|
||||||
|
} |
|
||||||
wire_options TOK_OFFSET TOK_INT {
|
wire_options TOK_OFFSET TOK_INT {
|
||||||
current_wire->start_offset = $3;
|
current_wire->start_offset = $3;
|
||||||
} |
|
} |
|
||||||
|
|
|
@ -309,6 +309,12 @@ void json_import(Design *design, string &modname, JsonNode *node)
|
||||||
port_wire->upto = val->data_number != 0;
|
port_wire->upto = val->data_number != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (port_node->data_dict.count("signed") != 0) {
|
||||||
|
JsonNode *val = port_node->data_dict.at("signed");
|
||||||
|
if (val->type == 'N')
|
||||||
|
port_wire->is_signed = val->data_number != 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (port_node->data_dict.count("offset") != 0) {
|
if (port_node->data_dict.count("offset") != 0) {
|
||||||
JsonNode *val = port_node->data_dict.at("offset");
|
JsonNode *val = port_node->data_dict.at("offset");
|
||||||
if (val->type == 'N')
|
if (val->type == 'N')
|
||||||
|
@ -573,4 +579,3 @@ struct JsonFrontend : public Frontend {
|
||||||
} JsonFrontend;
|
} JsonFrontend;
|
||||||
|
|
||||||
YOSYS_NAMESPACE_END
|
YOSYS_NAMESPACE_END
|
||||||
|
|
||||||
|
|
|
@ -1862,6 +1862,7 @@ RTLIL::Wire *RTLIL::Module::addWire(RTLIL::IdString name, const RTLIL::Wire *oth
|
||||||
wire->port_input = other->port_input;
|
wire->port_input = other->port_input;
|
||||||
wire->port_output = other->port_output;
|
wire->port_output = other->port_output;
|
||||||
wire->upto = other->upto;
|
wire->upto = other->upto;
|
||||||
|
wire->is_signed = other->is_signed;
|
||||||
wire->attributes = other->attributes;
|
wire->attributes = other->attributes;
|
||||||
return wire;
|
return wire;
|
||||||
}
|
}
|
||||||
|
@ -2447,6 +2448,7 @@ RTLIL::Wire::Wire()
|
||||||
port_input = false;
|
port_input = false;
|
||||||
port_output = false;
|
port_output = false;
|
||||||
upto = false;
|
upto = false;
|
||||||
|
is_signed = false;
|
||||||
|
|
||||||
#ifdef WITH_PYTHON
|
#ifdef WITH_PYTHON
|
||||||
RTLIL::Wire::get_all_wires()->insert(std::pair<unsigned int, RTLIL::Wire*>(hashidx_, this));
|
RTLIL::Wire::get_all_wires()->insert(std::pair<unsigned int, RTLIL::Wire*>(hashidx_, this));
|
||||||
|
|
|
@ -1368,7 +1368,7 @@ public:
|
||||||
RTLIL::Module *module;
|
RTLIL::Module *module;
|
||||||
RTLIL::IdString name;
|
RTLIL::IdString name;
|
||||||
int width, start_offset, port_id;
|
int width, start_offset, port_id;
|
||||||
bool port_input, port_output, upto;
|
bool port_input, port_output, upto, is_signed;
|
||||||
|
|
||||||
#ifdef WITH_PYTHON
|
#ifdef WITH_PYTHON
|
||||||
static std::map<unsigned int, RTLIL::Wire*> *get_all_wires(void);
|
static std::map<unsigned int, RTLIL::Wire*> *get_all_wires(void);
|
||||||
|
|
Loading…
Reference in New Issue