hdl.ast: implement abs() on values.

This commit is contained in:
whitequark 2020-03-22 20:50:07 +00:00
parent a0d279850e
commit 2d1e12d00c
2 changed files with 14 additions and 0 deletions

View file

@ -220,6 +220,13 @@ class Value(metaclass=ABCMeta):
def __ge__(self, other): def __ge__(self, other):
return Operator(">=", [self, other]) return Operator(">=", [self, other])
def __abs__(self):
width, signed = self.shape()
if signed:
return Mux(self >= 0, self, -self)
else:
return self
def __len__(self): def __len__(self):
return self.shape().width return self.shape().width

View file

@ -180,6 +180,13 @@ class SimulatorUnitTestCase(FHDLTestCase):
self.assertStatement(stmt, [C(2, 4), C(3, 4), C(0)], C(3, 4)) self.assertStatement(stmt, [C(2, 4), C(3, 4), C(0)], C(3, 4))
self.assertStatement(stmt, [C(2, 4), C(3, 4), C(1)], C(2, 4)) self.assertStatement(stmt, [C(2, 4), C(3, 4), C(1)], C(2, 4))
def test_abs(self):
stmt = lambda y, a: y.eq(abs(a))
self.assertStatement(stmt, [C(3, unsigned(8))], C(3, unsigned(8)))
self.assertStatement(stmt, [C(-3, unsigned(8))], C(-3, unsigned(8)))
self.assertStatement(stmt, [C(3, signed(8))], C(3, signed(8)))
self.assertStatement(stmt, [C(-3, signed(8))], C(3, signed(8)))
def test_slice(self): def test_slice(self):
stmt1 = lambda y, a: y.eq(a[2]) stmt1 = lambda y, a: y.eq(a[2])
self.assertStatement(stmt1, [C(0b10110100, 8)], C(0b1, 1)) self.assertStatement(stmt1, [C(0b10110100, 8)], C(0b1, 1))