@@ -128,7 +128,7 @@ def __exit__(self, *args):
128
128
self ._append ("end\n " )
129
129
self .rtlil ._buffer .write (str (self ))
130
130
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 ):
132
132
# Very large wires are unlikely to work. Verilog 1364-2005 requires the limit on vectors
133
133
# to be at least 2**16 bits, and Yosys 0.9 cannot read RTLIL with wires larger than 2**32
134
134
# 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="")
140
140
141
141
self ._attributes (attrs , src = src , indent = 1 )
142
142
name = self ._make_name (name , local = False )
143
+ signed = " signed" if signed else ""
143
144
if port_id is None :
144
- self ._append (" wire width {} {}\n " , width , name )
145
+ self ._append (" wire width {}{} {}\n " , width , signed , name )
145
146
else :
146
147
assert port_kind in ("input" , "output" , "inout" )
147
148
# By convention, Yosys ports named $\d+ are positional, so there is no way to use
148
149
# a port with such a name. See amaranth-lang/amaranth#733.
149
150
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 )
151
152
return name
152
153
153
154
def connect (self , lhs , rhs ):
@@ -383,14 +384,20 @@ def emit_signal_wires(self):
383
384
assert value == port_value
384
385
self .name_map [signal ] = (* self .module .name , f"\\ { name } " )
385
386
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 ,
387
389
src = _src (signal .src_loc ))
388
390
self .sigport_wires [name ] = (wire , value )
389
391
self .name_map [signal ] = (* self .module .name , wire )
390
392
391
393
def emit_port_wires (self ):
394
+ named_signals = {name : signal for signal , name in self .module .signal_names .items ()}
392
395
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 ,
394
401
name = name , attrs = self .value_attrs .get (value , {}))
395
402
self .sigport_wires [name ] = (wire , value )
396
403
if flow == _nir .ModuleNetFlow .OUTPUT :
0 commit comments