diff options
author | Zachary Snow <zach@zachjs.com> | 2020-12-18 12:59:08 -0700 |
---|---|---|
committer | Zachary Snow <zach@zachjs.com> | 2020-12-18 20:33:14 -0700 |
commit | 0d8e5d965f2585e6ed151a9e92d83ee63df6172a (patch) | |
tree | f2da85bd5aaf90406d3536b64749837d44003eab /passes/techmap | |
parent | 40e35993af6ecb6207f15cc176455ff8d66bcc69 (diff) | |
download | yosys-0d8e5d965f2585e6ed151a9e92d83ee63df6172a.tar.gz yosys-0d8e5d965f2585e6ed151a9e92d83ee63df6172a.tar.bz2 yosys-0d8e5d965f2585e6ed151a9e92d83ee63df6172a.zip |
Sign extend port connections where necessary
- Signed cell outputs are sign extended when bound to larger wires
- Signed connections are sign extended when bound to larger cell inputs
- Sign extension is performed in hierarchy and flatten phases
- genrtlil indirects signed constants through signed wires
- Other phases producing RTLIL may need to be updated to preserve
signedness information
- Resolves #1418
- Resolves #2265
Diffstat (limited to 'passes/techmap')
-rw-r--r-- | passes/techmap/flatten.cc | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/passes/techmap/flatten.cc b/passes/techmap/flatten.cc index 08978f446..ec5f83fb0 100644 --- a/passes/techmap/flatten.cc +++ b/passes/techmap/flatten.cc @@ -180,12 +180,15 @@ struct FlattenWorker RTLIL::Wire *tpl_wire = tpl->wire(port_name); RTLIL::SigSig new_conn; + bool is_signed = false; if (tpl_wire->port_output && !tpl_wire->port_input) { new_conn.first = port_it.second; new_conn.second = tpl_wire; + is_signed = tpl_wire->is_signed; } else if (!tpl_wire->port_output && tpl_wire->port_input) { new_conn.first = tpl_wire; new_conn.second = port_it.second; + is_signed = new_conn.second.is_wire() && new_conn.second.as_wire()->is_signed; } else { SigSpec sig_tpl = tpl_wire, sig_mod = port_it.second; for (int i = 0; i < GetSize(sig_tpl) && i < GetSize(sig_mod); i++) { @@ -204,7 +207,7 @@ struct FlattenWorker if (new_conn.second.size() > new_conn.first.size()) new_conn.second.remove(new_conn.first.size(), new_conn.second.size() - new_conn.first.size()); if (new_conn.second.size() < new_conn.first.size()) - new_conn.second.append(RTLIL::SigSpec(RTLIL::State::S0, new_conn.first.size() - new_conn.second.size())); + new_conn.second.extend_u0(new_conn.first.size(), is_signed); log_assert(new_conn.first.size() == new_conn.second.size()); if (sigmap(new_conn.first).has_const()) |