Skip to content

Commit 188eb8d

Browse files
wanda-phiwhitequark
authored andcommitted
back.rtlil: emit wire signedness according to Signal signedness.
1 parent 6058ad3 commit 188eb8d

File tree

1 file changed

+12
-5
lines changed

1 file changed

+12
-5
lines changed

amaranth/back/rtlil.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ def __exit__(self, *args):
128128
self._append("end\n")
129129
self.rtlil._buffer.write(str(self))
130130

131-
def wire(self, width, port_id=None, port_kind=None, name=None, attrs={}, src=""):
131+
def wire(self, width, port_id=None, port_kind=None, name=None, attrs={}, src="", signed=False):
132132
# Very large wires are unlikely to work. Verilog 1364-2005 requires the limit on vectors
133133
# to be at least 2**16 bits, and Yosys 0.9 cannot read RTLIL with wires larger than 2**32
134134
# bits. In practice, wires larger than 2**16 bits, although accepted, cause performance
@@ -140,14 +140,15 @@ def wire(self, width, port_id=None, port_kind=None, name=None, attrs={}, src="")
140140

141141
self._attributes(attrs, src=src, indent=1)
142142
name = self._make_name(name, local=False)
143+
signed = " signed" if signed else ""
143144
if port_id is None:
144-
self._append(" wire width {} {}\n", width, name)
145+
self._append(" wire width {}{} {}\n", width, signed, name)
145146
else:
146147
assert port_kind in ("input", "output", "inout")
147148
# By convention, Yosys ports named $\d+ are positional, so there is no way to use
148149
# a port with such a name. See amaranth-lang/amaranth#733.
149150
assert port_id is not None
150-
self._append(" wire width {} {} {} {}\n", width, port_kind, port_id, name)
151+
self._append(" wire width {} {} {}{} {}\n", width, port_kind, port_id, signed, name)
151152
return name
152153

153154
def connect(self, lhs, rhs):
@@ -383,14 +384,20 @@ def emit_signal_wires(self):
383384
assert value == port_value
384385
self.name_map[signal] = (*self.module.name, f"\\{name}")
385386
else:
386-
wire = self.builder.wire(width=signal.width, name=name, attrs=attrs,
387+
wire = self.builder.wire(width=signal.width, signed=signal.signed,
388+
name=name, attrs=attrs,
387389
src=_src(signal.src_loc))
388390
self.sigport_wires[name] = (wire, value)
389391
self.name_map[signal] = (*self.module.name, wire)
390392

391393
def emit_port_wires(self):
394+
named_signals = {name: signal for signal, name in self.module.signal_names.items()}
392395
for port_id, (name, (value, flow)) in enumerate(self.module.ports.items()):
393-
wire = self.builder.wire(width=len(value), port_id=port_id, port_kind=flow.value,
396+
signed = False
397+
if name in named_signals:
398+
signed = named_signals[name].signed
399+
wire = self.builder.wire(width=len(value), signed=signed,
400+
port_id=port_id, port_kind=flow.value,
394401
name=name, attrs=self.value_attrs.get(value, {}))
395402
self.sigport_wires[name] = (wire, value)
396403
if flow == _nir.ModuleNetFlow.OUTPUT:

0 commit comments

Comments
 (0)