Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: m-labs/nmigen
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 07e9cfa9399b
Choose a base ref
...
head repository: m-labs/nmigen
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: a90748303c73
Choose a head ref
  • 3 commits
  • 8 files changed
  • 1 contributor

Commits on Dec 18, 2018

  1. back.pysim: implement *.

    whitequark committed Dec 18, 2018
    Copy the full SHA
    4199674 View commit details
  2. hdl.ast: Cat.{operands→parts}

    whitequark committed Dec 18, 2018
    Copy the full SHA
    dbbcc49 View commit details
  3. Copy the full SHA
    a907483 View commit details
Showing with 60 additions and 20 deletions.
  1. +1 −1 doc/COMPAT_SUMMARY.md
  2. +4 −2 nmigen/back/pysim.py
  3. +24 −2 nmigen/compat/fhdl/structure.py
  4. +5 −5 nmigen/hdl/ast.py
  5. +1 −1 nmigen/hdl/xfrm.py
  6. +9 −9 nmigen/test/test_hdl_ast.py
  7. +6 −0 nmigen/test/test_sim.py
  8. +10 −0 nmigen/tools.py
2 changes: 1 addition & 1 deletion doc/COMPAT_SUMMARY.md
Original file line number Diff line number Diff line change
@@ -66,7 +66,7 @@ Compatibility summary
- (+) `Mux` id
- (+) `_Slice``Slice`, `stop=``end=`, `.stop``.end`
- (+) `_Part``Part`
- (+) `Cat` id, `.l``.operands`
- (+) `Cat` id, `.l``.parts`
- (+) `Replicate``Repl`, `v=``value=`, `n=``count=`, `.v``.value`, `.n``.count`
- (+) `Constant``Const`, `bits_sign=``shape=`
- (+) `Signal` id, `bits_sign=``shape=`, `attr=``attrs=`, `name_override=`∼, `related=`, `variable=`
6 changes: 4 additions & 2 deletions nmigen/back/pysim.py
Original file line number Diff line number Diff line change
@@ -113,6 +113,8 @@ def on_Operator(self, value):
return lambda state: normalize(lhs(state) + rhs(state), shape)
if value.op == "-":
return lambda state: normalize(lhs(state) - rhs(state), shape)
if value.op == "*":
return lambda state: normalize(lhs(state) * rhs(state), shape)
if value.op == "&":
return lambda state: normalize(lhs(state) & rhs(state), shape)
if value.op == "|":
@@ -163,7 +165,7 @@ def on_Cat(self, value):
shape = value.shape()
parts = []
offset = 0
for opnd in value.operands:
for opnd in value.parts:
parts.append((offset, (1 << len(opnd)) - 1, self(opnd)))
offset += len(opnd)
def eval(state):
@@ -246,7 +248,7 @@ def eval(state, rhs):
def on_Cat(self, value):
parts = []
offset = 0
for opnd in value.operands:
for opnd in value.parts:
parts.append((offset, (1 << len(opnd)) - 1, self(opnd)))
offset += len(opnd)
def eval(state, rhs):
26 changes: 24 additions & 2 deletions nmigen/compat/fhdl/structure.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
from collections import OrderedDict

from ...tools import deprecated
from ...tools import deprecated, extend
from ...hdl import ast
from ...hdl.ast import (DUID, Value, Signal, Mux, Cat, Repl, Const, C, ClockSignal, ResetSignal,
from ...hdl.ast import (DUID, Value, Signal, Mux, Slice as _Slice, Cat, Repl, Const, C,
ClockSignal, ResetSignal,
Array, ArrayProxy as _ArrayProxy)
from ...hdl.cd import ClockDomain

@@ -17,6 +18,20 @@ def wrap(v):
return Value.wrap(v)


@extend(_Slice)
@property
@deprecated("instead of `_Slice.stop`, use `Slice.end`")
def stop(self):
return self.end


@extend(Cat)
@property
@deprecated("instead of `Cat.l`, use `Cat.parts`")
def l(self):
return self.parts


@deprecated("instead of `Replicate`, use `Repl`")
def Replicate(v, n):
return Repl(v, n)
@@ -27,6 +42,13 @@ def Constant(value, bits_sign=None):
return Const(value, bits_sign)


@extend(_ArrayProxy)
@property
@deprecated("instead `_ArrayProxy.choices`, use `ArrayProxy.elems`")
def choices(self):
return self.elems


class If(ast.Switch):
@deprecated("instead of `If(cond, ...)`, use `with m.If(cond): ...`")
def __init__(self, cond, *stmts):
10 changes: 5 additions & 5 deletions nmigen/hdl/ast.py
Original file line number Diff line number Diff line change
@@ -437,19 +437,19 @@ class Cat(Value):
"""
def __init__(self, *args):
super().__init__()
self.operands = [Value.wrap(v) for v in flatten(args)]
self.parts = [Value.wrap(v) for v in flatten(args)]

def shape(self):
return sum(len(op) for op in self.operands), False
return sum(len(op) for op in self.parts), False

def _lhs_signals(self):
return union(op._lhs_signals() for op in self.operands)
return union(op._lhs_signals() for op in self.parts)

def _rhs_signals(self):
return union(op._rhs_signals() for op in self.operands)
return union(op._rhs_signals() for op in self.parts)

def __repr__(self):
return "(cat {})".format(" ".join(map(repr, self.operands)))
return "(cat {})".format(" ".join(map(repr, self.parts)))


class Repl(Value):
2 changes: 1 addition & 1 deletion nmigen/hdl/xfrm.py
Original file line number Diff line number Diff line change
@@ -113,7 +113,7 @@ def on_Part(self, value):
return Part(self.on_value(value.value), self.on_value(value.offset), value.width)

def on_Cat(self, value):
return Cat(self.on_value(o) for o in value.operands)
return Cat(self.on_value(o) for o in value.parts)

def on_Repl(self, value):
return Repl(self.on_value(value.value), value.count)
18 changes: 9 additions & 9 deletions nmigen/test/test_hdl_ast.py
Original file line number Diff line number Diff line change
@@ -42,15 +42,15 @@ def test_getitem_slice(self):
self.assertEqual(s2.end, 2)
s3 = Const(31)[::2]
self.assertIsInstance(s3, Cat)
self.assertIsInstance(s3.operands[0], Slice)
self.assertEqual(s3.operands[0].start, 0)
self.assertEqual(s3.operands[0].end, 1)
self.assertIsInstance(s3.operands[1], Slice)
self.assertEqual(s3.operands[1].start, 2)
self.assertEqual(s3.operands[1].end, 3)
self.assertIsInstance(s3.operands[2], Slice)
self.assertEqual(s3.operands[2].start, 4)
self.assertEqual(s3.operands[2].end, 5)
self.assertIsInstance(s3.parts[0], Slice)
self.assertEqual(s3.parts[0].start, 0)
self.assertEqual(s3.parts[0].end, 1)
self.assertIsInstance(s3.parts[1], Slice)
self.assertEqual(s3.parts[1].start, 2)
self.assertEqual(s3.parts[1].end, 3)
self.assertIsInstance(s3.parts[2], Slice)
self.assertEqual(s3.parts[2].start, 4)
self.assertEqual(s3.parts[2].end, 5)

def test_getitem_wrong(self):
with self.assertRaises(TypeError):
6 changes: 6 additions & 0 deletions nmigen/test/test_sim.py
Original file line number Diff line number Diff line change
@@ -66,6 +66,12 @@ def test_sub(self):
self.assertStatement(stmt, [C(0, 4), C(1, 4)], C(-1, 4))
self.assertStatement(stmt, [C(0, 4), C(10, 4)], C(-10, 5))

def test_mul(self):
stmt = lambda y, a, b: y.eq(a * b)
self.assertStatement(stmt, [C(2, 4), C(1, 4)], C(2, 8))
self.assertStatement(stmt, [C(2, 4), C(2, 4)], C(4, 8))
self.assertStatement(stmt, [C(7, 4), C(7, 4)], C(49, 8))

def test_and(self):
stmt = lambda y, a, b: y.eq(a & b)
self.assertStatement(stmt, [C(0b1100, 4), C(0b1010, 4)], C(0b1000, 4))
10 changes: 10 additions & 0 deletions nmigen/tools.py
Original file line number Diff line number Diff line change
@@ -52,3 +52,13 @@ def wrapper(*args, **kwargs):
return f(*args, **kwargs)
return wrapper
return decorator


def extend(cls):
def decorator(f):
if isinstance(f, property):
name = f.fget.__name__
else:
name = f.__name__
setattr(cls, name, f)
return decorator