nmigen.git
2 years agoback.rtlil: translate enum decoders to Yosys enum attributes.
whitequark [Wed, 15 Apr 2020 14:42:46 +0000 (14:42 +0000)]
back.rtlil: translate enum decoders to Yosys enum attributes.

Fixes #254.

2 years agobuil.plat: enable strict undefined behavior in Jinja2.
whitequark [Tue, 14 Apr 2020 06:17:16 +0000 (06:17 +0000)]
buil.plat: enable strict undefined behavior in Jinja2.

By default, if an operation produces an undefined value (a Jinja2
concept that corresponds to Python's KeyError, AttributeError, etc)
then this value may be printed in a template, which is a nop. This
behavior can hide bugs.

This commit changes the Jinja2 behavior to raise an error instead of
producing an undefined value in all cases. (We produce undefined
values deliberately in a few places. Those are unaffected; it is OK
to use several kinds of undefined values in one Jinja2 environment.)

Fixes #337.

2 years agoback.rtlil: don't emit connections to zero width ports.
whitequark [Mon, 13 Apr 2020 17:04:13 +0000 (17:04 +0000)]
back.rtlil: don't emit connections to zero width ports.

Fixes #335.

2 years agoback.rtlil: refuse to create extremely large wires.
whitequark [Mon, 13 Apr 2020 16:38:36 +0000 (16:38 +0000)]
back.rtlil: refuse to create extremely large wires.

Such wires are likely to trigger pathological behavior in Yosys and,
if applicable, other toolchains that consume Verilog converted from
RTLIL.

Fixes #341.

2 years agoback.rtlil: fix expansion of Part() for partial dummy writes.
whitequark [Mon, 13 Apr 2020 15:56:39 +0000 (15:56 +0000)]
back.rtlil: fix expansion of Part() for partial dummy writes.

Before this commit, selecting a part that was fully out of bounds of
a value was correctly implemented as a write to a dummy wire, but
selecting a part that was only partially out of bounds resulted in
a crash.

Fixes #351.

2 years agoback.rtlil: fix legalization of Part() with stride.
whitequark [Mon, 13 Apr 2020 14:43:43 +0000 (14:43 +0000)]
back.rtlil: fix legalization of Part() with stride.

Also known as word_select().

2 years agoClarify a few comments. NFC.
whitequark [Mon, 13 Apr 2020 13:03:31 +0000 (13:03 +0000)]
Clarify a few comments. NFC.

2 years agohdl.ast: add Value.{rotate_left,rotate_right}.
Dan Ravensloft [Mon, 13 Apr 2020 13:40:39 +0000 (14:40 +0100)]
hdl.ast: add Value.{rotate_left,rotate_right}.

2 years agoTravis: require tests to pass on pypy3.
whitequark [Mon, 13 Apr 2020 11:04:25 +0000 (11:04 +0000)]
Travis: require tests to pass on pypy3.

Fixes #147.

2 years agoTravis: upgrade to bionic.
whitequark [Mon, 13 Apr 2020 09:40:00 +0000 (09:40 +0000)]
Travis: upgrade to bionic.

2 years agobuild.run: fix BuildProducts.extract to work with subdirectories.
whitequark [Sun, 12 Apr 2020 04:56:15 +0000 (04:56 +0000)]
build.run: fix BuildProducts.extract to work with subdirectories.

Fixes #353.

2 years agohdl.rec: improve repr() for Layout.
whitequark [Sun, 12 Apr 2020 04:47:40 +0000 (04:47 +0000)]
hdl.rec: improve repr() for Layout.

Fixes #326.

2 years agohdl.ast: improve repr() for Shape.
whitequark [Sun, 12 Apr 2020 03:59:56 +0000 (03:59 +0000)]
hdl.ast: improve repr() for Shape.

The default __repr__() from typing.NamedTuple does not include
the module name, so the replacement (which uses the preferred syntax
for specifying these shapes) doesn't either.

2 years agobuild.plat: don't check for toolchain presence if do_build=False.
whitequark [Sun, 12 Apr 2020 03:28:29 +0000 (03:28 +0000)]
build.plat: don't check for toolchain presence if do_build=False.

2 years agoback.pysim: Clear pending updates after they are effected
Stuart Olsen [Tue, 7 Apr 2020 11:17:14 +0000 (04:17 -0700)]
back.pysim: Clear pending updates after they are effected

2 years agoback.pysim: Eliminate duplicate dict lookup in VCD update
Stuart Olsen [Tue, 7 Apr 2020 05:22:45 +0000 (22:22 -0700)]
back.pysim: Eliminate duplicate dict lookup in VCD update

2 years agoback.pysim: Reuse clock simulation commands
Stuart Olsen [Tue, 7 Apr 2020 05:22:09 +0000 (22:22 -0700)]
back.pysim: Reuse clock simulation commands

2 years agohdl.mem: fix source location of ReadPort.en.
whitequark [Sun, 5 Apr 2020 02:00:06 +0000 (02:00 +0000)]
hdl.mem: fix source location of ReadPort.en.

2 years agoback.pysim: fix emission of undriven traces to VCD files.
whitequark [Fri, 3 Apr 2020 05:20:42 +0000 (05:20 +0000)]
back.pysim: fix emission of undriven traces to VCD files.

This has been originally implemented in commit d3775eed (which fixed
`write_vcd(traces=)` to do something at all), but had a flaw where
undriven traces would not be correctly placed in hierarchy. This
used to produce incorrect results on pyvcd 0.1, but started causing
assertion failures on pyvcd 0.2.

Fixes #345.

2 years agosetup: bump pyvcd to ~=0.2.
whitequark [Thu, 2 Apr 2020 11:17:41 +0000 (11:17 +0000)]
setup: bump pyvcd to ~=0.2.

We don't use any of the deprecated functionality, and the added
requirement of Python 3.6+ matches ours.

Having a requirement for pyvcd ~=0.1.4 was actually the cause of
the error I tried to fix in commit 6e1145e2. It had nothing to do
with Jinja2 (though it is definitely still good to have the tighter
requirement on Jinja2); the cause of the error was that pip would
install Jinja2, schedule installing markupsafe, install pyvcd 0.2.0
and then choke on the pyvcd 0.1.4 requirement, which would prevent
it from installing markupsafe &c. Why it does that is beyond me.

2 years agoAdd support for using non-compat Elaboratable instances with compat.fhdl.verilog...
Jacob Lifshay [Thu, 2 Apr 2020 02:38:14 +0000 (19:38 -0700)]
Add support for using non-compat Elaboratable instances with compat.fhdl.verilog.convert and compat.run_simulation

Fixes #344

2 years agosetup: tighten version constraint on Jinja2.
whitequark [Thu, 2 Apr 2020 01:35:39 +0000 (01:35 +0000)]
setup: tighten version constraint on Jinja2.

I remember thinking that not constraining it properly might bite us
someday, but assumed that Jinja2 will always stay version 2. Now it
looks like Jinja2 3.0.0a1 got released, pip picks it by default, and
it's currently broken (something about markupsafe missing).

Do what needed to be done in the first place.

2 years agohdl.ast: implement abs() on values.
whitequark [Sun, 22 Mar 2020 20:50:07 +0000 (20:50 +0000)]
hdl.ast: implement abs() on values.

2 years agovendor.lattice_ice40: add support for SB_[LH]FOSC as default_clk.
WRansohoff [Fri, 20 Mar 2020 08:10:48 +0000 (04:10 -0400)]
vendor.lattice_ice40: add support for SB_[LH]FOSC as default_clk.

These oscillators are only available on iCE40 UltraPlus devices.

2 years agovendor: fix typo `async_ff_sync`
Nicolas Robin [Sun, 15 Mar 2020 09:33:22 +0000 (10:33 +0100)]
vendor: fix typo `async_ff_sync`

2 years agoback.pysim: implement modulus operator.
Stuart Olsen [Sun, 15 Mar 2020 05:22:03 +0000 (22:22 -0700)]
back.pysim: implement modulus operator.

2 years agoCorrectly handle resets in AsyncFIFO.
awygle [Sat, 14 Mar 2020 23:26:07 +0000 (16:26 -0700)]
Correctly handle resets in AsyncFIFO.

This commit improves handling of resets in AsyncFIFO in two ways:
  * First, resets no longer violate Gray counter CDC invariants.
  * Second, write domain reset now empties the entire FIFO.

4 years agovendor: fix a few issues in commit 2f8669ca.
whitequark [Thu, 12 Mar 2020 20:28:41 +0000 (20:28 +0000)]
vendor: fix a few issues in commit 2f8669ca.

4 years agolib.cdc: extract AsyncFFSynchronizer.
awygle [Sun, 8 Mar 2020 21:37:40 +0000 (14:37 -0700)]
lib.cdc: extract AsyncFFSynchronizer.

In some cases, it is necessary to synchronize a reset-like signal but
a new clock domain is not desirable. To address these cases, extract
the implementation of ResetSynchronizer into AsyncFFSynchronizer,
and replace ResetSynchronizer with a thin wrapper around it.

4 years agohdl.ast: fix off-by-1 in Initial.__init__().
whitequark [Wed, 19 Feb 2020 01:28:14 +0000 (01:28 +0000)]
hdl.ast: fix off-by-1 in Initial.__init__().

4 years agoback.pysim: fix RHS codegen for Cat() and Repl(..., 0).
whitequark [Wed, 19 Feb 2020 01:21:00 +0000 (01:21 +0000)]
back.pysim: fix RHS codegen for Cat() and Repl(..., 0).

Fixes #325.

4 years agoback.pysim: optionally allow introspecting generated code.
whitequark [Wed, 19 Feb 2020 00:56:24 +0000 (00:56 +0000)]
back.pysim: optionally allow introspecting generated code.

4 years agonmigen.compat.genlib.cdc: add PulseSynchronizer.
awygle [Sun, 16 Feb 2020 07:01:44 +0000 (23:01 -0800)]
nmigen.compat.genlib.cdc: add PulseSynchronizer.

4 years agonmigen.lib.cdc: port PulseSynchronizer.
awygle [Sun, 16 Feb 2020 06:51:53 +0000 (22:51 -0800)]
nmigen.lib.cdc: port PulseSynchronizer.

Co-authored-by: Luke Wren <wren6991@gmail.com>
4 years agoTravis: prune dependencies.
whitequark [Fri, 14 Feb 2020 06:34:28 +0000 (06:34 +0000)]
Travis: prune dependencies.

bitarray is not required since commit 7df70059.

4 years agoTravis: test on Python 3.8.
whitequark [Fri, 14 Feb 2020 06:33:08 +0000 (06:33 +0000)]
Travis: test on Python 3.8.

4 years agocli: update use of deprecated code.
whitequark [Wed, 12 Feb 2020 14:42:24 +0000 (14:42 +0000)]
cli: update use of deprecated code.

4 years agoback.pysim: accept write_vcd(vcd_file=None).
whitequark [Wed, 12 Feb 2020 14:42:06 +0000 (14:42 +0000)]
back.pysim: accept write_vcd(vcd_file=None).

Because write_vcd() is a context manager, this is useful if the VCD
file should be sometimes not written, since it avoids awkward
conditionals with duplicated code. It's not very elegant though.

Fixes #319.

4 years agosetup: update project URLs.
whitequark [Sun, 9 Feb 2020 17:03:06 +0000 (17:03 +0000)]
setup: update project URLs.

4 years agodoc: remove outdated files and references to them.
whitequark [Sun, 9 Feb 2020 14:15:51 +0000 (14:15 +0000)]
doc: remove outdated files and references to them.

4 years agoREADME: link to IRC channel.
whitequark [Sat, 8 Feb 2020 11:00:08 +0000 (11:00 +0000)]
README: link to IRC channel.

4 years agoREADME: consolidate requirements in the Installation section.
whitequark [Sat, 8 Feb 2020 10:54:01 +0000 (10:54 +0000)]
README: consolidate requirements in the Installation section.

4 years agotest_build_res: fix after commit 3e2ecdf2.
whitequark [Fri, 7 Feb 2020 00:07:19 +0000 (00:07 +0000)]
test_build_res: fix after commit 3e2ecdf2.

4 years agobuild.res,vendor: place clock constraint on port, not net, if possible.
whitequark [Thu, 6 Feb 2020 23:37:15 +0000 (23:37 +0000)]
build.res,vendor: place clock constraint on port, not net, if possible.

For most toolchains, these are functionally identical, although ports
tend to work a bit better, being the common case. For Vivado, though,
it is necessary to place them on the port because its timing analyzer
considers input buffer delay.

Fixes #301.

4 years agoxilinx_{7series,ultrascale}: run `report_methodology`.
whitequark [Thu, 6 Feb 2020 19:38:21 +0000 (19:38 +0000)]
xilinx_{7series,ultrascale}: run `report_methodology`.

This can expose important timing issues, such as #301.

4 years agohdl.ast: add Value.{as_signed,as_unsigned}.
whitequark [Thu, 6 Feb 2020 18:27:55 +0000 (18:27 +0000)]
hdl.ast: add Value.{as_signed,as_unsigned}.

Before this commit, there was no way to do so besides creating and
assigning an intermediate signal, which could not be extracted into
a helper function due to Module statefulness.

Fixes #292.

4 years agotest_lib_fifo: define all referenced FSM states.
whitequark [Thu, 6 Feb 2020 18:10:15 +0000 (18:10 +0000)]
test_lib_fifo: define all referenced FSM states.

Broken in commit a1c58633.

4 years agohdl.dsl: make referencing undefined FSM states an error.
whitequark [Thu, 6 Feb 2020 17:47:46 +0000 (17:47 +0000)]
hdl.dsl: make referencing undefined FSM states an error.

Before this commit, doing something like:

    with m.FSM():
        with m.State("FOO"):
            m.next = "bAR"
        with m.State("BAR"):
            m.next = "FOO"

would silently create an empty state `bAR` and get stuck in it until
the module is reset. This was done intentionally (in Migen, this code
would in fact miscompile), but in retrospect was clearly a bad idea;
it turns typos into bugs, while in the rare case that branching to
a completely empty state is desired, it is trivial to define one.

Fixes #315.

4 years agohdl.ir: type check ports.
whitequark [Thu, 6 Feb 2020 17:33:41 +0000 (17:33 +0000)]
hdl.ir: type check ports.

Fixes #290.

4 years agoback.pysim: emit toplevel inputs in VCD files as well.
whitequark [Thu, 6 Feb 2020 17:19:47 +0000 (17:19 +0000)]
back.pysim: emit toplevel inputs in VCD files as well.

Before this commit, only signals driven from fragments (in practice,
everything except toplevel inputs) would get written to a VCD file.
Not having toplevel inputs in the dump made debugging ~impossible.

After this commit, all signals the fragment refers to get written to
a VCD file. (More specifically, all signals the compiler assigns
an index to, i.e. signals the generated code reads or writes.)

Fixes #280.

4 years agoback.pysim: make `write_vcd(traces=)` actually use those traces.
whitequark [Thu, 6 Feb 2020 17:07:48 +0000 (17:07 +0000)]
back.pysim: make `write_vcd(traces=)` actually use those traces.

Reported in #280.

4 years agohdl.dsl: reject name mismatch in `m.domains.<name> +=`.
whitequark [Thu, 6 Feb 2020 16:13:59 +0000 (16:13 +0000)]
hdl.dsl: reject name mismatch in `m.domains.<name> +=`.

This would violate invariants later in the elaboration process.

Fixes #282.

4 years agohdl.dsl: type check when adding to m.domains.
whitequark [Thu, 6 Feb 2020 15:19:16 +0000 (15:19 +0000)]
hdl.dsl: type check when adding to m.domains.

4 years agohdl.mem: add synthesis attribute support.
whitequark [Thu, 6 Feb 2020 14:48:48 +0000 (14:48 +0000)]
hdl.mem: add synthesis attribute support.

Fixes #291.

4 years agohdl.mem: document Memory.
whitequark [Thu, 6 Feb 2020 13:47:13 +0000 (13:47 +0000)]
hdl.mem: document Memory.

4 years agohdl.{ast,dsl}: allow whitespace in bit patterns.
whitequark [Tue, 4 Feb 2020 07:54:54 +0000 (07:54 +0000)]
hdl.{ast,dsl}: allow whitespace in bit patterns.

Fixes #316.

4 years agohdl.ast: update documentation for Signal.
whitequark [Sat, 1 Feb 2020 23:15:18 +0000 (23:15 +0000)]
hdl.ast: update documentation for Signal.

Fixes #288.

4 years agohdl.ast: prohibit shifts by signed value.
whitequark [Sat, 1 Feb 2020 23:04:25 +0000 (23:04 +0000)]
hdl.ast: prohibit shifts by signed value.

These are not desirable in a HDL, and currently elaborate to broken
RTLIL (after YosysHQ/yosys#1551); prohibit them completely, like
we already do for division and modulo.

Fixes #302.

4 years agobuild.plat: align pipeline with Fragment.prepare().
whitequark [Sat, 1 Feb 2020 03:24:26 +0000 (03:24 +0000)]
build.plat: align pipeline with Fragment.prepare().

Since commit 7257c20a, platform code calls create_missing_domains()
before _propagate_domains_up() (as a part of prepare() call). Since
commit a7be3b48, without a platform, create_missing_domains() is
calle after _propagate_domains_up(); because of that, it adds
the missing domain to the fragment. When platform code then calls
prepare() again, this causes an assertion failure.

The true intent behind the platform code being written this way is
that it *overrides* a part of prepare()'s mechanism. Because it was
not changed when prepare() was modified in 7257c20a, the override,
which happened to work by coincidence, stopped working. This is
now fixed by inlining the relevant parts of Fragment.prepare() into
Platform.prepare().

This is not a great solution, but given the amount of breakage this
causes (no platform-using code works), it is acceptable for now.

Fixes #307.

4 years agohdl.dsl: don't allow inheriting from Module.
whitequark [Sat, 1 Feb 2020 02:15:45 +0000 (02:15 +0000)]
hdl.dsl: don't allow inheriting from Module.

`Module` is an object with a lot of complex and sometimes fragile
behavior that overrides Python attribute accessors and so on.
To prevent user designs from breaking when it is changed, it is not
supposed to be inherited from (unlike in Migen), but rather returned
from the elaborate() method. This commit makes sure it will not be
inherited from by accident (most likely by users familiar with
Migen).

Fixes #286.

4 years agohdl.ast: warn on unused property statements (Assert, Assume, etc).
whitequark [Sat, 1 Feb 2020 01:55:23 +0000 (01:55 +0000)]
hdl.ast: warn on unused property statements (Assert, Assume, etc).

A property statement that is created but not added to a module is
virtually always a serious bug, since it can make formal verification
pass when it should not. Therefore, add a warning to it, similar to
UnusedElaboratable.

Doing this to all statements is possible, but many temporary ones are
created internally by nMigen, and the extensive changes required to
remove false positives are likely not worth the true positives.
We can revisit this in the future.

Fixes #303.

4 years ago_unused: extract must-use logic from hdl.ir.
whitequark [Sat, 1 Feb 2020 01:35:05 +0000 (01:35 +0000)]
_unused: extract must-use logic from hdl.ir.

4 years agohdl.dsl: add missing case width check for Enum values.
whitequark [Fri, 31 Jan 2020 23:14:16 +0000 (23:14 +0000)]
hdl.dsl: add missing case width check for Enum values.

Fixes #305.

4 years agoREADME: clarify relationship to Migen.
whitequark [Fri, 31 Jan 2020 21:10:59 +0000 (21:10 +0000)]
README: clarify relationship to Migen.

4 years agohdl.dsl: make `if m.{If,Elif,Else}(...)` a syntax error.
whitequark [Fri, 31 Jan 2020 06:37:45 +0000 (06:37 +0000)]
hdl.dsl: make `if m.{If,Elif,Else}(...)` a syntax error.

A common typo, and hard to notice when it's silently ignored.

Fixes #284.

4 years agoback.rtlil: don't emit wires for empty signals.
whitequark [Fri, 31 Jan 2020 03:38:58 +0000 (03:38 +0000)]
back.rtlil: don't emit wires for empty signals.

Fixes #312.

4 years agovendor.lattice_ecp5: support internal oscillator (OSCG).
Mike Walters [Fri, 17 Jan 2020 16:10:33 +0000 (16:10 +0000)]
vendor.lattice_ecp5: support internal oscillator (OSCG).

4 years agobuild.dsl: allow strings to be used as connector numbers.
Jaro Habiger [Sun, 26 Jan 2020 17:35:41 +0000 (18:35 +0100)]
build.dsl: allow strings to be used as connector numbers.

Fixes #311.

4 years agovendor.lattice_{ice40,ecp5}: Support .il (RTLIL) files in extra_files
Sylvain Munaut [Mon, 20 Jan 2020 08:30:49 +0000 (09:30 +0100)]
vendor.lattice_{ice40,ecp5}: Support .il (RTLIL) files in extra_files

4 years agoUpdate README.
whitequark [Mon, 27 Jan 2020 18:13:11 +0000 (18:13 +0000)]
Update README.

4 years agohdl.ir: resolve hierarchy conflicts before creating missing domains.
whitequark [Sat, 18 Jan 2020 10:30:36 +0000 (10:30 +0000)]
hdl.ir: resolve hierarchy conflicts before creating missing domains.

Otherwise, code such as:

    m.submodules.a = (something with cd_sync)
    m.submodules.b = (something with cd_sync)
    m.d.b_sync += x.eq(y)

causes an assertion failure.

Fixes #304 (again).

4 years agohdl.xfrm: transform drivers as well in DomainRenamer.
whitequark [Fri, 17 Jan 2020 02:13:46 +0000 (02:13 +0000)]
hdl.xfrm: transform drivers as well in DomainRenamer.

This is necessary because drivers may be late bound.

Fixes #304.

4 years agoRemove everything deprecated in nmigen 0.1.
whitequark [Sun, 12 Jan 2020 13:59:26 +0000 (13:59 +0000)]
Remove everything deprecated in nmigen 0.1.

Closes #275.

4 years agoSignal: allow to use integral Enum for reset value.
Staf Verhaegen [Fri, 10 Jan 2020 12:28:19 +0000 (13:28 +0100)]
Signal: allow to use integral Enum for reset value.

4 years agovendor.intel: fix output enable width for XDR=0 case.
schwigi [Thu, 9 Jan 2020 10:09:35 +0000 (11:09 +0100)]
vendor.intel: fix output enable width for XDR=0 case.

Fixes #297.

4 years agobuild.run: fix indentation.
Alain Péteut [Tue, 7 Jan 2020 12:39:49 +0000 (13:39 +0100)]
build.run: fix indentation.

4 years agoback.rtlil: do not consider unreachable array elements when legalizing.
whitequark [Wed, 1 Jan 2020 15:26:05 +0000 (15:26 +0000)]
back.rtlil: do not consider unreachable array elements when legalizing.

Otherwise we produce invalid RTLIL.

4 years agohdl.mem: fix src_loc_at in ReadPort, WritePort.
whitequark [Sun, 15 Dec 2019 11:46:14 +0000 (11:46 +0000)]
hdl.mem: fix src_loc_at in ReadPort, WritePort.

4 years agohdl.ast: Fix width for unary minus operator on signed argument.
Marcin Kościelnicki [Tue, 3 Dec 2019 17:33:26 +0000 (18:33 +0100)]
hdl.ast: Fix width for unary minus operator on signed argument.

To properly represent a negation of a signed X-bit quantity we may, in
general, need a signed (X+1)-bit signal — for example, negation of
3-bit -4 is 4, which is not representable in signed 3 bits.

4 years agoback.pysim: fix miscompilation of Signal(unsigned) - Signal(signed).
whitequark [Mon, 2 Dec 2019 18:52:55 +0000 (18:52 +0000)]
back.pysim: fix miscompilation of Signal(unsigned) - Signal(signed).

4 years agohdl.ast: actually remove simulator commands.
whitequark [Mon, 2 Dec 2019 02:23:36 +0000 (02:23 +0000)]
hdl.ast: actually remove simulator commands.

These were supposed to be removed in 7df70059, but I forgot.

4 years agovendor.intel: silence meaningless warnings in nMigen files
Dan Ravensloft [Sun, 1 Dec 2019 00:07:48 +0000 (00:07 +0000)]
vendor.intel: silence meaningless warnings in nMigen files

4 years agoback.pysim: redesign the simulator.
whitequark [Fri, 22 Nov 2019 08:32:41 +0000 (08:32 +0000)]
back.pysim: redesign the simulator.

The redesign introduces no fundamental incompatibilities, but it does
involve minor breaking changes:
  * The simulator commands were moved from hdl.ast to back.pysim
    (instead of only being reexported from back.pysim).
  * back.pysim.DeadlineError was removed.

Summary of changes:
  * The new simulator compiles HDL to Python code and is >6x faster.
    (The old one compiled HDL to lots of Python lambdas.)
  * The new simulator is a straightforward, rigorous implementation
    of the Synchronous Reactive Programming paradigm, instead of
    a pile of ad-hoc code with no particular design driving it.
  * The new simulator never raises DeadlineError, and there is no
    limit on the amount of delta cycles.
  * The new simulator robustly handles multiclock designs.
  * The new simulator can be reset, such that the compiled design
    can be reused, which can save significant runtime with large
    designs.
  * Generators can no longer be added as processes, since that would
    break reset(); only generator functions may be. If necessary,
    they may be added by wrapping them into a generator function;
    a deprecated fallback does just that. This workaround will raise
    an exception if the simulator is reset and restarted.
  * The new simulator does not depend on Python extensions.
    (The old one required bitarray, which did not provide wheels.)

Fixes #28.
Fixes #34.
Fixes #160.
Fixes #161.
Fixes #215.
Fixes #242.
Fixes #262.

4 years agoback.rtlil: infer bit width for instance parameters.
whitequark [Wed, 27 Nov 2019 17:58:42 +0000 (17:58 +0000)]
back.rtlil: infer bit width for instance parameters.

Otherwise, Yosys assumes it is always 32, which is often
inappropriate.

4 years agohdl.ir: for instance ports, prioritize defs over uses.
whitequark [Tue, 26 Nov 2019 21:17:12 +0000 (21:17 +0000)]
hdl.ir: for instance ports, prioritize defs over uses.

Fixes #274.

5 years agovendor.xilinx_*: Set IOB attribute on cels instead of nets.
Jean-François Nguyen [Mon, 18 Nov 2019 14:58:39 +0000 (15:58 +0100)]
vendor.xilinx_*: Set IOB attribute on cels instead of nets.

5 years agoback.rtlil: extend shorter operand of a binop when matching sign.
whitequark [Mon, 18 Nov 2019 10:39:55 +0000 (10:39 +0000)]
back.rtlil: extend shorter operand of a binop when matching sign.

This is necessary because converting a large unsigned value to
a signed value of the same width may change its sign.

Fixes #271.

5 years agobuild.plat: in Platform.add_file(), allow adding exact duplicates.
whitequark [Fri, 15 Nov 2019 23:40:44 +0000 (23:40 +0000)]
build.plat: in Platform.add_file(), allow adding exact duplicates.

5 years agotest: add tests for build.plat.Platform.add_file.
whitequark [Fri, 15 Nov 2019 23:35:55 +0000 (23:35 +0000)]
test: add tests for build.plat.Platform.add_file.

5 years agohdl.rec: fix Record.like() being called through a subclass.
whitequark [Sat, 9 Nov 2019 16:44:01 +0000 (16:44 +0000)]
hdl.rec: fix Record.like() being called through a subclass.

The subclass does not necessarily take layout as the first argument.

5 years agohdl.rec: make Record(name=) keyword-only.
Staf Verhaegen [Sat, 9 Nov 2019 16:10:36 +0000 (17:10 +0100)]
hdl.rec: make Record(name=) keyword-only.

Everywhere else, the name argument is already keyword-only, so
change it here too for consistency.

5 years agohdl.ir: lower domains before resolving hierarchy conflicts.
whitequark [Thu, 7 Nov 2019 08:20:27 +0000 (08:20 +0000)]
hdl.ir: lower domains before resolving hierarchy conflicts.

Otherwise, two subfragments with the same local clock domain would
not be able to drive its clock or reset signals. This can be easily
hit if using two ResetSynchronizers in one module.

Fixes #265.

5 years agoImprove .gitignore.
whitequark [Sat, 2 Nov 2019 02:03:14 +0000 (02:03 +0000)]
Improve .gitignore.

Fixes #264.

5 years agoback.verilog: remove $verilog_initial_trigger after proc_prune.
whitequark [Mon, 28 Oct 2019 10:11:41 +0000 (10:11 +0000)]
back.verilog: remove $verilog_initial_trigger after proc_prune.

$verilog_initial_trigger was introduced to work around Verilog
simulation semantics issues with `always @*` statements that only
have constants on RHS and in conditions. Unfortunately, it breaks
Verilator. Since the combination of proc_prune and proc_clean passes
eliminates all such statements, it can be simply removed when both
of these passes are available, currently on Yosys master. After
Yosys 0.10 is released, we can get rid of $verilog_initial_trigger
entirely.

5 years agotest: use `#nmigen:` magic comment instead of monkey patch.
whitequark [Sat, 26 Oct 2019 06:36:54 +0000 (06:36 +0000)]
test: use `#nmigen:` magic comment instead of monkey patch.

Also, fix missing and incorrect src_loc_at arguments where
appropriate so the testsuite passes without warnings.

5 years agohdl.ir: allow disabling UnusedElaboratable warning in file scope.
whitequark [Sat, 26 Oct 2019 05:34:00 +0000 (05:34 +0000)]
hdl.ir: allow disabling UnusedElaboratable warning in file scope.

This warning is usually quite handy, but is problematic in tests:
although it can be suppressed by using Fragment.get on elaboratable,
that is not always possible, in particular when writing tests for
exceptions raised by __init__, e.g.:

    def test_wrong_csr_bus(self):
        with self.assertRaisesRegex(ValueError, r"blah blah"):
            WishboneCSRBridge(csr_bus=object())

In theory, it should be possible to suppress warnings per-module
and even per-line using code such as:

    import re, warnings
    from nmigen.hdl.ir import UnusedElaboratable
    warnings.filterwarnings("ignore", category=UnusedElaboratable,
                            module=re.escape(__name__))

Unfortunately, not only is this code quite convoluted, but it also
does not actually work; we are using warnings.warn_explicit() because
we collect source locations on our own, but it requires the caller
to extract the __warningregistry__ dictionary from module globals,
or warning suppression would not work. Not only is this not feasible
in most diagnostic sites in nMigen, but also I never got it to work
anyway, even when passing all of module, registry, and module_globals
to warn_explicit().

Instead, use a magic comment at the start of a file to do this job,
which might not be elegant but is simple and practical. For now,
only UnusedElaboratable can be suppressed with it, but in future,
other linter parameters may become tweakable this way.

5 years agoback.rtlil: avoid exponential behavior when legalizing Part().
whitequark [Sat, 26 Oct 2019 02:01:53 +0000 (02:01 +0000)]
back.rtlil: avoid exponential behavior when legalizing Part().

Fixes #259.

5 years agoback.rtlil: fix lowering of Part() on LHS to account for stride.
whitequark [Sat, 26 Oct 2019 01:52:34 +0000 (01:52 +0000)]
back.rtlil: fix lowering of Part() on LHS to account for stride.

5 years agohdl.ast: simplify {bit,word}_select with constant offset.
whitequark [Sat, 26 Oct 2019 00:09:53 +0000 (00:09 +0000)]
hdl.ast: simplify {bit,word}_select with constant offset.

We don't have any other convenient shortcut for x[off*w:(off+1)*w],
but using word_select to extract a single static range would result
in severe bloat of emitted code through expansion to dead branches.
Recognize and simplify this pattern.

5 years agoExplicitly restrict prelude imports.
whitequark [Mon, 21 Oct 2019 10:39:21 +0000 (10:39 +0000)]
Explicitly restrict prelude imports.

It turns out that while Python does not import _private identifiers
when using * imports, it does nevertheless import all submodules.

Avoid polluting the namespace in the prelude by explicitly listing
all exported identifiers.