Skip to content

Commit 08bc136

Browse files
committed
Merge branch 'feature_complement2_abs_sign' into develop
2 parents b2f80c5 + 053f53f commit 08bc136

File tree

2 files changed

+111
-1
lines changed

2 files changed

+111
-1
lines changed

veriloggen/core/vtypes.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,9 @@ def __pos__(self):
283283
def __invert__(self):
284284
raise TypeError('Not allowed operation.')
285285

286+
def __abs__(self):
287+
raise TypeError('Not allowed operation.')
288+
286289
def __getitem__(self, r):
287290
raise TypeError('Not allowed operation.')
288291

@@ -361,6 +364,9 @@ def __pos__(self):
361364
def __invert__(self):
362365
return Unot(self)
363366

367+
def __abs__(self):
368+
return Abs(self)
369+
364370
def __getitem__(self, r):
365371
if isinstance(r, slice):
366372
size = self._len()
@@ -1745,6 +1751,24 @@ def Mux(condition, true_value, false_value):
17451751
return Cond(condition, true_value, false_value)
17461752

17471753

1754+
def Complement2(var):
1755+
if isinstance(var, (int, bool, float)):
1756+
return abs(var)
1757+
1758+
return Unot(var) + Int(1)
1759+
1760+
1761+
def Abs(var):
1762+
return Mux(Sign(var), Complement2(var), var)
1763+
1764+
1765+
def Sign(var):
1766+
if isinstance(var, (int, bool, float)):
1767+
return var < 0
1768+
1769+
return var < Int(0, signed=True)
1770+
1771+
17481772
class Sensitive(VeriloggenNode):
17491773

17501774
def __init__(self, name):

veriloggen/stream/stypes.py

Lines changed: 87 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,9 @@ def __neg__(self):
346346
def __pos__(self):
347347
return Uplus(self)
348348

349+
def __abs__(self):
350+
return Abs(self)
351+
349352
def __getitem__(self, r):
350353
if isinstance(r, slice):
351354
size = self.bit_length()
@@ -1134,7 +1137,12 @@ def eval(self):
11341137
class Unot(_UnaryLogicalOperator):
11351138

11361139
def eval(self):
1137-
return ~ self.right.eval()
1140+
right = self.right.eval()
1141+
try:
1142+
v = ~right
1143+
except:
1144+
v = Ulnot(right)
1145+
return v
11381146

11391147

11401148
class Uand(_UnaryLogicalOperator):
@@ -1322,6 +1330,9 @@ def _implement(self, m, seq, svalid=None, senable=None):
13221330

13231331
m.Assign(data(rdata))
13241332

1333+
def eval(self):
1334+
return self
1335+
13251336

13261337
class _SpecialOperator(_Operator):
13271338
latency = 1
@@ -1668,6 +1679,81 @@ def _implement(self, m, seq, svalid=None, senable=None):
16681679
m.Instance(inst, self.name('lut'), ports=ports)
16691680

16701681

1682+
class Complement2(_SpecialOperator):
1683+
1684+
def __init__(self, var):
1685+
_SpecialOperator.__init__(self, var)
1686+
self.op = vtypes.Complement2
1687+
1688+
def _set_attributes(self):
1689+
self.width = self.var.bit_length()
1690+
self.point = self.var.get_point()
1691+
self.signed = self.var.get_signed()
1692+
1693+
@property
1694+
def var(self):
1695+
return self.args[0]
1696+
1697+
@var.setter
1698+
def var(self, var):
1699+
self.args[0] = var
1700+
1701+
def eval(self):
1702+
var = self.var.eval()
1703+
ret = Complement2(var)
1704+
return ret
1705+
1706+
1707+
class Abs(_SpecialOperator):
1708+
1709+
def __init__(self, var):
1710+
_SpecialOperator.__init__(self, var)
1711+
self.op = vtypes.Abs
1712+
1713+
def _set_attributes(self):
1714+
self.width = self.var.bit_length()
1715+
self.point = self.var.get_point()
1716+
self.signed = self.var.get_signed()
1717+
1718+
@property
1719+
def var(self):
1720+
return self.args[0]
1721+
1722+
@var.setter
1723+
def var(self, var):
1724+
self.args[0] = var
1725+
1726+
def eval(self):
1727+
var = self.var.eval()
1728+
ret = abs(var)
1729+
return ret
1730+
1731+
1732+
class Sign(_SpecialOperator):
1733+
1734+
def __init__(self, var):
1735+
_SpecialOperator.__init__(self, var)
1736+
self.op = vtypes.Sign
1737+
1738+
def _set_attributes(self):
1739+
self.width = self.var.bit_length()
1740+
self.point = self.var.get_point()
1741+
self.signed = self.var.get_signed()
1742+
1743+
@property
1744+
def var(self):
1745+
return self.args[0]
1746+
1747+
@var.setter
1748+
def var(self, var):
1749+
self.args[0] = var
1750+
1751+
def eval(self):
1752+
var = self.var.eval()
1753+
ret = Sign(var)
1754+
return ret
1755+
1756+
16711757
class _Delay(_UnaryOperator):
16721758

16731759
def __init__(self, right):

0 commit comments

Comments
 (0)