fhdl.ast.Signal: implement attrs field.

This commit is contained in:
whitequark 2018-12-12 11:02:13 +00:00
parent c05c189ece
commit aab01d9e59
3 changed files with 18 additions and 3 deletions

View file

@ -62,6 +62,12 @@ class _ModuleBuilder(_Namer, _Bufferer):
self._append("end\n") self._append("end\n")
self.rtlil._buffer.write(str(self)) self.rtlil._buffer.write(str(self))
def attribute(self, name, value):
if isinstance(value, str):
self._append("attribute \\{} \"{}\"\n", name, value.replace("\"", "\\\""))
else:
self._append("attribute \\{} {}\n", name, int(value))
def wire(self, width, port_id=None, port_kind=None, name=None, src=""): def wire(self, width, port_id=None, port_kind=None, name=None, src=""):
self._src(src) self._src(src)
name = self._make_name(name, local=False) name = self._make_name(name, local=False)
@ -260,6 +266,8 @@ class _ValueTransformer(xfrm.ValueTransformer):
wire_name = "{}_{}".format(self.sub_name, node.name) wire_name = "{}_{}".format(self.sub_name, node.name)
else: else:
wire_name = node.name wire_name = node.name
for attr_name, attr_value in node.attrs.items():
self.rtlil.attribute(attr_name, attr_value)
wire_curr = self.rtlil.wire(width=node.nbits, name=wire_name, wire_curr = self.rtlil.wire(width=node.nbits, name=wire_name,
port_id=port_id, port_kind=port_kind) port_id=port_id, port_kind=port_kind)
if node in self.driven: if node in self.driven:

View file

@ -502,6 +502,8 @@ class Signal(Value, DUID):
If `bits_sign` is `None`, the signal bit width and signedness are If `bits_sign` is `None`, the signal bit width and signedness are
determined by the integer range given by `min` (inclusive, determined by the integer range given by `min` (inclusive,
defaults to 0) and `max` (exclusive, defaults to 2). defaults to 0) and `max` (exclusive, defaults to 2).
attrs : dict
Dictionary of synthesis attributes.
Attributes Attributes
---------- ----------
@ -509,9 +511,12 @@ class Signal(Value, DUID):
signed : bool signed : bool
name : str name : str
reset : int reset : int
reset_less : bool
attrs : dict
""" """
def __init__(self, bits_sign=None, name=None, reset=0, reset_less=False, min=None, max=None): def __init__(self, bits_sign=None, name=None, reset=0, reset_less=False, min=None, max=None,
attrs=None):
super().__init__() super().__init__()
if name is None: if name is None:
@ -546,6 +551,8 @@ class Signal(Value, DUID):
self.reset = reset self.reset = reset
self.reset_less = reset_less self.reset_less = reset_less
self.attrs = OrderedDict(() if attrs is None else attrs)
def bits_sign(self): def bits_sign(self):
return self.nbits, self.signed return self.nbits, self.signed

View file

@ -4,14 +4,14 @@ from ..fhdl import *
__all__ = ["MultiReg"] __all__ = ["MultiReg"]
class MultiReg(Module): class MultiReg:
def __init__(self, i, o, odomain="sys", n=2, reset=0): def __init__(self, i, o, odomain="sys", n=2, reset=0):
self.i = i self.i = i
self.o = o self.o = o
self.odomain = odomain self.odomain = odomain
self._regs = [Signal(self.i.bits_sign(), name="cdc{}".format(i), self._regs = [Signal(self.i.bits_sign(), name="cdc{}".format(i),
reset=reset, reset_less=True)#, attrs=("no_retiming",)) reset=reset, reset_less=True, attrs={"no_retiming": True})
for i in range(n)] for i in range(n)]
def get_fragment(self, platform): def get_fragment(self, platform):